From 04c3410be77d32622d8cc4f15204d79a52d946e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 11:52:33 +0000 Subject: [PATCH 001/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 64.8% (788 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index ae04abd14..8af3e0712 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -873,3 +873,4 @@ "settings_discovery_no_identity_server" = "Du bruker ikke for øyeblikket en identitetsserver. Legg til en for at dine eksisterende kontakter skal kunne finne deg."; "settings_unignore_user" = "Vi alle meldinger fra %@?"; "device_verification_cancelled" = "Den andre parten avbrøt verifiseringen"; +"settings_callkit_info" = "Motta innkommende samtale på låst skjerm. Se dine anrop i systemets anropshistorikk. Hvis iCloud er aktivert, vil anropshistorikken blir delt med Apple."; From bfeea314d3a5806e88370f373dfd2ae18c0ff1f1 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 11:52:03 +0000 Subject: [PATCH 002/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 64.8% (788 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 8af3e0712..eb8993030 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -874,3 +874,12 @@ "settings_unignore_user" = "Vi alle meldinger fra %@?"; "device_verification_cancelled" = "Den andre parten avbrøt verifiseringen"; "settings_callkit_info" = "Motta innkommende samtale på låst skjerm. Se dine anrop i systemets anropshistorikk. Hvis iCloud er aktivert, vil anropshistorikken blir delt med Apple."; +//"settings_enable_all_notif" = "Enable all notifications"; +//"settings_messages_my_display_name" = "Msg containing my display name"; +//"settings_messages_my_user_name" = "Msg containing my user name"; +//"settings_messages_sent_to_me" = "Messages sent to me"; +//"settings_invited_to_room" = "When i'm invited to a room"; +//"settings_join_leave_rooms" = "When people join or leave rooms"; +//"settings_call_invitations" = "Call invitations"; + +"settings_enable_callkit" = "Integrerte anrop"; From 6af1d39d8fb2183ffffd581bfdf129aff19fc239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 11:53:17 +0000 Subject: [PATCH 003/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 64.8% (789 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index eb8993030..984aac790 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -883,3 +883,4 @@ //"settings_call_invitations" = "Call invitations"; "settings_enable_callkit" = "Integrerte anrop"; +"settings_calls_stun_server_fallback_button" = "Tillat bruk av alternativ server ved anrop"; From a504a9be7001bce7c052bd2922f817a293b4de44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 11:54:56 +0000 Subject: [PATCH 004/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 64.9% (790 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 984aac790..5cbac34ce 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -884,3 +884,4 @@ "settings_enable_callkit" = "Integrerte anrop"; "settings_calls_stun_server_fallback_button" = "Tillat bruk av alternativ server ved anrop"; +"settings_calls_stun_server_fallback_description" = "Tillat bruk av alternativ server ved anrop %@ når din hovedserver ikke tilbyr dette (din IP adresse vil bli delt under samtalen)."; From 06e1e6fa10fbfc4bee0eb3ac1c207a51a69a2e2b Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 11:54:46 +0000 Subject: [PATCH 005/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 64.9% (790 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 5cbac34ce..63be78150 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -883,5 +883,5 @@ //"settings_call_invitations" = "Call invitations"; "settings_enable_callkit" = "Integrerte anrop"; -"settings_calls_stun_server_fallback_button" = "Tillat bruk av alternativ server ved anrop"; +"settings_calls_stun_server_fallback_button" = "Tillat bruk av STUN støtteserver ved anrop"; "settings_calls_stun_server_fallback_description" = "Tillat bruk av alternativ server ved anrop %@ når din hovedserver ikke tilbyr dette (din IP adresse vil bli delt under samtalen)."; From 4d220844f15fdd5d48a307b8bdd40e0f2bc20db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 11:55:46 +0000 Subject: [PATCH 006/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 65.0% (791 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 63be78150..2c8240802 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -885,3 +885,4 @@ "settings_enable_callkit" = "Integrerte anrop"; "settings_calls_stun_server_fallback_button" = "Tillat bruk av STUN støtteserver ved anrop"; "settings_calls_stun_server_fallback_description" = "Tillat bruk av alternativ server ved anrop %@ når din hovedserver ikke tilbyr dette (din IP adresse vil bli delt under samtalen)."; +"settings_integrations_allow_description" = "Bruk integrasjonsadministrator (%@) for å administrere bots, bridges, widgets and sticker packs.\n\nIntegrasjonsadministrator mottar konfigurasjonsdata, og kan endre widgets, sende rominvitasjoner og sette rollenivå på dine vegne."; From 64ceaaea56579a2a5a095b6d183e1d2c21f1519e Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 11:55:37 +0000 Subject: [PATCH 007/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 65.0% (791 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 2c8240802..8e25b5a64 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -884,5 +884,5 @@ "settings_enable_callkit" = "Integrerte anrop"; "settings_calls_stun_server_fallback_button" = "Tillat bruk av STUN støtteserver ved anrop"; -"settings_calls_stun_server_fallback_description" = "Tillat bruk av alternativ server ved anrop %@ når din hovedserver ikke tilbyr dette (din IP adresse vil bli delt under samtalen)."; +"settings_calls_stun_server_fallback_description" = "Tillat bruk av %@ STUN støtteserver ved anrop, når din hovedserver ikke tilbyr dette (din IP adresse vil bli delt under samtalen)."; "settings_integrations_allow_description" = "Bruk integrasjonsadministrator (%@) for å administrere bots, bridges, widgets and sticker packs.\n\nIntegrasjonsadministrator mottar konfigurasjonsdata, og kan endre widgets, sende rominvitasjoner og sette rollenivå på dine vegne."; From 80274d28cb4c145f84f4dde4be854b162e27e93b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 11:57:38 +0000 Subject: [PATCH 008/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 65.2% (794 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 8e25b5a64..af0c484af 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -886,3 +886,6 @@ "settings_calls_stun_server_fallback_button" = "Tillat bruk av STUN støtteserver ved anrop"; "settings_calls_stun_server_fallback_description" = "Tillat bruk av %@ STUN støtteserver ved anrop, når din hovedserver ikke tilbyr dette (din IP adresse vil bli delt under samtalen)."; "settings_integrations_allow_description" = "Bruk integrasjonsadministrator (%@) for å administrere bots, bridges, widgets and sticker packs.\n\nIntegrasjonsadministrator mottar konfigurasjonsdata, og kan endre widgets, sende rominvitasjoner og sette rollenivå på dine vegne."; +"settings_labs_create_conference_with_jitsi" = "Opprett konferansesamtale med jitsi"; +"settings_contacts_phonebook_country" = "Telefonkatalog land"; +"settings_contacts_discover_matrix_users" = "Bruk e-poster og telefonnummer for å finne brukere"; From 8ddfc2f837e2e79dc421a9277bb927d778153369 Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Wed, 12 May 2021 11:56:57 +0000 Subject: [PATCH 009/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 65.2% (794 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index af0c484af..4c8272ad9 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -871,7 +871,7 @@ "security_settings_crosssigning_info_exists" = "Din konto har en kryss-signeringsidentitet, men den er ikke klarert av den økten. Fullfør klarering for denne økten."; "security_settings_crypto_sessions_loading" = "Laster sesjoner…"; "settings_discovery_no_identity_server" = "Du bruker ikke for øyeblikket en identitetsserver. Legg til en for at dine eksisterende kontakter skal kunne finne deg."; -"settings_unignore_user" = "Vi alle meldinger fra %@?"; +"settings_unignore_user" = "Vis alle meldinger fra %@?"; "device_verification_cancelled" = "Den andre parten avbrøt verifiseringen"; "settings_callkit_info" = "Motta innkommende samtale på låst skjerm. Se dine anrop i systemets anropshistorikk. Hvis iCloud er aktivert, vil anropshistorikken blir delt med Apple."; //"settings_enable_all_notif" = "Enable all notifications"; From 3f4e14e9078dd24c3134578c9e8fea8a15ff7997 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 11:56:21 +0000 Subject: [PATCH 010/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 65.2% (794 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 4c8272ad9..fa104ca93 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -885,7 +885,7 @@ "settings_enable_callkit" = "Integrerte anrop"; "settings_calls_stun_server_fallback_button" = "Tillat bruk av STUN støtteserver ved anrop"; "settings_calls_stun_server_fallback_description" = "Tillat bruk av %@ STUN støtteserver ved anrop, når din hovedserver ikke tilbyr dette (din IP adresse vil bli delt under samtalen)."; -"settings_integrations_allow_description" = "Bruk integrasjonsadministrator (%@) for å administrere bots, bridges, widgets and sticker packs.\n\nIntegrasjonsadministrator mottar konfigurasjonsdata, og kan endre widgets, sende rominvitasjoner og sette rollenivå på dine vegne."; +"settings_integrations_allow_description" = "Bruk integrasjonsadministrator (%@) for å administrere bots, bridges, widgets og sticker packs.\n\nIntegrasjonsadministrator mottar konfigurasjonsdata, og kan endre widgets, sende rominvitasjoner og sette tilgangsnivåer på dine vegne."; "settings_labs_create_conference_with_jitsi" = "Opprett konferansesamtale med jitsi"; "settings_contacts_phonebook_country" = "Telefonkatalog land"; "settings_contacts_discover_matrix_users" = "Bruk e-poster og telefonnummer for å finne brukere"; From 1356bff7c8dbae07742417b088517da2fb0bf42c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 11:58:21 +0000 Subject: [PATCH 011/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 65.6% (798 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index fa104ca93..8ac897171 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -889,3 +889,7 @@ "settings_labs_create_conference_with_jitsi" = "Opprett konferansesamtale med jitsi"; "settings_contacts_phonebook_country" = "Telefonkatalog land"; "settings_contacts_discover_matrix_users" = "Bruk e-poster og telefonnummer for å finne brukere"; +"settings_enable_rageshake" = "Bruk ristefunksjon for å rapportere feil"; +"settings_send_crash_report" = "Send anonyme krasj- & brukerdata"; +"settings_olm_version" = "Olm-versjon %@"; +"settings_labs_message_reaction" = "Reager på melding med emoji"; From 2857d4463628147c534c6df1fcdded89fd974b51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 11:59:40 +0000 Subject: [PATCH 012/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 66.0% (803 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 8ac897171..45bcbef4a 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -893,3 +893,8 @@ "settings_send_crash_report" = "Send anonyme krasj- & brukerdata"; "settings_olm_version" = "Olm-versjon %@"; "settings_labs_message_reaction" = "Reager på melding med emoji"; +"settings_crypto_blacklist_unverified_devices" = "Krypter kun verifiserte sesjoner"; +"settings_add_3pid_password_message" = "Vennligst legg inn ditt passord for å fortsette"; +"settings_add_3pid_password_title_email" = "Legg til e-postadresse"; +"settings_password_updated" = "Ditt passord har blitt oppdatert"; +"settings_fail_to_update_password" = "Oppdatering av passord feilet"; From 76aeee3edf480c92767eee24664e13b2f7668143 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 11:59:05 +0000 Subject: [PATCH 013/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 66.0% (803 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 45bcbef4a..4f67fa33c 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -889,7 +889,7 @@ "settings_labs_create_conference_with_jitsi" = "Opprett konferansesamtale med jitsi"; "settings_contacts_phonebook_country" = "Telefonkatalog land"; "settings_contacts_discover_matrix_users" = "Bruk e-poster og telefonnummer for å finne brukere"; -"settings_enable_rageshake" = "Bruk ristefunksjon for å rapportere feil"; +"settings_enable_rageshake" = "Bruk \"rageshake\" for å rapportere feil"; "settings_send_crash_report" = "Send anonyme krasj- & brukerdata"; "settings_olm_version" = "Olm-versjon %@"; "settings_labs_message_reaction" = "Reager på melding med emoji"; From ef49e18ef77b7eddaede943ddb25301a93aeaa3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:01:48 +0000 Subject: [PATCH 014/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 66.4% (808 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 4f67fa33c..ba8aa2fdf 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -826,7 +826,7 @@ "room_details_addresses_invalid_address_prompt_title" = "Ugyldig alias format"; "security_settings_crypto_sessions_description_2" = "Om du ikke gjenkjenner en pålogging, endre ditt passord og tilbakestill sikkerhetskopi."; "settings_key_backup_info_trust_signature_invalid_device_verified" = "Sikkerhetskopien har en ugyldig signatur fra %@"; -"settings_key_backup_info_trust_signature_valid_device_unverified" = "Sikkerhetskopi har signatur fra %@"; +"settings_key_backup_info_trust_signature_valid_device_unverified" = "Sikkerhetskopien har signatur fra %@"; "settings_key_backup_info_trust_signature_valid" = "Sikkerhetskopien har en gyldig signatur fra denne økten"; "settings_key_backup_info_trust_signature_unknown" = "Sikkerhetskopi av økten har signatur med ID: %@"; "settings_key_backup_info_progress_done" = "Alle nøkler sikkerhetskopiert"; @@ -898,3 +898,8 @@ "settings_add_3pid_password_title_email" = "Legg til e-postadresse"; "settings_password_updated" = "Ditt passord har blitt oppdatert"; "settings_fail_to_update_password" = "Oppdatering av passord feilet"; +"settings_key_backup_delete_confirmation_prompt_msg" = "Er du sikker? Du vil miste dine krypterte meldinger hvis dine nøkler ikke er tilstrekkelig sikkerhetskopiert."; +"settings_key_backup_button_connect" = "Koble denne økten til sikkerhetskopi av meldingsnøkler"; +"settings_key_backup_info_trust_signature_invalid_device_unverified" = "Sikkerhetskopien har en ugyldig signatur fra %@"; +"settings_key_backup_info_trust_signature_valid_device_verified" = "Sikkerhetskopien har en gyldig signatur fra %@"; +"settings_key_backup_info_algorithm" = "Algoritme: %@"; From 32bef7be4a6f74c8ebf44ac9f7ad8aea5bf17094 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 12:01:08 +0000 Subject: [PATCH 015/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 66.4% (808 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index ba8aa2fdf..fd1d88983 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -893,7 +893,7 @@ "settings_send_crash_report" = "Send anonyme krasj- & brukerdata"; "settings_olm_version" = "Olm-versjon %@"; "settings_labs_message_reaction" = "Reager på melding med emoji"; -"settings_crypto_blacklist_unverified_devices" = "Krypter kun verifiserte sesjoner"; +"settings_crypto_blacklist_unverified_devices" = "Krypter kun i verifiserte økter"; "settings_add_3pid_password_message" = "Vennligst legg inn ditt passord for å fortsette"; "settings_add_3pid_password_title_email" = "Legg til e-postadresse"; "settings_password_updated" = "Ditt passord har blitt oppdatert"; From 2c366edfd83124d87804a8e25d1a780a3c514793 Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Wed, 12 May 2021 12:02:11 +0000 Subject: [PATCH 016/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 66.4% (808 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index fd1d88983..8bc38eb46 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -870,7 +870,7 @@ "identity_server_settings_description" = "Du bruker for øyeblikket %@ for å finne å bli funnet av dine eksisterende kontakter."; "security_settings_crosssigning_info_exists" = "Din konto har en kryss-signeringsidentitet, men den er ikke klarert av den økten. Fullfør klarering for denne økten."; "security_settings_crypto_sessions_loading" = "Laster sesjoner…"; -"settings_discovery_no_identity_server" = "Du bruker ikke for øyeblikket en identitetsserver. Legg til en for at dine eksisterende kontakter skal kunne finne deg."; +"settings_discovery_no_identity_server" = "Du bruker for øyeblikket ikke en identitetsserver. Legg til en for at dine eksisterende kontakter skal kunne finne deg."; "settings_unignore_user" = "Vis alle meldinger fra %@?"; "device_verification_cancelled" = "Den andre parten avbrøt verifiseringen"; "settings_callkit_info" = "Motta innkommende samtale på låst skjerm. Se dine anrop i systemets anropshistorikk. Hvis iCloud er aktivert, vil anropshistorikken blir delt med Apple."; From cf7194b7843764c1ab5cf49a8596742782884e9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:04:09 +0000 Subject: [PATCH 017/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 67.3% (819 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 8bc38eb46..f444764ca 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -903,3 +903,14 @@ "settings_key_backup_info_trust_signature_invalid_device_unverified" = "Sikkerhetskopien har en ugyldig signatur fra %@"; "settings_key_backup_info_trust_signature_valid_device_verified" = "Sikkerhetskopien har en gyldig signatur fra %@"; "settings_key_backup_info_algorithm" = "Algoritme: %@"; +"settings_identity_server_no_is" = "Ingen idenitetsserver konfigurert"; +"settings_identity_server_description" = "Ved å bruke identitetsserveren valgt ovenfor, kan du finne og bli funnet av eksisterende kontakter."; +"settings_discovery_three_pid_details_enter_sms_code_action" = "Legg inn SMS-aktiveringskode"; +"settings_discovery_three_pid_details_cancel_email_validation_action" = "Avbryt e-postgodkjenning"; +"settings_discovery_three_pid_details_information_phone_number" = "Administrer valg for dette telefonnummeret, som andre brukere kan benytte for å finne deg og invitere deg til rom. Legg til eller fjern telefonnummer i Kontoer."; +"settings_discovery_three_pid_details_title_phone_number" = "Administrer telefonnummer"; +"settings_discovery_three_pid_details_information_email" = "Administrer valg for denne e-postadressen, som andre brukere kan benytte for å finne deg og invitere deg til rom. Legg til eller fjern e-postadresser i Kontoer."; +"settings_discovery_three_pid_details_title_email" = "Administrer e-post"; +"settings_discovery_three_pids_management_information_part3" = "."; +"settings_discovery_three_pids_management_information_part1" = "Administrer hvilken e-postadresse eller telefonnummer andre brukere kan benytte for å finne deg og invitere deg til rom. Legg til eller fjern e-postadresser eller telefonnummer fra denne listen. "; +"settings_discovery_terms_not_signed" = "Godta brukervilkårene for identitetsserveren (%@) for å tillate at du kan bli funnet med e-post eller telefonnummer."; From 6f9143b73f8dfb534fca3421afd57e1c3eb74fa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:04:46 +0000 Subject: [PATCH 018/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 67.5% (821 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index f444764ca..0ec86623d 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -914,3 +914,5 @@ "settings_discovery_three_pids_management_information_part3" = "."; "settings_discovery_three_pids_management_information_part1" = "Administrer hvilken e-postadresse eller telefonnummer andre brukere kan benytte for å finne deg og invitere deg til rom. Legg til eller fjern e-postadresser eller telefonnummer fra denne listen. "; "settings_discovery_terms_not_signed" = "Godta brukervilkårene for identitetsserveren (%@) for å tillate at du kan bli funnet med e-post eller telefonnummer."; +"settings_show_NSFW_public_rooms" = "Vis NSFW offentlige rom"; +"settings_identity_server_no_is_description" = "Du benytter for øyeblikket ikke en identitetsserver. Legg til en ovenfor for å finne og bli funnet av eksisterende kontakter."; From ae4f748bef08f5bc4a815fa0a5308375944591b0 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 12:04:30 +0000 Subject: [PATCH 019/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 67.5% (821 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 0ec86623d..bbcf007f1 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -903,7 +903,7 @@ "settings_key_backup_info_trust_signature_invalid_device_unverified" = "Sikkerhetskopien har en ugyldig signatur fra %@"; "settings_key_backup_info_trust_signature_valid_device_verified" = "Sikkerhetskopien har en gyldig signatur fra %@"; "settings_key_backup_info_algorithm" = "Algoritme: %@"; -"settings_identity_server_no_is" = "Ingen idenitetsserver konfigurert"; +"settings_identity_server_no_is" = "Ingen identitetsserver konfigurert"; "settings_identity_server_description" = "Ved å bruke identitetsserveren valgt ovenfor, kan du finne og bli funnet av eksisterende kontakter."; "settings_discovery_three_pid_details_enter_sms_code_action" = "Legg inn SMS-aktiveringskode"; "settings_discovery_three_pid_details_cancel_email_validation_action" = "Avbryt e-postgodkjenning"; From 4f3e430b52ef235807b4438a749767b14345053b Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Wed, 12 May 2021 12:05:25 +0000 Subject: [PATCH 020/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 67.5% (821 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index bbcf007f1..a39399b89 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -869,7 +869,7 @@ "identity_server_settings_place_holder" = "Skriv inn en identitetsserver"; "identity_server_settings_description" = "Du bruker for øyeblikket %@ for å finne å bli funnet av dine eksisterende kontakter."; "security_settings_crosssigning_info_exists" = "Din konto har en kryss-signeringsidentitet, men den er ikke klarert av den økten. Fullfør klarering for denne økten."; -"security_settings_crypto_sessions_loading" = "Laster sesjoner…"; +"security_settings_crypto_sessions_loading" = "Laster økter…"; "settings_discovery_no_identity_server" = "Du bruker for øyeblikket ikke en identitetsserver. Legg til en for at dine eksisterende kontakter skal kunne finne deg."; "settings_unignore_user" = "Vis alle meldinger fra %@?"; "device_verification_cancelled" = "Den andre parten avbrøt verifiseringen"; From 7fbf3c219dfd7da5693408b85ab1507185a814fc Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Wed, 12 May 2021 12:06:40 +0000 Subject: [PATCH 021/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 68.0% (827 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index a39399b89..df9b11b73 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -868,7 +868,7 @@ "room_details_access_section_for_dm" = "Hvem har til gang til dette?"; "identity_server_settings_place_holder" = "Skriv inn en identitetsserver"; "identity_server_settings_description" = "Du bruker for øyeblikket %@ for å finne å bli funnet av dine eksisterende kontakter."; -"security_settings_crosssigning_info_exists" = "Din konto har en kryss-signeringsidentitet, men den er ikke klarert av den økten. Fullfør klarering for denne økten."; +"security_settings_crosssigning_info_exists" = "Din konto har en kryss-signeringsidentitet, men den er ikke klarert av denne økten. Fullfør klarering for denne økten."; "security_settings_crypto_sessions_loading" = "Laster økter…"; "settings_discovery_no_identity_server" = "Du bruker for øyeblikket ikke en identitetsserver. Legg til en for at dine eksisterende kontakter skal kunne finne deg."; "settings_unignore_user" = "Vis alle meldinger fra %@?"; From 1042f198db56cb245476bcc0bc1e1e9b75f10a88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:06:31 +0000 Subject: [PATCH 022/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 68.0% (827 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index df9b11b73..d999a598e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -916,3 +916,9 @@ "settings_discovery_terms_not_signed" = "Godta brukervilkårene for identitetsserveren (%@) for å tillate at du kan bli funnet med e-post eller telefonnummer."; "settings_show_NSFW_public_rooms" = "Vis NSFW offentlige rom"; "settings_identity_server_no_is_description" = "Du benytter for øyeblikket ikke en identitetsserver. Legg til en ovenfor for å finne og bli funnet av eksisterende kontakter."; +"security_settings_crosssigning_info_not_bootstrapped" = "Kryss-signering er ikke satt opp enda."; +"security_settings_crosssigning" = "KRYSS-SIGNERING"; +"security_settings_backup" = "SIKKERHETSKOPI-MELDINGER"; +"security_settings_secure_backup_synchronise" = "Synkroniser"; +"security_settings_secure_backup_description" = "Sikre deg mot å miste tilgang til krypterte meldinger og data ved å lagre sikkerhetskopi av krypteringsnøkler på din server."; +"security_settings_secure_backup" = "SIKKERHETSKOPI"; From 692f7645860d3411fb5da1553562323d3ffc23ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:07:29 +0000 Subject: [PATCH 023/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 68.0% (828 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index d999a598e..1ddf0576a 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -922,3 +922,4 @@ "security_settings_secure_backup_synchronise" = "Synkroniser"; "security_settings_secure_backup_description" = "Sikre deg mot å miste tilgang til krypterte meldinger og data ved å lagre sikkerhetskopi av krypteringsnøkler på din server."; "security_settings_secure_backup" = "SIKKERHETSKOPI"; +"security_settings_crosssigning_info_trusted" = "Kryss-signering er aktivert. Du kan stole på andre brukere og dine andre økter basert på kryss-signering, men du kan ikke kryss-signere fra denne økten fordi den ikke har kryss-signert private nøkler. Fullfør sikkerheten for denne økten."; From aa2cff2e405660101e4368ca37176e2800a415d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:08:32 +0000 Subject: [PATCH 024/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 68.4% (832 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 1ddf0576a..22ba42867 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -923,3 +923,7 @@ "security_settings_secure_backup_description" = "Sikre deg mot å miste tilgang til krypterte meldinger og data ved å lagre sikkerhetskopi av krypteringsnøkler på din server."; "security_settings_secure_backup" = "SIKKERHETSKOPI"; "security_settings_crosssigning_info_trusted" = "Kryss-signering er aktivert. Du kan stole på andre brukere og dine andre økter basert på kryss-signering, men du kan ikke kryss-signere fra denne økten fordi den ikke har kryss-signert private nøkler. Fullfør sikkerheten for denne økten."; +"security_settings_export_keys_manually" = "Eksporter nøkler manuelt"; +"security_settings_crosssigning_reset" = "Tilbakestill kryss-signering"; +"security_settings_crosssigning_bootstrap" = "Bootstrap kryss-signering"; +"security_settings_crosssigning_info_ok" = "Kryss-signering er aktivert."; From fab7d7b6b996a3e22249710a0d186273c31a07c6 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 12:08:01 +0000 Subject: [PATCH 025/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 68.4% (832 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 22ba42867..f76726418 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -922,7 +922,7 @@ "security_settings_secure_backup_synchronise" = "Synkroniser"; "security_settings_secure_backup_description" = "Sikre deg mot å miste tilgang til krypterte meldinger og data ved å lagre sikkerhetskopi av krypteringsnøkler på din server."; "security_settings_secure_backup" = "SIKKERHETSKOPI"; -"security_settings_crosssigning_info_trusted" = "Kryss-signering er aktivert. Du kan stole på andre brukere og dine andre økter basert på kryss-signering, men du kan ikke kryss-signere fra denne økten fordi den ikke har kryss-signert private nøkler. Fullfør sikkerheten for denne økten."; +"security_settings_crosssigning_info_trusted" = "Kryss-signering er aktivert. Du kan stole på andre brukere og dine andre økter basert på kryss-signering, men du kan ikke kryss-signere fra denne økten fordi den ikke har private nøkler for kryss-signering. Fullfør sikkerheten for denne økten."; "security_settings_export_keys_manually" = "Eksporter nøkler manuelt"; "security_settings_crosssigning_reset" = "Tilbakestill kryss-signering"; "security_settings_crosssigning_bootstrap" = "Bootstrap kryss-signering"; From 42cecbd7e4f53aa8771c5188175b81d67a799d41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:09:15 +0000 Subject: [PATCH 026/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 68.5% (833 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index f76726418..d2563d080 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -927,3 +927,4 @@ "security_settings_crosssigning_reset" = "Tilbakestill kryss-signering"; "security_settings_crosssigning_bootstrap" = "Bootstrap kryss-signering"; "security_settings_crosssigning_info_ok" = "Kryss-signering er aktivert."; +"security_settings_blacklist_unverified_devices" = "Aldri send meldinger til ikke klarerte økter"; From 1551b31731a3a621463c4787d5d2aa25fbca4a65 Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Wed, 12 May 2021 12:11:49 +0000 Subject: [PATCH 027/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 69.1% (841 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index d2563d080..c3062adbb 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -867,7 +867,7 @@ "key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "bruk gjenopprettingsnøkkelen"; "room_details_access_section_for_dm" = "Hvem har til gang til dette?"; "identity_server_settings_place_holder" = "Skriv inn en identitetsserver"; -"identity_server_settings_description" = "Du bruker for øyeblikket %@ for å finne å bli funnet av dine eksisterende kontakter."; +"identity_server_settings_description" = "Du bruker for øyeblikket %@ for å finne og bli funnet av dine eksisterende kontakter."; "security_settings_crosssigning_info_exists" = "Din konto har en kryss-signeringsidentitet, men den er ikke klarert av denne økten. Fullfør klarering for denne økten."; "security_settings_crypto_sessions_loading" = "Laster økter…"; "settings_discovery_no_identity_server" = "Du bruker for øyeblikket ikke en identitetsserver. Legg til en for at dine eksisterende kontakter skal kunne finne deg."; From a1d77c8c0d926b8a923f3827d7d3ed20b1ed7331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:11:37 +0000 Subject: [PATCH 028/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 69.1% (841 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c3062adbb..97f7d1caf 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -928,3 +928,15 @@ "security_settings_crosssigning_bootstrap" = "Bootstrap kryss-signering"; "security_settings_crosssigning_info_ok" = "Kryss-signering er aktivert."; "security_settings_blacklist_unverified_devices" = "Aldri send meldinger til ikke klarerte økter"; + +// AuthenticatedSessionViewControllerFactory +"authenticated_session_flow_not_supported" = "Denne appen støtter ikke autentiseringsmekanismen på din hjemmeserver."; +"manage_session_trusted" = "Klarert av deg"; +"manage_session_info" = "ØKTINFORMASJON"; + +// Manage session +"manage_session_title" = "Administrer økt"; +"security_settings_user_password_description" = "Bekreft din identitet ved å oppgi ditt passord"; +"security_settings_coming_soon" = "Beklager. Denne handlingen er ikke tilgjengelig på Element iOS enda. Vennligst benytt en annen Matrix klient for å sette det opp. Element iOS vil bruke den."; +"security_settings_complete_security_alert_message" = "Du bør fullføre sikkerheten på din nåværende økt først."; +"security_settings_blacklist_unverified_devices_description" = "Verifiser alle øktene til en bruker for å markere dem som klarert og send meldinger til dem."; From 2fde35cec647c1d97e84f9b7c87b1d426f9bc85c Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 12:09:21 +0000 Subject: [PATCH 029/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 69.1% (841 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 97f7d1caf..25e0e81bb 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -927,7 +927,7 @@ "security_settings_crosssigning_reset" = "Tilbakestill kryss-signering"; "security_settings_crosssigning_bootstrap" = "Bootstrap kryss-signering"; "security_settings_crosssigning_info_ok" = "Kryss-signering er aktivert."; -"security_settings_blacklist_unverified_devices" = "Aldri send meldinger til ikke klarerte økter"; +"security_settings_blacklist_unverified_devices" = "Aldri send meldinger til ikke-klarerte økter"; // AuthenticatedSessionViewControllerFactory "authenticated_session_flow_not_supported" = "Denne appen støtter ikke autentiseringsmekanismen på din hjemmeserver."; From c5f430574a47889f3035de223a62d757552f83a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:12:53 +0000 Subject: [PATCH 030/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 69.3% (843 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 25e0e81bb..2d838e27d 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -940,3 +940,5 @@ "security_settings_coming_soon" = "Beklager. Denne handlingen er ikke tilgjengelig på Element iOS enda. Vennligst benytt en annen Matrix klient for å sette det opp. Element iOS vil bruke den."; "security_settings_complete_security_alert_message" = "Du bør fullføre sikkerheten på din nåværende økt først."; "security_settings_blacklist_unverified_devices_description" = "Verifiser alle øktene til en bruker for å markere dem som klarert og send meldinger til dem."; +"identity_server_settings_disconnect_info" = "Kobler du fra din identitetsserver vil det bety at andre brukere ikke kan finne deg og kunne invitere andre med e-post og telefonnummer."; +"identity_server_settings_no_is_description" = "Du bruker for øyeblikket ikke en identitetsserver. Legg til en ovenfor, for å finne og bli funnet av eksisterende kontakter."; From 527e6f2fff3041648d5c099bd7a8443df89acfde Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Wed, 12 May 2021 12:12:33 +0000 Subject: [PATCH 031/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 69.3% (843 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 2d838e27d..f20621d8f 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -866,7 +866,7 @@ "secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "bruk gjenopprettingsnøkkelen din"; "key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "bruk gjenopprettingsnøkkelen"; "room_details_access_section_for_dm" = "Hvem har til gang til dette?"; -"identity_server_settings_place_holder" = "Skriv inn en identitetsserver"; +"identity_server_settings_place_holder" = "Legg inn en identitetsserver"; "identity_server_settings_description" = "Du bruker for øyeblikket %@ for å finne og bli funnet av dine eksisterende kontakter."; "security_settings_crosssigning_info_exists" = "Din konto har en kryss-signeringsidentitet, men den er ikke klarert av denne økten. Fullfør klarering for denne økten."; "security_settings_crypto_sessions_loading" = "Laster økter…"; From d081c59d2d08ad5c4c4ac18c956db9fcbfbdcb37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:15:42 +0000 Subject: [PATCH 032/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 70.5% (858 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index f20621d8f..d40b04d82 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -942,3 +942,18 @@ "security_settings_blacklist_unverified_devices_description" = "Verifiser alle øktene til en bruker for å markere dem som klarert og send meldinger til dem."; "identity_server_settings_disconnect_info" = "Kobler du fra din identitetsserver vil det bety at andre brukere ikke kan finne deg og kunne invitere andre med e-post og telefonnummer."; "identity_server_settings_no_is_description" = "Du bruker for øyeblikket ikke en identitetsserver. Legg til en ovenfor, for å finne og bli funnet av eksisterende kontakter."; +"room_details_mute_notifs" = "Slå av lydvarsler"; +"room_details_favourite_tag" = "Favoritt"; +"room_details_room_name_for_dm" = "Navn"; +"room_details_integrations" = "Integrasjoner"; +"room_details_search" = "Søk i rom"; +"room_details_title_for_dm" = "Detaljer"; +"identity_server_settings_alert_error_invalid_identity_server" = "%@ er ikke en gyldig identitetsserver."; +"identity_server_settings_alert_error_terms_not_accepted" = "Du må godkjenne vilkårene til %@ for å bruke den som identitetsserver."; +"identity_server_settings_alert_disconnect_still_sharing_3pid_button" = "Koble fra likevel"; +"identity_server_settings_alert_disconnect_still_sharing_3pid" = "Du deler fortsatt dine personlige data på identitetsserver %@.\n\nVi anbefaler at du fjerner din e-postadresse og telefonnummer fra identitetsserveren før du kobler fra."; +"identity_server_settings_alert_disconnect" = "Koble fra identitetsserver %@?"; +"identity_server_settings_alert_disconnect_title" = "Koble fra identitetsserver"; +"identity_server_settings_alert_change" = "Koble fra identitetsserver %1$@ og koble til %2$@ i stedet for?"; +"identity_server_settings_alert_no_terms" = "Identitetsserveren du har valgt har ikke brukervilkår. Fortsett kun hvis du stoler på eier av serveren."; +"identity_server_settings_alert_no_terms_title" = "Identitetsserver har ingen brukervilkår"; From 40ee5ead301049fdfb20b8e30c11a479f663b84b Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 12:13:28 +0000 Subject: [PATCH 033/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 70.5% (858 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index d40b04d82..82d39b35a 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -940,7 +940,7 @@ "security_settings_coming_soon" = "Beklager. Denne handlingen er ikke tilgjengelig på Element iOS enda. Vennligst benytt en annen Matrix klient for å sette det opp. Element iOS vil bruke den."; "security_settings_complete_security_alert_message" = "Du bør fullføre sikkerheten på din nåværende økt først."; "security_settings_blacklist_unverified_devices_description" = "Verifiser alle øktene til en bruker for å markere dem som klarert og send meldinger til dem."; -"identity_server_settings_disconnect_info" = "Kobler du fra din identitetsserver vil det bety at andre brukere ikke kan finne deg og kunne invitere andre med e-post og telefonnummer."; +"identity_server_settings_disconnect_info" = "Kobler du fra din identitetsserver vil det bety at andre brukere ikke kan finne deg, og at du vil ikke kunne invitere andre med e-post og telefonnummer."; "identity_server_settings_no_is_description" = "Du bruker for øyeblikket ikke en identitetsserver. Legg til en ovenfor, for å finne og bli funnet av eksisterende kontakter."; "room_details_mute_notifs" = "Slå av lydvarsler"; "room_details_favourite_tag" = "Favoritt"; From cf8da8b51687c9fe55f164653156f1f0130a1100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:21:01 +0000 Subject: [PATCH 034/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 71.5% (870 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 82d39b35a..4d0001352 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -854,7 +854,7 @@ "service_terms_modal_message_identity_server" = "Godta brukervilkårene til identitetsserveren (%@) for å finne kontakter."; "event_formatter_call_back" = "Ring tilbake"; "room_details_advanced_e2e_encryption_disabled" = "Kryptering er ikke aktivert i dette rommet."; -"room_details_flair_section" = "Vi brukervalg for samfunn"; +"room_details_flair_section" = "Vis brukervalg for samfunn"; "room_details_photo_for_dm" = "Bilde"; "room_details_photo" = "Rombilde"; "settings_flair" = "Vis brukervalg hvor tillat"; @@ -957,3 +957,15 @@ "identity_server_settings_alert_change" = "Koble fra identitetsserver %1$@ og koble til %2$@ i stedet for?"; "identity_server_settings_alert_no_terms" = "Identitetsserveren du har valgt har ikke brukervilkår. Fortsett kun hvis du stoler på eier av serveren."; "identity_server_settings_alert_no_terms_title" = "Identitetsserver har ingen brukervilkår"; +"room_details_addresses_disable_main_address_prompt_msg" = "Du vil ikke ha en primæradresse spesifisert. Standard primæradresse for dette rommet vil bli tilfeldig valgt."; +"room_details_addresses_disable_main_address_prompt_title" = "Primæradresse-varsel"; +"room_details_addresses_invalid_address_prompt_msg" = "%@ er ikke et gyldig format for et alias"; +"room_details_new_address_placeholder" = "Legg til ny adresse (f.eks. #foo%@)"; +"room_details_no_local_addresses_for_dm" = "Dette har ingen lokale adresser"; +"room_details_no_local_addresses" = "Dette rommet har ingen lokale adresser"; +"room_details_history_section_prompt_title" = "Personvernadvarsel"; +"room_details_access_section_directory_toggle_for_dm" = "Legg til i romliste"; +"room_details_access_section_directory_toggle" = "Legg dette rommet til i romliste"; +"room_details_access_section_no_address_warning" = "For å linke til et rom må det ha en adresse"; +"room_details_access_section_anyone_for_dm" = "Alle som har denne linken, inkludert gjester"; +"room_details_access_section_anyone_apart_from_guest_for_dm" = "Alle som har denne linken, unntatt gjester"; From 4b1ed5cbf8760efb524a608f1c84b70e9a1c3cf5 Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Wed, 12 May 2021 12:16:00 +0000 Subject: [PATCH 035/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 71.5% (870 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 4d0001352..c03318769 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -865,7 +865,7 @@ "secrets_setup_recovery_passphrase_information" = "Skriv inn et sikkerhetsfrase bare du kjenner, brukt til å sikre hemmeligheter på serveren din."; "secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "bruk gjenopprettingsnøkkelen din"; "key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "bruk gjenopprettingsnøkkelen"; -"room_details_access_section_for_dm" = "Hvem har til gang til dette?"; +"room_details_access_section_for_dm" = "Hvem har tilgang til dette?"; "identity_server_settings_place_holder" = "Legg inn en identitetsserver"; "identity_server_settings_description" = "Du bruker for øyeblikket %@ for å finne og bli funnet av dine eksisterende kontakter."; "security_settings_crosssigning_info_exists" = "Din konto har en kryss-signeringsidentitet, men den er ikke klarert av denne økten. Fullfør klarering for denne økten."; From 1fa879464ef81ceeb99405bba53e420fe6ab8952 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 12:15:54 +0000 Subject: [PATCH 036/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 71.5% (870 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c03318769..00469abcb 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -942,7 +942,7 @@ "security_settings_blacklist_unverified_devices_description" = "Verifiser alle øktene til en bruker for å markere dem som klarert og send meldinger til dem."; "identity_server_settings_disconnect_info" = "Kobler du fra din identitetsserver vil det bety at andre brukere ikke kan finne deg, og at du vil ikke kunne invitere andre med e-post og telefonnummer."; "identity_server_settings_no_is_description" = "Du bruker for øyeblikket ikke en identitetsserver. Legg til en ovenfor, for å finne og bli funnet av eksisterende kontakter."; -"room_details_mute_notifs" = "Slå av lydvarsler"; +"room_details_mute_notifs" = "Slå av varsler"; "room_details_favourite_tag" = "Favoritt"; "room_details_room_name_for_dm" = "Navn"; "room_details_integrations" = "Integrasjoner"; From 230fdf359d3a5eeec628b04621675672fe1201cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 12:23:38 +0000 Subject: [PATCH 037/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 72.0% (876 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 00469abcb..df3a5bb0e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -872,7 +872,7 @@ "security_settings_crypto_sessions_loading" = "Laster økter…"; "settings_discovery_no_identity_server" = "Du bruker for øyeblikket ikke en identitetsserver. Legg til en for at dine eksisterende kontakter skal kunne finne deg."; "settings_unignore_user" = "Vis alle meldinger fra %@?"; -"device_verification_cancelled" = "Den andre parten avbrøt verifiseringen"; +"device_verification_cancelled" = "Den andre parten kansellerte bekreftelsen."; "settings_callkit_info" = "Motta innkommende samtale på låst skjerm. Se dine anrop i systemets anropshistorikk. Hvis iCloud er aktivert, vil anropshistorikken blir delt med Apple."; //"settings_enable_all_notif" = "Enable all notifications"; //"settings_messages_my_display_name" = "Msg containing my display name"; @@ -969,3 +969,9 @@ "room_details_access_section_no_address_warning" = "For å linke til et rom må det ha en adresse"; "room_details_access_section_anyone_for_dm" = "Alle som har denne linken, inkludert gjester"; "room_details_access_section_anyone_apart_from_guest_for_dm" = "Alle som har denne linken, unntatt gjester"; +"room_details_advanced_e2e_encryption_enabled" = "Kryptering er aktivert i dette rommet"; +"room_details_advanced_enable_e2e_encryption" = "Aktiver kryptering (advarsel: kan ikke endres!)"; +"room_details_advanced_room_id_for_dm" = "ID:"; +"room_details_flair_invalid_id_prompt_msg" = "%@ er ikke en gyldig identifikator for et samfunn"; +"room_details_flair_invalid_id_prompt_title" = "Ugyldig format"; +"room_details_new_flair_placeholder" = "Legg til ID for samfunn (e.g. +foo%@)"; From 4f577fca7e3d137540d2c12c87d7b00fbc5f1b39 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 12:23:01 +0000 Subject: [PATCH 038/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 72.0% (876 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index df3a5bb0e..c5065b1df 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -835,7 +835,7 @@ "settings_key_backup_info_valid" = "Denne økten sikkerhetskopierer dine nøkler."; "settings_key_backup_info_version" = "Sikkerhetskopi av nøkler versjon : %@"; "settings_key_backup_info_signout_warning" = "Før du logger ut, koble denne sesjonen til sikkerhetskopi av nøkler for å unngå tap av nøkler som kanskje bare er lagret på denne enheten."; -"settings_key_backup_info_none" = "Nøklene dine for denne sesjonen blir ikke sikkerhetskopiert"; +"settings_key_backup_info_none" = "Nøklene dine for denne sesjonen blir ikke sikkerhetskopiert."; "settings_third_party_notices" = "Tredjepartsmerknader"; "settings_labs_e2e_encryption_prompt_message" = "Vennligst logg inn igjen for å ferdigstille oppsett av kryptering."; "settings_key_backup" = "Sikkerhetskopi av meldingsnøkler"; @@ -854,7 +854,7 @@ "service_terms_modal_message_identity_server" = "Godta brukervilkårene til identitetsserveren (%@) for å finne kontakter."; "event_formatter_call_back" = "Ring tilbake"; "room_details_advanced_e2e_encryption_disabled" = "Kryptering er ikke aktivert i dette rommet."; -"room_details_flair_section" = "Vis brukervalg for samfunn"; +"room_details_flair_section" = "Vis assosiasjon for samfunn"; "room_details_photo_for_dm" = "Bilde"; "room_details_photo" = "Rombilde"; "settings_flair" = "Vis brukervalg hvor tillat"; @@ -957,7 +957,7 @@ "identity_server_settings_alert_change" = "Koble fra identitetsserver %1$@ og koble til %2$@ i stedet for?"; "identity_server_settings_alert_no_terms" = "Identitetsserveren du har valgt har ikke brukervilkår. Fortsett kun hvis du stoler på eier av serveren."; "identity_server_settings_alert_no_terms_title" = "Identitetsserver har ingen brukervilkår"; -"room_details_addresses_disable_main_address_prompt_msg" = "Du vil ikke ha en primæradresse spesifisert. Standard primæradresse for dette rommet vil bli tilfeldig valgt."; +"room_details_addresses_disable_main_address_prompt_msg" = "Du vil ikke ha en primæradresse spesifisert. Standard primæradresse for dette rommet vil bli tilfeldig valgt"; "room_details_addresses_disable_main_address_prompt_title" = "Primæradresse-varsel"; "room_details_addresses_invalid_address_prompt_msg" = "%@ er ikke et gyldig format for et alias"; "room_details_new_address_placeholder" = "Legg til ny adresse (f.eks. #foo%@)"; From 5bc2d4a2e609fc3c3cb42061359b29a647e01592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 22:45:29 +0000 Subject: [PATCH 039/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 72.4% (881 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c5065b1df..1598997e2 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -975,3 +975,6 @@ "room_details_flair_invalid_id_prompt_msg" = "%@ er ikke en gyldig identifikator for et samfunn"; "room_details_flair_invalid_id_prompt_title" = "Ugyldig format"; "room_details_new_flair_placeholder" = "Legg til ID for samfunn (e.g. +foo%@)"; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Krypter kun til verifiserte økter"; +"room_details_advanced_e2e_encryption_disabled_for_dm" = "Kryptering er ikke aktivert her."; +"room_details_advanced_e2e_encryption_enabled_for_dm" = "Kryptering er aktivert her"; From 210e8c30fe3c50a9083aa7dc26e117a67c830825 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 12:25:55 +0000 Subject: [PATCH 040/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 72.4% (881 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 1598997e2..b1bd14b4c 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -784,7 +784,7 @@ "callbar_active_and_single_paused" = "1 aktiv samtale (%@) · 1 pauset samtale"; // Call Bar -"callbar_only_single_active" = "Aktiv samtale (%@)"; +"callbar_only_single_active" = "Trykk for å returnere til samtalen (%@)"; "secrets_setup_recovery_key_information" = "Oppbevar din sikkerhetsnøkkel trygt. Den kan brukes til å å tilgang til dine sikrede meldinger og data."; // MARK: - Secrets set up From 1905971c5220b09866374204072d08fd08a58862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 22:46:47 +0000 Subject: [PATCH 041/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 72.7% (885 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index b1bd14b4c..5958ee76b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -978,3 +978,7 @@ "room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Krypter kun til verifiserte økter"; "room_details_advanced_e2e_encryption_disabled_for_dm" = "Kryptering er ikke aktivert her."; "room_details_advanced_e2e_encryption_enabled_for_dm" = "Kryptering er aktivert her"; +"room_details_fail_to_update_room_guest_access" = "Oppdatering av tilgang til gjest i rommet feilet"; +"room_details_fail_to_update_topic" = "Oppdatering av emne feilet"; +"room_details_fail_to_update_room_name" = "Oppdatering av romnavn feilet"; +"room_details_fail_to_update_avatar" = "Oppdatering av rombilde feilet"; From c873a451c09ee7df0022a4166588f5eafe09f8f7 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 22:45:41 +0000 Subject: [PATCH 042/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 72.7% (885 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 5958ee76b..d942aec78 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -975,7 +975,7 @@ "room_details_flair_invalid_id_prompt_msg" = "%@ er ikke en gyldig identifikator for et samfunn"; "room_details_flair_invalid_id_prompt_title" = "Ugyldig format"; "room_details_new_flair_placeholder" = "Legg til ID for samfunn (e.g. +foo%@)"; -"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Krypter kun til verifiserte økter"; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Krypter kun til bekreftede økter"; "room_details_advanced_e2e_encryption_disabled_for_dm" = "Kryptering er ikke aktivert her."; "room_details_advanced_e2e_encryption_enabled_for_dm" = "Kryptering er aktivert her"; "room_details_fail_to_update_room_guest_access" = "Oppdatering av tilgang til gjest i rommet feilet"; From ac9ff4cfa40aba07aab361cae44b055966dc9df2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 22:47:58 +0000 Subject: [PATCH 043/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 72.8% (886 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index d942aec78..6c0aeefcb 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -982,3 +982,4 @@ "room_details_fail_to_update_topic" = "Oppdatering av emne feilet"; "room_details_fail_to_update_room_name" = "Oppdatering av romnavn feilet"; "room_details_fail_to_update_avatar" = "Oppdatering av rombilde feilet"; +"room_details_fail_to_update_room_join_rule" = "Oppdatering av bli-med-regel feilet"; From 94079fae67c6313ed7c159c7090a32de28282f68 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 22:47:07 +0000 Subject: [PATCH 044/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 72.8% (886 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 6c0aeefcb..396a85f8c 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -978,7 +978,7 @@ "room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Krypter kun til bekreftede økter"; "room_details_advanced_e2e_encryption_disabled_for_dm" = "Kryptering er ikke aktivert her."; "room_details_advanced_e2e_encryption_enabled_for_dm" = "Kryptering er aktivert her"; -"room_details_fail_to_update_room_guest_access" = "Oppdatering av tilgang til gjest i rommet feilet"; +"room_details_fail_to_update_room_guest_access" = "Oppdatering av gjestetilgang i rommet feilet"; "room_details_fail_to_update_topic" = "Oppdatering av emne feilet"; "room_details_fail_to_update_room_name" = "Oppdatering av romnavn feilet"; "room_details_fail_to_update_avatar" = "Oppdatering av rombilde feilet"; From 3169a2b27b9844da46623f719d16561cb1da4ff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 22:50:39 +0000 Subject: [PATCH 045/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 73.4% (893 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 396a85f8c..7a80d1ffa 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -983,3 +983,10 @@ "room_details_fail_to_update_room_name" = "Oppdatering av romnavn feilet"; "room_details_fail_to_update_avatar" = "Oppdatering av rombilde feilet"; "room_details_fail_to_update_room_join_rule" = "Oppdatering av bli-med-regel feilet"; +"room_details_fail_to_update_room_direct" = "Oppdatering av direkte flagg for dette rommet feilet"; +"room_details_fail_to_update_room_communities" = "Oppdatering av beslektede samfunn feilet"; +"room_details_fail_to_update_room_canonical_alias" = "Oppdatering av primæradresse feilet"; +"room_details_fail_to_remove_room_aliases" = "Fjerningen av romadresser feilet"; +"room_details_fail_to_add_room_aliases" = "Å legge til nye romadresser feilet"; +"room_details_fail_to_update_history_visibility" = "Oppdatering av historikksynlighet feilet"; +"room_details_fail_to_update_room_directory_visibility" = "Oppdatering av synligheten til romliste feilet"; From 20e1d42c6acd54e1ecdc4ccfbc644315374c410b Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 22:48:27 +0000 Subject: [PATCH 046/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 73.4% (893 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 7a80d1ffa..c3152c4b9 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -982,7 +982,7 @@ "room_details_fail_to_update_topic" = "Oppdatering av emne feilet"; "room_details_fail_to_update_room_name" = "Oppdatering av romnavn feilet"; "room_details_fail_to_update_avatar" = "Oppdatering av rombilde feilet"; -"room_details_fail_to_update_room_join_rule" = "Oppdatering av bli-med-regel feilet"; +"room_details_fail_to_update_room_join_rule" = "Oppdatering av regel for å bli med i rommet feilet"; "room_details_fail_to_update_room_direct" = "Oppdatering av direkte flagg for dette rommet feilet"; "room_details_fail_to_update_room_communities" = "Oppdatering av beslektede samfunn feilet"; "room_details_fail_to_update_room_canonical_alias" = "Oppdatering av primæradresse feilet"; From cee1cc30e08d9d047cf7ad1df7be832ed3bb41f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 22:51:46 +0000 Subject: [PATCH 047/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 73.5% (894 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c3152c4b9..3e37106f7 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -990,3 +990,4 @@ "room_details_fail_to_add_room_aliases" = "Å legge til nye romadresser feilet"; "room_details_fail_to_update_history_visibility" = "Oppdatering av historikksynlighet feilet"; "room_details_fail_to_update_room_directory_visibility" = "Oppdatering av synligheten til romliste feilet"; +"room_details_fail_to_enable_encryption" = "Aktivering av kryptering av dette rommet feilet"; From 1c1ec06dca708656883495f2d7584723154edb55 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 22:51:29 +0000 Subject: [PATCH 048/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 73.5% (894 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 3e37106f7..015d3683e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -983,7 +983,7 @@ "room_details_fail_to_update_room_name" = "Oppdatering av romnavn feilet"; "room_details_fail_to_update_avatar" = "Oppdatering av rombilde feilet"; "room_details_fail_to_update_room_join_rule" = "Oppdatering av regel for å bli med i rommet feilet"; -"room_details_fail_to_update_room_direct" = "Oppdatering av direkte flagg for dette rommet feilet"; +"room_details_fail_to_update_room_direct" = "Oppdatering av flagg for direktesamtale feilet for dette rommet"; "room_details_fail_to_update_room_communities" = "Oppdatering av beslektede samfunn feilet"; "room_details_fail_to_update_room_canonical_alias" = "Oppdatering av primæradresse feilet"; "room_details_fail_to_remove_room_aliases" = "Fjerningen av romadresser feilet"; From 2f0c04535e0cc2d92f06612f03224276b1dd50f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 22:53:04 +0000 Subject: [PATCH 049/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 74.2% (903 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 015d3683e..dd91757a0 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -991,3 +991,12 @@ "room_details_fail_to_update_history_visibility" = "Oppdatering av historikksynlighet feilet"; "room_details_fail_to_update_room_directory_visibility" = "Oppdatering av synligheten til romliste feilet"; "room_details_fail_to_enable_encryption" = "Aktivering av kryptering av dette rommet feilet"; +"group_participants_leave_prompt_msg" = "Er du sikker på at du vil forlate denne gruppen?"; +"group_invitation_format" = "%@ har invitert deg til å bli med i dette samfunnet"; +"group_home_multi_rooms_format" = "%tu rom"; +"group_home_multi_members_format" = "%tu medlemmer"; +"room_details_copy_room_url" = "Kopier rommets URL"; +"room_details_copy_room_address" = "Kopier romadresse"; +"room_details_unset_main_address" = "Fjern som primæradresse"; +"room_details_set_main_address" = "Sett som primæradresse"; +"room_details_save_changes_prompt" = "Vil du lagre endringer?"; From 172c17862e8dd4b559e6b91c47c855d7db265af8 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 22:51:55 +0000 Subject: [PATCH 050/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 74.2% (903 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index dd91757a0..c7d8c9141 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -990,7 +990,7 @@ "room_details_fail_to_add_room_aliases" = "Å legge til nye romadresser feilet"; "room_details_fail_to_update_history_visibility" = "Oppdatering av historikksynlighet feilet"; "room_details_fail_to_update_room_directory_visibility" = "Oppdatering av synligheten til romliste feilet"; -"room_details_fail_to_enable_encryption" = "Aktivering av kryptering av dette rommet feilet"; +"room_details_fail_to_enable_encryption" = "Aktivering av kryptering for dette rommet feilet"; "group_participants_leave_prompt_msg" = "Er du sikker på at du vil forlate denne gruppen?"; "group_invitation_format" = "%@ har invitert deg til å bli med i dette samfunnet"; "group_home_multi_rooms_format" = "%tu rom"; From 06629d8d147236c8f1c539dff99678f06cef6dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 22:55:20 +0000 Subject: [PATCH 051/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 74.9% (911 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c7d8c9141..d0c64b562 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1000,3 +1000,15 @@ "room_details_unset_main_address" = "Fjern som primæradresse"; "room_details_set_main_address" = "Sett som primæradresse"; "room_details_save_changes_prompt" = "Vil du lagre endringer?"; + +// Read Receipts +"read_receipts_list" = "Les kvitteringsliste"; + +// Group rooms +"group_rooms_filter_rooms" = "Filtrer samfunnsrom"; +"group_participants_invite_malformed_id" = "ID-format-feil. Bør være en Matrix ID som '@localpart:domain'"; +"group_participants_invite_malformed_id_title" = "Inviteringsfeil"; +"group_participants_invite_another_user" = "Søk/inviter med bruker ID eller navn"; +"group_participants_filter_members" = "Filtrer medlemmer i samfunnet"; +"group_participants_invite_prompt_msg" = "Er du sikker på at du vil invitere %@ til denne gruppen?"; +"group_participants_remove_prompt_msg" = "Er du sikker på at du vil fjerne %@ fra denne gruppen?"; From ae16d19a712f63dcdcd619bde1a5083b2a030e9a Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 22:53:23 +0000 Subject: [PATCH 052/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 74.9% (911 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index d0c64b562..a8aaaa873 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -991,7 +991,7 @@ "room_details_fail_to_update_history_visibility" = "Oppdatering av historikksynlighet feilet"; "room_details_fail_to_update_room_directory_visibility" = "Oppdatering av synligheten til romliste feilet"; "room_details_fail_to_enable_encryption" = "Aktivering av kryptering for dette rommet feilet"; -"group_participants_leave_prompt_msg" = "Er du sikker på at du vil forlate denne gruppen?"; +"group_participants_leave_prompt_msg" = "Er du sikker på at du vil forlate gruppen?"; "group_invitation_format" = "%@ har invitert deg til å bli med i dette samfunnet"; "group_home_multi_rooms_format" = "%tu rom"; "group_home_multi_members_format" = "%tu medlemmer"; From 398e3028c817f6c2c26a56e87aaa3227655c06a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 22:55:44 +0000 Subject: [PATCH 053/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 75.0% (912 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index a8aaaa873..4d72e558b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1012,3 +1012,4 @@ "group_participants_filter_members" = "Filtrer medlemmer i samfunnet"; "group_participants_invite_prompt_msg" = "Er du sikker på at du vil invitere %@ til denne gruppen?"; "group_participants_remove_prompt_msg" = "Er du sikker på at du vil fjerne %@ fra denne gruppen?"; +"receipt_status_read" = "Les: "; From 74f630128a7ba34c7c5978e6a6d4e39e86aef413 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 22:55:31 +0000 Subject: [PATCH 054/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 75.0% (912 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 4d72e558b..d3099b64b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1002,7 +1002,7 @@ "room_details_save_changes_prompt" = "Vil du lagre endringer?"; // Read Receipts -"read_receipts_list" = "Les kvitteringsliste"; +"read_receipts_list" = "Lesekvitteringsliste"; // Group rooms "group_rooms_filter_rooms" = "Filtrer samfunnsrom"; From e05ac892e710933347a95645b1e44254a360060f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 22:57:00 +0000 Subject: [PATCH 055/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 75.1% (914 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index d3099b64b..42a0a4e54 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1013,3 +1013,5 @@ "group_participants_invite_prompt_msg" = "Er du sikker på at du vil invitere %@ til denne gruppen?"; "group_participants_remove_prompt_msg" = "Er du sikker på at du vil fjerne %@ fra denne gruppen?"; "receipt_status_read" = "Les: "; +"directory_server_all_native_rooms" = "Alle innebygde Matrix-rom"; +"directory_server_all_rooms" = "Alle rom på %@ server"; From b90bcfbcc8a817af3e9b4e537361a9b67f686736 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 22:55:56 +0000 Subject: [PATCH 056/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 75.1% (914 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 42a0a4e54..69abdc35e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1012,6 +1012,6 @@ "group_participants_filter_members" = "Filtrer medlemmer i samfunnet"; "group_participants_invite_prompt_msg" = "Er du sikker på at du vil invitere %@ til denne gruppen?"; "group_participants_remove_prompt_msg" = "Er du sikker på at du vil fjerne %@ fra denne gruppen?"; -"receipt_status_read" = "Les: "; +"receipt_status_read" = "Lest: "; "directory_server_all_native_rooms" = "Alle innebygde Matrix-rom"; "directory_server_all_rooms" = "Alle rom på %@ server"; From 3f6b21cba7a7cb70528c8fe4f46f4baa71d787ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 23:01:27 +0000 Subject: [PATCH 057/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 76.6% (932 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 69abdc35e..5ff85a08b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1015,3 +1015,24 @@ "receipt_status_read" = "Lest: "; "directory_server_all_native_rooms" = "Alle innebygde Matrix-rom"; "directory_server_all_rooms" = "Alle rom på %@ server"; +"homeserver_connection_lost" = "Kunne ikke koble til hjemmeserveren."; +"event_formatter_jitsi_widget_removed_by_you" = "Du fjernet VoIP-konferanse"; +"event_formatter_jitsi_widget_added_by_you" = "Du la til VoIP-konferanse"; +"event_formatter_widget_removed_by_you" = "Du fjernet widget: %@"; + +// Events formatter with you +"event_formatter_widget_added_by_you" = "Du la til widget: %@"; +"event_formatter_call_you_declined" = "Du avviste denne samtalen"; +"event_formatter_call_you_currently_in" = "Du er for øyeblikket i denne samtalen"; +"event_formatter_call_video" = "Videoanrop"; +"event_formatter_call_voice" = "Taleanrop"; +"event_formatter_rerequest_keys_part2" = " fra dine andre sesjoner."; +"event_formatter_rerequest_keys_part1_link" = "Be om krypteringsnøkler på nytt"; +"event_formatter_jitsi_widget_removed" = "VoIP konferanse fjernet av %@"; +"event_formatter_jitsi_widget_added" = "VoIP konferanse lagt til av %@"; +"event_formatter_widget_removed" = "%@ widget fjernet av %@"; +"event_formatter_widget_added" = "%@ widget lagt til av %@"; + +// Events formatter +"event_formatter_member_updates" = "%tu endringer i medlemskap"; +"directory_server_type_homeserver" = "Skriv inn en hjemmeserver å liste offentlige rom fra"; From 4203e64c23ccf9e8a91a777041dfca08851c47d2 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 22:59:34 +0000 Subject: [PATCH 058/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 76.6% (932 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 5ff85a08b..07ef99273 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1013,7 +1013,7 @@ "group_participants_invite_prompt_msg" = "Er du sikker på at du vil invitere %@ til denne gruppen?"; "group_participants_remove_prompt_msg" = "Er du sikker på at du vil fjerne %@ fra denne gruppen?"; "receipt_status_read" = "Lest: "; -"directory_server_all_native_rooms" = "Alle innebygde Matrix-rom"; +"directory_server_all_native_rooms" = "Alle Matrix-rom"; "directory_server_all_rooms" = "Alle rom på %@ server"; "homeserver_connection_lost" = "Kunne ikke koble til hjemmeserveren."; "event_formatter_jitsi_widget_removed_by_you" = "Du fjernet VoIP-konferanse"; @@ -1036,3 +1036,4 @@ // Events formatter "event_formatter_member_updates" = "%tu endringer i medlemskap"; "directory_server_type_homeserver" = "Skriv inn en hjemmeserver å liste offentlige rom fra"; +"event_formatter_call_has_ended" = "Avsluttet samtale %@"; From 90578d14efc4f07ccacb971cacb3317bc65ea6e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 23:04:36 +0000 Subject: [PATCH 059/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 77.6% (944 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 07ef99273..f749db98b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1037,3 +1037,17 @@ "event_formatter_member_updates" = "%tu endringer i medlemskap"; "directory_server_type_homeserver" = "Skriv inn en hjemmeserver å liste offentlige rom fra"; "event_formatter_call_has_ended" = "Avsluttet samtale %@"; +"call_no_stun_server_error_message_1" = "Vennligst be administrator for din hjemmeserver %@ om å konfigurere en TURN server for pålitelige anrop."; +"call_no_stun_server_error_title" = "Anrop feilet på grunn av feilkonfigurert server"; +"call_jitsi_error" = "Forsøk på å bli med i konferansesamtale feilet."; +"call_already_displayed" = "Du er allerede i en samtale."; +"call_incoming_video_prompt" = "Innkommende videoanrop fra %@"; + +// Call +"call_incoming_voice_prompt" = "Innkommende taleanrop fra %@"; +"large_badge_value_k_format" = "%.1fK"; +"photo_library_access_not_granted" = "%@ har ikke adgang til bildebiblioteket, vennligst endre personverninnstillingene"; +"camera_unavailable" = "Kameraet er utilgjengelig på din enhet"; +"camera_access_not_granted" = "%@ har ikke tillatelse til å bruke kameraet, vennligst endre personverninnstillinger"; +"bug_report_prompt" = "Applikasjonen krasjet sist gang. Vil du sende inn en krasj-rapport?"; +"public_room_section_title" = "Offentlige rom (på %@):"; From 4ce63a44c83c2d36c28b290576fe9c410464d7c6 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 23:01:58 +0000 Subject: [PATCH 060/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 77.6% (944 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index f749db98b..4e69b1e57 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1015,7 +1015,7 @@ "receipt_status_read" = "Lest: "; "directory_server_all_native_rooms" = "Alle Matrix-rom"; "directory_server_all_rooms" = "Alle rom på %@ server"; -"homeserver_connection_lost" = "Kunne ikke koble til hjemmeserveren."; +"homeserver_connection_lost" = "Ingen kontakt med hjemmeserveren."; "event_formatter_jitsi_widget_removed_by_you" = "Du fjernet VoIP-konferanse"; "event_formatter_jitsi_widget_added_by_you" = "Du la til VoIP-konferanse"; "event_formatter_widget_removed_by_you" = "Du fjernet widget: %@"; From 7352e7fe5ea2dfcb7b0919f28a22c97472fb1fcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 23:05:23 +0000 Subject: [PATCH 061/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 77.7% (945 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 4e69b1e57..ca7759152 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1051,3 +1051,4 @@ "camera_access_not_granted" = "%@ har ikke tillatelse til å bruke kameraet, vennligst endre personverninnstillinger"; "bug_report_prompt" = "Applikasjonen krasjet sist gang. Vil du sende inn en krasj-rapport?"; "public_room_section_title" = "Offentlige rom (på %@):"; +"call_no_stun_server_error_message_2" = "Alternativt kan prøve å bruke den offentlige serveren ved %@, men denne vil være mindre pålitelig, og vil dele din IP-addresse med serveren. Du kan også administrere dette i innstillinger."; From 49ba530f54ca872ea82aed69d7caf45d09cafb92 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 23:05:12 +0000 Subject: [PATCH 062/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 77.7% (945 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index ca7759152..afb9fe633 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1037,7 +1037,7 @@ "event_formatter_member_updates" = "%tu endringer i medlemskap"; "directory_server_type_homeserver" = "Skriv inn en hjemmeserver å liste offentlige rom fra"; "event_formatter_call_has_ended" = "Avsluttet samtale %@"; -"call_no_stun_server_error_message_1" = "Vennligst be administrator for din hjemmeserver %@ om å konfigurere en TURN server for pålitelige anrop."; +"call_no_stun_server_error_message_1" = "Vennligst be administratoren for din hjemmeserver %@ om å konfigurere en TURN server for pålitelige anrop."; "call_no_stun_server_error_title" = "Anrop feilet på grunn av feilkonfigurert server"; "call_jitsi_error" = "Forsøk på å bli med i konferansesamtale feilet."; "call_already_displayed" = "Du er allerede i en samtale."; From 28ab69dca791765dcbac7aa42b79a56e166f5792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 23:08:03 +0000 Subject: [PATCH 063/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.2% (952 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index afb9fe633..7c5d2153b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1052,3 +1052,16 @@ "bug_report_prompt" = "Applikasjonen krasjet sist gang. Vil du sende inn en krasj-rapport?"; "public_room_section_title" = "Offentlige rom (på %@):"; "call_no_stun_server_error_message_2" = "Alternativt kan prøve å bruke den offentlige serveren ved %@, men denne vil være mindre pålitelig, og vil dele din IP-addresse med serveren. Du kan også administrere dette i innstillinger."; +"e2e_key_backup_wrong_version" = "Det har blitt oppdaget en ny sikkerhetskopi av meldingsnøkler for sikre meldinger .\n\nHvis dette ikke var deg, sett en ny passordfrase i innstillinger."; + +// Key backup wrong version +"e2e_key_backup_wrong_version_title" = "Ny sikkerhetskopi av nøkler"; +"e2e_need_log_in_again" = "Du må logge inn igjen for å generere ende-til-ende-krypteringsnøkler for denne økten og sende den offentlige nøkkelen til din hjemmeserver.\nDette gjøres bare en gang; beklager ulempen"; + +// Crypto +"e2e_enabling_on_app_update" = "Element støtter nå ende-til-ende kryptering, men du må logge inn igjen for å aktivere det.\n\nDu kan gjøre det nå eller senere fra applikasjonsinnstillingene."; + +// Crash report +"google_analytics_use_prompt" = "Vil du hjelpe til med å forbedre %@ ved automatisk og anonymt sende inn krasj-rapporter og brukerdata?"; +"no_voip" = "%@ ringer deg men %@ støtter ikke anrop enda.\nDu kan overse denne varselen og svare anropet fra en annen enhet eller du kan avvise det."; +"call_actions_unhold" = "Gjenoppta"; From 39466ef5c595a6fccf82aaab9ef9bd8d134251a8 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 23:05:48 +0000 Subject: [PATCH 064/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.2% (952 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 7c5d2153b..27f3db8a7 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1051,7 +1051,7 @@ "camera_access_not_granted" = "%@ har ikke tillatelse til å bruke kameraet, vennligst endre personverninnstillinger"; "bug_report_prompt" = "Applikasjonen krasjet sist gang. Vil du sende inn en krasj-rapport?"; "public_room_section_title" = "Offentlige rom (på %@):"; -"call_no_stun_server_error_message_2" = "Alternativt kan prøve å bruke den offentlige serveren ved %@, men denne vil være mindre pålitelig, og vil dele din IP-addresse med serveren. Du kan også administrere dette i innstillinger."; +"call_no_stun_server_error_message_2" = "Alternativt kan du prøve å bruke den offentlige serveren ved %@, men denne vil være mindre pålitelig, og vil dele din IP-adresse med serveren. Du kan også administrere dette i innstillinger."; "e2e_key_backup_wrong_version" = "Det har blitt oppdaget en ny sikkerhetskopi av meldingsnøkler for sikre meldinger .\n\nHvis dette ikke var deg, sett en ny passordfrase i innstillinger."; // Key backup wrong version From 84d658e9f175e0bcaa8b368d6d7382d89d040292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 23:09:40 +0000 Subject: [PATCH 065/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.3% (953 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 27f3db8a7..5e8959ef6 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1065,3 +1065,4 @@ "google_analytics_use_prompt" = "Vil du hjelpe til med å forbedre %@ ved automatisk og anonymt sende inn krasj-rapporter og brukerdata?"; "no_voip" = "%@ ringer deg men %@ støtter ikke anrop enda.\nDu kan overse denne varselen og svare anropet fra en annen enhet eller du kan avvise det."; "call_actions_unhold" = "Gjenoppta"; +"bug_report_description" = "Vennligst beskriv feil. Hva gjorde du? Hva forventet du skulle skje? Hva skjedde faktisk?"; From 0f6137d241fbe1eaabfb325bbd1422b46480d0ab Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 23:09:32 +0000 Subject: [PATCH 066/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.3% (953 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 5e8959ef6..045db3e21 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1052,7 +1052,7 @@ "bug_report_prompt" = "Applikasjonen krasjet sist gang. Vil du sende inn en krasj-rapport?"; "public_room_section_title" = "Offentlige rom (på %@):"; "call_no_stun_server_error_message_2" = "Alternativt kan du prøve å bruke den offentlige serveren ved %@, men denne vil være mindre pålitelig, og vil dele din IP-adresse med serveren. Du kan også administrere dette i innstillinger."; -"e2e_key_backup_wrong_version" = "Det har blitt oppdaget en ny sikkerhetskopi av meldingsnøkler for sikre meldinger .\n\nHvis dette ikke var deg, sett en ny passordfrase i innstillinger."; +"e2e_key_backup_wrong_version" = "Det har blitt oppdaget en ny sikkerhetskopi av meldingsnøkler .\n\nHvis dette ikke ble intitiert av deg bør du endre passordfrase i innstillinger."; // Key backup wrong version "e2e_key_backup_wrong_version_title" = "Ny sikkerhetskopi av nøkler"; From db83fff112335dcb29a74b60bcefd57acc9c3f2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 23:10:05 +0000 Subject: [PATCH 067/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.4% (954 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 045db3e21..6124f9073 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1066,3 +1066,4 @@ "no_voip" = "%@ ringer deg men %@ støtter ikke anrop enda.\nDu kan overse denne varselen og svare anropet fra en annen enhet eller du kan avvise det."; "call_actions_unhold" = "Gjenoppta"; "bug_report_description" = "Vennligst beskriv feil. Hva gjorde du? Hva forventet du skulle skje? Hva skjedde faktisk?"; +"bug_crash_report_description" = "Vennligst beskriv hva du gjorde før krasjet:"; From c527d9a6e3975f6c8b4645aa580fa94e5614c8c9 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 23:09:52 +0000 Subject: [PATCH 068/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.4% (954 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 6124f9073..03055dcd1 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1065,5 +1065,5 @@ "google_analytics_use_prompt" = "Vil du hjelpe til med å forbedre %@ ved automatisk og anonymt sende inn krasj-rapporter og brukerdata?"; "no_voip" = "%@ ringer deg men %@ støtter ikke anrop enda.\nDu kan overse denne varselen og svare anropet fra en annen enhet eller du kan avvise det."; "call_actions_unhold" = "Gjenoppta"; -"bug_report_description" = "Vennligst beskriv feil. Hva gjorde du? Hva forventet du skulle skje? Hva skjedde faktisk?"; +"bug_report_description" = "Vennligst beskriv feilen. Hva gjorde du? Hva forventet du skulle skje? Hva skjedde faktisk?"; "bug_crash_report_description" = "Vennligst beskriv hva du gjorde før krasjet:"; From 9605a644693e1144f0b9453eea85bad7313581fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 23:10:36 +0000 Subject: [PATCH 069/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.5% (955 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 03055dcd1..afe1d4d9d 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1067,3 +1067,4 @@ "call_actions_unhold" = "Gjenoppta"; "bug_report_description" = "Vennligst beskriv feilen. Hva gjorde du? Hva forventet du skulle skje? Hva skjedde faktisk?"; "bug_crash_report_description" = "Vennligst beskriv hva du gjorde før krasjet:"; +"bug_report_logs_description" = "For å diagnostisere problemer, vil logger fra denne klienten bli sendt sammen med denne feilrapporten. Hvis du foretrekker å kun sende teksten ovenfor, vennligst ta bort hake:"; From 1987882aeb944ba97a6fa6c260805fbae394f8f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 23:11:26 +0000 Subject: [PATCH 070/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.8% (959 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index afe1d4d9d..b7ab0fa63 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1068,3 +1068,9 @@ "bug_report_description" = "Vennligst beskriv feilen. Hva gjorde du? Hva forventet du skulle skje? Hva skjedde faktisk?"; "bug_crash_report_description" = "Vennligst beskriv hva du gjorde før krasjet:"; "bug_report_logs_description" = "For å diagnostisere problemer, vil logger fra denne klienten bli sendt sammen med denne feilrapporten. Hvis du foretrekker å kun sende teksten ovenfor, vennligst ta bort hake:"; + +// Widget +"widget_no_integrations_server_configured" = "Ingen integrasjoner er serverkonfigurert"; +"bug_report_background_mode" = "Fortsett i bakgrunnen"; +"bug_report_progress_uploading" = "Laster opp rapport"; +"bug_report_progress_zipping" = "Samler inn logger"; From a391ecbaef31c41a805e51ac6d399c5aefccf213 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 23:11:01 +0000 Subject: [PATCH 071/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.8% (959 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index b7ab0fa63..8f6798c08 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1067,7 +1067,7 @@ "call_actions_unhold" = "Gjenoppta"; "bug_report_description" = "Vennligst beskriv feilen. Hva gjorde du? Hva forventet du skulle skje? Hva skjedde faktisk?"; "bug_crash_report_description" = "Vennligst beskriv hva du gjorde før krasjet:"; -"bug_report_logs_description" = "For å diagnostisere problemer, vil logger fra denne klienten bli sendt sammen med denne feilrapporten. Hvis du foretrekker å kun sende teksten ovenfor, vennligst ta bort hake:"; +"bug_report_logs_description" = "For å diagnostisere problemer vil logger fra denne klienten bli sendt sammen med denne feilrapporten. Hvis du foretrekker å kun sende teksten ovenfor, vennligst ta bort haken:"; // Widget "widget_no_integrations_server_configured" = "Ingen integrasjoner er serverkonfigurert"; From 9c76d22181364e2cfa7a715c52fc5de2e7972f30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 23:12:00 +0000 Subject: [PATCH 072/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.9% (960 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 8f6798c08..688d2b35c 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1074,3 +1074,4 @@ "bug_report_background_mode" = "Fortsett i bakgrunnen"; "bug_report_progress_uploading" = "Laster opp rapport"; "bug_report_progress_zipping" = "Samler inn logger"; +"widget_integrations_server_failed_to_connect" = "Kobling til integrasjonsserver feilet"; From eed222b01d9efe920f65d0578a2946db5f375f99 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 23:11:48 +0000 Subject: [PATCH 073/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.9% (960 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 688d2b35c..26f032382 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1070,7 +1070,7 @@ "bug_report_logs_description" = "For å diagnostisere problemer vil logger fra denne klienten bli sendt sammen med denne feilrapporten. Hvis du foretrekker å kun sende teksten ovenfor, vennligst ta bort haken:"; // Widget -"widget_no_integrations_server_configured" = "Ingen integrasjoner er serverkonfigurert"; +"widget_no_integrations_server_configured" = "Ingen integrasjonsserver er konfigurert"; "bug_report_background_mode" = "Fortsett i bakgrunnen"; "bug_report_progress_uploading" = "Laster opp rapport"; "bug_report_progress_zipping" = "Samler inn logger"; From 2a07694202ab9c9a9216f1dd1515471a7ad72075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 12 May 2021 23:13:32 +0000 Subject: [PATCH 074/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 79.6% (968 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 26f032382..2af582f87 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1075,3 +1075,13 @@ "bug_report_progress_uploading" = "Laster opp rapport"; "bug_report_progress_zipping" = "Samler inn logger"; "widget_integrations_server_failed_to_connect" = "Kobling til integrasjonsserver feilet"; +"widget_integration_positive_power_level" = "Rollenivå må være positiv int."; +"widget_integration_room_not_recognised" = "Dette rommet gjenkjennes ikke."; +"widget_integration_failed_to_send_request" = "Sending av forespørsel feilet."; + +// Widget Integration Manager +"widget_integration_need_to_be_able_to_invite" = "Du må være i stand til å invitere brukere for å gjøre det."; +"widget_menu_revoke_permission" = "Opphev min tilgang"; +"widget_sticker_picker_no_stickerpacks_alert" = "Du har for øyeblikket ingen \"stickerpacks\" aktivert"; +"widget_creation_failure" = "Opprettelse av widget har feilet"; +"widget_no_power_to_manage" = "Du trenger tillatelse til å administrere widgeter i dette rommet"; From 1aa94aaef90f73f9678799ef636494fff24c89a5 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 23:12:16 +0000 Subject: [PATCH 075/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 79.6% (968 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 2af582f87..56f939184 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1074,7 +1074,7 @@ "bug_report_background_mode" = "Fortsett i bakgrunnen"; "bug_report_progress_uploading" = "Laster opp rapport"; "bug_report_progress_zipping" = "Samler inn logger"; -"widget_integrations_server_failed_to_connect" = "Kobling til integrasjonsserver feilet"; +"widget_integrations_server_failed_to_connect" = "Tilkobling til integrasjonsserver feilet"; "widget_integration_positive_power_level" = "Rollenivå må være positiv int."; "widget_integration_room_not_recognised" = "Dette rommet gjenkjennes ikke."; "widget_integration_failed_to_send_request" = "Sending av forespørsel feilet."; From 2d193a7171775bbc80991e3f56bdadfb6b2fb3e8 Mon Sep 17 00:00:00 2001 From: libexus Date: Wed, 12 May 2021 19:53:54 +0000 Subject: [PATCH 076/393] Translated using Weblate (German) Currently translated at 100.0% (35 of 35 strings) Translation: Element iOS/Element iOS (Push) Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-push/de/ --- Riot/Assets/de.lproj/Localizable.strings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Assets/de.lproj/Localizable.strings b/Riot/Assets/de.lproj/Localizable.strings index 155ecd848..0f6263a75 100644 --- a/Riot/Assets/de.lproj/Localizable.strings +++ b/Riot/Assets/de.lproj/Localizable.strings @@ -62,3 +62,9 @@ /* New message indicator on a room */ "MESSAGE_IN_X" = "Nachricht in %@"; "MESSAGE_PROTECTED" = "Neue Nachricht"; + +/* Group call from user, CallKit caller name */ +"GROUP_CALL_FROM_USER" = "%@ (Gruppenanruf)"; + +/* A user added a Jitsi call to a room */ +"GROUP_CALL_STARTED" = "Gruppenanruf gestartet"; From b8a9be309dea153a43b1bd05341445fb3dc7dc84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:13:00 +0000 Subject: [PATCH 077/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.1% (987 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 56f939184..1347fd0d4 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -839,7 +839,7 @@ "settings_third_party_notices" = "Tredjepartsmerknader"; "settings_labs_e2e_encryption_prompt_message" = "Vennligst logg inn igjen for å ferdigstille oppsett av kryptering."; "settings_key_backup" = "Sikkerhetskopi av meldingsnøkler"; -"settings_ui_theme_picker_message" = "\"Auto\" bruker din enhets innstillinger for å bytte bakgrunnsfarge"; +"settings_ui_theme_picker_message" = "\"Auto\" bruker dine enhetsinnstillinger for å bytte bakgrunnsfarge"; // MARK: - Favourites @@ -1036,7 +1036,7 @@ // Events formatter "event_formatter_member_updates" = "%tu endringer i medlemskap"; "directory_server_type_homeserver" = "Skriv inn en hjemmeserver å liste offentlige rom fra"; -"event_formatter_call_has_ended" = "Avsluttet samtale %@"; +"event_formatter_call_has_ended" = "Denne samtalen er avsluttet"; "call_no_stun_server_error_message_1" = "Vennligst be administratoren for din hjemmeserver %@ om å konfigurere en TURN server for pålitelige anrop."; "call_no_stun_server_error_title" = "Anrop feilet på grunn av feilkonfigurert server"; "call_jitsi_error" = "Forsøk på å bli med i konferansesamtale feilet."; @@ -1085,3 +1085,18 @@ "widget_sticker_picker_no_stickerpacks_alert" = "Du har for øyeblikket ingen \"stickerpacks\" aktivert"; "widget_creation_failure" = "Opprettelse av widget har feilet"; "widget_no_power_to_manage" = "Du trenger tillatelse til å administrere widgeter i dette rommet"; +"e2e_room_key_request_message_new_device" = "Du la til en ny sesjon '%@', som etterspør krypteringsnøkler."; + +// Room key request dialog +"e2e_room_key_request_title" = "Forespørsel om krypteringsnøkkel"; +"share_extension_failed_to_encrypt" = "Sending feilet. Sjekk innstillinger for kryptering i dette rommet i hovedappen"; + +// Share extension +"share_extension_auth_prompt" = "Logg inn i hovedappen for å dele innhold"; +"room_widget_permission_information_title" = "Bruk av den kan føre til deling av data med %@:\n"; +"room_widget_permission_webview_information_title" = "Bruk kan aktivere informasjonskapsler og dele data med %@:\n"; +"room_widget_permission_creator_info_title" = "Denne widgeten ble lagt til av:"; +"widget_integration_manager_disabled" = "Du må aktivere integrasjonsadministrator i innstillinger"; +"widget_integration_room_not_visible" = "Rom %@ er ikke synlig."; +"widget_integration_missing_user_id" = "Manglende bruker_id i forespørsel."; +"widget_integration_no_permission_in_room" = "Du har ikke tillatelse til å gjøre det i dette rommet."; From ae8c98e1115d39a81f73c0fd65b8ad8441ae5846 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 12 May 2021 23:20:41 +0000 Subject: [PATCH 078/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.1% (987 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 1347fd0d4..654d7a3d2 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1051,12 +1051,12 @@ "camera_access_not_granted" = "%@ har ikke tillatelse til å bruke kameraet, vennligst endre personverninnstillinger"; "bug_report_prompt" = "Applikasjonen krasjet sist gang. Vil du sende inn en krasj-rapport?"; "public_room_section_title" = "Offentlige rom (på %@):"; -"call_no_stun_server_error_message_2" = "Alternativt kan du prøve å bruke den offentlige serveren ved %@, men denne vil være mindre pålitelig, og vil dele din IP-adresse med serveren. Du kan også administrere dette i innstillinger."; +"call_no_stun_server_error_message_2" = "Alternativt kan du prøve å bruke den offentlige serveren ved %@, men denne vil være mindre pålitelig, og vil dele din IP-adresse med serveren. Du kan også administrere dette i innstillinger"; "e2e_key_backup_wrong_version" = "Det har blitt oppdaget en ny sikkerhetskopi av meldingsnøkler .\n\nHvis dette ikke ble intitiert av deg bør du endre passordfrase i innstillinger."; // Key backup wrong version "e2e_key_backup_wrong_version_title" = "Ny sikkerhetskopi av nøkler"; -"e2e_need_log_in_again" = "Du må logge inn igjen for å generere ende-til-ende-krypteringsnøkler for denne økten og sende den offentlige nøkkelen til din hjemmeserver.\nDette gjøres bare en gang; beklager ulempen"; +"e2e_need_log_in_again" = "Du må logge inn igjen for å generere ende-til-ende-krypteringsnøkler for denne økten og sende den offentlige nøkkelen til din hjemmeserver.\nDette gjøres bare en gang; beklager ulempen."; // Crypto "e2e_enabling_on_app_update" = "Element støtter nå ende-til-ende kryptering, men du må logge inn igjen for å aktivere det.\n\nDu kan gjøre det nå eller senere fra applikasjonsinnstillingene."; @@ -1075,14 +1075,14 @@ "bug_report_progress_uploading" = "Laster opp rapport"; "bug_report_progress_zipping" = "Samler inn logger"; "widget_integrations_server_failed_to_connect" = "Tilkobling til integrasjonsserver feilet"; -"widget_integration_positive_power_level" = "Rollenivå må være positiv int."; +"widget_integration_positive_power_level" = "Tilgangsnivå må være et positiv heltall."; "widget_integration_room_not_recognised" = "Dette rommet gjenkjennes ikke."; "widget_integration_failed_to_send_request" = "Sending av forespørsel feilet."; // Widget Integration Manager "widget_integration_need_to_be_able_to_invite" = "Du må være i stand til å invitere brukere for å gjøre det."; "widget_menu_revoke_permission" = "Opphev min tilgang"; -"widget_sticker_picker_no_stickerpacks_alert" = "Du har for øyeblikket ingen \"stickerpacks\" aktivert"; +"widget_sticker_picker_no_stickerpacks_alert" = "Du har for øyeblikket ingen \"stickerpacks\" aktivert."; "widget_creation_failure" = "Opprettelse av widget har feilet"; "widget_no_power_to_manage" = "Du trenger tillatelse til å administrere widgeter i dette rommet"; "e2e_room_key_request_message_new_device" = "Du la til en ny sesjon '%@', som etterspør krypteringsnøkler."; @@ -1100,3 +1100,11 @@ "widget_integration_room_not_visible" = "Rom %@ er ikke synlig."; "widget_integration_missing_user_id" = "Manglende bruker_id i forespørsel."; "widget_integration_no_permission_in_room" = "Du har ikke tillatelse til å gjøre det i dette rommet."; +"event_formatter_call_decline" = "Avslå"; +"event_formatter_call_connection_failed" = "Tilkobling feilet"; +"event_formatter_call_ringing" = "Ringer…"; +"event_formatter_call_connecting" = "Kobler til…"; +"settings_labs_enable_ringing_for_group_calls" = "Ringelyd for konferansesamtaler"; +"room_no_privileges_to_create_group_call" = "Du har ikke tilstrekkelige tillatelser til å starte en samtale."; +"room_join_group_call" = "Bli med i samtale"; +"callbar_only_single_active_group" = "Trykk for å bli med i konferansesamtalen (%@)"; From 5e875b90d48bfdabcba8827969ba6e48f6166958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:13:24 +0000 Subject: [PATCH 079/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.2% (988 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 654d7a3d2..c4cda2497 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1108,3 +1108,4 @@ "room_no_privileges_to_create_group_call" = "Du har ikke tilstrekkelige tillatelser til å starte en samtale."; "room_join_group_call" = "Bli med i samtale"; "callbar_only_single_active_group" = "Trykk for å bli med i konferansesamtalen (%@)"; +"e2e_room_key_request_message" = "Din ikke-verifiserte økt '%@' etterspør krypteringsnøkler."; From 378acf9f565ed1e078132f25403a53e9f1d73459 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:13:12 +0000 Subject: [PATCH 080/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.2% (988 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c4cda2497..a94a1ac9e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1085,7 +1085,7 @@ "widget_sticker_picker_no_stickerpacks_alert" = "Du har for øyeblikket ingen \"stickerpacks\" aktivert."; "widget_creation_failure" = "Opprettelse av widget har feilet"; "widget_no_power_to_manage" = "Du trenger tillatelse til å administrere widgeter i dette rommet"; -"e2e_room_key_request_message_new_device" = "Du la til en ny sesjon '%@', som etterspør krypteringsnøkler."; +"e2e_room_key_request_message_new_device" = "Du la til en ny økt '%@', som etterspør krypteringsnøkler."; // Room key request dialog "e2e_room_key_request_title" = "Forespørsel om krypteringsnøkkel"; From 660b0d1bca77ef27ffb2b035fc134e7406c7dcde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:13:48 +0000 Subject: [PATCH 081/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.3% (989 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index a94a1ac9e..43aac39cd 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1109,3 +1109,4 @@ "room_join_group_call" = "Bli med i samtale"; "callbar_only_single_active_group" = "Trykk for å bli med i konferansesamtalen (%@)"; "e2e_room_key_request_message" = "Din ikke-verifiserte økt '%@' etterspør krypteringsnøkler."; +"e2e_room_key_request_share_without_verifying" = "Del uten å verifisere"; From 512d63386d57d085c24defce0880d9eac6ed6def Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:13:35 +0000 Subject: [PATCH 082/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.3% (989 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 43aac39cd..25c533b0e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1108,5 +1108,5 @@ "room_no_privileges_to_create_group_call" = "Du har ikke tilstrekkelige tillatelser til å starte en samtale."; "room_join_group_call" = "Bli med i samtale"; "callbar_only_single_active_group" = "Trykk for å bli med i konferansesamtalen (%@)"; -"e2e_room_key_request_message" = "Din ikke-verifiserte økt '%@' etterspør krypteringsnøkler."; +"e2e_room_key_request_message" = "Din ikke-bekreftede økt '%@' etterspør krypteringsnøkler."; "e2e_room_key_request_share_without_verifying" = "Del uten å verifisere"; From fd27f7e5a57ec8524ab217386e29c83d19632159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:14:13 +0000 Subject: [PATCH 083/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.4% (991 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 25c533b0e..bfb806127 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1110,3 +1110,7 @@ "callbar_only_single_active_group" = "Trykk for å bli med i konferansesamtalen (%@)"; "e2e_room_key_request_message" = "Din ikke-bekreftede økt '%@' etterspør krypteringsnøkler."; "e2e_room_key_request_share_without_verifying" = "Del uten å verifisere"; + +// GDPR +"gdpr_consent_not_given_alert_message" = "For å fortsette å bruke %@ hjemmeserver må du se gjennom og godta brukervilkårene."; +"e2e_room_key_request_ignore_request" = "Ignorer forespørsel"; From 1a1f5ce3ac7701fd3a9165594928a3f3edd61e75 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:13:56 +0000 Subject: [PATCH 084/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.4% (991 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index bfb806127..018cb1cc0 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1109,7 +1109,7 @@ "room_join_group_call" = "Bli med i samtale"; "callbar_only_single_active_group" = "Trykk for å bli med i konferansesamtalen (%@)"; "e2e_room_key_request_message" = "Din ikke-bekreftede økt '%@' etterspør krypteringsnøkler."; -"e2e_room_key_request_share_without_verifying" = "Del uten å verifisere"; +"e2e_room_key_request_share_without_verifying" = "Del uten å bekrefte"; // GDPR "gdpr_consent_not_given_alert_message" = "For å fortsette å bruke %@ hjemmeserver må du se gjennom og godta brukervilkårene."; From 5becd2056845248d6fab0ea7941270b3f36954f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:14:44 +0000 Subject: [PATCH 085/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.6% (993 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 018cb1cc0..50943237e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1114,3 +1114,5 @@ // GDPR "gdpr_consent_not_given_alert_message" = "For å fortsette å bruke %@ hjemmeserver må du se gjennom og godta brukervilkårene."; "e2e_room_key_request_ignore_request" = "Ignorer forespørsel"; +"service_terms_modal_message" = "For å fortsette må du godta brukervilkårene (%@)."; +"gdpr_consent_not_given_alert_review_now_action" = "Se gjennom nå"; From dc862f1c5c0108463ed90394188dd5cc5668f3b9 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:14:23 +0000 Subject: [PATCH 086/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.6% (993 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 50943237e..a0b41fc2c 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1112,7 +1112,7 @@ "e2e_room_key_request_share_without_verifying" = "Del uten å bekrefte"; // GDPR -"gdpr_consent_not_given_alert_message" = "For å fortsette å bruke %@ hjemmeserver må du se gjennom og godta brukervilkårene."; +"gdpr_consent_not_given_alert_message" = "For å fortsette å bruke %@ hjemmeserveren må du se gjennom og godta brukervilkårene."; "e2e_room_key_request_ignore_request" = "Ignorer forespørsel"; "service_terms_modal_message" = "For å fortsette må du godta brukervilkårene (%@)."; "gdpr_consent_not_given_alert_review_now_action" = "Se gjennom nå"; From b069ebc0153969741e00b0c15a009636c343e855 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:15:11 +0000 Subject: [PATCH 087/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.7% (994 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index a0b41fc2c..d342d6513 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1116,3 +1116,4 @@ "e2e_room_key_request_ignore_request" = "Ignorer forespørsel"; "service_terms_modal_message" = "For å fortsette må du godta brukervilkårene (%@)."; "gdpr_consent_not_given_alert_review_now_action" = "Se gjennom nå"; +"service_terms_modal_description_for_identity_server_1" = "Finn andre med telefonnummer og e-post"; From 17b47e16b33ad0f3498a16ac83f9a1acceb15859 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:15:00 +0000 Subject: [PATCH 088/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.7% (994 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index d342d6513..0d0cf5667 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1114,6 +1114,6 @@ // GDPR "gdpr_consent_not_given_alert_message" = "For å fortsette å bruke %@ hjemmeserveren må du se gjennom og godta brukervilkårene."; "e2e_room_key_request_ignore_request" = "Ignorer forespørsel"; -"service_terms_modal_message" = "For å fortsette må du godta brukervilkårene (%@)."; +"service_terms_modal_message" = "For å fortsette må du godta brukervilkårene for denne tjenesten (%@)."; "gdpr_consent_not_given_alert_review_now_action" = "Se gjennom nå"; "service_terms_modal_description_for_identity_server_1" = "Finn andre med telefonnummer og e-post"; From 41a3695345b9bb23dac1af34077d4fc6946b3350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:15:46 +0000 Subject: [PATCH 089/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.8% (995 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 0d0cf5667..12f2b432e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1117,3 +1117,4 @@ "service_terms_modal_message" = "For å fortsette må du godta brukervilkårene for denne tjenesten (%@)."; "gdpr_consent_not_given_alert_review_now_action" = "Se gjennom nå"; "service_terms_modal_description_for_identity_server_1" = "Finn andre med telefonnummer og e-post"; +"service_terms_modal_description_for_identity_server_2" = "Bli funnet med telefonnummer eller e-post"; From cf0907bd849ab3bd979bcb066586fbaf9acf64b6 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:15:28 +0000 Subject: [PATCH 090/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.8% (995 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 12f2b432e..29965344f 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1116,5 +1116,5 @@ "e2e_room_key_request_ignore_request" = "Ignorer forespørsel"; "service_terms_modal_message" = "For å fortsette må du godta brukervilkårene for denne tjenesten (%@)."; "gdpr_consent_not_given_alert_review_now_action" = "Se gjennom nå"; -"service_terms_modal_description_for_identity_server_1" = "Finn andre med telefonnummer og e-post"; +"service_terms_modal_description_for_identity_server_1" = "Finn andre vha. telefonnummer og e-post"; "service_terms_modal_description_for_identity_server_2" = "Bli funnet med telefonnummer eller e-post"; From 7e83a7500792d515777f3f19dd3abb0415f63fde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:16:23 +0000 Subject: [PATCH 091/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.0% (998 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 29965344f..dc796d015 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1118,3 +1118,6 @@ "gdpr_consent_not_given_alert_review_now_action" = "Se gjennom nå"; "service_terms_modal_description_for_identity_server_1" = "Finn andre vha. telefonnummer og e-post"; "service_terms_modal_description_for_identity_server_2" = "Bli funnet med telefonnummer eller e-post"; +"deactivate_account_informations_part1" = "Dette vil gjøre din konto ubrukelig på permanent basis. Du vil ikke kunne logge inn og ingen vil kunne registrere sammen bruker-ID på nytt. Dette vil medføre at din konto vil forlate alle rom den deltar i, og vil fjerne dine kontodetaljer fra din identitetsserver. "; +"service_terms_modal_policy_checkbox_accessibility_hint" = "Huk av for å akseptere %@"; +"service_terms_modal_description_for_integration_manager" = "Bruk Bots, bridges, widgets og sticker packs"; From 4213746c588a2ea4558056fb64549c9a910d26fe Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:15:55 +0000 Subject: [PATCH 092/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.0% (998 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index dc796d015..2170694e9 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1117,7 +1117,7 @@ "service_terms_modal_message" = "For å fortsette må du godta brukervilkårene for denne tjenesten (%@)."; "gdpr_consent_not_given_alert_review_now_action" = "Se gjennom nå"; "service_terms_modal_description_for_identity_server_1" = "Finn andre vha. telefonnummer og e-post"; -"service_terms_modal_description_for_identity_server_2" = "Bli funnet med telefonnummer eller e-post"; +"service_terms_modal_description_for_identity_server_2" = "Bli funnet vha. telefonnummer eller e-post"; "deactivate_account_informations_part1" = "Dette vil gjøre din konto ubrukelig på permanent basis. Du vil ikke kunne logge inn og ingen vil kunne registrere sammen bruker-ID på nytt. Dette vil medføre at din konto vil forlate alle rom den deltar i, og vil fjerne dine kontodetaljer fra din identitetsserver. "; "service_terms_modal_policy_checkbox_accessibility_hint" = "Huk av for å akseptere %@"; "service_terms_modal_description_for_integration_manager" = "Bruk Bots, bridges, widgets og sticker packs"; From 2aa77f5091b8a55403651e1b1bcb9a48c84e67f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:17:13 +0000 Subject: [PATCH 093/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.2% (1000 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 2170694e9..9864ecec0 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1121,3 +1121,5 @@ "deactivate_account_informations_part1" = "Dette vil gjøre din konto ubrukelig på permanent basis. Du vil ikke kunne logge inn og ingen vil kunne registrere sammen bruker-ID på nytt. Dette vil medføre at din konto vil forlate alle rom den deltar i, og vil fjerne dine kontodetaljer fra din identitetsserver. "; "service_terms_modal_policy_checkbox_accessibility_hint" = "Huk av for å akseptere %@"; "service_terms_modal_description_for_integration_manager" = "Bruk Bots, bridges, widgets og sticker packs"; +"deactivate_account_informations_part5" = "Hvis du ønsker at vi skal glemme din melding, kryss av i boksen under.\n\nMeldingssynlighet i Matrix er sammenlignbar med e-post. Når vi glemmer dine meldinger betyr det at meldinger du har sendt ikke vil bli delt med nye eller uregistrerte brukere, men registrerte brukere som allerede har tilgang til disse meldingene vil fremdeles har tilgang på sin kopi."; +"deactivate_account_informations_part4_emphasize" = "vil som standard ikke få oss til å glemme meldinger du har sendt. "; From 8b64eac50517cc332ce755c302888ec9a82cd440 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:16:48 +0000 Subject: [PATCH 094/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.2% (1000 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 9864ecec0..311badae0 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1118,7 +1118,7 @@ "gdpr_consent_not_given_alert_review_now_action" = "Se gjennom nå"; "service_terms_modal_description_for_identity_server_1" = "Finn andre vha. telefonnummer og e-post"; "service_terms_modal_description_for_identity_server_2" = "Bli funnet vha. telefonnummer eller e-post"; -"deactivate_account_informations_part1" = "Dette vil gjøre din konto ubrukelig på permanent basis. Du vil ikke kunne logge inn og ingen vil kunne registrere sammen bruker-ID på nytt. Dette vil medføre at din konto vil forlate alle rom den deltar i, og vil fjerne dine kontodetaljer fra din identitetsserver. "; +"deactivate_account_informations_part1" = "Dette vil gjøre din konto ubrukelig på permanent basis. Du vil ikke kunne logge inn og ingen vil kunne registrere samme bruker-ID på nytt. Dette vil medføre at din konto vil forlate alle rom den deltar i, og vil fjerne dine kontodetaljer fra din identitetsserver. "; "service_terms_modal_policy_checkbox_accessibility_hint" = "Huk av for å akseptere %@"; "service_terms_modal_description_for_integration_manager" = "Bruk Bots, bridges, widgets og sticker packs"; "deactivate_account_informations_part5" = "Hvis du ønsker at vi skal glemme din melding, kryss av i boksen under.\n\nMeldingssynlighet i Matrix er sammenlignbar med e-post. Når vi glemmer dine meldinger betyr det at meldinger du har sendt ikke vil bli delt med nye eller uregistrerte brukere, men registrerte brukere som allerede har tilgang til disse meldingene vil fremdeles har tilgang på sin kopi."; From 8e479bb6bfbe48e31b693c28a95d10d5ec7f8324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:19:14 +0000 Subject: [PATCH 095/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.5% (1004 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 311badae0..065285501 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1123,3 +1123,7 @@ "service_terms_modal_description_for_integration_manager" = "Bruk Bots, bridges, widgets og sticker packs"; "deactivate_account_informations_part5" = "Hvis du ønsker at vi skal glemme din melding, kryss av i boksen under.\n\nMeldingssynlighet i Matrix er sammenlignbar med e-post. Når vi glemmer dine meldinger betyr det at meldinger du har sendt ikke vil bli delt med nye eller uregistrerte brukere, men registrerte brukere som allerede har tilgang til disse meldingene vil fremdeles har tilgang på sin kopi."; "deactivate_account_informations_part4_emphasize" = "vil som standard ikke få oss til å glemme meldinger du har sendt. "; +"rerequest_keys_alert_message" = "Start Element på en annen enhet som kan dekryptere meldingen, slik at den kan sende nøklene til denne økten."; +"deactivate_account_password_alert_message" = "For å fortsette, vennligst skriv inn passordet ditt"; +"deactivate_account_forget_messages_information_part3" = ": dette vil føre til at fremtidige brukere ser en ufullstendig visning av samtaler)"; +"deactivate_account_forget_messages_information_part1" = "Vennligst glem alle meldingene jeg har sendt når kontoen min er deaktivert ("; From f925f5f09908d0b9d12836d86d444fe76b2f62f1 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:17:52 +0000 Subject: [PATCH 096/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.5% (1004 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 065285501..e749f0230 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1121,7 +1121,7 @@ "deactivate_account_informations_part1" = "Dette vil gjøre din konto ubrukelig på permanent basis. Du vil ikke kunne logge inn og ingen vil kunne registrere samme bruker-ID på nytt. Dette vil medføre at din konto vil forlate alle rom den deltar i, og vil fjerne dine kontodetaljer fra din identitetsserver. "; "service_terms_modal_policy_checkbox_accessibility_hint" = "Huk av for å akseptere %@"; "service_terms_modal_description_for_integration_manager" = "Bruk Bots, bridges, widgets og sticker packs"; -"deactivate_account_informations_part5" = "Hvis du ønsker at vi skal glemme din melding, kryss av i boksen under.\n\nMeldingssynlighet i Matrix er sammenlignbar med e-post. Når vi glemmer dine meldinger betyr det at meldinger du har sendt ikke vil bli delt med nye eller uregistrerte brukere, men registrerte brukere som allerede har tilgang til disse meldingene vil fremdeles har tilgang på sin kopi."; +"deactivate_account_informations_part5" = "Hvis du ønsker at vi skal glemme dine meldinger, kryss av i boksen under.\n\nMeldingssynlighet er sammenlignbar med e-post. Når vi glemmer dine meldinger betyr det at meldinger du har sendt ikke vil bli delt med nye eller uregistrerte brukere, men registrerte brukere som allerede har tilgang til disse meldingene vil fremdeles har tilgang på sin kopi."; "deactivate_account_informations_part4_emphasize" = "vil som standard ikke få oss til å glemme meldinger du har sendt. "; "rerequest_keys_alert_message" = "Start Element på en annen enhet som kan dekryptere meldingen, slik at den kan sende nøklene til denne økten."; "deactivate_account_password_alert_message" = "For å fortsette, vennligst skriv inn passordet ditt"; From e9d83137e33500e40cec069fdf5e380881047a19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:20:05 +0000 Subject: [PATCH 097/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.7% (1006 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index e749f0230..191d9290e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1127,3 +1127,10 @@ "deactivate_account_password_alert_message" = "For å fortsette, vennligst skriv inn passordet ditt"; "deactivate_account_forget_messages_information_part3" = ": dette vil føre til at fremtidige brukere ser en ufullstendig visning av samtaler)"; "deactivate_account_forget_messages_information_part1" = "Vennligst glem alle meldingene jeg har sendt når kontoen min er deaktivert ("; +"secure_key_backup_setup_intro_info" = "Beskytt deg mot å miste tilgang til krypterte meldinger og data ved å sikkerhetskopiere krypteringsnøkler på serveren din."; + +// MARK: Secure backup setup + +// Intro + +"secure_key_backup_setup_intro_title" = "Sikkert lagringsområde"; From bc168695e20d022b40a3c4d48d5aa1aa43ff409f Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:19:33 +0000 Subject: [PATCH 098/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.7% (1006 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 191d9290e..ad78e4b55 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1123,7 +1123,7 @@ "service_terms_modal_description_for_integration_manager" = "Bruk Bots, bridges, widgets og sticker packs"; "deactivate_account_informations_part5" = "Hvis du ønsker at vi skal glemme dine meldinger, kryss av i boksen under.\n\nMeldingssynlighet er sammenlignbar med e-post. Når vi glemmer dine meldinger betyr det at meldinger du har sendt ikke vil bli delt med nye eller uregistrerte brukere, men registrerte brukere som allerede har tilgang til disse meldingene vil fremdeles har tilgang på sin kopi."; "deactivate_account_informations_part4_emphasize" = "vil som standard ikke få oss til å glemme meldinger du har sendt. "; -"rerequest_keys_alert_message" = "Start Element på en annen enhet som kan dekryptere meldingen, slik at den kan sende nøklene til denne økten."; +"rerequest_keys_alert_message" = "Start appen på en annen enhet som kan dekryptere meldingen, slik at den kan sende nøklene til denne økten."; "deactivate_account_password_alert_message" = "For å fortsette, vennligst skriv inn passordet ditt"; "deactivate_account_forget_messages_information_part3" = ": dette vil føre til at fremtidige brukere ser en ufullstendig visning av samtaler)"; "deactivate_account_forget_messages_information_part1" = "Vennligst glem alle meldingene jeg har sendt når kontoen min er deaktivert ("; From 8ee2c0642a0f8f50102c23e66e75a0862bdb7f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:20:44 +0000 Subject: [PATCH 099/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.8% (1008 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index ad78e4b55..76359a001 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1134,3 +1134,5 @@ // Intro "secure_key_backup_setup_intro_title" = "Sikkert lagringsområde"; +"secure_key_backup_setup_intro_use_security_key_info" = "Generer en sikkerhetsnøkkel for å lagre et trygt sted som en passordadministrator eller en safe."; +"secure_key_backup_setup_intro_use_security_key_title" = "Bruk en sikkerhetsnøkkel"; From 462e6f2c6a1e9ab8d4fb28b963224e2209ffd99d Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:20:14 +0000 Subject: [PATCH 100/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.8% (1008 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 76359a001..b35200ce3 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1127,7 +1127,7 @@ "deactivate_account_password_alert_message" = "For å fortsette, vennligst skriv inn passordet ditt"; "deactivate_account_forget_messages_information_part3" = ": dette vil føre til at fremtidige brukere ser en ufullstendig visning av samtaler)"; "deactivate_account_forget_messages_information_part1" = "Vennligst glem alle meldingene jeg har sendt når kontoen min er deaktivert ("; -"secure_key_backup_setup_intro_info" = "Beskytt deg mot å miste tilgang til krypterte meldinger og data ved å sikkerhetskopiere krypteringsnøkler på serveren din."; +"secure_key_backup_setup_intro_info" = "Beskytt deg mot å miste tilgang til krypterte meldinger og data ved å sikkerhetskopiere krypteringsnøkler til serveren din."; // MARK: Secure backup setup From bc2b60f79446214f8f6a44d6e80cbaa4d4b7d340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:22:03 +0000 Subject: [PATCH 101/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.9% (1009 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index b35200ce3..0587c8b25 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1136,3 +1136,4 @@ "secure_key_backup_setup_intro_title" = "Sikkert lagringsområde"; "secure_key_backup_setup_intro_use_security_key_info" = "Generer en sikkerhetsnøkkel for å lagre et trygt sted som en passordadministrator eller en safe."; "secure_key_backup_setup_intro_use_security_key_title" = "Bruk en sikkerhetsnøkkel"; +"secure_key_backup_setup_intro_use_security_passphrase_title" = "Bruk en passordfrase for sikkerhet"; From 5276e60c7d24f3806cb8ee48086768a8a4b26478 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:21:47 +0000 Subject: [PATCH 102/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.9% (1009 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 0587c8b25..fd8be8d77 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1134,6 +1134,6 @@ // Intro "secure_key_backup_setup_intro_title" = "Sikkert lagringsområde"; -"secure_key_backup_setup_intro_use_security_key_info" = "Generer en sikkerhetsnøkkel for å lagre et trygt sted som en passordadministrator eller en safe."; +"secure_key_backup_setup_intro_use_security_key_info" = "Generer en sikkerhetsnøkkel og lagre den på et trygt sted som i en passordadministrator eller en safe."; "secure_key_backup_setup_intro_use_security_key_title" = "Bruk en sikkerhetsnøkkel"; "secure_key_backup_setup_intro_use_security_passphrase_title" = "Bruk en passordfrase for sikkerhet"; From 0f75004e19145f1472e19d1185d2dca33b45a5fe Mon Sep 17 00:00:00 2001 From: jelv Date: Fri, 14 May 2021 05:50:05 +0000 Subject: [PATCH 103/393] Translated using Weblate (Dutch) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nl/ --- Riot/Assets/nl.lproj/Vector.strings | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Riot/Assets/nl.lproj/Vector.strings b/Riot/Assets/nl.lproj/Vector.strings index cb3d872ce..9efb88de9 100644 --- a/Riot/Assets/nl.lproj/Vector.strings +++ b/Riot/Assets/nl.lproj/Vector.strings @@ -1475,3 +1475,13 @@ // Chat "room_slide_to_end_group_call" = "Schuif om voor iedereen de oproep te beëindigen"; +"space_beta_announce_information" = "Spaces zijn de nieuwe manier om gesprekken en personen te groeperen. Dit is nog niet beschikbaar op iOS, maar u kunt ze nu gebruiken op Web en Desktop."; +"space_feature_unavailable_information" = "Spaces zijn de nieuwe manier om gesprekken en personen te groeperen. \n\nZe zijn binnenkort beschikbaar. U kan aan spaces deelnemen via andere platformen en die gesprekken worden dan hier beschikbaar."; +"space_beta_announce_subtitle" = "De nieuwe versie van gemeenschappen"; +"space_beta_announce_title" = "Spaces komen binnenkort"; +"space_beta_announce_badge" = "BETA"; +"space_feature_unavailable_subtitle" = "Spaces is nog niet beschikbaar op iOS, maar u kunt het nu al testen op Web en Desktop"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Spaces is nog niet klaar"; From 29238ecdbb30db1c482864118d80701295cfb94b Mon Sep 17 00:00:00 2001 From: libexus Date: Fri, 14 May 2021 17:06:24 +0000 Subject: [PATCH 104/393] Translated using Weblate (German) Currently translated at 99.0% (1205 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index e2f8ed08d..1aa4ccd1e 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -1333,3 +1333,31 @@ "room_accessibility_video_call" = "Videoanruf"; "room_message_replying_to" = "%@ anworten"; "room_message_editing" = "Bearbeitung"; +"space_beta_announce_information" = "Spaces are a new way to group rooms and people. Bald werden sie auch auf iOS verfügbar sein, bis dahin kannst du sie schon auf Element Web/Desktop testen."; +"space_feature_unavailable_information" = "Wir haben Spaces entwickelt, damit ihr eure vielen Räume besser organisieren könnt.\n\nBald werden sie auch auf iOS verfügbar sein, bis dahin kannst du sie schon auf Element Web/Desktop testen. Alle Räume die du dort betrittst, sind natürlich auch hier verfügbar."; +"space_beta_announce_subtitle" = "Die verbesserte Version von Communities"; +"space_beta_announce_title" = "Spaces sind bald verfügbar"; +"space_beta_announce_badge" = "Beta (in Entwicklung)"; +"space_feature_unavailable_subtitle" = "Spaces sind auf iOS noch nicht verfügbar. Du kannst sie aber schon auf Element Web oder Desktop ausprobieren"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Spaces sind noch in der Entwicklung und werden bald verfügbar sein"; +"event_formatter_group_call_incoming" = "%@ in %@"; +"event_formatter_group_call_leave" = "Verlassen"; +"event_formatter_group_call_join" = "Beitreten"; +"event_formatter_group_call" = "Gruppenanruf"; +"event_formatter_call_end_call" = "Anruf beenden"; +"event_formatter_call_retry" = "Erneut versuchen"; +"event_formatter_call_decline" = "Ablehnen"; +"event_formatter_call_connection_failed" = "Verbindung getrennt"; +"event_formatter_call_you_missed" = "Anruf verpasst"; +"event_formatter_call_ringing" = "Läuten…"; +"event_formatter_call_connecting" = "Verbinden…"; +"settings_labs_enable_ringing_for_group_calls" = "Bei Gruppenanrufen klingeln"; +"room_no_privileges_to_create_group_call" = "Du musst Admin oder Moderator sein, um einen Anruf zu starten."; +"room_join_group_call" = "Beitreten"; + +// Chat +"room_slide_to_end_group_call" = "Wische, um den Anruf für alle zu beenden"; +"callbar_only_single_active_group" = "Klicke, um den Anruf beizutreten"; From 23bed281a2ed3637e60313a7d2059ca2be6ebbfb Mon Sep 17 00:00:00 2001 From: Thibault Martin Date: Wed, 12 May 2021 12:40:55 +0000 Subject: [PATCH 105/393] Translated using Weblate (French) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/fr/ --- Riot/Assets/fr.lproj/Vector.strings | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Riot/Assets/fr.lproj/Vector.strings b/Riot/Assets/fr.lproj/Vector.strings index 0583b7f94..86d6fc97d 100644 --- a/Riot/Assets/fr.lproj/Vector.strings +++ b/Riot/Assets/fr.lproj/Vector.strings @@ -1389,3 +1389,13 @@ // Chat "room_slide_to_end_group_call" = "Faites glisser pour mettre fin à l’appel pour tout le monde"; "callbar_only_single_active_group" = "Appuyez pour rejoindre l’appel de groupe (%@)"; +"space_beta_announce_information" = "Les espaces sont une nouvelle manière de grouper les salons et les personnes. Ils ne sont pas pris en charge sur iOS pour l’instant, mais vous pouvez les utiliser dès à présent sur l’application web ou de bureau."; +"space_beta_announce_subtitle" = "Le futur des communautés"; +"space_beta_announce_title" = "Les espaces seront bientôt pris en charge"; +"space_beta_announce_badge" = "BÊTA"; +"space_feature_unavailable_information" = "Les espaces sont une nouvelle manière de grouper les salons et les personnes.\n\nIls seront bientôt pris en charge ici. Pour l’instant, si vous en rejoignez un depuis une autre plateforme, vous pourrez accéder à tous ses salons ici."; +"space_feature_unavailable_subtitle" = "Les espaces ne sont pas pris en charge sur iOS pour l’instant, mais vous pouvez les utiliser dès à présent sur l’application web ou de bureau"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Les espaces ne sont pas encore pris en charge"; From 5afd54ac25de3281a347d5103803ba889fac5b7a Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 13 May 2021 06:58:28 +0000 Subject: [PATCH 106/393] Translated using Weblate (Hungarian) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/ --- Riot/Assets/hu.lproj/Vector.strings | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Riot/Assets/hu.lproj/Vector.strings b/Riot/Assets/hu.lproj/Vector.strings index 7521dd6c4..efd08c573 100644 --- a/Riot/Assets/hu.lproj/Vector.strings +++ b/Riot/Assets/hu.lproj/Vector.strings @@ -1375,3 +1375,13 @@ // Chat "room_slide_to_end_group_call" = "Húzd el a hívás befejezéséhez mindenki számára"; "callbar_only_single_active_group" = "Koppints a csoporthívásba való belépéshez (%@)"; +"space_beta_announce_information" = "Terek az új lehetőség szobák és személyek csoportosítására. iOS-en még nem érhető el, de weben és asztali környezetben már használható."; +"space_beta_announce_subtitle" = "A közösségek új verziója"; +"space_beta_announce_title" = "Terek hamarosan"; +"space_beta_announce_badge" = "Béta"; +"space_feature_unavailable_information" = "Terek az új lehetőség a szobák és személyek csoportosítására.\n\nHamarosan érkezik. Egyenlőre, ha egy másik klienssel csatlakozol egyhez, minden ottani szobába be tudsz lépni."; +"space_feature_unavailable_subtitle" = "A Terek még nem működnek iOS rendszeren, de weben és asztali környezetben már használható"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "A Terek még nem érhetők el"; From 0d6ba3a1dd817627a2b00b0052cfbc3082687945 Mon Sep 17 00:00:00 2001 From: random Date: Thu, 13 May 2021 10:07:24 +0000 Subject: [PATCH 107/393] Translated using Weblate (Italian) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/ --- Riot/Assets/it.lproj/Vector.strings | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Riot/Assets/it.lproj/Vector.strings b/Riot/Assets/it.lproj/Vector.strings index 30daa86f2..e6e528a9f 100644 --- a/Riot/Assets/it.lproj/Vector.strings +++ b/Riot/Assets/it.lproj/Vector.strings @@ -1346,3 +1346,13 @@ // Chat "room_slide_to_end_group_call" = "Scorri per terminare la chiamata per tutti"; "callbar_only_single_active_group" = "Tocca per unirti alla chiamata di gruppo (%@)"; +"space_beta_announce_information" = "Gli spazi sono un nuovo modo di raggruppare stanze e persone. Non sono ancora arrivati su iOS, ma puoi usarli già da ora su Web e Desktop."; +"space_beta_announce_subtitle" = "La nuova versione delle comunità"; +"space_beta_announce_title" = "Gli spazi arriveranno presto"; +"space_beta_announce_badge" = "BETA"; +"space_feature_unavailable_information" = "Gli spazi sono un nuovo modo di raggruppare stanze e persone.\n\nArriveranno presto. Per ora, se entri in uno in un'altra piattaforma, potrai accedere a qualsiasi stanza in cui entri qui."; +"space_feature_unavailable_subtitle" = "Gli spazi non sono ancora arrivati su iOS, ma puoi usarli già da ora su Web e Desktop"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Gli spazi non sono ancora pronti"; From 16c91cf181308b8366982652e6d61a5c4524b38d Mon Sep 17 00:00:00 2001 From: Bartosz Date: Thu, 13 May 2021 07:43:12 +0000 Subject: [PATCH 108/393] Translated using Weblate (Polish) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pl/ --- Riot/Assets/pl.lproj/Vector.strings | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Riot/Assets/pl.lproj/Vector.strings b/Riot/Assets/pl.lproj/Vector.strings index c174a2c1f..9e57955c2 100644 --- a/Riot/Assets/pl.lproj/Vector.strings +++ b/Riot/Assets/pl.lproj/Vector.strings @@ -1440,3 +1440,13 @@ // Chat "room_slide_to_end_group_call" = "Przesuń, aby zakończyć połączenie dla wszystkich"; "callbar_only_single_active_group" = "Dotknij, aby powrócić do rozmowy grupowej (%@)"; +"space_beta_announce_title" = "Przestrzenie wkrótce się pojawią"; +"space_feature_unavailable_information" = "Przestrzenie to nowy sposób na grupowanie pokoi i osób.\n\nNiedługo tu będą. Na razie, jeśli dołączysz do jakiejś na innej platformie to będziesz mieć dostęp do wszystkich pokoi, do których dołączysz tutaj."; +"space_feature_unavailable_subtitle" = "Przestrzenie nie są jeszcze obsługiwane w kliencie iOS ale możesz z nich już korzystać w przeglądarce i na komputerze"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Przestrzenie nie są jeszcze obsługiwane"; +"space_beta_announce_information" = "Przestrzenie to nowy sposób na grupowanie pokoi i osób. Nie ma ich jeszcze na iOS ale możesz ich teraz używać w przeglądarce i na komputerze."; +"space_beta_announce_subtitle" = "Nowa wersja społeczności"; +"space_beta_announce_badge" = "BETA"; From f12bc107277866a602a47c6d793cb0963015d134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Fri, 14 May 2021 06:26:04 +0000 Subject: [PATCH 109/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 83.7% (1019 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index fd8be8d77..44e939fdb 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1137,3 +1137,20 @@ "secure_key_backup_setup_intro_use_security_key_info" = "Generer en sikkerhetsnøkkel og lagre den på et trygt sted som i en passordadministrator eller en safe."; "secure_key_backup_setup_intro_use_security_key_title" = "Bruk en sikkerhetsnøkkel"; "secure_key_backup_setup_intro_use_security_passphrase_title" = "Bruk en passordfrase for sikkerhet"; +"key_backup_setup_intro_manual_export_action" = "Eksporter nøkler manuelt"; +"key_backup_setup_intro_setup_connect_action_with_existing_backup" = "Koble denne enheten til sikkerhetskopi av meldingsnøkler"; +"key_backup_setup_skip_alert_message" = "Du kan miste sikre meldinger hvis du logger av eller mister enheten."; + + +// MARK: Key backup setup + +"key_backup_setup_title" = "Sikkerhetskopi av meldingsnøkler"; +"secure_backup_setup_banner_subtitle" = "Beskytt deg mot å miste tilgang til krypterte meldinger og data"; + +// Banner + +"secure_backup_setup_banner_title" = "Sikkert lagringsområde"; +"secure_key_backup_setup_cancel_alert_message" = "Hvis du avbryter nå, kan du miste krypterte meldinger og data hvis du mister tilgangen til påloggingene dine.\n\nDu kan også konfigurere sikkert lagringsområde og administrere nøklene dine i innstillinger."; +"secure_key_backup_setup_existing_backup_error_info" = "Lås den opp for å gjenbruke den på sikkert lagringsområde, eller slett den for å opprette en ny sikkerhetskopi av meldinger på sikkert lagringsområde."; +"secure_key_backup_setup_existing_backup_error_title" = "Det finnes allerede en sikkerhetskopi for meldinger"; +"secure_key_backup_setup_intro_use_security_passphrase_info" = "Skriv inn en hemmelig frase bare du vet, og generer en nøkkel for sikkerhetskopiering."; From c3b86ef652594f406a809b86f4cbe654f9992358 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Fri, 14 May 2021 06:22:14 +0000 Subject: [PATCH 110/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 83.7% (1019 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 44e939fdb..c09d93db3 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1136,7 +1136,7 @@ "secure_key_backup_setup_intro_title" = "Sikkert lagringsområde"; "secure_key_backup_setup_intro_use_security_key_info" = "Generer en sikkerhetsnøkkel og lagre den på et trygt sted som i en passordadministrator eller en safe."; "secure_key_backup_setup_intro_use_security_key_title" = "Bruk en sikkerhetsnøkkel"; -"secure_key_backup_setup_intro_use_security_passphrase_title" = "Bruk en passordfrase for sikkerhet"; +"secure_key_backup_setup_intro_use_security_passphrase_title" = "Bruk en passordfrase"; "key_backup_setup_intro_manual_export_action" = "Eksporter nøkler manuelt"; "key_backup_setup_intro_setup_connect_action_with_existing_backup" = "Koble denne enheten til sikkerhetskopi av meldingsnøkler"; "key_backup_setup_skip_alert_message" = "Du kan miste sikre meldinger hvis du logger av eller mister enheten."; From 2e8a3ff8322c36d43e42ad4e5ae22ae6dc9c22c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 12 May 2021 15:32:06 +0000 Subject: [PATCH 111/393] Translated using Weblate (Estonian) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/ --- Riot/Assets/et.lproj/Vector.strings | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Riot/Assets/et.lproj/Vector.strings b/Riot/Assets/et.lproj/Vector.strings index e02bf3a7c..3d884c119 100644 --- a/Riot/Assets/et.lproj/Vector.strings +++ b/Riot/Assets/et.lproj/Vector.strings @@ -1312,3 +1312,13 @@ // Chat "room_slide_to_end_group_call" = "Viipa kõne lõpetamiseks kõigi jaoks"; "callbar_only_single_active_group" = "Rühmakõnega liitumiseks puuduta (%@)"; +"space_beta_announce_information" = "Kogukonnakeskused on uus viis inimeste ja jututubade sidumiseks. Neid veel ei saa iOS'is kasutada, kuid nad on olemas Element'i veebirakenduses ja töölauarakenduses."; +"space_beta_announce_subtitle" = "Uus versioon senistest kogukondadest"; +"space_beta_announce_title" = "Kogukonnakeskused saavad varsti olema ka siin"; +"space_beta_announce_badge" = "BEETA"; +"space_feature_unavailable_information" = "Kogukonnakeskused on uus viis inimeste ja jututubade sidumiseks.\n\nNad saavad varsti olema kasutusel ka siin keskkonnas. Kui praegu liitud mõne kogukonnakeskusega mõnes muus keskkonnas, siis pääsed ligi kõikidele seotud jututubadele ka siin."; +"space_feature_unavailable_subtitle" = "Kogukonnakeskuseid ei saa iOS'is kasutada, kuid nad on olemas Element'i veebirakenduses ja töölauarakenduses"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Kogukonnakeskuseid ei saa veel siin rakenduses kasutada"; From 9bbe6e17285392c3d23ef66cc3de7afcc0be7cb9 Mon Sep 17 00:00:00 2001 From: zer0-x <1rn0kmrwo@relay.firefox.com> Date: Wed, 12 May 2021 22:47:59 +0000 Subject: [PATCH 112/393] Translated using Weblate (Arabic) Currently translated at 11.8% (144 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ar/ --- Riot/Assets/ar.lproj/Vector.strings | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Riot/Assets/ar.lproj/Vector.strings b/Riot/Assets/ar.lproj/Vector.strings index 741e834b1..b803dac65 100644 --- a/Riot/Assets/ar.lproj/Vector.strings +++ b/Riot/Assets/ar.lproj/Vector.strings @@ -144,3 +144,24 @@ "auth_softlogout_clear_data_message_1" = "تَحذير: بَيَانَاتُكَ الشَّخصِيَّة (بِمَا فِي ذَلِكَ مَفاتيحُ التَّعمِيَة) لَا تَزَالُ مُخَزَنَةً عَلَى هَذَا الجِّهاز."; "auth_softlogout_clear_data" = "مَحوُ البَيَانَاتِ الشَّخصِيَّة"; "auth_softlogout_recover_encryption_keys" = "سَجَّل الدُّخُول لِاِستِعادَة مَفاتيح التَّعمِيَة المُخَزَّنَة حَصرِيًّا عَلَى هَذَا الجِّهاز. أنتَ بِحاجةٍ لَهُم لِقِراءةِ جَمِيعِ رَسائِلكَ الآمِنَة عَلَى أيِّ جِهاز."; +"room_creation_make_private" = "جَعلَها خَاصَّة"; +"room_creation_keep_private" = "إبقَائَها خَاصَّة"; +"room_creation_make_public_prompt_msg" = "هَل أنتَ مُتَأكِّدٌ أنَّكَ تُريدُ جَعلَ هَذِهِ المُحادَثَةَ عَامَّة؟ يُمكِنُ لَأيِّ شَخصٍ قِراءَةَ رَسائِلكِ وَالاِنضِمامِ إلَى المُحادَثَة."; +"room_creation_make_public_prompt_title" = "جَعلَ هَذِهِ المُحادَثَةَ عَامَّة؟"; +"room_creation_make_public" = "جَعلَها عَامَّة"; +"room_creation_public_room" = "هَذِهِ المُحادَثَةُ عَامَّة"; +"room_creation_private_room" = "هَذِهِ المُحادَثَةُ خَاصَّة"; +"room_creation_appearance_picture" = "صُوَرةُ المُحادَثَة (اِختياري)"; + +// Errors +"error_user_already_logged_in" = "يَبدُو أنَّكَ تُحاوِلُ الاِتِصَالَ بِخَادِمٍ رَئيسٍ آخَر. هَل تُرِيدُ تَسجيلَ الخُرُوج؟"; +"social_login_button_title_sign_up" = "الاِشتِراك بِوَاسِطَةِ %@"; +"social_login_button_title_sign_in" = "تَسجيلُ الدُّخُولِ بِوَسِطَةِ %@"; +"social_login_button_title_continue" = "الاِستِمرار مَع %@"; +"social_login_list_title_sign_up" = "أَو"; +"social_login_list_title_sign_in" = "أَو"; + +// Social login + +"social_login_list_title_continue" = "الاِستِمرار مَع"; +"auth_softlogout_clear_data_sign_out_msg" = "هَل أنتَ مُتأكِّدٌ أنَّكَ تُرِيدُ مَحوَ كَافَّةِ البَيَانَاتِ المُخَزَنَةِ حَاليًّا عَلَى هَذَا الجِهَاز؟ سَجِّل الدُّخُولَ مَرَةً أُخرَى لِلوصُولِ إلَى بَيَانَاتِ حِسَابِك وَرَسَائِلك."; From 86427762a30271449e5e30a70d38d1dd6dff3ba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:01:46 +0000 Subject: [PATCH 113/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 84.1% (1023 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c09d93db3..ade32df3a 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -882,7 +882,7 @@ //"settings_join_leave_rooms" = "When people join or leave rooms"; //"settings_call_invitations" = "Call invitations"; -"settings_enable_callkit" = "Integrerte anrop"; +"settings_enable_callkit" = "Integrert/Innebygd anrop"; "settings_calls_stun_server_fallback_button" = "Tillat bruk av STUN støtteserver ved anrop"; "settings_calls_stun_server_fallback_description" = "Tillat bruk av %@ STUN støtteserver ved anrop, når din hovedserver ikke tilbyr dette (din IP adresse vil bli delt under samtalen)."; "settings_integrations_allow_description" = "Bruk integrasjonsadministrator (%@) for å administrere bots, bridges, widgets og sticker packs.\n\nIntegrasjonsadministrator mottar konfigurasjonsdata, og kan endre widgets, sende rominvitasjoner og sette tilgangsnivåer på dine vegne."; @@ -1154,3 +1154,10 @@ "secure_key_backup_setup_existing_backup_error_info" = "Lås den opp for å gjenbruke den på sikkert lagringsområde, eller slett den for å opprette en ny sikkerhetskopi av meldinger på sikkert lagringsområde."; "secure_key_backup_setup_existing_backup_error_title" = "Det finnes allerede en sikkerhetskopi for meldinger"; "secure_key_backup_setup_intro_use_security_passphrase_info" = "Skriv inn en hemmelig frase bare du vet, og generer en nøkkel for sikkerhetskopiering."; +"key_backup_setup_passphrase_setup_recovery_key_info" = "Eller sikre sikkerhetskopien din med en gjenopprettingsnøkkel, og lagre den et trygt sted."; +"key_backup_setup_passphrase_info" = "Vi lagrer en kryptert kopi av nøklene dine på serveren vår. Beskytt sikkerhetskopien din med en passordfrase for å holde den sikker.\n\nFor maksimal sikkerhet bør dette være forskjellig fra kontopassordet ditt."; + +// Passphrase + +"key_backup_setup_passphrase_title" = "Gjør sikkerhetskopien din sikker med en passordfrase"; +"key_backup_setup_intro_info" = "Meldinger i krypterte rom er sikret med ende-til-ende-kryptering. Bare du og mottakeren(e) har nøklene til å lese disse meldingene.\n\nLagre nøklene dine på et trygt sted for å unngå å miste dem."; From 47090540c63337476a62913d90caa32c20ce7ec7 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:00:38 +0000 Subject: [PATCH 114/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 84.1% (1023 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index ade32df3a..c6e2d23dc 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1139,7 +1139,7 @@ "secure_key_backup_setup_intro_use_security_passphrase_title" = "Bruk en passordfrase"; "key_backup_setup_intro_manual_export_action" = "Eksporter nøkler manuelt"; "key_backup_setup_intro_setup_connect_action_with_existing_backup" = "Koble denne enheten til sikkerhetskopi av meldingsnøkler"; -"key_backup_setup_skip_alert_message" = "Du kan miste sikre meldinger hvis du logger av eller mister enheten."; +"key_backup_setup_skip_alert_message" = "Du kan miste dine krypterte meldinger dersom du logger ut eller mister enheten."; // MARK: Key backup setup From 190aeae3699e3c73be2325cdad47a76f6b0a66e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:03:01 +0000 Subject: [PATCH 115/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 84.5% (1028 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c6e2d23dc..9269223de 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1161,3 +1161,15 @@ "key_backup_setup_passphrase_title" = "Gjør sikkerhetskopien din sikker med en passordfrase"; "key_backup_setup_intro_info" = "Meldinger i krypterte rom er sikret med ende-til-ende-kryptering. Bare du og mottakeren(e) har nøklene til å lese disse meldingene.\n\nLagre nøklene dine på et trygt sted for å unngå å miste dem."; + +// MARK: Key backup recover + +"key_backup_recover_title" = "Sikre meldingene"; + +// Success from recovery key +"key_backup_setup_success_from_recovery_key_info" = "Nøklene dine blir sikkerhetskopiert.\n\nKopier denne gjenopprettingsnøkkelen og lagre den på et trygt sted."; +"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Lagre gjenopprettingsnøkkel"; + +// Success from passphrase +"key_backup_setup_success_from_passphrase_info" = "Nøklene dine blir sikkerhetskopiert.\n\nGjenopprettingsnøkkelen din er et sikkerhetsnett - du kan bruke den til å gjenopprette tilgangen til de krypterte meldingene dine hvis du glemmer passordfrasen.\n\nLagre gjenopprettingsnøkkelen din på en trygg måte, f.eks. ved hjelp av en passordadministrator (eller i en safe)."; +"key_backup_setup_passphrase_setup_recovery_key_action" = "(Avansert) Sett opp med gjenopprettingsnøkkel"; From 6c703900c03fc0316d46d832dc08cb4ad434862d Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:01:53 +0000 Subject: [PATCH 116/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 84.5% (1028 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 9269223de..49c9fcdc5 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1154,7 +1154,7 @@ "secure_key_backup_setup_existing_backup_error_info" = "Lås den opp for å gjenbruke den på sikkert lagringsområde, eller slett den for å opprette en ny sikkerhetskopi av meldinger på sikkert lagringsområde."; "secure_key_backup_setup_existing_backup_error_title" = "Det finnes allerede en sikkerhetskopi for meldinger"; "secure_key_backup_setup_intro_use_security_passphrase_info" = "Skriv inn en hemmelig frase bare du vet, og generer en nøkkel for sikkerhetskopiering."; -"key_backup_setup_passphrase_setup_recovery_key_info" = "Eller sikre sikkerhetskopien din med en gjenopprettingsnøkkel, og lagre den et trygt sted."; +"key_backup_setup_passphrase_setup_recovery_key_info" = "Eller sikre sikkerhetskopien din med en gjenopprettingsnøkkel, og lagre den på et trygt sted."; "key_backup_setup_passphrase_info" = "Vi lagrer en kryptert kopi av nøklene dine på serveren vår. Beskytt sikkerhetskopien din med en passordfrase for å holde den sikker.\n\nFor maksimal sikkerhet bør dette være forskjellig fra kontopassordet ditt."; // Passphrase From 0bb1098be21a83d27578e621ad758d7d22306539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:03:35 +0000 Subject: [PATCH 117/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 84.7% (1030 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 49c9fcdc5..c1abd0010 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1173,3 +1173,5 @@ // Success from passphrase "key_backup_setup_success_from_passphrase_info" = "Nøklene dine blir sikkerhetskopiert.\n\nGjenopprettingsnøkkelen din er et sikkerhetsnett - du kan bruke den til å gjenopprette tilgangen til de krypterte meldingene dine hvis du glemmer passordfrasen.\n\nLagre gjenopprettingsnøkkelen din på en trygg måte, f.eks. ved hjelp av en passordadministrator (eller i en safe)."; "key_backup_setup_passphrase_setup_recovery_key_action" = "(Avansert) Sett opp med gjenopprettingsnøkkel"; +"key_backup_recover_invalid_passphrase" = "Sikkerhetskopiering kunne ikke dekrypteres med denne passordfrasen: Vennligst sjekk at du har angitt riktig passordfrase."; +"key_backup_recover_invalid_passphrase_title" = "Feil gjenopprettingsfrase"; From f9c3f02e62791e8eeefb7655a52c49750ea81bb9 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:03:21 +0000 Subject: [PATCH 118/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 84.7% (1030 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c1abd0010..4ddd04301 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1164,7 +1164,7 @@ // MARK: Key backup recover -"key_backup_recover_title" = "Sikre meldingene"; +"key_backup_recover_title" = "Krypterte meldinger"; // Success from recovery key "key_backup_setup_success_from_recovery_key_info" = "Nøklene dine blir sikkerhetskopiert.\n\nKopier denne gjenopprettingsnøkkelen og lagre den på et trygt sted."; From c286d867a1f86241c6ca5dfbd62953a681c6a135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:04:03 +0000 Subject: [PATCH 119/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 84.8% (1032 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 4ddd04301..b2772fe7e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1175,3 +1175,5 @@ "key_backup_setup_passphrase_setup_recovery_key_action" = "(Avansert) Sett opp med gjenopprettingsnøkkel"; "key_backup_recover_invalid_passphrase" = "Sikkerhetskopiering kunne ikke dekrypteres med denne passordfrasen: Vennligst sjekk at du har angitt riktig passordfrase."; "key_backup_recover_invalid_passphrase_title" = "Feil gjenopprettingsfrase"; +"key_backup_recover_invalid_recovery_key" = "Sikkerhetskopiering kunne ikke dekrypteres med denne nøkkelen: bekreft at du skrev inn riktig gjenopprettingsnøkkel."; +"key_backup_recover_invalid_recovery_key_title" = "Feil i gjenopprettingsnøkkel"; From 5c7daba4a2bc5c67ab8689d5c8957fe107f4eda9 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:03:50 +0000 Subject: [PATCH 120/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 84.8% (1032 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index b2772fe7e..6ecb64b6c 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1173,7 +1173,7 @@ // Success from passphrase "key_backup_setup_success_from_passphrase_info" = "Nøklene dine blir sikkerhetskopiert.\n\nGjenopprettingsnøkkelen din er et sikkerhetsnett - du kan bruke den til å gjenopprette tilgangen til de krypterte meldingene dine hvis du glemmer passordfrasen.\n\nLagre gjenopprettingsnøkkelen din på en trygg måte, f.eks. ved hjelp av en passordadministrator (eller i en safe)."; "key_backup_setup_passphrase_setup_recovery_key_action" = "(Avansert) Sett opp med gjenopprettingsnøkkel"; -"key_backup_recover_invalid_passphrase" = "Sikkerhetskopiering kunne ikke dekrypteres med denne passordfrasen: Vennligst sjekk at du har angitt riktig passordfrase."; +"key_backup_recover_invalid_passphrase" = "Sikkerhetskopi kunne ikke dekrypteres med denne passordfrasen: Vennligst sjekk at du har angitt riktig passordfrase."; "key_backup_recover_invalid_passphrase_title" = "Feil gjenopprettingsfrase"; "key_backup_recover_invalid_recovery_key" = "Sikkerhetskopiering kunne ikke dekrypteres med denne nøkkelen: bekreft at du skrev inn riktig gjenopprettingsnøkkel."; "key_backup_recover_invalid_recovery_key_title" = "Feil i gjenopprettingsnøkkel"; From cc9dd29f841653eae071a5faa67b39d42b245c14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:04:43 +0000 Subject: [PATCH 121/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 85.0% (1034 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 6ecb64b6c..4601b204c 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1177,3 +1177,10 @@ "key_backup_recover_invalid_passphrase_title" = "Feil gjenopprettingsfrase"; "key_backup_recover_invalid_recovery_key" = "Sikkerhetskopiering kunne ikke dekrypteres med denne nøkkelen: bekreft at du skrev inn riktig gjenopprettingsnøkkel."; "key_backup_recover_invalid_recovery_key_title" = "Feil i gjenopprettingsnøkkel"; + +// Recover from passphrase + +"key_backup_recover_from_passphrase_info" = "Bruk gjenopprettingspassordet for å låse opp historikken for sikre meldinger"; + +// Recover from private key +"key_backup_recover_from_private_key_info" = "Gjenoppretter sikkerhetskopi …"; From d526cf3883419d95c638bc620430d0cdea6a5683 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:04:19 +0000 Subject: [PATCH 122/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 85.0% (1034 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 4601b204c..6da20c06b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1175,7 +1175,7 @@ "key_backup_setup_passphrase_setup_recovery_key_action" = "(Avansert) Sett opp med gjenopprettingsnøkkel"; "key_backup_recover_invalid_passphrase" = "Sikkerhetskopi kunne ikke dekrypteres med denne passordfrasen: Vennligst sjekk at du har angitt riktig passordfrase."; "key_backup_recover_invalid_passphrase_title" = "Feil gjenopprettingsfrase"; -"key_backup_recover_invalid_recovery_key" = "Sikkerhetskopiering kunne ikke dekrypteres med denne nøkkelen: bekreft at du skrev inn riktig gjenopprettingsnøkkel."; +"key_backup_recover_invalid_recovery_key" = "Sikkerhetskopi kunne ikke dekrypteres med denne nøkkelen: bekreft at du skrev inn riktig gjenopprettingsnøkkel."; "key_backup_recover_invalid_recovery_key_title" = "Feil i gjenopprettingsnøkkel"; // Recover from passphrase From a4a1b53d5c93c0dd27610de0306264963bea135b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:05:28 +0000 Subject: [PATCH 123/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 85.2% (1037 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 6da20c06b..665021835 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1184,3 +1184,6 @@ // Recover from private key "key_backup_recover_from_private_key_info" = "Gjenoppretter sikkerhetskopi …"; +"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Kjenner du ikke gjenopprettingspassordet ditt? Du kan "; +"key_backup_recover_from_passphrase_recover_action" = "Lås opp historikk"; +"key_backup_recover_from_passphrase_passphrase_placeholder" = "Skriv inn passordfrase"; From b9871dd306ca39fb10ef0e983872546bfdebc5e9 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:05:06 +0000 Subject: [PATCH 124/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 85.2% (1037 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 665021835..439bb4223 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1180,7 +1180,7 @@ // Recover from passphrase -"key_backup_recover_from_passphrase_info" = "Bruk gjenopprettingspassordet for å låse opp historikken for sikre meldinger"; +"key_backup_recover_from_passphrase_info" = "Bruk gjenopprettingspassordet for å låse opp historikken for dine sikrede meldinger"; // Recover from private key "key_backup_recover_from_private_key_info" = "Gjenoppretter sikkerhetskopi …"; From 888be236bcb9a63dcc5c996553d3327b2e4d2293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:06:17 +0000 Subject: [PATCH 125/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 85.4% (1039 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 439bb4223..9914d6b3a 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1187,3 +1187,8 @@ "key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Kjenner du ikke gjenopprettingspassordet ditt? Du kan "; "key_backup_recover_from_passphrase_recover_action" = "Lås opp historikk"; "key_backup_recover_from_passphrase_passphrase_placeholder" = "Skriv inn passordfrase"; + +// Recover from recovery key + +"key_backup_recover_from_recovery_key_info" = "Bruk gjenopprettingsnøkkel for å låse opp historikken for sikre meldinger"; +"key_backup_recover_from_passphrase_lost_passphrase_action_part3" = "."; From 35e5f1dbea01547fdfd50ce17f7eba5330b8fe7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:07:18 +0000 Subject: [PATCH 126/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 85.8% (1044 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 9914d6b3a..68244ee1d 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -850,7 +850,7 @@ // MARK: Sign out warning -"sign_out_existing_key_backup_alert_title" = "Er du sikker på at du vil logge av?"; +"sign_out_existing_key_backup_alert_title" = "Er du sikker på at du vil logge ut?"; "service_terms_modal_message_identity_server" = "Godta brukervilkårene til identitetsserveren (%@) for å finne kontakter."; "event_formatter_call_back" = "Ring tilbake"; "room_details_advanced_e2e_encryption_disabled" = "Kryptering er ikke aktivert i dette rommet."; @@ -1192,3 +1192,11 @@ "key_backup_recover_from_recovery_key_info" = "Bruk gjenopprettingsnøkkel for å låse opp historikken for sikre meldinger"; "key_backup_recover_from_passphrase_lost_passphrase_action_part3" = "."; +"sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "Begynn å bruke Sikkert lagringsområde"; +"sign_out_non_existing_key_backup_alert_title" = "Du mister tilgangen til de krypterte meldingene dine hvis du logger ut nå"; + +// Success + +"key_backup_recover_success_info" = "Sikkerhetskopi gjenopprettet!"; +"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Mistet gjenopprettingsnøkkelen din? Du kan sette opp en ny i innstillingene."; +"key_backup_recover_from_recovery_key_recover_action" = "Lås opp historikk"; From 8f5713a4b8af80f82d7337b4e370e3ae2435a46a Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:06:25 +0000 Subject: [PATCH 127/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 85.8% (1044 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 68244ee1d..5ad4a7350 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1190,7 +1190,7 @@ // Recover from recovery key -"key_backup_recover_from_recovery_key_info" = "Bruk gjenopprettingsnøkkel for å låse opp historikken for sikre meldinger"; +"key_backup_recover_from_recovery_key_info" = "Bruk gjenopprettingsnøkkel for å låse opp historikken for sikrede meldinger"; "key_backup_recover_from_passphrase_lost_passphrase_action_part3" = "."; "sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "Begynn å bruke Sikkert lagringsområde"; "sign_out_non_existing_key_backup_alert_title" = "Du mister tilgangen til de krypterte meldingene dine hvis du logger ut nå"; From a4a5b87584644303b9b175e6e9eb83bb9e2182c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:08:10 +0000 Subject: [PATCH 128/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 86.2% (1049 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 5ad4a7350..79aef23e5 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1200,3 +1200,8 @@ "key_backup_recover_success_info" = "Sikkerhetskopi gjenopprettet!"; "key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Mistet gjenopprettingsnøkkelen din? Du kan sette opp en ny i innstillingene."; "key_backup_recover_from_recovery_key_recover_action" = "Lås opp historikk"; +"sign_out_key_backup_in_progress_alert_title" = "Sikkerhetskopiering av nøkler pågår. Hvis du logger av nå, mister du tilgangen til de krypterte meldingene dine."; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_backup_action" = "Sikkerhetskopier"; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_message" = "Du vil miste tilgangen til de krypterte meldingene dine med mindre du sikkerhetskopierer nøklene dine før du logger ut."; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_title" = "Du vil miste de krypterte meldingene dine"; +"sign_out_non_existing_key_backup_alert_discard_key_backup_action" = "Jeg vil ikke ha de krypterte meldingene mine"; From b6e991b5cad14c2f8069abfd10cb218a67001e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:08:51 +0000 Subject: [PATCH 129/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 86.5% (1052 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 79aef23e5..dc7461bb0 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -846,7 +846,7 @@ "favourites_empty_view_title" = "Favorittrom og personer"; "create_room_placeholder_address" = "#testrom: matrix.org"; "device_verification_emoji_santa" = "Julenisse"; -"device_verification_security_advice_emoji" = "Sammenlign de unike emojiene, og sjekk at de vises i samme rekkefølge."; +"device_verification_security_advice_emoji" = "Sammenlign de unike emojiene og sjekk at de vises i samme rekkefølge."; // MARK: Sign out warning @@ -1205,3 +1205,6 @@ "sign_out_non_existing_key_backup_sign_out_confirmation_alert_message" = "Du vil miste tilgangen til de krypterte meldingene dine med mindre du sikkerhetskopierer nøklene dine før du logger ut."; "sign_out_non_existing_key_backup_sign_out_confirmation_alert_title" = "Du vil miste de krypterte meldingene dine"; "sign_out_non_existing_key_backup_alert_discard_key_backup_action" = "Jeg vil ikke ha de krypterte meldingene mine"; +"key_verification_new_session_title" = "Bekreft den nye økten"; +"sign_out_key_backup_in_progress_alert_cancel_action" = "Jeg vil vente"; +"sign_out_key_backup_in_progress_alert_discard_key_backup_action" = "Jeg vil ikke ha de krypterte meldingene mine"; From c9908b55df0048285d84b4c3ad2b3bdb95d6c9ce Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:08:20 +0000 Subject: [PATCH 130/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 86.5% (1052 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index dc7461bb0..5ae04ffbb 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1200,7 +1200,7 @@ "key_backup_recover_success_info" = "Sikkerhetskopi gjenopprettet!"; "key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Mistet gjenopprettingsnøkkelen din? Du kan sette opp en ny i innstillingene."; "key_backup_recover_from_recovery_key_recover_action" = "Lås opp historikk"; -"sign_out_key_backup_in_progress_alert_title" = "Sikkerhetskopiering av nøkler pågår. Hvis du logger av nå, mister du tilgangen til de krypterte meldingene dine."; +"sign_out_key_backup_in_progress_alert_title" = "Sikkerhetskopiering av nøkler pågår. Hvis du logger ut nå, mister du tilgangen til de krypterte meldingene dine."; "sign_out_non_existing_key_backup_sign_out_confirmation_alert_backup_action" = "Sikkerhetskopier"; "sign_out_non_existing_key_backup_sign_out_confirmation_alert_message" = "Du vil miste tilgangen til de krypterte meldingene dine med mindre du sikkerhetskopierer nøklene dine før du logger ut."; "sign_out_non_existing_key_backup_sign_out_confirmation_alert_title" = "Du vil miste de krypterte meldingene dine"; From ab930eff7c2e0d4ee0ce9c5e3eb037d049de039e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:09:35 +0000 Subject: [PATCH 131/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 86.7% (1055 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 5ae04ffbb..c2ade72c5 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1208,3 +1208,6 @@ "key_verification_new_session_title" = "Bekreft den nye økten"; "sign_out_key_backup_in_progress_alert_cancel_action" = "Jeg vil vente"; "sign_out_key_backup_in_progress_alert_discard_key_backup_action" = "Jeg vil ikke ha de krypterte meldingene mine"; +"device_verification_error_cannot_load_device" = "Kan ikke laste informasjon for økten."; +"device_verification_cancelled_by_me" = "Bekreftelsen er kansellert. Årsak: %@"; +"device_verification_security_advice_number" = "Sammenlign tallene og sjekk at de vises i samme rekkefølge."; From 8e2718d67c6b6d3ad410deaf42308c3f63ad2a11 Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Tue, 18 May 2021 13:09:13 +0000 Subject: [PATCH 132/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 86.7% (1055 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c2ade72c5..c3e3508ad 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -872,7 +872,7 @@ "security_settings_crypto_sessions_loading" = "Laster økter…"; "settings_discovery_no_identity_server" = "Du bruker for øyeblikket ikke en identitetsserver. Legg til en for at dine eksisterende kontakter skal kunne finne deg."; "settings_unignore_user" = "Vis alle meldinger fra %@?"; -"device_verification_cancelled" = "Den andre parten kansellerte bekreftelsen."; +"device_verification_cancelled" = "Den andre parten avbrøt verifiseringen."; "settings_callkit_info" = "Motta innkommende samtale på låst skjerm. Se dine anrop i systemets anropshistorikk. Hvis iCloud er aktivert, vil anropshistorikken blir delt med Apple."; //"settings_enable_all_notif" = "Enable all notifications"; //"settings_messages_my_display_name" = "Msg containing my display name"; From ad83692f1aaa38536a0e3f621631114bf4399e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:09:49 +0000 Subject: [PATCH 133/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 86.8% (1056 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c3e3508ad..463acca97 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1211,3 +1211,6 @@ "device_verification_error_cannot_load_device" = "Kan ikke laste informasjon for økten."; "device_verification_cancelled_by_me" = "Bekreftelsen er kansellert. Årsak: %@"; "device_verification_security_advice_number" = "Sammenlign tallene og sjekk at de vises i samme rekkefølge."; + +// Mark: Incoming +"device_verification_incoming_title" = "Innkommende verifikasjonsforespørsel"; From b00a1284e3ec603d758e76ecfeaa1c4ad4d8c04d Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:09:42 +0000 Subject: [PATCH 134/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 86.8% (1056 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 463acca97..f36af940f 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1208,7 +1208,7 @@ "key_verification_new_session_title" = "Bekreft den nye økten"; "sign_out_key_backup_in_progress_alert_cancel_action" = "Jeg vil vente"; "sign_out_key_backup_in_progress_alert_discard_key_backup_action" = "Jeg vil ikke ha de krypterte meldingene mine"; -"device_verification_error_cannot_load_device" = "Kan ikke laste informasjon for økten."; +"device_verification_error_cannot_load_device" = "Kan ikke laste informasjon om økten."; "device_verification_cancelled_by_me" = "Bekreftelsen er kansellert. Årsak: %@"; "device_verification_security_advice_number" = "Sammenlign tallene og sjekk at de vises i samme rekkefølge."; From 4b0191407ed7599ec822ea5dbeaf338999010ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:10:08 +0000 Subject: [PATCH 135/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 86.9% (1057 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index f36af940f..7bc3978ad 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1214,3 +1214,4 @@ // Mark: Incoming "device_verification_incoming_title" = "Innkommende verifikasjonsforespørsel"; +"device_verification_incoming_description_1" = "Verifiser denne økten for å merke den som klarert. Verifisering av økter fra partnere gir deg ekstra trygghet når du bruker ende-til-ende-krypterte meldinger."; From b011029716bd10bd7a3b373d268c8108a3c3fc3f Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:10:03 +0000 Subject: [PATCH 136/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 86.9% (1057 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 7bc3978ad..d4adbe622 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1213,5 +1213,5 @@ "device_verification_security_advice_number" = "Sammenlign tallene og sjekk at de vises i samme rekkefølge."; // Mark: Incoming -"device_verification_incoming_title" = "Innkommende verifikasjonsforespørsel"; +"device_verification_incoming_title" = "Innkommende bekreftelsesforespørsel"; "device_verification_incoming_description_1" = "Verifiser denne økten for å merke den som klarert. Verifisering av økter fra partnere gir deg ekstra trygghet når du bruker ende-til-ende-krypterte meldinger."; From 86d9612cc0c0ae805aba997c1bb40f8c6308e2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:10:33 +0000 Subject: [PATCH 137/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.0% (1058 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index d4adbe622..b1b572129 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1215,3 +1215,4 @@ // Mark: Incoming "device_verification_incoming_title" = "Innkommende bekreftelsesforespørsel"; "device_verification_incoming_description_1" = "Verifiser denne økten for å merke den som klarert. Verifisering av økter fra partnere gir deg ekstra trygghet når du bruker ende-til-ende-krypterte meldinger."; +"device_verification_incoming_description_2" = "Verifisering av denne økten vil markere den som klarert, og også merke økten din som verifisert for partneren."; From 0b30e5e248489539793bd4e636560b12beea2b12 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:10:28 +0000 Subject: [PATCH 138/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.0% (1058 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index b1b572129..2d1bbade2 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1214,5 +1214,5 @@ // Mark: Incoming "device_verification_incoming_title" = "Innkommende bekreftelsesforespørsel"; -"device_verification_incoming_description_1" = "Verifiser denne økten for å merke den som klarert. Verifisering av økter fra partnere gir deg ekstra trygghet når du bruker ende-til-ende-krypterte meldinger."; +"device_verification_incoming_description_1" = "Bekreft denne økten for å merke den som klarert. Bekreftelse av økter fra partnere gir deg ekstra trygghet når du bruker ende-til-ende-krypterte meldinger."; "device_verification_incoming_description_2" = "Verifisering av denne økten vil markere den som klarert, og også merke økten din som verifisert for partneren."; From 1dd08ade5b47fa6d1af3ea40229090938fbba8e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:11:41 +0000 Subject: [PATCH 139/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.3% (1062 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 2d1bbade2..e7ed51419 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1216,3 +1216,9 @@ "device_verification_incoming_title" = "Innkommende bekreftelsesforespørsel"; "device_verification_incoming_description_1" = "Bekreft denne økten for å merke den som klarert. Bekreftelse av økter fra partnere gir deg ekstra trygghet når du bruker ende-til-ende-krypterte meldinger."; "device_verification_incoming_description_2" = "Verifisering av denne økten vil markere den som klarert, og også merke økten din som verifisert for partneren."; +"device_verification_start_use_legacy_action" = "Bruk Legacy verifikasjon"; +"device_verification_start_use_legacy" = "Dukker ingenting opp? Ikke alle klienter støtter interaktiv bekreftelse ennå. Bruk eldre bekreftelse."; +"device_verification_start_wait_partner" = "Venter på at partneren skal godta …"; + +// MARK: Start +"device_verification_start_title" = "Bekreft ved å sammenligne en kort tekststreng"; From 8be54f65db693caf55f3d3d0cb63d7d6e23cf3f9 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:11:04 +0000 Subject: [PATCH 140/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.3% (1062 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index e7ed51419..8f48e90cb 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1215,7 +1215,7 @@ // Mark: Incoming "device_verification_incoming_title" = "Innkommende bekreftelsesforespørsel"; "device_verification_incoming_description_1" = "Bekreft denne økten for å merke den som klarert. Bekreftelse av økter fra partnere gir deg ekstra trygghet når du bruker ende-til-ende-krypterte meldinger."; -"device_verification_incoming_description_2" = "Verifisering av denne økten vil markere den som klarert, og også merke økten din som verifisert for partneren."; +"device_verification_incoming_description_2" = "Bekreftelse av denne økten vil markere den som klarert, og også merke økten din som bekreftet for partneren."; "device_verification_start_use_legacy_action" = "Bruk Legacy verifikasjon"; "device_verification_start_use_legacy" = "Dukker ingenting opp? Ikke alle klienter støtter interaktiv bekreftelse ennå. Bruk eldre bekreftelse."; "device_verification_start_wait_partner" = "Venter på at partneren skal godta …"; From 0538fdfeaf2487410dde4649e4c1fca4293f0d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:12:34 +0000 Subject: [PATCH 141/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.5% (1064 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 8f48e90cb..6f9c05164 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1222,3 +1222,5 @@ // MARK: Start "device_verification_start_title" = "Bekreft ved å sammenligne en kort tekststreng"; +"key_verification_self_verify_current_session_alert_message" = "Andre brukere stoler kanskje ikke på det."; +"device_verification_self_verify_start_information" = "Bruk denne økten til å verifisere den nye, og gi den tilgang til krypterte meldinger."; From 28a2b63ed1f86cac4740932cddcda6c69968d37e Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:12:17 +0000 Subject: [PATCH 142/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.5% (1064 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 6f9c05164..aa89aeecf 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1216,7 +1216,7 @@ "device_verification_incoming_title" = "Innkommende bekreftelsesforespørsel"; "device_verification_incoming_description_1" = "Bekreft denne økten for å merke den som klarert. Bekreftelse av økter fra partnere gir deg ekstra trygghet når du bruker ende-til-ende-krypterte meldinger."; "device_verification_incoming_description_2" = "Bekreftelse av denne økten vil markere den som klarert, og også merke økten din som bekreftet for partneren."; -"device_verification_start_use_legacy_action" = "Bruk Legacy verifikasjon"; +"device_verification_start_use_legacy_action" = "Bruk tidligere metode for bekreftelse"; "device_verification_start_use_legacy" = "Dukker ingenting opp? Ikke alle klienter støtter interaktiv bekreftelse ennå. Bruk eldre bekreftelse."; "device_verification_start_wait_partner" = "Venter på at partneren skal godta …"; From a611403902fd4d66f0ca11bb3cbb4f803961ce37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:12:49 +0000 Subject: [PATCH 143/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.5% (1065 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index aa89aeecf..99ac82cb5 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1224,3 +1224,7 @@ "device_verification_start_title" = "Bekreft ved å sammenligne en kort tekststreng"; "key_verification_self_verify_current_session_alert_message" = "Andre brukere stoler kanskje ikke på det."; "device_verification_self_verify_start_information" = "Bruk denne økten til å verifisere den nye, og gi den tilgang til krypterte meldinger."; + +// Unverified sessions + +"key_verification_self_verify_unverified_sessions_alert_title" = "Gjennomgå hvor du er logget inn"; From da5a51250cb1a519e841321243e3284afe7dad1f Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:12:41 +0000 Subject: [PATCH 144/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.5% (1065 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 99ac82cb5..c9431f891 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1222,7 +1222,7 @@ // MARK: Start "device_verification_start_title" = "Bekreft ved å sammenligne en kort tekststreng"; -"key_verification_self_verify_current_session_alert_message" = "Andre brukere stoler kanskje ikke på det."; +"key_verification_self_verify_current_session_alert_message" = "Andre brukere stoler kanskje ikke på den."; "device_verification_self_verify_start_information" = "Bruk denne økten til å verifisere den nye, og gi den tilgang til krypterte meldinger."; // Unverified sessions From e4ef293c06ab4aeb879812347952e42590ca79a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:13:29 +0000 Subject: [PATCH 145/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.7% (1067 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index c9431f891..887e73532 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1228,3 +1228,5 @@ // Unverified sessions "key_verification_self_verify_unverified_sessions_alert_title" = "Gjennomgå hvor du er logget inn"; +"device_verification_self_verify_wait_information" = "Bekreft denne økten fra en av de andre øktene dine, og gi den tilgang til krypterte meldinger.\n\nBruk siste versjon av Element på de andre enhetene dine:"; +"key_verification_self_verify_unverified_sessions_alert_message" = "Bekreft alle øktene dine for å sikre at kontoen og meldingene dine er trygge."; From 6cb2395c69b87116b099533cb58deeebfedc9a36 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:12:59 +0000 Subject: [PATCH 146/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.7% (1067 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 887e73532..3bfbea364 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1227,6 +1227,6 @@ // Unverified sessions -"key_verification_self_verify_unverified_sessions_alert_title" = "Gjennomgå hvor du er logget inn"; +"key_verification_self_verify_unverified_sessions_alert_title" = "Gjennomgå dine innlogginger"; "device_verification_self_verify_wait_information" = "Bekreft denne økten fra en av de andre øktene dine, og gi den tilgang til krypterte meldinger.\n\nBruk siste versjon av Element på de andre enhetene dine:"; "key_verification_self_verify_unverified_sessions_alert_message" = "Bekreft alle øktene dine for å sikre at kontoen og meldingene dine er trygge."; From 261ea5a13f271fd5168e5f3a53ec4d2c3ef4217c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:20:53 +0000 Subject: [PATCH 147/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.8% (1068 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 3bfbea364..2d39d3b92 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1230,3 +1230,4 @@ "key_verification_self_verify_unverified_sessions_alert_title" = "Gjennomgå dine innlogginger"; "device_verification_self_verify_wait_information" = "Bekreft denne økten fra en av de andre øktene dine, og gi den tilgang til krypterte meldinger.\n\nBruk siste versjon av Element på de andre enhetene dine:"; "key_verification_self_verify_unverified_sessions_alert_message" = "Bekreft alle øktene dine for å sikre at kontoen og meldingene dine er trygge."; +"device_verification_self_verify_wait_additional_information" = "Dette fungerer med Element og andre kryssignerings-Matrix-klienter."; From 81d79677fede44abe6576eec39d511d41b25902d Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:13:43 +0000 Subject: [PATCH 148/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 87.8% (1068 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 2d39d3b92..3518af01d 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1228,6 +1228,6 @@ // Unverified sessions "key_verification_self_verify_unverified_sessions_alert_title" = "Gjennomgå dine innlogginger"; -"device_verification_self_verify_wait_information" = "Bekreft denne økten fra en av de andre øktene dine, og gi den tilgang til krypterte meldinger.\n\nBruk siste versjon av Element på de andre enhetene dine:"; +"device_verification_self_verify_wait_information" = "Bekreft denne økten fra en av de andre øktene dine, og gi den tilgang til krypterte meldinger.\n\nBruk siste versjon av appen på de andre enhetene dine:"; "key_verification_self_verify_unverified_sessions_alert_message" = "Bekreft alle øktene dine for å sikre at kontoen og meldingene dine er trygge."; "device_verification_self_verify_wait_additional_information" = "Dette fungerer med Element og andre kryssignerings-Matrix-klienter."; From 9090c142f7f4a22482379311e6622a142cbeea41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:22:07 +0000 Subject: [PATCH 149/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 88.1% (1072 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 3518af01d..9db2ebd2f 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1231,3 +1231,7 @@ "device_verification_self_verify_wait_information" = "Bekreft denne økten fra en av de andre øktene dine, og gi den tilgang til krypterte meldinger.\n\nBruk siste versjon av appen på de andre enhetene dine:"; "key_verification_self_verify_unverified_sessions_alert_message" = "Bekreft alle øktene dine for å sikre at kontoen og meldingene dine er trygge."; "device_verification_self_verify_wait_additional_information" = "Dette fungerer med Element og andre kryssignerings-Matrix-klienter."; +"key_verification_verify_sas_additional_information" = "For ytterligere sikkerhet, bruk et annen pålitelig kommunikasjonskanal eller snakk med personen."; +"device_verification_self_verify_wait_recover_secrets_checking_availability" = "Ser etter andre bekreftelsesmuligheter ..."; +"device_verification_self_verify_wait_recover_secrets_additional_information" = "Hvis du ikke får tilgang til en eksisterende økt"; +"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Bruk gjenopprettingsfrase eller nøkkel"; From 2cda6a258ed23b6c13a79a5a1084432117539233 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:21:25 +0000 Subject: [PATCH 150/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 88.1% (1072 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 9db2ebd2f..725790a54 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1230,7 +1230,7 @@ "key_verification_self_verify_unverified_sessions_alert_title" = "Gjennomgå dine innlogginger"; "device_verification_self_verify_wait_information" = "Bekreft denne økten fra en av de andre øktene dine, og gi den tilgang til krypterte meldinger.\n\nBruk siste versjon av appen på de andre enhetene dine:"; "key_verification_self_verify_unverified_sessions_alert_message" = "Bekreft alle øktene dine for å sikre at kontoen og meldingene dine er trygge."; -"device_verification_self_verify_wait_additional_information" = "Dette fungerer med Element og andre kryssignerings-Matrix-klienter."; +"device_verification_self_verify_wait_additional_information" = "Dette fungerer med Element og andre klienter som støtter kryssignering."; "key_verification_verify_sas_additional_information" = "For ytterligere sikkerhet, bruk et annen pålitelig kommunikasjonskanal eller snakk med personen."; "device_verification_self_verify_wait_recover_secrets_checking_availability" = "Ser etter andre bekreftelsesmuligheter ..."; "device_verification_self_verify_wait_recover_secrets_additional_information" = "Hvis du ikke får tilgang til en eksisterende økt"; From 55dc3e83e7a7b3f872f0ca221daa251b1f7cc981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:44:26 +0000 Subject: [PATCH 151/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.0% (1083 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 725790a54..36b731f2a 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1235,3 +1235,20 @@ "device_verification_self_verify_wait_recover_secrets_checking_availability" = "Ser etter andre bekreftelsesmuligheter ..."; "device_verification_self_verify_wait_recover_secrets_additional_information" = "Hvis du ikke får tilgang til en eksisterende økt"; "device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Bruk gjenopprettingsfrase eller nøkkel"; +"device_verification_emoji_apple" = "eple"; +"device_verification_emoji_fire" = "Brann"; +"device_verification_emoji_cloud" = "Sky"; + +// User + +"key_verification_verified_user_information" = "Meldinger med denne brukeren er ende-til-ende-kryptert og kan ikke leses av tredjeparter."; +"key_verification_verified_this_session_information" = "Du kan nå lese sikre meldinger på denne enheten, og andre brukere vil vite at de kan stole på meldingene."; +"key_verification_verified_new_session_information" = "Du kan nå lese sikre meldinger på den nye enheten din, og andre brukere vil vite at de kan stole på meldingene."; +"key_verification_verified_other_session_information" = "Du kan nå lese sikre meldinger på den andre økten din, og andre brukere vil vite at de kan stole på meldingene."; +"key_verification_verified_new_session_title" = "Ny økt verifisert!"; +"key_verification_manually_verify_device_additional_information" = "Hvis de ikke stemmer overens, kan sikkerheten i kommunikasjonen din bli kompromittert."; +"key_verification_manually_verify_device_instruction" = "Bekreft ved å sammenligne følgende med brukerinnstillingene i den andre økten:"; + +// MARK: Manually Verify Device + +"key_verification_manually_verify_device_title" = "Bekreft manuelt med tekst"; From d9a4281ff1d9dd98b98c58f0e39df7b70de105e4 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:22:22 +0000 Subject: [PATCH 152/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.0% (1083 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 36b731f2a..ae8652f24 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1231,7 +1231,7 @@ "device_verification_self_verify_wait_information" = "Bekreft denne økten fra en av de andre øktene dine, og gi den tilgang til krypterte meldinger.\n\nBruk siste versjon av appen på de andre enhetene dine:"; "key_verification_self_verify_unverified_sessions_alert_message" = "Bekreft alle øktene dine for å sikre at kontoen og meldingene dine er trygge."; "device_verification_self_verify_wait_additional_information" = "Dette fungerer med Element og andre klienter som støtter kryssignering."; -"key_verification_verify_sas_additional_information" = "For ytterligere sikkerhet, bruk et annen pålitelig kommunikasjonskanal eller snakk med personen."; +"key_verification_verify_sas_additional_information" = "For ytterligere sikkerhet, bruk en annen pålitelig kommunikasjonskanal eller snakk direkte med personen."; "device_verification_self_verify_wait_recover_secrets_checking_availability" = "Ser etter andre bekreftelsesmuligheter ..."; "device_verification_self_verify_wait_recover_secrets_additional_information" = "Hvis du ikke får tilgang til en eksisterende økt"; "device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Bruk gjenopprettingsfrase eller nøkkel"; From 6e4ddd923a5da79a19f46e3a22c91df77ecdd156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:44:38 +0000 Subject: [PATCH 153/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.1% (1084 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index ae8652f24..554a43a90 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1252,3 +1252,4 @@ // MARK: Manually Verify Device "key_verification_manually_verify_device_title" = "Bekreft manuelt med tekst"; +"device_verification_emoji_corn" = "mais"; From 52e64c1fbcd5686352406603ae989122e19cf7ba Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:44:33 +0000 Subject: [PATCH 154/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.1% (1084 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 554a43a90..99e66df61 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1235,7 +1235,7 @@ "device_verification_self_verify_wait_recover_secrets_checking_availability" = "Ser etter andre bekreftelsesmuligheter ..."; "device_verification_self_verify_wait_recover_secrets_additional_information" = "Hvis du ikke får tilgang til en eksisterende økt"; "device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Bruk gjenopprettingsfrase eller nøkkel"; -"device_verification_emoji_apple" = "eple"; +"device_verification_emoji_apple" = "Eple"; "device_verification_emoji_fire" = "Brann"; "device_verification_emoji_cloud" = "Sky"; From f4922e2e72c3e5d637ed43c16089f90fe94c6985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:44:53 +0000 Subject: [PATCH 155/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.2% (1085 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 99e66df61..b21d8982f 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1253,3 +1253,4 @@ "key_verification_manually_verify_device_title" = "Bekreft manuelt med tekst"; "device_verification_emoji_corn" = "mais"; +"device_verification_emoji_spanner" = "Skrunøkkel"; From e54244493cef9bbbdbbc2cc0cf181b9e91f50835 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:44:45 +0000 Subject: [PATCH 156/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.2% (1085 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index b21d8982f..7ea60767b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1252,5 +1252,5 @@ // MARK: Manually Verify Device "key_verification_manually_verify_device_title" = "Bekreft manuelt med tekst"; -"device_verification_emoji_corn" = "mais"; +"device_verification_emoji_corn" = "Mais"; "device_verification_emoji_spanner" = "Skrunøkkel"; From 459640601f18757682ef65937088020bdbd28a82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:46:12 +0000 Subject: [PATCH 157/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.7% (1091 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 7ea60767b..40d8f2d4e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1254,3 +1254,12 @@ "key_verification_manually_verify_device_title" = "Bekreft manuelt med tekst"; "device_verification_emoji_corn" = "Mais"; "device_verification_emoji_spanner" = "Skrunøkkel"; +"error_not_supported_on_mobile" = "Du kan ikke gjøre dette fra % @ mobil."; + + +// Generic errors +"error_invite_3pid_with_no_identity_server" = "Legg til en identitetsserver i innstillingene dine for å invitere via e-post."; +"device_verification_emoji_pin" = "Tegnestift"; +"device_verification_emoji_aeroplane" = "Fly"; +"device_verification_emoji_train" = "Tog"; +"device_verification_emoji_book" = "Bok"; From e99edceec182e94adb6ae68f7551a1c95dc18c0f Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:45:35 +0000 Subject: [PATCH 158/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.7% (1091 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 40d8f2d4e..350fe154f 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1253,7 +1253,7 @@ "key_verification_manually_verify_device_title" = "Bekreft manuelt med tekst"; "device_verification_emoji_corn" = "Mais"; -"device_verification_emoji_spanner" = "Skrunøkkel"; +"device_verification_emoji_spanner" = "Skiftnøkkel"; "error_not_supported_on_mobile" = "Du kan ikke gjøre dette fra % @ mobil."; From dc45322e9fc906e8527f88d0a0c021578e1ecb60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:46:36 +0000 Subject: [PATCH 159/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.8% (1092 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 350fe154f..752211043 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1263,3 +1263,4 @@ "device_verification_emoji_aeroplane" = "Fly"; "device_verification_emoji_train" = "Tog"; "device_verification_emoji_book" = "Bok"; +"key_verification_bootstrap_not_setup_message" = "Du må starte kryssignering først."; From 4058c32976d779d11348211389d576338bc9ac0d Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:46:24 +0000 Subject: [PATCH 160/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.8% (1092 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 752211043..d01b4edf7 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1254,7 +1254,7 @@ "key_verification_manually_verify_device_title" = "Bekreft manuelt med tekst"; "device_verification_emoji_corn" = "Mais"; "device_verification_emoji_spanner" = "Skiftnøkkel"; -"error_not_supported_on_mobile" = "Du kan ikke gjøre dette fra % @ mobil."; +"error_not_supported_on_mobile" = "Du kan ikke gjøre dette fra %@ mobil."; // Generic errors From 4c0f2dd14961c285c9e3c43c66c8b0b753c381ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:46:57 +0000 Subject: [PATCH 161/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.8% (1093 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index d01b4edf7..ea8bf96aa 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1264,3 +1264,4 @@ "device_verification_emoji_train" = "Tog"; "device_verification_emoji_book" = "Bok"; "key_verification_bootstrap_not_setup_message" = "Du må starte kryssignering først."; +"key_verification_tile_request_status_data_loading" = "Data lastes inn…"; From c4028caad6b238593bf6f2280754cd153200604b Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:46:48 +0000 Subject: [PATCH 162/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 89.8% (1093 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index ea8bf96aa..2c413678c 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1263,5 +1263,5 @@ "device_verification_emoji_aeroplane" = "Fly"; "device_verification_emoji_train" = "Tog"; "device_verification_emoji_book" = "Bok"; -"key_verification_bootstrap_not_setup_message" = "Du må starte kryssignering først."; +"key_verification_bootstrap_not_setup_message" = "Du må starte oppsett av kryssignering først."; "key_verification_tile_request_status_data_loading" = "Data lastes inn…"; From 3478bcfdfa40d7a8beb31db4bbddc2577b55aa7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:47:29 +0000 Subject: [PATCH 163/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 90.1% (1096 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 2c413678c..75bed12b7 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1265,3 +1265,9 @@ "device_verification_emoji_book" = "Bok"; "key_verification_bootstrap_not_setup_message" = "Du må starte oppsett av kryssignering først."; "key_verification_tile_request_status_data_loading" = "Data lastes inn…"; + +// Incoming key verification request + +"key_verification_incoming_request_incoming_alert_message" = "% @ ønsker å verifisere"; +"key_verification_tile_conclusion_warning_title" = "Ikke klarert pålogging"; +"key_verification_tile_request_status_cancelled" = "%@ kansellert"; From cc090380f981fbb195e5907f5b578b0a1e249be7 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:47:03 +0000 Subject: [PATCH 164/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 90.1% (1096 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 75bed12b7..31aaeab62 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1264,7 +1264,7 @@ "device_verification_emoji_train" = "Tog"; "device_verification_emoji_book" = "Bok"; "key_verification_bootstrap_not_setup_message" = "Du må starte oppsett av kryssignering først."; -"key_verification_tile_request_status_data_loading" = "Data lastes inn…"; +"key_verification_tile_request_status_data_loading" = "Data lastes…"; // Incoming key verification request From 888d18fc610239e4cd71a418f1cc783fb31eca79 Mon Sep 17 00:00:00 2001 From: Finn Behrens Date: Tue, 18 May 2021 15:51:40 +0200 Subject: [PATCH 165/393] fix spelling in INSTALL.md Signed-off-by: Finn Behrens --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 5800848d0..ca983508a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -12,7 +12,7 @@ To build Element iOS project you need: ### Install Ruby -Ruby is required for several build tools like CocoaPods, bundler and fastlane. Ruby is preinstalled on macOS, the system version is sufficient to build the porject tools, it's not required to install the latest version. If you want to install the lastest version of Ruby please check [official instructions](https://www.ruby-lang.org/en/documentation/installation/#homebrew). +Ruby is required for several build tools like CocoaPods, bundler and fastlane. Ruby is preinstalled on macOS, the system version is sufficient to build the project tools, it's not required to install the latest version. If you want to install the lastest version of Ruby please check [official instructions](https://www.ruby-lang.org/en/documentation/installation/#homebrew). If you do not want to grant the ruby package manager, [RubyGems](https://rubygems.org/), admin privileges and you prefer install gems into your user directory, you can read instructions from the CocoaPods [guide about sudo-less installation](https://guides.cocoapods.org/using/getting-started.html#sudo-less-installation). From 011a9fc43cfd85782ef9af9f9fde76a991698135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:54:18 +0000 Subject: [PATCH 166/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 90.2% (1097 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 31aaeab62..bbb6ead62 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1271,3 +1271,4 @@ "key_verification_incoming_request_incoming_alert_message" = "% @ ønsker å verifisere"; "key_verification_tile_conclusion_warning_title" = "Ikke klarert pålogging"; "key_verification_tile_request_status_cancelled" = "%@ kansellert"; +"key_verification_verify_qr_code_information" = "Skann koden for å verifisere hverandre på en sikker måte."; From 973acdcf77ce5534f16e007e7e0bbeff466f9f7a Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:47:44 +0000 Subject: [PATCH 167/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 90.2% (1097 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index bbb6ead62..6e30f7bb1 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1268,7 +1268,7 @@ // Incoming key verification request -"key_verification_incoming_request_incoming_alert_message" = "% @ ønsker å verifisere"; +"key_verification_incoming_request_incoming_alert_message" = "%@ ønsker å bekrefte"; "key_verification_tile_conclusion_warning_title" = "Ikke klarert pålogging"; "key_verification_tile_request_status_cancelled" = "%@ kansellert"; "key_verification_verify_qr_code_information" = "Skann koden for å verifisere hverandre på en sikker måte."; From b179ac399d2fa57a5e74965eb4fdea69451dd00c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:54:38 +0000 Subject: [PATCH 168/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 90.2% (1098 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 6e30f7bb1..49610c25a 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1272,3 +1272,4 @@ "key_verification_tile_conclusion_warning_title" = "Ikke klarert pålogging"; "key_verification_tile_request_status_cancelled" = "%@ kansellert"; "key_verification_verify_qr_code_information" = "Skann koden for å verifisere hverandre på en sikker måte."; +"key_verification_verify_qr_code_information_other_device" = "Skann koden nedenfor for å verifisere:"; From e0fe67f63cb0f187bbfb635d21c6c991842e6991 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:54:32 +0000 Subject: [PATCH 169/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 90.2% (1098 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 49610c25a..ebb8bcc7e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1271,5 +1271,5 @@ "key_verification_incoming_request_incoming_alert_message" = "%@ ønsker å bekrefte"; "key_verification_tile_conclusion_warning_title" = "Ikke klarert pålogging"; "key_verification_tile_request_status_cancelled" = "%@ kansellert"; -"key_verification_verify_qr_code_information" = "Skann koden for å verifisere hverandre på en sikker måte."; +"key_verification_verify_qr_code_information" = "Skann koden for å bekrefte hverandre på en sikker måte."; "key_verification_verify_qr_code_information_other_device" = "Skann koden nedenfor for å verifisere:"; From e076e9f86984962edb08de9975a0c2a699b439c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:54:48 +0000 Subject: [PATCH 170/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 90.3% (1099 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index ebb8bcc7e..319007654 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1273,3 +1273,4 @@ "key_verification_tile_request_status_cancelled" = "%@ kansellert"; "key_verification_verify_qr_code_information" = "Skann koden for å bekrefte hverandre på en sikker måte."; "key_verification_verify_qr_code_information_other_device" = "Skann koden nedenfor for å verifisere:"; +"key_verification_verify_qr_code_emoji_information" = "Verifiser ved å sammenligne unike emoji."; From fc8634cdd0855ce49a9c53a7d5a0beaccae17ad6 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:54:43 +0000 Subject: [PATCH 171/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 90.3% (1099 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 319007654..7eda8a6c8 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1272,5 +1272,5 @@ "key_verification_tile_conclusion_warning_title" = "Ikke klarert pålogging"; "key_verification_tile_request_status_cancelled" = "%@ kansellert"; "key_verification_verify_qr_code_information" = "Skann koden for å bekrefte hverandre på en sikker måte."; -"key_verification_verify_qr_code_information_other_device" = "Skann koden nedenfor for å verifisere:"; +"key_verification_verify_qr_code_information_other_device" = "Skann koden nedenfor for å bekrefte:"; "key_verification_verify_qr_code_emoji_information" = "Verifiser ved å sammenligne unike emoji."; From 983f7e9d102d3e05407956fb6f3e49705acbc94f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:55:32 +0000 Subject: [PATCH 172/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 90.9% (1106 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 7eda8a6c8..73d97a005 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1274,3 +1274,16 @@ "key_verification_verify_qr_code_information" = "Skann koden for å bekrefte hverandre på en sikker måte."; "key_verification_verify_qr_code_information_other_device" = "Skann koden nedenfor for å bekrefte:"; "key_verification_verify_qr_code_emoji_information" = "Verifiser ved å sammenligne unike emoji."; +"key_verification_scan_confirmation_scanned_user_information" = "Viser% @ det samme skjoldet?"; + +// Scanned +"key_verification_scan_confirmation_scanned_title" = "Nesten i mål!"; +"key_verification_scan_confirmation_scanning_device_waiting_other" = "Venter på andre enheter …"; + +// MARK: Scan confirmation + +// Scanning +"key_verification_scan_confirmation_scanning_title" = "Nesten i mål! Venter på bekreftelse…"; +"key_verification_verify_qr_code_scan_other_code_success_message" = "QR-koden er bekreftet."; +"key_verification_verify_qr_code_scan_other_code_success_title" = "Koden er bekreftet!"; +"key_verification_verify_qr_code_other_scan_my_code_title" = "Gjorde den andre brukeren en vellykket skanning av QR-koden?"; From ab5e8face77fb74f664b02171810e1617f9216a5 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:54:57 +0000 Subject: [PATCH 173/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 90.9% (1106 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 73d97a005..80d08343a 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1273,7 +1273,7 @@ "key_verification_tile_request_status_cancelled" = "%@ kansellert"; "key_verification_verify_qr_code_information" = "Skann koden for å bekrefte hverandre på en sikker måte."; "key_verification_verify_qr_code_information_other_device" = "Skann koden nedenfor for å bekrefte:"; -"key_verification_verify_qr_code_emoji_information" = "Verifiser ved å sammenligne unike emoji."; +"key_verification_verify_qr_code_emoji_information" = "Bekreft ved å sammenligne unike emoji."; "key_verification_scan_confirmation_scanned_user_information" = "Viser% @ det samme skjoldet?"; // Scanned From 632d865e668eb85b9287506bfc14f3b7d38c7937 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:55:58 +0000 Subject: [PATCH 174/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.1% (1108 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 80d08343a..1f404927b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1287,3 +1287,5 @@ "key_verification_verify_qr_code_scan_other_code_success_message" = "QR-koden er bekreftet."; "key_verification_verify_qr_code_scan_other_code_success_title" = "Koden er bekreftet!"; "key_verification_verify_qr_code_other_scan_my_code_title" = "Gjorde den andre brukeren en vellykket skanning av QR-koden?"; +"user_verification_start_information_part1" = "Verifiser for ekstra sikkerhet "; +"key_verification_scan_confirmation_scanned_device_information" = "Viser den andre enheten det samme skjoldet?"; From 111bdc18bd2ea5d4efbd82f7f58066d247167fd4 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:55:43 +0000 Subject: [PATCH 175/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.1% (1108 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 1f404927b..750b1b18e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1274,7 +1274,7 @@ "key_verification_verify_qr_code_information" = "Skann koden for å bekrefte hverandre på en sikker måte."; "key_verification_verify_qr_code_information_other_device" = "Skann koden nedenfor for å bekrefte:"; "key_verification_verify_qr_code_emoji_information" = "Bekreft ved å sammenligne unike emoji."; -"key_verification_scan_confirmation_scanned_user_information" = "Viser% @ det samme skjoldet?"; +"key_verification_scan_confirmation_scanned_user_information" = "Viser %@ det samme skjoldet?"; // Scanned "key_verification_scan_confirmation_scanned_title" = "Nesten i mål!"; From 3c7e7e212515eee353bec7b9a15c4c9087b98568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:56:20 +0000 Subject: [PATCH 176/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.2% (1109 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 750b1b18e..42af93bb6 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1289,3 +1289,4 @@ "key_verification_verify_qr_code_other_scan_my_code_title" = "Gjorde den andre brukeren en vellykket skanning av QR-koden?"; "user_verification_start_information_part1" = "Verifiser for ekstra sikkerhet "; "key_verification_scan_confirmation_scanned_device_information" = "Viser den andre enheten det samme skjoldet?"; +"user_verification_start_information_part2" = " ved å sjekke en engangskode på begge enhetene dine."; From a418ba4c1be2c40a194310c6ad3b39714438a0a1 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:56:16 +0000 Subject: [PATCH 177/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.2% (1109 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 42af93bb6..474aedfbe 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1287,6 +1287,6 @@ "key_verification_verify_qr_code_scan_other_code_success_message" = "QR-koden er bekreftet."; "key_verification_verify_qr_code_scan_other_code_success_title" = "Koden er bekreftet!"; "key_verification_verify_qr_code_other_scan_my_code_title" = "Gjorde den andre brukeren en vellykket skanning av QR-koden?"; -"user_verification_start_information_part1" = "Verifiser for ekstra sikkerhet "; +"user_verification_start_information_part1" = "Bekreft for ekstra sikkerhet "; "key_verification_scan_confirmation_scanned_device_information" = "Viser den andre enheten det samme skjoldet?"; "user_verification_start_information_part2" = " ved å sjekke en engangskode på begge enhetene dine."; From a591aaf0c92c95d4ec4e85c2ce943dbc68b15bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:57:11 +0000 Subject: [PATCH 178/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.5% (1113 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 474aedfbe..6e931cf11 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1290,3 +1290,7 @@ "user_verification_start_information_part1" = "Bekreft for ekstra sikkerhet "; "key_verification_scan_confirmation_scanned_device_information" = "Viser den andre enheten det samme skjoldet?"; "user_verification_start_information_part2" = " ved å sjekke en engangskode på begge enhetene dine."; +"user_verification_session_details_information_trusted_other_user_part1" = "Denne økten er klarert for sikre meldinger fordi "; +"user_verification_session_details_information_trusted_current_user" = "Denne økten er klarert for sikre meldinger fordi du bekreftet den:"; +"user_verification_sessions_list_information" = "Meldinger med denne brukeren i dette rommet er ende-til-ende-kryptert og kan ikke leses av tredjeparter."; +"user_verification_start_additional_information" = "For å være sikker, gjør dette personlig eller bruk en annen måte å kommunisere på."; From 2b62c6f0d7be8745e7c4d0dd678a64525512d7ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:57:26 +0000 Subject: [PATCH 179/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.6% (1114 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 6e931cf11..b1c56de46 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1294,3 +1294,4 @@ "user_verification_session_details_information_trusted_current_user" = "Denne økten er klarert for sikre meldinger fordi du bekreftet den:"; "user_verification_sessions_list_information" = "Meldinger med denne brukeren i dette rommet er ende-til-ende-kryptert og kan ikke leses av tredjeparter."; "user_verification_start_additional_information" = "For å være sikker, gjør dette personlig eller bruk en annen måte å kommunisere på."; +"user_verification_session_details_information_trusted_other_user_part2" = " verifiserte det:"; From aa9bb3e39173926c54083a493f120a39bcfb5449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:57:58 +0000 Subject: [PATCH 180/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.6% (1115 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index b1c56de46..4ddc45130 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1295,3 +1295,4 @@ "user_verification_sessions_list_information" = "Meldinger med denne brukeren i dette rommet er ende-til-ende-kryptert og kan ikke leses av tredjeparter."; "user_verification_start_additional_information" = "For å være sikker, gjør dette personlig eller bruk en annen måte å kommunisere på."; "user_verification_session_details_information_trusted_other_user_part2" = " verifiserte det:"; +"user_verification_session_details_information_untrusted_current_user" = "Verifiser denne økten for å markere den som klarert og gi den tilgang til krypterte meldinger:"; From 6cb9b2bba76224db8bf3f578326502d1ff7c8858 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:57:46 +0000 Subject: [PATCH 181/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.6% (1115 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 4ddc45130..8d0b52c59 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1294,5 +1294,5 @@ "user_verification_session_details_information_trusted_current_user" = "Denne økten er klarert for sikre meldinger fordi du bekreftet den:"; "user_verification_sessions_list_information" = "Meldinger med denne brukeren i dette rommet er ende-til-ende-kryptert og kan ikke leses av tredjeparter."; "user_verification_start_additional_information" = "For å være sikker, gjør dette personlig eller bruk en annen måte å kommunisere på."; -"user_verification_session_details_information_trusted_other_user_part2" = " verifiserte det:"; +"user_verification_session_details_information_trusted_other_user_part2" = " bekreftet det:"; "user_verification_session_details_information_untrusted_current_user" = "Verifiser denne økten for å markere den som klarert og gi den tilgang til krypterte meldinger:"; From f6dc6f9f2e396aedd9f929b8699c3e22d49fa877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:58:19 +0000 Subject: [PATCH 182/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.7% (1116 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 8d0b52c59..bf997861d 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1296,3 +1296,4 @@ "user_verification_start_additional_information" = "For å være sikker, gjør dette personlig eller bruk en annen måte å kommunisere på."; "user_verification_session_details_information_trusted_other_user_part2" = " bekreftet det:"; "user_verification_session_details_information_untrusted_current_user" = "Verifiser denne økten for å markere den som klarert og gi den tilgang til krypterte meldinger:"; +"user_verification_session_details_information_untrusted_other_user" = " logget på med en ny økt:"; From a07cbc04f4ba798f82050ef3b78a187ed412d5fa Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:58:14 +0000 Subject: [PATCH 183/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.7% (1116 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index bf997861d..b4dbfae1a 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1295,5 +1295,5 @@ "user_verification_sessions_list_information" = "Meldinger med denne brukeren i dette rommet er ende-til-ende-kryptert og kan ikke leses av tredjeparter."; "user_verification_start_additional_information" = "For å være sikker, gjør dette personlig eller bruk en annen måte å kommunisere på."; "user_verification_session_details_information_trusted_other_user_part2" = " bekreftet det:"; -"user_verification_session_details_information_untrusted_current_user" = "Verifiser denne økten for å markere den som klarert og gi den tilgang til krypterte meldinger:"; +"user_verification_session_details_information_untrusted_current_user" = "Bekreft denne økten for å markere den som klarert og gi den tilgang til krypterte meldinger:"; "user_verification_session_details_information_untrusted_other_user" = " logget på med en ny økt:"; From 195cc70464c3c2731df82f784e5b9889f9feb1fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:58:45 +0000 Subject: [PATCH 184/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 91.8% (1117 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index b4dbfae1a..a2246b8e9 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1297,3 +1297,4 @@ "user_verification_session_details_information_trusted_other_user_part2" = " bekreftet det:"; "user_verification_session_details_information_untrusted_current_user" = "Bekreft denne økten for å markere den som klarert og gi den tilgang til krypterte meldinger:"; "user_verification_session_details_information_untrusted_other_user" = " logget på med en ny økt:"; +"user_verification_session_details_additional_information_untrusted_other_user" = "Inntil denne brukeren verifiserer på denne økten, blir meldinger sendt til og fra den merket med advarsler. Alternativt kan du bekrefte det manuelt."; From fcba093a11d3f3498e73ba72673eba8978054287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:59:31 +0000 Subject: [PATCH 185/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.0% (1119 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index a2246b8e9..f81846715 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1298,3 +1298,5 @@ "user_verification_session_details_information_untrusted_current_user" = "Bekreft denne økten for å markere den som klarert og gi den tilgang til krypterte meldinger:"; "user_verification_session_details_information_untrusted_other_user" = " logget på med en ny økt:"; "user_verification_session_details_additional_information_untrusted_other_user" = "Inntil denne brukeren verifiserer på denne økten, blir meldinger sendt til og fra den merket med advarsler. Alternativt kan du bekrefte det manuelt."; +"user_verification_session_details_verify_action_current_user_manually" = "Verifiser manuelt med tekst"; +"user_verification_session_details_additional_information_untrusted_current_user" = "Hvis du ikke logget på denne økten, kan det hende at kontoen din er kompromittert."; From d30130a788023726d88f3727f198ce5024871be4 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:59:11 +0000 Subject: [PATCH 186/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.0% (1119 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index f81846715..0dd795a75 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1297,6 +1297,6 @@ "user_verification_session_details_information_trusted_other_user_part2" = " bekreftet det:"; "user_verification_session_details_information_untrusted_current_user" = "Bekreft denne økten for å markere den som klarert og gi den tilgang til krypterte meldinger:"; "user_verification_session_details_information_untrusted_other_user" = " logget på med en ny økt:"; -"user_verification_session_details_additional_information_untrusted_other_user" = "Inntil denne brukeren verifiserer på denne økten, blir meldinger sendt til og fra den merket med advarsler. Alternativt kan du bekrefte det manuelt."; +"user_verification_session_details_additional_information_untrusted_other_user" = "Inntil denne brukeren bekrefter denne økten, blir meldinger sendt til og fra den merket med advarsler. Alternativt kan du bekrefte den manuelt."; "user_verification_session_details_verify_action_current_user_manually" = "Verifiser manuelt med tekst"; "user_verification_session_details_additional_information_untrusted_current_user" = "Hvis du ikke logget på denne økten, kan det hende at kontoen din er kompromittert."; From aa77a76574cd377b9408e9f754add55435fcd5d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 13:59:45 +0000 Subject: [PATCH 187/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.1% (1120 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 0dd795a75..ad77b16ab 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1300,3 +1300,4 @@ "user_verification_session_details_additional_information_untrusted_other_user" = "Inntil denne brukeren bekrefter denne økten, blir meldinger sendt til og fra den merket med advarsler. Alternativt kan du bekrefte den manuelt."; "user_verification_session_details_verify_action_current_user_manually" = "Verifiser manuelt med tekst"; "user_verification_session_details_additional_information_untrusted_current_user" = "Hvis du ikke logget på denne økten, kan det hende at kontoen din er kompromittert."; +"user_verification_session_details_verify_action_other_user" = "Verifiser manuelt"; From 48c64219345c18a4514cedb80654ab1084bcce64 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:59:40 +0000 Subject: [PATCH 188/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.1% (1120 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index ad77b16ab..2da29f819 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1298,6 +1298,6 @@ "user_verification_session_details_information_untrusted_current_user" = "Bekreft denne økten for å markere den som klarert og gi den tilgang til krypterte meldinger:"; "user_verification_session_details_information_untrusted_other_user" = " logget på med en ny økt:"; "user_verification_session_details_additional_information_untrusted_other_user" = "Inntil denne brukeren bekrefter denne økten, blir meldinger sendt til og fra den merket med advarsler. Alternativt kan du bekrefte den manuelt."; -"user_verification_session_details_verify_action_current_user_manually" = "Verifiser manuelt med tekst"; +"user_verification_session_details_verify_action_current_user_manually" = "Bekreft manuelt med tekst"; "user_verification_session_details_additional_information_untrusted_current_user" = "Hvis du ikke logget på denne økten, kan det hende at kontoen din er kompromittert."; "user_verification_session_details_verify_action_other_user" = "Verifiser manuelt"; From 4089bba92f5fb0e5728587e506eee9bb58ce9695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 14:00:10 +0000 Subject: [PATCH 189/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.1% (1121 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 2da29f819..00d2f4e3d 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1301,3 +1301,7 @@ "user_verification_session_details_verify_action_current_user_manually" = "Bekreft manuelt med tekst"; "user_verification_session_details_additional_information_untrusted_current_user" = "Hvis du ikke logget på denne økten, kan det hende at kontoen din er kompromittert."; "user_verification_session_details_verify_action_other_user" = "Verifiser manuelt"; + +// MARK: - Secrets recovery + +"secrets_recovery_reset_action_part_1" = "Har du glemt eller mistet alle gjenopprettingsalternativene? "; From 9a9d79daab6f6663f2de72d871bc68e64b0d9fd2 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 13:59:52 +0000 Subject: [PATCH 190/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.1% (1121 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 00d2f4e3d..840ed7ead 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1300,7 +1300,7 @@ "user_verification_session_details_additional_information_untrusted_other_user" = "Inntil denne brukeren bekrefter denne økten, blir meldinger sendt til og fra den merket med advarsler. Alternativt kan du bekrefte den manuelt."; "user_verification_session_details_verify_action_current_user_manually" = "Bekreft manuelt med tekst"; "user_verification_session_details_additional_information_untrusted_current_user" = "Hvis du ikke logget på denne økten, kan det hende at kontoen din er kompromittert."; -"user_verification_session_details_verify_action_other_user" = "Verifiser manuelt"; +"user_verification_session_details_verify_action_other_user" = "Bekreft manuelt"; // MARK: - Secrets recovery From 02a8abb1f4cf65858be9fcbb290b35561904e40b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Tue, 18 May 2021 14:01:41 +0000 Subject: [PATCH 191/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.4% (1124 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 840ed7ead..73efca3c4 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1305,3 +1305,9 @@ // MARK: - Secrets recovery "secrets_recovery_reset_action_part_1" = "Har du glemt eller mistet alle gjenopprettingsalternativene? "; +"secrets_recovery_with_passphrase_information_default" = "Få tilgang til den historikken for sikre meldinger og kryssigneringsidentiteten din, for å bekrefte andre økter ved å skrive inn passordfrasen."; + +// Recover with passphrase + +"secrets_recovery_with_passphrase_title" = "Gjenopprettingsfrase"; +"secrets_recovery_reset_action_part_2" = "Tilbakestill alt"; From 964cdbfc7dbc63cd3c429264c7b53703e52cb4be Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Wed, 19 May 2021 07:00:55 +0000 Subject: [PATCH 192/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.7% (1128 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 73efca3c4..5800404d4 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -863,8 +863,8 @@ "room_info_list_several_members" = "% @ medlemmer"; "pin_protection_not_allowed_pin" = "Av sikkerhetsgrunner er denne PIN-koden ikke tilgjengelig. Prøv en annen PIN-kode"; "secrets_setup_recovery_passphrase_information" = "Skriv inn et sikkerhetsfrase bare du kjenner, brukt til å sikre hemmeligheter på serveren din."; -"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "bruk gjenopprettingsnøkkelen din"; -"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "bruk gjenopprettingsnøkkelen"; +"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "bruke gjenopprettingsnøkkelen din"; +"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "bruke gjenopprettingsnøkkelen"; "room_details_access_section_for_dm" = "Hvem har tilgang til dette?"; "identity_server_settings_place_holder" = "Legg inn en identitetsserver"; "identity_server_settings_description" = "Du bruker for øyeblikket %@ for å finne og bli funnet av dine eksisterende kontakter."; @@ -1311,3 +1311,4 @@ "secrets_recovery_with_passphrase_title" = "Gjenopprettingsfrase"; "secrets_recovery_reset_action_part_2" = "Tilbakestill alt"; +"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Kjenner du ikke gjennopprettingsfrasen din? Du kan "; From b4f77ca8864e7db49b1f17c6366d2d9bc878e9d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 06:59:12 +0000 Subject: [PATCH 193/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.7% (1128 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 5800404d4..4b0f11ea3 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1312,3 +1312,6 @@ "secrets_recovery_with_passphrase_title" = "Gjenopprettingsfrase"; "secrets_recovery_reset_action_part_2" = "Tilbakestill alt"; "secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Kjenner du ikke gjennopprettingsfrasen din? Du kan "; +"secrets_recovery_with_passphrase_recover_action" = "Bruk passordfrase"; +"secrets_recovery_with_passphrase_passphrase_placeholder" = "Skriv inn gjenopprettingsfrase"; +"secrets_recovery_with_passphrase_information_verify_device" = "Bruk gjenopprettingsfrasen for å bekrefte denne enheten."; From fa30eb157c9d7cd8d3ee1334961be4de7185efe9 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Tue, 18 May 2021 14:03:00 +0000 Subject: [PATCH 194/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.7% (1128 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 4b0f11ea3..85eb06bb1 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1305,7 +1305,7 @@ // MARK: - Secrets recovery "secrets_recovery_reset_action_part_1" = "Har du glemt eller mistet alle gjenopprettingsalternativene? "; -"secrets_recovery_with_passphrase_information_default" = "Få tilgang til den historikken for sikre meldinger og kryssigneringsidentiteten din, for å bekrefte andre økter ved å skrive inn passordfrasen."; +"secrets_recovery_with_passphrase_information_default" = "Få tilgang til meldingshistorikken for krypterte meldinger og kryssigneringsidentiteten din som brukes for å bekrefte andre økter, ved å skrive inn passordfrasen."; // Recover with passphrase From 93e993ddaa6503dccd34552a57f9997c7dab05dc Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Wed, 19 May 2021 07:01:25 +0000 Subject: [PATCH 195/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.9% (1130 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 85eb06bb1..a235523e2 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -862,7 +862,7 @@ "settings_pin_rooms_with_missed_notif" = "Fest rom med tapte varsler"; "room_info_list_several_members" = "% @ medlemmer"; "pin_protection_not_allowed_pin" = "Av sikkerhetsgrunner er denne PIN-koden ikke tilgjengelig. Prøv en annen PIN-kode"; -"secrets_setup_recovery_passphrase_information" = "Skriv inn et sikkerhetsfrase bare du kjenner, brukt til å sikre hemmeligheter på serveren din."; +"secrets_setup_recovery_passphrase_information" = "Skriv inn en sikkerhetsfrase bare du kjenner, brukt til å sikre hemmeligheter på serveren din."; "secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "bruke gjenopprettingsnøkkelen din"; "key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "bruke gjenopprettingsnøkkelen"; "room_details_access_section_for_dm" = "Hvem har tilgang til dette?"; From b7a08612aab268d2050ea6b1194a20d635fa0ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:01:21 +0000 Subject: [PATCH 196/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 92.9% (1130 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index a235523e2..57311b1df 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1315,3 +1315,8 @@ "secrets_recovery_with_passphrase_recover_action" = "Bruk passordfrase"; "secrets_recovery_with_passphrase_passphrase_placeholder" = "Skriv inn gjenopprettingsfrase"; "secrets_recovery_with_passphrase_information_verify_device" = "Bruk gjenopprettingsfrasen for å bekrefte denne enheten."; + +// Recovery passphrase + +"secrets_setup_recovery_passphrase_title" = "Angi en sikkerhetsfrase"; +"secrets_recovery_with_passphrase_lost_passphrase_action_part3" = "."; From b35c7e96e9355f4d5b2d1a58be25188cdff9ce80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:05:10 +0000 Subject: [PATCH 197/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.5% (1138 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 57311b1df..3e08f1433 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1320,3 +1320,14 @@ "secrets_setup_recovery_passphrase_title" = "Angi en sikkerhetsfrase"; "secrets_recovery_with_passphrase_lost_passphrase_action_part3" = "."; +"secrets_reset_warning_message" = "Du starter på nytt uten historikk, meldinger, pålitelige enheter eller pålitelige brukere."; +"secrets_reset_warning_title" = "Hvis du tilbakestiller alt"; +"secrets_reset_information" = "Gjør dette bare hvis du ikke har noen annen enhet du kan bekrefte denne enheten med."; + +// MARK: - Secrets reset + +"secrets_reset_title" = "Tilbakestill alt"; +"secrets_setup_recovery_passphrase_summary_information" = "Husk sikkerhetsfrasen. Den kan brukes til å låse opp krypterte meldinger og data."; +"secrets_setup_recovery_passphrase_summary_title" = "Lagre sikkerhetsfrasen din"; +"secrets_setup_recovery_passphrase_confirm_information" = "Skriv inn sikkerhetsfrasen igjen for å bekrefte den."; +"secrets_setup_recovery_passphrase_additional_information" = "Ikke bruk kontopassordet ditt."; From e995063cf4a2b516ef28933915ca0405e44c8476 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 19 May 2021 07:01:59 +0000 Subject: [PATCH 198/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.5% (1138 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 3e08f1433..76ce4d2da 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -862,7 +862,7 @@ "settings_pin_rooms_with_missed_notif" = "Fest rom med tapte varsler"; "room_info_list_several_members" = "% @ medlemmer"; "pin_protection_not_allowed_pin" = "Av sikkerhetsgrunner er denne PIN-koden ikke tilgjengelig. Prøv en annen PIN-kode"; -"secrets_setup_recovery_passphrase_information" = "Skriv inn en sikkerhetsfrase bare du kjenner, brukt til å sikre hemmeligheter på serveren din."; +"secrets_setup_recovery_passphrase_information" = "Skriv inn en sikkerhetsfrase bare du kjenner, brukes til å sikre hemmeligheter på serveren."; "secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "bruke gjenopprettingsnøkkelen din"; "key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "bruke gjenopprettingsnøkkelen"; "room_details_access_section_for_dm" = "Hvem har tilgang til dette?"; From 5645a982aa1467b59e3abcfdb6ce3c1d7d6ea1ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:06:39 +0000 Subject: [PATCH 199/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.8% (1141 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 76ce4d2da..132837fd1 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1331,3 +1331,6 @@ "secrets_setup_recovery_passphrase_summary_title" = "Lagre sikkerhetsfrasen din"; "secrets_setup_recovery_passphrase_confirm_information" = "Skriv inn sikkerhetsfrasen igjen for å bekrefte den."; "secrets_setup_recovery_passphrase_additional_information" = "Ikke bruk kontopassordet ditt."; +"cross_signing_setup_banner_subtitle" = "Verifiser de andre enhetene dine lettere"; +"secrets_reset_authentication_message" = "Skriv inn kontopassordet ditt for å bekrefte"; +"secrets_reset_reset_action" = "Tilbakestill"; From e75b0608c7d7fe84f092a0418fab0610c9818112 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 19 May 2021 07:05:38 +0000 Subject: [PATCH 200/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.8% (1141 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 132837fd1..10d93555c 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1320,7 +1320,7 @@ "secrets_setup_recovery_passphrase_title" = "Angi en sikkerhetsfrase"; "secrets_recovery_with_passphrase_lost_passphrase_action_part3" = "."; -"secrets_reset_warning_message" = "Du starter på nytt uten historikk, meldinger, pålitelige enheter eller pålitelige brukere."; +"secrets_reset_warning_message" = "Du starter på nytt uten historikk, meldinger, bekreftede enheter eller bekreftede brukere."; "secrets_reset_warning_title" = "Hvis du tilbakestiller alt"; "secrets_reset_information" = "Gjør dette bare hvis du ikke har noen annen enhet du kan bekrefte denne enheten med."; From 4310ba5efa1e3d11853ad4aef2f63d100b9beedc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:07:01 +0000 Subject: [PATCH 201/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.9% (1142 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 10d93555c..d391aabe6 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1334,3 +1334,7 @@ "cross_signing_setup_banner_subtitle" = "Verifiser de andre enhetene dine lettere"; "secrets_reset_authentication_message" = "Skriv inn kontopassordet ditt for å bekrefte"; "secrets_reset_reset_action" = "Tilbakestill"; + +// MARK: - Major update + +"major_update_title" = "Riot er nå Element"; From 329b75d732f29ebcbe39534ab2b536314f39c95f Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 19 May 2021 07:06:53 +0000 Subject: [PATCH 202/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 93.9% (1142 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index d391aabe6..fbeaccaa7 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1331,7 +1331,7 @@ "secrets_setup_recovery_passphrase_summary_title" = "Lagre sikkerhetsfrasen din"; "secrets_setup_recovery_passphrase_confirm_information" = "Skriv inn sikkerhetsfrasen igjen for å bekrefte den."; "secrets_setup_recovery_passphrase_additional_information" = "Ikke bruk kontopassordet ditt."; -"cross_signing_setup_banner_subtitle" = "Verifiser de andre enhetene dine lettere"; +"cross_signing_setup_banner_subtitle" = "Bekreft de andre enhetene dine lettere"; "secrets_reset_authentication_message" = "Skriv inn kontopassordet ditt for å bekrefte"; "secrets_reset_reset_action" = "Tilbakestill"; From 1e3adc159cedf148a2f3c657e98f30a2ae29b99d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:08:35 +0000 Subject: [PATCH 203/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 94.6% (1151 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index fbeaccaa7..3f7d7359b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1338,3 +1338,15 @@ // MARK: - Major update "major_update_title" = "Riot er nå Element"; +"pin_protection_settings_section_header_x" = "PIN-kode og% @"; +"pin_protection_mismatch_too_many_times_error_message" = "Hvis du ikke kan huske PIN-koden din, trykker du på glemt PIN-knappen."; +"pin_protection_mismatch_error_title" = "PIN-koder samsvarer ikke"; +"pin_protection_reset_alert_message" = "For å tilbakestille PIN-koden din, må du logge på igjen og opprette en ny"; +"pin_protection_forgot_pin" = "Glemt PIN-kode"; +"pin_protection_confirm_pin_to_change" = "Bekreft PIN-kode for å endre PIN-kode"; +"pin_protection_choose_pin_welcome_after_register" = "Velkommen."; + +// MARK: - PIN Protection + +"pin_protection_choose_pin_welcome_after_login" = "Velkommen tilbake."; +"major_update_information" = "Vi er glade for å kunngjøre at vi har byttet navn! Appen din er oppdatert, og du er logget på kontoen din."; From 88ec05ab598442a8005c373bdd4f1b295ad27a72 Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Wed, 19 May 2021 07:09:05 +0000 Subject: [PATCH 204/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 94.8% (1153 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 3f7d7359b..60aa2da7c 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -861,7 +861,7 @@ "settings_on_denied_notification" = "Varsler er ikke tillat for %@, vennligst tillat dem i enhetens innstillinger"; "settings_pin_rooms_with_missed_notif" = "Fest rom med tapte varsler"; "room_info_list_several_members" = "% @ medlemmer"; -"pin_protection_not_allowed_pin" = "Av sikkerhetsgrunner er denne PIN-koden ikke tilgjengelig. Prøv en annen PIN-kode"; +"pin_protection_not_allowed_pin" = "Av sikkerhetsårsaker er denne PIN-koden ikke tilgjengelig. Prøv en annen PIN-kode"; "secrets_setup_recovery_passphrase_information" = "Skriv inn en sikkerhetsfrase bare du kjenner, brukes til å sikre hemmeligheter på serveren."; "secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "bruke gjenopprettingsnøkkelen din"; "key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "bruke gjenopprettingsnøkkelen"; From f4b28ebda6223328d42fd0083c32af19e2ba8dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:08:59 +0000 Subject: [PATCH 205/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 94.8% (1153 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 60aa2da7c..9264a7613 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1350,3 +1350,5 @@ "pin_protection_choose_pin_welcome_after_login" = "Velkommen tilbake."; "major_update_information" = "Vi er glade for å kunngjøre at vi har byttet navn! Appen din er oppdatert, og du er logget på kontoen din."; +"pin_protection_settings_change_pin" = "Endre PIN-kode"; +"pin_protection_settings_section_footer" = "For å tilbakestille PIN-koden din, må du logge på igjen og opprette en ny."; From 308de58dcb513446b4977e0c0cf7f880f566665f Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 19 May 2021 07:08:47 +0000 Subject: [PATCH 206/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 94.8% (1153 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 9264a7613..2a3d43c55 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1338,7 +1338,7 @@ // MARK: - Major update "major_update_title" = "Riot er nå Element"; -"pin_protection_settings_section_header_x" = "PIN-kode og% @"; +"pin_protection_settings_section_header_x" = "PIN-kode og %@"; "pin_protection_mismatch_too_many_times_error_message" = "Hvis du ikke kan huske PIN-koden din, trykker du på glemt PIN-knappen."; "pin_protection_mismatch_error_title" = "PIN-koder samsvarer ikke"; "pin_protection_reset_alert_message" = "For å tilbakestille PIN-koden din, må du logge på igjen og opprette en ny"; From a7a12706b0b65d4b8ecc5d052f10fbfc62d8b5a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:10:29 +0000 Subject: [PATCH 207/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 95.2% (1158 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 2a3d43c55..6d674c372 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1352,3 +1352,8 @@ "major_update_information" = "Vi er glade for å kunngjøre at vi har byttet navn! Appen din er oppdatert, og du er logget på kontoen din."; "pin_protection_settings_change_pin" = "Endre PIN-kode"; "pin_protection_settings_section_footer" = "For å tilbakestille PIN-koden din, må du logge på igjen og opprette en ny."; +"biometrics_cant_unlocked_alert_message_x" = "For å låse opp, bruk% @ eller logg inn igjen og aktiver% @ en gang til"; +"biometrics_cant_unlocked_alert_title" = "Kan ikke låse opp appen"; +"biometrics_usage_reason" = "Autentisering er nødvendig for å få tilgang til appen din"; +"pin_protection_kick_user_alert_message" = "For mange feil, du har blitt logget ut"; +"pin_protection_explanatory" = "Ved å sette opp en PIN-kode kan du beskytte data som meldinger og kontakter, slik at bare du kan få tilgang til dem ved å skrive inn PIN-koden ved oppstart av appen."; From 6c928d2b0280fbf29266f6a480fc492237b2adc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:12:08 +0000 Subject: [PATCH 208/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 95.4% (1161 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 6d674c372..517fe0a8d 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1357,3 +1357,9 @@ "biometrics_usage_reason" = "Autentisering er nødvendig for å få tilgang til appen din"; "pin_protection_kick_user_alert_message" = "For mange feil, du har blitt logget ut"; "pin_protection_explanatory" = "Ved å sette opp en PIN-kode kan du beskytte data som meldinger og kontakter, slik at bare du kan få tilgang til dem ved å skrive inn PIN-koden ved oppstart av appen."; +"searchable_directory_x_network" = "%@ nettverk"; + +// MARK: - Searchable Directory View Controller + +"searchable_directory_create_new_room" = "Opprett et nytt rom"; +"biometrics_cant_unlocked_alert_message_login" = "Logg inn igjen"; From 7baa76a2a219c190f6e5ae5f612a894d79570dd1 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 19 May 2021 07:11:49 +0000 Subject: [PATCH 209/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 95.4% (1161 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 517fe0a8d..af645c04f 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1352,7 +1352,7 @@ "major_update_information" = "Vi er glade for å kunngjøre at vi har byttet navn! Appen din er oppdatert, og du er logget på kontoen din."; "pin_protection_settings_change_pin" = "Endre PIN-kode"; "pin_protection_settings_section_footer" = "For å tilbakestille PIN-koden din, må du logge på igjen og opprette en ny."; -"biometrics_cant_unlocked_alert_message_x" = "For å låse opp, bruk% @ eller logg inn igjen og aktiver% @ en gang til"; +"biometrics_cant_unlocked_alert_message_x" = "For å låse opp, bruk %@ eller logg inn igjen og aktiver %@ en gang til"; "biometrics_cant_unlocked_alert_title" = "Kan ikke låse opp appen"; "biometrics_usage_reason" = "Autentisering er nødvendig for å få tilgang til appen din"; "pin_protection_kick_user_alert_message" = "For mange feil, du har blitt logget ut"; From 967e8e062e93efe1a135feeda60af542151ba286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:13:09 +0000 Subject: [PATCH 210/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.2% (1170 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index af645c04f..80e437f55 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1363,3 +1363,15 @@ "searchable_directory_create_new_room" = "Opprett et nytt rom"; "biometrics_cant_unlocked_alert_message_login" = "Logg inn igjen"; +"create_room_section_footer_encryption" = "Kryptering kan ikke deaktiveres etterpå."; +"create_room_enable_encryption" = "Aktiver kryptering"; +"create_room_section_header_encryption" = "Romkryptering"; +"create_room_placeholder_topic" = "Tema"; +"create_room_section_header_topic" = "Romtema (valgfritt)"; +"create_room_placeholder_name" = "Navn"; +"create_room_section_header_name" = "Romnavn"; + +// MARK: - Create Room + +"create_room_title" = "Nytt rom"; +"searchable_directory_search_placeholder" = "Navn eller ID"; From 7f68e16591273536e5f0052d0921e1b807a127f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:13:24 +0000 Subject: [PATCH 211/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.2% (1171 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 80e437f55..290bc90b3 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1375,3 +1375,4 @@ "create_room_title" = "Nytt rom"; "searchable_directory_search_placeholder" = "Navn eller ID"; +"create_room_section_header_type" = "Romtype"; From 53a7bee0d602b2ec2f858456cea91ff2e80842f4 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 19 May 2021 07:13:16 +0000 Subject: [PATCH 212/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.2% (1171 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 290bc90b3..d682fb80a 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1363,7 +1363,7 @@ "searchable_directory_create_new_room" = "Opprett et nytt rom"; "biometrics_cant_unlocked_alert_message_login" = "Logg inn igjen"; -"create_room_section_footer_encryption" = "Kryptering kan ikke deaktiveres etterpå."; +"create_room_section_footer_encryption" = "Kryptering kan ikke deaktiveres senere."; "create_room_enable_encryption" = "Aktiver kryptering"; "create_room_section_header_encryption" = "Romkryptering"; "create_room_placeholder_topic" = "Tema"; From a0c459fbfb58a56af45d00081d3f978f65e554d4 Mon Sep 17 00:00:00 2001 From: Elise Cox Date: Wed, 19 May 2021 07:14:22 +0000 Subject: [PATCH 213/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.7% (1177 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index d682fb80a..87f731080 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -860,7 +860,7 @@ "settings_flair" = "Vis brukervalg hvor tillat"; "settings_on_denied_notification" = "Varsler er ikke tillat for %@, vennligst tillat dem i enhetens innstillinger"; "settings_pin_rooms_with_missed_notif" = "Fest rom med tapte varsler"; -"room_info_list_several_members" = "% @ medlemmer"; +"room_info_list_several_members" = "%@ medlemmer"; "pin_protection_not_allowed_pin" = "Av sikkerhetsårsaker er denne PIN-koden ikke tilgjengelig. Prøv en annen PIN-kode"; "secrets_setup_recovery_passphrase_information" = "Skriv inn en sikkerhetsfrase bare du kjenner, brukes til å sikre hemmeligheter på serveren."; "secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "bruke gjenopprettingsnøkkelen din"; From 7f2c350c41e041d737c817b852086dbecbdef024 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:14:15 +0000 Subject: [PATCH 214/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.7% (1177 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 87f731080..a98c20f81 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1376,3 +1376,12 @@ "create_room_title" = "Nytt rom"; "searchable_directory_search_placeholder" = "Navn eller ID"; "create_room_section_header_type" = "Romtype"; + +// MARK: - Room Info + +"room_info_list_one_member" = "1 medlem"; +"create_room_section_header_address" = "Romadresse"; +"create_room_show_in_directory" = "Vis rommet i romlisten"; +"create_room_section_footer_type" = "Folk blir bare med i et privat rom når de har fått rominvitasjon."; +"create_room_type_public" = "Offentlig rom"; +"create_room_type_private" = "Privat rom"; From 4ea0e3cbe6a894aa06b390639d397337b8740339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:14:58 +0000 Subject: [PATCH 215/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.8% (1178 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index a98c20f81..acd17b55b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1385,3 +1385,4 @@ "create_room_section_footer_type" = "Folk blir bare med i et privat rom når de har fått rominvitasjon."; "create_room_type_public" = "Offentlig rom"; "create_room_type_private" = "Privat rom"; +"room_info_list_section_other" = "Annen"; From c733e9f2521e8fe407d2e4959f995fc79f6b208e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:15:17 +0000 Subject: [PATCH 216/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.9% (1179 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index acd17b55b..368205f7d 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1386,3 +1386,6 @@ "create_room_type_public" = "Offentlig rom"; "create_room_type_private" = "Privat rom"; "room_info_list_section_other" = "Annen"; + +// MARK: - Dial Pad +"dialpad_title" = "Talltastaturet"; From 1d7e4e52e2ca70524025b050aeebd96cad5a6d14 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 19 May 2021 07:15:04 +0000 Subject: [PATCH 217/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 96.9% (1179 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 368205f7d..574c7a49e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1385,7 +1385,7 @@ "create_room_section_footer_type" = "Folk blir bare med i et privat rom når de har fått rominvitasjon."; "create_room_type_public" = "Offentlig rom"; "create_room_type_private" = "Privat rom"; -"room_info_list_section_other" = "Annen"; +"room_info_list_section_other" = "Andre"; // MARK: - Dial Pad "dialpad_title" = "Talltastaturet"; From b1ae6aea5e7aee3efa49fdc510e4a5137d8eeaee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:16:20 +0000 Subject: [PATCH 218/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 97.2% (1183 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 574c7a49e..1a6fe4150 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1389,3 +1389,9 @@ // MARK: - Dial Pad "dialpad_title" = "Talltastaturet"; +"call_transfer_contacts_recent" = "Nylig"; +"call_transfer_dialpad" = "Talltastatur"; +"call_transfer_users" = "Brukere"; + +// MARK: - Call Transfer +"call_transfer_title" = "Overføre"; From 1115ddf1182b418e6a987a4ca3ea89bb85db62d9 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 19 May 2021 07:15:39 +0000 Subject: [PATCH 219/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 97.2% (1183 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 1a6fe4150..6e20f864f 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1388,7 +1388,7 @@ "room_info_list_section_other" = "Andre"; // MARK: - Dial Pad -"dialpad_title" = "Talltastaturet"; +"dialpad_title" = "Talltastatur"; "call_transfer_contacts_recent" = "Nylig"; "call_transfer_dialpad" = "Talltastatur"; "call_transfer_users" = "Brukere"; From f22c22c460a4da60d89fa47cfa3b7ba733a03d99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:16:48 +0000 Subject: [PATCH 220/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 97.5% (1186 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 6e20f864f..aa7d03aad 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -843,7 +843,7 @@ // MARK: - Favourites -"favourites_empty_view_title" = "Favorittrom og personer"; +"favourites_empty_view_title" = "Favorittrom og -personer"; "create_room_placeholder_address" = "#testrom: matrix.org"; "device_verification_emoji_santa" = "Julenisse"; "device_verification_security_advice_emoji" = "Sammenlign de unike emojiene og sjekk at de vises i samme rekkefølge."; @@ -1395,3 +1395,6 @@ // MARK: - Call Transfer "call_transfer_title" = "Overføre"; +"call_transfer_error_message" = "Samtaleoverføring mislyktes"; +"call_transfer_error_title" = "Feil"; +"call_transfer_contacts_all" = "Alle"; From 5b340fedeb8c01c65965d0ebafa17cf2987fee01 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 19 May 2021 07:16:24 +0000 Subject: [PATCH 221/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 97.5% (1186 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index aa7d03aad..f317f3b00 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1389,7 +1389,7 @@ // MARK: - Dial Pad "dialpad_title" = "Talltastatur"; -"call_transfer_contacts_recent" = "Nylig"; +"call_transfer_contacts_recent" = "Nylige"; "call_transfer_dialpad" = "Talltastatur"; "call_transfer_users" = "Brukere"; From 77d4032406f42793ef99839ce277b9d12597b460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:17:38 +0000 Subject: [PATCH 222/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 97.6% (1187 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index f317f3b00..297db608b 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1398,3 +1398,4 @@ "call_transfer_error_message" = "Samtaleoverføring mislyktes"; "call_transfer_error_title" = "Feil"; "call_transfer_contacts_all" = "Alle"; +"favourites_empty_view_information" = "Du kan legge til favoritter på flere måter - det raskeste er bare å trykke og holde nede. Trykk på stjernen, så vises de automatisk her og er lett tilgjengelig."; From f111b7aea04a05bd729b1deb934a3a7b34509424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:17:50 +0000 Subject: [PATCH 223/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 97.6% (1188 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 297db608b..4638b177e 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1399,3 +1399,4 @@ "call_transfer_error_title" = "Feil"; "call_transfer_contacts_all" = "Alle"; "favourites_empty_view_information" = "Du kan legge til favoritter på flere måter - det raskeste er bare å trykke og holde nede. Trykk på stjernen, så vises de automatisk her og er lett tilgjengelig."; +"invite_friends_share_text" = "Hei, snakk med meg på% @:% @"; From ff970a25fa6547c07b05ec5df2076afcb79e1fc4 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 19 May 2021 07:17:46 +0000 Subject: [PATCH 224/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 97.6% (1188 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 4638b177e..6573a92af 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1398,5 +1398,5 @@ "call_transfer_error_message" = "Samtaleoverføring mislyktes"; "call_transfer_error_title" = "Feil"; "call_transfer_contacts_all" = "Alle"; -"favourites_empty_view_information" = "Du kan legge til favoritter på flere måter - det raskeste er bare å trykke og holde nede. Trykk på stjernen, så vises de automatisk her og er lett tilgjengelig."; +"favourites_empty_view_information" = "Du kan legge til favoritter på flere måter - det raskeste er bare å trykke og holde nede. Trykk på stjernen, så vises de automatisk her og er lett tilgjengelige."; "invite_friends_share_text" = "Hei, snakk med meg på% @:% @"; From 324e2e3a68733325a9d0ff8d3d083485ae9f9d53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:18:38 +0000 Subject: [PATCH 225/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.0% (1192 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 6573a92af..38636afc1 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1400,3 +1400,13 @@ "call_transfer_contacts_all" = "Alle"; "favourites_empty_view_information" = "Du kan legge til favoritter på flere måter - det raskeste er bare å trykke og holde nede. Trykk på stjernen, så vises de automatisk her og er lett tilgjengelige."; "invite_friends_share_text" = "Hei, snakk med meg på% @:% @"; +"room_intro_cell_information_room_sentence1_part1" = "Dette er begynnelsen på "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Legg til personer"; +"room_avatar_view_accessibility_hint" = "Bytt rombilde"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "avatar"; From 5c9b67aa11d29c5b98689d5665ff29de1b885bd3 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Wed, 19 May 2021 07:18:07 +0000 Subject: [PATCH 226/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.0% (1192 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 38636afc1..a9086c5cd 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1399,7 +1399,7 @@ "call_transfer_error_title" = "Feil"; "call_transfer_contacts_all" = "Alle"; "favourites_empty_view_information" = "Du kan legge til favoritter på flere måter - det raskeste er bare å trykke og holde nede. Trykk på stjernen, så vises de automatisk her og er lett tilgjengelige."; -"invite_friends_share_text" = "Hei, snakk med meg på% @:% @"; +"invite_friends_share_text" = "Hei, snakk med meg på %@: %@"; "room_intro_cell_information_room_sentence1_part1" = "Dette er begynnelsen på "; // Mark: - Room creation introduction cell From 599d4218cd21d10be117338ac68ee17dd000cd93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:18:56 +0000 Subject: [PATCH 227/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.1% (1193 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index a9086c5cd..86b9427c7 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1410,3 +1410,4 @@ // Mark: - Room avatar view "room_avatar_view_accessibility_label" = "avatar"; +"room_intro_cell_information_room_sentence1_part3" = ". "; From 40d87a8bdb530d5d4752d5ee7790d6a2bb408651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:19:03 +0000 Subject: [PATCH 228/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.1% (1194 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 86b9427c7..1c47c1286 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1411,3 +1411,4 @@ "room_avatar_view_accessibility_label" = "avatar"; "room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_with_topic_sentence2" = "Tema: %@"; From f824a2f64e7e0dd0af750ce99b72acdbac48ba8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:19:28 +0000 Subject: [PATCH 229/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.3% (1196 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 1c47c1286..32ed09aef 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1412,3 +1412,5 @@ "room_avatar_view_accessibility_label" = "avatar"; "room_intro_cell_information_room_sentence1_part3" = ". "; "room_intro_cell_information_room_with_topic_sentence2" = "Tema: %@"; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " for å fortelle folk hva dette rommet handler om."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Legg til et tema"; From 73e2cd16949acad4155f057b90a9a09523fe7da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:19:58 +0000 Subject: [PATCH 230/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.4% (1197 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 32ed09aef..e73d81b5d 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1414,3 +1414,4 @@ "room_intro_cell_information_room_with_topic_sentence2" = "Tema: %@"; "room_intro_cell_information_room_without_topic_sentence2_part2" = " for å fortelle folk hva dette rommet handler om."; "room_intro_cell_information_room_without_topic_sentence2_part1" = "Legg til et tema"; +"room_intro_cell_information_dm_sentence1_part1" = "Dette er begynnelsen på din direktemelding med "; From 2a00851153b0d5a360a48ee2b1bfdb35fe2e28b9 Mon Sep 17 00:00:00 2001 From: Ville Ranki Date: Tue, 18 May 2021 15:01:38 +0000 Subject: [PATCH 231/393] Translated using Weblate (Finnish) Currently translated at 100.0% (6 of 6 strings) Translation: Element iOS/Element iOS (Dialogs) Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/fi/ --- Riot/Assets/fi.lproj/InfoPlist.strings | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/fi.lproj/InfoPlist.strings b/Riot/Assets/fi.lproj/InfoPlist.strings index 51988aa6f..fa0b1a29a 100644 --- a/Riot/Assets/fi.lproj/InfoPlist.strings +++ b/Riot/Assets/fi.lproj/InfoPlist.strings @@ -2,4 +2,6 @@ "NSCameraUsageDescription" = "Kameralla otetaan kuvia ja videota sekä soitetaan videopuheluita."; "NSPhotoLibraryUsageDescription" = "Kuvakirjastoa käytetään kuvien ja videoiden lähetykseen."; "NSMicrophoneUsageDescription" = "Mikrofonia käytetään puheluissa."; -"NSContactsUsageDescription" = "Jotta Riot ja Matrix yhteyshenkilösi voidaan näyttää, tulee sähköpostosoitteesi ja puhelinnumerosi lähettää identiteettipalvelimelle. New Vector ei tallenna tietoja. Tarvittaessa saat lisätietoja sovelluksen asetussivulta."; +"NSContactsUsageDescription" = "Element voi lähettää sähköpostisoitteesi ja puhelinnumerosi valitsemallesi identiteettipalvelimelle, jos haluat että Matrixia käyttävät kontaktisi löytyvät automaattisesti. Henkilötiedot salataan, jos se on mahdollista. Tutustu halutessasi käyttämäsi palvelimen käyttöehtoihin."; +"NSFaceIDUsageDescription" = "Face ID:tä käytetään sovelluksen avaamiseen."; +"NSCalendarsUsageDescription" = "Katso tapahtumasi sovelluksessa."; From 7a4cf2e59af830776d98d57601010174ac578103 Mon Sep 17 00:00:00 2001 From: Thor Arne Johansen Date: Thu, 20 May 2021 11:41:07 +0000 Subject: [PATCH 232/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.6% (1200 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index e73d81b5d..01ad47791 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -5,7 +5,7 @@ "title_groups" = "Samfunn"; "warning" = "Advarsel"; // Actions -"view" = "Vis"; +"view" = "Visning"; "next" = "Neste"; "back" = "Tilbake"; "continue" = "Fortsett"; @@ -14,9 +14,9 @@ "leave" = "Forlat"; "remove" = "Fjern"; "invite" = "Inviter"; -"retry" = "Prøv igjen"; +"retry" = "Prøv på nytt"; "off" = "Av"; -"cancel" = "Lukk"; +"cancel" = "Avbryt"; "save" = "Lagre"; "join" = "Bli med"; "decline" = "Avslå"; @@ -857,7 +857,7 @@ "room_details_flair_section" = "Vis assosiasjon for samfunn"; "room_details_photo_for_dm" = "Bilde"; "room_details_photo" = "Rombilde"; -"settings_flair" = "Vis brukervalg hvor tillat"; +"settings_flair" = "Vis kobling hvor tillatt"; "settings_on_denied_notification" = "Varsler er ikke tillat for %@, vennligst tillat dem i enhetens innstillinger"; "settings_pin_rooms_with_missed_notif" = "Fest rom med tapte varsler"; "room_info_list_several_members" = "%@ medlemmer"; @@ -873,7 +873,7 @@ "settings_discovery_no_identity_server" = "Du bruker for øyeblikket ikke en identitetsserver. Legg til en for at dine eksisterende kontakter skal kunne finne deg."; "settings_unignore_user" = "Vis alle meldinger fra %@?"; "device_verification_cancelled" = "Den andre parten avbrøt verifiseringen."; -"settings_callkit_info" = "Motta innkommende samtale på låst skjerm. Se dine anrop i systemets anropshistorikk. Hvis iCloud er aktivert, vil anropshistorikken blir delt med Apple."; +"settings_callkit_info" = "Motta innkommende samtale på låst skjerm. Se dine anrop i systemets anropshistorikk. Hvis iCloud er aktivert, vil anropshistorikken bli delt med Apple."; //"settings_enable_all_notif" = "Enable all notifications"; //"settings_messages_my_display_name" = "Msg containing my display name"; //"settings_messages_my_user_name" = "Msg containing my user name"; @@ -882,7 +882,7 @@ //"settings_join_leave_rooms" = "When people join or leave rooms"; //"settings_call_invitations" = "Call invitations"; -"settings_enable_callkit" = "Integrert/Innebygd anrop"; +"settings_enable_callkit" = "Integrert anrop"; "settings_calls_stun_server_fallback_button" = "Tillat bruk av STUN støtteserver ved anrop"; "settings_calls_stun_server_fallback_description" = "Tillat bruk av %@ STUN støtteserver ved anrop, når din hovedserver ikke tilbyr dette (din IP adresse vil bli delt under samtalen)."; "settings_integrations_allow_description" = "Bruk integrasjonsadministrator (%@) for å administrere bots, bridges, widgets og sticker packs.\n\nIntegrasjonsadministrator mottar konfigurasjonsdata, og kan endre widgets, sende rominvitasjoner og sette tilgangsnivåer på dine vegne."; @@ -1311,7 +1311,7 @@ "secrets_recovery_with_passphrase_title" = "Gjenopprettingsfrase"; "secrets_recovery_reset_action_part_2" = "Tilbakestill alt"; -"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Kjenner du ikke gjennopprettingsfrasen din? Du kan "; +"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Kjenner du ikke gjenopprettingsfrasen din? Du kan "; "secrets_recovery_with_passphrase_recover_action" = "Bruk passordfrase"; "secrets_recovery_with_passphrase_passphrase_placeholder" = "Skriv inn gjenopprettingsfrase"; "secrets_recovery_with_passphrase_information_verify_device" = "Bruk gjenopprettingsfrasen for å bekrefte denne enheten."; @@ -1414,4 +1414,4 @@ "room_intro_cell_information_room_with_topic_sentence2" = "Tema: %@"; "room_intro_cell_information_room_without_topic_sentence2_part2" = " for å fortelle folk hva dette rommet handler om."; "room_intro_cell_information_room_without_topic_sentence2_part1" = "Legg til et tema"; -"room_intro_cell_information_dm_sentence1_part1" = "Dette er begynnelsen på din direktemelding med "; +"room_intro_cell_information_dm_sentence1_part1" = "Dette er begynnelsen på dine direktemeldinger med "; From 76b9249533442a16cc264e22d9569d5271a5ffb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tove=20Virata=20Br=C3=A5then?= Date: Wed, 19 May 2021 07:20:33 +0000 Subject: [PATCH 233/393] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.6% (1200 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/nb_NO/ --- Riot/Assets/nb-NO.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index 01ad47791..a3739e017 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -1415,3 +1415,6 @@ "room_intro_cell_information_room_without_topic_sentence2_part2" = " for å fortelle folk hva dette rommet handler om."; "room_intro_cell_information_room_without_topic_sentence2_part1" = "Legg til et tema"; "room_intro_cell_information_dm_sentence1_part1" = "Dette er begynnelsen på dine direktemeldinger med "; +"room_intro_cell_information_multiple_dm_sentence2" = "Bare dere er i denne samtalen, med mindre noen av dere inviterer andre til å bli med."; +"room_intro_cell_information_dm_sentence2" = "Bare dere to er i denne samtalen, ingen andre kan bli med."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; From 0f6fe9b42e22e708613879383b5d3758c82cd486 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Thu, 20 May 2021 12:32:58 +0000 Subject: [PATCH 234/393] Translated using Weblate (Chinese (Simplified)) Currently translated at 89.9% (1094 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/zh_Hans/ --- Riot/Assets/zh_Hans.lproj/Vector.strings | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Riot/Assets/zh_Hans.lproj/Vector.strings b/Riot/Assets/zh_Hans.lproj/Vector.strings index 858143d2f..5de9787e8 100644 --- a/Riot/Assets/zh_Hans.lproj/Vector.strings +++ b/Riot/Assets/zh_Hans.lproj/Vector.strings @@ -179,7 +179,7 @@ "room_participants_action_start_video_call" = "发起视频通话"; "room_participants_action_mention" = "提及"; // Chat -"room_jump_to_first_unread" = "跳到第一条未读信息"; +"room_jump_to_first_unread" = "跳到未读信息"; "room_new_message_notification" = "%d 条未读消息"; "room_new_messages_notification" = "%d 条未读消息"; "room_one_user_is_typing" = "%@ 正在输入…"; @@ -1136,7 +1136,7 @@ "callbar_active_and_single_paused" = "1 个进行中通话(%@)· 1 个已暂停通话"; // Call Bar -"callbar_only_single_active" = "进行中通话(%@)"; +"callbar_only_single_active" = "轻按返回通话(%@)"; "callbar_only_multiple_paused" = "%@ 个已暂停通话"; "callbar_only_single_paused" = "已暂停通话"; "callbar_return" = "返回"; From 318bc423f104ebca826db0b04bfc86e04a0ad47b Mon Sep 17 00:00:00 2001 From: Fred Date: Wed, 19 May 2021 11:05:40 +0000 Subject: [PATCH 235/393] Translated using Weblate (German) Currently translated at 99.1% (1206 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 1aa4ccd1e..0d92470c3 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -1309,7 +1309,7 @@ "event_formatter_call_back" = "Zurückrufen"; "event_formatter_call_you_declined" = "Du lehntest diesen Anruf ab"; "event_formatter_call_you_currently_in" = "Du bist aktuell in diesem Anruf"; -"event_formatter_call_has_ended" = "Dieser Anruf ist beendet"; +"event_formatter_call_has_ended" = "%@ beendet"; "event_formatter_call_video" = "Videoanruf"; "event_formatter_call_voice" = "Sprachanruf"; "settings_show_NSFW_public_rooms" = "Öffentliche Räume mit anstößigen Inhalte anzeigen"; From 8172c4bf5b769404f9452554b94eed73d98d3878 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Mon, 17 May 2021 19:36:53 +0000 Subject: [PATCH 236/393] Translated using Weblate (Swedish) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sv/ --- Riot/Assets/sv.lproj/Vector.strings | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Riot/Assets/sv.lproj/Vector.strings b/Riot/Assets/sv.lproj/Vector.strings index 0830ceac4..4ee654d30 100644 --- a/Riot/Assets/sv.lproj/Vector.strings +++ b/Riot/Assets/sv.lproj/Vector.strings @@ -1311,3 +1311,13 @@ // Chat "room_slide_to_end_group_call" = "Glid för att avsluta samtalet för alla"; "callbar_only_single_active_group" = "Tryck för att gå med i gruppsamtalet (%@)"; +"space_beta_announce_information" = "Utrymmen är ett nytt sätt att gruppera rum och personer. De finns inte på iOS än, men du kan använda dem på webben och skrivbord."; +"space_beta_announce_subtitle" = "Den nya versionen av gemenskaper"; +"space_beta_announce_title" = "Utrymmen kommer snart"; +"space_beta_announce_badge" = "BETA"; +"space_feature_unavailable_information" = "Utrymmen är ett nytt sätt att gruppera rum och personer.\n\nDe kommer att finnas här snart. För tillfället, om du går med i ett på en annan plattform så kommer du komma åt rum som går med i här."; +"space_feature_unavailable_subtitle" = "Utrymmen finns inte på iOS än, men du kan använde dem på webben och skrivbord"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Utrymmen är inte här än"; From c8a39a2a0a1ef9394f0544a08f1edcbde6a869de Mon Sep 17 00:00:00 2001 From: sr093906 Date: Thu, 20 May 2021 12:43:36 +0000 Subject: [PATCH 237/393] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (35 of 35 strings) Translation: Element iOS/Element iOS (Push) Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-push/zh_Hans/ --- Riot/Assets/zh_Hans.lproj/Localizable.strings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Assets/zh_Hans.lproj/Localizable.strings b/Riot/Assets/zh_Hans.lproj/Localizable.strings index 7ff0fb738..91dabf52a 100644 --- a/Riot/Assets/zh_Hans.lproj/Localizable.strings +++ b/Riot/Assets/zh_Hans.lproj/Localizable.strings @@ -67,3 +67,9 @@ /* New message indicator on unknown room */ "MESSAGE" = "消息"; + +/* Group call from user, CallKit caller name */ +"GROUP_CALL_FROM_USER" = "%@ (群组通话)"; + +/* A user added a Jitsi call to a room */ +"GROUP_CALL_STARTED" = "群组通话已启动"; From 32671f418975e4bc4e7679da665c88a6430f08a3 Mon Sep 17 00:00:00 2001 From: Fred Date: Mon, 24 May 2021 16:45:34 +0000 Subject: [PATCH 238/393] Translated using Weblate (German) Currently translated at 99.3% (1208 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 0d92470c3..00ffbfd37 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -160,7 +160,7 @@ "room_unsent_messages_notification" = "Nachrichten wurden nicht gesendet."; "room_unsent_messages_unknown_devices_notification" = "Nachrichten wurden nicht gesendet, da unbekannte Sitzungen vorhanden waren."; "room_prompt_resend" = "alle erneut senden"; -"room_prompt_cancel" = "alles abbrechen"; +"room_prompt_cancel" = "Alles abbrechen"; "room_resend_unsent_messages" = "Ungesendete Nachrichten erneut senden"; "room_delete_unsent_messages" = "Lösche ungesendete Nachrichten"; "room_event_action_copy" = "Kopieren"; @@ -1308,7 +1308,7 @@ "call_actions_unhold" = "Fortsetzen"; "event_formatter_call_back" = "Zurückrufen"; "event_formatter_call_you_declined" = "Du lehntest diesen Anruf ab"; -"event_formatter_call_you_currently_in" = "Du bist aktuell in diesem Anruf"; +"event_formatter_call_you_currently_in" = "Aktuelles Gespräch"; "event_formatter_call_has_ended" = "%@ beendet"; "event_formatter_call_video" = "Videoanruf"; "event_formatter_call_voice" = "Sprachanruf"; From bda5ecb402064ab49e6bed511b0edb31164f572b Mon Sep 17 00:00:00 2001 From: libexus Date: Mon, 24 May 2021 21:14:09 +0000 Subject: [PATCH 239/393] Translated using Weblate (German) Currently translated at 99.5% (1210 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 00ffbfd37..1c24f2e85 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -1308,7 +1308,7 @@ "call_actions_unhold" = "Fortsetzen"; "event_formatter_call_back" = "Zurückrufen"; "event_formatter_call_you_declined" = "Du lehntest diesen Anruf ab"; -"event_formatter_call_you_currently_in" = "Aktuelles Gespräch"; +"event_formatter_call_you_currently_in" = "Aktueller Anruf"; "event_formatter_call_has_ended" = "%@ beendet"; "event_formatter_call_video" = "Videoanruf"; "event_formatter_call_voice" = "Sprachanruf"; @@ -1361,3 +1361,4 @@ // Chat "room_slide_to_end_group_call" = "Wische, um den Anruf für alle zu beenden"; "callbar_only_single_active_group" = "Klicke, um den Anruf beizutreten"; +"event_formatter_call_answer" = "Annehmen"; From f03b2ba2be84945c67776d75bb8c52cf3bcd50d0 Mon Sep 17 00:00:00 2001 From: Fred Date: Mon, 24 May 2021 16:46:01 +0000 Subject: [PATCH 240/393] Translated using Weblate (German) Currently translated at 99.5% (1210 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 1c24f2e85..0f2f241ca 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -1350,7 +1350,7 @@ "event_formatter_call_end_call" = "Anruf beenden"; "event_formatter_call_retry" = "Erneut versuchen"; "event_formatter_call_decline" = "Ablehnen"; -"event_formatter_call_connection_failed" = "Verbindung getrennt"; +"event_formatter_call_connection_failed" = "Verbindung fehlgeschlagen"; "event_formatter_call_you_missed" = "Anruf verpasst"; "event_formatter_call_ringing" = "Läuten…"; "event_formatter_call_connecting" = "Verbinden…"; From 0d0cea1ae81aeb3d192035862e4361319de7d9ea Mon Sep 17 00:00:00 2001 From: Thibault Martin Date: Sun, 23 May 2021 21:40:57 +0000 Subject: [PATCH 241/393] Translated using Weblate (French) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/fr/ --- Riot/Assets/fr.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/fr.lproj/Vector.strings b/Riot/Assets/fr.lproj/Vector.strings index 86d6fc97d..fcc72186c 100644 --- a/Riot/Assets/fr.lproj/Vector.strings +++ b/Riot/Assets/fr.lproj/Vector.strings @@ -1362,7 +1362,7 @@ "less" = "Moins"; "more" = "Plus"; "switch" = "Basculer"; -"joined" = "Arrivé"; +"joined" = "Rejoint"; "store_promotional_text" = "Application de messagerie et collaboration respectueuse de la vie privée, sur un réseau ouvert. Décentralisée pour vous donner le contrôle. Pas d’extraction de vos données, pas de porte dérobée, pas d’accès réservé à des tiers."; "room_details_search" = "Rechercher dans le salon"; "room_details_integrations" = "Intégrations"; From e9ae0b1bb880d030ae3b0abbc90eff23e608e7f0 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Tue, 25 May 2021 16:14:23 +0000 Subject: [PATCH 242/393] Translated using Weblate (Albanian) Currently translated at 99.6% (1212 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sq/ --- Riot/Assets/sq.lproj/Vector.strings | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index 5277cec95..7b82f3760 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -1364,3 +1364,13 @@ // Chat "room_slide_to_end_group_call" = "Rrëshqiteni, që të përfundohet thirrja për këdo"; "callbar_only_single_active_group" = "Prekeni, që të Hyni në thirrjen e grupit (%@)"; +"space_beta_announce_information" = "Hapësirat janë një rrugë e re për të grupuar dhoma dhe njerëz. Ende s’janë në iOS, por mund t’i përdorni që tani në Web dhe Desktop."; +"space_beta_announce_subtitle" = "Versioni i ri i bashkësive"; +"space_beta_announce_title" = "Hapësirat vijnë së shpejti"; +"space_beta_announce_badge" = "BETA"; +"space_feature_unavailable_information" = "Hapësirat janë një rrugë e re për të grupuar dhoma dhe njerëz.\n\nDo vijnë së shpejti edhe këtu. Për tani, nëse bëheni pjesë e një të tille në një platformë tjetër, do të jeni në gjendje të hyni në cilëndo dhomë ku hyni prej këtu."; +"space_feature_unavailable_subtitle" = "Hapësirat s’janë ende në iOS, por mund t’i përdorni që tani në Web dhe Desktop"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Hapësirat s’kanë ardhur ende"; From 9c846db21d2119e967b3a18d2e7e446e2541e681 Mon Sep 17 00:00:00 2001 From: Percy Date: Fri, 28 May 2021 13:53:03 +0000 Subject: [PATCH 243/393] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/zh_Hans/ --- Riot/Assets/zh_Hans.lproj/Vector.strings | 164 ++++++++++++++++++++++- 1 file changed, 159 insertions(+), 5 deletions(-) diff --git a/Riot/Assets/zh_Hans.lproj/Vector.strings b/Riot/Assets/zh_Hans.lproj/Vector.strings index 5de9787e8..7621e4bb4 100644 --- a/Riot/Assets/zh_Hans.lproj/Vector.strings +++ b/Riot/Assets/zh_Hans.lproj/Vector.strings @@ -328,8 +328,8 @@ "room_details_new_address_placeholder" = "添加新地址(例如 #foo%@)"; "room_details_addresses_invalid_address_prompt_title" = "别名格式无效"; "room_details_addresses_invalid_address_prompt_msg" = "%@ 不是一个有效的别名格式"; -"room_details_addresses_disable_main_address_prompt_title" = "主地址警告"; -"room_details_addresses_disable_main_address_prompt_msg" = "您没有指定主地址。此聊天室的默认主地址会随机选取"; +"room_details_addresses_disable_main_address_prompt_title" = "主要地址警告"; +"room_details_addresses_disable_main_address_prompt_msg" = "您没有指定主要地址。此聊天室的默认主要地址会随机选取"; "room_details_banned_users_section" = "封禁的用户"; "room_details_advanced_section" = "高级"; "room_details_advanced_room_id" = "聊天室 ID:"; @@ -347,11 +347,11 @@ "room_details_fail_to_update_history_visibility" = "更新历史可见性失败"; "room_details_fail_to_add_room_aliases" = "添加新聊天室地址失败"; "room_details_fail_to_remove_room_aliases" = "移除聊天室地址失败"; -"room_details_fail_to_update_room_canonical_alias" = "更新主地址失败"; +"room_details_fail_to_update_room_canonical_alias" = "更新主要地址失败"; "room_details_fail_to_enable_encryption" = "为此聊天室启用加密失败"; "room_details_save_changes_prompt" = "您要保存更改吗?"; -"room_details_set_main_address" = "设置为主地址"; -"room_details_unset_main_address" = "取消设置主地址"; +"room_details_set_main_address" = "设置为主要地址"; +"room_details_unset_main_address" = "取消设置主要地址"; "room_details_copy_room_id" = "复制聊天室 ID"; "room_details_copy_room_address" = "复制聊天室地址"; "room_details_copy_room_url" = "复制聊天室 URL"; @@ -1246,3 +1246,157 @@ "room_info_list_one_member" = "1 位成员"; "security_settings_secure_backup" = "安全备份"; +"space_beta_announce_information" = "空间是一种将聊天室和人们进行分组的新方式。它们在 iOS 上尚不可用,但你现在可以在网页端和桌面端上使用。"; +"space_beta_announce_subtitle" = "新版社群"; +"space_beta_announce_title" = "空间即将到来"; +"space_beta_announce_badge" = "测试版"; +"space_feature_unavailable_information" = "空间是一种将将聊天室和人们进行分组的新方式。\n\n他们即将到来。现在,如果你在另一个平台上加入其中一个空间,你将能够进入你在这里加入的任何聊天室。"; +"space_feature_unavailable_subtitle" = "空间在 iOS 上尚不可用,但你现在可以在网页端和桌面端上使用它"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "此处不存在空间"; +"room_intro_cell_information_multiple_dm_sentence2" = "仅有你在此对话中,除非你邀请其他人加入。"; +"room_intro_cell_information_dm_sentence2" = "仅有你们两个在此对话中,没有其他人可以加入。"; +"room_intro_cell_information_dm_sentence1_part1" = "这是你私信的开始: "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " 让大家知道此聊天室是做什么的。"; +"room_intro_cell_information_room_sentence1_part1" = "这是一切的开始: "; +"invite_friends_share_text" = "嗨,在 %@ 跟我说:%@"; +"favourites_empty_view_information" = "你可以选择几种方法 - 最快只需按住。点击星星,它们会自动出现在这里,以确保安全。"; +"home_empty_view_information" = "团队、朋友和组织的一体化安全聊天应用程序。 点击下面的「+」按钮添加人员和聊天室。"; +"create_room_show_in_directory" = "在目录中显示聊天室"; +"create_room_section_footer_type" = "人们只有在收到聊天室邀请后才可以进入私有房间。"; +"create_room_type_public" = "公开聊天室"; +"create_room_type_private" = "私有聊天室"; +"biometrics_cant_unlocked_alert_message_login" = "重新登录"; +"biometrics_cant_unlocked_alert_message_x" = "若要解锁,请使用 %@ 或重新登录并启用 %@"; +"biometrics_cant_unlocked_alert_title" = "无法解锁应用程序"; +"biometrics_usage_reason" = "访问应用程序需要身份验证"; +"biometrics_setup_subtitle" = "节省自己的时间"; +"pin_protection_kick_user_alert_message" = "错误次数过多,你已被登出"; +"pin_protection_explanatory" = "设置 PIN 允许你保护像消息和联系人等数据,因此只有在应用程序开始时输入 PIN,只能访问它们。"; +"pin_protection_not_allowed_pin" = "出于安全原因,此 PIN 不可用。请尝试其他 PIN"; +"pin_protection_settings_change_pin" = "更改 PIN"; +"pin_protection_settings_enable_pin" = "启用 PIN"; +"pin_protection_settings_enabled_forced" = "PIN 已启用"; +"pin_protection_settings_section_footer" = "要重置你的密码,你需要重新登录并创建一个新的。"; +"pin_protection_settings_section_header_x" = "PIN & %@"; +"pin_protection_mismatch_too_many_times_error_message" = "如果你没记不住你的 PIN,点击忘记密码按钮。"; +"pin_protection_mismatch_error_title" = "PIN 不匹配"; +"pin_protection_reset_alert_message" = "为重置你的 PIN,你将需要重新登录并创建新的"; +"pin_protection_reset_alert_title" = "重置 PIN"; +"pin_protection_forgot_pin" = "忘记 PIN"; +"pin_protection_enter_pin" = "输入你的 PIN"; +"pin_protection_confirm_pin_to_change" = "确认 PIN 并更改 PIN"; +"pin_protection_confirm_pin_to_disable" = "确认 PIN 并禁用 PIN"; +"pin_protection_confirm_pin" = "验证你的 PIN"; +"pin_protection_choose_pin" = "创建 PIN 以确保安全"; +"major_update_done_action" = "知道了"; +"major_update_information" = "我们很激动地宣布,我们改名了!你的应用程序是最新的,你已经登录了你的帐户。"; +"cross_signing_setup_banner_subtitle" = "更容易验证你的其他设备"; + +// MARK: - Cross-signing + +// Banner + +"cross_signing_setup_banner_title" = "设置加密"; +"secrets_reset_authentication_message" = "请输入你的帐户密码进行确认"; +"secrets_reset_warning_message" = "您将重新启动,没有历史记录,消息,受信任的设备或受信任的用户。"; +"secrets_reset_warning_title" = "如果你选择全部重置"; +"secrets_reset_information" = "仅当没有其他设备可用来验证此设备时,才执行此操作。"; + +// MARK: - Secrets reset + +"secrets_reset_title" = "全部重置"; +"secrets_setup_recovery_passphrase_summary_information" = "记住你的安全短语。它可以用来解锁你的加密信息和数据。"; +"secrets_setup_recovery_passphrase_confirm_information" = "再次输入您的安全口令以确认。"; +"secrets_setup_recovery_passphrase_information" = "输入只有您知道的安全口令,用于保护您的服务器上的秘密。"; +"secrets_setup_recovery_key_storage_alert_message" = "✓ 把它打印出来,储存在一个安全的地方\n✓ 把它保存在 USB 钥匙或备份驱动器上\n✓ 把它复制到你的个人云存储"; +"secrets_setup_recovery_key_storage_alert_title" = "保持安全"; +"secrets_setup_recovery_key_information" = "将恢复密钥保存在安全的地方。它可以用来解锁你的加密信息和数据。"; +"secrets_recovery_reset_action_part_2" = "全部重置"; + +// MARK: - Secrets recovery + +"secrets_recovery_reset_action_part_1" = "忘记或丢失了所有恢复选项? "; +"device_verification_self_verify_wait_recover_secrets_checking_availability" = "检查其他验证功能……"; +"sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "开始使用安全备份"; +"secure_backup_setup_banner_subtitle" = "保护加密信息及数据的访问权"; + +// Banner + +"secure_backup_setup_banner_title" = "安全备份"; +"secure_key_backup_setup_cancel_alert_message" = "如果您现在取消,那么当您失去登录权限时也会丢失加密的信息和数据。\n\n您也可以通过设置菜单来建立保护备份以及管理您的密钥。"; + + +// Cancel + +"secure_key_backup_setup_cancel_alert_title" = "你确定吗?"; +"secure_key_backup_setup_existing_backup_error_delete_it" = "删除"; +"secure_key_backup_setup_existing_backup_error_unlock_it" = "解锁"; +"secure_key_backup_setup_existing_backup_error_info" = "解锁它以在安全备份中复用它,或删除它以在安全备份中创建一个新的消息备份。"; +"secure_key_backup_setup_existing_backup_error_title" = "消息的备份已经存在"; +"secure_key_backup_setup_intro_use_security_passphrase_info" = "输入仅有您知道的安全口令,生成备份用的密钥。"; +"secure_key_backup_setup_intro_use_security_passphrase_title" = "使用安全口令"; +"secure_key_backup_setup_intro_use_security_key_info" = "生成安全密钥存储在安全的地方如密码管理器或保险箱。"; +"secure_key_backup_setup_intro_use_security_key_title" = "使用安全密钥"; +"secure_key_backup_setup_intro_info" = "通过在你的服务器上备份加密密钥防止丢失对加密消息和数据的访问。"; + +// MARK: Secure backup setup + +// Intro + +"secure_key_backup_setup_intro_title" = "安全备份"; +"bug_report_background_mode" = "继续在后台进行"; +"call_actions_unhold" = "恢复"; +"event_formatter_jitsi_widget_removed_by_you" = "你移除了网络电话会议"; +"event_formatter_jitsi_widget_added_by_you" = "你添加了网络电话会议"; +"event_formatter_widget_removed_by_you" = "你移除了挂件:%@"; + +// Events formatter with you +"event_formatter_widget_added_by_you" = "你添加挂件:%@"; +"event_formatter_group_call_incoming" = "%@(来自 %@)"; +"event_formatter_group_call_leave" = "离开"; +"event_formatter_group_call_join" = "加入"; +"event_formatter_group_call" = "群组通话"; +"event_formatter_call_end_call" = "结束通话"; +"event_formatter_call_retry" = "重试"; +"event_formatter_call_answer" = "回答"; +"event_formatter_call_decline" = "取消"; +"event_formatter_call_back" = "回拨"; +"event_formatter_call_connection_failed" = "连接失败"; +"event_formatter_call_you_missed" = "你错过此通话"; +"event_formatter_call_you_declined" = "你拒绝了此通话"; +"event_formatter_call_you_currently_in" = "当前通话"; +"event_formatter_call_has_ended" = "结束 %@"; +"event_formatter_call_ringing" = "响铃中……"; +"event_formatter_call_connecting" = "连接中……"; +"event_formatter_call_video" = "视频通话"; +"event_formatter_call_voice" = "语音通话"; +"room_details_advanced_e2e_encryption_disabled_for_dm" = "此处没有启用加密。"; +"room_details_advanced_e2e_encryption_enabled_for_dm" = "此处已启用加密"; +"room_details_advanced_room_id_for_dm" = "ID:"; +"room_details_no_local_addresses_for_dm" = "此聊天室没有本地地址"; +"room_details_access_section_directory_toggle_for_dm" = "在聊天室列表中列出"; +"room_details_access_section_anyone_for_dm" = "任何知道此聊天室链接的人,除了访客"; +"room_details_access_section_anyone_apart_from_guest_for_dm" = "任何知道此聊天室链接的人,除了访客"; +"room_details_access_section_for_dm" = "谁可以访问此?"; +"room_details_room_name_for_dm" = "名称"; +"room_details_photo_for_dm" = "照片"; +"room_details_integrations" = "集成"; +"room_details_search" = "搜索聊天室"; +"room_details_title_for_dm" = "详细信息"; + +// AuthenticatedSessionViewControllerFactory +"authenticated_session_flow_not_supported" = "此应用并不支持你的主服务器的认证机制。"; +"settings_labs_enable_ringing_for_group_calls" = "群组通话铃声"; +"room_multiple_typing_notification" = "%@ 和其他人"; +"room_no_privileges_to_create_group_call" = "你需要成为管理员或协管员以开始通话。"; +"room_join_group_call" = "加入"; +"room_accessibility_video_call" = "视频通话"; +"room_message_replying_to" = "正在回复 %@"; +"room_message_editing" = "编辑中"; + +// Chat +"room_slide_to_end_group_call" = "滑动结束所有人的通话"; +"callbar_only_single_active_group" = "轻点加入群组通话(%@)"; From 14b2cd949813d2f7c10e42652916f5c42d9dbb25 Mon Sep 17 00:00:00 2001 From: zer0-x <1rn0kmrwo@relay.firefox.com> Date: Fri, 28 May 2021 03:39:58 +0000 Subject: [PATCH 244/393] Translated using Weblate (Arabic) Currently translated at 16.2% (198 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ar/ --- Riot/Assets/ar.lproj/Vector.strings | 72 ++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/ar.lproj/Vector.strings b/Riot/Assets/ar.lproj/Vector.strings index b803dac65..96290d0cb 100644 --- a/Riot/Assets/ar.lproj/Vector.strings +++ b/Riot/Assets/ar.lproj/Vector.strings @@ -34,7 +34,7 @@ "auth_password_dont_match" = "كَلِمَةُ المُرُورِ لَا تَتَطَابَق"; "auth_untrusted_id_server" = "خادِمُ الهُويَّة غَيرُ مَوثُوقٍ بِه"; "auth_phone_is_required" = "لَم يَتِمّ ضَبط خادِم هُويَّة لِذَلِك لا يُمكِنُكَ إضافَة رَقم هَاتِف لإعادَة تَعيِين كَلِمَة المُرُور الخَاصَّة بِكَ فِي المُستَقبَل."; -"auth_email_is_required" = "لَم يَتِمّ ضَبط خادِم هُويَّة لِذَلِك لا يُمكِنُكَ إضافَة عُنوان بَريد إلِكتُرونيّ لإعادَة تَعيِين كَلِمَة المُرُور الخَاصَّة بِكَ فِي المُستَقبَل."; +"auth_email_is_required" = "لَم يُضبَط خادِم هُويَّة لِذَلِك لا يُمكِنُكَ إضافَة عُنوان بَريد إلِكتُرونيّ لإعادَة تَعيِين كَلِمَة المُرُور الخَاصَّة بِكَ فِي المُستَقبَل."; "auth_phone_in_use" = "رَقم الهَاتِف هَذَا مُستَخدَمٌ بِالفِعل"; "auth_email_in_use" = "هَذَا البَريد الإلِكتُرونيّ مُستَخدَم بِالفِعل"; "auth_missing_email_or_phone" = "عُنوان البَريد إلِكتُرونيّ مَفقُود أو رَقم الهَاتِف"; @@ -165,3 +165,73 @@ "social_login_list_title_continue" = "الاِستِمرار مَع"; "auth_softlogout_clear_data_sign_out_msg" = "هَل أنتَ مُتأكِّدٌ أنَّكَ تُرِيدُ مَحوَ كَافَّةِ البَيَانَاتِ المُخَزَنَةِ حَاليًّا عَلَى هَذَا الجِهَاز؟ سَجِّل الدُّخُولَ مَرَةً أُخرَى لِلوصُولِ إلَى بَيَانَاتِ حِسَابِك وَرَسَائِلك."; +"room_participants_invite_prompt_title" = "تَأكيد"; +"room_participants_remove_prompt_title" = "تَأكيد"; +"room_participants_leave_prompt_msg_for_dm" = "هَل أنتَ مُتَأكِّدٌ أنَّكَ تُريدُ المُغادَرَة؟"; +"room_participants_leave_prompt_msg" = "هَل أنتَ مُتَأكِّدٌ أنَّكَ تُريدُ المُغادَرَةَ مِنَ الغُرفَة؟"; +"room_participants_leave_prompt_title_for_dm" = "المُغادَرَة"; +"room_participants_leave_prompt_title" = "مُغادَرَةُ الغُرفَة"; +"room_participants_multi_participants" = "عَدَدُ %d مِنَ المُشَارِكُين"; +"room_participants_one_participant" = "مُشَارِكٌ وَاحِد"; +"room_participants_add_participant" = "إضَافَةُ مُشَارِك"; + +// Chat participants +"room_participants_title" = "المُشَارِكُون"; +"contacts_user_directory_offline_section" = "دَلِيلُ المُستَخدِم (غَيرُ مُتَّصِل)"; +"contacts_user_directory_section" = "دَلِيلُ المُستَخدِم"; +"contacts_address_book_permission_denied" = "أنتَ لَم تَسمَح لِـElement بِالوصُولِ إلَى جِهاتِ الاِتِّصالِ المَحَلِّيَّةِ الخَاصَّةِ بِك"; +"contacts_address_book_permission_required" = "يُطلَبُ الإِذنُ لِلوصُلِ إلَى جِهاتِ الاِتِّصالِ المَحَلِّيَّة"; +"contacts_address_book_no_contact" = "لَا تُوجَدُ جِهاتُ الاِتِّصالٍ المَحَلِّيَّة"; +"contacts_address_book_no_identity_server" = "لَم يُضبَط خادِم هُويَّة"; +"contacts_address_book_matrix_users_toggle" = "مُستَخدِمُو Matrix فَقَط"; + +// Contacts +"contacts_address_book_section" = "جِهاتُ الاِتِّصال المَحَلِّيَّة"; +"directory_search_fail" = "فَشَلَ جَلبُ البَيَانَات"; +"directory_searching_title" = "بَحثُ الدَّلِيلِ جَارٍ…"; +"directory_search_results_more_than" = ">عُثِرَ عَلَى %tu نَتِيجَة لِـ %@"; +"directory_search_results" = "عُثِرَ عَلَى %tu نَتِيجَة لِـ %@"; +"directory_search_results_title" = "تَصَفُحُ نَتائِجِ الدَّلِيل"; +"directory_cell_description" = "%tu غُرَف"; + +// Directory +"directory_cell_title" = "تَصَفُحُ الدَّلِيل"; +"search_in_progress" = "البَحثُ جَارٍ…"; +"people_no_conversation" = "لَا تُوجَدُ مُحادَثَات"; +"search_no_result" = "لَا تُوجَدُ نَتائِج"; +"search_people_placeholder" = "البَحثُ بِواسِطَةِ مُعَرِّفِ المُستَخدِم، الاِسم أو البَريد الإلِكتُرونيّ"; +"search_default_placeholder" = "البَحث"; +"search_files" = "المَلَفَّات"; +"search_people" = "الأشخَاص"; +"search_messages" = "الرَسائِل"; + +// Search +"search_rooms" = "الغُرَف"; +"group_section" = "المُجتَمَعَات"; + +// Groups tab +"group_invite_section" = "الدَّعَوات"; +"rooms_empty_view_information" = "الغُرَفُ رَائِعَةٌ لِأيِّ مُحادَثَةٍ جَماعِيِّة، خَاصَّةً كَانَت أو عَامَّة. اِضغَط عَلَى + لِلعُثورِ عَلَى غُرَفٍ مَوجودَةٍ أو أَنشِئ غُرَفًا جَديدَة."; +"rooms_empty_view_title" = "غُرَف"; + +// Rooms tab +"room_directory_no_public_room" = "لَا تُوجَدُ غُرَفٌ عَامَّةُ مُتاحَة"; +"people_empty_view_information" = "المُحادَثَةُ الآمنةُ مَعَ أيِّ شَخص. اِضغَط عَلَى + لِبدءِ إضافَة أشخَاص."; +"people_empty_view_title" = "الأشخَاص"; +"people_conversation_section" = "المُحادَثَات"; + +// People tab +"people_invites_section" = "الدَّعَوات"; +"room_recents_join_room_prompt" = "اُكتب مُعَرِّف غُرفَة أو الاِسم البَديل لِلغُرفَة"; +"room_recents_join_room_title" = "الاِنضِمام إلَى غُرفَة"; +"room_recents_join_room" = "الاِنضِمامُ لِلغُرفَة"; +"room_recents_invites_section" = "الدَّعَوات"; +"room_recents_server_notice_section" = "تَنبيهاتُ النِّظام"; +"room_recents_low_priority_section" = "أولَويَّةٌ مُنخَفِضَة"; +"room_recents_directory_section_network" = "الشَّبَكَة"; + +// Room recents +"room_recents_directory_section" = "دَلِيلُ الغُرَف"; +"room_creation_error_invite_user_by_email_without_identity_server" = "لَم يُضبَط خادِم هُويَّة لِذَلِكَ لَا يُمكِنُكَ إضافَة مُشَارِك بالبَريد الإلِكتُرونيّ."; +"room_creation_invite_another_user" = "البَحث / الدَعوة عَن طَريق مُعَرِّف المُستَخدِم، الاِسم أو البَريد الإلِكتُرونيّ"; +"room_creation_wait_for_creation" = "يَجرِي إنشاء غُرفَة بِالفِعل. يُرجَى الاِنتِظار."; From 4dd51fb794d23b792a1df9b8b1242f008e8fa0d9 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Tue, 1 Jun 2021 17:54:49 +0300 Subject: [PATCH 245/393] Use new apis --- .../Recents/Views/RecentTableViewCell.m | 28 ++++++++++++++----- .../Share/DataSources/ShareDataSource.m | 4 +-- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m index 37e70eed6..189e5f62c 100644 --- a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m +++ b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m @@ -88,19 +88,33 @@ static const CGFloat kDirectRoomBorderWidth = 3.0; { // Report computed values as is self.roomTitle.text = roomCellData.roomDisplayname; - self.lastEventDate.text = roomCellData.lastEventDate; + MXWeakify(self); + [roomCellData lastEventDateString:^(NSString *dateString) { + MXStrongifyAndReturnIfNil(self); + self.lastEventDate.text = dateString; + }]; // Manage lastEventAttributedTextMessage optional property - if ([roomCellData respondsToSelector:@selector(lastEventAttributedTextMessage)]) + if ([roomCellData respondsToSelector:@selector(lastEventAttributedText:)]) { - // Force the default text color for the last message (cancel highlighted message color) - NSMutableAttributedString *lastEventDescription = [[NSMutableAttributedString alloc] initWithAttributedString:roomCellData.lastEventAttributedTextMessage]; - [lastEventDescription addAttribute:NSForegroundColorAttributeName value:ThemeService.shared.theme.textSecondaryColor range:NSMakeRange(0, lastEventDescription.length)]; - self.lastEventDescription.attributedText = lastEventDescription; + MXWeakify(self); + [roomCellData lastEventAttributedText:^(NSAttributedString *attributedText) { + MXStrongifyAndReturnIfNil(self); + // Force the default text color for the last message (cancel highlighted message color) + NSMutableAttributedString *lastEventDescription = [[NSMutableAttributedString alloc] initWithAttributedString:attributedText]; + [lastEventDescription addAttribute:NSForegroundColorAttributeName + value:ThemeService.shared.theme.textSecondaryColor + range:NSMakeRange(0, lastEventDescription.length)]; + self.lastEventDescription.attributedText = lastEventDescription; + }]; } else { - self.lastEventDescription.text = roomCellData.lastEventTextMessage; + MXWeakify(self); + [roomCellData lastEventText:^(NSString *text) { + MXStrongifyAndReturnIfNil(self); + self.lastEventDescription.text = text; + }]; } self.unsentImageView.hidden = roomCellData.roomSummary.room.sentStatus == RoomSentStatusOk; diff --git a/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m b/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m index c454c5e74..49973dd8b 100644 --- a/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m +++ b/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m @@ -76,11 +76,11 @@ NSComparator comparator = ^NSComparisonResult(MXKRecentCellData *recentCellData1, MXKRecentCellData *recentCellData2) { NSComparisonResult result = NSOrderedAscending; - if (recentCellData2.roomSummary.lastMessageOriginServerTs > recentCellData1.roomSummary.lastMessageOriginServerTs) + if (recentCellData2.roomSummary.lastMessage.originServerTs > recentCellData1.roomSummary.lastMessage.originServerTs) { result = NSOrderedDescending; } - else if (recentCellData2.roomSummary.lastMessageOriginServerTs == recentCellData1.roomSummary.lastMessageOriginServerTs) + else if (recentCellData2.roomSummary.lastMessage.originServerTs == recentCellData1.roomSummary.lastMessage.originServerTs) { result = NSOrderedSame; } From a2982e9ba2bf266b92a897497d15b8e2f38c5985 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Tue, 1 Jun 2021 17:57:04 +0300 Subject: [PATCH 246/393] Update CHANGES.rst --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index a22c056b2..995908b34 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -9,6 +9,7 @@ Changes to be released in next version * Navigation: Start decoupling view controllers managed by MasterTabBarController (#3596 and #3618). * Jitsi: Include optional server name field on JitsiJWTPayloadContextMatrix. * CallPresenter: Add more logs for group calls. + * MXRoomSummary: Adapt room summary changes on MatrixSDK & recent cell changes on MatrixKit (#4360). 🐛 Bugfix * buildRelease.sh: Make bundler operations in the cloned repository folder. From 16200c97841d99ead1a3f5dac2df5a1f5557baa1 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Tue, 1 Jun 2021 17:54:49 +0300 Subject: [PATCH 247/393] Revert "Use new apis" This reverts commit 4dd51fb794d23b792a1df9b8b1242f008e8fa0d9. --- .../Recents/Views/RecentTableViewCell.m | 28 +++++-------------- .../Share/DataSources/ShareDataSource.m | 4 +-- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m index 189e5f62c..37e70eed6 100644 --- a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m +++ b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m @@ -88,33 +88,19 @@ static const CGFloat kDirectRoomBorderWidth = 3.0; { // Report computed values as is self.roomTitle.text = roomCellData.roomDisplayname; - MXWeakify(self); - [roomCellData lastEventDateString:^(NSString *dateString) { - MXStrongifyAndReturnIfNil(self); - self.lastEventDate.text = dateString; - }]; + self.lastEventDate.text = roomCellData.lastEventDate; // Manage lastEventAttributedTextMessage optional property - if ([roomCellData respondsToSelector:@selector(lastEventAttributedText:)]) + if ([roomCellData respondsToSelector:@selector(lastEventAttributedTextMessage)]) { - MXWeakify(self); - [roomCellData lastEventAttributedText:^(NSAttributedString *attributedText) { - MXStrongifyAndReturnIfNil(self); - // Force the default text color for the last message (cancel highlighted message color) - NSMutableAttributedString *lastEventDescription = [[NSMutableAttributedString alloc] initWithAttributedString:attributedText]; - [lastEventDescription addAttribute:NSForegroundColorAttributeName - value:ThemeService.shared.theme.textSecondaryColor - range:NSMakeRange(0, lastEventDescription.length)]; - self.lastEventDescription.attributedText = lastEventDescription; - }]; + // Force the default text color for the last message (cancel highlighted message color) + NSMutableAttributedString *lastEventDescription = [[NSMutableAttributedString alloc] initWithAttributedString:roomCellData.lastEventAttributedTextMessage]; + [lastEventDescription addAttribute:NSForegroundColorAttributeName value:ThemeService.shared.theme.textSecondaryColor range:NSMakeRange(0, lastEventDescription.length)]; + self.lastEventDescription.attributedText = lastEventDescription; } else { - MXWeakify(self); - [roomCellData lastEventText:^(NSString *text) { - MXStrongifyAndReturnIfNil(self); - self.lastEventDescription.text = text; - }]; + self.lastEventDescription.text = roomCellData.lastEventTextMessage; } self.unsentImageView.hidden = roomCellData.roomSummary.room.sentStatus == RoomSentStatusOk; diff --git a/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m b/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m index 49973dd8b..c454c5e74 100644 --- a/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m +++ b/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m @@ -76,11 +76,11 @@ NSComparator comparator = ^NSComparisonResult(MXKRecentCellData *recentCellData1, MXKRecentCellData *recentCellData2) { NSComparisonResult result = NSOrderedAscending; - if (recentCellData2.roomSummary.lastMessage.originServerTs > recentCellData1.roomSummary.lastMessage.originServerTs) + if (recentCellData2.roomSummary.lastMessageOriginServerTs > recentCellData1.roomSummary.lastMessageOriginServerTs) { result = NSOrderedDescending; } - else if (recentCellData2.roomSummary.lastMessage.originServerTs == recentCellData1.roomSummary.lastMessage.originServerTs) + else if (recentCellData2.roomSummary.lastMessageOriginServerTs == recentCellData1.roomSummary.lastMessageOriginServerTs) { result = NSOrderedSame; } From c785a2de9b0c78d57d01e5b41e4409666a477c76 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Wed, 2 Jun 2021 14:31:34 +0300 Subject: [PATCH 248/393] Use new comparator --- .../Modules/Share/DataSources/ShareDataSource.m | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m b/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m index c454c5e74..52e1f8f69 100644 --- a/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m +++ b/RiotShareExtension/Modules/Share/DataSources/ShareDataSource.m @@ -74,17 +74,8 @@ // Sort rooms according to their last messages (most recent first) NSComparator comparator = ^NSComparisonResult(MXKRecentCellData *recentCellData1, MXKRecentCellData *recentCellData2) { - - NSComparisonResult result = NSOrderedAscending; - if (recentCellData2.roomSummary.lastMessageOriginServerTs > recentCellData1.roomSummary.lastMessageOriginServerTs) - { - result = NSOrderedDescending; - } - else if (recentCellData2.roomSummary.lastMessageOriginServerTs == recentCellData1.roomSummary.lastMessageOriginServerTs) - { - result = NSOrderedSame; - } - return result; + + return [recentCellData1.roomSummary.lastMessage compareOriginServerTs:recentCellData2.roomSummary.lastMessage]; }; [cellData sortUsingComparator:comparator]; From 8493020735d09b86f1c45b6a29aa3b99061ce30d Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 1 Jun 2021 13:13:35 +0000 Subject: [PATCH 249/393] Translated using Weblate (Ukrainian) Currently translated at 22.9% (279 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/ --- Riot/Assets/uk.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/uk.lproj/Vector.strings b/Riot/Assets/uk.lproj/Vector.strings index 8fa7d8a86..86ac88f2e 100644 --- a/Riot/Assets/uk.lproj/Vector.strings +++ b/Riot/Assets/uk.lproj/Vector.strings @@ -325,3 +325,4 @@ "room_participants_action_leave" = "Вийти з цієї кімнати"; "room_participants_action_invite" = "Запросити"; "room_ongoing_conference_call_close" = "Закрити"; +"callbar_only_single_active_group" = "Торкніться, щоб приєднатися до групового виклику (%@)"; From 1c06f5bf6a2d98e9f95d9012ab2afdb725816d07 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Mon, 31 May 2021 18:43:53 +0000 Subject: [PATCH 250/393] Translated using Weblate (Esperanto) Currently translated at 99.8% (1214 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/eo/ --- Riot/Assets/eo.lproj/Vector.strings | 43 +++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/Riot/Assets/eo.lproj/Vector.strings b/Riot/Assets/eo.lproj/Vector.strings index 71c9a87a2..8a4575e64 100644 --- a/Riot/Assets/eo.lproj/Vector.strings +++ b/Riot/Assets/eo.lproj/Vector.strings @@ -1290,7 +1290,7 @@ "callbar_active_and_single_paused" = "1 aktiva voko (%@) · 1 paŭzigita voko"; // Call Bar -"callbar_only_single_active" = "Aktiva voko (%@)"; +"callbar_only_single_active" = "Tuŝetu por reiri al la voko (%@)"; "less" = "Malpli"; "more" = "Pli"; "switch" = "Baskuli"; @@ -1416,8 +1416,8 @@ "photo_library_access_not_granted" = "%@ ne havas permeson aliri la fotujon; bonvolu ŝanĝi agordojn de privateco"; "event_formatter_call_back" = "Revoki"; "event_formatter_call_you_declined" = "Vi rifuzis ĉi tiun vokon"; -"event_formatter_call_you_currently_in" = "Vi nun partoprenas ĉi tiun vokon"; -"event_formatter_call_has_ended" = "Ĉi tiu voko finiĝis"; +"event_formatter_call_you_currently_in" = "Aktiva voko"; +"event_formatter_call_has_ended" = "Finiĝis %@"; "event_formatter_call_video" = "Vidvoko"; "event_formatter_call_voice" = "Voĉvoko"; @@ -1483,3 +1483,40 @@ // MARK: - Dial Pad "dialpad_title" = "Ciferplato"; +"space_beta_announce_information" = "Aroj prezentas novan manieron grupigi ĉambrojn kaj personojn. Ili ankoraŭ ne disponeblas per iOS, sed vi povas ilin uzi per la reta kaj labortabla klientoj."; +"space_beta_announce_subtitle" = "La nova versio de komunumoj"; +"space_beta_announce_title" = "Aroj venos baldaŭ"; +"space_beta_announce_badge" = "PROVA"; +"space_feature_unavailable_information" = "Aroj estas nova maniero grupigi ĉambrojn kaj personojn.\n\nIli baldaŭ venos ĉi tien. Nun, se vi aliĝas al aro per alia platformo, vi povos aliri ĉiujn aliĝitajn ĉambrojn ankaŭ ĉi tie."; +"space_feature_unavailable_subtitle" = "Aroj ankoraŭ ne disponeblas per iOS, sed vi povas uzi ilin per reta aŭ labortabla klientoj"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Aroj ankoraŭ ne venis ĉi tien"; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " por sciigi la temon de ĉi tiu ĉambro."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Aldonu temon"; +"event_formatter_group_call_incoming" = "%@ en %@"; +"event_formatter_group_call_leave" = "Foriri"; +"event_formatter_group_call_join" = "Aliĝi"; +"event_formatter_group_call" = "Grupa voko"; +"event_formatter_call_end_call" = "Fini vokon"; +"event_formatter_call_retry" = "Reprovi"; +"event_formatter_call_answer" = "Respondi"; +"event_formatter_call_decline" = "Rifuzi"; +"event_formatter_call_connection_failed" = "Malsukcesis konekto"; +"event_formatter_call_you_missed" = "Vi preteris ĉi tiun vokon"; +"event_formatter_call_ringing" = "Sonorante…"; +"event_formatter_call_connecting" = "Konektante…"; +"room_details_integrations" = "Kunigoj"; +"room_details_search" = "Serĉi en ĉambro"; +"settings_labs_enable_ringing_for_group_calls" = "Sonorado por grupaj vokoj"; +"room_multiple_typing_notification" = "%@ kaj aliaj"; +"room_no_privileges_to_create_group_call" = "Vi devas esti administranto aŭ reguligisto por komenci vokon."; +"room_join_group_call" = "Aliĝi"; +"room_accessibility_video_call" = "Vidvoko"; +"room_message_replying_to" = "Responde al %@"; +"room_message_editing" = "Redaktado"; + +// Chat +"room_slide_to_end_group_call" = "Glitu por fini la vokon por ĉiuj"; +"callbar_only_single_active_group" = "Tuŝetu por aliĝi al la grupa voko (%@)"; From 8f3096a6a05a28072358c351a0e40672643c2093 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Thu, 3 Jun 2021 10:42:00 +0300 Subject: [PATCH 251/393] Update CHANGES.rst --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 995908b34..5ab854c0b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -9,7 +9,7 @@ Changes to be released in next version * Navigation: Start decoupling view controllers managed by MasterTabBarController (#3596 and #3618). * Jitsi: Include optional server name field on JitsiJWTPayloadContextMatrix. * CallPresenter: Add more logs for group calls. - * MXRoomSummary: Adapt room summary changes on MatrixSDK & recent cell changes on MatrixKit (#4360). + * MXRoomSummary: Adapt room summary changes on MatrixSDK (#4360). 🐛 Bugfix * buildRelease.sh: Make bundler operations in the cloned repository folder. From af60144b00d45ca17a40d5ec30fe2d2fc33c1898 Mon Sep 17 00:00:00 2001 From: manuroe Date: Thu, 3 Jun 2021 11:40:45 +0200 Subject: [PATCH 252/393] Prepare for new sprint --- CHANGES.rst | 24 ++++++++++++++++++++++++ Config/AppIdentifiers.xcconfig | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index dc0a734c5..d97a5c13c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,27 @@ +Changes to be released in next version +================================================= + +✨ Features + * + +🙌 Improvements + * + +🐛 Bugfix + * + +⚠️ API Changes + * + +🗣 Translations + * + +🧱 Build + * + +Others + * + Changes in 1.4.0 (2021-06-03) ================================================= diff --git a/Config/AppIdentifiers.xcconfig b/Config/AppIdentifiers.xcconfig index d1aba3d1c..12b57d3db 100644 --- a/Config/AppIdentifiers.xcconfig +++ b/Config/AppIdentifiers.xcconfig @@ -22,8 +22,8 @@ APPLICATION_GROUP_IDENTIFIER = group.im.vector APPLICATION_SCHEME = element // Version -MARKETING_VERSION = 1.4.0 -CURRENT_PROJECT_VERSION = 1.4.0 +MARKETING_VERSION = 1.4.1 +CURRENT_PROJECT_VERSION = 1.4.1 // Team From b2e1d80a04f0473266ea0391c9882b3a513c8ac5 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Thu, 3 Jun 2021 13:21:01 +0300 Subject: [PATCH 253/393] Do not show the settings screen again while session closed --- Riot/Modules/Settings/SettingsViewController.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index 5f6acbefd..4d70ad56e 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -3938,8 +3938,6 @@ TableViewSectionsDelegate> - (void)languagePickerViewController:(MXKLanguagePickerViewController *)languagePickerViewController didSelectLangugage:(NSString *)language { - [languagePickerViewController withdrawViewControllerAnimated:YES completion:nil]; - if (![language isEqualToString:[NSBundle mxk_language]] || (language == nil && [NSBundle mxk_language])) { From 8b256624d7e57f733e065116b300e8c71e517964 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Thu, 3 Jun 2021 13:21:58 +0300 Subject: [PATCH 254/393] Update CHANGES.rst --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index d97a5c13c..b2e383b47 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,7 +8,7 @@ Changes to be released in next version * 🐛 Bugfix - * + * SettingsViewController: Fix crash when changing the app language (#4377). ⚠️ API Changes * From 8d81e45497c06cac883d3883915e56b8d9e54a24 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Thu, 3 Jun 2021 15:48:01 +0300 Subject: [PATCH 255/393] Create keys for room last message data type --- .../EncryptionKeyManager.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Riot/Managers/EncryptionKeyManager/EncryptionKeyManager.swift b/Riot/Managers/EncryptionKeyManager/EncryptionKeyManager.swift index 168dad3cb..3203fdf11 100644 --- a/Riot/Managers/EncryptionKeyManager/EncryptionKeyManager.swift +++ b/Riot/Managers/EncryptionKeyManager/EncryptionKeyManager.swift @@ -29,6 +29,8 @@ class EncryptionKeyManager: NSObject, MXKeyProviderDelegate { private static let accountIv: KeyValueStoreKey = "accountIv" private static let accountAesKey: KeyValueStoreKey = "accountAesKey" private static let cryptoOlmPickleKey: KeyValueStoreKey = "cryptoOlmPickleKey" + private static let roomLastMessageIv: KeyValueStoreKey = "roomLastMessageIv" + private static let roomLastMessageAesKey: KeyValueStoreKey = "roomLastMessageAesKey" private let keychainStore: KeyValueStore = KeychainStore(withKeychain: Keychain(service: keychainService, accessGroup: BuildSettings.keychainAccessGroup)) @@ -43,12 +45,16 @@ class EncryptionKeyManager: NSObject, MXKeyProviderDelegate { generateIvIfNotExists(forKey: EncryptionKeyManager.contactsIv) generateAesKeyIfNotExists(forKey: EncryptionKeyManager.contactsAesKey) generateKeyIfNotExists(forKey: EncryptionKeyManager.cryptoOlmPickleKey, size: 32) + generateIvIfNotExists(forKey: EncryptionKeyManager.roomLastMessageIv) + generateAesKeyIfNotExists(forKey: EncryptionKeyManager.roomLastMessageAesKey) assert(keychainStore.containsObject(forKey: EncryptionKeyManager.contactsIv), "[EncryptionKeyManager] initKeys: Failed to generate IV for acount") assert(keychainStore.containsObject(forKey: EncryptionKeyManager.contactsAesKey), "[EncryptionKeyManager] initKeys: Failed to generate AES Key for acount") assert(keychainStore.containsObject(forKey: EncryptionKeyManager.contactsIv), "[EncryptionKeyManager] initKeys: Failed to generate IV for contacts") assert(keychainStore.containsObject(forKey: EncryptionKeyManager.contactsAesKey), "[EncryptionKeyManager] initKeys: Failed to generate AES Key for contacts") assert(keychainStore.containsObject(forKey: EncryptionKeyManager.cryptoOlmPickleKey), "[EncryptionKeyManager] initKeys: Failed to generate Key for olm pickle key") + assert(keychainStore.containsObject(forKey: EncryptionKeyManager.roomLastMessageIv), "[EncryptionKeyManager] initKeys: Failed to generate IV for room last message") + assert(keychainStore.containsObject(forKey: EncryptionKeyManager.roomLastMessageAesKey), "[EncryptionKeyManager] initKeys: Failed to generate AES Key for room last message encryption") } // MARK: - MXKeyProviderDelegate @@ -57,6 +63,7 @@ class EncryptionKeyManager: NSObject, MXKeyProviderDelegate { return dataType == MXKContactManagerDataType || dataType == MXKAccountManagerDataType || dataType == MXCryptoOlmPickleKeyDataType + || dataType == MXRoomLastMessageDataType } func hasKeyForData(ofType dataType: String) -> Bool { @@ -67,6 +74,9 @@ class EncryptionKeyManager: NSObject, MXKeyProviderDelegate { return keychainStore.containsObject(forKey: EncryptionKeyManager.accountIv) && keychainStore.containsObject(forKey: EncryptionKeyManager.accountAesKey) case MXCryptoOlmPickleKeyDataType: return keychainStore.containsObject(forKey: EncryptionKeyManager.cryptoOlmPickleKey) + case MXRoomLastMessageDataType: + return keychainStore.containsObject(forKey: EncryptionKeyManager.roomLastMessageIv) && + keychainStore.containsObject(forKey: EncryptionKeyManager.roomLastMessageAesKey) default: return false } @@ -88,6 +98,11 @@ class EncryptionKeyManager: NSObject, MXKeyProviderDelegate { if let key = try? keychainStore.data(forKey: EncryptionKeyManager.cryptoOlmPickleKey) { return MXRawDataKey(key: key) } + case MXRoomLastMessageDataType: + if let ivKey = try? keychainStore.data(forKey: EncryptionKeyManager.roomLastMessageIv), + let aesKey = try? keychainStore.data(forKey: EncryptionKeyManager.roomLastMessageAesKey) { + return MXAesKeyData(iv: ivKey, key: aesKey) + } default: return nil } From 25bb702fb25cf73ccb80cd1f410870d5ad1a8798 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Thu, 3 Jun 2021 15:51:47 +0300 Subject: [PATCH 256/393] Update CHANGES.rst --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index ea9d46de8..2ce2e61a6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,6 +6,7 @@ Changes to be released in next version 🙌 Improvements * MXRoomSummary: Adapt room summary changes on MatrixSDK (#4360). + * EncryptionKeyManager: Create keys for room last message data type. 🐛 Bugfix * SettingsViewController: Fix crash when changing the app language (#4377). From 29392273a278003f96f7d8d38a58ba9efd6f2c9c Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 12:09:37 +0200 Subject: [PATCH 257/393] UserSessionsService: Add possibility to remove a user session from the associated Matrix session. --- Riot/Managers/UserSessions/UserSessionsService.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Riot/Managers/UserSessions/UserSessionsService.swift b/Riot/Managers/UserSessions/UserSessionsService.swift index cd79fbd92..19d9b05fa 100644 --- a/Riot/Managers/UserSessions/UserSessionsService.swift +++ b/Riot/Managers/UserSessions/UserSessionsService.swift @@ -70,6 +70,18 @@ class UserSessionsService: NSObject { self.removeUserSession(relatedToAccount: account, postNotification: true) } + func removeUserSession(relatedToMatrixSession matrixSession: MXSession) { + let foundUserSession = self.userSessions.first { (userSession) -> Bool in + userSession.matrixSession == matrixSession + } + + guard let userSessionToRemove = foundUserSession else { + return + } + + self.removeUserSession(relatedToAccount: userSessionToRemove.account) + } + func isUserSessionExists(withUserId userId: String) -> Bool { return self.userSessions.contains { (userSession) -> Bool in return userSession.userId == userId From 3e479425dfcbe1e3ecf2bc1b11e1580a28d7691b Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 12:12:00 +0200 Subject: [PATCH 258/393] AppCoordinator: Handle user session removal on clear cache. --- Riot/Modules/Application/AppCoordinator.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Modules/Application/AppCoordinator.swift b/Riot/Modules/Application/AppCoordinator.swift index 3b69cc6e5..58dac41bb 100755 --- a/Riot/Modules/Application/AppCoordinator.swift +++ b/Riot/Modules/Application/AppCoordinator.swift @@ -139,6 +139,8 @@ extension AppCoordinator: LegacyAppDelegateDelegate { } func legacyAppDelegate(_ legacyAppDelegate: LegacyAppDelegate!, didRemoveMatrixSession session: MXSession!) { + // Handle user session removal on clear cache. On clear cache the account has his session closed but the account is not removed. + self.userSessionsService.removeUserSession(relatedToMatrixSession: session) } func legacyAppDelegate(_ legacyAppDelegate: LegacyAppDelegate!, didAdd account: MXKAccount!) { From 44bc88068ea64d07578a695add85167b0e221b2f Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 12:17:13 +0200 Subject: [PATCH 259/393] Update changes --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index ea9d46de8..09be8c22e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -9,6 +9,7 @@ Changes to be released in next version 🐛 Bugfix * SettingsViewController: Fix crash when changing the app language (#4377). + * UserSessionsService: Fix room lists lost after a reset cache (#4395). ⚠️ API Changes * From 6ad81d0c161229603d7d9b7bb27852583d1d3eb0 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 15:24:51 +0200 Subject: [PATCH 260/393] MasterTabBarController: Force type of Matrix session arrays. --- Riot/Modules/TabBar/MasterTabBarController.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Riot/Modules/TabBar/MasterTabBarController.m b/Riot/Modules/TabBar/MasterTabBarController.m index 501ece829..2ee405d94 100644 --- a/Riot/Modules/TabBar/MasterTabBarController.m +++ b/Riot/Modules/TabBar/MasterTabBarController.m @@ -34,7 +34,7 @@ @interface MasterTabBarController () { // Array of `MXSession` instances. - NSMutableArray *mxSessionArray; + NSMutableArray *mxSessionArray; // Tell whether the authentication screen is preparing. BOOL isAuthViewControllerPreparing; @@ -284,7 +284,7 @@ #pragma mark - -- (NSArray*)mxSessions +- (NSArray*)mxSessions { return [NSArray arrayWithArray:mxSessionArray]; } @@ -339,7 +339,7 @@ [self.groupsViewController displayList:groupsDataSource]; // Check whether there are others sessions - NSArray* mxSessions = self.mxSessions; + NSArray* mxSessions = self.mxSessions; if (mxSessions.count > 1) { for (MXSession *mxSession in mxSessions) From 24512f47ba6cf7251343f809f564a125721c8032 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 16:20:49 +0200 Subject: [PATCH 261/393] MasterTabBarController: Add sanity checks when add or remove a session. Fix runtime issue with Xcode 12.5 and NSArray mismatch type with Swift (see https://forums.swift.org/t/objective-c-interoperability-type-mismatch/12464 for more information). --- Riot/Modules/TabBar/MasterTabBarController.m | 12 ++++++++++++ Riot/Modules/TabBar/TabBarCoordinator.swift | 6 ------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Riot/Modules/TabBar/MasterTabBarController.m b/Riot/Modules/TabBar/MasterTabBarController.m index 2ee405d94..60ff2441c 100644 --- a/Riot/Modules/TabBar/MasterTabBarController.m +++ b/Riot/Modules/TabBar/MasterTabBarController.m @@ -356,6 +356,12 @@ - (void)addMatrixSession:(MXSession *)mxSession { + if ([mxSessionArray containsObject:mxSession]) + { + MXLogDebug(@"MasterTabBarController already has %@ in mxSessionArray", mxSession) + return; + } + // Check whether the controller'€™s view is loaded into memory. if (self.homeViewController) { @@ -394,6 +400,12 @@ - (void)removeMatrixSession:(MXSession *)mxSession { + if (![mxSessionArray containsObject:mxSession]) + { + MXLogDebug(@"MasterTabBarController does not contain %@ in mxSessionArray", mxSession) + return; + } + [recentsDataSource removeMatrixSession:mxSession]; // Check whether there are others sessions diff --git a/Riot/Modules/TabBar/TabBarCoordinator.swift b/Riot/Modules/TabBar/TabBarCoordinator.swift index 823d7f505..83757eb73 100644 --- a/Riot/Modules/TabBar/TabBarCoordinator.swift +++ b/Riot/Modules/TabBar/TabBarCoordinator.swift @@ -291,18 +291,12 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { // TODO: Remove Matrix session handling from the view controller private func addMatrixSessionToMasterTabBarController(_ matrixSession: MXSession) { - guard self.masterTabBarController.mxSessions.contains(matrixSession) == false else { - return - } MXLog.debug("[TabBarCoordinator] masterTabBarController.addMatrixSession") self.masterTabBarController.addMatrixSession(matrixSession) } // TODO: Remove Matrix session handling from the view controller private func removeMatrixSessionFromMasterTabBarController(_ matrixSession: MXSession) { - guard self.masterTabBarController.mxSessions.contains(matrixSession) else { - return - } MXLog.debug("[TabBarCoordinator] masterTabBarController.removeMatrixSession") self.masterTabBarController.removeMatrixSession(matrixSession) } From 7815e0982c0439d02a5c9a15cf59512fe0896214 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 3 Jun 2021 17:54:14 +0200 Subject: [PATCH 262/393] Side menu: Add icon images. --- .../Images.xcassets/SideMenu/Contents.json | 6 ++++ .../Contents.json | 26 ++++++++++++++++++ .../side_menu_action_icon_feedback.png | Bin 0 -> 428 bytes .../side_menu_action_icon_feedback@2x.png | Bin 0 -> 725 bytes .../side_menu_action_icon_feedback@3x.png | Bin 0 -> 1023 bytes .../Contents.json | 26 ++++++++++++++++++ .../side_menu_action_icon_help.png | Bin 0 -> 661 bytes .../side_menu_action_icon_help@2x.png | Bin 0 -> 1224 bytes .../side_menu_action_icon_help@3x.png | Bin 0 -> 1770 bytes .../Contents.json | 26 ++++++++++++++++++ .../side_menu_action_icon_settings.png | Bin 0 -> 517 bytes .../side_menu_action_icon_settings@2x.png | Bin 0 -> 917 bytes .../side_menu_action_icon_settings@3x.png | Bin 0 -> 1348 bytes .../Contents.json | 26 ++++++++++++++++++ .../side_menu_action_icon_share.png | Bin 0 -> 380 bytes .../side_menu_action_icon_share@2x.png | Bin 0 -> 533 bytes .../side_menu_action_icon_share@3x.png | Bin 0 -> 732 bytes .../side_menu_icon.imageset/Contents.json | 26 ++++++++++++++++++ .../side_menu_icon.png | Bin 0 -> 3647 bytes .../side_menu_icon@2x.png | Bin 0 -> 4176 bytes .../side_menu_icon@3x.png | Bin 0 -> 1574 bytes Riot/Generated/Images.swift | 5 ++++ 22 files changed, 141 insertions(+) create mode 100644 Riot/Assets/Images.xcassets/SideMenu/Contents.json create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_feedback.imageset/Contents.json create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_feedback.imageset/side_menu_action_icon_feedback.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_feedback.imageset/side_menu_action_icon_feedback@2x.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_feedback.imageset/side_menu_action_icon_feedback@3x.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_help.imageset/Contents.json create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_help.imageset/side_menu_action_icon_help.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_help.imageset/side_menu_action_icon_help@2x.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_help.imageset/side_menu_action_icon_help@3x.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_settings.imageset/Contents.json create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_settings.imageset/side_menu_action_icon_settings.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_settings.imageset/side_menu_action_icon_settings@2x.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_settings.imageset/side_menu_action_icon_settings@3x.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_share.imageset/Contents.json create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_share.imageset/side_menu_action_icon_share.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_share.imageset/side_menu_action_icon_share@2x.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_share.imageset/side_menu_action_icon_share@3x.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_icon.imageset/Contents.json create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_icon.imageset/side_menu_icon.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_icon.imageset/side_menu_icon@2x.png create mode 100644 Riot/Assets/Images.xcassets/SideMenu/side_menu_icon.imageset/side_menu_icon@3x.png diff --git a/Riot/Assets/Images.xcassets/SideMenu/Contents.json b/Riot/Assets/Images.xcassets/SideMenu/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/Riot/Assets/Images.xcassets/SideMenu/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_feedback.imageset/Contents.json b/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_feedback.imageset/Contents.json new file mode 100644 index 000000000..17b471849 --- /dev/null +++ b/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_feedback.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "side_menu_action_icon_feedback.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "side_menu_action_icon_feedback@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "side_menu_action_icon_feedback@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_feedback.imageset/side_menu_action_icon_feedback.png b/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_feedback.imageset/side_menu_action_icon_feedback.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff91ac99b4e2181fc84682472f069b2512b5a06 GIT binary patch literal 428 zcmV;d0aN~oP)=wOB@&_u2{jTmQDmM#I04*1yurM|j<7^bjBb7Hz%8hN zZtx`C`Y%u3_HE0s1f{e@sZ<4L5{5$Wvf(e9%jOE2H?Cl;WvlLw>4E)>;*a-p@A@oQ zC`uv_mC6G^M_7s#64g5G`Y`R`v%^lg{P?#dfvPryK@#~dQN7t|5yKvGV3$8osw*>* zI=!kABaQq>z7?rV#5bIOEN4E9*l{LeVEZVJJZax$cM?QpD#iO2xYScS3U zPecMVL~%x*R|_YiD2f6Ugkbu~|115%MKOAJ7mZ#fV&I3!3&D@YxRy54tmQk9g!|YT zA9z}aX_upPS5j;O`wU2XqkS^0Z#G|sA}YH!pSJK_Ov4Td^kl?qZ&vUPrL{~7R^SsQ W^lRh~@htcN0000MRc!qq@SrJ}w8-3i*AU^&8$5Kcg(?b90D zv$HmBvt;eMHraV6?5G&}; zK*2$Gml58XM}0sy7c?JgsFOd3`+ck%=)1tiHI#eOhbvJFDt~W9T zQ0LAIA>PNcwN6n}*KG_o3uC1{_EZk?wKst5Y|;cD)u{E+q!HW(WTy6aR4Jm~?Cl(o zjn3w~DlhE?2fte=0wV3aMh#*_S+8WXEa1H+lkz|6Q7q5db35a*2)Rj8)j%$iS*S;z zEo4Bdx|vld1LBXbV`*$4Bi}&|dFf?xuR-+!jg*pP&Yrjll7wJO`v$GDO8P=_Z;r|8qbr zY1ELdWqbB+-VYJIM3pjQHorB>8?+WGV=8= z(DK+EvkVhg$Bu-bdT&}{0+@){WUJUkUmWtK7VpecoBfeMdd!kmN2Js28Fov~c>>Ox zZt}!Wou)N+M9-l0KkFLoLM`2kP;h=f2NCd&AMhg&kDBTV^JUBuT5zD>jVueX-ErVHKa3Opg z5r#k(z)ZB^7!`)vE4*1eV#RJz6J|U6c_E+(hC)L3u3PM~RREJAID1_TpSK8RaZflB znlR2u0SqP_;!E^CW+MNGFhaNo1|tBxZdnt?Earj92yxmiYQkKn9Uz%#4E;7i;LUD1 z>SHQNU?>4cuUn1?;{YdMCcgV&qrb%{h&q^wcHa?UJ6r1wFwxIMa2!62UB^&}FJKTt zMu&H|UJkaHf>~Co%*LIA{IK^_tT2l)V_sd9wK!q5-t)1-f_AFa6oN`;{ndySCiBQf zga?$h_Np7TxVmVRN@n}bh$*7a>E(RCTC4X2p;!U~K+Y>}wSSH*8q5*dABHlmRoQtz zI47-TG&@Q2UyxyxsJ(aV&amtB_pyuzOOuLHXg-$RU@7`2_|k5*z1>Upk8VN56loCr zhU`%f==n3(N%yVQwZ+tKL*UfD8B33V27;Ua7M>kI$eHkEW3XX^T!C8HjPF0&0!@L?1vYqxrLn8dZQW3Gg t-lT-|66;iJot!SSE}GNo_?~-o{sEjXTzM_;*A)N&002ovPDHLkV1mf{$%6m@ literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_help.imageset/Contents.json b/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_help.imageset/Contents.json new file mode 100644 index 000000000..429cca21d --- /dev/null +++ b/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_help.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "side_menu_action_icon_help.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "side_menu_action_icon_help@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "side_menu_action_icon_help@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_help.imageset/side_menu_action_icon_help.png b/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_help.imageset/side_menu_action_icon_help.png new file mode 100644 index 0000000000000000000000000000000000000000..00295207544147aec8868c9c5713b9098a9e01dd GIT binary patch literal 661 zcmV;G0&4w?CZ1AjnotgW%d@z2?ui zU&A)1qm2DD>2Jd2D0QuVY{@%-{a4l|4lmNP%h3@EF_#BfK&ns{`Kc}~i!#i0l)83< zh)scX1>{X|Ick~sQqMz2~X%fcKOtoQnyo56QaqpOcn zXIX=l)Rm+PlzV-A=W!Fr`|UXTez)a_I?Ahg#KTRoE8a?xTDQq-GLFvLj)>O;)tSyx zWom#ZeHW0mc&DUDoM+4}-mG*YxdTivA&G1bArS6L*LB7OB^so0e6lRMhW3`0=IgGM zGLFvMT=1%%iCM7R^olfdIXYM$QDpB1hi1P%PC9MSG1#NePCuqEDS4^|Ho&X~dLUHaK&YeGBk0+iP6D0VgWbVDbKi{1HI{+UU5SE1P{9X~Kr79s+fS?@i zHb%mcJe>^PKYkg(5-3E--u=@u(YQtcn*dB?@zx{$H;|K)RuOW!2-!cgG)ko-Zd$Mu zu$z}yCZWdd_6=5vo3eBaL_^gIn$WodGOBlhw1$C-BW0#-BG%T92q-4Qp42+n+i_qCxQ=f(8!R!0Rdy%X52|8KD(Tne&Q1&}!lBBgD_37WdHnFHK5s^4p*KA{Z!$V`Nh!$5 zWJC8pL!T^4EAd3)IFgr){p-D|ic#vBHJ5GBQT8}J(+?*wM@UJBX>3J(Pn^^s11cmm zZgpM=Vf-f$`|8R4XE$%%+gh|vIfvG@)XU5f(xt=bhQ@d%{7wA$6vZ11J%%a>#*uzV z627PEQUctZBLrH!kwo_)11ymnQ5%VBoxR2v?3vr~#t8PJ^)pgJyf#B9R97V&8@oAT z4S{z|L@j>Squ9iu!JQt6pD$V;u8F1E*l(|^mLG?NS<;Ph2sv=D_hUCXra}fwDe8_O z3mhPsx#hRt%8UH}xlc%y5Ew-Og8!i)f;8g?)6HND9I;chvRA4c7@SLFRMgW5NtCCg zX$%FyWDX%D!yEkNiB}i1oFbU2Nf84MCY%c>@{(?6ziGpJAdnEkR4Rz;Pyn`bsNT$f zJCfd`B5PT-Wvw%g38}I(=EFG#3cz)?$5Ko-)StKVrdMPwAATV|7rjw9#&O4-=$@4s z{*w^0bYz~E9+XZ#s}xxWT6rT)Zx|B_3^0~bc~O*2qOsdn_G77%LJD;9u4@Ko1ghq< zBPWO>wMTRuwS|_Avmi||p!j7dx5@~OxRT_kJ&4-VTsFIzl~+p2hLoEt8%hh7X-Fn= zUfY_I)4<~I$B~n-FrB?-X2xFzsv^)*RhQ4HN59R~Lu}l2t!v%9-N~)Gyznbht-jW! zqcBs#J{|lsR%Iopk#AL>#b;fzzJVu?{w@?>7LnmJYYhQLDjflUjEu* zHkI=vl_bOHadq%Ra$aicV9&WOJlSV|^y38AI}Yo8i*KK`qIY)X9Lj4sM_Tb9XL)J9 zuBXjE`=ZDxK}f0U-Oa?3t|ae%R?QRN^^TCRfbslMa5_kvuKl|qea;!%H0000@CpAf5O@zTtrss7s9lP>=0aN(ZX zyK5aN0fmT}rd6e%%{(E(BU6J?K)M3>c57$74F!;!*wf9uB?4@#JVGjp5!5DT{`jKC zDwPu~HnRPK$o>KeovT^t}ZB9E~rbx7`}9GsQI-PLo*h|I)RHx9Q15mw40Z6d_!LC(!@ zT6=Zo5EEzf`=nYPAsPFxkO^V z^_#kgm~#PF+_;`kG74qGTbgd=4BJ(WOAoE(Y?8I4NiXzGdYF`)DcnzslOiP{R|ThR zUii^T5Y@ihiA5|ie|?Aj)TEYQ9BgZ)C)GGlSG#o2u(rx=6`keiza7mN_JYJ(to@bRLJBitjGPdE2Xjn{(onQ9#o zG~)9@#8z>1V}jato+Zd;rlp%`jCrgo3F0g)Kt}jWQk;fsMa}g3K0=6?AW`O=yT_mj ze}E#S+Jcj1T!Jg07y+EoEzkfy-&X4wkkH_$OR*994}Dgi?3OEypo6vL9&J5uwp%-E zHpY~Tp=K}uZtfmDgpBawQ4HlE+(>9rhQ!RD_v%r8 zc5Rd{vUs5yi^QKD+g{O%W*j4?Z{ zt^Asza8X;&0h*#`GK8QZ!<5JA>w*Sae;fLS zkkW`zMb#=z(pHo$PdXpA8B^J>sl}xOdBBYu6D{AP!3Ro!X&r^m13ch)z@RvqF_(5D zzn*qdw7%@{GVVK8Wlp6I|3WD+oM_(&xWkn&B<4=tb<_tb&8qgMLz;TV=q0v%CUq2P zC7~ePn9PB@BfmBz*7qf0^C`$2lmImK0ShQ<%%~K$h?Jsw9Bc!9VsP(<{Fp01$#bBg z<~d~m!?!{ajf^#gqFP~4+zI|4BE~?Rt1n?OIhrnz$o8m=qLAUVp#U(}e4^HICHaie zJPzNe0wwBqk94&O6;dC>E>(*}8s2;S)1EiMIyqRaoo2||Mj{W2r-~>chth$*em4&V zP?o}l#%IfOP9gA!CKHJjF&(gD#L0$^F7dwLYlvbgSm)1H^l&gj%uffRBY=zcqzp5i z7qaany)*9lMD0FKzmxe7e@AD_&eO&r&3&shOEe5p#@7gtL-nkQk)k^{YSr{`#BmFntF+XZ^Rd-)B6k-M3U15O_tK-`{N)^>YJ^ zyOj{9)5rD-G9sOv_o_DM{5Wr}B||qq$_bnEAhMG3dIK7ez6{A7k(5g-1l40#o}@_K z@A~G-wiB*HpizM72X#v694f;NNY(lE&%5<6uz08XxKv2y3oJ-X3}+FESB00IXS~sq z^HxHkD@RGE`ene6ekOS3NJZHMB_SEFI>wD%s`Kk-XA}M^SV7B;_9Br|4JC z4?c!#eM#`I57C-;9w0Abihz8MGM|tUjTBx`XOWV`hdkT!TA)q#9pDb^3gUEtWhYT0A65#=!Jl|bz!ij4U^;*jTmq7vOT@C70T!@@ zr925S%+8z7+X2`W%oi(HgZ0Ijc9hmb=|4qXah5SWPdFZu%r}xBh)gyw>?-bUdEZU| zO~rMrfze@z4-wsqVo~*WL9-+~@u8H{)HYcwGGWBJ;Wpi2>`g}TQ89x2cuttEE1(Gn zz_}Ga-EH3IfQ~WwnsfbaG_fzsP+-oFgHIt+Ovr3I;YyiaC&(R<25CFU^R~{l1X4`X3zuV| zSYxL3u6C8`c4D?zw{IvQp`mrS$E|R2wu3ra1G?k$&V<8zy%<~X<7b4oGbDe#iAb&p zy3c!gY^s?JZIRDVba1Zj|DaSpp#3R2AayZSQZ|4K)mo|=r7x`Pq*y-I`WK3J#qwT? z@?f@D1q{IaL;=qHXu8eppF~!R2J8x&u^?6YcP#zas4MOdZhg4T%9Vxl00000NkvXX Hu0mjfA}{6> literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_settings.imageset/side_menu_action_icon_settings@2x.png b/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_settings.imageset/side_menu_action_icon_settings@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..49f384e3b770b6ca0c872e428d9f1b726b0fb6aa GIT binary patch literal 917 zcmV;G18V$GK~#7FwO7q@ z5%30@1ODkmRzuV6_CaDbOk zu0i=gic@falL3@aevcwJ0Byqhn@@SM=9O91cyPFT5uag911XW@e!+iMZr1mTdzOXCG=2{$M5OjMVTE-0+c0vNu&&AIENu52} z=655MI+@clg9iwMoK3lss$^51#^A6uWRH~ib)24)VD4=gfFw2z8J|2l{3Bf^`d&0(1?;$us=hwV>3L6;_RQYYD5%iZT;0Ph1Fh~0+kgDQE z_j_H-A{I+@HYjj|e=-Tk1_arL)Xn0X(H$JLI@5822Nu1%iy&-V0A8lVBWB8KTwqH= zgReEWw=&`xM;Lp;jxj+hyA~jj!QqS?H=UO{M34b}a^{xHMf(b)8WM^cSQ!y=6Bg^& zh}lsS)RZIY9qu8OSLXQ*URs>7Ue^L$XA09V+K zMfyqPoB10bl0TwN{3c^*H)aY24sQjxi!sog9=N+ts2@w rL2iA6lL5*Lw&QuCyBn5O!2$mOL`PW>qyGt>00000NkvXXu0mjfJ6@fk literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_settings.imageset/side_menu_action_icon_settings@3x.png b/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_settings.imageset/side_menu_action_icon_settings@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8c8ba6a5f03126ef25b549c1085809ef7b3db4b6 GIT binary patch literal 1348 zcmV-K1-tr*P)>QjT`QnLp>b0 z;@-Hid;&a^FvHZ=KHgg=w8WBj<;u|fF7~XnlAfgZcLfBd`t_5tT3LAxASwV@deb6$ zdh)u_{qCCt0wN(WYUP8M^t1Wz#WT3eZPn^o2?7#SfZAben-*HO_n@}bX$1ljQ~(sN z#a~UB=J)X-r~m@wC%Ju;ybl2pc^#^U&o-qHJJhj^koG&L2R&22+T+#^AoQRJ0(RRc z^}ea;;p6tPK+LY0)@h^r?ZL=Bl!N+V`jc=U9a z?(=hakI;x)*QfP1MkS`j2UWBXupSzp!!3c0i0Qfc1Q1`rdj?xT({rm5lUIF7t()Kl zD`a|3e}>a&nsnnUOBKhZXnMDTfZHh4eF5IiY|uWfKQPW{d!rhkm6XRgbjew)e=GB_! z$gB_tQm}frB2!rw3fT)=7tcG@Ij!A;B~UwRvDI_vo#>H2cqLFI?Ph(zPoh~4%V{8) zG=-1{Ik^|GBxvk&r$SR&DtONY3)@a8$KH~(_+#*JEE;eC%VSu)D`v$5$x?w2m(d88 z1bc7rqv9RRb-Vk)ly`3I*t_IXx;4?L4Hm#_M{CX2$FL+g{sK=V#~MB_=)Z6&CX|V$ z-Zi71)X`)Qiv(>~Na-757e|BGF4{MX2Gpb>S#dJQgz$jk^?g9>yIv$G@+B+@N*mp& zEW!Y_*du?j#St*CeW9e@mSDdNd2^Bn-ZRyt7R<=#_%7r|D3dy?39bF&aHu`X$c(X) z)r?ZMWGyD~MA2I6aQS}757(U0fOcGKXJsxgxXP=V6(O&HMvQ6q*KLi?j7$hf5bYH+ zQl_|m)GkdgWW)D5@wMTd#}up1jtGgX*`CzTzO?)Xg%Al+j$kYN&W)YbQ(0jPCiNF; z-L^s26QC&djKwbomf3<(h)b0Q7)&vJ0hfP{y4_jQQ;naLDN-v-DL<#0YIT-t7ag0{ zvZlG{yJc#-HMP;KfMCeMEtNTG&4>RtEV^hhqxd`A5-io}f?rzxLzFg~T4j3p^G`n} zpMLfQrJrIGY;Y7S#2xx~2i^%Wrm=pdUHiy772W@K^Wb|^o7EF@!HMkrypuv0YIV6z zRe_E6X>FYYtGocvyeb&-yF3Pu#r02mIxsEXRY1%C$QM7YC@r(Ffy?e$CCz}3<+254 z|BORMgg!Y@!5I5_HP>7Le4x;S?R8#EZw<^AA?$~4Eplr{6gmX`coI|qDbpmcj}ZBN zyyk>}OrvPzN>911-TW$OVJxTsT%=9aYlBtFOyw|Z3(Vij*Blfiy$AsS0000sflI~j|F(PmLC3`jTe0^(c#uRB5Ju+R#!8z6jHtBKxozJiv*~z# zh$pLr5tI4n0$}rGwDgYd-^bJc?w-BY{9xGFN^-UExIoH;G#Ap-lGxPzx1W|%6b6r} zhVP9e41%=0zLDu#`1u@LTk~JOnnI~AYNW`rDExj+w%@8;lvmdieGtv^TF&elh|Tn> zteN5s4!2g7*i&T%P86p|=#gijhKo}!fCLRC+__w9M~N7epk{X2${7`M>4~i7g;c8u a=g1oKl3W$(e7TDN0000&L`i0W$2jo&gNGLceRZ05v;+7wKNSf$fm zoXmGA3f3ST=hn}9Aix?3(ySL8kR+6%gC#RY>MQ#RBI{7T>{b|pP5Ci-eGs5~Q#(1F z^e?$trsFMtM&{82yUp715w8b#h4K}*MY(aJWaL4UYL%TYHyn@^VgY7hNibwNURzX# z5?mSax&K_KQ=vGL719Ic+zD4|9#mKMX(v#HmshGWT5eLAep85`oq#a}!vIy8kTleB zq(X75l#mC@gF83>Z;#l4Wr1+VYtnfQPmlM5o!z}nU~G#nHy{ycgNAtJ)(b^Q`7gW! XONqY#-cOP900000NkvXXu0mjfAYI!G literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_share.imageset/side_menu_action_icon_share@3x.png b/Riot/Assets/Images.xcassets/SideMenu/side_menu_action_icon_share.imageset/side_menu_action_icon_share@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5803071e5fbf16fc339e7029452e291cf31d8d GIT binary patch literal 732 zcmV<20wev2P)ukS6ABz!0Ndcmmot*b#}tDh`}^gzyHH z-~gnyai%4Lg?5hrgk@7{=v{iK$EFLoq7nfdSS^ahUz%k$JI+hkmeehMyjVU;u5gby6JhecDP$p`EfB z2llAgn>jfxv8$ve2T#bVXD5fFsZBX8F;%Gyn{vux!`sSwiP! zKDVUBcAmf85)~p6)4BttK=D}2m%sYjJ)QzWTTluV3qdkI7|vv(rT&VTyy=NDH7ze? z5+0^wz+(NBiIx)cm);4~1RtS2nK-%PfuIldL26sn#HuJY9jXv<9)D96=Ep^KL`d81mc2>Llw9=)-;@0 z({N%4@V O00004Tx07!|IR|i;A$rhelQb}lmP^5(3MCk;O5<-h0AXN~RkOUG+j0r)-&bq9E zYZp;0E4nJ8=vn|-3nF$G#oiYSD$2T8u%YrMB(Sdg%J+iy#{ejU{om#7HGru4%dRS}e~$lG z(HDvo0sxQ@_g0N^D8nY<7HVi?rhOf8hDuoz+kISdfunJS#4#!FQ=OO3Y- z*d!%zA#MbKOyl$AIRI$4LOrWUkOO(NA3^LU6-uN4=omm8BoOn35GO%Ayr5vR3eSbu z5!%Zj-VQN4>nqNjzwu`c@$>mPLs*^HfRMu^3RymX`u|y)|1Aai%0VCYu+hZws03C1 zu!cACCP%9<4dQNTR&1QA))2p!2-S550HunRQORn1)J&k@!urAg9H4GOepocbW)Me6 z^J8N)`mAh81P@}kTF_~dLSB+)?gEh_JW<2BPChvyZV+e7xg5>hI=+0sugbnvnU~Db z@ZS)Nc!T_Jip5E(5K{rbs6~>LSctVDHc;dxMyqWw>tZoCcF;zyOi;yd3o%$RkpWiy6#CC<+T# z=Z>|Bq{*6mv3s(@&;-rg9$9|8#vUh&@*`DxYlux1MTwfZ_^3j-IMw`kjI1y|NgXGi znadv?uZ{;V0x^IK!T<{>Vao!OK`xNAbvJawU+R$vzz1@W14O`8qZyo$Ixr%I&qPoR z{(wjX6hreu2S!Dp24pZisv zg|LtQ))HHQ?ZZxC$FMWlA*=zgu%lQbb{;#d!b5B5(ZCuS^p-FXPafov{KFq#<5N{h zgMgW{H7bxXLY8|e65a8QD2ks~n zU;%7^Bh1JH_<#Tq0>Z&)5C@V#8kh*{EQae@4yJ;cU>+z13Qxub_!N9Lz6f87Z^!HLR{S!4AMe4x5aBomSgDUcLL;*$zVrKB~aous3rOQcTHd$JbUlI%f_Ag7b12!N~2tA!%NMB5^p&zH; zqrcZ?Xphk5X$!UIXjf_1YhTiSp+nKJ)8Xh$)G5}f(AlSRL8n`nqHC|q)#dBX)~(V# zsC!+vSC66Rt{10QptneGhu#^zr}`v)d;M^Iq5gdR&HBgnA2Kk84TH-NFur4KVVq!e z8W0T}40r~)2IU634B8BO4D}7Y3{woJ8CDq{Htb+xOnWAena^Cp+{?Vi{Agru#4!>X zEi|e#x@7duc$jgBvBzflVv6iCU;G7Q)kn$rc+Hfn4U209%e8s zV3=T7*|5FCZkeHG&SnW_Gt4%doj2<>w=j=1mzl3IKW^S_!L$gm$hBB$am1p_l3^KS zDY0B>dDQY5%aFxk<+CbTt*jm^Gpi^orPU^@Hmg2s2kT_(66@X8cWtOPY@2MGl{PIl zJ+_v%V{B*I*4o~(qu8j|G~b&{;7kp1J9w@q1NG!Bi%9Baf)NL z;}s{O6Wb}zX}!}$XVlr-S?pZpe8B~E@o|y3taoW2P8jYtTspjZ_;pvBE626Swbu3i z2 z=N!*Q&zD{Xo z>2|VXvNE|PMJFXAr6%QFYFO&>)Q)i@$ITjdF3mJelGd0`N>54On%+A;eEh2Mof+O4 zr5V>II82x};mkzSiTM)`PtuvhpR_NNkeQmfBl8nKj$h61&EjRP%jywu1*-+mg(1R~ z!Y)yuXu0S~c3}4M?58<_IV*Cy#KGbUakqpkSu1&&8}Ov zf`d|hX`Zxovc=?SliOu3vQk;c6#pr!ru4|8B3-Y0_!ur#nwyIQ>a+MDfov@EL*`Ei*OqFR%1f{R5b(ps1^5EVg0_X8 z3)d|CQYI`rTkcj~QT}O>VA0th-G8k7v43&);mO4iDT2ccj>?$I#x=HUmah4gPryH9hH`Q0$S66H%ZZ6vVcuUHbQ$MqRuGwn3wS4R6ZPINW z+Y`38*7(-c>@eH0q!z7J)^_d8*m-eR*sjJp*Sbx+nY+vPfIZ4R&wk1L<=Wopy)FCL z`|9@F?O%6*aiFXosh?io(;#l>XiRHtKREheOH)A8fnP`by6uqFp{m1%hnF0o9+`in z|7h{i-ey^I_pzK~4_hX++&(_;_?6bNt!*cwPnn&Z(oP15Y11M!_SXuRlmv8jDj`;kk*myTTyyL|Er@5;HWu~*x#C11O7 zJ>z=E4dIQaH}h}4yj66o@Alj~gga$-b?;W(GrL#)yVLKxJA670-w(Tg{z2k{+Ybc~ zpFdJO`qVl9G5vAH6U!$xPd%O<>Wb*P_-y>M&gZh{ech#h=>4(oh2x9;e}?>dzGqxd z=S%s^{#T1$o4nrk#_LT>Z+!2)w*_ze-j%&KdB6Pw`@^Y^sUM&8P5ngrRQcKIbJLgT zFL(M2`uk;kIe*|NfWd}lX9MtR8vyh)02mkH`C+{J&Nm>4`kp#~z<p51poj50RR91Mgb@Q0{{R30RRF3 z0EcM+1ONa40RR91P5=M^00000kN^Mx0RR91kN^Mx0RRG^0ssU600031000)C0{{d7 z00031000&M0001X3))-&000SaNLh0L02Utt+h&P)%(@| z8N$HeFWf$iH2mK5*HyNwfBuW_SE~PX6|Ro%jQ0w^uCl^yWrT+u6I=|5@gIpjkW9EM zksN^$!h)ySw0~=}FbR7f4FPJ0007-$b&|HO R!L|SZ002ovPDHLkV1k!k)=U5Z literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/SideMenu/side_menu_icon.imageset/side_menu_icon@2x.png b/Riot/Assets/Images.xcassets/SideMenu/side_menu_icon.imageset/side_menu_icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..26726446b36f8d61cb904713c1109867aa973f3d GIT binary patch literal 4176 zcmYLMcQo8x*ZmnpXCA$mU`UVqy5;3C_qPI-+5~J5(@aUpMi|9lz(Yw(nN-{)= zPSof=`O5p34NH8NsGVgLZhG}M(}+%f-OfbZQ^D0R3Z0FYYQ zD=Fz}C@Hb)zIC;+cd`Zm^{8Yxfq~v2ZMN|X4Z9%Sf>5mTCLW4XF@~L8ADoQBqttv) zq|l3QE(>;~d(O|-{P5$35nxDi-;=HvOGol>sM(+@?-0UORdG4=2mNRCgPbk;s`&LU zECb*!b@s$i_A`lm&==ioFvAdIY6|+k2MCml3$Xy0+T}S`diwhT-jM6XwO!G`PZz@# z4=a#yx9|zNXlf9EB8{vKC04-c83mTOLFuhvz>_Q>L^^FFKh}s5E{(_V1r(snG1Xr2If(C+L~)o zLp&BX`_KF^JCBN;u;|02D?iKOc1Pn|_wN)OFE$%be??7+@gM zV*^%GKeDnCxhQkez@xBiG#a;0R5VMp*#jlqfBL+;2`Vee;R3cDZekw&F4gYeQ90DE zpPo80@p};*;~jG48r`c=0@lOn_@t8fuR&xThnVgvw`!@g;I^fZxaYWP#WUSrR}vv( zu2@q2BP)iv!$`c?wlaC4w8yZADZed68*6m4s0%A7>Xka!A{XhGeG~podOE=Q;(ZLm zhzc(;34A@SE~;QK!@t_ErfVE;^gF9zKx-c>Ps|~wzOQ4XHjPSDM$_3R#YTylEARJZ zg0dPcJlW~PY%G;=1dl;Nfh1i33Gb_6P?EwU)E5tN_ipp81i}u2wUh*jM~VchD!GJPauoJ6I&hSXppl3mC&kn7MnE~l|IAoYP)ll60RL$) zzqUe*k zUS&G&B5|nC>0{GDCIA$6eSIBqGuhiA({}6EILdZg=q3R&Cr|~l9?|ixsW`Ay_=1-f zU0~&#RkjbDX0^&ykdt$a$80;va=F05h->h&~xEv zC_PDFR*vRPNFVT0m#kqnjB!$QK$)XL2832gC*!^=?{S(A@U3!2=ZQ=MqH4Pn3A{{e zxf6DjQaGau#ksv3{_a9XQLudJ3EyLSU-GtS&)l&IGg1p9daBwk6Cts_-sLKHex@X= z+Uh4|pwhmrD#)3Rd7o63%MLEIhe3kGE6h=XSf>yFjM`tUozOhSwSW5ncJ(BHZNKv? zcmq#3n4~kOgY!M-D!7PJlZYm?JQO#S>W#PuC6+Qu88Q*HLE>e_D3mG@(iqv8-IzK1 z%!x;q>oifFiz<=i0g75}If+=Kut2onLqUFlRsnRijdkWnRT0_aVw5T1~1oP+`)f+DyKbE^dj&w8_>}2kyE!-(cT}3nMM9 zVWVLk$FdY<#|l^>hP8ak=ue&O_^~}&XUO`t3&uvh5jleRr6<=_@^SgfYF7L+wdi0|Igzbr7I9bRrSg_s7 z=~b46J0qBknbiAU)4jEOEu{0LzN9B)ZKQgn#SAb8RLNXD@w9Bg zT~-@Gev32VY}~dqmI2 z;lx)AuOC#K*!xT$G7O`7U#-?n39TWyRJ8w!ts&U8iX7eyV<2Zi^ z%_5?$>Q-oYK2j|_7_)DiQn8($TQJ-)S@ZA2_c%Z#G?sbUvq9tQvqg@*MVBSoT~nU3~Y&FUl|Jl8?fcB1kQ{ zpGK$IHguhNOm!^P?2+01N-{I?RtBt9EAqF?!OhOfHs_y`qs_y*lhI?-b-xeJ9dWjg zEptve&%!Q752RQBbT0OP9YRu)6z1)Xfd=EY}w51 zVpnFN9?DQaY(LQ+kuVjM`w1lv_nx|c zCUwRau1(JxtC}ZG+$ucWoQ04zQwM{s!|6B#Xa6Xp*P~Gp?Lwoq6 z-~$7ep^)JlMB-VR*v}E=si<=*3Z2RHo}4d_lThgyO`Jzma&hLP`=iU&<-=S5yumNU z9}DB?O742}JlC#iL&MYJ^l+zGGDwo|ZF5iOGBKhdl+TdQC!Hy|Md**InF+SO_2z2& z>IeR6@JMjTi+A?fUp#7hSM8G)tRL09FzlzkeNb9-JdnR;OcQAt{IPl*V8xE{u_Q0@ z?bG4Y=+m_2WIXX$6lt@cv|lfl)-jj3)<7s9j0yi{2xbrvF1JBv`XFg-F-3C&J7seM zZce{Oa;7B3-|n6IO#Ap81@IyG49yOIwM_44{K_25k-q);Ct>khibLv%?A z<~tmdDrX{OqjIf@8LCNkg=rgk6m^wat~hKttZl^&r499o);p$DoPU9}o;v8;&Fp#D zY|~cwHJCNtOopS#JeWqsQ(Ujkl2(hEGVhDez!%_fCy2|V`73X&p%gv2T4cqXLvx+~ z_PX<=Gs^;1eFNqUGrc3YP+dS|{~SZL|VPX(E)T{Z8bX7WCFhexC` z=dq?E3vTTWCa^Y!Zhxw?tSF2jb>C%W_s)_r)#c7SA9b>184!nO56~s~#ke|bQY*+` zONOU&;cl|)TVsAXa=$bGxDw3!&u=|GGqY>m@Tx9(_wq79t1~sul)T0Nka&Nnsk9ot zP|0oHf{b{?(MvVVBdQ~l&AJu6(R}7~Rf}G)S%3GV5V>((y%)9;bBzqY z@@cm<(OK6zAHIRdm}RzNPy4pDwOsx8+Zym)FR{sO;yz!maWA_|;!D_ajTl^#>yag$ z**gArzYZsB0}UH(ZQ$XZCIs+s7ywg49H#$hRUBRb_rLof0En;$@c!2Wz2mZ*9 zkxGHOW06bS@JPi`>$yl{WaROx96PHrnBrsVQm5jH#mZ=?LwSVF3Wq2xmS^Ffa&<2I ztT**7VHB@SWN08;;Uvs4Nknuot|c=b(qig4$u-NhFEEHkxBs!hx*M@L_jafmPgTgrYEI+KKrD7-euUzN^>jVQ(Hy{UMPWjo2htZF$CXrKv>BA z)>FP5-VD1iZbpp-zjarrv|n7|YoQ;j2Yf$I)I%hO3Lv86uOfGGU6l;d;Rmuyj*_r@8-3k-8@-!^a5r?W^8PqT47F z7!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJdH5r3MTPuM!v-tY$DUh!@P+6=(yLXi1ImO!M_+&;qhK7+4vF z7?^=9Mj&Khlwtsx24pdKF-pVPL5vzuHB1Z)?U@WLP&H9N8pKop5pbG$0VBf11x#?& zP79b3Y@iN?y(>2z1X7#@9+AZi3_9K*%(&Ec+Df2Nk(nV8B@w}FfdWk9dNvV1j zxdk9y3^o;3KxS@gNuokUZcbjYRfVk*ScMgk4HDK@QUEI{$+lIB@C{IK&M!(;Fx4~B zGf=YQQczH^DN0GR3UYCSY6tRcl`=|73as??%gf94%8m8%i_-NCEiEne4UF`SjC6r2 zbc-wVN)jt{^NN)rhQQ2mNi9w;$}A|!%+FH*nVXoDUs__Tqy(}E4j}F<$xK7olvfP( z7SMzGAQ^o_Jp+BX*+8u}AWsb3~j(FQN*D3*yw{SM{*3rr(jW_SM9iL z^x?r~$K`WKJ(7WedAX;HV@L(#+o-cy!Hy#HW>zOBCwEI9)SI=mJBMqZLoJ))-7QDw zw!BkuTFbpwZ%fm`+^B+NX^peNBJvALCbx2nmj)i}y`tiKVy@(QPa})#zb}XA+?!}D z@GR|}dGY!0bB*`&Bv0{R3~CTjU`0?5^tBEI-+J`4nK{spamSZcoX5b>{+1xwR~4e~_znU2-?XQ=LDUjA5Rv2vXIRfU(g&b^!V z;NPz+A@d9cSc6$)F0a~lDyJrDXYb}!?s6M@P1gM7UDFexBiyt(Z~N&jQ`WDZI(0eE zVp$8NV@m>Da`N(iDL8#tcW=l1-P7XVfB*gF&mL=rf?MBxqb1K?EMZ+zsaIcHwRqcI zi&aJUT-JSPE|6S0L7-&+wgczzH};g&cWkPmG2+hD>?P%eU8N@%@5MNR+(Qt^-0*6@79bE z>8!7JSp^=eaW6@_5E|nb#g=~cRMw+46Hn;op7UKZ<)e7A-^O$PCB}XWH*EUyZ~0W! zfc zO&8VUR?A~4OFew{`VmnXCbhzD7Z#?6%kN$L?&Y)LdCceAhyU(&PRR{^Si-8T!0zHN z!9Ool-tI?=#jPC^1lTrg{kw2R@}tKkiOV!n8PX*bXT;v`Oy>=%n3r(Z?|JuxH}@8A zeR{rawW2^&()qJzD?d0r-4UTDlGZ)0h zFS+hmybTdGW~h~w1{7TtPX7hDD3NR$Mo*x1ZCEnE`Fa{gnx_}UkXI!sG} zG6KrE=eBMsdR2Hvv#fT?mc9eZHM=w(O__Z%0xh#B1atjiIpMllXbX=~1E}=#boFyt I=akR{0G91iQ~&?~ literal 0 HcmV?d00001 diff --git a/Riot/Generated/Images.swift b/Riot/Generated/Images.swift index 08f3dbdf8..836c561d0 100644 --- a/Riot/Generated/Images.swift +++ b/Riot/Generated/Images.swift @@ -158,6 +158,11 @@ internal enum Asset { internal static let secretsResetWarning = ImageAsset(name: "secrets_reset_warning") internal static let removeIconPink = ImageAsset(name: "remove_icon_pink") internal static let settingsIcon = ImageAsset(name: "settings_icon") + internal static let sideMenuActionIconFeedback = ImageAsset(name: "side_menu_action_icon_feedback") + internal static let sideMenuActionIconHelp = ImageAsset(name: "side_menu_action_icon_help") + internal static let sideMenuActionIconSettings = ImageAsset(name: "side_menu_action_icon_settings") + internal static let sideMenuActionIconShare = ImageAsset(name: "side_menu_action_icon_share") + internal static let sideMenuIcon = ImageAsset(name: "side_menu_icon") internal static let featureUnavaibleArtwork = ImageAsset(name: "feature_unavaible_artwork") internal static let featureUnavaibleArtworkDark = ImageAsset(name: "feature_unavaible_artwork_dark") internal static let tabFavourites = ImageAsset(name: "tab_favourites") From ac918783801ae717c09c05acae5b2f51f1c8c7df Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 3 Jun 2021 19:10:44 +0200 Subject: [PATCH 263/393] Create BuildInfo that gives build information made at compilation time. --- Riot/Managers/AppInfo/BuildInfo.h | 41 ++++++++++++++ Riot/Managers/AppInfo/BuildInfo.m | 89 +++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 Riot/Managers/AppInfo/BuildInfo.h create mode 100644 Riot/Managers/AppInfo/BuildInfo.m diff --git a/Riot/Managers/AppInfo/BuildInfo.h b/Riot/Managers/AppInfo/BuildInfo.h new file mode 100644 index 000000000..8817b6c41 --- /dev/null +++ b/Riot/Managers/AppInfo/BuildInfo.h @@ -0,0 +1,41 @@ +// +// Copyright 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. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// BuildInfo gives build information made at compilation time. +@interface BuildInfo : NSObject + +/// Git branch name. If GIT_BRANCH was provided during compilation in command line argument. +@property (nonatomic, copy, readonly, nullable) NSString *buildNumber; + +/// Git branch name. If BUILD_NUMBER was provided during compilation in command line argument. +@property (nonatomic, copy, readonly, nullable) NSString *buildBranch; + +/// Readable build version +@property (nonatomic, copy, readonly) NSString *readableBuildVersion; + +/// Convenience init. Check whether GIT_BRANCH and BUILD_NUMBER were provided during compilation in command line argument. +- (instancetype)init; + +/// Designated initializer to give input properties values +- (instancetype)initWithBuildBranch:(nullable NSString*)buildBranch buildNumber:(nullable NSString*)buildNumber NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Riot/Managers/AppInfo/BuildInfo.m b/Riot/Managers/AppInfo/BuildInfo.m new file mode 100644 index 000000000..b97e9fd2f --- /dev/null +++ b/Riot/Managers/AppInfo/BuildInfo.m @@ -0,0 +1,89 @@ +// +// Copyright 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. +// + +#import "BuildInfo.h" + +#define MAKE_STRING(x) #x +#define MAKE_NS_STRING(x) @MAKE_STRING(x) + +@interface BuildInfo() + +@property (nonatomic, copy, readwrite, nullable) NSString *buildNumber; +@property (nonatomic, copy, readwrite, nullable) NSString *buildBranch; +@property (nonatomic, copy, readwrite) NSString *readableBuildVersion; + +@end + +@implementation BuildInfo + +- (instancetype)init +{ + NSString *buildBranch; + NSString *buildNumber; + + // Check whether GIT_BRANCH was provided during compilation in command line argument. +#ifdef GIT_BRANCH + buildBranch = MAKE_NS_STRING(GIT_BRANCH); +#endif + + // Check whether BUILD_NUMBER was provided during compilation in command line argument. +#ifdef BUILD_NUMBER + buildNumber = [NSString stringWithFormat:@"#%@", @(BUILD_NUMBER)]; +#endif + + self = [self initWithBuildBranch:buildBranch buildNumber:buildNumber]; + return self; +} + +- (instancetype)initWithBuildBranch:(NSString*)buildBranch buildNumber:(NSString*)buildNumber +{ + self = [super init]; + if (self) + { + _buildBranch = buildBranch; + _buildNumber = buildNumber; + } + return self; +} + +- (NSString*)readableBuildVersion +{ + if (!_readableBuildVersion) + { + NSString *buildBranch = self.buildBranch; + NSString *buildNumber = self.buildNumber; + + if (buildBranch && buildNumber) + { + _readableBuildVersion = [NSString stringWithFormat:@"%@ %@", buildBranch, buildNumber]; + } + else if (buildNumber) + { + _readableBuildVersion = buildNumber; + } + else if (buildBranch) + { + _readableBuildVersion = buildBranch; + } + else + { + _readableBuildVersion = NSLocalizedStringFromTable(@"settings_config_no_build_info", @"Vector", nil); + } + } + return _readableBuildVersion; +} + +@end From 69bfbbbd5a9d40462cf443a2e695f1247f3bcd32 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Thu, 3 Jun 2021 19:13:57 +0200 Subject: [PATCH 264/393] Create AppInfo used to handle the application information. --- Riot/Managers/AppInfo/AppInfo.swift | 55 +++++++++++++++++++ .../{AppVersion => AppInfo}/AppVersion.swift | 0 2 files changed, 55 insertions(+) create mode 100644 Riot/Managers/AppInfo/AppInfo.swift rename Riot/Managers/{AppVersion => AppInfo}/AppVersion.swift (100%) diff --git a/Riot/Managers/AppInfo/AppInfo.swift b/Riot/Managers/AppInfo/AppInfo.swift new file mode 100644 index 000000000..457a7af87 --- /dev/null +++ b/Riot/Managers/AppInfo/AppInfo.swift @@ -0,0 +1,55 @@ +// +// Copyright 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. +// + +import Foundation + +/// Used to handle the application information +@objcMembers +final class AppInfo: NSObject { + + // MARK: - Constants + + /// Current application information + static var current: AppInfo { + let appDisplayName = BuildSettings.bundleDisplayName + let buildInfo: BuildInfo = BuildInfo() + + return AppInfo(displayName: appDisplayName, + appVersion: AppVersion.current, + buildInfo: buildInfo) + } + + // MARK: - Properties + + /// App display name + let displayName: String + + /// Current app version + let appVersion: AppVersion? + + /// Compilation build info + let buildInfo: BuildInfo + + // MARK: - Setup + + init(displayName: String, + appVersion: AppVersion?, + buildInfo: BuildInfo) { + self.displayName = displayName + self.appVersion = appVersion + self.buildInfo = buildInfo + } +} diff --git a/Riot/Managers/AppVersion/AppVersion.swift b/Riot/Managers/AppInfo/AppVersion.swift similarity index 100% rename from Riot/Managers/AppVersion/AppVersion.swift rename to Riot/Managers/AppInfo/AppVersion.swift From 4f2b5745c3a2091ab79753f5e1b5da54d3471ee7 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Fri, 4 Jun 2021 12:06:27 +0200 Subject: [PATCH 265/393] LegacyAppDelegate: Use AppInfo. --- Riot/Modules/Application/LegacyAppDelegate.m | 43 ++++---------------- 1 file changed, 9 insertions(+), 34 deletions(-) diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index 9158de0df..82f8de09a 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -78,9 +78,6 @@ #define CALL_STATUS_BAR_HEIGHT 44 -#define MAKE_STRING(x) #x -#define MAKE_NS_STRING(x) @MAKE_STRING(x) - NSString *const kAppDelegateDidTapStatusBarNotification = @"kAppDelegateDidTapStatusBarNotification"; NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateNetworkStatusDidChangeNotification"; @@ -230,6 +227,8 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni @property (nonatomic, strong) SpaceFeatureUnavailablePresenter *spaceFeatureUnavailablePresenter; +@property (nonatomic, strong) AppInfo *appInfo; + @end @implementation LegacyAppDelegate @@ -304,38 +303,12 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni - (NSString*)appVersion { - if (!_appVersion) - { - _appVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; - } - - return _appVersion; + return self.appInfo.appVersion.bundleShortVersion; } - (NSString*)build { - if (!_build) - { - NSString *buildBranch = nil; - NSString *buildNumber = nil; - // Check whether GIT_BRANCH and BUILD_NUMBER were provided during compilation in command line argument. -#ifdef GIT_BRANCH - buildBranch = MAKE_NS_STRING(GIT_BRANCH); -#endif -#ifdef BUILD_NUMBER - buildNumber = [NSString stringWithFormat:@"#%@", @(BUILD_NUMBER)]; -#endif - if (buildBranch && buildNumber) - { - _build = [NSString stringWithFormat:@"%@ %@", buildBranch, buildNumber]; - } else if (buildNumber){ - _build = buildNumber; - } else - { - _build = buildBranch ? buildBranch : NSLocalizedStringFromTable(@"settings_config_no_build_info", @"Vector", nil); - } - } - return _build; + return self.appInfo.buildInfo.readableBuildVersion; } - (void)setIsOffline:(BOOL)isOffline @@ -404,10 +377,12 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni _configuration = [AppConfiguration new]; + self.appInfo = AppInfo.current; + // Log app information - NSString *appDisplayName = [[NSBundle mainBundle] infoDictionary][@"CFBundleDisplayName"]; - NSString* appVersion = [AppDelegate theDelegate].appVersion; - NSString* build = [AppDelegate theDelegate].build; + NSString *appDisplayName = self.appInfo.displayName; + NSString* appVersion = self.appVersion; + NSString* build = self.build; MXLogDebug(@"------------------------------"); MXLogDebug(@"Application info:"); From ea89a8e3afeba7b6e9aba26332fddce3d0a32fec Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Fri, 4 Jun 2021 12:07:16 +0200 Subject: [PATCH 266/393] PlaceholderDetailViewController: Handle theme update for navigation bar. --- Riot/Modules/SplitView/PlaceholderDetailViewController.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Modules/SplitView/PlaceholderDetailViewController.swift b/Riot/Modules/SplitView/PlaceholderDetailViewController.swift index 6dd7d8b41..9fdd3ac2c 100644 --- a/Riot/Modules/SplitView/PlaceholderDetailViewController.swift +++ b/Riot/Modules/SplitView/PlaceholderDetailViewController.swift @@ -63,6 +63,10 @@ final class PlaceholderDetailViewController: UIViewController, Themable { self.view.backgroundColor = theme.backgroundColor self.logoImageView.tintColor = theme.tintColor + + if let navigationBar = self.navigationController?.navigationBar { + theme.applyStyle(onNavigationBar: navigationBar) + } } // MARK: - Private From 71af441ab3eaa183c67f7c8f6393e762e5763a74 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Fri, 4 Jun 2021 16:11:02 +0200 Subject: [PATCH 267/393] Create AvatarView: Base class to support an avatar view. --- Riot/Modules/Common/Avatar/AvatarView.swift | 158 ++++++++++++++++++ .../Avatar/AvatarViewDataProtocol.swift | 32 ++++ 2 files changed, 190 insertions(+) create mode 100644 Riot/Modules/Common/Avatar/AvatarView.swift create mode 100644 Riot/Modules/Common/Avatar/AvatarViewDataProtocol.swift diff --git a/Riot/Modules/Common/Avatar/AvatarView.swift b/Riot/Modules/Common/Avatar/AvatarView.swift new file mode 100644 index 000000000..6a9ce71e9 --- /dev/null +++ b/Riot/Modules/Common/Avatar/AvatarView.swift @@ -0,0 +1,158 @@ +// +// Copyright 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. +// + +import UIKit + +/// Base class to support an avatar view +class AvatarView: UIView, Themable { + + // MARK: - Properties + + // MARK: Outlets + + @IBOutlet weak var avatarImageView: MXKImageView! { + didSet { + self.setupAvatarImageView() + } + } + + // MARK: Private + + private var theme: Theme? + + // MARK: Public + + override var isUserInteractionEnabled: Bool { + get { + return super.isUserInteractionEnabled + } + set { + super.isUserInteractionEnabled = newValue + self.updateAccessibilityTraits() + } + } + + /// Indicate highlighted state + var isHighlighted: Bool = false { + didSet { + self.updateView() + } + } + + var action: (() -> Void)? + + // MARK: - Setup + + private func commonInit() { + self.setupGestureRecognizer() + self.updateAccessibilityTraits() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.commonInit() + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.commonInit() + } + + // MARK: - Lifecycle + + override func layoutSubviews() { + super.layoutSubviews() + + self.avatarImageView.layer.cornerRadius = self.avatarImageView.bounds.height/2 + } + + // MARK: - Public + + func fill(with viewData: AvatarViewDataProtocol) { + self.updateAvatarImageView(with: viewData) + self.setNeedsLayout() + } + + func update(theme: Theme) { + self.theme = theme + } + + func updateAccessibilityTraits() { + + } + + func setupAvatarImageView() { + self.avatarImageView.defaultBackgroundColor = UIColor.clear + self.avatarImageView.enableInMemoryCache = true + self.avatarImageView.layer.masksToBounds = true + } + + func updateAvatarImageView(with viewData: AvatarViewDataProtocol) { + guard let avatarImageView = self.avatarImageView else { + return + } + + let defaultavatarImage = AvatarGenerator.generateAvatar(forMatrixItem: viewData.matrixItemId, withDisplayName: viewData.displayName) + + if let avatarUrl = viewData.avatarUrl { + avatarImageView.setImageURI(avatarUrl, + withType: nil, + andImageOrientation: .up, + toFitViewSize: avatarImageView.frame.size, + with: MXThumbnailingMethodScale, + previewImage: defaultavatarImage, + mediaManager: viewData.mediaManager) + } else { + avatarImageView.image = defaultavatarImage + } + + avatarImageView.contentMode = .scaleAspectFill + } + + func updateView() { + // TODO: Handle highlighted state + } + + // MARK: - Private + + private func setupGestureRecognizer() { + let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(buttonAction(_:))) + gestureRecognizer.minimumPressDuration = 0 + self.addGestureRecognizer(gestureRecognizer) + } + + // MARK: - Actions + + @objc private func buttonAction(_ sender: UILongPressGestureRecognizer) { + + let isBackgroundViewTouched = sender.vc_isTouchingInside() + + switch sender.state { + case .began, .changed: + self.isHighlighted = isBackgroundViewTouched + case .ended: + self.isHighlighted = false + + if isBackgroundViewTouched { + self.action?() + } + case .cancelled: + self.isHighlighted = false + default: + break + } + } +} diff --git a/Riot/Modules/Common/Avatar/AvatarViewDataProtocol.swift b/Riot/Modules/Common/Avatar/AvatarViewDataProtocol.swift new file mode 100644 index 000000000..b63721ae4 --- /dev/null +++ b/Riot/Modules/Common/Avatar/AvatarViewDataProtocol.swift @@ -0,0 +1,32 @@ +// +// Copyright 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. +// + +import Foundation + +/// AvatarViewDataProtocol describe a view data that should be given to an AvatarView sublcass +protocol AvatarViewDataProtocol { + /// Matrix item identifier (user id or room id) + var matrixItemId: String { get } + + /// Matrix item display name (user or room display name) + var displayName: String? { get } + + /// Matrix item avatar URL (user or room avatar url) + var avatarUrl: String? { get } + + /// Matrix media handler + var mediaManager: MXMediaManager { get } +} From 5ced06837b17e0d13454f9c066094acfcf90b068 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Fri, 4 Jun 2021 16:13:12 +0200 Subject: [PATCH 268/393] RoomAvatarView: Now inherits from AvatarView, make RoomAvatarViewData conform to AvatarViewDataProtocol. --- .../Room/Views/Avatar/RoomAvatarView.swift | 92 +++---------------- .../Views/Avatar/RoomAvatarViewData.swift | 8 +- 2 files changed, 17 insertions(+), 83 deletions(-) diff --git a/Riot/Modules/Room/Views/Avatar/RoomAvatarView.swift b/Riot/Modules/Room/Views/Avatar/RoomAvatarView.swift index e23add9c7..1b4612a36 100644 --- a/Riot/Modules/Room/Views/Avatar/RoomAvatarView.swift +++ b/Riot/Modules/Room/Views/Avatar/RoomAvatarView.swift @@ -17,35 +17,17 @@ import UIKit import Reusable -final class RoomAvatarView: UIView, NibOwnerLoadable, Themable { +final class RoomAvatarView: AvatarView, NibOwnerLoadable { // MARK: - Properties // MARK: Outlets - @IBOutlet private weak var avatarImageView: MXKImageView! @IBOutlet private weak var cameraBadgeContainerView: UIView! - // MARK: Private - - private var theme: Theme? - - private var isHighlighted: Bool = false { - didSet { - self.updateView() - } - } - - // MARK: Public - - var action: (() -> Void)? - // MARK: Setup private func commonInit() { - self.setupAvatarImageView() - self.setupGestureRecognizer() - self.vc_setupAccessibilityTraitsButton(withTitle: VectorL10n.roomAvatarViewAccessibilityLabel, hint: VectorL10n.roomAvatarViewAccessibilityHint, isEnabled: true) } required init?(coder aDecoder: NSCoder) { @@ -70,7 +52,7 @@ final class RoomAvatarView: UIView, NibOwnerLoadable, Themable { // MARK: - Public - func fill(with viewData: RoomAvatarViewData) { + override func fill(with viewData: AvatarViewDataProtocol) { self.updateAvatarImageView(with: viewData) // Fix layoutSubviews not triggered issue @@ -78,72 +60,20 @@ final class RoomAvatarView: UIView, NibOwnerLoadable, Themable { self.setNeedsLayout() } } - - func update(theme: Theme) { - self.theme = theme - } - // MARK: - Private + // MARK: - Overrides - private func setupGestureRecognizer() { - let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(buttonAction(_:))) - gestureRecognizer.minimumPressDuration = 0 - self.addGestureRecognizer(gestureRecognizer) - } - - private func setupAvatarImageView() { - self.avatarImageView.defaultBackgroundColor = UIColor.clear - self.avatarImageView.enableInMemoryCache = true - self.avatarImageView.layer.masksToBounds = true - } - - private func updateAvatarImageView(with viewData: RoomAvatarViewData) { - guard let avatarImageView = self.avatarImageView else { - return - } - - let defaultavatarImage = AvatarGenerator.generateAvatar(forMatrixItem: viewData.roomId, withDisplayName: viewData.roomDisplayName) - - if let avatarUrl = viewData.avatarUrl { - avatarImageView.setImageURI(avatarUrl, - withType: nil, - andImageOrientation: .up, - toFitViewSize: avatarImageView.frame.size, - with: MXThumbnailingMethodScale, - previewImage: defaultavatarImage, - mediaManager: viewData.mediaManager) + override func updateAccessibilityTraits() { + if self.isUserInteractionEnabled { + self.vc_setupAccessibilityTraitsButton(withTitle: VectorL10n.roomAvatarViewAccessibilityLabel, hint: VectorL10n.roomAvatarViewAccessibilityHint, isEnabled: true) } else { - avatarImageView.image = defaultavatarImage + self.vc_setupAccessibilityTraitsImage(withTitle: VectorL10n.roomAvatarViewAccessibilityLabel) } + } + + override func updateAvatarImageView(with viewData: AvatarViewDataProtocol) { + super.updateAvatarImageView(with: viewData) - avatarImageView.contentMode = .scaleAspectFill - self.cameraBadgeContainerView.isHidden = viewData.avatarUrl != nil } - - private func updateView() { - // TODO: Handle highlighted state - } - - // MARK: - Actions - - @objc private func buttonAction(_ sender: UILongPressGestureRecognizer) { - - let isBackgroundViewTouched = sender.vc_isTouchingInside() - - switch sender.state { - case .began, .changed: - self.isHighlighted = isBackgroundViewTouched - case .ended: - self.isHighlighted = false - - if isBackgroundViewTouched { - self.action?() - } - case .cancelled: - self.isHighlighted = false - default: - break - } - } } diff --git a/Riot/Modules/Room/Views/Avatar/RoomAvatarViewData.swift b/Riot/Modules/Room/Views/Avatar/RoomAvatarViewData.swift index 82185499c..bf6f4888d 100644 --- a/Riot/Modules/Room/Views/Avatar/RoomAvatarViewData.swift +++ b/Riot/Modules/Room/Views/Avatar/RoomAvatarViewData.swift @@ -16,9 +16,13 @@ import Foundation -struct RoomAvatarViewData { +struct RoomAvatarViewData: AvatarViewDataProtocol { let roomId: String - let roomDisplayName: String? + let displayName: String? let avatarUrl: String? let mediaManager: MXMediaManager + + var matrixItemId: String { + return roomId + } } From 1a982e04dc024041583af8d9fd43aa7c27143145 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Fri, 4 Jun 2021 16:24:52 +0200 Subject: [PATCH 269/393] RoomCreationIntroCell: Handle RoomAvatarViewData updates. --- .../BubbleCells/RoomCreationIntro/RoomCreationIntroCell.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Modules/Room/Views/BubbleCells/RoomCreationIntro/RoomCreationIntroCell.swift b/Riot/Modules/Room/Views/BubbleCells/RoomCreationIntro/RoomCreationIntroCell.swift index d0204a410..f53c943c2 100644 --- a/Riot/Modules/Room/Views/BubbleCells/RoomCreationIntro/RoomCreationIntroCell.swift +++ b/Riot/Modules/Room/Views/BubbleCells/RoomCreationIntro/RoomCreationIntroCell.swift @@ -187,7 +187,7 @@ class RoomCreationIntroCell: MXKRoomBubbleTableViewCell { let displayName = roomSummary.displayname ?? "" let roomAvatarViewData = RoomAvatarViewData(roomId: roomId, - roomDisplayName: displayName, + displayName: displayName, avatarUrl: room.summary.avatar, mediaManager: session.mediaManager) return RoomCreationIntroViewData(dicussionType: discussionType, roomDisplayName: displayName, avatarViewData: roomAvatarViewData) From e4eca4f293f5bce2fa858f43d0a6b7edf33e2119 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Fri, 4 Jun 2021 16:26:02 +0200 Subject: [PATCH 270/393] Create UserAvatarView. --- Riot/Assets/en.lproj/Vector.strings | 5 ++ Riot/Categories/UIView.swift | 7 +++ Riot/Generated/Strings.swift | 8 +++ Riot/Modules/User/Avatar/UserAvatarView.swift | 49 +++++++++++++++++++ .../User/Avatar/UserAvatarViewData.swift | 28 +++++++++++ 5 files changed, 97 insertions(+) create mode 100644 Riot/Modules/User/Avatar/UserAvatarView.swift create mode 100644 Riot/Modules/User/Avatar/UserAvatarViewData.swift diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index dc0cbc884..a80be93d1 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -1643,3 +1643,8 @@ Tap the + to start adding people."; "space_beta_announce_title" = "Spaces are coming soon"; "space_beta_announce_subtitle" = "The new version of communities"; "space_beta_announce_information" = "Spaces are a new way to group rooms and people. They’re not on iOS yet, but you can use them now on Web and Desktop."; + +// Mark: - User avatar view + +"user_avatar_view_accessibility_label" = "avatar"; +"user_avatar_view_accessibility_hint" = "Change user avatar"; diff --git a/Riot/Categories/UIView.swift b/Riot/Categories/UIView.swift index 9edde2c23..b36d73bb6 100644 --- a/Riot/Categories/UIView.swift +++ b/Riot/Categories/UIView.swift @@ -65,6 +65,13 @@ extension UIView { } } + @objc func vc_setupAccessibilityTraitsImage(withTitle title: String) { + self.isAccessibilityElement = false + self.accessibilityLabel = title + self.accessibilityHint = nil + self.accessibilityTraits = .image + } + @objc func vc_addShadow(withColor color: UIColor, offset: CGSize, radius: CGFloat, opacity: CGFloat) { layer.shadowColor = color.cgColor layer.shadowOpacity = Float(opacity) diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 8a7a8bae0..2fff0ea2c 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -4662,6 +4662,14 @@ internal enum VectorL10n { internal static var unknownDevicesVerify: String { return VectorL10n.tr("Vector", "unknown_devices_verify") } + /// Change user avatar + internal static var userAvatarViewAccessibilityHint: String { + return VectorL10n.tr("Vector", "user_avatar_view_accessibility_hint") + } + /// avatar + internal static var userAvatarViewAccessibilityLabel: String { + return VectorL10n.tr("Vector", "user_avatar_view_accessibility_label") + } /// If you didn’t sign in to this session, your account may be compromised. internal static var userVerificationSessionDetailsAdditionalInformationUntrustedCurrentUser: String { return VectorL10n.tr("Vector", "user_verification_session_details_additional_information_untrusted_current_user") diff --git a/Riot/Modules/User/Avatar/UserAvatarView.swift b/Riot/Modules/User/Avatar/UserAvatarView.swift new file mode 100644 index 000000000..9e57958f5 --- /dev/null +++ b/Riot/Modules/User/Avatar/UserAvatarView.swift @@ -0,0 +1,49 @@ +// +// Copyright 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. +// + +import UIKit +import Reusable + +final class UserAvatarView: AvatarView { + + // MARK: - Setup + + private func commonInit() { + let avatarImageView = MXKImageView() + self.vc_addSubViewMatchingParent(avatarImageView) + self.avatarImageView = avatarImageView + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.commonInit() + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.commonInit() + } + + // MARK: - Overrides + + override func updateAccessibilityTraits() { + if self.isUserInteractionEnabled { + self.vc_setupAccessibilityTraitsButton(withTitle: VectorL10n.userAvatarViewAccessibilityLabel, hint: VectorL10n.userAvatarViewAccessibilityHint, isEnabled: true) + } else { + self.vc_setupAccessibilityTraitsImage(withTitle: VectorL10n.userAvatarViewAccessibilityLabel) + } + } +} diff --git a/Riot/Modules/User/Avatar/UserAvatarViewData.swift b/Riot/Modules/User/Avatar/UserAvatarViewData.swift new file mode 100644 index 000000000..ce7be8ba6 --- /dev/null +++ b/Riot/Modules/User/Avatar/UserAvatarViewData.swift @@ -0,0 +1,28 @@ +// +// Copyright 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. +// + +import Foundation + +struct UserAvatarViewData: AvatarViewDataProtocol { + let userId: String + let displayName: String? + let avatarUrl: String? + let mediaManager: MXMediaManager + + var matrixItemId: String { + return userId + } +} From 00a665cc79d89f74eaccb6520e61e2dff4b99dac Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Sun, 6 Jun 2021 23:48:13 +0200 Subject: [PATCH 271/393] Add SideMenuItem that represents side menu actions. --- Riot/Assets/en.lproj/Vector.strings | 8 +++ Riot/Generated/Strings.swift | 20 ++++++++ Riot/Modules/SideMenu/SideMenuItem.swift | 62 ++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 Riot/Modules/SideMenu/SideMenuItem.swift diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index a80be93d1..b81eae062 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -1648,3 +1648,11 @@ Tap the + to start adding people."; "user_avatar_view_accessibility_label" = "avatar"; "user_avatar_view_accessibility_hint" = "Change user avatar"; + +// Mark: - Side menu + +"side_menu_action_invite_friends" = "Invite friends"; +"side_menu_action_settings" = "Settings"; +"side_menu_action_help" = "Help"; +"side_menu_action_feedback" = "Feedback"; +"side_menu_app_version" = "Version %@"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 2fff0ea2c..6444878cb 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -4486,6 +4486,26 @@ internal enum VectorL10n { internal static var shareExtensionFailedToEncrypt: String { return VectorL10n.tr("Vector", "share_extension_failed_to_encrypt") } + /// Feedback + internal static var sideMenuActionFeedback: String { + return VectorL10n.tr("Vector", "side_menu_action_feedback") + } + /// Help + internal static var sideMenuActionHelp: String { + return VectorL10n.tr("Vector", "side_menu_action_help") + } + /// Invite friends + internal static var sideMenuActionInviteFriends: String { + return VectorL10n.tr("Vector", "side_menu_action_invite_friends") + } + /// Settings + internal static var sideMenuActionSettings: String { + return VectorL10n.tr("Vector", "side_menu_action_settings") + } + /// Version %@ + internal static func sideMenuAppVersion(_ p1: String) -> String { + return VectorL10n.tr("Vector", "side_menu_app_version", p1) + } /// Sign out internal static var signOutExistingKeyBackupAlertSignOutAction: String { return VectorL10n.tr("Vector", "sign_out_existing_key_backup_alert_sign_out_action") diff --git a/Riot/Modules/SideMenu/SideMenuItem.swift b/Riot/Modules/SideMenu/SideMenuItem.swift new file mode 100644 index 000000000..9d522dec1 --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuItem.swift @@ -0,0 +1,62 @@ +// +// Copyright 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. +// + +import Foundation + +/// SideMenuItem represents side menu actions +enum SideMenuItem { + case inviteFriends + case settings + case help + case feedback +} + +extension SideMenuItem { + + var title: String { + let title: String + + switch self { + case .inviteFriends: + title = VectorL10n.sideMenuActionInviteFriends + case .settings: + title = VectorL10n.sideMenuActionSettings + case .help: + title = VectorL10n.sideMenuActionHelp + case .feedback: + title = VectorL10n.sideMenuActionFeedback + } + + return title + } + + var icon: UIImage { + let icon: UIImage + + switch self { + case .inviteFriends: + icon = Asset.Images.sideMenuActionIconShare.image + case .settings: + icon = Asset.Images.sideMenuActionIconSettings.image + case .help: + icon = Asset.Images.sideMenuActionIconHelp.image + case .feedback: + icon = Asset.Images.sideMenuActionIconFeedback.image + } + + return icon + } +} From 1f3a77d769ac1372312a4f12a76986af2441e6c5 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Sun, 6 Jun 2021 23:52:23 +0200 Subject: [PATCH 272/393] Add SideMenuActionView that represents a side menu action view. --- .../Modules/SideMenu/SideMenuActionView.swift | 103 ++++++++++++++++++ Riot/Modules/SideMenu/SideMenuActionView.xib | 54 +++++++++ 2 files changed, 157 insertions(+) create mode 100644 Riot/Modules/SideMenu/SideMenuActionView.swift create mode 100644 Riot/Modules/SideMenu/SideMenuActionView.xib diff --git a/Riot/Modules/SideMenu/SideMenuActionView.swift b/Riot/Modules/SideMenu/SideMenuActionView.swift new file mode 100644 index 000000000..6d4dc27a6 --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuActionView.swift @@ -0,0 +1,103 @@ +// +// Copyright 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. +// + +import UIKit +import Reusable + +protocol SideMenuActionViewDelegate: class { + func sideMenuActionView(_ actionView: SideMenuActionView, didTapMenuItem sideMenuItem: SideMenuItem?) +} + +/// SideMenuActionView represents a side menu action view +final class SideMenuActionView: UIView, NibOwnerLoadable { + + private enum Constants { + static let highlightedAlpha: CGFloat = 0.5 + } + + // MARK: - Properties + + // MARK: Outlets + + @IBOutlet private weak var button: UIButton! + + // MARK: Private + + private var theme: Theme! + private var sideMenuItem: SideMenuItem? + + // MARK: Public + + weak var delegate: SideMenuActionViewDelegate? + + // MARK: - Setup + + class func instantiate() -> SideMenuActionView { + let view = SideMenuActionView() + view.theme = ThemeService.shared().theme + return view + } + + private func commonInit() { + self.button.contentHorizontalAlignment = .left + } + + convenience init() { + self.init(frame: CGRect.zero) + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.loadNibContent() + self.commonInit() + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.loadNibContent() + self.commonInit() + } + + // MARK: - Public + + func fill(with image: UIImage, title: String) { + self.button.setTitle(title, for: .normal) + self.button.setImage(image, for: .normal) + } + + func fill(with sideMenuItem: SideMenuItem) { + self.sideMenuItem = sideMenuItem + self.fill(with: sideMenuItem.icon, title: sideMenuItem.title) + } + + // MARK: - Action + + @IBAction private func buttonAction(_ sender: UIButton) { + self.delegate?.sideMenuActionView(self, didTapMenuItem: self.sideMenuItem) + } +} + +// MARK: - Themable +extension SideMenuActionView: Themable { + + func update(theme: Theme) { + self.theme = theme + + self.button.setTitleColor(theme.textSecondaryColor, for: .normal) + self.button.setTitleColor(theme.textSecondaryColor.withAlphaComponent(Constants.highlightedAlpha), for: .highlighted) + self.button.tintColor = theme.textSecondaryColor + } +} diff --git a/Riot/Modules/SideMenu/SideMenuActionView.xib b/Riot/Modules/SideMenu/SideMenuActionView.xib new file mode 100644 index 000000000..b1ea1a367 --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuActionView.xib @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 1d85a6448d74c7add0f4e99af545fdc1deb70bee Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Sun, 6 Jun 2021 23:52:56 +0200 Subject: [PATCH 273/393] Add SideMenuVersionView that displays application version. --- .../SideMenu/SideMenuVersionView.swift | 77 +++++++++++++++++++ Riot/Modules/SideMenu/SideMenuVersionView.xib | 42 ++++++++++ 2 files changed, 119 insertions(+) create mode 100644 Riot/Modules/SideMenu/SideMenuVersionView.swift create mode 100644 Riot/Modules/SideMenu/SideMenuVersionView.xib diff --git a/Riot/Modules/SideMenu/SideMenuVersionView.swift b/Riot/Modules/SideMenu/SideMenuVersionView.swift new file mode 100644 index 000000000..a1d62db74 --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuVersionView.swift @@ -0,0 +1,77 @@ +// +// Copyright 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. +// + +import UIKit +import Reusable + +/// SideMenuVersionView displays application version +final class SideMenuVersionView: UIView, NibOwnerLoadable { + + // MARK: - Properties + + // MARK: Outlets + + @IBOutlet private weak var label: UILabel! + + // MARK: Private + + private var theme: Theme! + + // MARK: Public + + // MARK: - Setup + + class func instantiate() -> SideMenuVersionView { + let view = SideMenuVersionView() + view.theme = ThemeService.shared().theme + return view + } + + private func commonInit() { + } + + convenience init() { + self.init(frame: CGRect.zero) + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + self.loadNibContent() + self.commonInit() + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.loadNibContent() + self.commonInit() + } + + // MARK: - Public + + func fill(with version: String) { + self.label.text = VectorL10n.sideMenuAppVersion(version) + } +} + +// MARK: - Themable +extension SideMenuVersionView: Themable { + + func update(theme: Theme) { + self.theme = theme + + self.label.textColor = theme.textSecondaryColor + } +} diff --git a/Riot/Modules/SideMenu/SideMenuVersionView.xib b/Riot/Modules/SideMenu/SideMenuVersionView.xib new file mode 100644 index 000000000..21922cf7d --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuVersionView.xib @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f547dc68d90a8eb3ab2e4ca3ba55ab618b521395 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 00:33:12 +0200 Subject: [PATCH 274/393] Implements side menu screen. --- Riot/Generated/Storyboards.swift | 5 + .../Modules/SideMenu/SideMenuViewAction.swift | 25 ++ .../SideMenuViewController.storyboard | 149 ++++++++++++ .../SideMenu/SideMenuViewController.swift | 218 ++++++++++++++++++ Riot/Modules/SideMenu/SideMenuViewModel.swift | 130 +++++++++++ .../SideMenu/SideMenuViewModelType.swift | 36 +++ Riot/Modules/SideMenu/SideMenuViewState.swift | 32 +++ 7 files changed, 595 insertions(+) create mode 100644 Riot/Modules/SideMenu/SideMenuViewAction.swift create mode 100644 Riot/Modules/SideMenu/SideMenuViewController.storyboard create mode 100644 Riot/Modules/SideMenu/SideMenuViewController.swift create mode 100644 Riot/Modules/SideMenu/SideMenuViewModel.swift create mode 100644 Riot/Modules/SideMenu/SideMenuViewModelType.swift create mode 100644 Riot/Modules/SideMenu/SideMenuViewState.swift diff --git a/Riot/Generated/Storyboards.swift b/Riot/Generated/Storyboards.swift index 8e7290c1a..d592e4f76 100644 --- a/Riot/Generated/Storyboards.swift +++ b/Riot/Generated/Storyboards.swift @@ -224,6 +224,11 @@ internal enum StoryboardScene { internal static let searchableDirectoryViewController = SceneType(storyboard: ShowDirectoryViewController.self, identifier: "SearchableDirectoryViewController") } + internal enum SideMenuViewController: StoryboardType { + internal static let storyboardName = "SideMenuViewController" + + internal static let initialScene = InitialSceneType(storyboard: SideMenuViewController.self) + } internal enum SimpleScreenTemplateViewController: StoryboardType { internal static let storyboardName = "SimpleScreenTemplateViewController" diff --git a/Riot/Modules/SideMenu/SideMenuViewAction.swift b/Riot/Modules/SideMenu/SideMenuViewAction.swift new file mode 100644 index 000000000..b494e07dc --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuViewAction.swift @@ -0,0 +1,25 @@ +// File created from ScreenTemplate +// $ createScreen.sh SideMenu SideMenu +/* + Copyright 2020 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import Foundation + +/// SideMenuViewController view actions exposed to view model +enum SideMenuViewAction { + case loadData + case tap(menuItem: SideMenuItem, sourceView: UIView) +} diff --git a/Riot/Modules/SideMenu/SideMenuViewController.storyboard b/Riot/Modules/SideMenu/SideMenuViewController.storyboard new file mode 100644 index 000000000..e8ff4cd3e --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuViewController.storyboard @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Riot/Modules/SideMenu/SideMenuViewController.swift b/Riot/Modules/SideMenu/SideMenuViewController.swift new file mode 100644 index 000000000..4b61e3a20 --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuViewController.swift @@ -0,0 +1,218 @@ +// File created from ScreenTemplate +// $ createScreen.sh SideMenu SideMenu +/* + Copyright 2020 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import UIKit + +final class SideMenuViewController: UIViewController { + + // MARK: - Constants + + private enum Constants { + static let sideMenuActionViewHeight: CGFloat = 44.0 + } + + // MARK: - Properties + + // MARK: Outlets + + @IBOutlet private weak var scrollView: UIScrollView! + + // User info + @IBOutlet private weak var userAvatarView: UserAvatarView! + @IBOutlet private weak var userDisplayNameLabel: UILabel! + @IBOutlet private weak var userIdLabel: UILabel! + + // Bottom menu items + + @IBOutlet private weak var menuItemsStackView: UIStackView! + + // MARK: Private + + private var viewModel: SideMenuViewModelType! + private var theme: Theme! + private var keyboardAvoider: KeyboardAvoider? + private var errorPresenter: MXKErrorPresentation! + private var activityPresenter: ActivityIndicatorPresenter! + + private var sideMenuActionViews: [SideMenuActionView] = [] + private weak var sideMenuVersionView: SideMenuVersionView? + + // MARK: - Setup + + class func instantiate(with viewModel: SideMenuViewModelType) -> SideMenuViewController { + let viewController = StoryboardScene.SideMenuViewController.initialScene.instantiate() + viewController.viewModel = viewModel + viewController.theme = ThemeService.shared().theme + return viewController + } + + // MARK: - Life cycle + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + + self.setupViews() + self.activityPresenter = ActivityIndicatorPresenter() + self.errorPresenter = MXKErrorAlertPresentation() + + self.registerThemeServiceDidChangeThemeNotification() + self.update(theme: self.theme) + + self.viewModel.viewDelegate = self + + self.viewModel.process(viewAction: .loadData) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + navigationController?.setNavigationBarHidden(true, animated: animated) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return self.theme.statusBarStyle + } + + // MARK: - Private + + private func update(theme: Theme) { + self.theme = theme + + if let navigationBar = self.navigationController?.navigationBar { + theme.applyStyle(onNavigationBar: navigationBar) + } + + self.view.backgroundColor = theme.headerBackgroundColor + + self.userAvatarView.update(theme: theme) + self.userDisplayNameLabel.textColor = theme.textPrimaryColor + self.userIdLabel.textColor = theme.textSecondaryColor + + for sideMenuActionView in self.sideMenuActionViews { + sideMenuActionView.update(theme: theme) + } + + self.sideMenuVersionView?.update(theme: theme) + } + + private func registerThemeServiceDidChangeThemeNotification() { + NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .themeServiceDidChangeTheme, object: nil) + } + + @objc private func themeDidChange() { + self.update(theme: ThemeService.shared().theme) + } + + private func setupViews() { + } + + private func render(viewState: SideMenuViewState) { + switch viewState { + case .loading: + self.renderLoading() + case .loaded(let viewData): + self.renderLoaded(viewData: viewData) + case .error(let error): + self.render(error: error) + } + } + + private func renderLoading() { + self.activityPresenter.presentActivityIndicator(on: self.view, animated: true) + } + + private func renderLoaded(viewData: SideMenuViewData) { + self.activityPresenter.removeCurrentActivityIndicator(animated: true) + + self.updateUserInformation(with: viewData.userAvatarViewData) + self.updateBottomMenuItems(with: viewData) + } + + private func updateUserInformation(with userAvatarViewData: UserAvatarViewData) { + self.userIdLabel.text = userAvatarViewData.userId + self.userDisplayNameLabel.text = userAvatarViewData.displayName + self.userDisplayNameLabel.isHidden = userAvatarViewData.displayName.isEmptyOrNil + + self.userAvatarView.fill(with: userAvatarViewData) + } + + private func updateBottomMenuItems(with viewData: SideMenuViewData) { + + self.menuItemsStackView.vc_removeAllSubviews() + self.sideMenuActionViews = [] + + for sideMenuItem in viewData.sideMenuItems { + let sideMenuActionView = SideMenuActionView.instantiate() + sideMenuActionView.translatesAutoresizingMaskIntoConstraints = false + sideMenuActionView.heightAnchor.constraint(equalToConstant: Constants.sideMenuActionViewHeight).isActive = true + sideMenuActionView.update(theme: self.theme) + sideMenuActionView.fill(with: sideMenuItem) + sideMenuActionView.delegate = self + + self.menuItemsStackView.addArrangedSubview(sideMenuActionView) + sideMenuActionView.widthAnchor.constraint(equalTo: menuItemsStackView.widthAnchor).isActive = true + + self.sideMenuActionViews.append(sideMenuActionView) + } + + if let appVersion = viewData.appVersion { + let sideMenuVersionView = SideMenuVersionView.instantiate() + sideMenuVersionView.translatesAutoresizingMaskIntoConstraints = false + sideMenuVersionView.update(theme: self.theme) + sideMenuVersionView.fill(with: appVersion) + + self.menuItemsStackView.addArrangedSubview(sideMenuVersionView) + sideMenuVersionView.widthAnchor.constraint(equalTo: menuItemsStackView.widthAnchor).isActive = true + + self.sideMenuVersionView = sideMenuVersionView + } + } + + private func render(error: Error) { + self.activityPresenter.removeCurrentActivityIndicator(animated: true) + self.errorPresenter.presentError(from: self, forError: error, animated: true, handler: nil) + } + + + // MARK: - Actions +} + +// MARK: - SideMenuViewModelViewDelegate +extension SideMenuViewController: SideMenuViewModelViewDelegate { + + func sideMenuViewModel(_ viewModel: SideMenuViewModelType, didUpdateViewState viewSate: SideMenuViewState) { + self.render(viewState: viewSate) + } +} + +// MARK: - SideMenuActionViewDelegate +extension SideMenuViewController: SideMenuActionViewDelegate { + func sideMenuActionView(_ actionView: SideMenuActionView, didTapMenuItem sideMenuItem: SideMenuItem?) { + guard let sideMenuItem = sideMenuItem else { + return + } + + self.viewModel.process(viewAction: .tap(menuItem: sideMenuItem, sourceView: actionView)) + } +} diff --git a/Riot/Modules/SideMenu/SideMenuViewModel.swift b/Riot/Modules/SideMenu/SideMenuViewModel.swift new file mode 100644 index 000000000..532543e17 --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuViewModel.swift @@ -0,0 +1,130 @@ +// File created from ScreenTemplate +// $ createScreen.sh SideMenu SideMenu +/* + Copyright 2020 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import Foundation + +final class SideMenuViewModel: SideMenuViewModelType { + + // MARK: - Properties + + // MARK: Private + + private let userSessionsService: UserSessionsService + private let appInfo: AppInfo + + private var currentOperation: MXHTTPOperation? + + // MARK: Public + + weak var viewDelegate: SideMenuViewModelViewDelegate? + weak var coordinatorDelegate: SideMenuViewModelCoordinatorDelegate? + + // MARK: - Setup + + init(userSessionsService: UserSessionsService, appInfo: AppInfo) { + self.userSessionsService = userSessionsService + self.appInfo = appInfo + } + + deinit { + self.cancelOperations() + } + + // MARK: - Public + + func process(viewAction: SideMenuViewAction) { + switch viewAction { + case .loadData: + self.loadData() + case .tap(menuItem: let menuItem, sourceView: let sourceView): + self.coordinatorDelegate?.sideMenuViewModel(self, didTapMenuItem: menuItem, fromSourceView: sourceView) + } + } + + // MARK: - Private + + private func loadData() { + + self.update(viewState: .loading) + + guard let mainUserSession = self.userSessionsService.mainUserSession else { + return + } + self.updateView(with: mainUserSession) + + self.registerUserSessionsServiceNotifications() + } + + private func userAvatarViewData(from mxSession: MXSession) -> UserAvatarViewData? { + guard let userId = mxSession.myUserId, let mediaManager = mxSession.mediaManager else { + return nil + } + let userDisplayName = mxSession.myUser.displayname + let avatarUrl = mxSession.myUser.avatarUrl + + return UserAvatarViewData(userId: userId, + displayName: userDisplayName, + avatarUrl: avatarUrl, + mediaManager: mediaManager) + } + + private func update(viewState: SideMenuViewState) { + self.viewDelegate?.sideMenuViewModel(self, didUpdateViewState: viewState) + } + + private func cancelOperations() { + self.currentOperation?.cancel() + } + + private func updateView(with userSession: UserSession) { + guard let userAvatarViewData = self.userAvatarViewData(from: userSession.matrixSession) else { + return + } + + let sideMenuItems: [SideMenuItem] = [ + .inviteFriends, + .settings, + .help, + .feedback + ] + + let appVersion = self.appInfo.appVersion?.bundleShortVersion + + let viewData = SideMenuViewData(userAvatarViewData: userAvatarViewData, sideMenuItems: sideMenuItems, appVersion: appVersion) + + self.update(viewState: .loaded(viewData)) + } + + private func registerUserSessionsServiceNotifications() { + + // Listen only notifications from the current UserSessionsService instance + + NotificationCenter.default.addObserver(self, selector: #selector(userSessionDidChange(_:)), name: UserSessionsService.userSessionDidChange, object: self.userSessionsService) + } + + @objc private func userSessionDidChange(_ notification: Notification) { + guard let userSession = notification.userInfo?[UserSessionsService.NotificationUserInfoKey.userSession] as? UserSession else { + return + } + + // Main user session did change (maybe avatar or display name changed) + if let mainUserSession = self.userSessionsService.mainUserSession, mainUserSession.userId == userSession.userId { + self.updateView(with: mainUserSession) + } + } +} diff --git a/Riot/Modules/SideMenu/SideMenuViewModelType.swift b/Riot/Modules/SideMenu/SideMenuViewModelType.swift new file mode 100644 index 000000000..1ab51f3cf --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuViewModelType.swift @@ -0,0 +1,36 @@ +// File created from ScreenTemplate +// $ createScreen.sh SideMenu SideMenu +/* + Copyright 2020 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import Foundation + +protocol SideMenuViewModelViewDelegate: class { + func sideMenuViewModel(_ viewModel: SideMenuViewModelType, didUpdateViewState viewSate: SideMenuViewState) +} + +protocol SideMenuViewModelCoordinatorDelegate: class { + func sideMenuViewModel(_ viewModel: SideMenuViewModelType, didTapMenuItem menuItem: SideMenuItem, fromSourceView sourceView: UIView) +} + +/// Protocol describing the view model used by `SideMenuViewController` +protocol SideMenuViewModelType { + + var viewDelegate: SideMenuViewModelViewDelegate? { get set } + var coordinatorDelegate: SideMenuViewModelCoordinatorDelegate? { get set } + + func process(viewAction: SideMenuViewAction) +} diff --git a/Riot/Modules/SideMenu/SideMenuViewState.swift b/Riot/Modules/SideMenu/SideMenuViewState.swift new file mode 100644 index 000000000..f47e19361 --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuViewState.swift @@ -0,0 +1,32 @@ +// File created from ScreenTemplate +// $ createScreen.sh SideMenu SideMenu +/* + Copyright 2020 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import Foundation + +struct SideMenuViewData { + let userAvatarViewData: UserAvatarViewData + let sideMenuItems: [SideMenuItem] + let appVersion: String? +} + +/// SideMenuViewController view state +enum SideMenuViewState { + case loading + case loaded(_ viewData: SideMenuViewData) + case error(Error) +} From 7c1228c2dc1536025f69d31280aceb63348f7129 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 01:54:15 +0200 Subject: [PATCH 275/393] Implement SideMenuCoordinator. --- .../SideMenu/SideMenuCoordinator.swift | 181 ++++++++++++++++++ .../SideMenu/SideMenuCoordinatorType.swift | 31 +++ Riot/SupportingFiles/Riot-Bridging-Header.h | 2 + 3 files changed, 214 insertions(+) create mode 100644 Riot/Modules/SideMenu/SideMenuCoordinator.swift create mode 100644 Riot/Modules/SideMenu/SideMenuCoordinatorType.swift diff --git a/Riot/Modules/SideMenu/SideMenuCoordinator.swift b/Riot/Modules/SideMenu/SideMenuCoordinator.swift new file mode 100644 index 000000000..13414e382 --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuCoordinator.swift @@ -0,0 +1,181 @@ +// File created from ScreenTemplate +// $ createScreen.sh SideMenu SideMenu +/* + Copyright 2020 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import Foundation +import UIKit +import SideMenu +import SafariServices + +class SideMenuCoordinatorParameters { + let userSessionsService: UserSessionsService + let appInfo: AppInfo + + init(userSessionsService: UserSessionsService, appInfo: AppInfo) { + self.userSessionsService = userSessionsService + self.appInfo = appInfo + } +} + +final class SideMenuCoordinator: SideMenuCoordinatorType { + + // MARK: - Properties + + // MARK: Private + + private let parameters: SideMenuCoordinatorParameters + private var sideMenuViewModel: SideMenuViewModelType + + private lazy var sideMenuNavigationViewController: SideMenuNavigationController = { + return self.createSideMenuNavigationController(with: self.sideMenuViewController) + }() + + private let sideMenuViewController: SideMenuViewController + + // MARK: Public + + // Must be used only internally + var childCoordinators: [Coordinator] = [] + + weak var delegate: SideMenuCoordinatorDelegate? + + // MARK: - Setup + + init(parameters: SideMenuCoordinatorParameters) { + self.parameters = parameters + + let sideMenuViewModel = SideMenuViewModel(userSessionsService: self.parameters.userSessionsService, appInfo: parameters.appInfo) + self.sideMenuViewController = SideMenuViewController.instantiate(with: sideMenuViewModel) + self.sideMenuViewModel = sideMenuViewModel + } + + // MARK: - Public methods + + func start() { + self.sideMenuViewModel.coordinatorDelegate = self + + self.sideMenuNavigationViewController.sideMenuDelegate = self + + // Set the sideMenuNavigationViewController as default left menu + SideMenuManager.default.leftMenuNavigationController = self.sideMenuNavigationViewController + } + + func toPresentable() -> UIViewController { + return self.sideMenuNavigationViewController + } + + @discardableResult func addScreenEdgePanGesturesToPresent(to view: UIView) -> UIScreenEdgePanGestureRecognizer { + return self.sideMenuNavigationViewController.sideMenuManager.addScreenEdgePanGesturesToPresent(toView: view, forMenu: .left) + } + + @discardableResult func addPanGestureToPresent(to view: UIView) -> UIPanGestureRecognizer { + return self.sideMenuNavigationViewController.sideMenuManager.addPanGestureToPresent(toView: view) + } + + // MARK: - Private + + private func createSideMenuNavigationController(with rootViewController: UIViewController) -> SideMenuNavigationController { + + var sideMenuSettings = SideMenuSettings() + sideMenuSettings.presentationStyle = .viewSlideOut + + let navigationController = SideMenuNavigationController(rootViewController: rootViewController, settings: sideMenuSettings) + + // Present side menu to the left + navigationController.leftSide = true + + return navigationController + } + + private func createSettingsViewController() -> SettingsViewController { + let viewController: SettingsViewController = SettingsViewController.instantiate() + viewController.loadViewIfNeeded() + return viewController + } + + private func showSettings() { + let viewController = self.createSettingsViewController() + + // Push view controller and dismiss side menu + self.sideMenuNavigationViewController.pushViewController(viewController, animated: true) + } + + private func showBugReport() { + let bugReportViewController = BugReportViewController() + + // Show in fullscreen to animate presentation along side menu dismiss + bugReportViewController.modalPresentationStyle = .fullScreen + bugReportViewController.modalTransitionStyle = .crossDissolve + + self.sideMenuNavigationViewController.present(bugReportViewController, animated: true) + } + + private func showHelp() { + guard let helpURL = URL(string: BuildSettings.applicationHelpUrlString) else { + return + } + + let safariViewController = SFSafariViewController(url: helpURL) + + // Show in fullscreen to animate presentation along side menu dismiss + safariViewController.modalPresentationStyle = .fullScreen + self.sideMenuNavigationViewController.present(safariViewController, animated: true, completion: nil) + } + + private func showInviteFriends(from sourceView: UIView?) { + let myUserId = self.parameters.userSessionsService.mainUserSession?.userId ?? "" + + let inviteFriendsPresenter = InviteFriendsPresenter() + inviteFriendsPresenter.present(for: myUserId, from: self.sideMenuViewController, sourceView: sourceView, animated: true) + } +} + +// MARK: - SideMenuViewModelCoordinatorDelegate +extension SideMenuCoordinator: SideMenuViewModelCoordinatorDelegate { + + func sideMenuViewModel(_ viewModel: SideMenuViewModelType, didTapMenuItem menuItem: SideMenuItem, fromSourceView sourceView: UIView) { + + switch menuItem { + case .inviteFriends: + self.showInviteFriends(from: sourceView) + case .settings: + self.showSettings() + case .help: + self.showHelp() + case .feedback: + self.showBugReport() + } + + self.delegate?.sideMenuCoordinator(self, didTapMenuItem: menuItem, fromSourceView: sourceView) + } +} + +// MARK: - SideMenuNavigationControllerDelegate +extension SideMenuCoordinator: SideMenuNavigationControllerDelegate { + + func sideMenuWillAppear(menu: SideMenuNavigationController, animated: Bool) { + } + + func sideMenuDidAppear(menu: SideMenuNavigationController, animated: Bool) { + } + + func sideMenuWillDisappear(menu: SideMenuNavigationController, animated: Bool) { + } + + func sideMenuDidDisappear(menu: SideMenuNavigationController, animated: Bool) { + } +} diff --git a/Riot/Modules/SideMenu/SideMenuCoordinatorType.swift b/Riot/Modules/SideMenu/SideMenuCoordinatorType.swift new file mode 100644 index 000000000..f193c5a73 --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuCoordinatorType.swift @@ -0,0 +1,31 @@ +// File created from ScreenTemplate +// $ createScreen.sh SideMenu SideMenu +/* + Copyright 2020 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import Foundation + +protocol SideMenuCoordinatorDelegate: class { + func sideMenuCoordinator(_ coordinator: SideMenuCoordinatorType, didTapMenuItem menuItem: SideMenuItem, fromSourceView sourceView: UIView) +} + +/// `SideMenuCoordinatorType` is a protocol describing a Coordinator that handle key backup setup passphrase navigation flow. +protocol SideMenuCoordinatorType: Coordinator, Presentable { + var delegate: SideMenuCoordinatorDelegate? { get } + + @discardableResult func addScreenEdgePanGesturesToPresent(to view: UIView) -> UIScreenEdgePanGestureRecognizer + @discardableResult func addPanGestureToPresent(to view: UIView) -> UIPanGestureRecognizer +} diff --git a/Riot/SupportingFiles/Riot-Bridging-Header.h b/Riot/SupportingFiles/Riot-Bridging-Header.h index 8b93ea99a..3292be7d4 100644 --- a/Riot/SupportingFiles/Riot-Bridging-Header.h +++ b/Riot/SupportingFiles/Riot-Bridging-Header.h @@ -35,3 +35,5 @@ #import "TypingUserInfo.h" #import "UnifiedSearchViewController.h" #import "SettingsViewController.h" +#import "BugReportViewController.h" +#import "BuildInfo.h" From 8427b7035b162eb1700c7dbe94b72c43cf63b94b Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 01:54:50 +0200 Subject: [PATCH 276/393] BuildSettings: Add help url and side menu feature flag. --- Config/BuildSettings.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Config/BuildSettings.swift b/Config/BuildSettings.swift index e7d771d1f..3cfcf65dc 100644 --- a/Config/BuildSettings.swift +++ b/Config/BuildSettings.swift @@ -114,6 +114,8 @@ final class BuildSettings: NSObject { static let applicationCopyrightUrlString = "https://element.io/copyright" static let applicationPrivacyPolicyUrlString = "https://element.io/privacy" static let applicationTermsConditionsUrlString = "https://element.io/terms-of-service" + static let applicationHelpUrlString = + "https://element.io/help" // MARk: - Matrix permalinks @@ -200,6 +202,8 @@ final class BuildSettings: NSObject { static let allowInviteExernalUsers: Bool = true + static let enableSideMenu: Bool = true + // MARK: - Feature Specifics /// Not allowed pin codes. User won't be able to select one of the pin in the list. From 3f47262f0222d0cf9b79aaf32c898ee495640df7 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 17:20:28 +0200 Subject: [PATCH 277/393] Add SideMenuPresentable and an implementation thant handles side menu presentation. --- .../SideMenu/SideMenuPresentable.swift | 45 ++++++++++++++++ Riot/Modules/SideMenu/SideMenuPresenter.swift | 51 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 Riot/Modules/SideMenu/SideMenuPresentable.swift create mode 100644 Riot/Modules/SideMenu/SideMenuPresenter.swift diff --git a/Riot/Modules/SideMenu/SideMenuPresentable.swift b/Riot/Modules/SideMenu/SideMenuPresentable.swift new file mode 100644 index 000000000..126bf4133 --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuPresentable.swift @@ -0,0 +1,45 @@ +// +// Copyright 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. +// + +import Foundation + +/// SideMenuPresentable absract a side menu presenter +protocol SideMenuPresentable { + + /// Show side menu + func show(from presentable: Presentable, animated: Bool, completion: (() -> Void)?) + + /// Hide side menu + func dismiss(animated: Bool, completion: (() -> Void)?) + + /// Add screen edge gesture to reveal menu + @discardableResult func addScreenEdgePanGesturesToPresent(to view: UIView) -> UIScreenEdgePanGestureRecognizer + + /// Add pan gesture to reveal menu, like pan to reveal from a navigation bar + @discardableResult func addPanGestureToPresent(to view: UIView) -> UIPanGestureRecognizer +} + +// MARK: Default implementation +extension SideMenuPresentable { + + func show(from presentable: Presentable, animated: Bool) { + return self.show(from: presentable, animated: animated, completion: nil) + } + + func dismiss(animated: Bool) { + return self.dismiss(animated: animated, completion: nil) + } +} diff --git a/Riot/Modules/SideMenu/SideMenuPresenter.swift b/Riot/Modules/SideMenu/SideMenuPresenter.swift new file mode 100644 index 000000000..ce278c646 --- /dev/null +++ b/Riot/Modules/SideMenu/SideMenuPresenter.swift @@ -0,0 +1,51 @@ +// +// Copyright 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. +// + +import Foundation + +class SideMenuPresenter: SideMenuPresentable { + + // MARK: - Properties + + private let sideMenuCoordinator: SideMenuCoordinatorType + + // MARK: - Setup + + init(sideMenuCoordinator: SideMenuCoordinatorType) { + self.sideMenuCoordinator = sideMenuCoordinator + } + + // MARK: - Public + + func show(from presentable: Presentable, animated: Bool, completion: (() -> Void)?) { + let presentingViewController = presentable.toPresentable() + let sideMenuController = sideMenuCoordinator.toPresentable() + + presentingViewController.present(sideMenuController, animated: animated, completion: completion) + } + + func dismiss(animated: Bool, completion: (() -> Void)?) { + self.sideMenuCoordinator.toPresentable().dismiss(animated: animated, completion: completion) + } + + @discardableResult func addScreenEdgePanGesturesToPresent(to view: UIView) -> UIScreenEdgePanGestureRecognizer { + return sideMenuCoordinator.addScreenEdgePanGesturesToPresent(to: view) + } + + @discardableResult func addPanGestureToPresent(to view: UIView) -> UIPanGestureRecognizer { + return sideMenuCoordinator.addPanGestureToPresent(to: view) + } +} From da86c29768ba0571db959d09b2098382e814145c Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 18:27:03 +0200 Subject: [PATCH 278/393] Add AlertPresentable that absracts an alert presenter. --- .../Application/AppAlertPresenter.swift | 44 +++++++++++++++++++ .../Common/Alert/AlertPresentable.swift | 36 +++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 Riot/Modules/Application/AppAlertPresenter.swift create mode 100644 Riot/Modules/Common/Alert/AlertPresentable.swift diff --git a/Riot/Modules/Application/AppAlertPresenter.swift b/Riot/Modules/Application/AppAlertPresenter.swift new file mode 100644 index 000000000..f60a5ef34 --- /dev/null +++ b/Riot/Modules/Application/AppAlertPresenter.swift @@ -0,0 +1,44 @@ +// +// Copyright 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. +// + +import Foundation + +class AppAlertPresenter: AlertPresentable { + + // MARK: - Properties + + // swiftlint:disable weak_delegate + private let legacyAppDelegate: LegacyAppDelegate + // swiftlint:enable weak_delegate + + // MARK: - Setup + + init(legacyAppDelegate: LegacyAppDelegate) { + self.legacyAppDelegate = legacyAppDelegate + } + + // MARK: - Public + + func showError(_ error: Error, animated: Bool, completion: (() -> Void)?) { + // FIXME: Present an error on coordinator.toPresentable() + self.legacyAppDelegate.showError(asAlert: error) + } + + func show(title: String?, message: String?, animated: Bool, completion: (() -> Void)?) { + // FIXME: Present an error on coordinator.toPresentable() + self.legacyAppDelegate.showAlert(withTitle: title, message: message) + } +} diff --git a/Riot/Modules/Common/Alert/AlertPresentable.swift b/Riot/Modules/Common/Alert/AlertPresentable.swift new file mode 100644 index 000000000..d0ee0dcd4 --- /dev/null +++ b/Riot/Modules/Common/Alert/AlertPresentable.swift @@ -0,0 +1,36 @@ +// +// Copyright 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. +// + +import Foundation + +/// AlertPresentable absracts an alert presenter +protocol AlertPresentable { + + func showError(_ error: Error, animated: Bool, completion: (() -> Void)?) + func show(title: String?, message: String?, animated: Bool, completion: (() -> Void)?) +} + +// MARK: Default implementation +extension AlertPresentable { + + func showError(_ error: Error) { + self.showError(error, animated: true, completion: nil) + } + + func show(title: String?, message: String?) { + self.show(title: title, message: message, animated: true, completion: nil) + } +} From bc92b1294ce2d4d20d7e30065d29505e2046fffb Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 18:37:14 +0200 Subject: [PATCH 279/393] Add AppNavigator that enables to perform the navigation within the global app scope. --- Riot/Navigator/AppNavigator.swift | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 Riot/Navigator/AppNavigator.swift diff --git a/Riot/Navigator/AppNavigator.swift b/Riot/Navigator/AppNavigator.swift new file mode 100644 index 000000000..31ebd78b1 --- /dev/null +++ b/Riot/Navigator/AppNavigator.swift @@ -0,0 +1,26 @@ +// +// Copyright 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. +// + +import Foundation + +/// AppNavigatorProtocol abstract a navigator at app level. +/// It enables to perform the navigation within the global app scope (open the side menu, open a room and so on) +/// Note: Use a destination enum like presented here https://www.swiftbysundell.com/articles/navigation-in-swift/#where-to-navigator or use simple methods like Element Android Navigator +protocol AppNavigatorProtocol { + + var sideMenu: SideMenuPresentable { get } + var alert: AlertPresentable { get } +} From cb8ee866f9defa0b1aa309ba63e124361ebb6e50 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 18:40:24 +0200 Subject: [PATCH 280/393] TabBarCoordinator: Handle side menu. --- Riot/Modules/TabBar/TabBarCoordinator.swift | 37 +++++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/Riot/Modules/TabBar/TabBarCoordinator.swift b/Riot/Modules/TabBar/TabBarCoordinator.swift index 83757eb73..2c669b0b5 100644 --- a/Riot/Modules/TabBar/TabBarCoordinator.swift +++ b/Riot/Modules/TabBar/TabBarCoordinator.swift @@ -22,9 +22,11 @@ import UIKit class TabBarCoordinatorParameters { let userSessionsService: UserSessionsService + let appNavigator: AppNavigatorProtocol - init(userSessionsService: UserSessionsService) { + init(userSessionsService: UserSessionsService, appNavigator: AppNavigatorProtocol) { self.userSessionsService = userSessionsService + self.appNavigator = appNavigator } } @@ -80,6 +82,10 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { self.addMatrixSessionToMasterTabBarController(userSession.matrixSession) } + if BuildSettings.enableSideMenu { + self.setupSideMenuGestures() + } + self.registerUserSessionsServiceNotifications() } @@ -129,15 +135,22 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { // MARK: - Private methods - private func createMasterTabBarController() -> MasterTabBarController { + private func createMasterTabBarController() -> MasterTabBarController { let tabBarController = MasterTabBarController() - let settingsBarButtonItem: MXKBarButtonItem = MXKBarButtonItem(image: Asset.Images.settingsIcon.image, style: .plain) { [weak self] in - self?.showSettings() + if BuildSettings.enableSideMenu { + let sideMenuBarButtonItem: MXKBarButtonItem = MXKBarButtonItem(image: Asset.Images.sideMenuIcon.image, style: .plain) { [weak self] in + self?.showSideMenu() + } + tabBarController.navigationItem.leftBarButtonItem = sideMenuBarButtonItem + } else { + let settingsBarButtonItem: MXKBarButtonItem = MXKBarButtonItem(image: Asset.Images.sideMenuIcon.image, style: .plain) { [weak self] in + self?.showSettings() + } + settingsBarButtonItem.accessibilityLabel = VectorL10n.settingsTitle + + tabBarController.navigationItem.leftBarButtonItem = settingsBarButtonItem } - settingsBarButtonItem.accessibilityLabel = VectorL10n.settingsTitle - - tabBarController.navigationItem.leftBarButtonItem = settingsBarButtonItem let searchBarButtonItem: MXKBarButtonItem = MXKBarButtonItem(image: Asset.Images.searchIcon.image, style: .plain) { [weak self] in self?.showUnifiedSearch() @@ -229,8 +242,18 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { return viewController } + private func setupSideMenuGestures() { + self.parameters.appNavigator.sideMenu.addScreenEdgePanGesturesToPresent(to: self.masterNavigationController.view) + + self.parameters.appNavigator.sideMenu.addPanGestureToPresent(to: self.masterNavigationController.navigationBar) + } + // MARK: Navigation + private func showSideMenu() { + self.parameters.appNavigator.sideMenu.show(from: self.masterTabBarController, animated: true) + } + // FIXME: Should be displayed per tab. private func showSettings() { let viewController = self.createSettingsViewController() From 1e071e6e9eaecd18084aefd39c4ffb8d697694a6 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 18:41:55 +0200 Subject: [PATCH 281/393] AppCoordinator: Handle side menu and AppNavigator injection. --- Riot/Modules/Application/AppCoordinator.swift | 69 ++++++++++++++++--- .../SplitView/SplitViewCoordinator.swift | 6 +- 2 files changed, 64 insertions(+), 11 deletions(-) diff --git a/Riot/Modules/Application/AppCoordinator.swift b/Riot/Modules/Application/AppCoordinator.swift index 58dac41bb..e3e196650 100755 --- a/Riot/Modules/Application/AppCoordinator.swift +++ b/Riot/Modules/Application/AppCoordinator.swift @@ -30,11 +30,16 @@ final class AppCoordinator: NSObject, AppCoordinatorType { // MARK: Private private let rootRouter: RootRouterType - // swiftlint:disable weak_delegate - private let legacyAppDelegate: LegacyAppDelegate = AppDelegate.theDelegate() + // swiftlint:disable weak_delegate + fileprivate let legacyAppDelegate: LegacyAppDelegate = AppDelegate.theDelegate() // swiftlint:enable weak_delegate + private lazy var appNavigator: AppNavigatorProtocol = { + return AppNavigator(appCoordinator: self) + }() + private weak var splitViewCoordinator: SplitViewCoordinatorType? + fileprivate weak var sideMenuCoordinator: SideMenuCoordinatorType? private let userSessionsService: UserSessionsService @@ -58,7 +63,13 @@ final class AppCoordinator: NSObject, AppCoordinatorType { // MARK: - Public methods func start() { - // NOTE: When split view is shown there can be no Matrix sessions ready. Keep this behavior or use a loading screen before showing the spit view. + self.setupTheme() + + if BuildSettings.enableSideMenu { + self.addSideMenu() + } + + // NOTE: When split view is shown there can be no Matrix sessions ready. Keep this behavior or use a loading screen before showing the split view. self.showSplitView() MXLog.debug("[AppCoordinator] Showed split view") } @@ -77,6 +88,10 @@ final class AppCoordinator: NSObject, AppCoordinatorType { // MARK: - Private methods + private func setupTheme() { + ThemeService.shared().themeId = RiotSettings.shared.userInterfaceTheme + } + private func showAuthentication() { // TODO: Implement } @@ -90,7 +105,7 @@ final class AppCoordinator: NSObject, AppCoordinatorType { } private func showSplitView() { - let coordinatorParameters = SplitViewCoordinatorParameters(router: self.rootRouter, userSessionsService: self.userSessionsService) + let coordinatorParameters = SplitViewCoordinatorParameters(router: self.rootRouter, userSessionsService: self.userSessionsService, appNavigator: self.appNavigator) let splitViewCoordinator = SplitViewCoordinator(parameters: coordinatorParameters) splitViewCoordinator.delegate = self @@ -99,13 +114,19 @@ final class AppCoordinator: NSObject, AppCoordinatorType { self.splitViewCoordinator = splitViewCoordinator } - private func checkAppVersion() { - // TODO: Implement + private func addSideMenu() { + let appInfo = AppInfo.current + let coordinatorParameters = SideMenuCoordinatorParameters(userSessionsService: self.userSessionsService, appInfo: appInfo) + + let coordinator = SideMenuCoordinator(parameters: coordinatorParameters) + coordinator.delegate = self + coordinator.start() + self.add(childCoordinator: coordinator) + self.sideMenuCoordinator = coordinator } - private func showError(_ error: Error) { - // FIXME: Present an error on coordinator.toPresentable() - self.legacyAppDelegate.showError(asAlert: error) + private func checkAppVersion() { + // TODO: Implement } private func handleDeepLinkOption(_ deepLinkOption: DeepLinkOption) -> Bool { @@ -158,3 +179,33 @@ extension AppCoordinator: SplitViewCoordinatorDelegate { self.legacyAppDelegate.authenticationDidComplete() } } + +// MARK: - SideMenuCoordinatorDelegate +extension AppCoordinator: SideMenuCoordinatorDelegate { + func sideMenuCoordinator(_ coordinator: SideMenuCoordinatorType, didTapMenuItem menuItem: SideMenuItem, fromSourceView sourceView: UIView) { + } +} + +// MARK: - AppNavigator + +// swiftlint:disable private_over_fileprivate +fileprivate class AppNavigator: AppNavigatorProtocol { +// swiftlint:enable private_over_fileprivate + + private unowned let appCoordinator: AppCoordinator + + let alert: AlertPresentable + + lazy var sideMenu: SideMenuPresentable = { + guard let sideMenuCoordinator = appCoordinator.sideMenuCoordinator else { + fatalError("sideMenuCoordinator is not initialized") + } + + return SideMenuPresenter(sideMenuCoordinator: sideMenuCoordinator) + }() + + init(appCoordinator: AppCoordinator) { + self.appCoordinator = appCoordinator + self.alert = AppAlertPresenter(legacyAppDelegate: appCoordinator.legacyAppDelegate) + } +} diff --git a/Riot/Modules/SplitView/SplitViewCoordinator.swift b/Riot/Modules/SplitView/SplitViewCoordinator.swift index b21353cb6..db35d8ff9 100644 --- a/Riot/Modules/SplitView/SplitViewCoordinator.swift +++ b/Riot/Modules/SplitView/SplitViewCoordinator.swift @@ -21,10 +21,12 @@ class SplitViewCoordinatorParameters { let router: RootRouterType let userSessionsService: UserSessionsService + let appNavigator: AppNavigatorProtocol - init(router: RootRouterType, userSessionsService: UserSessionsService) { + init(router: RootRouterType, userSessionsService: UserSessionsService, appNavigator: AppNavigatorProtocol) { self.router = router self.userSessionsService = userSessionsService + self.appNavigator = appNavigator } } @@ -122,7 +124,7 @@ final class SplitViewCoordinator: NSObject, SplitViewCoordinatorType { private func createTabBarCoordinator() -> TabBarCoordinator { - let coordinatorParameters = TabBarCoordinatorParameters(userSessionsService: self.parameters.userSessionsService) + let coordinatorParameters = TabBarCoordinatorParameters(userSessionsService: self.parameters.userSessionsService, appNavigator: self.parameters.appNavigator) let tabBarCoordinator = TabBarCoordinator(parameters: coordinatorParameters) tabBarCoordinator.delegate = self From 01dfa9cd007b8be569f6d476534662f0e29d26a8 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 18:42:16 +0200 Subject: [PATCH 282/393] Pods: Add SideMenu library. --- Podfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Podfile b/Podfile index 6b7502835..c13b458c9 100644 --- a/Podfile +++ b/Podfile @@ -68,6 +68,7 @@ abstract_target 'RiotPods' do pod 'ReadMoreTextView', '~> 3.0.1' pod 'SwiftBase32', '~> 0.9.0' pod 'SwiftJWT', '~> 3.6.200' + pod 'SideMenu', '~> 6.5' target 'RiotTests' do inherit! :search_paths From 7ac9537b55e788f5a9df2543c3d4faf421d39a41 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 19:41:45 +0200 Subject: [PATCH 283/393] Update 3rd party licenses. --- Riot/Assets/third_party_licenses.html | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Riot/Assets/third_party_licenses.html b/Riot/Assets/third_party_licenses.html index c7d99a22c..4dfc32ac7 100644 --- a/Riot/Assets/third_party_licenses.html +++ b/Riot/Assets/third_party_licenses.html @@ -1663,7 +1663,32 @@ defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +

+
  • + SideMenu (https://github.com/jonkykong/SideMenu/) +

    + Copyright (c) 2015 Jonathan Kent +

    + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: +

    + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. +

    + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +

    +
  • From b171351d48c65985960fb3efe9ba007088f60d1f Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Mon, 7 Jun 2021 20:16:20 +0200 Subject: [PATCH 284/393] Update changes --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2500123b5..5c9cf2f9a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -2,7 +2,7 @@ Changes to be released in next version ================================================= ✨ Features - * + * Add left panel (#4398). 🙌 Improvements * MXRoomSummary: Adapt room summary changes on MatrixSDK (#4360). From 28352b66073bfde907d5420f846f46bd03bfd5dc Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Tue, 8 Jun 2021 12:13:16 +0300 Subject: [PATCH 285/393] Remove all call bar related things --- Riot/Managers/Call/CallPresenter.swift | 114 +--------- .../Managers/Call/CallPresenterDelegate.swift | 11 - .../Operations/CallBarDismissOperation.swift | 37 ---- .../Operations/CallBarPresentOperation.swift | 46 ---- .../Operations/CallBarUpdateOperation.swift | 38 ---- Riot/Modules/Application/LegacyAppDelegate.h | 8 - Riot/Modules/Application/LegacyAppDelegate.m | 209 ------------------ 7 files changed, 6 insertions(+), 457 deletions(-) delete mode 100644 Riot/Managers/Call/Operations/CallBarDismissOperation.swift delete mode 100644 Riot/Managers/Call/Operations/CallBarPresentOperation.swift delete mode 100644 Riot/Managers/Call/Operations/CallBarUpdateOperation.swift diff --git a/Riot/Managers/Call/CallPresenter.swift b/Riot/Managers/Call/CallPresenter.swift index e3b4f6e31..1fcedfe63 100644 --- a/Riot/Managers/Call/CallPresenter.swift +++ b/Riot/Managers/Call/CallPresenter.swift @@ -48,13 +48,11 @@ class CallPresenter: NSObject { updateOnHoldCall() } } - private weak var inBarCallVC: UIViewController? private weak var pipCallVC: UIViewController? /// UI operation queue for various UI operations private var uiOperationQueue: OperationQueue = .main /// Flag to indicate whether the presenter is active. private var isStarted: Bool = false - private var callTimer: Timer? #if canImport(JitsiMeetSDK) private var widgetEventsListener: Any? /// Jitsi calls map. Keys are CallKit call UUIDs, values are corresponding widgets. @@ -121,7 +119,6 @@ class CallPresenter: NSObject { MXLog.debug("[CallPresenter] start") addCallObservers() - startCallTimer() } /// Stop the service @@ -129,22 +126,6 @@ class CallPresenter: NSObject { MXLog.debug("[CallPresenter] stop") removeCallObservers() - stopCallTimer() - } - - /// Method to be called when the call status bar is tapped. - func callStatusBarTapped() { - MXLog.debug("[CallPresenter] callStatusBarTapped") - - if let callVC = (inBarCallVC ?? activeCallVC) as? CallViewController { - dismissCallBar(for: callVC) - presentCallVC(callVC) - return - } - if let jitsiVC = jitsiVC { - dismissCallBar(for: jitsiVC) - presentCallVC(jitsiVC) - } } // MARK - Group Calls @@ -412,17 +393,12 @@ class CallPresenter: NSObject { if let oldCallVC = self.callVCs.values.first, self.presentedCallVC == nil, !self.uiOperationQueue.containsPresentCallVCOperation, - !self.uiOperationQueue.containsPresentCallBarOperation { + !self.uiOperationQueue.containsEnterPiPOperation { // present the call bar after dismissing this one - self.presentCallBar(for: oldCallVC) + self.enterPipCallVC(oldCallVC) } } - if inBarCallVC == callVC { - // this call currently in the status bar, - // first present it and then dismiss it - presentCallVC(callVC) - } if pipCallVC == callVC { // this call currently in the PiP mode, // first present it by exiting PiP mode and then dismiss it @@ -446,36 +422,6 @@ class CallPresenter: NSObject { } } - // MARK: - Timer - - private func startCallTimer() { - callTimer = Timer.scheduledTimer(timeInterval: 1.0, - target: self, - selector: #selector(callTimerFired(_:)), - userInfo: nil, - repeats: true) - } - - private func stopCallTimer() { - callTimer?.invalidate() - callTimer = nil - } - - @objc private func callTimerFired(_ timer: Timer) { - if let inBarCallVC = inBarCallVC as? CallViewController { - guard let call = inBarCallVC.mxCall else { - return - } - guard call.state != .ended else { - return - } - - updateCallBar() - } else if inBarCallVC as? JitsiViewController != nil { - updateCallBar() - } - } - // MARK: - Observers private func addCallObservers() { @@ -614,14 +560,11 @@ class CallPresenter: NSObject { } case .connected: MXLog.debug("[CallPresenter] callStateChanged: call connected: \(call.callId)") - callTimer?.fire() case .onHold: MXLog.debug("[CallPresenter] callStateChanged: call holded: \(call.callId)") - callTimer?.fire() callHolded(withCallId: call.callId) case .remotelyOnHold: MXLog.debug("[CallPresenter] callStateChanged: call remotely holded: \(call.callId)") - callTimer?.fire() callHolded(withCallId: call.callId) case .ended: MXLog.debug("[CallPresenter] callStateChanged: call ended: \(call.callId)") @@ -716,10 +659,6 @@ class CallPresenter: NSObject { // do not use PiP transitions here, as we really want to present the screen callVC.transitioningDelegate = nil - if let inBarCallVC = inBarCallVC { - dismissCallBar(for: inBarCallVC) - } - if let presentedCallVC = presentedCallVC { dismissCallVC(presentedCallVC) } @@ -781,42 +720,6 @@ class CallPresenter: NSObject { uiOperationQueue.addOperation(operation) } - // MARK: - Call Bar - - private func presentCallBar(for callVC: UIViewController, completion: (() -> Void)? = nil) { - logCallVC(callVC, log: "presentCallBar") - - let activeCallVC = self.activeCallVC - - let operation = CallBarPresentOperation(presenter: self, activeCallVC: activeCallVC, numberOfPausedCalls: numberOfPausedCalls) { [weak self] in - // active calls are more prior to paused ones. - // So, if user taps the bar when we have one active and one paused call, we navigate to the active one. - self?.inBarCallVC = activeCallVC ?? callVC - completion?() - } - uiOperationQueue.addOperation(operation) - } - - private func updateCallBar() { - let activeCallVC = self.activeCallVC - - let operation = CallBarUpdateOperation(presenter: self, activeCallVC: activeCallVC, numberOfPausedCalls: numberOfPausedCalls) - uiOperationQueue.addOperation(operation) - } - - private func dismissCallBar(for callVC: UIViewController, completion: (() -> Void)? = nil) { - logCallVC(callVC, log: "dismissCallBar") - - let operation = CallBarDismissOperation(presenter: self) { [weak self] in - if callVC == self?.inBarCallVC { - self?.inBarCallVC = nil - } - completion?() - } - - uiOperationQueue.addOperation(operation) - } - } // MARK: - MXKCallViewControllerDelegate @@ -834,13 +737,8 @@ extension CallPresenter: MXKCallViewControllerDelegate { // wait for the call state changes, will be handled there return } else { - if callVC.mxCall.isVideoCall { - // go to pip mode here - enterPipCallVC(callVC, completion: completion) - } else { - dismissCallVC(callVC) - self.presentCallBar(for: callVC, completion: completion) - } + // go to pip mode here + enterPipCallVC(callVC, completion: completion) } } @@ -902,8 +800,8 @@ extension OperationQueue { return containsOperation(ofType: CallVCPresentOperation.self) } - var containsPresentCallBarOperation: Bool { - return containsOperation(ofType: CallBarPresentOperation.self) + var containsEnterPiPOperation: Bool { + return containsOperation(ofType: CallVCEnterPipOperation.self) } private func containsOperation(ofType type: Operation.Type) -> Bool { diff --git a/Riot/Managers/Call/CallPresenterDelegate.swift b/Riot/Managers/Call/CallPresenterDelegate.swift index 57ee1c941..9c7f44687 100644 --- a/Riot/Managers/Call/CallPresenterDelegate.swift +++ b/Riot/Managers/Call/CallPresenterDelegate.swift @@ -26,17 +26,6 @@ protocol CallPresenterDelegate: class { dismissCallViewController viewController: UIViewController, completion:(() -> Void)?) - // Call Bar - func callPresenter(_ presenter: CallPresenter, - presentCallBarFor activeCallViewController: UIViewController?, - numberOfPausedCalls: UInt, - completion:(() -> Void)?) - func callPresenter(_ presenter: CallPresenter, - updateCallBarFor activeCallViewController: UIViewController?, - numberOfPausedCalls: UInt) - func callPresenter(_ presenter: CallPresenter, - dismissCallBar completion:(() -> Void)?) - // PiP func callPresenter(_ presenter: CallPresenter, enterPipForCallViewController viewController: UIViewController, diff --git a/Riot/Managers/Call/Operations/CallBarDismissOperation.swift b/Riot/Managers/Call/Operations/CallBarDismissOperation.swift deleted file mode 100644 index 02be105d1..000000000 --- a/Riot/Managers/Call/Operations/CallBarDismissOperation.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// Copyright 2020 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import Foundation - -class CallBarDismissOperation: AsyncOperation { - - private var presenter: CallPresenter - private var completion: (() -> Void)? - - init(presenter: CallPresenter, - completion: (() -> Void)? = nil) { - self.presenter = presenter - self.completion = completion - } - - override func main() { - presenter.delegate?.callPresenter(presenter, dismissCallBar: { - self.finish() - self.completion?() - }) - } - -} diff --git a/Riot/Managers/Call/Operations/CallBarPresentOperation.swift b/Riot/Managers/Call/Operations/CallBarPresentOperation.swift deleted file mode 100644 index 31ec542f1..000000000 --- a/Riot/Managers/Call/Operations/CallBarPresentOperation.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright 2020 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import Foundation - -class CallBarPresentOperation: AsyncOperation { - - private var presenter: CallPresenter - private var activeCallVC: UIViewController? - private var numberOfPausedCalls: UInt - private var completion: (() -> Void)? - - init(presenter: CallPresenter, - activeCallVC: UIViewController?, - numberOfPausedCalls: UInt, - completion: (() -> Void)? = nil) { - self.presenter = presenter - self.activeCallVC = activeCallVC - self.numberOfPausedCalls = numberOfPausedCalls - self.completion = completion - } - - override func main() { - presenter.delegate?.callPresenter(presenter, presentCallBarFor: activeCallVC, numberOfPausedCalls: numberOfPausedCalls, completion: { - self.finish() - // wait for the next life cycle to detect status bar layout updates - DispatchQueue.main.async { - self.completion?() - } - }) - } - -} diff --git a/Riot/Managers/Call/Operations/CallBarUpdateOperation.swift b/Riot/Managers/Call/Operations/CallBarUpdateOperation.swift deleted file mode 100644 index 23c7a5f5d..000000000 --- a/Riot/Managers/Call/Operations/CallBarUpdateOperation.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// Copyright 2020 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import Foundation - -class CallBarUpdateOperation: AsyncOperation { - - private var presenter: CallPresenter - private var activeCallVC: UIViewController? - private var numberOfPausedCalls: UInt - - init(presenter: CallPresenter, - activeCallVC: UIViewController?, - numberOfPausedCalls: UInt) { - self.presenter = presenter - self.activeCallVC = activeCallVC - self.numberOfPausedCalls = numberOfPausedCalls - } - - override func main() { - presenter.delegate?.callPresenter(presenter, updateCallBarFor: activeCallVC, numberOfPausedCalls: numberOfPausedCalls) - self.finish() - } - -} diff --git a/Riot/Modules/Application/LegacyAppDelegate.h b/Riot/Modules/Application/LegacyAppDelegate.h index 076dcb45f..78269f348 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.h +++ b/Riot/Modules/Application/LegacyAppDelegate.h @@ -256,14 +256,6 @@ UINavigationControllerDelegate */ @property (nonatomic, readonly) JitsiViewController *jitsiViewController; -#pragma mark - Call status handling - -/** - Call status window displayed when user goes back to app during a call. - */ -@property (nonatomic, readonly) UIWindow* callStatusBarWindow; -@property (nonatomic, readonly) CallBar* callBar; - #pragma mark - App version management /** diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index 9158de0df..9307e9d51 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -3189,117 +3189,6 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni completion:nil]; } - -#pragma mark - Call status handling - -/// Returns a suitable height for call status bar. Considers safe area insets if available and notch status. -- (CGFloat)calculateCallStatusBarHeight -{ - CGFloat result = CALL_STATUS_BAR_HEIGHT; - if (@available(iOS 11.0, *)) - { - if (UIDevice.currentDevice.hasNotch) - { - // this device has a notch (iPhone X +) - result += UIApplication.sharedApplication.keyWindow.safeAreaInsets.top; - } - } - return result; -} - -- (void)displayCallStatusBarWithTitle:(NSString*)title -{ - // Add a call status bar - CGSize topBarSize = CGSizeMake([[UIScreen mainScreen] bounds].size.width, [self calculateCallStatusBarHeight]); - - _callStatusBarWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, topBarSize.width, topBarSize.height)]; - _callStatusBarWindow.windowLevel = UIWindowLevelStatusBar; - - // Create statusBarButton - _callBar = [CallBar instantiate]; - _callBar.frame = _callStatusBarWindow.bounds; - _callBar.title = title; - _callBar.backgroundColor = ThemeService.shared.theme.tintColor; - _callBar.delegate = self; - _callBar.translatesAutoresizingMaskIntoConstraints = NO; - - // Set call bar view as the view of the root view controller - UIViewController *viewController = [[UIViewController alloc] init]; - viewController.view = _callBar; - _callStatusBarWindow.rootViewController = viewController; - - _callStatusBarWindow.hidden = NO; - [self deviceOrientationDidChange]; - - // We need to listen to the device orientation change events to refresh the root controller frame. - // Else the navigation bar position will be wrong. - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(deviceOrientationDidChange) - name:UIDeviceOrientationDidChangeNotification - object:nil]; -} - -- (void)updateCallStatusBarWithTitle:(NSString*)title -{ - _callBar.title = title; -} - -- (void)removeCallStatusBar -{ - if (_callStatusBarWindow) - { - // No more need to listen to device orientation changes - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; - - // Hide & destroy it - _callStatusBarWindow.hidden = YES; - [_callBar removeFromSuperview]; - _callBar = nil; - _callStatusBarWindow = nil; - - [self deviceOrientationDidChange]; - } -} - -- (void)deviceOrientationDidChange -{ - UIApplication *app = [UIApplication sharedApplication]; - UIViewController *rootController = app.keyWindow.rootViewController; - - // Refresh the root view controller frame - CGRect rootControllerFrame = [[UIScreen mainScreen] bounds]; - - if (_callStatusBarWindow) - { - CGFloat callStatusBarHeight = [self calculateCallStatusBarHeight]; - - UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; - CGFloat width; - - if (UIDeviceOrientationIsPortrait(deviceOrientation)) - { - width = MIN(rootControllerFrame.size.width, rootControllerFrame.size.height); - } - else - { - width = MAX(rootControllerFrame.size.width, rootControllerFrame.size.height); - } - - _callStatusBarWindow.frame = CGRectMake(0, 0, width, callStatusBarHeight); - - // Apply the vertical offset due to call status bar - rootControllerFrame.origin.y = callStatusBarHeight; - rootControllerFrame.size.height -= callStatusBarHeight; - } - - rootController.view.frame = rootControllerFrame; - if (rootController.presentedViewController) - { - rootController.presentedViewController.view.frame = rootControllerFrame; - } - [rootController.view setNeedsLayout]; -} - #pragma mark - Status Bar Tap handling - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event @@ -4490,97 +4379,6 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni } } -- (void)callPresenter:(CallPresenter *)presenter presentCallBarFor:(UIViewController *)activeCallViewController numberOfPausedCalls:(NSUInteger)numberOfPausedCalls completion:(void (^)(void))completion -{ - [self displayCallStatusBarWithTitle:nil]; - [self callPresenter:presenter updateCallBarFor:activeCallViewController numberOfPausedCalls:numberOfPausedCalls]; - - if (completion) - { - completion(); - } -} - -- (void)callPresenter:(CallPresenter *)presenter updateCallBarFor:(UIViewController *)activeCallViewController numberOfPausedCalls:(NSUInteger)numberOfPausedCalls -{ - NSString *btnTitle; - - if (activeCallViewController) - { - NSString *callStatus = @""; - BOOL isGroupCall = NO; - if ([activeCallViewController isKindOfClass:[CallViewController class]]) - { - CallViewController *activeCallVC = (CallViewController *)activeCallViewController; - callStatus = activeCallVC.callStatusLabel.text; - } - else if ([activeCallViewController isKindOfClass:[JitsiViewController class]]) - { - JitsiViewController *jitsiVC = (JitsiViewController *)activeCallViewController; - NSUInteger duration = jitsiVC.callDuration / 1000; - NSUInteger secs = duration % 60; - NSUInteger mins = (duration / 60) % 60; - NSUInteger hours = duration / 3600; - if (hours > 0) - { - callStatus = [NSString stringWithFormat:@"%02tu:%02tu:%02tu", hours, mins, secs]; - } - else - { - callStatus = [NSString stringWithFormat:@"%02tu:%02tu", mins, secs]; - } - isGroupCall = YES; - } - - if (numberOfPausedCalls == 0) - { - // only one active - if (isGroupCall) - { - btnTitle = [NSString stringWithFormat:NSLocalizedStringFromTable(@"callbar_only_single_active_group", @"Vector", nil), callStatus]; - } - else - { - btnTitle = [NSString stringWithFormat:NSLocalizedStringFromTable(@"callbar_only_single_active", @"Vector", nil), callStatus]; - } - } - else if (numberOfPausedCalls == 1) - { - // one active and one paused - btnTitle = [NSString stringWithFormat:NSLocalizedStringFromTable(@"callbar_active_and_single_paused", @"Vector", nil), callStatus]; - } - else - { - // one active and multiple paused - btnTitle = [NSString stringWithFormat:NSLocalizedStringFromTable(@"callbar_active_and_multiple_paused", @"Vector", nil), callStatus, @(numberOfPausedCalls)]; - } - } - else - { - // no active calls - if (numberOfPausedCalls == 1) - { - btnTitle = NSLocalizedStringFromTable(@"callbar_only_single_paused", @"Vector", nil); - } - else - { - btnTitle = [NSString stringWithFormat:NSLocalizedStringFromTable(@"callbar_only_multiple_paused", @"Vector", nil), @(numberOfPausedCalls)]; - } - } - - [self updateCallStatusBarWithTitle:btnTitle]; -} - -- (void)callPresenter:(CallPresenter *)presenter dismissCallBar:(void (^)(void))completion -{ - [self removeCallStatusBar]; - - if (completion) - { - completion(); - } -} - - (void)callPresenter:(CallPresenter *)presenter enterPipForCallViewController:(UIViewController *)viewController completion:(void (^)(void))completion { // Check whether the call view controller is actually presented @@ -4607,13 +4405,6 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni [self presentViewController:viewController animated:YES completion:completion]; } -#pragma mark - CallBarDelegate - -- (void)callBarDidTap:(CallBar *)callBar -{ - [_callPresenter callStatusBarTapped]; -} - #pragma mark - Authentication - (BOOL)continueSSOLoginWithToken:(NSString*)loginToken txnId:(NSString*)txnId From 53a88d425cf52d9f42421d317089186cecd6ec37 Mon Sep 17 00:00:00 2001 From: Simon Wiedmer Date: Mon, 7 Jun 2021 11:21:34 +0200 Subject: [PATCH 286/393] Add 'Dial pad' option to plus menu on homescreen --- .../Common/Recents/RecentsViewController.m | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/Riot/Modules/Common/Recents/RecentsViewController.m b/Riot/Modules/Common/Recents/RecentsViewController.m index d559f64d0..8c83d3706 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.m +++ b/Riot/Modules/Common/Recents/RecentsViewController.m @@ -72,6 +72,8 @@ @property (nonatomic, strong) SpaceFeatureUnavailablePresenter *spaceFeatureUnavailablePresenter; +@property (nonatomic, strong) CustomSizedPresentationController *customSizedPresentationController; + @end @implementation RecentsViewController @@ -1796,6 +1798,21 @@ }]]; + [currentAlert addAction:[UIAlertAction + actionWithTitle:NSLocalizedStringFromTable(@"room_open_dialpad", @"Vector", nil) + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) { + + if (weakSelf) + { + typeof(self) self = weakSelf; + self->currentAlert = nil; + + [self openDialpad]; + } + + }]]; + [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { @@ -1815,6 +1832,46 @@ [self presentViewController:currentAlert animated:YES completion:nil]; } +- (void)openDialpad +{ + DialpadViewController *controller = [DialpadViewController instantiateWithConfiguration:[DialpadConfiguration default]]; + controller.delegate = self; + self.customSizedPresentationController = [[CustomSizedPresentationController alloc] initWithPresentedViewController:controller presentingViewController:self]; + self.customSizedPresentationController.dismissOnBackgroundTap = NO; + self.customSizedPresentationController.cornerRadius = 16; + + controller.transitioningDelegate = self.customSizedPresentationController; + [self presentViewController:controller animated:YES completion:nil]; +} + +- (void)dialpadViewControllerDidTapCall:(DialpadViewController *)viewController withPhoneNumber:(NSString *)phoneNumber +{ + if (self.mainSession.callManager && phoneNumber.length > 0) + { + [self startActivityIndicator]; + + [viewController dismissViewControllerAnimated:YES completion:^{ + MXWeakify(self); + [self.mainSession.callManager placeCallAgainst:phoneNumber withVideo:NO success:^(MXCall * _Nonnull call) { + MXStrongifyAndReturnIfNil(self); + [self stopActivityIndicator]; + self.customSizedPresentationController = nil; + + // do nothing extra here. UI will be handled automatically by the CallService. + } failure:^(NSError * _Nullable error) { + MXStrongifyAndReturnIfNil(self); + [self stopActivityIndicator]; + }]; + }]; + } +} + +- (void)dialpadViewControllerDidTapClose:(DialpadViewController *)viewController +{ + [viewController dismissViewControllerAnimated:YES completion:nil]; + self.customSizedPresentationController = nil; +} + - (void)createNewRoom { // Sanity check From 7c9292d6e7c80b10c4240fdd14c7a800837259a1 Mon Sep 17 00:00:00 2001 From: manuroe Date: Tue, 8 Jun 2021 12:11:07 +0200 Subject: [PATCH 287/393] Prepare for new sprint after the 1.4.1 hotfix release I applied manually what the release script does like in https://github.com/vector-im/element-ios/commit/af60144b00d45ca17a40d5ec30fe2d2fc33c1898 --- CHANGES.rst | 30 +++++++++++++++++++++++++++--- Config/AppIdentifiers.xcconfig | 4 ++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2500123b5..d3a374cdf 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -9,8 +9,7 @@ Changes to be released in next version * EncryptionKeyManager: Create keys for room last message data type. 🐛 Bugfix - * SettingsViewController: Fix crash when changing the app language (#4377). - * UserSessionsService: Fix room lists lost after a reset cache (#4395). + * ⚠️ API Changes * @@ -22,7 +21,32 @@ Changes to be released in next version * Others - * + * + + Changes in 1.4.1 (2021-06-08) +================================================= + +✨ Features + * + +🙌 Improvements + * + +🐛 Bugfix + * SettingsViewController: Fix crash when changing the app language (#4377). + * UserSessionsService: Fix room lists lost after a reset cache (#4395). + +⚠️ API Changes + * + +🗣 Translations + * + +🧱 Build + * + +Others + * Changes in 1.4.0 (2021-06-03) ================================================= diff --git a/Config/AppIdentifiers.xcconfig b/Config/AppIdentifiers.xcconfig index 12b57d3db..cd0fd28f8 100644 --- a/Config/AppIdentifiers.xcconfig +++ b/Config/AppIdentifiers.xcconfig @@ -22,8 +22,8 @@ APPLICATION_GROUP_IDENTIFIER = group.im.vector APPLICATION_SCHEME = element // Version -MARKETING_VERSION = 1.4.1 -CURRENT_PROJECT_VERSION = 1.4.1 +MARKETING_VERSION = 1.4.2 +CURRENT_PROJECT_VERSION = 1.4.2 // Team From a53355c211e89b6d5c67b8b28de960c7b0b59c23 Mon Sep 17 00:00:00 2001 From: Simon Wiedmer Date: Tue, 8 Jun 2021 13:39:28 +0200 Subject: [PATCH 288/393] Add check for PSTN support to dialpad --- Riot/Modules/Common/Recents/RecentsViewController.m | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Riot/Modules/Common/Recents/RecentsViewController.m b/Riot/Modules/Common/Recents/RecentsViewController.m index 8c83d3706..61f5e9274 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.m +++ b/Riot/Modules/Common/Recents/RecentsViewController.m @@ -1798,8 +1798,10 @@ }]]; - [currentAlert addAction:[UIAlertAction - actionWithTitle:NSLocalizedStringFromTable(@"room_open_dialpad", @"Vector", nil) + if (self.mainSession.callManager.supportsPSTN) + { + [currentAlert addAction:[UIAlertAction + actionWithTitle:NSLocalizedStringFromTable(@"room_open_dialpad", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -1812,6 +1814,7 @@ } }]]; + } [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] style:UIAlertActionStyleCancel From 2d0b48d9eed550518b38d6f457068400d00dc2f4 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Tue, 8 Jun 2021 15:59:06 +0300 Subject: [PATCH 289/393] Remove call bar view --- Riot/Modules/Application/LegacyAppDelegate.m | 2 +- Riot/Modules/Call/Views/CallBar/CallBar.swift | 54 ------------------- Riot/Modules/Call/Views/CallBar/CallBar.xib | 51 ------------------ 3 files changed, 1 insertion(+), 106 deletions(-) delete mode 100644 Riot/Modules/Call/Views/CallBar/CallBar.swift delete mode 100644 Riot/Modules/Call/Views/CallBar/CallBar.xib diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index 9307e9d51..c2bd75f58 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -90,7 +90,7 @@ NSString *const AppDelegateDidValidateEmailNotificationClientSecretKey = @"AppDe NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUniversalLinkDidChangeNotification"; -@interface LegacyAppDelegate () +@interface LegacyAppDelegate () { /** Reachability observer diff --git a/Riot/Modules/Call/Views/CallBar/CallBar.swift b/Riot/Modules/Call/Views/CallBar/CallBar.swift deleted file mode 100644 index 941e22b0a..000000000 --- a/Riot/Modules/Call/Views/CallBar/CallBar.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// Copyright 2020 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import Foundation -import Reusable - -@objc protocol CallBarDelegate: class { - func callBarDidTap(_ callBar: CallBar) -} - -@objcMembers -class CallBar: UIView, NibLoadable { - - @IBOutlet private weak var titleLabel: UILabel! - - weak var delegate: CallBarDelegate? - - static func instantiate() -> CallBar { - return CallBar.loadFromNib() - } - - override func awakeFromNib() { - super.awakeFromNib() - - let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapGestureRecognized(_:))) - addGestureRecognizer(tapRecognizer) - } - - var title: String? { - get { - return titleLabel.text - } set { - titleLabel.text = newValue - } - } - - @objc - private func tapGestureRecognized(_ sender: UITapGestureRecognizer) { - delegate?.callBarDidTap(self) - } -} diff --git a/Riot/Modules/Call/Views/CallBar/CallBar.xib b/Riot/Modules/Call/Views/CallBar/CallBar.xib deleted file mode 100644 index 79873a89c..000000000 --- a/Riot/Modules/Call/Views/CallBar/CallBar.xib +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 979352f2282199341246393ebeb4e8d4dde5beb1 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Tue, 8 Jun 2021 15:59:57 +0300 Subject: [PATCH 290/393] Create CallPiPView class --- Riot/Modules/Call/PiP/CallPiPView.swift | 119 +++++++++++++++++++++ Riot/Modules/Call/PiP/CallPiPView.xib | 134 ++++++++++++++++++++++++ 2 files changed, 253 insertions(+) create mode 100644 Riot/Modules/Call/PiP/CallPiPView.swift create mode 100644 Riot/Modules/Call/PiP/CallPiPView.xib diff --git a/Riot/Modules/Call/PiP/CallPiPView.swift b/Riot/Modules/Call/PiP/CallPiPView.swift new file mode 100644 index 000000000..3feaa27a6 --- /dev/null +++ b/Riot/Modules/Call/PiP/CallPiPView.swift @@ -0,0 +1,119 @@ +// +// Copyright 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. +// + +import UIKit +import Reusable + +@objcMembers +class CallPiPView: UIView { + + private enum Constants { + static let viewWidth: CGFloat = 90 + static let smallDotWidth: CGFloat = 8 + static let bigDotWidth: CGFloat = 10 + static let spaceBetweenDots: CGFloat = 4 + } + + @IBOutlet private weak var bgImageView: MXKImageView! + + @IBOutlet private weak var stackView: UIStackView! + + @IBOutlet private weak var mainCallAvatarImageView: MXKImageView! + + @IBOutlet private weak var onHoldCallView: UIView! + @IBOutlet private weak var onHoldCallAvatarImageView: MXKImageView! + + @IBOutlet private weak var connectingView: DotsView! { + didSet { + connectingView.dotMinWidth = self.bounds.width * Constants.smallDotWidth/Constants.viewWidth + connectingView.dotMaxWidth = self.bounds.width * Constants.bigDotWidth/Constants.viewWidth + connectingView.interSpaceMargin = self.bounds.width * Constants.spaceBetweenDots/Constants.viewWidth + } + } + + private lazy var defaultProfileImage: UIImage = { + return Bundle.mxk_imageFromMXKAssetsBundle(withName: "default-profile") + }() + private var session: MXSession! + + static func instantiate(withSession session: MXSession) -> CallPiPView { + let view = self.loadFromNib() + view.session = session + return view + } + + func configure(withCall mainCall: MXCall, + peer: MXUser?, + onHoldCall: MXCall?, + onHoldPeer: MXUser?) { + switch mainCall.state { + case .fledgling, .waitLocalMedia, .createOffer, .inviteSent, .ringing, .createAnswer, .connecting: + stackView.isHidden = true + connectingView.isHidden = false + case .connected: + connectingView.isHidden = true + stackView.isHidden = false + onHoldCallView.isHidden = onHoldCall == nil + default: + break + } + + if let avatarUrl = peer?.avatarUrl { + bgImageView.mediaFolder = kMXMediaManagerAvatarThumbnailFolder + bgImageView.enableInMemoryCache = true + + bgImageView.setImageURI(avatarUrl, + withType: nil, + andImageOrientation: .up, + toFitViewSize: bgImageView.bounds.size, + with: MXThumbnailingMethodCrop, + previewImage: defaultProfileImage, + mediaManager: session.mediaManager) + + mainCallAvatarImageView.mediaFolder = kMXMediaManagerAvatarThumbnailFolder + mainCallAvatarImageView.enableInMemoryCache = true + + mainCallAvatarImageView.setImageURI(avatarUrl, + withType: nil, + andImageOrientation: .up, + toFitViewSize: bgImageView.bounds.size, + with: MXThumbnailingMethodCrop, + previewImage: defaultProfileImage, + mediaManager: session.mediaManager) + } else { + bgImageView.image = defaultProfileImage + mainCallAvatarImageView.image = defaultProfileImage + } + + if let avatarUrl = onHoldPeer?.avatarUrl { + onHoldCallAvatarImageView.mediaFolder = kMXMediaManagerAvatarThumbnailFolder + onHoldCallAvatarImageView.enableInMemoryCache = true + + onHoldCallAvatarImageView.setImageURI(avatarUrl, + withType: nil, + andImageOrientation: .up, + toFitViewSize: bgImageView.bounds.size, + with: MXThumbnailingMethodCrop, + previewImage: defaultProfileImage, + mediaManager: session.mediaManager) + } else { + onHoldCallAvatarImageView.image = defaultProfileImage + } + } + +} + +extension CallPiPView: NibReusable {} diff --git a/Riot/Modules/Call/PiP/CallPiPView.xib b/Riot/Modules/Call/PiP/CallPiPView.xib new file mode 100644 index 000000000..bd5440e71 --- /dev/null +++ b/Riot/Modules/Call/PiP/CallPiPView.xib @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From d20279008560959eda57404234dae1c4317b750a Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Tue, 8 Jun 2021 16:00:38 +0300 Subject: [PATCH 291/393] Add pip view container and load pip view into it --- Riot/Modules/Call/CallViewController.m | 42 ++++++++++++++++++++++++ Riot/Modules/Call/CallViewController.xib | 17 +++++++--- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/Riot/Modules/Call/CallViewController.m b/Riot/Modules/Call/CallViewController.m index 631936080..5c8e09cc0 100644 --- a/Riot/Modules/Call/CallViewController.m +++ b/Riot/Modules/Call/CallViewController.m @@ -37,8 +37,11 @@ BOOL promptForStunServerFallback; } +@property (nonatomic, weak) IBOutlet UIView *pipViewContainer; + @property (nonatomic, strong) id overriddenTheme; @property (nonatomic, assign) BOOL inPiP; +@property (nonatomic, strong) CallPiPView *pipView; @property (nonatomic, strong) CustomSizedPresentationController *customSizedPresentationController; @@ -224,6 +227,8 @@ - (void)call:(MXCall *)call stateDidChange:(MXCallState)state reason:(MXEvent *)event { [super call:call stateDidChange:state reason:event]; + + [self configurePiPView]; [self checkStunServerFallbackWithCallState:state]; } @@ -379,6 +384,22 @@ return _overriddenTheme; } +- (CallPiPView *)pipView +{ + if (_pipView == nil) + { + _pipView = [CallPiPView instantiateWithSession:self.mainSession]; + } + return _pipView; +} + +- (void)setMxCallOnHold:(MXCall *)mxCallOnHold +{ + [super setMxCallOnHold:mxCallOnHold]; + + [self configurePiPView]; +} + - (UIImage*)picturePlaceholder { CGFloat fontSize = floor(self.callerImageViewWidthConstraint.constant * 0.7); @@ -502,9 +523,17 @@ self.callStatusLabel.hidden = YES; self.localPreviewContainerView.hidden = YES; self.localPreviewActivityView.hidden = YES; + + if (self.pipViewContainer.subviews.count == 0) + { + [self.pipViewContainer vc_addSubViewMatchingParent:self.pipView]; + [self configurePiPView]; + } + self.pipViewContainer.hidden = NO; } else { + self.pipViewContainer.hidden = YES; self.localPreviewContainerView.hidden = NO; self.callerImageView.hidden = NO; self.callerNameLabel.hidden = NO; @@ -644,6 +673,19 @@ [viewController dismissViewControllerAnimated:YES completion:nil]; } +#pragma mark - PiP + +- (void)configurePiPView +{ + if (self.inPiP) + { + [self.pipView configureWithCall:self.mxCall + peer:self.peer + onHoldCall:self.mxCallOnHold + onHoldPeer:self.peerOnHold]; + } +} + #pragma mark - PictureInPicturable - (void)enterPiP diff --git a/Riot/Modules/Call/CallViewController.xib b/Riot/Modules/Call/CallViewController.xib index d5cf47f3c..1f1c991a7 100644 --- a/Riot/Modules/Call/CallViewController.xib +++ b/Riot/Modules/Call/CallViewController.xib @@ -1,9 +1,9 @@ - + - + @@ -35,6 +35,7 @@ + @@ -294,7 +295,7 @@ - + @@ -339,7 +340,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Riot/Modules/KeyBackup/Setup/Success/KeyBackupSetupSuccessFromSecureBackupViewController.swift b/Riot/Modules/KeyBackup/Setup/Success/KeyBackupSetupSuccessFromSecureBackupViewController.swift new file mode 100644 index 000000000..c369cb5e9 --- /dev/null +++ b/Riot/Modules/KeyBackup/Setup/Success/KeyBackupSetupSuccessFromSecureBackupViewController.swift @@ -0,0 +1,120 @@ +/* + Copyright 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. + */ + +import UIKit + +protocol KeyBackupSetupSuccessFromSecureBackupViewControllerDelegate: class { + func keyBackupSetupSuccessFromSecureBackupViewControllerDidTapDoneAction(_ viewController: KeyBackupSetupSuccessFromSecureBackupViewController) +} + +final class KeyBackupSetupSuccessFromSecureBackupViewController: UIViewController { + + // MARK: - Properties + + // MARK: Outlets + + @IBOutlet private weak var keyBackupLogoImageView: UIImageView! + @IBOutlet private weak var titleLabel: UILabel! + @IBOutlet private weak var informationLabel: UILabel! + + @IBOutlet private weak var doneButtonBackgroundView: UIView! + @IBOutlet private weak var doneButton: UIButton! + + // MARK: Private + + private var theme: Theme! + + // MARK: Public + + weak var delegate: KeyBackupSetupSuccessFromSecureBackupViewControllerDelegate? + + // MARK: - Setup + + class func instantiate() -> KeyBackupSetupSuccessFromSecureBackupViewController { + let viewController = StoryboardScene.KeyBackupSetupSuccessFromSecureBackupViewController.initialScene.instantiate() + viewController.theme = ThemeService.shared().theme + return viewController + } + + // MARK: - Life cycle + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + + self.title = VectorL10n.keyBackupSetupTitle + + self.setupViews() + self.registerThemeServiceDidChangeThemeNotification() + self.update(theme: self.theme) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + // Hide back button + self.navigationItem.setHidesBackButton(true, animated: animated) + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return self.theme.statusBarStyle + } + + // MARK: - Private + + private func setupViews() { + + let keybackupLogoImage = Asset.Images.keyBackupLogo.image.withRenderingMode(.alwaysTemplate) + self.keyBackupLogoImageView.image = keybackupLogoImage + + self.titleLabel.text = VectorL10n.keyBackupSetupSuccessTitle + self.informationLabel.text = VectorL10n.keyBackupSetupSuccessFromSecureBackupInfo + + self.doneButton.setTitle(VectorL10n.keyBackupSetupSuccessFromPassphraseDoneAction, for: .normal) + } + + private func update(theme: Theme) { + self.theme = theme + + self.view.backgroundColor = theme.headerBackgroundColor + + if let navigationBar = self.navigationController?.navigationBar { + theme.applyStyle(onNavigationBar: navigationBar) + } + + self.keyBackupLogoImageView.tintColor = theme.textPrimaryColor + self.titleLabel.textColor = theme.textPrimaryColor + self.informationLabel.textColor = theme.textPrimaryColor + + self.doneButtonBackgroundView.backgroundColor = theme.backgroundColor + theme.applyStyle(onButton: self.doneButton) + } + + private func registerThemeServiceDidChangeThemeNotification() { + NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .themeServiceDidChangeTheme, object: nil) + } + + @objc private func themeDidChange() { + self.update(theme: ThemeService.shared().theme) + } + + // MARK: - Actions + + @IBAction private func doneButtonAction(_ sender: Any) { + self.delegate?.keyBackupSetupSuccessFromSecureBackupViewControllerDidTapDoneAction(self) + } +} diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift index a302825dc..4eb879b1c 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift @@ -23,7 +23,7 @@ import UIKit func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, buttonCellForRow: Int) -> MXKTableViewCellWithButton - func settingsSecureBackupTableViewSectionShowKeyBackupSetup(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection) + func settingsSecureBackupTableViewSectionShowKeyBackupCreate(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection) func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, showKeyBackupRecover keyBackupVersion: MXKeyBackupVersion) func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, showKeyBackupDeleteConfirm keyBackupVersion: MXKeyBackupVersion) @@ -33,7 +33,7 @@ import UIKit private enum BackupRows { case info(text: String) - case setupAction + case createKeyBackupAction case restoreFromKeyBackupAction(keyBackupVersion: MXKeyBackupVersion, title: String) case deleteKeyBackupAction(keyBackupVersion: MXKeyBackupVersion) } @@ -89,8 +89,8 @@ private enum BackupRows { let infoCell: MXKTableViewCellWithTextView = delegate.settingsSecureBackupTableViewSection(self, textCellForRow: row) infoCell.mxkTextView.text = infoText cell = infoCell - case .setupAction: - cell = self.buttonCellForSetup(atRow: row) + case .createKeyBackupAction: + cell = self.buttonCellForCreateKeyBackup(atRow: row) case .restoreFromKeyBackupAction(keyBackupVersion: let keyBackupVersion, let title): cell = self.buttonCellForRestoreFromKeyBackup(keyBackupVersion: keyBackupVersion, title: title, atRow: row) case .deleteKeyBackupAction(keyBackupVersion: let keyBackupVersion): @@ -128,16 +128,15 @@ private enum BackupRows { case .noBackup: -// let noBackup = VectorL10n.settingsSecureBackupInfoNone -// let info = VectorL10n.settingsSecureBackupInfo -// let signoutWarning = VectorL10n.settingsSecureBackupInfoSignoutWarning -// let strings = [noBackup, "", info, "", signoutWarning] -// let backupInfoText = strings.joined(separator: "\n") - let backupInfoText = "TODO" + let noBackup = VectorL10n.settingsKeyBackupInfoNone + let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning + let strings = [noBackup, "", signoutWarning] + let backupInfoText = strings.joined(separator: "\n") backupRows = [ + .info(text: VectorL10n.securitySettingsSecureBackupDescription), .info(text: backupInfoText), - .setupAction + .createKeyBackupAction ] case .backup(let keyBackupVersion, let keyBackupVersionTrust), @@ -247,7 +246,7 @@ private enum BackupRows { // MARK: - Button cells - private func buttonCellForSetup(atRow row: Int) -> UITableViewCell { + private func buttonCellForCreateKeyBackup(atRow row: Int) -> UITableViewCell { guard let delegate = self.delegate else { return UITableViewCell() @@ -260,7 +259,7 @@ private enum BackupRows { cell.mxkButton.setTitle(btnTitle, for: .highlighted) cell.mxkButton.vc_addAction { - self.viewModel.process(viewAction: .setup) + self.viewModel.process(viewAction: .createKeyBackup) } return cell @@ -319,8 +318,8 @@ extension SettingsSecureBackupTableViewSection: SettingsSecureBackupViewModelVie } } - func settingsSecureBackupViewModelShowKeyBackupSetup(_ viewModel: SettingsSecureBackupViewModelType) { - self.delegate?.settingsSecureBackupTableViewSectionShowKeyBackupSetup(self) + func settingsSecureBackupViewModelShowKeyBackupCreate(_ viewModel: SettingsSecureBackupViewModelType) { + self.delegate?.settingsSecureBackupTableViewSectionShowKeyBackupCreate(self) } func settingsSecureBackupViewModel(_ viewModel: SettingsSecureBackupViewModelType, showKeyBackupRecover keyBackupVersion: MXKeyBackupVersion) { diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift index cd8379542..8187c7fd1 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift @@ -18,7 +18,7 @@ import UIKit enum SettingsSecureBackupViewAction { case load - case setup + case createKeyBackup case restoreFromKeyBackup(MXKeyBackupVersion) case confirmDeleteKeyBackup(MXKeyBackupVersion) case deleteKeyBackup(MXKeyBackupVersion) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift index c716d70d4..e4151663f 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift @@ -46,8 +46,8 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { case .load: viewDelegate.settingsSecureBackupViewModel(self, didUpdateViewState: .checkingBackup) self.checkKeyBackupState() - case .setup: - viewDelegate.settingsSecureBackupViewModelShowKeyBackupSetup(self) + case .createKeyBackup: + viewDelegate.settingsSecureBackupViewModelShowKeyBackupCreate(self) case .restoreFromKeyBackup(let keyBackupVersion): viewDelegate.settingsSecureBackupViewModel(self, showKeyBackupRecover: keyBackupVersion) case .confirmDeleteKeyBackup(let keyBackupVersion): diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModelType.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModelType.swift index eac9a14d6..cb3df7ae5 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModelType.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModelType.swift @@ -20,7 +20,7 @@ protocol SettingsSecureBackupViewModelViewDelegate: class { func settingsSecureBackupViewModel(_ viewModel: SettingsSecureBackupViewModelType, didUpdateViewState viewState: SettingsSecureBackupViewState) func settingsSecureBackupViewModel(_ viewModel: SettingsSecureBackupViewModelType, didUpdateNetworkRequestViewState networkRequestViewSate: SettingsSecureBackupNetworkRequestViewState) - func settingsSecureBackupViewModelShowKeyBackupSetup(_ viewModel: SettingsSecureBackupViewModelType) + func settingsSecureBackupViewModelShowKeyBackupCreate(_ viewModel: SettingsSecureBackupViewModelType) func settingsSecureBackupViewModel(_ viewModel: SettingsSecureBackupViewModelType, showKeyBackupRecover keyBackupVersion: MXKeyBackupVersion) func settingsSecureBackupViewModel(_ viewModel: SettingsSecureBackupViewModelType, showKeyBackupDeleteConfirm keyBackupVersion: MXKeyBackupVersion) } diff --git a/Riot/Modules/Settings/Security/SecurityViewController.m b/Riot/Modules/Settings/Security/SecurityViewController.m index ae7ac4dd1..d1271a6e2 100644 --- a/Riot/Modules/Settings/Security/SecurityViewController.m +++ b/Riot/Modules/Settings/Security/SecurityViewController.m @@ -1720,7 +1720,7 @@ TableViewSectionsDelegate> return cell; } -- (void)settingsSecureBackupTableViewSectionShowKeyBackupSetup:(SettingsSecureBackupTableViewSection *)settingsSecureBackupTableViewSection +- (void)settingsSecureBackupTableViewSectionShowKeyBackupCreate:(SettingsSecureBackupTableViewSection *)settingsSecureBackupTableViewSection { [self showKeyBackupSetupFromSignOutFlow:NO]; } From 79d05228736a5165575bbe1e70ffa82a508279cf Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Wed, 16 Jun 2021 07:37:52 +0000 Subject: [PATCH 349/393] Translated using Weblate (Portuguese (Brazil)) Currently translated at 98.4% (1197 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/ --- Riot/Assets/pt_BR.lproj/Vector.strings | 449 +++++++++++++------------ 1 file changed, 228 insertions(+), 221 deletions(-) diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index 8e5c8171e..864075b8d 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -142,7 +142,7 @@ "contacts_address_book_matrix_users_toggle" = "Usuários Matrix somente"; "contacts_address_book_no_contact" = "Nenhum contato local"; "contacts_address_book_permission_required" = "Permissão requerida para acessar contatos locais"; -"contacts_address_book_permission_denied" = "Você não permitiu a Element acessar seus contatos locais"; +"contacts_address_book_permission_denied" = "Você não permitiu Element acessar seus contatos locais"; "contacts_user_directory_section" = "DIRETÓRIO DE USUÁRIAS(OS)"; "contacts_user_directory_offline_section" = "DIRETÓRIO DE USUÁRIAS(OS) (offline)"; // Chat participants @@ -239,166 +239,166 @@ "room_event_action_cancel_send" = "Cancelar Enviar"; "room_event_action_cancel_download" = "Cancelar Download"; "room_event_action_view_encryption" = "Informação de Encriptação"; -"room_warning_about_encryption" = "A criptografia de ponta a ponta está na versão beta e pode não ser confiável.↵\n↵\nVocê ainda não deve confiar nela para proteger os dados.↵\n↵\nOs aparelhos ainda não poderão descriptografar o histórico antes de entrarem na sala.↵\n↵\nAs mensagens criptografadas não estarão visíveis em clientes que ainda não implementaram a criptografia."; -"room_event_failed_to_send" = "Falha ao enviar"; +"room_warning_about_encryption" = "Encriptação ponta-a-ponta está em beta e pode não ser confiável.\n\nVocê ainda não devia confiar nela para assegurar dados.\n\nDispositivos ainda não vão ser capazes de decriptar histórico de antes que eles se juntaram à sala.\n\nMensagens encriptadas não vão estar visíveis em clientes que ainda não implementam encriptação."; +"room_event_failed_to_send" = "Falha para enviar"; "room_action_send_photo_or_video" = "Enviar foto ou vídeo"; -"room_action_send_sticker" = "Enviar figurinha"; -"room_replacement_information" = "Esta sala foi substituída e não está mais ativa."; +"room_action_send_sticker" = "Enviar sticker"; +"room_replacement_information" = "Esta sala tem sido substituída e não está mais ativa."; "room_replacement_link" = "A conversa continua aqui."; -"room_predecessor_information" = "Esta sala é uma continuação de outra conversa."; -"room_predecessor_link" = "Clique aqui para ver as mensagens mais antigas."; +"room_predecessor_information" = "Esta sala é uma continuação de uma outra conversa."; +"room_predecessor_link" = "Toque aqui para ver mensagens mais antigas."; "room_resource_limit_exceeded_message_contact_1" = " Por favor "; "room_resource_limit_exceeded_message_contact_2_link" = "contacte o/a administrador(a) de seu serviço"; "room_resource_limit_exceeded_message_contact_3" = " para continuar usando este serviço."; -"room_resource_usage_limit_reached_message_1_default" = "Este servidor local excedeu um dos limites de seus recursos, portanto· "; -"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Esse servidor local atingiu seu limite mensal de usuários ativos, portanto· "; -"room_resource_usage_limit_reached_message_2" = "alguns usuários não poderão efetuar login."; +"room_resource_usage_limit_reached_message_1_default" = "Este servidorcasa tem excedido um dos limites de recursos então "; +"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Este servidorcasa tem atingido seu limite de Usuárias(os) Mensalmente Ativas(os) então "; +"room_resource_usage_limit_reached_message_2" = "algumas(ns) usuárias(os) não vão ser capazes de fazer login."; "room_resource_usage_limit_reached_message_contact_3" = " para ter este limite aumentado."; // Unknown devices -"unknown_devices_alert_title" = "A sala contém sessões desconhecidas"; -"unknown_devices_send_anyway" = "Enviar mesmo assim"; -"unknown_devices_call_anyway" = "Ligar mesmo assim"; -"unknown_devices_answer_anyway" = "Responder mesmo assim"; -"unknown_devices_verify" = "Confirmar…"; +"unknown_devices_alert_title" = "Sala contém sessões desconhecidas"; +"unknown_devices_send_anyway" = "Enviar Mesmo Assim"; +"unknown_devices_call_anyway" = "Chamar Mesmo Assim"; +"unknown_devices_answer_anyway" = "Atender Mesmo Assim"; +"unknown_devices_verify" = "Verificar…"; "unknown_devices_title" = "Sessões desconhecidas"; // Room Title "room_title_new_room" = "Nova sala"; -"room_title_multiple_active_members" = "%@/%@ participantes ativos"; -"room_title_one_active_member" = "%@/%@ participante ativo"; -"room_title_invite_members" = "Convidar participantes"; -"room_title_members" = "%@ participantes"; -"room_title_one_member" = "1 participante"; +"room_title_multiple_active_members" = "%@/%@ membros ativos"; +"room_title_one_active_member" = "%@/%@ membro ativo"; +"room_title_invite_members" = "Convidar membros"; +"room_title_members" = "%@ membros"; +"room_title_one_member" = "1 membro"; // Room Preview -"room_preview_invitation_format" = "Você foi convidado a participar desta sala por %@"; -"unknown_devices_alert" = "Esta sala contém sessões desconhecidas que não foram confirmadas.↵\nIsso significa que não há garantia de que as sessões pertençam aos usuários em questão.↵\nRecomendamos que você passe pelo processo de confirmação de cada sessão antes de continuar, mas você pode reenviar a mensagem sem confirmar, se preferir."; -"room_preview_subtitle" = "Esta é uma prévia desta sala. Interações de sala foram desativadas."; -"room_preview_unlinked_email_warning" = "Este convite foi enviado para %@, que não está associado a esta conta. Você pode querer fazer login com uma conta diferente ou adicionar este e-mail a essa conta."; -"room_preview_try_join_an_unknown_room" = "Você está tentando acessar %@. Você gostaria de entrar para participar da discussão?"; +"room_preview_invitation_format" = "Você tem sido convidada(o) a juntar-se a esta sala por %@"; +"unknown_devices_alert" = "Esta sala contém sessões desconhecidas que não têm sido verificadas.\nIsto significa que não há nenhuma garantia que as sessões pertencem às/aos usuárias(os) às/aos quais elas clamam pertencer.\nNós recomendamos que você passe pelo processo de verificação para cada sessão antes de continuar, mas você pode reenviar a mensagem sem verificar se você preferir."; +"room_preview_subtitle" = "Esta é uma previsualização desta sala. Interações de sala têm sido desativadas."; +"room_preview_unlinked_email_warning" = "Este convite foi enviado para %@, que não está associada(o) a esta conta. Você pode desejar fazer login com uma conta diferente, ou adicionar este email a sua conta."; +"room_preview_try_join_an_unknown_room" = "Você está tentando acessar %@. Você gostaria de se juntar para participar na discussão?"; "room_preview_try_join_an_unknown_room_default" = "uma sala"; // Settings "settings_title" = "Configurações"; -"account_logout_all" = "Sair de todas as contas"; -"settings_config_no_build_info" = "Nenhuma informação da build"; +"account_logout_all" = "Fazer logout de todas as contas"; +"settings_config_no_build_info" = "Nenhuma info de build"; "settings_mark_all_as_read" = "Marcar todas as mensagens como lidas"; -"settings_report_bug" = "Relatar erro"; -"settings_config_home_server" = "O servidor local é %@"; -"settings_config_identity_server" = "Servidor de Identidades é %@"; -"settings_config_user_id" = "Logado como %@"; -"settings_user_settings" = "CONFIGURAÇÕES DE USUÁRIO"; -"settings_notifications_settings" = "CONFIGURAÇÕES DE NOTIFICAÇÕES"; +"settings_report_bug" = "Reportar bug"; +"settings_config_home_server" = "Servidorcasa é %@"; +"settings_config_identity_server" = "Servidor de identidade é %@"; +"settings_config_user_id" = "Feito login como %@"; +"settings_user_settings" = "CONFIGURAÇÕES DE USUÁRIA(O)"; +"settings_notifications_settings" = "CONFIGURAÇÕES DE NOTIFICAÇÃO"; "settings_calls_settings" = "CHAMADAS"; -"settings_user_interface" = "INTERFACE DO USUÁRIO"; -"settings_ignored_users" = "USUÁRIOS BLOQUEADOS"; +"settings_user_interface" = "INTERFACE DE USUÁRIA(O)"; +"settings_ignored_users" = "USUÁRIAS(OS) IGNORADAS(OS)"; "settings_contacts" = "CONTATOS LOCAIS"; -"settings_advanced" = "AVANÇADO"; -"settings_other" = "OUTROS"; -"settings_labs" = "LABORATÓRIO"; -"settings_flair" = "Mostrar ícones onde permitido"; +"settings_advanced" = "AVANÇADAS"; +"settings_other" = "OUTRAS"; +"settings_labs" = "LABS"; +"settings_flair" = "Mostrar flair onde permitido"; "settings_devices" = "SESSÕES"; "settings_cryptography" = "CRIPTOGRAFIA"; -"settings_deactivate_account" = "DESATIVAR MINHA CONTA"; -"settings_sign_out" = "Sair"; +"settings_deactivate_account" = "DESATIVAR CONTA"; +"settings_sign_out" = "Fazer Signout"; "settings_sign_out_confirmation" = "Você tem certeza?"; -"settings_sign_out_e2e_warn" = "Você perderá suas chaves de criptografia de ponta a ponta. Isso significa que você não poderá mais ler mensagens antigas em salas criptografadas neste aparelho."; -"settings_profile_picture" = "Foto de perfil"; +"settings_sign_out_e2e_warn" = "Você vai perder suas chaves de encriptação ponta-a-ponta. Isso significa que você não vai mais ser capaz de ler mensagens antigas em salas encriptadas neste dispositivo."; +"settings_profile_picture" = "Imagem de Perfil"; // Room Details "room_details_title" = "Detalhes de Sala"; -"settings_first_name" = "Primeiro nome"; +"settings_first_name" = "Primeiro Nome"; "settings_surname" = "Sobrenome"; "settings_remove_prompt_title" = "Confirmação"; -"settings_remove_email_prompt_msg" = "Tem certeza de que deseja remover o endereço de e-mail %@?"; -"settings_remove_phone_prompt_msg" = "Tem certeza de que deseja remover o número de telefone %@?"; -"settings_email_address" = "E-mail"; -"settings_email_address_placeholder" = "Insira o seu endereço de e-mail"; -"settings_add_email_address" = "Adicionar endereço de e-mail"; +"settings_remove_email_prompt_msg" = "Você tem certeza que você quer remover o endereço de email %@?"; +"settings_remove_phone_prompt_msg" = "Você tem certeza que você quer remover o número de telefone %@?"; +"settings_email_address" = "Email"; +"settings_email_address_placeholder" = "Entre seu endereço de email"; +"settings_add_email_address" = "Adicionar endereço de email"; "settings_phone_number" = "Telefone"; "settings_add_phone_number" = "Adicionar número de telefone"; -"settings_night_mode" = "Modo noturno"; -"settings_fail_to_update_profile" = "Falha ao atualizar perfil"; -"settings_enable_push_notif" = "Notificações neste aparelho"; -"settings_show_decrypted_content" = "Mostrar conteúdo descriptografado"; -"settings_global_settings_info" = "Configurações gerais de notificação estão disponíveis no %@ Web"; -"settings_on_denied_notification" = "As notificações são negadas para %@, permita-as nas configurações do seu aparelho"; -"settings_enable_callkit" = "Chamada integrada"; -"settings_callkit_info" = "Receba chamadas na sua tela de bloqueio. Veja suas chamadas do Element no histórico de chamadas do sistema. Se o iCloud estiver ativado, esse histórico de chamadas será compartilhado com a Apple."; -"settings_ui_language" = "Idioma"; +"settings_night_mode" = "Modo Noite"; +"settings_fail_to_update_profile" = "Falha para atualizar perfil"; +"settings_enable_push_notif" = "Notificações neste dispositivo"; +"settings_show_decrypted_content" = "Mostrar conteúdo decriptado"; +"settings_global_settings_info" = "Configurações de notificação globais estão disponíveis em seu cliente web %@"; +"settings_on_denied_notification" = "Notificações são negadas para %@, por favor permita-as nas configurações de seu dispositivo"; +"settings_enable_callkit" = "Chamamento integrado"; +"settings_callkit_info" = "Receba chamadas chegando em sua tela de bloqueio. Veja suas chamadas Element no histórico de chamadas do sistema. Se iCloud está ativado, este histórico de chamadas vai ser compartilhado com Apple."; +"settings_ui_language" = "Língua"; "settings_ui_theme" = "Tema"; -"settings_ui_theme_auto" = "Automático"; +"settings_ui_theme_auto" = "Auto"; "settings_ui_theme_light" = "Claro"; "settings_ui_theme_dark" = "Escuro"; "settings_ui_theme_black" = "Preto"; -"settings_ui_theme_picker_title" = "Selecione o tema"; -"settings_ui_theme_picker_message" = "\"Auto\" usa as configurações \"Inverter Cores\" do seu aparelho"; +"settings_ui_theme_picker_title" = "Selecione um tema"; +"settings_ui_theme_picker_message" = "\"Auto\" usa as configurações \"Inverter Cores\" de seu dispositivo"; "settings_unignore_user" = "Mostrar todas as mensagens de %@?"; -"settings_contacts_discover_matrix_users" = "Use e-mails e números de telefone para descobrir usuários"; -"settings_contacts_phonebook_country" = "País da lista telefônica"; -"settings_labs_e2e_encryption" = "Criptografia de ponta a ponta"; -"settings_labs_e2e_encryption_prompt_message" = "Para concluir a configuração da criptografia, você deve efetuar login novamente."; +"settings_contacts_discover_matrix_users" = "Usar emails e números de telefone para descobrir usuários"; +"settings_contacts_phonebook_country" = "País de livro de telefones"; +"settings_labs_e2e_encryption" = "Encriptação Ponta-a-Ponta"; +"settings_labs_e2e_encryption_prompt_message" = "Para terminar de configurar encriptação você deve fazer login de novo."; "settings_labs_room_members_lazy_loading" = "Usuários de carrregamento Lazy de salas"; "settings_labs_room_members_lazy_loading_error_message" = "Seu homeserver não suporta o carregamento Lazy de membros da sala ainda. Tente depois."; -"settings_labs_create_conference_with_jitsi" = "Crie chamadas em grupo com jitsi"; +"settings_labs_create_conference_with_jitsi" = "Criar chamadas de conferência com jitsi"; "settings_version" = "Versão %@"; -"settings_olm_version" = "Versão do Olm %@"; +"settings_olm_version" = "Versão de Olm %@"; "settings_copyright" = "Copyright"; "settings_copyright_url" = "https://riot.im/copyright"; -"settings_term_conditions" = "Termos e Condições"; +"settings_term_conditions" = "Termos & Condições"; "settings_term_conditions_url" = "https://riot.im/tac_apple"; "settings_privacy_policy" = "Política de Privacidade"; "settings_privacy_policy_url" = "https://riot.im/privacy"; -"settings_third_party_notices" = "Avisos de terceiros"; -"settings_send_crash_report" = "Enviar dados de falha e uso anônimos"; -"settings_enable_rageshake" = "Agite rapidamente para relatar um erro"; -"settings_clear_cache" = "Limpar cache e recarregar"; -"settings_change_password" = "Alterar senha"; +"settings_third_party_notices" = "Notas de Terceiros"; +"settings_send_crash_report" = "Enviar dados de cash & uso anon"; +"settings_enable_rageshake" = "Agite com raiva para reportar bug"; +"settings_clear_cache" = "Limpar cache"; +"settings_change_password" = "Mudar senha"; "settings_old_password" = "senha antiga"; "settings_new_password" = "senha nova"; -"settings_confirm_password" = "confirme a senha"; -"settings_fail_to_update_password" = "Falha ao atualizar senha"; -"settings_password_updated" = "Sua senha foi atualizada"; -"settings_crypto_device_name" = "Nome da sessão:· "; -"settings_crypto_device_id" = "\nID da sessão: "; -"settings_crypto_device_key" = "\nChave da sessão:\n"; +"settings_confirm_password" = "confirmar senha"; +"settings_fail_to_update_password" = "Falha para atualizar senha"; +"settings_password_updated" = "Sua senha tem sido atualizada"; +"settings_crypto_device_name" = "Nome de sessão: "; +"settings_crypto_device_id" = "\nID de sessão: "; +"settings_crypto_device_key" = "\nChave de sessão:\n"; "settings_crypto_export" = "Chaves de exportação"; -"settings_crypto_blacklist_unverified_devices" = "Criptografar apenas para sessões confirmadas"; +"settings_crypto_blacklist_unverified_devices" = "Encriptar para sessões verificadas somente"; "settings_deactivate_my_account" = "Desativar minha conta"; -"room_details_people" = "Participantes"; -"room_details_files" = "Arquivos"; +"room_details_people" = "Membros"; +"room_details_files" = "Uploads"; "room_details_settings" = "Configurações"; -"room_details_photo" = "Imagem da Sala"; -"room_details_room_name" = "Nome da sala"; -"room_details_topic" = "Descrição"; -"room_details_favourite_tag" = "Favorito"; +"room_details_photo" = "Foto de Sala"; +"room_details_room_name" = "Nome de Sala"; +"room_details_topic" = "Tópico"; +"room_details_favourite_tag" = "Favoritar"; "room_details_low_priority_tag" = "Baixa prioridade"; -"room_details_mute_notifs" = "Silenciar notificações"; -"room_details_direct_chat" = "Chat direto"; +"room_details_mute_notifs" = "Mutar notificações"; +"room_details_direct_chat" = "Chat Direto"; "room_details_access_section" = "Quem pode acessar esta sala?"; -"room_details_access_section_invited_only" = "Apenas pessoas que foram convidadas"; -"room_details_access_section_anyone_apart_from_guest" = "Quem conhece o link da sala, exceto convidados"; -"room_details_access_section_anyone" = "Qualquer pessoa que conheça o link da sala, incluindo convidados"; -"room_details_access_section_no_address_warning" = "Para ligar a uma sala, isto deve ter um endereço"; -"room_details_access_section_directory_toggle" = "Listar esta sala na lista de salas"; +"room_details_access_section_invited_only" = "Somente pessoas que têm sido convidadas"; +"room_details_access_section_anyone_apart_from_guest" = "Qualquer pessoa que sabe o link da sala, a parte de visitantes"; +"room_details_access_section_anyone" = "Qualquer pessoa que sabe o link da sala, incluindo visitantes"; +"room_details_access_section_no_address_warning" = "Para linkar a uma sala ela deve ter um endereço"; +"room_details_access_section_directory_toggle" = "Listar esta sala em diretório de salas"; "room_details_history_section" = "Quem pode ler o histórico?"; -"room_details_history_section_anyone" = "Qualquer um"; -"room_details_history_section_members_only" = "Apenas participantes (desde o momento em que selecionamos esta opção)"; -"room_details_history_section_members_only_since_invited" = "Apenas participantes (desde que foram convidados)"; -"room_details_history_section_members_only_since_joined" = "Apenas participantes (desde que aderiram)"; -"room_details_history_section_prompt_title" = "Alerta de privacidade"; -"room_details_history_section_prompt_msg" = "Alterações em quem pode ler o histórico de conversas aplica-se apenas para mensagens futuras nesta sala. A visibilidade do histórico existente não será alterada."; +"room_details_history_section_anyone" = "Qualquer pessoa"; +"room_details_history_section_members_only" = "Membros somente (desde o ponto no tempo de seleção desta opção)"; +"room_details_history_section_members_only_since_invited" = "Membros somente (desde que eles foram convidados)"; +"room_details_history_section_members_only_since_joined" = "Membros somente (desde que eles se juntaram)"; +"room_details_history_section_prompt_title" = "Aviso de privacidade"; +"room_details_history_section_prompt_msg" = "Mundaças de quem pode ler o histórico só se vão aplicar a mensagens futuras nesta sala. A visibilidade de histórico existente vai ser inalterada."; "room_details_addresses_section" = "Endereços"; -"room_details_no_local_addresses" = "Este quarto não tem endereços locais"; -"room_details_new_address" = "adicionar novo endereço"; -"room_details_new_address_placeholder" = "Adicionar novo endereço (por exemplo, #foo%@)"; +"room_details_no_local_addresses" = "Esta sala não tem nenhum endereço local"; +"room_details_new_address" = "Adicionar novo endereço"; +"room_details_new_address_placeholder" = "Adicionar novo endereço (e.g. #foo%@)"; "room_details_addresses_invalid_address_prompt_title" = "Formato de alias inválido"; "room_details_addresses_invalid_address_prompt_msg" = "%@ não é um formato válido para um alias"; -"room_details_addresses_disable_main_address_prompt_title" = "Alerta de endereço principal"; -"room_details_addresses_disable_main_address_prompt_msg" = "Você terá nenhum endereço principal especificado. O endereço principal padrão desta sala será escolhido aleatoriamente"; -"room_details_flair_section" = "Mostrar ícones de comunidades"; -"room_details_new_flair_placeholder" = "Adicionar nova ID de comunidade (por exemplo, +foo%@)"; -"room_details_flair_invalid_id_prompt_title" = "Formato Inválido"; +"room_details_addresses_disable_main_address_prompt_title" = "Aviso de endereço principal"; +"room_details_addresses_disable_main_address_prompt_msg" = "Você não vai ter nenhum endereço principal especificado. O endereço principal default para esta sala vai ser pego aleatoriamente"; +"room_details_flair_section" = "Mostrar flair para comunidades"; +"room_details_new_flair_placeholder" = "Adicionar nova ID de comunidade (e.g. +foo%@)"; +"room_details_flair_invalid_id_prompt_title" = "Formato inválido"; "room_details_flair_invalid_id_prompt_msg" = "%@ não é um identificador válido para uma comunidade"; -"room_details_banned_users_section" = "Usuários banidos"; -"room_details_advanced_section" = "Avançado"; -"room_details_advanced_room_id" = "ID da sala:"; +"room_details_banned_users_section" = "Usuárias(os) banidas(os)"; +"room_details_advanced_section" = "Avançadas"; +"room_details_advanced_room_id" = "ID de sala:"; "room_details_advanced_enable_e2e_encryption" = "Ativar criptografia (atenção: não pode ser desativado novamente!)"; "room_details_advanced_e2e_encryption_enabled" = "A criptografia está ativada nesta sala"; "room_details_advanced_e2e_encryption_disabled" = "A criptografia não está ativada nesta sala."; @@ -458,9 +458,9 @@ // Directory "directory_title" = "Lista"; "directory_server_picker_title" = "Selecionar uma lista"; -"settings_display_name" = "Nome e sobrenome"; -"settings_pin_rooms_with_missed_notif" = "Fixar sala com notificações perdidas"; -"settings_pin_rooms_with_unread" = "Fixar sala com mensagens não lidas"; +"settings_display_name" = "Nome de Exibição"; +"settings_pin_rooms_with_missed_notif" = "Fixar salas com notificações perdidas"; +"settings_pin_rooms_with_unread" = "Fixar salas com mensagens não-lidas"; "directory_server_all_rooms" = "Todas as salas no servidor %@"; "directory_server_all_native_rooms" = "Todas as salas nativas da Matrix"; "directory_server_type_homeserver" = "Digite um servidor local para listar suas salas públicas"; @@ -562,29 +562,29 @@ "auth_login_single_sign_on" = "Fazer Sign In"; "auth_autodiscover_invalid_response" = "Resposta de descoberta de servidorcasa inválida"; "room_message_unable_open_link_error_message" = "Incapaz de abrir o link."; -"settings_key_backup" = "BACKUP DA CHAVE"; -"settings_key_backup_info" = "As mensagens criptografadas são protegidas com criptografia de ponta a ponta. Somente você e o(s) destinatário(s) têm as chaves para ler essas mensagens."; -"settings_key_backup_info_checking" = "Verificando…"; -"settings_key_backup_info_none" = "O backup de suas chaves não está sendo feito nesta sessão."; -"settings_key_backup_info_signout_warning" = "Faça backup das chaves desta sessão antes de sair, para evitar a perda de chaves que estejam apenas neste aparelho."; -"settings_key_backup_info_version" = "Versão do backup de chave: %@"; +"settings_key_backup" = "BACKUP DE CHAVE"; +"settings_key_backup_info" = "Mensagens encriptadas são asseguradas com encriptação ponta-a-ponta. Somente você e a(s)/o(s) recipiente(s) têm as chaves para ler estas mensagens."; +"settings_key_backup_info_checking" = "Checando…"; +"settings_key_backup_info_none" = "Backup de suas chaves não está sendo feito desta sessão."; +"settings_key_backup_info_signout_warning" = "Conecte esta sessão a backup de chave antes de fazer signout para evitar perder quaisquer chaves que podem somente estar neste dispositivo."; +"settings_key_backup_info_version" = "Versão de Backup de Chave: %@"; "settings_key_backup_info_algorithm" = "Algoritmo: %@"; "settings_key_backup_info_valid" = "Esta sessão está fazendo backup de suas chaves."; -"settings_key_backup_info_not_valid" = "Esta sessão não está fazendo backup de suas chaves, mas você já possui um backup existente, o qual poderá restaurar e atualizar no futuro."; -"settings_key_backup_info_progress" = "Fazendo o backup das chaves %@…"; -"settings_key_backup_info_progress_done" = "O Backup de todas as chaves foi realizado"; -"settings_key_backup_info_trust_signature_unknown" = "O backup tem uma assinatura da sessão com o ID: %@"; -"settings_key_backup_info_trust_signature_valid" = "O backup tem uma assinatura válida desta sessão"; -"settings_key_backup_info_trust_signature_valid_device_verified" = "O backup tem uma assinatura válida de %@"; -"settings_key_backup_info_trust_signature_valid_device_unverified" = "O backup tem uma assinatura de %@"; -"settings_key_backup_info_trust_signature_invalid_device_verified" = "O backup tem uma assinatura inválida de %@"; -"settings_key_backup_info_trust_signature_invalid_device_unverified" = "O backup tem uma assinatura inválida de %@"; -"settings_key_backup_button_create" = "Comece a fazer o Backup de chave"; -"settings_key_backup_button_restore" = "Restaurar do backup"; -"settings_key_backup_button_delete" = "Remover backup"; +"settings_key_backup_info_not_valid" = "Esta sessão não está fazendo backup de suas chaves, mas você tem sim um backup existente de onde você pode restaurar e para onde você pode adicionar daqui em diante."; +"settings_key_backup_info_progress" = "Fazendo backup de %@ chaves…"; +"settings_key_backup_info_progress_done" = "Backup de todas as chaves foi feito"; +"settings_key_backup_info_trust_signature_unknown" = "Backup tem uma assinatura de sessão com ID: %@"; +"settings_key_backup_info_trust_signature_valid" = "Backup tem uma assinatura válida desta sessão"; +"settings_key_backup_info_trust_signature_valid_device_verified" = "Backup tem uma assinatura válida de %@"; +"settings_key_backup_info_trust_signature_valid_device_unverified" = "Backup tem uma assinatura de %@"; +"settings_key_backup_info_trust_signature_invalid_device_verified" = "Backup tem uma assinatura inválida de %@"; +"settings_key_backup_info_trust_signature_invalid_device_unverified" = "Backup tem uma assinatura inválida de %@"; +"settings_key_backup_button_create" = "Começar a usar Backup de Chave"; +"settings_key_backup_button_restore" = "Restaurar de Backup"; +"settings_key_backup_button_delete" = "Deletar Backup"; "settings_key_backup_button_use" = "Usar Backup da chave"; -"settings_key_backup_delete_confirmation_prompt_title" = "Remover backup"; -"settings_key_backup_delete_confirmation_prompt_msg" = "Tem certeza? Você perderá suas mensagens criptografadas se não tiver feito corretamente o backup de suas chaves."; +"settings_key_backup_delete_confirmation_prompt_title" = "Deletar Backup"; +"settings_key_backup_delete_confirmation_prompt_msg" = "Você tem certeza? Você vai perder suas mensagens encriptadas se o backup de suas chaves não tiver sido feito apropriadamente."; "room_does_not_exist" = "%@ não existe"; // Key backup wrong version "e2e_key_backup_wrong_version_title" = "Novo backup de chave"; @@ -666,15 +666,15 @@ "auth_softlogout_reason" = "A/o admin de seu servidorcasa (%1$@) tem feito seu signout de sua conta %2$@ (%3$@)."; // Errors "error_user_already_logged_in" = "Parece que você está tentando se conectar a um outro servidorcasa. Você quer fazer signout?"; -"settings_calls_stun_server_fallback_description" = "Permitir a assistência do servidor de chamadas reserva %@ quando seu servidor não oferecer este serviço (seu endereço IP será transmitido quando você ligar)."; -"security_settings_blacklist_unverified_devices" = "Nunca envie mensagens para sessões não confiáveis"; -"security_settings_blacklist_unverified_devices_description" = "Verifique todas as sessões de um usuário para marcá-las como confirmadas e enviar mensagens para eles."; -"security_settings_user_password_description" = "Confirme sua identidade digitando a senha da sua conta"; +"settings_calls_stun_server_fallback_description" = "Permitir servidor fallback de assistência de chamadas %@ quando seu servidorcasa não oferece um (seu endereço de IP seria compartilhado durante uma chamada)."; +"security_settings_blacklist_unverified_devices" = "Nunca enviar mensagens para sessões não-confiadas"; +"security_settings_blacklist_unverified_devices_description" = "Verificar todas as sessões de um/uma usuário(a) para marcá-las como confiadas e enviar mensagens para ele/ela."; +"security_settings_user_password_description" = "Confirme sua identidade ao entrar a senha de sua conta"; // Manage session "manage_session_title" = "Gerenciar sessão"; -"manage_session_name" = "Nome da sessão"; +"manage_session_name" = "Nome de sessão"; // AuthenticatedSessionViewControllerFactory -"authenticated_session_flow_not_supported" = "Este aplicativo não suporta o mecanismo de autenticação em seu servidor local."; +"authenticated_session_flow_not_supported" = "Este app não suporta o mecanismo de autenticação em seu servidorcasa."; "call_no_stun_server_error_message_1" = "Peça ao administrador do seu servidor local %@ para configurar um servidor TURN, de modo que as chamadas funcionem de maneira confiável."; "secure_key_backup_setup_existing_backup_error_unlock_it" = "Desbloqueá-lo"; "secure_key_backup_setup_existing_backup_error_delete_it" = "Apagá-lo"; @@ -694,8 +694,8 @@ "device_verification_cancelled_by_me" = "A confirmação foi cancelada. Motivo: %@"; "device_verification_error_cannot_load_device" = "Não foi possível carregar as informações da sessão."; "major_update_information" = "Estamos felizes em anunciar que mudamos de nome! Seu aplicativo está atualizado e você está conectado à sua conta."; -"room_action_camera" = "Tirar uma foto ou gravar vídeo"; -"room_accessibility_call" = "Chamada de voz"; +"room_action_camera" = "Tirar foto ou vídeo"; +"room_accessibility_call" = "Chamar"; "media_type_accessibility_video" = "Vídeo"; "event_formatter_jitsi_widget_added_by_you" = "Você adicionou chamada em grupo"; "event_formatter_jitsi_widget_removed_by_you" = "Você removeu chamada em grupo"; @@ -710,21 +710,21 @@ "room_member_power_level_short_moderator" = "Mod"; "room_event_action_reply" = "Responder"; "room_event_action_edit" = "Editar"; -"room_event_action_reaction_show_all" = "Mostrar tudo"; +"room_event_action_reaction_show_all" = "Mostrar todas"; "room_action_send_file" = "Enviar arquivo"; "room_action_reply" = "Responder"; -"room_accessibility_search" = "Buscar"; +"room_accessibility_search" = "Pesquisar"; "room_accessibility_integrations" = "Integrações"; "media_type_accessibility_audio" = "Áudio"; "media_type_accessibility_file" = "Arquivo"; -"media_type_accessibility_sticker" = "Figurinha"; +"media_type_accessibility_sticker" = "Sticker"; "settings_integrations" = "INTEGRAÇÕES"; "settings_three_pids_management_information_part3" = "."; "settings_security" = "SEGURANÇA"; "settings_integrations_allow_button" = "Gerenciar integrações"; -"settings_integrations_allow_description" = "Use o Gerenciador de Integrações (%@) para gerenciar bots, integrações, widgets e pacotes de figurinhas.\n\nO Gerenciador de Integrações recebe dados de configuração e pode modificar widgets, enviar convites para salas e definir níveis de permissão em seu nome."; -"settings_add_3pid_password_title_email" = "Adicionar endereço de e-mail"; -"settings_discovery_three_pids_management_information_part2" = "Configurações do usuário"; +"settings_integrations_allow_description" = "Use um Gerenciador de Integração (%@) para gerenciar bots, bridges, widgets e pacotes de stickers.\n\nGerenciadores de Integração recebem dados de configuração, e podem modificar widgets, enviar convites de sala e definir níveis de poder em seu nome."; +"settings_add_3pid_password_title_email" = "Adicionar endereço de email"; +"settings_discovery_three_pids_management_information_part2" = "Configurações de Usuária(o)"; "settings_discovery_three_pids_management_information_part3" = "."; "settings_discovery_three_pid_details_share_action" = "Compartilhar"; "settings_discovery_three_pid_details_revoke_action" = "Revogar"; @@ -741,11 +741,11 @@ "key_verification_scan_confirmation_scanning_user_waiting_other" = "Aguardando %@…"; "key_verification_scan_confirmation_scanning_device_waiting_other" = "Aguardando o outro aparelho…"; "user_verification_start_waiting_partner" = "Aguardando %@…"; -"settings_devices_description" = "O nome público de uma sessão é visível para as pessoas com quem você se comunica"; -"security_settings_crypto_sessions_description_2" = "Se você não reconhecer um login, altere sua senha e refaça o backup online."; -"security_settings_export_keys_manually" = "Exportar as chaves manualmente"; -"identity_server_settings_change" = "Alterar"; -"identity_server_settings_alert_change_title" = "Alterar o servidor de identidade"; +"settings_devices_description" = "O nome público de uma sessão é visível para pessoas com quem você se comunica"; +"security_settings_crypto_sessions_description_2" = "Se você não reconhece um login, mude sua senha e resette Backup Seguro."; +"security_settings_export_keys_manually" = "Exportar chaves manualmente"; +"identity_server_settings_change" = "Mudar"; +"identity_server_settings_alert_change_title" = "Mudar servidor de identidade"; // Media picker "media_picker_title" = "Galeria"; "image_picker_action_library" = "Escolher da galeria"; @@ -779,22 +779,22 @@ "room_creation_error_invite_user_by_email_without_identity_server" = "Nenhum servidor de identidade está configurado então você não pode adicionar um/uma participante com um email."; "room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Nenhum servidor de identidade está configurado então você não pode começar um chat com um contato usando um email."; "room_participants_action_security_status_warning" = "Aviso"; -"settings_three_pids_management_information_part1" = "Gerencie quais endereços de e-mail ou números de telefone você pode usar para fazer login ou recuperar sua conta aqui. Controle quem pode encontrar você em· "; -"settings_calls_stun_server_fallback_button" = "Permitir a assistência do servidor de chamadas reserva"; -"settings_discovery_terms_not_signed" = "Concorde com os Termos de Serviço do servidor de identidade (%@), para que você possa ser descoberto por endereço de e-mail ou por número de telefone."; -"settings_discovery_three_pids_management_information_part1" = "Gerencie quais endereços de e-mail ou números de telefone outros usuários podem usar para descobrir sua conta e enviar um convite para salas. Adicione ou remova endereços de e-mail ou números de telefone desta lista em· "; -"settings_discovery_three_pid_details_title_email" = "Gerenciar e-mail"; -"settings_discovery_three_pid_details_information_email" = "Configure este endereço de e-mail, que outros usuários podem usar para descobrir sua conta e enviar um convite para salas. Adicione ou remova endereços de e-mail em Contas."; -"settings_discovery_three_pid_details_cancel_email_validation_action" = "Cancelar a validação de e-mail"; -"security_settings_crosssigning" = "AUTOVERIFICAÇÃO"; -"security_settings_crosssigning_info_not_bootstrapped" = "A autoverificação ainda não está ativada."; -"security_settings_crosssigning_info_exists" = "A sua conta tem uma identidade autoverificada em armazenamento secreto, mas ainda não é considerada confiável por esta sessão. Conclua as etapas de segurança desta sessão."; -"security_settings_crosssigning_info_trusted" = "A autoverificação está ativada. Você pode confiar em outros usuários e em suas outras sessões com base na autoverificação deles, mas você não pode fazer a autoverificação nesta sessão porque ela não possui as suas chaves privadas da autoverificação. Complete as etapas de segurança desta sessão."; -"security_settings_crosssigning_info_ok" = "A autoverificação está ativada."; -"security_settings_crosssigning_bootstrap" = "Fazer a autoverificação"; -"security_settings_crosssigning_reset" = "Refazer a autoverificação"; -"identity_server_settings_disconnect_info" = "Desconectar-se do servidor de identidade significa que você não poderá ser descoberto por outros usuários e não poderá convidar outras pessoas por e-mail ou número de celular."; -"identity_server_settings_alert_disconnect_still_sharing_3pid" = "Você ainda está compartilhando seus dados pessoais no servidor de identidade %@.↵\n↵\nRecomendamos que você remova seus endereços de e-mail e números de telefone do servidor de identidade antes de desconectar."; +"settings_three_pids_management_information_part1" = "Gerencie quais endereços de email ou números de telefone você pode usar para fazer login ou recuperar sua conta aqui. Controle quem pode encontrar você em "; +"settings_calls_stun_server_fallback_button" = "Permitir servidor fallback de assistência de chamadas"; +"settings_discovery_terms_not_signed" = "Concorde com os Termos de Serviço do Servidor de Identidade (%@) para permitir que você mesma(o) seja descobertável por endereço de email ou número de telefone."; +"settings_discovery_three_pids_management_information_part1" = "Gerencie quais endereços de email ou números de telefone outras(os) usuárias(os) podem usar para descobrir você e usar para convidar você a salas. Adicione ou remova endereços de email ou números de telefone desta lista em "; +"settings_discovery_three_pid_details_title_email" = "Gerenciar email"; +"settings_discovery_three_pid_details_information_email" = "Gerencie preferências para este endereço de email, que outras(os) usuárias(os) podem usar para descobrir você e usar para convidar você a salas. Adicione ou remova endereços de email em Contas."; +"settings_discovery_three_pid_details_cancel_email_validation_action" = "Cancelar validação de email"; +"security_settings_crosssigning" = "ASSINATURA CRUZADA"; +"security_settings_crosssigning_info_not_bootstrapped" = "Assinatura cruzada não está ainda configurada."; +"security_settings_crosssigning_info_exists" = "Sua conta tem uma identidade de assinatura cruzada, mas ainda não é confiada por esta sessão. Complete segurança desta sessão."; +"security_settings_crosssigning_info_trusted" = "Assinatura cruzada está ativada. Você pode confiar em outras(os) usuárias(os) e suas outras sessões baseada(o) em assinatura cruzada mas você não pode fazer assinar cruzado desta sessão porque ela não tem chaves privadas de assinatura cruzada. Complete segurança desta sessão."; +"security_settings_crosssigning_info_ok" = "Assinatura cruzada está ativada."; +"security_settings_crosssigning_bootstrap" = "Fazer bootstrap de assinatura cruzada"; +"security_settings_crosssigning_reset" = "Resettar assinatura cruzada"; +"identity_server_settings_disconnect_info" = "Desconectar-se de seu servidor de identidade vai significar que você não vai ser descobertável por outras(os) usuárias(os) e ser capaz de convidar outras(os) por email ou telefone."; +"identity_server_settings_alert_disconnect_still_sharing_3pid" = "Você ainda está compartilhando seus dados pessoais no servidor de identidade %@.\n\nNós recomendamos que você remova seus endereços de email e números de telefone do servidor de identidade antes de se desconectar."; "call_no_stun_server_error_title" = "A chamada falhou por conta de má configuração no servidor"; "widget_integration_manager_disabled" = "Você precisa ativar o Gerenciador de Integrações nas configurações"; "service_terms_modal_description_for_identity_server_1" = "Encontrar outras pessoas por telefone ou e-mail"; @@ -848,64 +848,64 @@ "room_accessiblity_scroll_to_bottom" = "Rolar para fundo"; "room_event_action_reaction_show_less" = "Mostrar menos"; "room_event_action_reaction_history" = "Histórico de reações"; -"room_message_edits_history_title" = "Edições na mensagem"; -"room_accessibility_upload" = "Enviar"; -"room_accessibility_hangup" = "Encerrar"; -"media_type_accessibility_image" = "Foto"; -"media_type_accessibility_location" = "Localização"; -"external_link_confirmation_title" = "Verificar este link"; -"external_link_confirmation_message" = "O link %@ redirecionará você para outro site: %@↵\n↵\nDeseja continuar?"; -"settings_discovery_settings" = "ENCONTRAR CONTATOS"; +"room_message_edits_history_title" = "Edições de mensagem"; +"room_accessibility_upload" = "Fazer upload"; +"room_accessibility_hangup" = "Desligar"; +"media_type_accessibility_image" = "Imagem"; +"media_type_accessibility_location" = "Local"; +"external_link_confirmation_title" = "Cheque duplamente este link"; +"external_link_confirmation_message" = "O link %@ vai levar você para um outro site: %@↵\n↵\nVocê tem certeza que você quer continuar?"; +"settings_discovery_settings" = "DESCOBERTA"; "settings_identity_server_settings" = "SERVIDOR DE IDENTIDADE"; -"settings_three_pids_management_information_part2" = "Encontrar contatos"; -"settings_labs_message_reaction" = "Adicionar reações em mensagens"; +"settings_three_pids_management_information_part2" = "Descoberta"; +"settings_labs_message_reaction" = "Reagir a mensagens com emoji"; "settings_add_3pid_password_title_msidsn" = "Adicionar número de telefone"; -"settings_add_3pid_password_message" = "Para continuar, por favor, digite sua senha"; +"settings_add_3pid_password_message" = "Para continuar, por favor entre sua senha"; "settings_add_3pid_invalid_password_message" = "Credenciais inválidas"; -"settings_key_backup_button_connect" = "Autorize esta sessão a fazer o backup de chaves"; -"settings_discovery_no_identity_server" = "No momento, você não está usando um servidor de identidade. Para descobrir e ser descoberto pelos contatos existentes, adicione um abaixo."; -"settings_discovery_error_message" = "Um erro ocorreu. Por favor, tente novamente mais tarde."; -"settings_discovery_three_pid_details_title_phone_number" = "Editar número de telefone"; -"settings_discovery_three_pid_details_information_phone_number" = "Configure este número de telefone, que outros usuários podem usar para descobrir sua conta e enviar um convite para salas. Adicione ou remova números de telefone em Contas."; -"settings_discovery_three_pid_details_enter_sms_code_action" = "Digite o código de ativação"; -"settings_identity_server_description" = "Usando o servidor de identidade definido acima, você pode descobrir e ser descoberto por contatos existentes que você conhece."; -"settings_identity_server_no_is" = "Nenhum servidor de identidade está configurado"; -"settings_identity_server_no_is_description" = "No momento, você não está usando um servidor de identidade. Para descobrir e ser descoberto pelos contatos existentes, adicione um acima."; +"settings_key_backup_button_connect" = "Conectar esta sessão a Backup de Chave"; +"settings_discovery_no_identity_server" = "Você não está atualmente usando um servidor de identidade. Para ser descobertável por contatos existentes, adicione um."; +"settings_discovery_error_message" = "Um erro ocorreu. Por favor retente."; +"settings_discovery_three_pid_details_title_phone_number" = "Gerenciar número de telefone"; +"settings_discovery_three_pid_details_information_phone_number" = "Gerencie preferências para este número de telefone, que outras(os) usuárias(os) podem usar para descobrir você e usar para convidar você a salas. Adicione ou remova números de telefone em Contas."; +"settings_discovery_three_pid_details_enter_sms_code_action" = "Entrar código de ativação de SMS"; +"settings_identity_server_description" = "Usando o servidor de identidade definido acima, você pode descobrir e ser descobertável por contatos existentes que você conhece."; +"settings_identity_server_no_is" = "Nenhum servidor de identidade configurado"; +"settings_identity_server_no_is_description" = "Você não está atualmente usando um servidor de identidade. Para descobrir e ser descobertável por contatos existentes que você conhece, adicione um acima."; // Security settings "security_settings_title" = "Segurança"; "security_settings_crypto_sessions" = "MINHAS SESSÕES"; "security_settings_crypto_sessions_loading" = "Carregando sessões…"; -"security_settings_secure_backup" = "BACKUP ONLINE"; -"security_settings_secure_backup_description" = "Previna-se contra a perda de acesso a mensagens e dados criptografados, fazendo backup das chaves de criptografia no seu servidor."; +"security_settings_secure_backup" = "BACKUP SEGURO"; +"security_settings_secure_backup_description" = "Salvaguardar-se contra perda de acesso a mensagens & dados encriptados ao fazer backup de chaves de encriptação em seu servidor."; "security_settings_secure_backup_setup" = "Configurar"; "security_settings_secure_backup_synchronise" = "Sincronizar"; -"security_settings_secure_backup_delete" = "Excluir"; -"security_settings_backup" = "BACKUP DE MENSAGENS"; -"security_settings_crosssigning_complete_security" = "Concluir segurança"; +"security_settings_secure_backup_delete" = "Deletar"; +"security_settings_backup" = "BACKUP DE MENSAGEM"; +"security_settings_crosssigning_complete_security" = "Completar segurança"; "security_settings_cryptography" = "CRIPTOGRAFIA"; -"security_settings_advanced" = "AVANÇADO"; -"security_settings_complete_security_alert_title" = "Concluir segurança"; -"security_settings_complete_security_alert_message" = "Primeiro, você precisa concluir as etapas de segurança de sua sessão atual."; -"security_settings_coming_soon" = "Desculpe, este recurso ainda não está disponível no Element para iOS. Use outro cliente Matrix para configurar este recurso, e a definição valerá aqui."; -"manage_session_info" = "INFORMAÇÕES DA SESSÃO"; -"manage_session_trusted" = "Confiado por você"; -"manage_session_not_trusted" = "Não confiável"; -"manage_session_sign_out" = "Sair desta sessão"; +"security_settings_advanced" = "AVANÇADAS"; +"security_settings_complete_security_alert_title" = "Completar segurança"; +"security_settings_complete_security_alert_message" = "Você deveria completar segurança em sua sessão atual primeiro."; +"security_settings_coming_soon" = "Desculpe. Esta ação não está disponível em Element iOS ainda. Por favor use um outro cliente Matrix para configurá-la. Element iOS vai usá-la."; +"manage_session_info" = "INFO DE SESSÃO"; +"manage_session_trusted" = "Confiada por você"; +"manage_session_not_trusted" = "Não confiada"; +"manage_session_sign_out" = "Fazer signout desta sessão"; // Identity server settings -"identity_server_settings_title" = "Servidor de identidade"; -"identity_server_settings_description" = "No momento, você está usando %@ para descobrir e ser descoberto por seus contatos."; -"identity_server_settings_no_is_description" = "No momento, você não está usando um servidor de identidade. Para descobrir e ser descoberto pelos contatos existentes, adicione um acima."; -"identity_server_settings_place_holder" = "Digite um novo servidor de identidade"; +"identity_server_settings_title" = "Servidor de Identidade"; +"identity_server_settings_description" = "Vvocê está atualmente usando %@ para descobrir e ser descobertável por contatos existentes que você conhece."; +"identity_server_settings_no_is_description" = "Você não está atualmente usando um servidor de identidade. Para descobrir e ser descobertável por contatos existentes, adicione um acima."; +"identity_server_settings_place_holder" = "Entrar um servidor de identidade"; "identity_server_settings_add" = "Adicionar"; -"identity_server_settings_disconnect" = "Desconectar"; -"identity_server_settings_alert_no_terms_title" = "O servidor de identidade não tem termos de serviço"; -"identity_server_settings_alert_no_terms" = "O servidor de identidade que você escolheu não possui termos de serviço. Continue apenas se você confiar no proprietário do servidor."; -"identity_server_settings_alert_change" = "Desconectar-se do servidor de identidade %1$@ e conectar-se em %2$@ em vez disso?"; +"identity_server_settings_disconnect" = "Desconectar-se"; +"identity_server_settings_alert_no_terms_title" = "Servidor de identidade não tem termos de serviço"; +"identity_server_settings_alert_no_terms" = "O servidor de identidade que você tem escolhido não tem quaisquer termos de serviço. Somente continue se você confia na/do proprietária(o) do serviço."; +"identity_server_settings_alert_change" = "Desconectar-se do servidor de identidade %1$@ e conectar-se a %2$@ em vez disso?"; "identity_server_settings_alert_disconnect_title" = "Desconectar servidor de identidade"; "identity_server_settings_alert_disconnect" = "Desconectar-se do servidor de identidade %@?"; -"identity_server_settings_alert_disconnect_button" = "Desconectar"; -"identity_server_settings_alert_disconnect_still_sharing_3pid_button" = "Desconectar de qualquer maneira"; -"identity_server_settings_alert_error_terms_not_accepted" = "Você precisa aceitar os termos de %@ para defini-lo como servidor de identidade."; +"identity_server_settings_alert_disconnect_button" = "Desconectar-se"; +"identity_server_settings_alert_disconnect_still_sharing_3pid_button" = "Desconectar-se mesmo assim"; +"identity_server_settings_alert_error_terms_not_accepted" = "Você deve aceitar termos de %@ para defini-lo como servidor de identidade."; "identity_server_settings_alert_error_invalid_identity_server" = "%@ não é um servidor de identidade válido."; // Image picker "image_picker_action_camera" = "Tirar foto"; @@ -1164,11 +1164,11 @@ "room_details_advanced_e2e_encryption_disabled_for_dm" = "A criptografia não está ativada nesta sala."; "room_details_advanced_e2e_encryption_enabled_for_dm" = "A criptografia está ativada nesta sala"; "room_details_advanced_room_id_for_dm" = "ID:"; -"room_details_no_local_addresses_for_dm" = "Esta sala não tem endereços locais"; -"room_details_access_section_directory_toggle_for_dm" = "Exibir esta sala na lista pública de salas"; -"room_details_access_section_anyone_for_dm" = "Quem conhece o link da sala, incluindo convidados"; -"room_details_access_section_anyone_apart_from_guest_for_dm" = "Qualquer pessoa que tenha o link da sala, exceto convidados"; -"room_details_access_section_for_dm" = "Quem pode acessar esta sala?"; +"room_details_no_local_addresses_for_dm" = "Isto não tem nenhum endereço local"; +"room_details_access_section_directory_toggle_for_dm" = "Listar em diretório de salas"; +"room_details_access_section_anyone_for_dm" = "Qualquer pessoa que sabe o link, incluindo visitantes"; +"room_details_access_section_anyone_apart_from_guest_for_dm" = "Qualquer pessoa que sabe o link, a parte de visitantes"; +"room_details_access_section_for_dm" = "Quem pode acessar isto?"; "room_details_room_name_for_dm" = "Nome"; "room_details_photo_for_dm" = "Foto"; "room_details_title_for_dm" = "Detalhes"; @@ -1274,7 +1274,7 @@ "call_transfer_contacts_all" = "Todos"; "call_transfer_contacts_recent" = "Recente"; "call_transfer_users" = "Pessoas"; -"event_formatter_call_has_ended" = "Essa chamada foi encerrada"; +"event_formatter_call_has_ended" = "Encerrou %@"; "room_intro_cell_information_multiple_dm_sentence2" = "Somente vocês estão nesta conversa, ao menos até que convidem alguém para participar."; "room_intro_cell_information_dm_sentence2" = "Apenas vocês dois/duas estão nesta conversa, ninguém mais pode entrar."; "room_intro_cell_information_dm_sentence1_part3" = ". "; @@ -1300,11 +1300,11 @@ "call_actions_unhold" = "Retomar"; "event_formatter_call_back" = "Ligar de volta"; "event_formatter_call_you_declined" = "Você recusou esta chamada"; -"event_formatter_call_you_currently_in" = "Você está nesta chamada"; +"event_formatter_call_you_currently_in" = "Chamada ativa"; "event_formatter_call_video" = "Chamada de vídeo"; "event_formatter_call_voice" = "Chamada de voz"; -"settings_show_NSFW_public_rooms" = "Exibir salas públicas com conteúdo sensível"; -"room_open_dialpad" = "Teclado de discagem"; +"settings_show_NSFW_public_rooms" = "Mostrar salas públicas NSFW"; +"room_open_dialpad" = "Pad de disco"; "room_place_voice_call" = "Chamada de voz"; "room_event_action_delete_confirmation_message" = "Você tem certeza que você quer deletar esta mensagem não-enviada?"; "room_event_action_delete_confirmation_title" = "Deletar mensagem não-enviada"; @@ -1324,3 +1324,10 @@ // Chat "room_slide_to_end_group_call" = "Deslizar para terminar a chamada para todas as pessoas"; "callbar_only_single_active_group" = "Toque para Juntar-Se à chamada de grupo (%@)"; +"room_details_integrations" = "Integrações"; +"room_details_search" = "Pesquisar sala"; +"settings_labs_enable_ringing_for_group_calls" = "Toque para chamadas de grupo"; +"room_multiple_typing_notification" = "%@ e outras(os)"; +"room_no_privileges_to_create_group_call" = "Você precisa ser um/uma admin ou um/uma moderador(a) para começar uma chamada."; +"room_join_group_call" = "Juntar-se"; +"room_accessibility_video_call" = "Chamar por Vídeo"; From 3dcb250200286241caae13ae563e514a02e78743 Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 09:53:31 +0200 Subject: [PATCH 350/393] Security settings: Add an option to reset the secure backup It will overwrite the existing one if any --- Riot/Assets/en.lproj/Vector.strings | 1 + Riot/Generated/Strings.swift | 4 +++ Riot/Modules/Home/HomeViewController.m | 2 +- .../SecretsSetupRecoveryKeyCoordinator.swift | 5 +-- .../SecretsSetupRecoveryKeyViewModel.swift | 14 +++++++- .../Setup/SecureBackupSetupCoordinator.swift | 6 ++-- ...ackupSetupCoordinatorBridgePresenter.swift | 8 +++-- ...SettingsSecureBackupTableViewSection.swift | 34 +++++++++++++++++++ .../SettingsSecureBackupViewAction.swift | 1 + .../SettingsSecureBackupViewModel.swift | 2 ++ .../SettingsSecureBackupViewModelType.swift | 2 ++ .../Security/SecurityViewController.m | 7 +++- .../Modules/Settings/SettingsViewController.m | 2 +- 13 files changed, 77 insertions(+), 11 deletions(-) diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 5beb441be..e650a7bb5 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -625,6 +625,7 @@ Tap the + to start adding people."; "security_settings_secure_backup_info_checking" = "Checking…"; "security_settings_secure_backup_info_valid" = "This session is backing up your keys."; "security_settings_secure_backup_setup" = "Set up"; +"security_settings_secure_backup_reset" = "Reset"; "security_settings_secure_backup_restore" = "Restore from Backup"; "security_settings_secure_backup_delete" = "Delete Backup"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 7d6a543c2..0b65ad6a0 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -3882,6 +3882,10 @@ internal enum VectorL10n { internal static var securitySettingsSecureBackupInfoValid: String { return VectorL10n.tr("Vector", "security_settings_secure_backup_info_valid") } + /// Reset + internal static var securitySettingsSecureBackupReset: String { + return VectorL10n.tr("Vector", "security_settings_secure_backup_reset") + } /// Restore from Backup internal static var securitySettingsSecureBackupRestore: String { return VectorL10n.tr("Vector", "security_settings_secure_backup_restore") diff --git a/Riot/Modules/Home/HomeViewController.m b/Riot/Modules/Home/HomeViewController.m index 553f6e6ce..d8d5382fc 100644 --- a/Riot/Modules/Home/HomeViewController.m +++ b/Riot/Modules/Home/HomeViewController.m @@ -167,7 +167,7 @@ - (void)presentSecureBackupSetup { - SecureBackupSetupCoordinatorBridgePresenter *keyBackupSetupCoordinatorBridgePresenter = [[SecureBackupSetupCoordinatorBridgePresenter alloc] initWithSession:self.mainSession]; + SecureBackupSetupCoordinatorBridgePresenter *keyBackupSetupCoordinatorBridgePresenter = [[SecureBackupSetupCoordinatorBridgePresenter alloc] initWithSession:self.mainSession allowOverwrite:NO]; keyBackupSetupCoordinatorBridgePresenter.delegate = self; [keyBackupSetupCoordinatorBridgePresenter presentFrom:self animated:YES]; diff --git a/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyCoordinator.swift b/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyCoordinator.swift index d11b3e619..f08f88869 100644 --- a/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyCoordinator.swift +++ b/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyCoordinator.swift @@ -39,8 +39,9 @@ final class SecretsSetupRecoveryKeyCoordinator: SecretsSetupRecoveryKeyCoordinat init(recoveryService: MXRecoveryService, passphrase: String?, - passphraseOnly: Bool) { - let secretsSetupRecoveryKeyViewModel = SecretsSetupRecoveryKeyViewModel(recoveryService: recoveryService, passphrase: passphrase, passphraseOnly: passphraseOnly) + passphraseOnly: Bool, + allowOverwrite: Bool = false) { + let secretsSetupRecoveryKeyViewModel = SecretsSetupRecoveryKeyViewModel(recoveryService: recoveryService, passphrase: passphrase, passphraseOnly: passphraseOnly, allowOverwrite: allowOverwrite) let secretsSetupRecoveryKeyViewController = SecretsSetupRecoveryKeyViewController.instantiate(with: secretsSetupRecoveryKeyViewModel) self.secretsSetupRecoveryKeyViewModel = secretsSetupRecoveryKeyViewModel self.secretsSetupRecoveryKeyViewController = secretsSetupRecoveryKeyViewController diff --git a/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyViewModel.swift b/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyViewModel.swift index 8ad575dca..af85b7eb7 100644 --- a/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyViewModel.swift +++ b/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyViewModel.swift @@ -27,6 +27,7 @@ final class SecretsSetupRecoveryKeyViewModel: SecretsSetupRecoveryKeyViewModelTy private let recoveryService: MXRecoveryService private let passphrase: String? private let passphraseOnly: Bool + private let allowOverwrite: Bool // MARK: Public @@ -35,10 +36,11 @@ final class SecretsSetupRecoveryKeyViewModel: SecretsSetupRecoveryKeyViewModelTy // MARK: - Setup - init(recoveryService: MXRecoveryService, passphrase: String?, passphraseOnly: Bool) { + init(recoveryService: MXRecoveryService, passphrase: String?, passphraseOnly: Bool, allowOverwrite: Bool = false) { self.recoveryService = recoveryService self.passphrase = passphrase self.passphraseOnly = passphraseOnly + self.allowOverwrite = allowOverwrite } // MARK: - Public @@ -61,6 +63,16 @@ final class SecretsSetupRecoveryKeyViewModel: SecretsSetupRecoveryKeyViewModelTy private func createSecureKey() { self.update(viewState: .loading) + + if allowOverwrite && self.recoveryService.hasRecovery() { + MXLog.debug("[SecretsSetupRecoveryKeyViewModel] createSecureKey: Overwrite existing secure backup") + self.recoveryService.deleteRecovery(withDeleteServicesBackups: true) { + self.createSecureKey() + } failure: { error in + self.update(viewState: .error(error)) + } + return + } self.recoveryService.createRecovery(forSecrets: nil, withPassphrase: self.passphrase, createServicesBackups: true, success: { secretStorageKeyCreationInfo in self.update(viewState: .recoveryCreated(secretStorageKeyCreationInfo.recoveryKey)) diff --git a/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinator.swift b/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinator.swift index 0ddb3416c..543616377 100644 --- a/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinator.swift +++ b/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinator.swift @@ -30,6 +30,7 @@ final class SecureBackupSetupCoordinator: SecureBackupSetupCoordinatorType { private let recoveryService: MXRecoveryService private let keyBackup: MXKeyBackup? private let checkKeyBackup: Bool + private let allowOverwrite: Bool // MARK: Public @@ -45,11 +46,12 @@ final class SecureBackupSetupCoordinator: SecureBackupSetupCoordinatorType { /// - session: The MXSession. /// - checkKeyBackup: Indicate false to ignore existing key backup. /// - navigationRouter: Use existing navigation router to plug this flow or let nil to use new one. - init(session: MXSession, checkKeyBackup: Bool = true, navigationRouter: NavigationRouterType? = nil) { + init(session: MXSession, checkKeyBackup: Bool = true, allowOverwrite: Bool = false, navigationRouter: NavigationRouterType? = nil) { self.session = session self.recoveryService = session.crypto.recoveryService self.keyBackup = session.crypto.backup self.checkKeyBackup = checkKeyBackup + self.allowOverwrite = allowOverwrite if let navigationRouter = navigationRouter { self.navigationRouter = navigationRouter @@ -85,7 +87,7 @@ final class SecureBackupSetupCoordinator: SecureBackupSetupCoordinatorType { } private func showSetupKey(passphraseOnly: Bool, passphrase: String? = nil) { - let coordinator = SecretsSetupRecoveryKeyCoordinator(recoveryService: self.recoveryService, passphrase: passphrase, passphraseOnly: passphraseOnly) + let coordinator = SecretsSetupRecoveryKeyCoordinator(recoveryService: self.recoveryService, passphrase: passphrase, passphraseOnly: passphraseOnly, allowOverwrite: allowOverwrite) coordinator.delegate = self coordinator.start() diff --git a/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinatorBridgePresenter.swift b/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinatorBridgePresenter.swift index 9748dbc51..3db379e8f 100644 --- a/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinatorBridgePresenter.swift +++ b/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinatorBridgePresenter.swift @@ -33,6 +33,7 @@ final class SecureBackupSetupCoordinatorBridgePresenter: NSObject { // MARK: Private private let session: MXSession + private let allowOverwrite: Bool private var coordinator: SecureBackupSetupCoordinator? // MARK: Public @@ -40,9 +41,10 @@ final class SecureBackupSetupCoordinatorBridgePresenter: NSObject { weak var delegate: SecureBackupSetupCoordinatorBridgePresenterDelegate? // MARK: - Setup - - init(session: MXSession) { + + init(session: MXSession, allowOverwrite: Bool) { self.session = session + self.allowOverwrite = allowOverwrite super.init() } @@ -54,7 +56,7 @@ final class SecureBackupSetupCoordinatorBridgePresenter: NSObject { // } func present(from viewController: UIViewController, animated: Bool) { - let secureBackupSetupCoordinator = SecureBackupSetupCoordinator(session: self.session) + let secureBackupSetupCoordinator = SecureBackupSetupCoordinator(session: self.session, allowOverwrite: self.allowOverwrite) secureBackupSetupCoordinator.delegate = self viewController.present(secureBackupSetupCoordinator.toPresentable(), animated: animated, completion: nil) secureBackupSetupCoordinator.start() diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift index 4eb879b1c..ab5e697a3 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift @@ -17,22 +17,28 @@ import UIKit @objc protocol SettingsSecureBackupTableViewSectionDelegate: class { + // Table view rendering func settingsSecureBackupTableViewSectionDidUpdate(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection) func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, textCellForRow: Int) -> MXKTableViewCellWithTextView func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, buttonCellForRow: Int) -> MXKTableViewCellWithButton + // Secure backup + func settingsSecureBackupTableViewSectionShowSecureBackupReset(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection) + // Key backup func settingsSecureBackupTableViewSectionShowKeyBackupCreate(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection) func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, showKeyBackupRecover keyBackupVersion: MXKeyBackupVersion) func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, showKeyBackupDeleteConfirm keyBackupVersion: MXKeyBackupVersion) + // Life cycle func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, showActivityIndicator show: Bool) func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, showError error: Error) } private enum BackupRows { case info(text: String) + case resetSecureBackupAction case createKeyBackupAction case restoreFromKeyBackupAction(keyBackupVersion: MXKeyBackupVersion, title: String) case deleteKeyBackupAction(keyBackupVersion: MXKeyBackupVersion) @@ -89,6 +95,8 @@ private enum BackupRows { let infoCell: MXKTableViewCellWithTextView = delegate.settingsSecureBackupTableViewSection(self, textCellForRow: row) infoCell.mxkTextView.text = infoText cell = infoCell + case .resetSecureBackupAction: + cell = self.buttonCellForResetSecureBackup(atRow: row) case .createKeyBackupAction: cell = self.buttonCellForCreateKeyBackup(atRow: row) case .restoreFromKeyBackupAction(keyBackupVersion: let keyBackupVersion, let title): @@ -168,6 +176,7 @@ private enum BackupRows { } backupViewStateRows.append(.deleteKeyBackupAction(keyBackupVersion: keyBackupVersion)) + backupViewStateRows.append(.resetSecureBackupAction) backupRows = backupViewStateRows @@ -245,6 +254,26 @@ private enum BackupRows { } // MARK: - Button cells + + private func buttonCellForResetSecureBackup(atRow row: Int) -> UITableViewCell { + + guard let delegate = self.delegate else { + return UITableViewCell() + } + + let cell: MXKTableViewCellWithButton = delegate.settingsSecureBackupTableViewSection(self, buttonCellForRow: row) + + let btnTitle = VectorL10n.securitySettingsSecureBackupReset + cell.mxkButton.setTitle(btnTitle, for: .normal) + cell.mxkButton.setTitle(btnTitle, for: .highlighted) + cell.mxkButton.tintColor = ThemeService.shared().theme.warningColor + + cell.mxkButton.vc_addAction { + self.viewModel.process(viewAction: .resetSecureBackup) + } + + return cell + } private func buttonCellForCreateKeyBackup(atRow row: Int) -> UITableViewCell { @@ -300,6 +329,7 @@ private enum BackupRows { // MARK: - KeyBackupSetupRecoveryKeyViewModelViewDelegate extension SettingsSecureBackupTableViewSection: SettingsSecureBackupViewModelViewDelegate { + func settingsSecureBackupViewModel(_ viewModel: SettingsSecureBackupViewModelType, didUpdateViewState viewState: SettingsSecureBackupViewState) { self.viewState = viewState @@ -317,6 +347,10 @@ extension SettingsSecureBackupTableViewSection: SettingsSecureBackupViewModelVie self.delegate?.settingsSecureBackupTableViewSection(self, showError: error) } } + + func settingsSecureBackupViewModelShowSecureBackupReset(_ viewModel: SettingsSecureBackupViewModelType) { + self.delegate?.settingsSecureBackupTableViewSectionShowSecureBackupReset(self) + } func settingsSecureBackupViewModelShowKeyBackupCreate(_ viewModel: SettingsSecureBackupViewModelType) { self.delegate?.settingsSecureBackupTableViewSectionShowKeyBackupCreate(self) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift index 8187c7fd1..1d05cb393 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift @@ -18,6 +18,7 @@ import UIKit enum SettingsSecureBackupViewAction { case load + case resetSecureBackup case createKeyBackup case restoreFromKeyBackup(MXKeyBackupVersion) case confirmDeleteKeyBackup(MXKeyBackupVersion) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift index e4151663f..75af9fc9d 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift @@ -46,6 +46,8 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { case .load: viewDelegate.settingsSecureBackupViewModel(self, didUpdateViewState: .checkingBackup) self.checkKeyBackupState() + case .resetSecureBackup: + viewDelegate.settingsSecureBackupViewModelShowSecureBackupReset(self) case .createKeyBackup: viewDelegate.settingsSecureBackupViewModelShowKeyBackupCreate(self) case .restoreFromKeyBackup(let keyBackupVersion): diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModelType.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModelType.swift index cb3df7ae5..4f83b5ccc 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModelType.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModelType.swift @@ -19,6 +19,8 @@ import UIKit protocol SettingsSecureBackupViewModelViewDelegate: class { func settingsSecureBackupViewModel(_ viewModel: SettingsSecureBackupViewModelType, didUpdateViewState viewState: SettingsSecureBackupViewState) func settingsSecureBackupViewModel(_ viewModel: SettingsSecureBackupViewModelType, didUpdateNetworkRequestViewState networkRequestViewSate: SettingsSecureBackupNetworkRequestViewState) + + func settingsSecureBackupViewModelShowSecureBackupReset(_ viewModel: SettingsSecureBackupViewModelType) func settingsSecureBackupViewModelShowKeyBackupCreate(_ viewModel: SettingsSecureBackupViewModelType) func settingsSecureBackupViewModel(_ viewModel: SettingsSecureBackupViewModelType, showKeyBackupRecover keyBackupVersion: MXKeyBackupVersion) diff --git a/Riot/Modules/Settings/Security/SecurityViewController.m b/Riot/Modules/Settings/Security/SecurityViewController.m index d1271a6e2..6972678cb 100644 --- a/Riot/Modules/Settings/Security/SecurityViewController.m +++ b/Riot/Modules/Settings/Security/SecurityViewController.m @@ -1063,7 +1063,7 @@ TableViewSectionsDelegate> - (void)setupSecureBackup2 { - SecureBackupSetupCoordinatorBridgePresenter *secureBackupSetupCoordinatorBridgePresenter = [[SecureBackupSetupCoordinatorBridgePresenter alloc] initWithSession:self.mainSession]; + SecureBackupSetupCoordinatorBridgePresenter *secureBackupSetupCoordinatorBridgePresenter = [[SecureBackupSetupCoordinatorBridgePresenter alloc] initWithSession:self.mainSession allowOverwrite:YES]; secureBackupSetupCoordinatorBridgePresenter.delegate = self; [secureBackupSetupCoordinatorBridgePresenter presentFrom:self animated:YES]; @@ -1720,6 +1720,11 @@ TableViewSectionsDelegate> return cell; } +- (void)settingsSecureBackupTableViewSectionShowSecureBackupReset:(SettingsSecureBackupTableViewSection *)settingsSecureBackupTableViewSection +{ + [self setupSecureBackup]; +} + - (void)settingsSecureBackupTableViewSectionShowKeyBackupCreate:(SettingsSecureBackupTableViewSection *)settingsSecureBackupTableViewSection { [self showKeyBackupSetupFromSignOutFlow:NO]; diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index 7381bfb2a..a6dad221f 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -4023,7 +4023,7 @@ TableViewSectionsDelegate> - (void)setupSecureBackup2 { - SecureBackupSetupCoordinatorBridgePresenter *secureBackupSetupCoordinatorBridgePresenter = [[SecureBackupSetupCoordinatorBridgePresenter alloc] initWithSession:self.mainSession]; + SecureBackupSetupCoordinatorBridgePresenter *secureBackupSetupCoordinatorBridgePresenter = [[SecureBackupSetupCoordinatorBridgePresenter alloc] initWithSession:self.mainSession allowOverwrite:YES]; secureBackupSetupCoordinatorBridgePresenter.delegate = self; [secureBackupSetupCoordinatorBridgePresenter presentFrom:self animated:YES]; From e77ff0e8db815351e502d8e375a004cd7c345f97 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Wed, 16 Jun 2021 07:54:21 +0000 Subject: [PATCH 351/393] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/ --- Riot/Assets/pt_BR.lproj/Vector.strings | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index 864075b8d..32eaaea04 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -1331,3 +1331,25 @@ "room_no_privileges_to_create_group_call" = "Você precisa ser um/uma admin ou um/uma moderador(a) para começar uma chamada."; "room_join_group_call" = "Juntar-se"; "room_accessibility_video_call" = "Chamar por Vídeo"; +"space_beta_announce_information" = "Espaços são uma nova forma de agrupar salas e pessoas. Eles não estão em iOS ainda, mas você pode usá-los agora em Web e Desktop."; +"space_beta_announce_subtitle" = "A nova versão de comunidades"; +"space_beta_announce_title" = "Espaços estão vindo logo"; +"space_beta_announce_badge" = "BETA"; +"space_feature_unavailable_information" = "Espaços são uma nova forma de agrupar salas e pessoas.\n\nEles vão está aqui logo. Por enquanto, se você se juntar a um numa outra plataforma, você vai poder acessar quaisquer salas que você se juntar aqui."; +"space_feature_unavailable_subtitle" = "Espaços não estão em iOS ainda, mas você pode usá-los agora em Web e Desktop"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Espaços não estão aqui ainda"; +"event_formatter_group_call_incoming" = "%@ em %@"; +"event_formatter_group_call_leave" = "Sair"; +"event_formatter_group_call_join" = "Juntar-se"; +"event_formatter_group_call" = "Chamada de grupo"; +"event_formatter_call_end_call" = "Terminar chamada"; +"event_formatter_call_retry" = "Retentar"; +"event_formatter_call_answer" = "Atender"; +"event_formatter_call_decline" = "Declinar"; +"event_formatter_call_connection_failed" = "Conexão falhou"; +"event_formatter_call_you_missed" = "Você perdeu esta chamada"; +"event_formatter_call_ringing" = "Tocando…"; +"event_formatter_call_connecting" = "Conectando…"; From 6928d73449445af19f8f7a20f1797fe4158cfa3f Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 10:55:59 +0200 Subject: [PATCH 352/393] Security settings: Offer to reset the secure backup when there is no key backup --- .../SettingsSecureBackupTableViewSection.swift | 11 ++++++----- .../SettingsSecureBackupViewModel.swift | 8 ++++---- .../SettingsSecureBackupViewState.swift | 16 ++++++++-------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift index ab5e697a3..edf16ba97 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift @@ -134,7 +134,7 @@ private enum BackupRows { .info(text: text) ] - case .noBackup: + case .noKeyBackup: let noBackup = VectorL10n.settingsKeyBackupInfoNone let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning @@ -144,11 +144,12 @@ private enum BackupRows { backupRows = [ .info(text: VectorL10n.securitySettingsSecureBackupDescription), .info(text: backupInfoText), - .createKeyBackupAction + .createKeyBackupAction, + .resetSecureBackupAction ] - case .backup(let keyBackupVersion, let keyBackupVersionTrust), - .backupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _): + case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust), + .keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _): let info = VectorL10n.securitySettingsSecureBackupDescription let backupStatus = VectorL10n.securitySettingsSecureBackupInfoValid @@ -212,7 +213,7 @@ private enum BackupRows { // // backupRows = backupAndRunningViewStateRows - case .backupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust): + case .keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust): // TODO: What? let info = VectorL10n.securitySettingsSecureBackupDescription diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift index 75af9fc9d..1100641fc 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift @@ -90,19 +90,19 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { viewState = .checkingBackup case MXKeyBackupStateDisabled, MXKeyBackupStateEnabling: - viewState = .noBackup + viewState = .noKeyBackup case MXKeyBackupStateNotTrusted: guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else { return } - viewState = .backupNotTrusted(keyBackupVersion, keyBackupVersionTrust) + viewState = .keyBackupNotTrusted(keyBackupVersion, keyBackupVersionTrust) case MXKeyBackupStateReadyToBackUp: guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else { return } - viewState = .backup(keyBackupVersion, keyBackupVersionTrust) + viewState = .keyBackup(keyBackupVersion, keyBackupVersionTrust) case MXKeyBackupStateWillBackUp, MXKeyBackupStateBackingUp: guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else { @@ -115,7 +115,7 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { return } - sself.viewDelegate?.settingsSecureBackupViewModel(sself, didUpdateViewState: .backupAndRunning(keyBackupVersion, keyBackupVersionTrust, progress)) + sself.viewDelegate?.settingsSecureBackupViewModel(sself, didUpdateViewState: .keyBackupAndRunning(keyBackupVersion, keyBackupVersionTrust, progress)) } default: break diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift index f76a6ca71..8162faffc 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift @@ -20,16 +20,16 @@ import UIKit /// /// - checkingBackup: Load current backup on the homeserver /// - checkError: Fail to load current backup data -/// - noBackup: There is no backup on the homeserver -/// - backup: There is a valid backup on the homeserver. All keys have been backed up to it -/// - backupAndRunning: There is a valid backup on the homeserver. Keys are being sent to it -/// - backupButNotVerified: There is a backup on the homeserver but it has not been verified yet +/// - noKeyBackup: There is no backup on the homeserver +/// - keyBackup: There is a valid backup on the homeserver. All keys have been backed up to it +/// - keyBackupAndRunning: There is a valid backup on the homeserver. Keys are being sent to it +/// - keyBackupNotTrusted: There is a backup on the homeserver but it is not trusted enum SettingsSecureBackupViewState { case checkingBackup - case noBackup - case backup(MXKeyBackupVersion, MXKeyBackupVersionTrust) - case backupAndRunning(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress) - case backupNotTrusted(MXKeyBackupVersion, MXKeyBackupVersionTrust) + case noKeyBackup + case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust) + case keyBackupAndRunning(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress) + case keyBackupNotTrusted(MXKeyBackupVersion, MXKeyBackupVersionTrust) } /// State representing a network request made by the module From 6f568ab19ccf1d377bb1e97f755369968665cee1 Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Wed, 16 Jun 2021 11:22:29 +0200 Subject: [PATCH 353/393] RecentsViewController: Improve room management when select a room id or alias from directory. --- Riot/Modules/Common/Recents/RecentsViewController.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Riot/Modules/Common/Recents/RecentsViewController.m b/Riot/Modules/Common/Recents/RecentsViewController.m index fda66b562..6ac8c618b 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.m +++ b/Riot/Modules/Common/Recents/RecentsViewController.m @@ -2179,13 +2179,20 @@ if (room) { + // Room is known show it directly [coordinatorBridgePresenter dismissWithAnimated:YES completion:^{ [[AppDelegate theDelegate] showRoom:room.roomId andEventId:nil withMatrixSession:self.mainSession restoreInitialDisplay:NO]; }]; coordinatorBridgePresenter = nil; } + else if ([MXTools isMatrixRoomAlias:roomIdOrAlias]) + { + // Room preview doesn't support room alias + [[AppDelegate theDelegate] showAlertWithTitle:[NSBundle mxk_localizedStringForKey:@"error"] message:NSLocalizedStringFromTable(@"room_recents_unknown_room_error_message", @"Vector", nil)]; + } else { + // Try to preview the room from his id RoomPreviewData *roomPreviewData = [[RoomPreviewData alloc] initWithRoomId:roomIdOrAlias andSession:self.mainSession]; From aa84c59f15ef62216b3accd0fe7cf217e16603d8 Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 11:27:07 +0200 Subject: [PATCH 354/393] Security settings: Display section description at the bottom as before --- ...SettingsSecureBackupTableViewSection.swift | 122 ++++++------------ .../Security/SecurityViewController.m | 25 ++++ 2 files changed, 65 insertions(+), 82 deletions(-) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift index edf16ba97..0e0db707f 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift @@ -21,6 +21,7 @@ import UIKit func settingsSecureBackupTableViewSectionDidUpdate(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection) func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, textCellForRow: Int) -> MXKTableViewCellWithTextView + func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, descriptionCellForRow: Int) -> MXKTableViewCell func settingsSecureBackupTableViewSection(_ settingsSecureBackupTableViewSection: SettingsSecureBackupTableViewSection, buttonCellForRow: Int) -> MXKTableViewCellWithButton // Secure backup @@ -38,6 +39,7 @@ import UIKit private enum BackupRows { case info(text: String) + case description(text: String) case resetSecureBackupAction case createKeyBackupAction case restoreFromKeyBackupAction(keyBackupVersion: MXKeyBackupVersion, title: String) @@ -83,18 +85,14 @@ private enum BackupRows { } @objc func cellForRow(atRow row: Int) -> UITableViewCell { - guard let delegate = self.delegate else { - return UITableViewCell() - } - let backupRow = self.backupRows[row] var cell: UITableViewCell switch backupRow { - case .info(let infoText): - let infoCell: MXKTableViewCellWithTextView = delegate.settingsSecureBackupTableViewSection(self, textCellForRow: row) - infoCell.mxkTextView.text = infoText - cell = infoCell + case .info(let text): + cell = self.textCell(atRow: row, text: text) + case .description(let text): + cell = self.descriptionCell(atRow: row, text: text) case .resetSecureBackupAction: cell = self.buttonCellForResetSecureBackup(atRow: row) case .createKeyBackupAction: @@ -124,95 +122,33 @@ private enum BackupRows { switch self.viewState { case .checkingBackup: - - let info = VectorL10n.securitySettingsSecureBackupDescription - let checking = VectorL10n.securitySettingsSecureBackupInfoChecking - let strings = [info, "", checking] - let text = strings.joined(separator: "\n") - backupRows = [ - .info(text: text) + .info(text: VectorL10n.securitySettingsSecureBackupInfoChecking), + .description(text: VectorL10n.securitySettingsSecureBackupDescription) ] case .noKeyBackup: - let noBackup = VectorL10n.settingsKeyBackupInfoNone let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning - let strings = [noBackup, "", signoutWarning] - let backupInfoText = strings.joined(separator: "\n") + let infoText = [noBackup, signoutWarning].joined(separator: "\n") backupRows = [ - .info(text: VectorL10n.securitySettingsSecureBackupDescription), - .info(text: backupInfoText), + .info(text: infoText), .createKeyBackupAction, - .resetSecureBackupAction + .resetSecureBackupAction, + .description(text: VectorL10n.securitySettingsSecureBackupDescription) ] case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust), .keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _): - - let info = VectorL10n.securitySettingsSecureBackupDescription - let backupStatus = VectorL10n.securitySettingsSecureBackupInfoValid - let backupStrings = [info, "", backupStatus] - let backupInfoText = backupStrings.joined(separator: "\n") - -// let version = VectorL10n.settingsSecureBackupInfoVersion(keyBackupVersion.version ?? "") -// let algorithm = VectorL10n.settingsSecureBackupInfoAlgorithm(keyBackupVersion.algorithm) -// let uploadStatus = VectorL10n.settingsSecureBackupInfoProgressDone -// let additionalStrings = [version, algorithm, uploadStatus] -// let additionalInfoText = additionalStrings.joined(separator: "\n") -// -// let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust) -// let backupTrustInfoText = backupTrust.joined(separator: "\n") - - var backupViewStateRows: [BackupRows] = [ - .info(text: backupInfoText), -// .info(text: additionalInfoText), -// .info(text: backupTrustInfoText) + backupRows = [ + .info(text: VectorL10n.securitySettingsSecureBackupInfoValid), + .restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore), + .deleteKeyBackupAction(keyBackupVersion: keyBackupVersion), + .resetSecureBackupAction, + .description(text: VectorL10n.securitySettingsSecureBackupDescription) ] - // TODO: Do not display restore button if all keys are stored on the device - if true { - backupViewStateRows.append(.restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore)) - } - - backupViewStateRows.append(.deleteKeyBackupAction(keyBackupVersion: keyBackupVersion)) - backupViewStateRows.append(.resetSecureBackupAction) - - backupRows = backupViewStateRows - -// case .backupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, let backupProgress): -// -// let info = VectorL10n.securitySettingsSecureBackupDescription -// let backupStatus = VectorL10n.securitySettingsSecureBackupInfoValid -// let backupStrings = [info, "", backupStatus] -// let backupInfoText = backupStrings.joined(separator: "\n") -// -// let remaining = backupProgress.totalUnitCount - backupProgress.completedUnitCount -// let version = VectorL10n.settingsSecureBackupInfoVersion(keyBackupVersion.version ?? "") -// let algorithm = VectorL10n.settingsSecureBackupInfoAlgorithm(keyBackupVersion.algorithm) -// let uploadStatus = VectorL10n.settingsSecureBackupInfoProgress(String(remaining)) -// let additionalStrings = [version, algorithm, uploadStatus] -// let additionalInfoText = additionalStrings.joined(separator: "\n") -// -// let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust) -// let backupTrustInfoText = backupTrust.joined(separator: "\n") -// -// var backupAndRunningViewStateRows: [BackupRows] = [ -// .info(text: backupInfoText), -// .info(text: additionalInfoText), -// .info(text: backupTrustInfoText) -// ] -// -// // TODO: Do not display restore button if all keys are stored on the device -// if true { -// backupAndRunningViewStateRows.append(.restoreAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.settingsSecureBackupButtonRestore)) -// } -// -// backupAndRunningViewStateRows.append(.deleteAction(keyBackupVersion: keyBackupVersion)) -// -// backupRows = backupAndRunningViewStateRows - case .keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust): // TODO: What? @@ -254,6 +190,28 @@ private enum BackupRows { self.backupRows = backupRows } + // MARK: - Cells - + + private func textCell(atRow row: Int, text: String) -> UITableViewCell { + guard let delegate = self.delegate else { + return UITableViewCell() + } + + let cell = delegate.settingsSecureBackupTableViewSection(self, textCellForRow: row) + cell.mxkTextView.text = text + return cell + } + + private func descriptionCell(atRow row: Int, text: String) -> UITableViewCell { + guard let delegate = self.delegate else { + return UITableViewCell() + } + + let cell = delegate.settingsSecureBackupTableViewSection(self, descriptionCellForRow: row) + cell.textLabel?.text = text + return cell + } + // MARK: - Button cells private func buttonCellForResetSecureBackup(atRow row: Int) -> UITableViewCell { diff --git a/Riot/Modules/Settings/Security/SecurityViewController.m b/Riot/Modules/Settings/Security/SecurityViewController.m index 6972678cb..9f3ac8dc6 100644 --- a/Riot/Modules/Settings/Security/SecurityViewController.m +++ b/Riot/Modules/Settings/Security/SecurityViewController.m @@ -1231,6 +1231,17 @@ TableViewSectionsDelegate> return textViewCell; } +- (MXKTableViewCell*)descriptionCellForTableView:(UITableView*)tableView atIndexPath:(NSIndexPath *)indexPath +{ + MXKTableViewCell *cell = [self getDefaultTableViewCell:tableView]; + cell.textLabel.textColor = ThemeService.shared.theme.textPrimaryColor; + cell.textLabel.numberOfLines = 0; + cell.contentView.backgroundColor = ThemeService.shared.theme.headerBackgroundColor; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + + return cell; +} + - (MXKTableViewCellWithButton *)buttonCellForTableView:(UITableView*)tableView atIndexPath:(NSIndexPath *)indexPath { MXKTableViewCellWithButton *cell = [self.tableView dequeueReusableCellWithIdentifier:[MXKTableViewCellWithButton defaultReuseIdentifier] forIndexPath:indexPath]; @@ -1706,6 +1717,20 @@ TableViewSectionsDelegate> return cell; } +- (MXKTableViewCellWithTextView *)settingsSecureBackupTableViewSection:(SettingsSecureBackupTableViewSection *)settingsSecureBackupTableViewSection descriptionCellForRow:(NSInteger)textCellForRow +{ + MXKTableViewCellWithTextView *cell; + + NSIndexPath *indexPath = [self.tableViewSections exactIndexPathForRowTag:textCellForRow sectionTag:SECTION_SECURE_BACKUP]; + + if (indexPath) + { + cell = [self descriptionCellForTableView:self.tableView atIndexPath:indexPath]; + } + + return cell; +} + - (MXKTableViewCellWithButton *)settingsSecureBackupTableViewSection:(SettingsSecureBackupTableViewSection *)settingsSecureBackupTableViewSection buttonCellForRow:(NSInteger)buttonCellForRow { MXKTableViewCellWithButton *cell; From 4338d21a32bed6f629bf6e1e9c8ebfb8ba16462f Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev Date: Tue, 15 Jun 2021 08:37:23 +0000 Subject: [PATCH 355/393] Translated using Weblate (Bulgarian) Currently translated at 100.0% (35 of 35 strings) Translation: Element iOS/Element iOS (Push) Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-push/bg/ --- Riot/Assets/bg.lproj/Localizable.strings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Assets/bg.lproj/Localizable.strings b/Riot/Assets/bg.lproj/Localizable.strings index ec79b41a4..0b966c728 100644 --- a/Riot/Assets/bg.lproj/Localizable.strings +++ b/Riot/Assets/bg.lproj/Localizable.strings @@ -62,3 +62,9 @@ /* New message indicator on a room */ "MESSAGE_IN_X" = "Съобщение в %@"; "MESSAGE_PROTECTED" = "Ново съобщение"; + +/* Group call from user, CallKit caller name */ +"GROUP_CALL_FROM_USER" = "%@ (групов разговор)"; + +/* A user added a Jitsi call to a room */ +"GROUP_CALL_STARTED" = "Беше стартиран групов разговор"; From c1723f5109a9a097d20d90e00cedd73adf9145d9 Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 11:50:50 +0200 Subject: [PATCH 356/393] Security settings: Manage the case when there is no secure backup --- ...SettingsSecureBackupTableViewSection.swift | 37 ++++++++++++++++++- .../SettingsSecureBackupViewAction.swift | 1 + .../SettingsSecureBackupViewModel.swift | 13 ++++++- .../SettingsSecureBackupViewState.swift | 1 + 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift index 0e0db707f..de8381960 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift @@ -40,6 +40,7 @@ import UIKit private enum BackupRows { case info(text: String) case description(text: String) + case createSecureBackupAction case resetSecureBackupAction case createKeyBackupAction case restoreFromKeyBackupAction(keyBackupVersion: MXKeyBackupVersion, title: String) @@ -71,8 +72,8 @@ private enum BackupRows { // MARK: - Public - @objc init(withKeyBackup keyBackup: MXKeyBackup, userDevice: MXDeviceInfo) { - self.viewModel = SettingsSecureBackupViewModel(keyBackup: keyBackup) + @objc init(withRecoveryService recoveryService: MXRecoveryService, keyBackup: MXKeyBackup, userDevice: MXDeviceInfo) { + self.viewModel = SettingsSecureBackupViewModel(recoveryService: recoveryService, keyBackup: keyBackup) self.userDevice = userDevice super.init() self.viewModel.viewDelegate = self @@ -93,6 +94,8 @@ private enum BackupRows { cell = self.textCell(atRow: row, text: text) case .description(let text): cell = self.descriptionCell(atRow: row, text: text) + case .createSecureBackupAction: + cell = self.buttonCellForCreateSecureBackup(atRow: row) case .resetSecureBackupAction: cell = self.buttonCellForResetSecureBackup(atRow: row) case .createKeyBackupAction: @@ -127,6 +130,17 @@ private enum BackupRows { .description(text: VectorL10n.securitySettingsSecureBackupDescription) ] + case .noSecureBackup: + let noBackup = VectorL10n.settingsKeyBackupInfoNone + let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning + let infoText = [noBackup, signoutWarning].joined(separator: "\n") + + backupRows = [ + .info(text: infoText), + .createSecureBackupAction, + .description(text: VectorL10n.securitySettingsSecureBackupDescription) + ] + case .noKeyBackup: let noBackup = VectorL10n.settingsKeyBackupInfoNone let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning @@ -214,6 +228,25 @@ private enum BackupRows { // MARK: - Button cells + private func buttonCellForCreateSecureBackup(atRow row: Int) -> UITableViewCell { + + guard let delegate = self.delegate else { + return UITableViewCell() + } + + let cell: MXKTableViewCellWithButton = delegate.settingsSecureBackupTableViewSection(self, buttonCellForRow: row) + + let btnTitle = VectorL10n.securitySettingsSecureBackupSetup + cell.mxkButton.setTitle(btnTitle, for: .normal) + cell.mxkButton.setTitle(btnTitle, for: .highlighted) + + cell.mxkButton.vc_addAction { + self.viewModel.process(viewAction: .createSecureBackup) + } + + return cell + } + private func buttonCellForResetSecureBackup(atRow row: Int) -> UITableViewCell { guard let delegate = self.delegate else { diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift index 1d05cb393..2616d25cb 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewAction.swift @@ -18,6 +18,7 @@ import UIKit enum SettingsSecureBackupViewAction { case load + case createSecureBackup case resetSecureBackup case createKeyBackup case restoreFromKeyBackup(MXKeyBackupVersion) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift index 1100641fc..594fd8e3c 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift @@ -22,9 +22,11 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { weak var viewDelegate: SettingsSecureBackupViewModelViewDelegate? // MARK: Private + private let recoveryService: MXRecoveryService private let keyBackup: MXKeyBackup - init(keyBackup: MXKeyBackup) { + init(recoveryService: MXRecoveryService, keyBackup: MXKeyBackup) { + self.recoveryService = recoveryService self.keyBackup = keyBackup self.registerKeyBackupVersionDidChangeStateNotification() } @@ -46,7 +48,8 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { case .load: viewDelegate.settingsSecureBackupViewModel(self, didUpdateViewState: .checkingBackup) self.checkKeyBackupState() - case .resetSecureBackup: + case .resetSecureBackup, + .createSecureBackup: // The implement supports both viewDelegate.settingsSecureBackupViewModelShowSecureBackupReset(self) case .createKeyBackup: viewDelegate.settingsSecureBackupViewModelShowKeyBackupCreate(self) @@ -81,6 +84,12 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { } private func computeState(withBackupVersionTrust keyBackupVersionTrust: MXKeyBackupVersionTrust? = nil) { + + // We want to have a secure backup before having a key backup + if recoveryService.hasRecovery() == false { + self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: .noSecureBackup) + return + } var viewState: SettingsSecureBackupViewState? switch self.keyBackup.state { diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift index 8162faffc..e8b164338 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift @@ -26,6 +26,7 @@ import UIKit /// - keyBackupNotTrusted: There is a backup on the homeserver but it is not trusted enum SettingsSecureBackupViewState { case checkingBackup + case noSecureBackup case noKeyBackup case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust) case keyBackupAndRunning(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress) From 4788b1342a43b0e9a9a966f6a4d9ca7c054fc027 Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 11:59:41 +0200 Subject: [PATCH 357/393] Security settings: Use the same wording as element web for the secure backup description --- Riot/Assets/en.lproj/Vector.strings | 2 +- Riot/Generated/Strings.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index e650a7bb5..8d2018e46 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -621,7 +621,7 @@ Tap the + to start adding people."; "security_settings_crypto_sessions_description_2" = "If you don’t recognise a login, change your password and reset Secure Backup."; "security_settings_secure_backup" = "SECURE BACKUP"; -"security_settings_secure_backup_description" = "Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server."; +"security_settings_secure_backup_description" = "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key."; "security_settings_secure_backup_info_checking" = "Checking…"; "security_settings_secure_backup_info_valid" = "This session is backing up your keys."; "security_settings_secure_backup_setup" = "Set up"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 0b65ad6a0..eae4760e0 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -3870,7 +3870,7 @@ internal enum VectorL10n { internal static var securitySettingsSecureBackupDelete: String { return VectorL10n.tr("Vector", "security_settings_secure_backup_delete") } - /// Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server. + /// Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key. internal static var securitySettingsSecureBackupDescription: String { return VectorL10n.tr("Vector", "security_settings_secure_backup_description") } From 3ad0e9920d71346eb996c1c3ec12ac8880ce0737 Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 12:25:01 +0200 Subject: [PATCH 358/393] Security settings: Manage the case where the is a key backup but no secure backup --- ...SettingsSecureBackupTableViewSection.swift | 8 +++++++ .../SettingsSecureBackupViewModel.swift | 24 ++++++++++++------- .../SettingsSecureBackupViewState.swift | 1 + 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift index de8381960..3ae1694cb 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift @@ -141,6 +141,14 @@ private enum BackupRows { .description(text: VectorL10n.securitySettingsSecureBackupDescription) ] + case .noSecureBackupButKeyBackup(let keyBackupVersion, let keyBackupVersionTrust): + backupRows = [ + .info(text: VectorL10n.securitySettingsSecureBackupInfoValid), + .restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore), + .deleteKeyBackupAction(keyBackupVersion: keyBackupVersion), + .description(text: VectorL10n.securitySettingsSecureBackupDescription) + ] + case .noKeyBackup: let noBackup = VectorL10n.settingsKeyBackupInfoNone let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift index 594fd8e3c..48040ef1e 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift @@ -85,12 +85,6 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { private func computeState(withBackupVersionTrust keyBackupVersionTrust: MXKeyBackupVersionTrust? = nil) { - // We want to have a secure backup before having a key backup - if recoveryService.hasRecovery() == false { - self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: .noSecureBackup) - return - } - var viewState: SettingsSecureBackupViewState? switch self.keyBackup.state { @@ -129,9 +123,23 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { default: break } + + // We want to have a secure backup before having a key backup + if recoveryService.hasRecovery() == false { + switch viewState { + case .checkingBackup: + break + case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust), + .keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _), + .keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust): + viewState = .noSecureBackupButKeyBackup(keyBackupVersion, keyBackupVersionTrust) + default: + viewState = .noSecureBackup + } + } - if let vviewState = viewState { - self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: vviewState) + if let viewState = viewState { + self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: viewState) } } diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift index e8b164338..4c4138981 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift @@ -27,6 +27,7 @@ import UIKit enum SettingsSecureBackupViewState { case checkingBackup case noSecureBackup + case noSecureBackupButKeyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust) case noKeyBackup case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust) case keyBackupAndRunning(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress) From afc53913f390bbc25447c8ff66b5e72cbfd3cd8c Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 13:38:23 +0200 Subject: [PATCH 359/393] Security settings: Improve the state of the secure backup section to be exhaustive --- ...SettingsSecureBackupTableViewSection.swift | 128 +++++++----------- .../SettingsSecureBackupViewModel.swift | 35 ++--- .../SettingsSecureBackupViewState.swift | 36 +++-- 3 files changed, 85 insertions(+), 114 deletions(-) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift index 3ae1694cb..48a0c3940 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift @@ -60,7 +60,7 @@ private enum BackupRows { private var viewModel: SettingsSecureBackupViewModelType! // Need to know the state to make `cellForRow` deliver cells accordingly - private var viewState: SettingsSecureBackupViewState = .checkingBackup { + private var viewState: SettingsSecureBackupViewState = .loading { didSet { self.updateBackupRows() } @@ -124,91 +124,59 @@ private enum BackupRows { let backupRows: [BackupRows] switch self.viewState { - case .checkingBackup: + case .loading: backupRows = [ .info(text: VectorL10n.securitySettingsSecureBackupInfoChecking), .description(text: VectorL10n.securitySettingsSecureBackupDescription) ] - case .noSecureBackup: - let noBackup = VectorL10n.settingsKeyBackupInfoNone - let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning - let infoText = [noBackup, signoutWarning].joined(separator: "\n") - - backupRows = [ - .info(text: infoText), - .createSecureBackupAction, - .description(text: VectorL10n.securitySettingsSecureBackupDescription) - ] - - case .noSecureBackupButKeyBackup(let keyBackupVersion, let keyBackupVersionTrust): - backupRows = [ - .info(text: VectorL10n.securitySettingsSecureBackupInfoValid), - .restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore), - .deleteKeyBackupAction(keyBackupVersion: keyBackupVersion), - .description(text: VectorL10n.securitySettingsSecureBackupDescription) - ] - - case .noKeyBackup: - let noBackup = VectorL10n.settingsKeyBackupInfoNone - let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning - let infoText = [noBackup, signoutWarning].joined(separator: "\n") - - backupRows = [ - .info(text: infoText), - .createKeyBackupAction, - .resetSecureBackupAction, - .description(text: VectorL10n.securitySettingsSecureBackupDescription) - ] - - case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust), - .keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _): - backupRows = [ - .info(text: VectorL10n.securitySettingsSecureBackupInfoValid), - .restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore), - .deleteKeyBackupAction(keyBackupVersion: keyBackupVersion), - .resetSecureBackupAction, - .description(text: VectorL10n.securitySettingsSecureBackupDescription) - ] - - case .keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust): - - // TODO: What? - let info = VectorL10n.securitySettingsSecureBackupDescription - backupRows = [ - .info(text: info) - ] - -// let info = VectorL10n.securitySettingsSecureBackupDescription -// let backupStatus = VectorL10n.settingsSecureBackupInfoNotValid -// let signoutWarning = VectorL10n.settingsSecureBackupInfoSignoutWarning -// let backupStrings = [info, "", backupStatus, "", signoutWarning] -// let backupInfoText = backupStrings.joined(separator: "\n") -// -// let version = VectorL10n.settingsSecureBackupInfoVersion(keyBackupVersion.version ?? "") -// let algorithm = VectorL10n.settingsSecureBackupInfoAlgorithm(keyBackupVersion.algorithm) -// let additionalStrings = [version, algorithm] -// let additionalInfoText = additionalStrings.joined(separator: "\n") -// -// let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust) -// let backupTrustInfoText = backupTrust.joined(separator: "\n") -// -// var backupNotTrustedViewStateRows: [BackupRows] = [ -// .info(text: backupInfoText), -// .info(text: additionalInfoText), -// .info(text: backupTrustInfoText) -// ] -// -// // TODO: Do not display restore button if all keys are stored on the device -// if true { -// backupNotTrustedViewStateRows.append(.restoreAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.settingsSecureBackupButtonConnect)) -// } -// -// backupNotTrustedViewStateRows.append(.deleteAction(keyBackupVersion: keyBackupVersion)) -// -// backupRows = backupNotTrustedViewStateRows + case .noSecureBackup(let keyBackupState): + switch keyBackupState { + case .noKeyBackup: + let noBackup = VectorL10n.settingsKeyBackupInfoNone + let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning + let infoText = [noBackup, signoutWarning].joined(separator: "\n") + + backupRows = [ + .info(text: infoText), + .createSecureBackupAction, + .description(text: VectorL10n.securitySettingsSecureBackupDescription) + ] + case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust), + .keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _), + .keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust): + backupRows = [ + .info(text: VectorL10n.securitySettingsSecureBackupInfoValid), + .restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore), + .deleteKeyBackupAction(keyBackupVersion: keyBackupVersion), + .description(text: VectorL10n.securitySettingsSecureBackupDescription) + ] + } + case .secureBackup(let keyBackupState): + switch keyBackupState { + case .noKeyBackup: + let noBackup = VectorL10n.settingsKeyBackupInfoNone + let signoutWarning = VectorL10n.settingsKeyBackupInfoSignoutWarning + let infoText = [noBackup, signoutWarning].joined(separator: "\n") + + backupRows = [ + .info(text: infoText), + .createKeyBackupAction, + .resetSecureBackupAction, + .description(text: VectorL10n.securitySettingsSecureBackupDescription) + ] + case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust), + .keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _), + .keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust): + backupRows = [ + .info(text: VectorL10n.securitySettingsSecureBackupInfoValid), + .restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore), + .deleteKeyBackupAction(keyBackupVersion: keyBackupVersion), + .resetSecureBackupAction, + .description(text: VectorL10n.securitySettingsSecureBackupDescription) + ] + } } - self.backupRows = backupRows } diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift index 48040ef1e..6f8fe3727 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift @@ -46,7 +46,7 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { switch viewAction { case .load: - viewDelegate.settingsSecureBackupViewModel(self, didUpdateViewState: .checkingBackup) + viewDelegate.settingsSecureBackupViewModel(self, didUpdateViewState: .loading) self.checkKeyBackupState() case .resetSecureBackup, .createSecureBackup: // The implement supports both @@ -86,26 +86,27 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { private func computeState(withBackupVersionTrust keyBackupVersionTrust: MXKeyBackupVersionTrust? = nil) { var viewState: SettingsSecureBackupViewState? + var keyBackupState: SettingsSecureBackupViewState.KeyBackupState? switch self.keyBackup.state { case MXKeyBackupStateUnknown, MXKeyBackupStateCheckingBackUpOnHomeserver: - viewState = .checkingBackup + viewState = .loading case MXKeyBackupStateDisabled, MXKeyBackupStateEnabling: - viewState = .noKeyBackup + keyBackupState = .noKeyBackup case MXKeyBackupStateNotTrusted: guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else { return } - viewState = .keyBackupNotTrusted(keyBackupVersion, keyBackupVersionTrust) + keyBackupState = .keyBackupNotTrusted(keyBackupVersion, keyBackupVersionTrust) case MXKeyBackupStateReadyToBackUp: guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else { return } - viewState = .keyBackup(keyBackupVersion, keyBackupVersionTrust) + keyBackupState = .keyBackup(keyBackupVersion, keyBackupVersionTrust) case MXKeyBackupStateWillBackUp, MXKeyBackupStateBackingUp: guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else { @@ -114,28 +115,22 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { // Get the backup progress before updating the state self.keyBackup.backupProgress { [weak self] (progress) in - guard let sself = self else { + guard let self = self else { return } - - sself.viewDelegate?.settingsSecureBackupViewModel(sself, didUpdateViewState: .keyBackupAndRunning(keyBackupVersion, keyBackupVersionTrust, progress)) + + let keyBackupState: SettingsSecureBackupViewState.KeyBackupState = .keyBackupAndRunning(keyBackupVersion, keyBackupVersionTrust, progress) + let viewState: SettingsSecureBackupViewState = self.recoveryService.hasRecovery() ? .secureBackup(keyBackupState) : .noSecureBackup(keyBackupState) + + self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: viewState) } default: break } - // We want to have a secure backup before having a key backup - if recoveryService.hasRecovery() == false { - switch viewState { - case .checkingBackup: - break - case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust), - .keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _), - .keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust): - viewState = .noSecureBackupButKeyBackup(keyBackupVersion, keyBackupVersionTrust) - default: - viewState = .noSecureBackup - } + // Turn secure backup and key back states into view state + if viewState == nil, let keyBackupState = keyBackupState { + viewState = recoveryService.hasRecovery() ? .secureBackup(keyBackupState) : .noSecureBackup(keyBackupState) } if let viewState = viewState { diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift index 4c4138981..872aaae81 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift @@ -16,22 +16,30 @@ import UIKit -/// SettingsSecureBackup view state +/// State of the Secure Backup section in securtiy settings. /// -/// - checkingBackup: Load current backup on the homeserver -/// - checkError: Fail to load current backup data -/// - noKeyBackup: There is no backup on the homeserver -/// - keyBackup: There is a valid backup on the homeserver. All keys have been backed up to it -/// - keyBackupAndRunning: There is a valid backup on the homeserver. Keys are being sent to it -/// - keyBackupNotTrusted: There is a backup on the homeserver but it is not trusted +/// It is a mixed of the state of the Secure Backup(4S) and the state of the Key Backup. +/// +/// - loading: Load current state +/// - noSecureBackup: The account has no secure backup +/// - secureBackup: The account has a secure backup enum SettingsSecureBackupViewState { - case checkingBackup - case noSecureBackup - case noSecureBackupButKeyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust) - case noKeyBackup - case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust) - case keyBackupAndRunning(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress) - case keyBackupNotTrusted(MXKeyBackupVersion, MXKeyBackupVersionTrust) + case loading + case noSecureBackup(KeyBackupState) + case secureBackup(KeyBackupState) + + /// Internal key backup state. It is independent from the secure backup state. + /// + /// - noKeyBackup: There is no backup on the homeserver + /// - keyBackup: There is a valid backup on the homeserver. All keys have been backed up to it + /// - keyBackupAndRunning: There is a valid backup on the homeserver. Keys are being sent to it + /// - keyBackupNotTrusted: There is a backup on the homeserver but it is not trusted + enum KeyBackupState { + case noKeyBackup + case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust) + case keyBackupAndRunning(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress) + case keyBackupNotTrusted(MXKeyBackupVersion, MXKeyBackupVersionTrust) + } } /// State representing a network request made by the module From 0499c635325e34d26061290a75d0a344437f2438 Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 13:52:27 +0200 Subject: [PATCH 360/393] Security settings: Reduce the number of secure backup section states --- .../SettingsSecureBackupTableViewSection.swift | 10 ++++------ .../SettingsSecureBackupViewModel.swift | 13 +++---------- .../SettingsSecureBackupViewState.swift | 6 ++---- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift index 48a0c3940..6e6139af6 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift @@ -142,9 +142,8 @@ private enum BackupRows { .createSecureBackupAction, .description(text: VectorL10n.securitySettingsSecureBackupDescription) ] - case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust), - .keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _), - .keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust): + case .keyBackup(let keyBackupVersion, _, _), + .keyBackupNotTrusted(let keyBackupVersion, _): // Manage the key backup in the same way for the moment backupRows = [ .info(text: VectorL10n.securitySettingsSecureBackupInfoValid), .restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore), @@ -165,9 +164,8 @@ private enum BackupRows { .resetSecureBackupAction, .description(text: VectorL10n.securitySettingsSecureBackupDescription) ] - case .keyBackup(let keyBackupVersion, let keyBackupVersionTrust), - .keyBackupAndRunning(let keyBackupVersion, let keyBackupVersionTrust, _), - .keyBackupNotTrusted(let keyBackupVersion, let keyBackupVersionTrust): + case .keyBackup(let keyBackupVersion, _, _), + .keyBackupNotTrusted(let keyBackupVersion, _): // Manage the key backup in the same way for the moment backupRows = [ .info(text: VectorL10n.securitySettingsSecureBackupInfoValid), .restoreFromKeyBackupAction(keyBackupVersion: keyBackupVersion, title: VectorL10n.securitySettingsSecureBackupRestore), diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift index 6f8fe3727..66b720861 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewModel.swift @@ -102,13 +102,7 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { } keyBackupState = .keyBackupNotTrusted(keyBackupVersion, keyBackupVersionTrust) - case MXKeyBackupStateReadyToBackUp: - guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else { - return - } - keyBackupState = .keyBackup(keyBackupVersion, keyBackupVersionTrust) - - case MXKeyBackupStateWillBackUp, MXKeyBackupStateBackingUp: + case MXKeyBackupStateReadyToBackUp, MXKeyBackupStateWillBackUp, MXKeyBackupStateBackingUp: guard let keyBackupVersion = self.keyBackup.keyBackupVersion, let keyBackupVersionTrust = keyBackupVersionTrust else { return } @@ -119,9 +113,8 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { return } - let keyBackupState: SettingsSecureBackupViewState.KeyBackupState = .keyBackupAndRunning(keyBackupVersion, keyBackupVersionTrust, progress) + let keyBackupState: SettingsSecureBackupViewState.KeyBackupState = .keyBackup(keyBackupVersion, keyBackupVersionTrust, progress) let viewState: SettingsSecureBackupViewState = self.recoveryService.hasRecovery() ? .secureBackup(keyBackupState) : .noSecureBackup(keyBackupState) - self.viewDelegate?.settingsSecureBackupViewModel(self, didUpdateViewState: viewState) } default: @@ -129,7 +122,7 @@ final class SettingsSecureBackupViewModel: SettingsSecureBackupViewModelType { } // Turn secure backup and key back states into view state - if viewState == nil, let keyBackupState = keyBackupState { + if let keyBackupState = keyBackupState { viewState = recoveryService.hasRecovery() ? .secureBackup(keyBackupState) : .noSecureBackup(keyBackupState) } diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift index 872aaae81..1390f56ba 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupViewState.swift @@ -31,13 +31,11 @@ enum SettingsSecureBackupViewState { /// Internal key backup state. It is independent from the secure backup state. /// /// - noKeyBackup: There is no backup on the homeserver - /// - keyBackup: There is a valid backup on the homeserver. All keys have been backed up to it - /// - keyBackupAndRunning: There is a valid backup on the homeserver. Keys are being sent to it + /// - keyBackup: There is a valid running backup on the homeserver. Keys are being sent to it /// - keyBackupNotTrusted: There is a backup on the homeserver but it is not trusted enum KeyBackupState { case noKeyBackup - case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust) - case keyBackupAndRunning(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress) + case keyBackup(MXKeyBackupVersion, MXKeyBackupVersionTrust, Progress) case keyBackupNotTrusted(MXKeyBackupVersion, MXKeyBackupVersionTrust) } } From e29e76c316068df59cda0e3d110b6807ea9bcbe3 Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 14:40:29 +0200 Subject: [PATCH 361/393] Forgot to push this change. Thanks CI. --- Riot/Modules/Settings/Security/SecurityViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Modules/Settings/Security/SecurityViewController.m b/Riot/Modules/Settings/Security/SecurityViewController.m index 9f3ac8dc6..69fcd5725 100644 --- a/Riot/Modules/Settings/Security/SecurityViewController.m +++ b/Riot/Modules/Settings/Security/SecurityViewController.m @@ -193,7 +193,7 @@ TableViewSectionsDelegate> if (deviceInfo) { - secureBackupSection = [[SettingsSecureBackupTableViewSection alloc] initWithKeyBackup:self.mainSession.crypto.backup userDevice:deviceInfo]; + secureBackupSection = [[SettingsSecureBackupTableViewSection alloc] initWithRecoveryService:self.mainSession.crypto.recoveryService keyBackup:self.mainSession.crypto.backup userDevice:deviceInfo]; secureBackupSection.delegate = self; #ifdef CROSS_SIGNING_AND_BACKUP_DEV From 58596ba7d13a79e2ea309edb4ab236bac5bf290a Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 15:05:30 +0200 Subject: [PATCH 362/393] Fix build without compilation flag --- .../Security/SecurityViewController.m | 58 +++++++++---------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/Riot/Modules/Settings/Security/SecurityViewController.m b/Riot/Modules/Settings/Security/SecurityViewController.m index 69fcd5725..b30026c23 100644 --- a/Riot/Modules/Settings/Security/SecurityViewController.m +++ b/Riot/Modules/Settings/Security/SecurityViewController.m @@ -126,10 +126,10 @@ TableViewSectionsDelegate> UIViewController *pushedViewController; SettingsSecureBackupTableViewSection *secureBackupSection; - + KeyBackupSetupCoordinatorBridgePresenter *keyBackupSetupCoordinatorBridgePresenter; + #ifdef CROSS_SIGNING_AND_BACKUP_DEV SettingsKeyBackupTableViewSection *keyBackupSection; - KeyBackupSetupCoordinatorBridgePresenter *keyBackupSetupCoordinatorBridgePresenter; #endif KeyBackupRecoverCoordinatorBridgePresenter *keyBackupRecoverCoordinatorBridgePresenter; @@ -264,11 +264,8 @@ TableViewSectionsDelegate> kThemeServiceDidChangeThemeNotificationObserver = nil; } -#ifdef CROSS_SIGNING_AND_BACKUP_DEV keyBackupSetupCoordinatorBridgePresenter = nil; -#endif keyBackupRecoverCoordinatorBridgePresenter = nil; - } - (void)viewWillAppear:(BOOL)animated @@ -1795,7 +1792,7 @@ TableViewSectionsDelegate> MXStrongifyAndReturnIfNil(self); self->currentAlert = nil; - [self->keyBackupSection deleteWithKeyBackupVersion:keyBackupVersion]; + [self->secureBackupSection deleteKeyBackupWithKeyBackupVersion:keyBackupVersion]; }]]; [currentAlert mxk_setAccessibilityIdentifier: @"SettingsVCDeleteKeyBackup"]; @@ -1819,6 +1816,30 @@ TableViewSectionsDelegate> [[AppDelegate theDelegate] showErrorAsAlert:error]; } +#pragma mark - KeyBackupRecoverCoordinatorBridgePresenter + +- (void)showKeyBackupSetupFromSignOutFlow:(BOOL)showFromSignOutFlow +{ + keyBackupSetupCoordinatorBridgePresenter = [[KeyBackupSetupCoordinatorBridgePresenter alloc] initWithSession:self.mainSession]; + + [keyBackupSetupCoordinatorBridgePresenter presentFrom:self + isStartedFromSignOut:showFromSignOutFlow + animated:true]; + + keyBackupSetupCoordinatorBridgePresenter.delegate = self; +} + +- (void)keyBackupSetupCoordinatorBridgePresenterDelegateDidCancel:(KeyBackupSetupCoordinatorBridgePresenter *)bridgePresenter { + [keyBackupSetupCoordinatorBridgePresenter dismissWithAnimated:true]; + keyBackupSetupCoordinatorBridgePresenter = nil; +} + +- (void)keyBackupSetupCoordinatorBridgePresenterDelegateDidSetupRecoveryKey:(KeyBackupSetupCoordinatorBridgePresenter *)bridgePresenter { + [keyBackupSetupCoordinatorBridgePresenter dismissWithAnimated:true]; + keyBackupSetupCoordinatorBridgePresenter = nil; + + [secureBackupSection reload]; +} #pragma mark - SettingsKeyBackupTableViewSectionDelegate #ifdef CROSS_SIGNING_AND_BACKUP_DEV @@ -1924,31 +1945,6 @@ TableViewSectionsDelegate> [[AppDelegate theDelegate] showErrorAsAlert:error]; } -#pragma mark - KeyBackupRecoverCoordinatorBridgePresenter - -- (void)showKeyBackupSetupFromSignOutFlow:(BOOL)showFromSignOutFlow -{ - keyBackupSetupCoordinatorBridgePresenter = [[KeyBackupSetupCoordinatorBridgePresenter alloc] initWithSession:self.mainSession]; - - [keyBackupSetupCoordinatorBridgePresenter presentFrom:self - isStartedFromSignOut:showFromSignOutFlow - animated:true]; - - keyBackupSetupCoordinatorBridgePresenter.delegate = self; -} - -- (void)keyBackupSetupCoordinatorBridgePresenterDelegateDidCancel:(KeyBackupSetupCoordinatorBridgePresenter *)bridgePresenter { - [keyBackupSetupCoordinatorBridgePresenter dismissWithAnimated:true]; - keyBackupSetupCoordinatorBridgePresenter = nil; -} - -- (void)keyBackupSetupCoordinatorBridgePresenterDelegateDidSetupRecoveryKey:(KeyBackupSetupCoordinatorBridgePresenter *)bridgePresenter { - [keyBackupSetupCoordinatorBridgePresenter dismissWithAnimated:true]; - keyBackupSetupCoordinatorBridgePresenter = nil; - - [keyBackupSection reload]; -} - #endif #pragma mark - KeyBackupRecoverCoordinatorBridgePresenter From 6226b25abca77894ca32d237f16b6c39daa9be9d Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 15:31:39 +0200 Subject: [PATCH 363/393] Valide the 4S private key before using it --- ...cretsRecoveryWithPassphraseViewModel.swift | 30 ++++++++++++------- .../Security/SecurityViewController.m | 4 +-- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift b/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift index b5e37b082..71e51e270 100644 --- a/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift +++ b/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift @@ -111,17 +111,27 @@ final class SecretsRecoveryWithPassphraseViewModel: SecretsRecoveryWithPassphras }) } - private func execute(block: (_ privateKey: Data, _ completion: @escaping (Result) -> Void) -> Void, privateKey: Data) { - // Run the extenal code while the view state is .loading - block(privateKey) { result in - MXLog.debug("[SecretsRecoveryWithPassphraseViewModel] execute: Block returned: \(result)") - - switch result { - case .success: - self.update(viewState: .loaded) - self.coordinatorDelegate?.secretsRecoveryWithPassphraseViewModelDidRecover(self) - case .failure(let error): + private func execute(block: @escaping (_ privateKey: Data, _ completion: @escaping (Result) -> Void) -> Void, privateKey: Data) { + // Check the private key is valid before using it + self.recoveryService.checkPrivateKey(privateKey) { match in + guard match else { + // Reuse already managed error + let error = NSError(domain: MXRecoveryServiceErrorDomain, code: Int(MXRecoveryServiceErrorCode.badRecoveryKeyErrorCode.rawValue), userInfo: nil) self.update(viewState: .error(error)) + return + } + + // Run the extenal code while the view state is .loading + block(privateKey) { result in + MXLog.debug("[SecretsRecoveryWithPassphraseViewModel] execute: Block returned: \(result)") + + switch result { + case .success: + self.update(viewState: .loaded) + self.coordinatorDelegate?.secretsRecoveryWithPassphraseViewModelDidRecover(self) + case .failure(let error): + self.update(viewState: .error(error)) + } } } } diff --git a/Riot/Modules/Settings/Security/SecurityViewController.m b/Riot/Modules/Settings/Security/SecurityViewController.m index b30026c23..afb4686ad 100644 --- a/Riot/Modules/Settings/Security/SecurityViewController.m +++ b/Riot/Modules/Settings/Security/SecurityViewController.m @@ -126,13 +126,13 @@ TableViewSectionsDelegate> UIViewController *pushedViewController; SettingsSecureBackupTableViewSection *secureBackupSection; - KeyBackupSetupCoordinatorBridgePresenter *keyBackupSetupCoordinatorBridgePresenter; #ifdef CROSS_SIGNING_AND_BACKUP_DEV SettingsKeyBackupTableViewSection *keyBackupSection; #endif + + KeyBackupSetupCoordinatorBridgePresenter *keyBackupSetupCoordinatorBridgePresenter; KeyBackupRecoverCoordinatorBridgePresenter *keyBackupRecoverCoordinatorBridgePresenter; - SecretsRecoveryCoordinatorBridgePresenter *secretsRecoveryCoordinatorBridgePresenter; } From 08f54bdebeedab6a135c831af788c403aa943a14 Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 15:40:09 +0200 Subject: [PATCH 364/393] Wording: Replace Recovery Passphrase and Recovery Key by Security Phrase and Security Key #4268 --- CHANGES.rst | 1 + Riot/Assets/en.lproj/Vector.strings | 92 ++++++++++++++--------------- Riot/Generated/Strings.swift | 90 ++++++++++++++-------------- 3 files changed, 92 insertions(+), 91 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index c94df8549..08c02f258 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -11,6 +11,7 @@ Changes to be released in next version * VoIP: Add dial pad for PSTN capable servers to menu on homescreen. * VoIP: Replace call bar with PiP tiles for every type of calls. * Security settings: Display the cross-signing section (#4430). + * Wording: Replace Recovery Passphrase and Recovery Key by Security Phrase and Security Key (#4268). 🐛 Bugfix * StartChatViewController: Add more helpful message when trying to start DM with a user that does not exist (#224). diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 8d2018e46..a52e2ff9f 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -621,7 +621,7 @@ Tap the + to start adding people."; "security_settings_crypto_sessions_description_2" = "If you don’t recognise a login, change your password and reset Secure Backup."; "security_settings_secure_backup" = "SECURE BACKUP"; -"security_settings_secure_backup_description" = "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key."; +"security_settings_secure_backup_description" = "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Security Key."; "security_settings_secure_backup_info_checking" = "Checking…"; "security_settings_secure_backup_info_valid" = "This session is backing up your keys."; "security_settings_secure_backup_setup" = "Set up"; @@ -901,7 +901,7 @@ Tap the + to start adding people."; // Key backup wrong version "e2e_key_backup_wrong_version_title" = "New Key Backup"; -"e2e_key_backup_wrong_version" = "A new secure message key backup has been detected.\n\nIf this wasn’t you, set a new passphrase in Settings."; +"e2e_key_backup_wrong_version" = "A new secure message key backup has been detected.\n\nIf this wasn’t you, set a new Security Phrase in Settings."; "e2e_key_backup_wrong_version_button_settings" = "Settings"; "e2e_key_backup_wrong_version_button_wasme" = "It was me"; @@ -1027,7 +1027,7 @@ Tap the + to start adding people."; "secure_key_backup_setup_intro_use_security_key_title" = "Use a Security Key"; "secure_key_backup_setup_intro_use_security_key_info" = "Generate a security key to store somewhere safe like a password manager or a safe."; -"secure_key_backup_setup_intro_use_security_passphrase_title" = "Use a Security Passphrase"; +"secure_key_backup_setup_intro_use_security_passphrase_title" = "Use a Security Phrase"; "secure_key_backup_setup_intro_use_security_passphrase_info" = "Enter a secret phrase only you know, and generate a key for backup."; "secure_key_backup_setup_existing_backup_error_title" = "A backup for messages already exists"; @@ -1066,32 +1066,32 @@ Tap the + to start adding people."; // Passphrase -"key_backup_setup_passphrase_title" = "Secure your backup with a Passphrase"; -"key_backup_setup_passphrase_info" = "We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.\n\nFor maximum security, this should be different from your account password."; +"key_backup_setup_passphrase_title" = "Secure your backup with a Security Phrase"; +"key_backup_setup_passphrase_info" = "We'll store an encrypted copy of your keys on our server. Protect your backup with a phrase to keep it secure.\n\nFor maximum security, this should be different from your account password."; "key_backup_setup_passphrase_passphrase_title" = "Enter"; -"key_backup_setup_passphrase_passphrase_placeholder" = "Enter passphrase"; +"key_backup_setup_passphrase_passphrase_placeholder" = "Enter phrase"; "key_backup_setup_passphrase_passphrase_valid" = "Great!"; "key_backup_setup_passphrase_passphrase_invalid" = "Try adding a word"; "key_backup_setup_passphrase_confirm_passphrase_title" = "Confirm"; -"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Confirm passphrase"; +"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Confirm phrase"; "key_backup_setup_passphrase_confirm_passphrase_valid" = "Great!"; -"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Passphrase doesn’t match"; -"key_backup_setup_passphrase_set_passphrase_action" = "Set Passphrase"; -"key_backup_setup_passphrase_setup_recovery_key_info" = "Or, secure your backup with a Recovery Key, saving it somewhere safe."; -"key_backup_setup_passphrase_setup_recovery_key_action" = "(Advanced) Set up with Recovery Key"; +"key_backup_setup_passphrase_confirm_passphrase_invalid" = "phrase doesn’t match"; +"key_backup_setup_passphrase_set_passphrase_action" = "Set Phrase"; +"key_backup_setup_passphrase_setup_recovery_key_info" = "Or, secure your backup with a Security Key, saving it somewhere safe."; +"key_backup_setup_passphrase_setup_recovery_key_action" = "(Advanced) Set up with Security Key"; // Success "key_backup_setup_success_title" = "Success!"; // Success from passphrase -"key_backup_setup_success_from_passphrase_info" = "Your keys are being backed up.\n\nYour recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.\n\nKeep your recovery key somewhere very secure, like a password manager (or a safe)."; -"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Save Recovery Key"; +"key_backup_setup_success_from_passphrase_info" = "Your keys are being backed up.\n\nYour Security Key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.\n\nKeep your Security Key somewhere very secure, like a password manager (or a safe)."; +"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Save Security Key"; "key_backup_setup_success_from_passphrase_done_action" = "Done"; // Success from recovery key -"key_backup_setup_success_from_recovery_key_info" = "Your keys are being backed up.\n\nMake a copy of this recovery key and keep it safe."; -"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Recovery Key"; +"key_backup_setup_success_from_recovery_key_info" = "Your keys are being backed up.\n\nMake a copy of this Security Key and keep it safe."; +"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Security Key"; "key_backup_setup_success_from_recovery_key_make_copy_action" = "Make a Copy"; "key_backup_setup_success_from_recovery_key_made_copy_action" = "I've made a copy"; @@ -1102,33 +1102,33 @@ Tap the + to start adding people."; "key_backup_recover_title" = "Secure Messages"; -"key_backup_recover_invalid_passphrase_title" = "Incorrect Recovery Passphrase"; -"key_backup_recover_invalid_passphrase" = "Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase."; -"key_backup_recover_invalid_recovery_key_title" = "Recovery Key Mismatch"; -"key_backup_recover_invalid_recovery_key" = "Backup could not be decrypted with this key: please verify that you entered the correct recovery key."; +"key_backup_recover_invalid_passphrase_title" = "Incorrect Security Phrase"; +"key_backup_recover_invalid_passphrase" = "Backup could not be decrypted with this phrase: please verify that you entered the correct Security Phrase."; +"key_backup_recover_invalid_recovery_key_title" = "Security Key Mismatch"; +"key_backup_recover_invalid_recovery_key" = "Backup could not be decrypted with this key: please verify that you entered the correct Security Key."; // Recover from private key "key_backup_recover_from_private_key_info" = "Restoring backup…"; // Recover from passphrase -"key_backup_recover_from_passphrase_info" = "Use your recovery passphrase to unlock your secure message history"; +"key_backup_recover_from_passphrase_info" = "Use your Security Phrase to unlock your secure message history"; "key_backup_recover_from_passphrase_passphrase_title" = "Enter"; -"key_backup_recover_from_passphrase_passphrase_placeholder" = "Enter Passphrase"; +"key_backup_recover_from_passphrase_passphrase_placeholder" = "Enter Phrase"; "key_backup_recover_from_passphrase_recover_action" = "Unlock History"; -"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Don’t know your recovery passphrase? You can "; -"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "use your recovery key"; +"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Don’t know your Security Phrase? You can "; +"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "use your Security Key"; "key_backup_recover_from_passphrase_lost_passphrase_action_part3" = "."; // Recover from recovery key -"key_backup_recover_from_recovery_key_info" = "Use your recovery key to unlock your secure message history"; +"key_backup_recover_from_recovery_key_info" = "Use your Security Key to unlock your secure message history"; "key_backup_recover_from_recovery_key_recovery_key_title" = "Enter"; -"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Enter Recovery Key"; +"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Enter Security Key"; "key_backup_recover_from_recovery_key_recover_action" = "Unlock History"; -"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Lost your recovery key? You can set up a new one in settings."; +"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Lost your Security Key You can set up a new one in settings."; // Success @@ -1205,8 +1205,8 @@ Tap the + to start adding people."; "device_verification_self_verify_wait_new_sign_in_title" = "Verify this login"; "device_verification_self_verify_wait_information" = "Verify this session from one of your other sessions, granting it access to encrypted messages.\n\nUse the latest Element on your other devices:"; "device_verification_self_verify_wait_additional_information" = "This works with Element and other cross-signing capable Matrix clients."; -"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Use Recovery Key"; -"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Use Recovery Passphrase or Key"; +"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Use Security Key"; +"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Use Security Phrase or Key"; "device_verification_self_verify_wait_recover_secrets_additional_information" = "If you can't access an existing session"; "device_verification_self_verify_wait_recover_secrets_checking_availability" = "Checking for other verification capabilities ..."; @@ -1440,40 +1440,40 @@ Tap the + to start adding people."; // Recover with passphrase -"secrets_recovery_with_passphrase_title" = "Recovery Passphrase"; -"secrets_recovery_with_passphrase_information_default" = "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase."; -"secrets_recovery_with_passphrase_information_verify_device" = "Use your Recovery Passphrase to verify this device."; +"secrets_recovery_with_passphrase_title" = "Security Phrase"; +"secrets_recovery_with_passphrase_information_default" = "Access your secure message history and your cross-signing identity for verifying other sessions by entering your Security Phrase."; +"secrets_recovery_with_passphrase_information_verify_device" = "Use your Security Phrase to verify this device."; "secrets_recovery_with_passphrase_passphrase_title" = "Enter"; -"secrets_recovery_with_passphrase_passphrase_placeholder" = "Enter Recovery Passphrase"; -"secrets_recovery_with_passphrase_recover_action" = "Use Passphrase"; +"secrets_recovery_with_passphrase_passphrase_placeholder" = "Enter Security Phrase"; +"secrets_recovery_with_passphrase_recover_action" = "Use Phrase"; -"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Don’t know your recovery passphrase? You can "; -"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "use your recovery key"; +"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Don’t know your Security Phrase? You can "; +"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "use your Security Key"; "secrets_recovery_with_passphrase_lost_passphrase_action_part3" = "."; "secrets_recovery_with_passphrase_invalid_passphrase_title" = "Unable to access secret storage"; -"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Please verify that you entered the correct recovery passphrase."; +"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Please verify that you entered the correct Security Phrase."; // Recover with key -"secrets_recovery_with_key_title" = "Recovery Key"; -"secrets_recovery_with_key_information_default" = "Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key."; -"secrets_recovery_with_key_information_verify_device" = "Use your Recovery Key to verify this device."; -"secrets_recovery_with_key_information_unlock_secure_backup_with_phrase" = "Enter your Recovery Passphrase to continue."; -"secrets_recovery_with_key_information_unlock_secure_backup_with_key" = "Enter your Recovery Key to continue."; +"secrets_recovery_with_key_title" = "Security Key"; +"secrets_recovery_with_key_information_default" = "Access your secure message history and your cross-signing identity for verifying other sessions by entering your Security Key."; +"secrets_recovery_with_key_information_verify_device" = "Use your Security Key to verify this device."; +"secrets_recovery_with_key_information_unlock_secure_backup_with_phrase" = "Enter your Security Phrase to continue."; +"secrets_recovery_with_key_information_unlock_secure_backup_with_key" = "Enter your Security Key to continue."; "secrets_recovery_with_key_recovery_key_title" = "Enter"; -"secrets_recovery_with_key_recovery_key_placeholder" = "Enter Recovery Key"; +"secrets_recovery_with_key_recovery_key_placeholder" = "Enter Security Key"; "secrets_recovery_with_key_recover_action" = "Use Key"; "secrets_recovery_with_key_invalid_recovery_key_title" = "Unable to access secret storage"; -"secrets_recovery_with_key_invalid_recovery_key_message" = "Please verify that you entered the correct recovery key."; +"secrets_recovery_with_key_invalid_recovery_key_message" = "Please verify that you entered the correct Security Key."; // MARK: - Secrets set up // Recovery Key "secrets_setup_recovery_key_title" = "Save your Security Key"; -"secrets_setup_recovery_key_information" = "Store your Recovery Key somewhere safe. It can be used to unlock your encrypted messages & data."; +"secrets_setup_recovery_key_information" = "Store your Security Key somewhere safe. It can be used to unlock your encrypted messages & data."; "secrets_setup_recovery_key_loading" = "Loading…"; "secrets_setup_recovery_key_export_action" = "Save"; "secrets_setup_recovery_key_done_action" = "Done"; @@ -1490,10 +1490,10 @@ Tap the + to start adding people."; "secrets_setup_recovery_passphrase_confirm_information" = "Enter your Security Phrase again to confirm it."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Confirm"; -"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Confirm passphrase"; +"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Confirm phrase"; "key_backup_setup_passphrase_confirm_passphrase_valid" = "Great!"; -"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Passphrase doesn’t match"; +"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Phrase doesn’t match"; "secrets_setup_recovery_passphrase_summary_title" = "Save your Security Phrase"; "secrets_setup_recovery_passphrase_summary_information" = "Remember your Security Phrase. It can be used to unlock your encrypted messages & data."; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index eae4760e0..6731c2f1d 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -1034,11 +1034,11 @@ internal enum VectorL10n { internal static var deviceVerificationSelfVerifyWaitRecoverSecretsCheckingAvailability: String { return VectorL10n.tr("Vector", "device_verification_self_verify_wait_recover_secrets_checking_availability") } - /// Use Recovery Passphrase or Key + /// Use Security Phrase or Key internal static var deviceVerificationSelfVerifyWaitRecoverSecretsWithPassphrase: String { return VectorL10n.tr("Vector", "device_verification_self_verify_wait_recover_secrets_with_passphrase") } - /// Use Recovery Key + /// Use Security Key internal static var deviceVerificationSelfVerifyWaitRecoverSecretsWithoutPassphrase: String { return VectorL10n.tr("Vector", "device_verification_self_verify_wait_recover_secrets_without_passphrase") } @@ -1142,7 +1142,7 @@ internal enum VectorL10n { internal static var e2eEnablingOnAppUpdate: String { return VectorL10n.tr("Vector", "e2e_enabling_on_app_update") } - /// A new secure message key backup has been detected.\n\nIf this wasn’t you, set a new passphrase in Settings. + /// A new secure message key backup has been detected.\n\nIf this wasn’t you, set a new Security Phrase in Settings. internal static var e2eKeyBackupWrongVersion: String { return VectorL10n.tr("Vector", "e2e_key_backup_wrong_version") } @@ -1614,15 +1614,15 @@ internal enum VectorL10n { internal static var keyBackupRecoverDoneAction: String { return VectorL10n.tr("Vector", "key_backup_recover_done_action") } - /// Use your recovery passphrase to unlock your secure message history + /// Use your Security Phrase to unlock your secure message history internal static var keyBackupRecoverFromPassphraseInfo: String { return VectorL10n.tr("Vector", "key_backup_recover_from_passphrase_info") } - /// Don’t know your recovery passphrase? You can + /// Don’t know your Security Phrase? You can internal static var keyBackupRecoverFromPassphraseLostPassphraseActionPart1: String { return VectorL10n.tr("Vector", "key_backup_recover_from_passphrase_lost_passphrase_action_part1") } - /// use your recovery key + /// use your Security Key internal static var keyBackupRecoverFromPassphraseLostPassphraseActionPart2: String { return VectorL10n.tr("Vector", "key_backup_recover_from_passphrase_lost_passphrase_action_part2") } @@ -1630,7 +1630,7 @@ internal enum VectorL10n { internal static var keyBackupRecoverFromPassphraseLostPassphraseActionPart3: String { return VectorL10n.tr("Vector", "key_backup_recover_from_passphrase_lost_passphrase_action_part3") } - /// Enter Passphrase + /// Enter Phrase internal static var keyBackupRecoverFromPassphrasePassphrasePlaceholder: String { return VectorL10n.tr("Vector", "key_backup_recover_from_passphrase_passphrase_placeholder") } @@ -1646,11 +1646,11 @@ internal enum VectorL10n { internal static var keyBackupRecoverFromPrivateKeyInfo: String { return VectorL10n.tr("Vector", "key_backup_recover_from_private_key_info") } - /// Use your recovery key to unlock your secure message history + /// Use your Security Key to unlock your secure message history internal static var keyBackupRecoverFromRecoveryKeyInfo: String { return VectorL10n.tr("Vector", "key_backup_recover_from_recovery_key_info") } - /// Lost your recovery key? You can set up a new one in settings. + /// Lost your Security Key You can set up a new one in settings. internal static var keyBackupRecoverFromRecoveryKeyLostRecoveryKeyAction: String { return VectorL10n.tr("Vector", "key_backup_recover_from_recovery_key_lost_recovery_key_action") } @@ -1658,7 +1658,7 @@ internal enum VectorL10n { internal static var keyBackupRecoverFromRecoveryKeyRecoverAction: String { return VectorL10n.tr("Vector", "key_backup_recover_from_recovery_key_recover_action") } - /// Enter Recovery Key + /// Enter Security Key internal static var keyBackupRecoverFromRecoveryKeyRecoveryKeyPlaceholder: String { return VectorL10n.tr("Vector", "key_backup_recover_from_recovery_key_recovery_key_placeholder") } @@ -1666,19 +1666,19 @@ internal enum VectorL10n { internal static var keyBackupRecoverFromRecoveryKeyRecoveryKeyTitle: String { return VectorL10n.tr("Vector", "key_backup_recover_from_recovery_key_recovery_key_title") } - /// Backup could not be decrypted with this passphrase: please verify that you entered the correct recovery passphrase. + /// Backup could not be decrypted with this phrase: please verify that you entered the correct Security Phrase. internal static var keyBackupRecoverInvalidPassphrase: String { return VectorL10n.tr("Vector", "key_backup_recover_invalid_passphrase") } - /// Incorrect Recovery Passphrase + /// Incorrect Security Phrase internal static var keyBackupRecoverInvalidPassphraseTitle: String { return VectorL10n.tr("Vector", "key_backup_recover_invalid_passphrase_title") } - /// Backup could not be decrypted with this key: please verify that you entered the correct recovery key. + /// Backup could not be decrypted with this key: please verify that you entered the correct Security Key. internal static var keyBackupRecoverInvalidRecoveryKey: String { return VectorL10n.tr("Vector", "key_backup_recover_invalid_recovery_key") } - /// Recovery Key Mismatch + /// Security Key Mismatch internal static var keyBackupRecoverInvalidRecoveryKeyTitle: String { return VectorL10n.tr("Vector", "key_backup_recover_invalid_recovery_key_title") } @@ -1714,11 +1714,11 @@ internal enum VectorL10n { internal static var keyBackupSetupIntroTitle: String { return VectorL10n.tr("Vector", "key_backup_setup_intro_title") } - /// Passphrase doesn’t match + /// Phrase doesn’t match internal static var keyBackupSetupPassphraseConfirmPassphraseInvalid: String { return VectorL10n.tr("Vector", "key_backup_setup_passphrase_confirm_passphrase_invalid") } - /// Confirm passphrase + /// Confirm phrase internal static var keyBackupSetupPassphraseConfirmPassphrasePlaceholder: String { return VectorL10n.tr("Vector", "key_backup_setup_passphrase_confirm_passphrase_placeholder") } @@ -1730,7 +1730,7 @@ internal enum VectorL10n { internal static var keyBackupSetupPassphraseConfirmPassphraseValid: String { return VectorL10n.tr("Vector", "key_backup_setup_passphrase_confirm_passphrase_valid") } - /// We'll store an encrypted copy of your keys on our server. Protect your backup with a passphrase to keep it secure.\n\nFor maximum security, this should be different from your account password. + /// We'll store an encrypted copy of your keys on our server. Protect your backup with a phrase to keep it secure.\n\nFor maximum security, this should be different from your account password. internal static var keyBackupSetupPassphraseInfo: String { return VectorL10n.tr("Vector", "key_backup_setup_passphrase_info") } @@ -1738,7 +1738,7 @@ internal enum VectorL10n { internal static var keyBackupSetupPassphrasePassphraseInvalid: String { return VectorL10n.tr("Vector", "key_backup_setup_passphrase_passphrase_invalid") } - /// Enter passphrase + /// Enter phrase internal static var keyBackupSetupPassphrasePassphrasePlaceholder: String { return VectorL10n.tr("Vector", "key_backup_setup_passphrase_passphrase_placeholder") } @@ -1750,19 +1750,19 @@ internal enum VectorL10n { internal static var keyBackupSetupPassphrasePassphraseValid: String { return VectorL10n.tr("Vector", "key_backup_setup_passphrase_passphrase_valid") } - /// Set Passphrase + /// Set Phrase internal static var keyBackupSetupPassphraseSetPassphraseAction: String { return VectorL10n.tr("Vector", "key_backup_setup_passphrase_set_passphrase_action") } - /// (Advanced) Set up with Recovery Key + /// (Advanced) Set up with Security Key internal static var keyBackupSetupPassphraseSetupRecoveryKeyAction: String { return VectorL10n.tr("Vector", "key_backup_setup_passphrase_setup_recovery_key_action") } - /// Or, secure your backup with a Recovery Key, saving it somewhere safe. + /// Or, secure your backup with a Security Key, saving it somewhere safe. internal static var keyBackupSetupPassphraseSetupRecoveryKeyInfo: String { return VectorL10n.tr("Vector", "key_backup_setup_passphrase_setup_recovery_key_info") } - /// Secure your backup with a Passphrase + /// Secure your backup with a Security Phrase internal static var keyBackupSetupPassphraseTitle: String { return VectorL10n.tr("Vector", "key_backup_setup_passphrase_title") } @@ -1782,15 +1782,15 @@ internal enum VectorL10n { internal static var keyBackupSetupSuccessFromPassphraseDoneAction: String { return VectorL10n.tr("Vector", "key_backup_setup_success_from_passphrase_done_action") } - /// Your keys are being backed up.\n\nYour recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.\n\nKeep your recovery key somewhere very secure, like a password manager (or a safe). + /// Your keys are being backed up.\n\nYour Security Key is a safety net - you can use it to restore access to your encrypted messages if you forget your passphrase.\n\nKeep your Security Key somewhere very secure, like a password manager (or a safe). internal static var keyBackupSetupSuccessFromPassphraseInfo: String { return VectorL10n.tr("Vector", "key_backup_setup_success_from_passphrase_info") } - /// Save Recovery Key + /// Save Security Key internal static var keyBackupSetupSuccessFromPassphraseSaveRecoveryKeyAction: String { return VectorL10n.tr("Vector", "key_backup_setup_success_from_passphrase_save_recovery_key_action") } - /// Your keys are being backed up.\n\nMake a copy of this recovery key and keep it safe. + /// Your keys are being backed up.\n\nMake a copy of this Security Key and keep it safe. internal static var keyBackupSetupSuccessFromRecoveryKeyInfo: String { return VectorL10n.tr("Vector", "key_backup_setup_success_from_recovery_key_info") } @@ -1802,7 +1802,7 @@ internal enum VectorL10n { internal static var keyBackupSetupSuccessFromRecoveryKeyMakeCopyAction: String { return VectorL10n.tr("Vector", "key_backup_setup_success_from_recovery_key_make_copy_action") } - /// Recovery Key + /// Security Key internal static var keyBackupSetupSuccessFromRecoveryKeyRecoveryKeyTitle: String { return VectorL10n.tr("Vector", "key_backup_setup_success_from_recovery_key_recovery_key_title") } @@ -3554,23 +3554,23 @@ internal enum VectorL10n { internal static var secretsRecoveryResetActionPart2: String { return VectorL10n.tr("Vector", "secrets_recovery_reset_action_part_2") } - /// Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery key. + /// Access your secure message history and your cross-signing identity for verifying other sessions by entering your Security Key. internal static var secretsRecoveryWithKeyInformationDefault: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_information_default") } - /// Enter your Recovery Key to continue. + /// Enter your Security Key to continue. internal static var secretsRecoveryWithKeyInformationUnlockSecureBackupWithKey: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_information_unlock_secure_backup_with_key") } - /// Enter your Recovery Passphrase to continue. + /// Enter your Security Phrase to continue. internal static var secretsRecoveryWithKeyInformationUnlockSecureBackupWithPhrase: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_information_unlock_secure_backup_with_phrase") } - /// Use your Recovery Key to verify this device. + /// Use your Security Key to verify this device. internal static var secretsRecoveryWithKeyInformationVerifyDevice: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_information_verify_device") } - /// Please verify that you entered the correct recovery key. + /// Please verify that you entered the correct Security Key. internal static var secretsRecoveryWithKeyInvalidRecoveryKeyMessage: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_invalid_recovery_key_message") } @@ -3582,7 +3582,7 @@ internal enum VectorL10n { internal static var secretsRecoveryWithKeyRecoverAction: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_recover_action") } - /// Enter Recovery Key + /// Enter Security Key internal static var secretsRecoveryWithKeyRecoveryKeyPlaceholder: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_recovery_key_placeholder") } @@ -3590,19 +3590,19 @@ internal enum VectorL10n { internal static var secretsRecoveryWithKeyRecoveryKeyTitle: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_recovery_key_title") } - /// Recovery Key + /// Security Key internal static var secretsRecoveryWithKeyTitle: String { return VectorL10n.tr("Vector", "secrets_recovery_with_key_title") } - /// Access your secure message history and your cross-signing identity for verifying other sessions by entering your recovery passphrase. + /// Access your secure message history and your cross-signing identity for verifying other sessions by entering your Security Phrase. internal static var secretsRecoveryWithPassphraseInformationDefault: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_information_default") } - /// Use your Recovery Passphrase to verify this device. + /// Use your Security Phrase to verify this device. internal static var secretsRecoveryWithPassphraseInformationVerifyDevice: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_information_verify_device") } - /// Please verify that you entered the correct recovery passphrase. + /// Please verify that you entered the correct Security Phrase. internal static var secretsRecoveryWithPassphraseInvalidPassphraseMessage: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_invalid_passphrase_message") } @@ -3610,11 +3610,11 @@ internal enum VectorL10n { internal static var secretsRecoveryWithPassphraseInvalidPassphraseTitle: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_invalid_passphrase_title") } - /// Don’t know your recovery passphrase? You can + /// Don’t know your Security Phrase? You can internal static var secretsRecoveryWithPassphraseLostPassphraseActionPart1: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_lost_passphrase_action_part1") } - /// use your recovery key + /// use your Security Key internal static var secretsRecoveryWithPassphraseLostPassphraseActionPart2: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_lost_passphrase_action_part2") } @@ -3622,7 +3622,7 @@ internal enum VectorL10n { internal static var secretsRecoveryWithPassphraseLostPassphraseActionPart3: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_lost_passphrase_action_part3") } - /// Enter Recovery Passphrase + /// Enter Security Phrase internal static var secretsRecoveryWithPassphrasePassphrasePlaceholder: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_passphrase_placeholder") } @@ -3630,11 +3630,11 @@ internal enum VectorL10n { internal static var secretsRecoveryWithPassphrasePassphraseTitle: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_passphrase_title") } - /// Use Passphrase + /// Use Phrase internal static var secretsRecoveryWithPassphraseRecoverAction: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_recover_action") } - /// Recovery Passphrase + /// Security Phrase internal static var secretsRecoveryWithPassphraseTitle: String { return VectorL10n.tr("Vector", "secrets_recovery_with_passphrase_title") } @@ -3670,7 +3670,7 @@ internal enum VectorL10n { internal static var secretsSetupRecoveryKeyExportAction: String { return VectorL10n.tr("Vector", "secrets_setup_recovery_key_export_action") } - /// Store your Recovery Key somewhere safe. It can be used to unlock your encrypted messages & data. + /// Store your Security Key somewhere safe. It can be used to unlock your encrypted messages & data. internal static var secretsSetupRecoveryKeyInformation: String { return VectorL10n.tr("Vector", "secrets_setup_recovery_key_information") } @@ -3698,7 +3698,7 @@ internal enum VectorL10n { internal static var secretsSetupRecoveryPassphraseConfirmInformation: String { return VectorL10n.tr("Vector", "secrets_setup_recovery_passphrase_confirm_information") } - /// Confirm passphrase + /// Confirm phrase internal static var secretsSetupRecoveryPassphraseConfirmPassphrasePlaceholder: String { return VectorL10n.tr("Vector", "secrets_setup_recovery_passphrase_confirm_passphrase_placeholder") } @@ -3778,7 +3778,7 @@ internal enum VectorL10n { internal static var secureKeyBackupSetupIntroUseSecurityPassphraseInfo: String { return VectorL10n.tr("Vector", "secure_key_backup_setup_intro_use_security_passphrase_info") } - /// Use a Security Passphrase + /// Use a Security Phrase internal static var secureKeyBackupSetupIntroUseSecurityPassphraseTitle: String { return VectorL10n.tr("Vector", "secure_key_backup_setup_intro_use_security_passphrase_title") } @@ -3870,7 +3870,7 @@ internal enum VectorL10n { internal static var securitySettingsSecureBackupDelete: String { return VectorL10n.tr("Vector", "security_settings_secure_backup_delete") } - /// Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key. + /// Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Security Key. internal static var securitySettingsSecureBackupDescription: String { return VectorL10n.tr("Vector", "security_settings_secure_backup_description") } From 52d3eb98070681bc3c6cc1cd1896bf8127f8ea26 Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 15:43:07 +0200 Subject: [PATCH 365/393] CHANGES --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index 08c02f258..a8db9759f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -11,6 +11,7 @@ Changes to be released in next version * VoIP: Add dial pad for PSTN capable servers to menu on homescreen. * VoIP: Replace call bar with PiP tiles for every type of calls. * Security settings: Display the cross-signing section (#4430). + * Security settings: The Secure backup section has been updated to match element-web UX (#4430). * Wording: Replace Recovery Passphrase and Recovery Key by Security Phrase and Security Key (#4268). 🐛 Bugfix From bd6d60ba595fd70efe392eedecae6c51ce342e9b Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 16:11:32 +0200 Subject: [PATCH 366/393] Cleaning --- .../Setup/KeyBackupSetupCoordinator.swift | 1 - ...SettingsSecureBackupTableViewSection.swift | 4 + .../Security/SecurityViewController.m | 100 +----------------- 3 files changed, 5 insertions(+), 100 deletions(-) diff --git a/Riot/Modules/KeyBackup/Setup/KeyBackupSetupCoordinator.swift b/Riot/Modules/KeyBackup/Setup/KeyBackupSetupCoordinator.swift index b1b96be83..3fce9171d 100644 --- a/Riot/Modules/KeyBackup/Setup/KeyBackupSetupCoordinator.swift +++ b/Riot/Modules/KeyBackup/Setup/KeyBackupSetupCoordinator.swift @@ -124,7 +124,6 @@ final class KeyBackupSetupCoordinator: KeyBackupSetupCoordinatorType { } private func showSetupWithSecureBackupSuccess(animated: Bool) { - let viewController = KeyBackupSetupSuccessFromSecureBackupViewController.instantiate() viewController.delegate = self self.navigationRouter.push(viewController, animated: animated, popCompletion: nil) diff --git a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift index 6e6139af6..6ef387a20 100644 --- a/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift +++ b/Riot/Modules/Settings/Security/SecureBackup/SettingsSecureBackupTableViewSection.swift @@ -47,6 +47,10 @@ private enum BackupRows { case deleteKeyBackupAction(keyBackupVersion: MXKeyBackupVersion) } +/// SettingsSecureBackupTableViewSection provides UITableViewCells to manage secure backup and key backup. +/// +/// All states are described in SettingsSecureBackupViewState. +/// All actions in SettingsSecureBackupViewAction. @objc final class SettingsSecureBackupTableViewSection: NSObject { // MARK: - Properties diff --git a/Riot/Modules/Settings/Security/SecurityViewController.m b/Riot/Modules/Settings/Security/SecurityViewController.m index afb4686ad..ced10d252 100644 --- a/Riot/Modules/Settings/Security/SecurityViewController.m +++ b/Riot/Modules/Settings/Security/SecurityViewController.m @@ -51,23 +51,6 @@ enum { CROSSSIGNING_SECOND_ACTION, // Reset }; -enum { - SECURE_BACKUP_DESCRIPTION, - // TODO: We can display the state of 4S both locally and on the server. Then, provide actions according to all combinations. - // - Does the 4S contains all the 4 keys server side? - // - Advice the user to do a recovery if there is less keys locally - // - Advice them to do a recovery if local keys are obsolete -> We cannot know now - // - Advice them to fix a secure backup if there is 4S but no key backup - // - Warm them if there is no 4S and they do not have all 3 signing keys locally. They will set up a not complete secure backup -#ifdef CROSS_SIGNING_AND_BACKUP_DEV - SECURE_BACKUP_INFO, -#endif - SECURE_BACKUP_SETUP, - SECURE_BACKUP_RESTORE, - SECURE_BACKUP_DELETE, - SECURE_BACKUP_MANAGE_MANUALLY, // TODO: What to do with that? -}; - enum { PIN_CODE_SETTING, PIN_CODE_DESCRIPTION, @@ -91,9 +74,9 @@ enum { @interface SecurityViewController () < SettingsSecureBackupTableViewSectionDelegate, +KeyBackupSetupCoordinatorBridgePresenterDelegate, #ifdef CROSS_SIGNING_AND_BACKUP_DEV SettingsKeyBackupTableViewSectionDelegate, -KeyBackupSetupCoordinatorBridgePresenterDelegate, KeyBackupRecoverCoordinatorBridgePresenterDelegate, #endif UIDocumentInteractionControllerDelegate, @@ -108,9 +91,6 @@ TableViewSectionsDelegate> // Devices NSMutableArray *devicesArray; - // SECURE_BACKUP_* rows to display - NSArray *secureBackupSectionState; - // Observe kThemeServiceDidChangeThemeNotification to handle user interface theme change. id kThemeServiceDidChangeThemeNotificationObserver; @@ -582,8 +562,6 @@ TableViewSectionsDelegate> - (void)reloadData { - [self refreshSecureBackupSectionData]; - // Update table view sections and trigger a tableView reloadData [self updateSections]; } @@ -874,56 +852,6 @@ TableViewSectionsDelegate> #pragma mark - SSSS -- (void)refreshSecureBackupSectionData -{ - MXRecoveryService *recoveryService = self.mainSession.crypto.recoveryService; - NSMutableArray *secureBackupSectionState = [NSMutableArray new]; - if (recoveryService.hasRecovery) - { - if (RiotSettings.shared.settingsSecurityScreenShowRestoreBackup) - { - [secureBackupSectionState addObject:@(SECURE_BACKUP_RESTORE)]; - } - if (RiotSettings.shared.settingsSecurityScreenShowDeleteBackup) - { - [secureBackupSectionState addObject:@(SECURE_BACKUP_DELETE)]; - } - } - else - { - if (RiotSettings.shared.settingsSecurityScreenShowSetupBackup) - { - [secureBackupSectionState addObject:@(SECURE_BACKUP_SETUP)]; - } - } - - if (secureBackupSectionState.count) - { - [secureBackupSectionState addObject:@(SECURE_BACKUP_DESCRIPTION)]; - } - -#ifdef CROSS_SIGNING_AND_BACKUP_DEV - [secureBackupSectionState addObject:@(SECURE_BACKUP_INFO)]; -#endif - - self->secureBackupSectionState = secureBackupSectionState; -} - -- (NSUInteger)secureBackupSectionEnumForRow:(NSUInteger)row -{ - if (row < secureBackupSectionState.count) - { - return secureBackupSectionState[row].unsignedIntegerValue; - } - - return SECURE_BACKUP_DESCRIPTION; -} - -- (NSUInteger)numberOfRowsInSecureBackupSection -{ - return secureBackupSectionState.count; -} - - (NSString*)secureBackupInformation { NSString *secureBackupInformation; @@ -1068,32 +996,6 @@ TableViewSectionsDelegate> self.secureBackupSetupCoordinatorBridgePresenter = secureBackupSetupCoordinatorBridgePresenter; } -- (void)restoreFromSecureBackup -{ - secretsRecoveryCoordinatorBridgePresenter = [[SecretsRecoveryCoordinatorBridgePresenter alloc] initWithSession:self.mainSession recoveryGoal:SecretsRecoveryGoalBridgeRestoreSecureBackup]; - - [secretsRecoveryCoordinatorBridgePresenter presentFrom:self animated:true]; - secretsRecoveryCoordinatorBridgePresenter.delegate = self; -} - -- (void)deleteSecureBackup -{ - MXRecoveryService *recoveryService = self.mainSession.crypto.recoveryService; - if (recoveryService) - { - [self startActivityIndicator]; - [recoveryService deleteRecoveryWithDeleteServicesBackups:YES success:^{ - [self stopActivityIndicator]; - [self reloadData]; - } failure:^(NSError * _Nonnull error) { - [self stopActivityIndicator]; - [self reloadData]; - - [[AppDelegate theDelegate] showErrorAsAlert:error]; - }]; - } -} - #pragma mark - Segues From 4ace45195c6ed36d381a13f8de4fd803486afd5b Mon Sep 17 00:00:00 2001 From: Fred Date: Wed, 16 Jun 2021 15:36:04 +0000 Subject: [PATCH 367/393] Translated using Weblate (German) Currently translated at 99.5% (1211 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 0f2f241ca..5ad0641f4 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -1324,7 +1324,7 @@ "callbar_active_and_single_paused" = "1 aktiver Anruf (%1$s) · 1 pausierter Anruf"; // Call Bar -"callbar_only_single_active" = "Laufender Anruf (%@)"; +"callbar_only_single_active" = "Zurück zum laufenden Anruf (%@)"; "room_event_action_delete_confirmation_message" = "Möchtest Du die nicht gesendete Nachricht wirklich löschen?"; "room_event_action_delete_confirmation_title" = "Nicht gesendete Nachricht löschen"; "room_details_integrations" = "Integrationen"; From f4fe2885c5138aff91c5fda715e409cc0ab56deb Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 16 Jun 2021 18:03:46 +0200 Subject: [PATCH 368/393] More cleaning --- Riot/Modules/Settings/Security/SecurityViewController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Riot/Modules/Settings/Security/SecurityViewController.m b/Riot/Modules/Settings/Security/SecurityViewController.m index ced10d252..b0191ae74 100644 --- a/Riot/Modules/Settings/Security/SecurityViewController.m +++ b/Riot/Modules/Settings/Security/SecurityViewController.m @@ -1616,9 +1616,9 @@ TableViewSectionsDelegate> return cell; } -- (MXKTableViewCellWithTextView *)settingsSecureBackupTableViewSection:(SettingsSecureBackupTableViewSection *)settingsSecureBackupTableViewSection descriptionCellForRow:(NSInteger)textCellForRow +- (MXKTableViewCell *)settingsSecureBackupTableViewSection:(SettingsSecureBackupTableViewSection *)settingsSecureBackupTableViewSection descriptionCellForRow:(NSInteger)textCellForRow { - MXKTableViewCellWithTextView *cell; + MXKTableViewCell *cell; NSIndexPath *indexPath = [self.tableViewSections exactIndexPathForRowTag:textCellForRow sectionTag:SECTION_SECURE_BACKUP]; From 364de0fadcbb0cf959ebdac2a4d67e8fe6ba0965 Mon Sep 17 00:00:00 2001 From: libexus Date: Wed, 16 Jun 2021 15:40:11 +0000 Subject: [PATCH 369/393] Translated using Weblate (German) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 5ad0641f4..cda0b5e43 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -147,7 +147,7 @@ "room_participants_action_start_video_call" = "Starte Video-Anruf"; "room_participants_action_mention" = "Erwähnen"; // Chat -"room_jump_to_first_unread" = "Zur ersten ungelesenen Nachricht springen"; +"room_jump_to_first_unread" = "Zur ersten ungelesenen Nachricht"; "room_new_message_notification" = "%d neue Nachricht"; "room_new_messages_notification" = "%d neue Nachrichten"; "room_one_user_is_typing" = "%@ tippt…"; @@ -892,7 +892,7 @@ "settings_add_3pid_password_title_msidsn" = "Telefonnummer hinzufügen"; "settings_add_3pid_password_message" = "Um fortzufahren, bitte Passwort eingeben"; "settings_add_3pid_invalid_password_message" = "Ungültige Anmeldedaten"; -"identity_server_settings_disconnect_info" = "Eine Trennung von deinem Identitätsserver würde bedeuten, dass du weder von anderen Nutzer gefunden werden, noch diese dich per E-Mail oder Telefonnummer einladen können."; +"identity_server_settings_disconnect_info" = "Eine Trennung vom Identitätsserver bedeutet, dass du weder von anderen Nutzer gefunden werden, noch diese dich per E-Mail oder Telefonnummer einladen können."; "error_not_supported_on_mobile" = "Dies ist in der Mobilvariante von %@ nicht möglich."; "settings_integrations" = "INTEGRATIONEN"; "settings_integrations_allow_button" = "Integrationen verwalten"; @@ -1058,7 +1058,7 @@ "key_verification_other_session_title" = "Sitzung verifizieren"; "key_verification_new_session_title" = "Neue Sitzung verifizieren"; "key_verification_this_session_title" = "Verifiziere diese Sitzung"; -"device_verification_security_advice_emoji" = "Vergleiche die einzigartigen Emojis und kontrolliere, dass sie in derselben Reihenfolge angezeigt werden."; +"device_verification_security_advice_emoji" = "Vergleiche die Emojis und kontrolliere, dass sie in derselben Reihenfolge angezeigt werden."; "device_verification_security_advice_number" = "Vergleiche die Zahlen und stell sicher, dass sie in derselben Reihenfolge angezeigt werden."; "key_verification_self_verify_current_session_alert_title" = "Verifiziere diese Sitzung"; "key_verification_self_verify_current_session_alert_message" = "Andere Benutzer vertrauen ihr vielleicht nicht."; @@ -1324,7 +1324,7 @@ "callbar_active_and_single_paused" = "1 aktiver Anruf (%1$s) · 1 pausierter Anruf"; // Call Bar -"callbar_only_single_active" = "Zurück zum laufenden Anruf (%@)"; +"callbar_only_single_active" = "Zurück zum Anruf (%@)"; "room_event_action_delete_confirmation_message" = "Möchtest Du die nicht gesendete Nachricht wirklich löschen?"; "room_event_action_delete_confirmation_title" = "Nicht gesendete Nachricht löschen"; "room_details_integrations" = "Integrationen"; From 0252bc09fdcc66928589eb3281312cd76c2f6359 Mon Sep 17 00:00:00 2001 From: Fred Date: Wed, 16 Jun 2021 15:36:57 +0000 Subject: [PATCH 370/393] Translated using Weblate (German) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index cda0b5e43..2bf608c0f 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -159,7 +159,7 @@ "room_offline_notification" = "Verbindung zum Server wurde unterbrochen."; "room_unsent_messages_notification" = "Nachrichten wurden nicht gesendet."; "room_unsent_messages_unknown_devices_notification" = "Nachrichten wurden nicht gesendet, da unbekannte Sitzungen vorhanden waren."; -"room_prompt_resend" = "alle erneut senden"; +"room_prompt_resend" = "Alle erneut senden"; "room_prompt_cancel" = "Alles abbrechen"; "room_resend_unsent_messages" = "Ungesendete Nachrichten erneut senden"; "room_delete_unsent_messages" = "Lösche ungesendete Nachrichten"; @@ -1360,5 +1360,5 @@ // Chat "room_slide_to_end_group_call" = "Wische, um den Anruf für alle zu beenden"; -"callbar_only_single_active_group" = "Klicke, um den Anruf beizutreten"; +"callbar_only_single_active_group" = "Klicke, um den Anruf beizutreten (%@)"; "event_formatter_call_answer" = "Annehmen"; From 17f00244a8f657faffb3ff4404fb552e6d32b5e5 Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev Date: Tue, 15 Jun 2021 10:33:17 +0000 Subject: [PATCH 371/393] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/ --- Riot/Assets/bg.lproj/Vector.strings | 128 +++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 4 deletions(-) diff --git a/Riot/Assets/bg.lproj/Vector.strings b/Riot/Assets/bg.lproj/Vector.strings index 186c3ef67..d9fa91f5a 100644 --- a/Riot/Assets/bg.lproj/Vector.strings +++ b/Riot/Assets/bg.lproj/Vector.strings @@ -198,7 +198,7 @@ "room_participants_action_start_video_call" = "Започни видео разговор"; "room_participants_action_mention" = "Спомени"; // Chat -"room_jump_to_first_unread" = "Виж първото непрочетено съобщение"; +"room_jump_to_first_unread" = "Към непрочетеното"; "room_new_message_notification" = "%d ново съобщение"; "room_new_messages_notification" = "%d нови съобщения"; "room_one_user_is_typing" = "%@ пише…"; @@ -672,7 +672,7 @@ "room_message_unable_open_link_error_message" = "Неуспешно отваряне на връзката."; "room_event_action_reply" = "Отговори"; "room_event_action_edit" = "Редактирай"; -"auth_login_single_sign_on" = "Влез със SSO"; +"auth_login_single_sign_on" = "Вход"; "room_event_action_reaction_agree" = "Съгласи се с %@"; "room_event_action_reaction_disagree" = "Противоречи на %@"; "room_event_action_reaction_like" = "Харесай %@"; @@ -860,7 +860,7 @@ "settings_add_3pid_password_title_email" = "Добави имейл адрес"; "settings_add_3pid_password_title_msidsn" = "Добави телефонен номер"; "settings_add_3pid_password_message" = "За да продължите, въведете паролата си"; -"settings_add_3pid_invalid_password_message" = "Невалидна парола"; +"settings_add_3pid_invalid_password_message" = "Невалидни данни за вход"; "settings_devices_description" = "Публичното име на сесията е видимо за хората, с които общувате"; "settings_discovery_no_identity_server" = "В момента не използвате сървър за самоличност. Добавете такъв, за да бъдете откриваеми от съществуващи познати контакти."; "settings_discovery_terms_not_signed" = "Съгласете се с условията за ползване на сървъра за самоличност (%@) за да бъдете откриваеми по имейл адрес или телефон."; @@ -1014,7 +1014,7 @@ "device_verification_self_verify_wait_title" = "Завършване на сигурността"; "device_verification_self_verify_wait_new_sign_in_title" = "Потвърждение на вход"; "device_verification_self_verify_wait_information" = "Потвърдете тази сесия от някоя от другите ви сесии, за че да й дадете достъп до шифрованите съобщения.\n\nИзползвайте най-новия Element на другите си устройства:"; -"device_verification_self_verify_wait_additional_information" = "или друг Matrix клиент поддържащ кръстосано-подписване"; +"device_verification_self_verify_wait_additional_information" = "Това работи в Element и в други Matrix клиенти поддържащи кръстосано-подписване."; "device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Използвай ключ за възстановяване"; "device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Използвай парола или ключ за възстановяване"; "device_verification_self_verify_wait_recover_secrets_additional_information" = "Ако не можете да достъпите съществуваща сесия"; @@ -1280,3 +1280,123 @@ "switch" = "Смяна"; "joined" = "Се присъедини"; "store_promotional_text" = "Пазещо-поверителността ви приложение за чат и съвместна работа, което е част от отворена мрежа. Децентрализирано, за да ви даде контрол. Без събиране на данни, без задни вратички и без достъп на трети страни."; +"space_beta_announce_information" = "Пространства са нов начин да групирате стаи и хора. Все още не работят на iOS, но можете да ги използвате през Уеб и Desktop."; +"space_beta_announce_subtitle" = "Новата версия на общности"; +"space_beta_announce_title" = "Пространства ще е налично скоро"; +"space_beta_announce_badge" = "БЕТА"; +"space_feature_unavailable_information" = "Пространства е нов начин за групиране на стаи и хора.\n\nСкоро ще са налични за ползване. Засега, ако се присъедините към Пространство от друга платформа, и тук ще можете да достъпите стаите, към които се присъедините."; +"space_feature_unavailable_subtitle" = "Функция Пространства не се поддържа на iOS все още, но можете да ги използвате в Уеб и Desktop версията"; + +// Mark: - Spaces + +"space_feature_unavailable_title" = "Все още не се поддържат Пространства"; +"room_intro_cell_information_multiple_dm_sentence2" = "Само вие сте в този разговор, освен ако някой от вас не покани друг да се присъедини."; +"room_intro_cell_information_dm_sentence2" = "Никой друг освен двама ви не може да се присъедини в този разговор."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence1_part1" = "Това е началото на директните ви съобщения с "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " за да кажете на хората за какво е тази стая."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Добави тема"; +"room_intro_cell_information_room_with_topic_sentence2" = "Тема: %@"; +"room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_sentence1_part1" = "Това е началото на "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Добави хора"; +"room_avatar_view_accessibility_hint" = "Промени аватара на стаята"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "аватар"; +"invite_friends_share_text" = "Хей, говори с мен в %@: %@"; + +// MARK: - Invite friends + +"invite_friends_action" = "Покани приятели в %@"; +"favourites_empty_view_information" = "Можете да добавяте в любими по няколко начина - най-бързият е чрез натискане и задържане. Докоснете звездата и стаята ще се появи тук автоматично."; + +// MARK: - Favourites + +"favourites_empty_view_title" = "Любими хора и стаи"; +"home_empty_view_information" = "Комплексно приложение за защитен чат за екипи, приятели и организации. Докоснете бутон + по-долу за да добавите хора и стаи."; + +// MARK: - Home + +"home_empty_view_title" = "Добре дошли в %@,\n%@"; +"call_transfer_error_message" = "Прехвърлянето на разговора се провали"; +"call_transfer_error_title" = "Грешка"; +"call_transfer_contacts_all" = "Всички"; +"call_transfer_contacts_recent" = "Скорошни"; +"call_transfer_dialpad" = "Панел за набиране"; +"call_transfer_users" = "Потребители"; + +// MARK: - Call Transfer +"call_transfer_title" = "Прехвърляне"; + +// MARK: - Dial Pad +"dialpad_title" = "Панел за набиране"; +"pin_protection_settings_change_pin" = "Промяна на PIN код"; +"pin_protection_confirm_pin_to_change" = "Потвърдете PIN кода за да го промените"; +"secrets_setup_recovery_passphrase_summary_information" = "Запомнете паролата си. Може да се използва за да отключи шифрованите съобщения и данни."; +"secrets_setup_recovery_passphrase_summary_title" = "Запазете паролата си"; +"bug_report_background_mode" = "Продължи във фонов режим"; +"call_actions_unhold" = "Възобнови"; +"event_formatter_group_call_incoming" = "%@ в %@"; +"event_formatter_group_call_leave" = "Напусни"; +"event_formatter_group_call_join" = "Влез"; +"event_formatter_group_call" = "Групов разговор"; +"event_formatter_call_end_call" = "Затвори"; +"event_formatter_call_retry" = "Опитай пак"; +"event_formatter_call_answer" = "Отговори"; +"event_formatter_call_decline" = "Откажи"; +"event_formatter_call_back" = "Звънни отново"; +"event_formatter_call_connection_failed" = "Връзката се провали"; +"event_formatter_call_you_missed" = "Пропуснахте това обаждане"; +"event_formatter_call_you_declined" = "Отказахте разговора"; +"event_formatter_call_you_currently_in" = "Активен разговор"; +"event_formatter_call_has_ended" = "Прекратяване на %@"; +"event_formatter_call_ringing" = "Звънене…"; +"event_formatter_call_connecting" = "Свързване…"; +"event_formatter_call_video" = "Видео разговор"; +"event_formatter_call_voice" = "Гласов разговор"; +"room_details_integrations" = "Интеграции"; +"room_details_search" = "Търси в стаята"; +"settings_show_NSFW_public_rooms" = "Показвай публични стаи с чувствително съдържание"; +"settings_labs_enable_ringing_for_group_calls" = "Позвъняване за групови разговори"; +"room_multiple_typing_notification" = "%@ и други"; +"room_no_privileges_to_create_group_call" = "Трябва да сте администратор или модератор за да започнете разговор."; +"room_join_group_call" = "Влез"; +"room_open_dialpad" = "Панел за набиране"; +"room_place_voice_call" = "Гласов разговор"; +"room_accessibility_video_call" = "Видео разговор"; +"room_event_action_delete_confirmation_message" = "Сигурни ли сте, че искате да изтриете неизпратеното съобщение?"; +"room_event_action_delete_confirmation_title" = "Изтрий неизпратеното съобщение"; +"room_unsent_messages_cancel_message" = "Сигурни ли сте, че искате да изтриете всички неизпратени съобщения в тази стая?"; +"room_unsent_messages_cancel_title" = "Изтрий неизпратените съобщения"; +"room_message_replying_to" = "Отговаряне на %@"; +"room_message_editing" = "Редактиране"; + +// Chat +"room_slide_to_end_group_call" = "Издърпайте за да прекратите разговора за всички"; +"rooms_empty_view_information" = "Стаите са удобни за какъв да е групов чат - личен или публичен. Докоснете + за да намерите съществуващи стаи или да създадете нови."; +"rooms_empty_view_title" = "Стаи"; +"people_empty_view_information" = "Чатете защитено с всеки. Докоснете + за да добавите хора."; +"people_empty_view_title" = "Хора"; +"social_login_button_title_sign_up" = "Регистрирай се с %@"; +"social_login_button_title_sign_in" = "Влез с %@"; +"social_login_button_title_continue" = "Продължи с %@"; +"social_login_list_title_sign_up" = "или"; +"social_login_list_title_sign_in" = "или"; + +// Social login + +"social_login_list_title_continue" = "Продължи с"; +"callbar_only_single_active_group" = "Докоснете за влизане в груповия разговор (%@)"; +"callbar_return" = "Връщане"; +"callbar_only_multiple_paused" = "%@ паузирани разговора"; +"callbar_only_single_paused" = "Паузиран разговор"; +"callbar_active_and_multiple_paused" = "1 активен разговор (%@) · %@ паузирани разговора"; +"callbar_active_and_single_paused" = "1 активен разговор (%@) · 1 паузиран разговор"; + +// Call Bar +"callbar_only_single_active" = "Докоснете за връщане в разговора (%@)"; From b23ce64b728247c4819c989bcb1d2f1b0c417957 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Thu, 17 Jun 2021 01:05:41 +0000 Subject: [PATCH 372/393] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (1216 of 1216 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/ --- Riot/Assets/pt_BR.lproj/Vector.strings | 476 ++++++++++++------------- 1 file changed, 238 insertions(+), 238 deletions(-) diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index 32eaaea04..b72c6685e 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -399,163 +399,163 @@ "room_details_banned_users_section" = "Usuárias(os) banidas(os)"; "room_details_advanced_section" = "Avançadas"; "room_details_advanced_room_id" = "ID de sala:"; -"room_details_advanced_enable_e2e_encryption" = "Ativar criptografia (atenção: não pode ser desativado novamente!)"; -"room_details_advanced_e2e_encryption_enabled" = "A criptografia está ativada nesta sala"; -"room_details_advanced_e2e_encryption_disabled" = "A criptografia não está ativada nesta sala."; -"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Criptografar apenas para sessões confirmadas"; -"room_details_fail_to_update_avatar" = "Falha ao atualizar a imagem da sala"; -"room_details_fail_to_update_room_name" = "Falha ao atualizar o nome da sala"; -"room_details_fail_to_update_topic" = "Falha ao atualizar a descrição"; -"room_details_fail_to_update_room_guest_access" = "Falha ao atualizar o acesso do convidado da sala"; -"room_details_fail_to_update_room_join_rule" = "Falha ao atualizar a regra de participação"; -"room_details_fail_to_update_room_directory_visibility" = "Falha ao atualizar a visibilidade da sala na lista"; -"room_details_fail_to_update_history_visibility" = "Falha ao atualizar a visibilidade do histórico"; +"room_details_advanced_enable_e2e_encryption" = "Ativar encriptação (aviso: não pode ser desativada de novo!)"; +"room_details_advanced_e2e_encryption_enabled" = "Encriptação está ativada nesta sala"; +"room_details_advanced_e2e_encryption_disabled" = "Encriptação não está ativada nesta sala."; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Encriptar para sessões verificadas somente"; +"room_details_fail_to_update_avatar" = "Falha para atualizar a foto da sala"; +"room_details_fail_to_update_room_name" = "Falha para atualizar o nome da sala"; +"room_details_fail_to_update_topic" = "Falha para atualizar o tópico"; +"room_details_fail_to_update_room_guest_access" = "Falha para atualizar o acesso de visitante da sala"; +"room_details_fail_to_update_room_join_rule" = "Falha para atualizar a regra de se juntar"; +"room_details_fail_to_update_room_directory_visibility" = "Falha para atualizar a visibilidade do diretório de salas"; +"room_details_fail_to_update_history_visibility" = "Falha para atualizar a visibilidade do histórico"; "room_details_advanced_e2e_encryption_prompt_message" = "A criptografia de ponta a ponta é experimental e pode não ser confiável.\n\nVocê ainda não deve confiar nele para proteger os dados.\n\nOs dispositivos ainda não poderão descriptografar o histórico antes de ingressarem na sala.\n\nQuando a criptografia estiver ativada para uma sala, ela não poderá ser desativada novamente (por enquanto).\n\nAs mensagens criptografadas não estarão visíveis em clientes que ainda não implementam a criptografia."; -"room_details_fail_to_add_room_aliases" = "Falha ao adicionar os novos endereços da sala"; -"room_details_fail_to_remove_room_aliases" = "Falha ao remover os endereços da sala"; -"room_details_fail_to_update_room_canonical_alias" = "Falha ao atualizar o endereço principal"; -"room_details_fail_to_update_room_communities" = "Falha ao atualizar as comunidades relacionadas"; -"room_details_fail_to_update_room_direct" = "Falha ao atualizar o sinalizador direto desta sala"; -"room_details_fail_to_enable_encryption" = "Falha ao ativar a criptografia nesta sala"; -"room_details_save_changes_prompt" = "Deseja salvar as alterações?"; -"room_details_set_main_address" = "Definir como endereço principal"; -"room_details_unset_main_address" = "Desativar como endereço principal"; -"room_details_copy_room_id" = "Copiar o ID da sala"; -"room_details_copy_room_address" = "Copiar o endereço da sala"; -"room_details_copy_room_url" = "Copiar o link da sala"; +"room_details_fail_to_add_room_aliases" = "Falha para adicionar os novos endereços da sala"; +"room_details_fail_to_remove_room_aliases" = "Falha para remover os endereços da sala"; +"room_details_fail_to_update_room_canonical_alias" = "Falha para atualizar o endereço principal"; +"room_details_fail_to_update_room_communities" = "Falha para atualizar as comunidades relacionadas"; +"room_details_fail_to_update_room_direct" = "Falha para atualizar a bandeira direta desta sala"; +"room_details_fail_to_enable_encryption" = "Falha para ativar encriptação nesta sala"; +"room_details_save_changes_prompt" = "Você quer salvar mudanças?"; +"room_details_set_main_address" = "Definir como Endereço Principal"; +"room_details_unset_main_address" = "Desdefinir como Endereço Principal"; +"room_details_copy_room_id" = "Copiar ID de Sala"; +"room_details_copy_room_address" = "Copiar Endereço de Sala"; +"room_details_copy_room_url" = "Copiar URL de Sala"; // Group Details -"group_details_title" = "Detalhes da Comunidade"; -"group_details_home" = "Início"; +"group_details_title" = "Detalhes de Comunidade"; +"group_details_home" = "Home"; "group_details_people" = "Pessoas"; "group_details_rooms" = "Salas"; // Group Home -"group_home_one_member_format" = "1 participante"; -"group_home_multi_members_format" = "%tu participantes"; +"group_home_one_member_format" = "1 membro"; +"group_home_multi_members_format" = "%tu membros"; "group_home_one_room_format" = "1 sala"; "group_home_multi_rooms_format" = "%tu salas"; -"group_invitation_format" = "%@ convidou você para participar desta comunidade"; +"group_invitation_format" = "%@ tem convidado você para se juntar a esta comunidade"; // Group participants "group_participants_add_participant" = "Adicionar participante"; -"group_participants_leave_prompt_title" = "Sair da comunidade"; -"group_participants_leave_prompt_msg" = "Tem certeza de que deseja sair da comunidade?"; +"group_participants_leave_prompt_title" = "Sair de grupo"; +"group_participants_leave_prompt_msg" = "Você tem certeza que você quer sair do grupo?"; "group_participants_remove_prompt_title" = "Confirmação"; -"group_participants_remove_prompt_msg" = "Tem certeza de que deseja remover %@ desta comunidade?"; +"group_participants_remove_prompt_msg" = "Você tem certeza que você quer remover %@ deste grupo?"; "group_participants_invite_prompt_title" = "Confirmação"; -"group_participants_invite_prompt_msg" = "Tem certeza de que deseja convidar %@ para esta comunidade?"; -"group_participants_filter_members" = "Pesquisar participantes da comunidade"; -"group_participants_invite_another_user" = "Pesquisar / convidar por ID de usuário ou nome e sobrenome"; -"group_participants_invite_malformed_id_title" = "Erro ao convidar"; -"group_participants_invite_malformed_id" = "ID malformado. Deve ser um ID da Matrix como \"@localpart:domain\""; -"group_participants_invited_section" = "CONVIDADO"; +"group_participants_invite_prompt_msg" = "Você tem certeza que você quer convidar %@ para este grupo?"; +"group_participants_filter_members" = "Filtrar membros de comunidade"; +"group_participants_invite_another_user" = "Pesquisar / convidar por ID de Usuária(o) ou Nome"; +"group_participants_invite_malformed_id_title" = "Erro de Convidar"; +"group_participants_invite_malformed_id" = "ID malformada. Deveria ser uma ID Matrix como '@partlocal:dominio'"; +"group_participants_invited_section" = "CONVIDADAS(OS)"; // Group rooms -"group_rooms_filter_rooms" = "Filtrar salas da comunidade"; +"group_rooms_filter_rooms" = "Filtrar salas de comunidade"; // Read Receipts -"read_receipts_list" = "Lista de confirmações de leitura"; -"receipt_status_read" = "Leitura: "; +"read_receipts_list" = "Lista de Recibos de Leitura"; +"receipt_status_read" = "Lida: "; // Media picker -"media_picker_library" = "Galeria"; +"media_picker_library" = "Biblioteca"; "media_picker_select" = "Selecionar"; // Directory -"directory_title" = "Lista"; -"directory_server_picker_title" = "Selecionar uma lista"; +"directory_title" = "Diretório"; +"directory_server_picker_title" = "Selecionar um diretório"; "settings_display_name" = "Nome de Exibição"; "settings_pin_rooms_with_missed_notif" = "Fixar salas com notificações perdidas"; "settings_pin_rooms_with_unread" = "Fixar salas com mensagens não-lidas"; -"directory_server_all_rooms" = "Todas as salas no servidor %@"; -"directory_server_all_native_rooms" = "Todas as salas nativas da Matrix"; -"directory_server_type_homeserver" = "Digite um servidor local para listar suas salas públicas"; +"directory_server_all_rooms" = "Todas as salas em servidor %@"; +"directory_server_all_native_rooms" = "Todas as salas Matrix nativas"; +"directory_server_type_homeserver" = "Digite um servidorcasa para de onde listar salas públicas"; "directory_server_placeholder" = "matrix.org"; // Events formatter -"event_formatter_member_updates" = "%tu alterações na filiação"; +"event_formatter_member_updates" = "%tu mudanças de filiação"; "event_formatter_widget_added" = "%@ widget adicionado por %@"; "event_formatter_widget_removed" = "%@ widget removido por %@"; -"event_formatter_jitsi_widget_added" = "Chamada em grupo adicionada por %@"; -"event_formatter_jitsi_widget_removed" = "Chamada em grupo removida por %@"; -"event_formatter_rerequest_keys_part1_link" = "Solicitar novamente chaves de criptografia"; -"event_formatter_rerequest_keys_part2" = " ·de suas outras sessões."; +"event_formatter_jitsi_widget_added" = "Conferência de VoIP adicionada por %@"; +"event_formatter_jitsi_widget_removed" = "Conferência de VoIP removida por %@"; +"event_formatter_rerequest_keys_part1_link" = "Re-requisitar chaves de encriptação"; +"event_formatter_rerequest_keys_part2" = " de suas outras sessões."; // Others "or" = "ou"; "you" = "Você"; "today" = "Hoje"; "yesterday" = "Ontem"; -"network_offline_prompt" = "A internet parece estar fora do ar."; -"homeserver_connection_lost" = "Não foi possível conectar-se ao servidor local."; +"network_offline_prompt" = "A conexão de Internet parece estar offline."; +"homeserver_connection_lost" = "Não foi possível conectar-se ao servidorcasa."; "public_room_section_title" = "Salas Públicas (em %@):"; -"bug_report_prompt" = "O aplicativo encerrou inesperadamente na última vez. Gostaria de enviar um relatório de erros?"; -"rage_shake_prompt" = "Você parece estar agitando o telefone em frustração. Gostaria de enviar um relatório de erro?"; -"do_not_ask_again" = "Não perguntar novamente"; -"camera_access_not_granted" = "%@ não tem permissão para usar a câmera, altere as configurações de privacidade"; +"bug_report_prompt" = "O aplicativo tem crashado da última vez. Você gostaria de submeter um reporte de crash?"; +"rage_shake_prompt" = "Você parece estar agitando o telefone em frustração. Você gostaria desubmeter um reporte de bug?"; +"do_not_ask_again" = "Não perguntar de novo"; +"camera_access_not_granted" = "%@ não tem permissão para usar Câmera, por favor mude configurações de privacidade"; "large_badge_value_k_format" = "%.1fK"; // Call -"call_incoming_voice_prompt" = "Recebendo chamada de voz de %@"; -"call_incoming_video_prompt" = "Recebendo chamada de vídeo de %@"; -"call_incoming_voice" = "Recebendo chamada de voz…"; -"call_incoming_video" = "Recebendo chamada de vídeo…"; -"call_already_displayed" = "Já existe uma chamada em andamento."; -"call_jitsi_error" = "Não foi possível participar da chamada em grupo."; +"call_incoming_voice_prompt" = "Chamada de voz recebendo de %@"; +"call_incoming_video_prompt" = "Chamada de vídeo recebendo de %@"; +"call_incoming_voice" = "Chamada recebendo…"; +"call_incoming_video" = "Chamada de vídeo recebendo…"; +"call_already_displayed" = "Já existe uma chamada em progresso."; +"call_jitsi_error" = "Falha para se juntar a chamada de conferência."; // No VoIP support -"no_voip_title" = "Recebendo chamada"; -"no_voip" = "%@ está ligando para você, mas %@ ainda não suporta chamadas.↵\nVocê pode ignorar essa notificação e aceitar a chamada em outro aparelho, ou recusá-la."; +"no_voip_title" = "Chamada recebendo"; +"no_voip" = "%@ está chamando você mas %@ não suporta chamadas ainda.\nVocê pode ignorar esta notificação e atender a chamada de um outro dispositivo ou você pode rejeitá-la."; // Crash report -"google_analytics_use_prompt" = "Você gostaria de ajudar a melhorar o %@ informando automaticamente relatórios de falhas e dados de uso anônimos?"; +"google_analytics_use_prompt" = "Você gostaria de ajudar a melhorar %@ ao reportar automaticamente reportes de crash e dados de uso anônimos?"; // Crypto -"e2e_enabling_on_app_update" = "O Element agora suporta criptografia de ponta a ponta, mas você precisa fazer login novamente para ativá-la.↵\n↵\nVocê pode fazer isso agora ou mais tarde nas configurações do aplicativo."; -"e2e_need_log_in_again" = "Você precisa fazer login novamente para gerar chaves de criptografia de ponta a ponta para esta sessão, e enviar a chave pública ao seu servidor local.↵\nIsso ocorre apenas dessa vez; desculpe pela inconveniência."; +"e2e_enabling_on_app_update" = "Element agora suporta encriptação ponta-a-ponta mas você precisa fazer login de novo para ativá-la.\n\nVocê pode fazê-lo agora ou mais tarde desde as configurações do aplicativo."; +"e2e_need_log_in_again" = "Você precisa fazer login de volta para gerar chaves de encriptação ponta-a-ponta para esta sessão e submeter a chave pública a seu servidorcasa.\nIsto é só desta vez; desculpe pela inconveniência."; // Bug report -"bug_report_title" = "Relatório de erro"; -"bug_report_description" = "Por favor, descreva o erro. O que você fez? O que você esperava que acontecesse? O que realmente aconteceu?"; -"bug_crash_report_title" = "Relatório de erros"; -"bug_crash_report_description" = "Por favor, descreva o que você fez antes do erro:"; -"bug_report_logs_description" = "Para diagnosticar problemas, os logs deste cliente serão enviados com este relatório de erro. Se preferir enviar apenas o texto acima, por favor desmarque:"; -"bug_report_send_logs" = "Enviar registros"; -"bug_report_send_screenshot" = "Enviar recorte de tela"; +"bug_report_title" = "Report de Bug"; +"bug_report_description" = "Por favor descreva o bug. O que você fez? O que você esperava que acontecese? O que aconteceu na verdade?"; +"bug_crash_report_title" = "Reporte de Crash"; +"bug_crash_report_description" = "Por favor descreva o que você fez antes do crash:"; +"bug_report_logs_description" = "A fim de diagnosticar problemas, logs deste cliente vão ser enviados com este reporte de bug. Se você prefere somente enviar o texto acima, por favor desmarque:"; +"bug_report_send_logs" = "Enviar logs"; +"bug_report_send_screenshot" = "Enviar screenshot"; "bug_report_progress_zipping" = "Coletando logs"; -"bug_report_progress_uploading" = "Enviando relatório"; +"bug_report_progress_uploading" = "Fazendo upload de reporte"; "bug_report_send" = "Enviar"; // Widget "widget_no_power_to_manage" = "Você precisa de permissão para gerenciar widgets nesta sala"; -"widget_creation_failure" = "A criação do widget falhou"; -"widget_sticker_picker_no_stickerpacks_alert" = "No momento, você não possui pacotes de figurinhas ativados."; -"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Adicione alguns agora?"; +"widget_creation_failure" = "Criação de widget tem falhado"; +"widget_sticker_picker_no_stickerpacks_alert" = "Você não tem atualmente nenhum pacote de stickers ativados."; +"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Adicionar alguns agora?"; // Widget Integration Manager -"widget_integration_need_to_be_able_to_invite" = "Você precisa convidar os usuários para fazer isso."; -"widget_integration_unable_to_create" = "Não é possível criar widget."; -"widget_integration_failed_to_send_request" = "Falha ao enviar solicitação."; +"widget_integration_need_to_be_able_to_invite" = "Você precisa ser capaz de convidar usuárias(os) para fazer isso."; +"widget_integration_unable_to_create" = "Incapaz de criar widget."; +"widget_integration_failed_to_send_request" = "Falha para enviar requisição."; "widget_integration_room_not_recognised" = "Esta sala não é reconhecida."; -"widget_integration_positive_power_level" = "O nível de permissão deve ser inteiro positivo."; +"widget_integration_positive_power_level" = "Nível de poder deve ser inteiro positivo."; "widget_integration_must_be_in_room" = "Você não está nesta sala."; "widget_integration_no_permission_in_room" = "Você não tem permissão para fazer isso nesta sala."; -"widget_integration_missing_room_id" = "room_id ausente em pedido."; -"widget_integration_missing_user_id" = "user_id ausente em pedido."; -"widget_integration_room_not_visible" = "Sala %@ não é visível."; +"widget_integration_missing_room_id" = "room_id faltando em requisição."; +"widget_integration_missing_user_id" = "user_id faltando em requisição."; +"widget_integration_room_not_visible" = "Sala %@ não está visível."; // Share extension -"share_extension_auth_prompt" = "Entre no aplicativo principal para compartilhar conteúdo"; -"share_extension_failed_to_encrypt" = "Falha ao enviar. Verifique no aplicativo principal as configurações de criptografia desta sala"; +"share_extension_auth_prompt" = "Faça login no app principal para compartilhar conteúdo"; +"share_extension_failed_to_encrypt" = "Falha para enviar. Cheque no app principal as configurações de encriptação para esta sala"; // Room key request dialog -"e2e_room_key_request_title" = "Pedido de chave de encriptação"; -"e2e_room_key_request_message_new_device" = "Você adicionou uma nova sessão '%@', que está solicitando chaves de criptografia."; -"e2e_room_key_request_message" = "Sua sessão não confirmada '%@' está solicitando chaves de criptografia."; -"e2e_room_key_request_start_verification" = "Iniciar confirmação…"; -"e2e_room_key_request_share_without_verifying" = "Compartilhar sem confirmar"; -"e2e_room_key_request_ignore_request" = "Ignorar solicitação"; +"e2e_room_key_request_title" = "Requisição de chave de encriptação"; +"e2e_room_key_request_message_new_device" = "Você adicionou uma nova sessão '%@', que está requisitando chaves de encriptação."; +"e2e_room_key_request_message" = "Sua sessão não-verificada '%@' está requisitando chaves de encriptação."; +"e2e_room_key_request_start_verification" = "Começar verificação…"; +"e2e_room_key_request_share_without_verifying" = "Compartilhar sem verificar"; +"e2e_room_key_request_ignore_request" = "Ignorar requisição"; // GDPR -"gdpr_consent_not_given_alert_message" = "Para continuar usando o %@ servidor local, você deve revisar e concordar com os termos e condições."; +"gdpr_consent_not_given_alert_message" = "Para continuar usando o servidorcasa %@ você deve revisar e concordar com os termos e condições."; "gdpr_consent_not_given_alert_review_now_action" = "Revisar agora"; -"deactivate_account_title" = "Desativar minha conta"; -"deactivate_account_informations_part1" = "Isso tornará sua conta permanentemente inutilizável. Você não poderá efetuar login e ninguém poderá registrar novamente o mesmo ID de usuário. Isso fará com que sua conta deixe todas as salas nas quais está participando e removerá os detalhes da sua conta do seu servidor de identidade. "; -"deactivate_account_informations_part2_emphasize" = "Essa ação é irreversível."; -"deactivate_account_informations_part3" = "\n\nDesativando sua conta "; -"deactivate_account_informations_part4_emphasize" = "não nos faz esquecer, por padrão, as mensagens que você enviou. "; -"deactivate_account_informations_part5" = "Se você gostaria que nós esquecêssemos suas mensagens, por favor marque a caixa abaixo↵\n↵\nA visibilidade das mensagens no Matrix é semelhante ao e-mail. O fato de esquecermos suas mensagens significa que as mensagens que você enviou não serão compartilhadas com usuários novos ou não registrados, mas os usuários registrados que já têm acesso a essas mensagens ainda terão acesso à cópia delas."; -"deactivate_account_forget_messages_information_part1" = "Quando minha conta for desativada, exclua todas as mensagens que eu enviei ("; -"deactivate_account_forget_messages_information_part2_emphasize" = "Atenção"; -"deactivate_account_forget_messages_information_part3" = ": isso fará com que futuros usuários vejam uma visão incompleta das conversas)"; -"deactivate_account_validate_action" = "Desativar minha conta"; -"deactivate_account_password_alert_title" = "Desativar minha conta"; -"deactivate_account_password_alert_message" = "Para continuar, por favor, digite sua senha"; +"deactivate_account_title" = "Desativar Conta"; +"deactivate_account_informations_part1" = "Isto vai fazer sua conta permanentemente inusável. Você não vai ser capaz de fazer login, e ninguém vai ser capaz de re-registrar a mesma ID de usuária(o). Isto vai causar sua conta sair de todas as salas em que ela está participando, e vai remover detalhes de sua conta de seu servidor de identidade. "; +"deactivate_account_informations_part2_emphasize" = "Esta ação é irreversível."; +"deactivate_account_informations_part3" = "\n\nDesativar sua conta "; +"deactivate_account_informations_part4_emphasize" = "não nos causa por default esquecer mensagens que você tem enviado. "; +"deactivate_account_informations_part5" = "Se você gostaria que nós esqueçamos suas mensagens, por favor marque a caixa abaixo.\n\nVisibilidade de mensagem em Matrix é similar a email. Nós esquecermos suas mensagens significa que mensagens que você tem enviado não vão ser compartilhadas com nenhum usuária(o) nova(o) ou não-registrada(o), mas usuárias(os) registradas(os) que já têm acesso a estas mensagens vão ainda ter acesso à cópia delas(es)."; +"deactivate_account_forget_messages_information_part1" = "Por favor esqueça todas as mensagens que eu tenho enviado quando minha conta for desativada ("; +"deactivate_account_forget_messages_information_part2_emphasize" = "Aviso"; +"deactivate_account_forget_messages_information_part3" = ": isto vai causar usuárias/os futuras/os terem uma visualização incompleta de conversas)"; +"deactivate_account_validate_action" = "Desativar conta"; +"deactivate_account_password_alert_title" = "Desativar Conta"; +"deactivate_account_password_alert_message" = "Para continuar, por favor entre sua senha"; // Re-request confirmation dialog -"rerequest_keys_alert_title" = "Requisição enviada"; -"rerequest_keys_alert_message" = "Por favor, inicie o Element em outro aparelho que possa descriptografar a mensagem, de modo que ele possa enviar as chaves para esta sessão."; +"rerequest_keys_alert_title" = "Requisição Enviada"; +"rerequest_keys_alert_message" = "Por favor lance Element num outro dispositivo que possa decriptar a mensagem para que ele possa enviar as chaves para esta sessão."; // String for App Store "store_short_description" = "Chat/VoIP descentralizado e seguro"; "store_full_description" = "Element is um novo tipo de mensageiro e app de colaboração que:\n\n1. Põe você em controle para preservar sua privacidade\n2. Permite você se comunicar com qualquer pessoa na rede Matrix, e até além ao integrar-se com apps como Slack\n3. Protege você de publicidade, datamining, backdoors e jardins murados\n4. Assegura você através de encriptação ponta-a-pontam com assinatura cruzada para verificar ouras(os)\n\nElement é completamente diferente de outros apps de mensageria e colaboração porque ele é descentralizado e open source.\n\nElement permite você auto-hospedar - ou escolher um host - para que você tenha privacidade, propriedade e controle de seus dados e conversas. Ele dá a você acesso a uma rede aberta; então você não está simplesmente preso falando com outras(os) usuárias(os) Element somente. E ele é muito seguro.\n\nElement é capaz de fazer tudo isso porque ele opera em Matrix - o padrão para comunicação aberta e descentralizada.\n\nElement põe você em controle ao permitir você escolher quem hospeda suas conversas. De seu app Element, você pode escolher hospedar de diferentes maneiras:\n\n1. Pegar uma conta grátis no servidor público matrix.org\n2. Auto-hospedar sua conta ao rodar um servidor em seu próprio hardware\n3. Registrar-se para uma conta num servidor personalizado ao simplesmente assinar a plataforma de hospedagem Element Matrix Services\n\nPorquê escolher Element?\n\nTENHA POSSE DE SEUS DADOS: Você decide onde manter seus dados e mensagens. Você os possui e controla, não alguma MEGACORP que mina seus dados ou dá acesso a terceiros.\n\nMENSAGERIA E COLABORAÇÃO ABERTOS: Você pode fazer chat com qualquer outra pessoa na rede Matrix, caso ela esteja usando Element ou um outro app Matrix, e mesmo se ela estiver usando um sistema de mensageria diferente, do tipo de Slack, IRC ou XMPP.\n\nSUPER-SEGURO: Encriptação ponta-a-ponta real (somente aquelas/es na conversa podem decriptar mensagens), e assinatura cruzada para verificar os dispositivos de participantes de conversa.\n\nCOMUNICAÇÃO COMPLETA: Mensageria, chamadas de voz e vídeo, compartilhamento de arquivo, compartilhamento de tela e um monte de integrações, bots e widgets. Construa salas, comunidades, fique em contato e tenha as coisas feitas.\n\nEM TODO LUGAR ONDE VOCÊ ESTEJA: Fique em contato onde quer que você esteja com histórico de mensagem sincronizado por todos os dispositivos e na web em https://element.io/app."; @@ -587,78 +587,78 @@ "settings_key_backup_delete_confirmation_prompt_msg" = "Você tem certeza? Você vai perder suas mensagens encriptadas se o backup de suas chaves não tiver sido feito apropriadamente."; "room_does_not_exist" = "%@ não existe"; // Key backup wrong version -"e2e_key_backup_wrong_version_title" = "Novo backup de chave"; -"e2e_key_backup_wrong_version" = "Um novo backup de chave foi detectado.\n\nSe não foi você, defina uma nova frase secreta em Configurações."; +"e2e_key_backup_wrong_version_title" = "Novo Backup de Chave"; +"e2e_key_backup_wrong_version" = "Um novo backup de chave de mensagem segura tem sido detectado.\n\nSe isto não foi você, defina uma nova frasepasse em Configurações."; "e2e_key_backup_wrong_version_button_settings" = "Configurações"; "e2e_key_backup_wrong_version_button_wasme" = "Foi eu"; -"key_backup_setup_title" = "Backup de chave"; +"key_backup_setup_title" = "Backup de Chave"; "key_backup_setup_skip_alert_title" = "Você tem certeza?"; -"key_backup_setup_skip_alert_message" = "Você pode perder mensagens seguras se sair dessa sessão ou perder o seu aparelho."; +"key_backup_setup_skip_alert_message" = "Você pode perder mensagens seguras se você fizer logout ou perder seu dispositivo."; "key_backup_setup_skip_alert_skip_action" = "Pular"; -"key_backup_setup_intro_title" = "Nunca perca mensagens criptografadas"; -"key_backup_setup_intro_info" = "As mensagens em salas criptografadas são protegidas com criptografia de ponta a ponta. Somente você e o(s) destinatário(s) têm as chaves para ler essas mensagens.\n\nFaça backup de suas chaves com segurança para evitar perdê-las."; -"key_backup_setup_intro_setup_action_without_existing_backup" = "Comece a usar o Backup de chave"; +"key_backup_setup_intro_title" = "Nunca perca mensagens encriptadas"; +"key_backup_setup_intro_info" = "Mensagens em salas encriptadas são asseguradas com encriptação ponta-a-ponta. Somente você e a(s)/o(s) recipiente(s) têm as chaves para ler estas mensagens.\n\nFaça seguramente backup de suas chaves para evitar perdê-las."; +"key_backup_setup_intro_setup_action_without_existing_backup" = "Começar a usar Backup de Chave"; "key_backup_setup_intro_setup_action_with_existing_backup" = "Usar Backup de Chave"; -"key_backup_setup_intro_manual_export_info" = "(Avançado)"; -"key_backup_setup_intro_manual_export_action" = "Exportar as chaves manualmente"; -"key_backup_setup_passphrase_title" = "Proteja seu backup com uma frase secreta"; -"key_backup_setup_passphrase_info" = "Nós vamos armazenar uma cópia criptografada de suas chaves em nosso servidor. Proteja seu backup com uma frase secreta para mantê-lo seguro.\n\nPara segurança máxima, a frase secreta deve ser diferente da senha da sua conta."; +"key_backup_setup_intro_manual_export_info" = "(Avançada)"; +"key_backup_setup_intro_manual_export_action" = "Exportar chaves manualmente"; +"key_backup_setup_passphrase_title" = "Assegure seu backup com uma Frasepasse"; +"key_backup_setup_passphrase_info" = "Nós vamos armazenar uma cópia encriptada de suas chaves em nosso servidor. Proteja seu backup com uma frasepasse para mantê-lo seguro.\n\nPara segurança máxima, esta deveria ser diferente da senha de sua conta."; "key_backup_setup_passphrase_passphrase_title" = "Entrar"; -"key_backup_setup_passphrase_passphrase_placeholder" = "Digite a senha"; +"key_backup_setup_passphrase_passphrase_placeholder" = "Entrar frasepasse"; "key_backup_setup_passphrase_passphrase_valid" = "Ótimo!"; "key_backup_setup_passphrase_passphrase_invalid" = "Tente adicionar uma palavra"; -"key_backup_setup_passphrase_confirm_passphrase_title" = "Confirme"; -"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Confirme a senha"; +"key_backup_setup_passphrase_confirm_passphrase_title" = "Confirmar"; +"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Confirmar frasepasse"; "key_backup_setup_passphrase_confirm_passphrase_valid" = "Ótimo!"; -"key_backup_setup_passphrase_confirm_passphrase_invalid" = "As senhas não conferem"; -"key_backup_setup_passphrase_set_passphrase_action" = "Definir a frase secreta"; -"key_backup_setup_passphrase_setup_recovery_key_info" = "Ou, proteja seu backup com uma chave de recuperação, salvando-a em algum lugar seguro."; -"key_backup_setup_passphrase_setup_recovery_key_action" = "(Avançado) Configurar com chave de recuperação"; -"key_backup_setup_success_title" = "Pronto!"; +"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Frasepasse não corresponde"; +"key_backup_setup_passphrase_set_passphrase_action" = "Definir Frasepasse"; +"key_backup_setup_passphrase_setup_recovery_key_info" = "Ou, assegure seu backup com uma Chave de Recuperação, salvando-a em algum lugar seguro."; +"key_backup_setup_passphrase_setup_recovery_key_action" = "(Avançado) Configurar com Chave de Recuperação"; +"key_backup_setup_success_title" = "Sucesso!"; // Success from passphrase -"key_backup_setup_success_from_passphrase_info" = "Suas chaves estão sendo copiadas.\n\nSua chave de recuperação é uma rede de segurança - você pode usá-la para restaurar o acesso às suas mensagens criptografadas se esquecer sua frase secreta.\n\nMantenha sua chave de recuperação em algum lugar muito seguro, como um gerenciador de senhas (ou um cofre)."; -"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Salvar chave de recuperação"; -"key_backup_setup_success_from_passphrase_done_action" = "Fechar"; +"key_backup_setup_success_from_passphrase_info" = "Backup de suas chaves está sendo feito.\n\nSua chave de recuperação é uma rede de segurança - você pode usá-la para restaurar acesso a suas mensagens encriptadas se você esquecer sua frasepasse.\n\nMantenha sua chave de recuperação em algum lugar muito seguro, como um gerenciador de senhas (ou um cofre)."; +"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Salvar Chave de Recuperação"; +"key_backup_setup_success_from_passphrase_done_action" = "Feito"; // Success from recovery key -"key_backup_setup_success_from_recovery_key_info" = "Suas chaves estão sendo copiadas.\n\nFaça uma cópia dessa chave de recuperação e mantenha-a segura."; -"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Chave de recuperação"; -"key_backup_setup_success_from_recovery_key_make_copy_action" = "Fazer uma cópia"; -"key_backup_setup_success_from_recovery_key_made_copy_action" = "Eu já fiz uma cópia"; -"key_backup_recover_title" = "Mensagens seguras"; -"key_backup_recover_invalid_passphrase_title" = "Senha de recuperação incorreta"; -"key_backup_recover_invalid_passphrase" = "O backup não pôde ser descriptografado com essa frase secreta: verifique se você digitou corretamente a frase secreta de recuperação."; -"key_backup_recover_invalid_recovery_key_title" = "Chave de recuperação incorreta"; -"key_backup_recover_invalid_recovery_key" = "O backup não pôde ser descriptografado com essa chave: verifique se você inseriu corretamente a chave de recuperação."; -"key_backup_recover_from_passphrase_info" = "Use sua frase secreta de recuperação para desbloquear seu histórico de mensagens seguras"; +"key_backup_setup_success_from_recovery_key_info" = "Backup de suas chaves está sendo feito.\n\nFaça uma cópia desta chave de recuperação e mantenha-a segura."; +"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Chave de Recuperação"; +"key_backup_setup_success_from_recovery_key_make_copy_action" = "Fazer uma Cópia"; +"key_backup_setup_success_from_recovery_key_made_copy_action" = "Eu tenho feito uma cópia"; +"key_backup_recover_title" = "Mensagens Seguras"; +"key_backup_recover_invalid_passphrase_title" = "Frasepasse de Recuperação Incorreta"; +"key_backup_recover_invalid_passphrase" = "Backup não pôde ser decriptado com esta frasepasse: por favor verifique que você entrou a frasepasse de recuperação correta."; +"key_backup_recover_invalid_recovery_key_title" = "Disparidade de Chave de Recuperação"; +"key_backup_recover_invalid_recovery_key" = "Backup não pôde ser decriptografado com esta chave: por favor verifique que você entrou a chave de recuperação correta."; +"key_backup_recover_from_passphrase_info" = "Use sua frasepasse de recuperação para destrancar seu histórico de mensagens seguras"; "key_backup_recover_from_passphrase_passphrase_title" = "Entrar"; -"key_backup_recover_from_passphrase_passphrase_placeholder" = "Digite a frase secreta"; -"key_backup_recover_from_passphrase_recover_action" = "Desbloquear Histórico"; -"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Não sabe sua senha de recuperação? Você pode "; -"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "use sua chave de recuperação"; +"key_backup_recover_from_passphrase_passphrase_placeholder" = "Entrar Frasepasse"; +"key_backup_recover_from_passphrase_recover_action" = "Destrancar Histórico"; +"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Não sabe sua frasepasse de recuperação? Você pode "; +"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "usar sua chave de recuperação"; "key_backup_recover_from_passphrase_lost_passphrase_action_part3" = "."; -"key_backup_recover_from_recovery_key_info" = "Use sua chave de recuperação para desbloquear o seu histórico de mensagens seguras"; +"key_backup_recover_from_recovery_key_info" = "Use sua chave de recuperação para destrancar seu histórico de mensagens seguras"; "key_backup_recover_from_recovery_key_recovery_key_title" = "Entrar"; -"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Digite a chave de recuperação"; -"key_backup_recover_from_recovery_key_recover_action" = "Desbloquear Histórico"; -"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Perdeu sua chave de recuperação? Você pode configurar uma nova nas configurações."; -"key_backup_recover_success_info" = "Backup restaurado!"; -"key_backup_recover_done_action" = "Fechar"; +"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Entrar Chave de Recuperação"; +"key_backup_recover_from_recovery_key_recover_action" = "Destrancar Histórico"; +"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Perdeu sua chave de recuperação? Você pode configurar uma nova em configurações."; +"key_backup_recover_success_info" = "Backup Restaurado!"; +"key_backup_recover_done_action" = "Feito"; "key_backup_setup_banner_title" = "Nunca perca mensagens criptografadas"; "key_backup_setup_banner_subtitle" = "Comece a usar o Backup de chave"; "key_backup_recover_banner_title" = "Nunca perca mensagens criptografadas"; "key_backup_recover_banner_subtitle" = "Use o backup de chave"; -"sign_out_existing_key_backup_alert_title" = "Deseja mesmo sair?"; -"sign_out_existing_key_backup_alert_sign_out_action" = "Sair"; -"sign_out_non_existing_key_backup_alert_title" = "Você perderá o acesso às suas mensagens criptografadas se sair agora"; +"sign_out_existing_key_backup_alert_title" = "Você tem certeza que você quer fazer signout?"; +"sign_out_existing_key_backup_alert_sign_out_action" = "Fazer signout"; +"sign_out_non_existing_key_backup_alert_title" = "Você vai perder acesso a suas mensagens encriptadas se fizer signout agora"; "sign_out_non_existing_key_backup_alert_setup_key_backup_action" = "Comece a usar o Backup de chave"; -"sign_out_non_existing_key_backup_alert_discard_key_backup_action" = "Eu não quero minhas mensagens criptografadas"; -"sign_out_non_existing_key_backup_sign_out_confirmation_alert_title" = "Você perderá suas mensagens criptografadas"; -"sign_out_non_existing_key_backup_sign_out_confirmation_alert_message" = "Você perderá o acesso às suas mensagens criptografadas, a menos que faça o backup das suas chaves antes de sair."; -"sign_out_non_existing_key_backup_sign_out_confirmation_alert_sign_out_action" = "Sair"; +"sign_out_non_existing_key_backup_alert_discard_key_backup_action" = "Eu não quero minhas mensagens encriptadas"; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_title" = "Você vai perder suas mensagens encriptadas"; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_message" = "Você vai perder acesso a suas mensagens encriptadas a menos que faça backup de suas chaves antes de fazer signout."; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_sign_out_action" = "Fazer signout"; "sign_out_non_existing_key_backup_sign_out_confirmation_alert_backup_action" = "Backup"; -"sign_out_key_backup_in_progress_alert_title" = "Backup de chave em andamento. Se você sair agora, perderá o acesso às suas mensagens criptografadas."; -"sign_out_key_backup_in_progress_alert_discard_key_backup_action" = "Eu não quero minhas mensagens criptografadas"; -"sign_out_key_backup_in_progress_alert_cancel_action" = "Eu esperarei"; +"sign_out_key_backup_in_progress_alert_title" = "Backup de chave em progresso. Se você fizer signout agora você vai perder acesso a suas mensagens encriptadas."; +"sign_out_key_backup_in_progress_alert_discard_key_backup_action" = "Eu não quero minhas mensagens encriptadas"; +"sign_out_key_backup_in_progress_alert_cancel_action" = "Eu vou esperar"; "store_promotional_text" = "App de chat e colaboração que preserva privacidade, em uma rede aberta. Descentralizado para pôr você em controle. Sem datamining, sem backdoors e sem acesso de terceiros."; "close" = "Fechar"; "skip" = "Pular"; @@ -675,31 +675,31 @@ "manage_session_name" = "Nome de sessão"; // AuthenticatedSessionViewControllerFactory "authenticated_session_flow_not_supported" = "Este app não suporta o mecanismo de autenticação em seu servidorcasa."; -"call_no_stun_server_error_message_1" = "Peça ao administrador do seu servidor local %@ para configurar um servidor TURN, de modo que as chamadas funcionem de maneira confiável."; -"secure_key_backup_setup_existing_backup_error_unlock_it" = "Desbloqueá-lo"; -"secure_key_backup_setup_existing_backup_error_delete_it" = "Apagá-lo"; +"call_no_stun_server_error_message_1" = "Por favor peça ao/à administrador(a) de seu servidorcasa %@ para configurar um servidor TURN a fim que chamadas funcionem confiavelmente."; +"secure_key_backup_setup_existing_backup_error_unlock_it" = "Destrancá-lo"; +"secure_key_backup_setup_existing_backup_error_delete_it" = "Deletá-lo"; "secure_key_backup_setup_cancel_alert_title" = "Você tem certeza?"; -"secure_key_backup_setup_cancel_alert_message" = "Se você cancelar agora, poderá perder mensagens e dados criptografados, se perder o acesso aos seus logins.\n\nVocê também pode configurar o Backup online e configurar suas chaves em Configurações."; -"secure_backup_setup_banner_title" = "Backup online"; -"secure_backup_setup_banner_subtitle" = "Proteja-se contra a perda de acesso a mensagens e dados criptografados"; +"secure_key_backup_setup_cancel_alert_message" = "Se você cancelar agora, você pode perder mensagens & dados encriptados se você perder acesso a seus logins.\n\nVocê também pode configurar Backup Seguro & gerenciar suas chaves em Configurações."; +"secure_backup_setup_banner_title" = "Backup Seguro"; +"secure_backup_setup_banner_subtitle" = "Salvaguardar-se contra perda de acesso a mensagens & dados encriptados"; // Recover from private key -"key_backup_recover_from_private_key_info" = "Restaurando o backup…"; -"sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "Comece a usar o backup online"; +"key_backup_recover_from_private_key_info" = "Restaurando backup…"; +"sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "Começar a usar Backup Seguro"; // MARK: - Device Verification -"key_verification_other_session_title" = "Confirmar a sessão"; -"key_verification_new_session_title" = "Confirme sua nova sessão"; -"key_verification_this_session_title" = "Confirme esta sessão"; -"key_verification_user_title" = "Confirme-os"; -"device_verification_security_advice_number" = "Compare os números, garantindo que eles apareçam na mesma ordem."; -"device_verification_cancelled_by_me" = "A confirmação foi cancelada. Motivo: %@"; -"device_verification_error_cannot_load_device" = "Não foi possível carregar as informações da sessão."; +"key_verification_other_session_title" = "Verificar sessão"; +"key_verification_new_session_title" = "Verificar sua nova sessão"; +"key_verification_this_session_title" = "Verificar esta sessão"; +"key_verification_user_title" = "Verificá-la(o)"; +"device_verification_security_advice_number" = "Compare os números, garantindo que eles aparecem na mesma ordem."; +"device_verification_cancelled_by_me" = "A verificação tem sido cancelada. Razão: %@"; +"device_verification_error_cannot_load_device" = "Não dá para carregar informação de sessão."; "major_update_information" = "Estamos felizes em anunciar que mudamos de nome! Seu aplicativo está atualizado e você está conectado à sua conta."; "room_action_camera" = "Tirar foto ou vídeo"; "room_accessibility_call" = "Chamar"; "media_type_accessibility_video" = "Vídeo"; -"event_formatter_jitsi_widget_added_by_you" = "Você adicionou chamada em grupo"; -"event_formatter_jitsi_widget_removed_by_you" = "Você removeu chamada em grupo"; -"room_widget_permission_avatar_url_permission" = "Link da sua foto de perfil"; +"event_formatter_jitsi_widget_added_by_you" = "Você adicionou conferência de VoIP"; +"event_formatter_jitsi_widget_removed_by_you" = "Você removeu conferência de VoIP"; +"room_widget_permission_avatar_url_permission" = "URL de seu avatar"; "device_verification_emoji_banana" = "Banana"; "room_participants_action_security_status_loading" = "Carregando…"; "room_participants_security_loading" = "Carregando…"; @@ -728,12 +728,12 @@ "settings_discovery_three_pids_management_information_part3" = "."; "settings_discovery_three_pid_details_share_action" = "Compartilhar"; "settings_discovery_three_pid_details_revoke_action" = "Revogar"; -"service_terms_modal_description_for_integration_manager" = "Use bots, integrações, widgets e pacotes de figurinhas"; -"device_verification_cancelled" = "Seu contato cancelou a confirmação."; +"service_terms_modal_description_for_integration_manager" = "Usar Bots, bridges, widgets e pacotes de stickers"; +"device_verification_cancelled" = "A outra parte cancelou a verificação."; // Mark: Incoming -"device_verification_incoming_title" = "Recebendo solicitação de confirmação"; -"device_verification_start_wait_partner" = "Aguardando seu contato aceitar…"; -"device_verification_self_verify_start_waiting" = "Aguardando…"; +"device_verification_incoming_title" = "Requisição de Verificação Recebendo"; +"device_verification_start_wait_partner" = "Esperando por parceira(o) aceitar…"; +"device_verification_self_verify_start_waiting" = "Esperando…"; "device_verification_verify_wait_partner" = "Aguardando seu contato confirmar…"; "key_verification_tile_request_status_waiting" = "Aguardando…"; // Scanning @@ -747,12 +747,12 @@ "identity_server_settings_change" = "Mudar"; "identity_server_settings_alert_change_title" = "Mudar servidor de identidade"; // Media picker -"media_picker_title" = "Galeria"; -"image_picker_action_library" = "Escolher da galeria"; -"photo_library_access_not_granted" = "%@ não tem permissão para acessar a galeria de fotos, altere as configurações de privacidade"; -"room_widget_permission_display_name_permission" = "Seu nome e sobrenome"; -"device_verification_security_advice_emoji" = "Compare os emojis únicos, garantindo que eles aparecem na mesma ordem."; -"device_verification_self_verify_alert_message" = "Verifique o novo login na sua conta: %@"; +"media_picker_title" = "Biblioteca de mídia"; +"image_picker_action_library" = "Escolher de biblioteca"; +"photo_library_access_not_granted" = "%@ não tem permissão para acessar biblioteca de fotos, por favor mude configurações de privacidade"; +"room_widget_permission_display_name_permission" = "Seu nome de exibição"; +"device_verification_security_advice_emoji" = "Compare os emoji únicos, garantindo que eles aparecem na mesma ordem."; +"device_verification_self_verify_alert_message" = "Verifique o novo login acessando sua conta: %@"; "key_verification_verify_sas_title_emoji" = "Compare os emojis"; "key_verification_manually_verify_device_title" = "Confirme manualmente por texto"; "device_verification_emoji_scissors" = "Tesoura"; @@ -795,10 +795,10 @@ "security_settings_crosssigning_reset" = "Resettar assinatura cruzada"; "identity_server_settings_disconnect_info" = "Desconectar-se de seu servidor de identidade vai significar que você não vai ser descobertável por outras(os) usuárias(os) e ser capaz de convidar outras(os) por email ou telefone."; "identity_server_settings_alert_disconnect_still_sharing_3pid" = "Você ainda está compartilhando seus dados pessoais no servidor de identidade %@.\n\nNós recomendamos que você remova seus endereços de email e números de telefone do servidor de identidade antes de se desconectar."; -"call_no_stun_server_error_title" = "A chamada falhou por conta de má configuração no servidor"; -"widget_integration_manager_disabled" = "Você precisa ativar o Gerenciador de Integrações nas configurações"; -"service_terms_modal_description_for_identity_server_1" = "Encontrar outras pessoas por telefone ou e-mail"; -"service_terms_modal_description_for_identity_server_2" = "Seja encontrada/o por número de celular ou por e-mail"; +"call_no_stun_server_error_title" = "Chamada falhou devido a servidor malconfigurado"; +"widget_integration_manager_disabled" = "Você precisa ativar Gerenciador de Integração em configurações"; +"service_terms_modal_description_for_identity_server_1" = "Encontrar outras(os) por telefone ou email"; +"service_terms_modal_description_for_identity_server_2" = "Ser encontrada(o) por telefone ou email"; "device_verification_self_verify_wait_additional_information" = "Isso funciona no Element e em outros clientes da Matrix capazes de fazer autoverificação."; "key_verification_verified_user_information" = "As mensagens com este usuário estão criptografadas de ponta a ponta e não podem ser lidas por terceiros."; "device_verification_emoji_smiley" = "Sorriso"; @@ -909,63 +909,63 @@ "identity_server_settings_alert_error_invalid_identity_server" = "%@ não é um servidor de identidade válido."; // Image picker "image_picker_action_camera" = "Tirar foto"; -"event_formatter_message_edited_mention" = "(editado)"; +"event_formatter_message_edited_mention" = "(editada)"; // Events formatter with you "event_formatter_widget_added_by_you" = "Você adicionou o widget: %@"; "event_formatter_widget_removed_by_you" = "Você removeu o widget: %@"; -"camera_unavailable" = "A câmera não está disponível no seu aparelho"; -"call_no_stun_server_error_message_2" = "Alternativamente, você pode tentar usar o servidor público em %@. No entanto, ele não é tão confiável e compartilhará o seu IP com esse servidor. Você também pode configurar isso nas Configurações"; -"call_no_stun_server_error_use_fallback_button" = "Tente usar %@"; +"camera_unavailable" = "A câmera está indisponível em seu dispositivo"; +"call_no_stun_server_error_message_2" = "Alternativamente, você pode tentar usar o servidor público em %@, mas isto não vai ser tão confiável, e vai compartilhar seu endereço de IP com esse servidor. Você também pode gerenciar isto em Configurações"; +"call_no_stun_server_error_use_fallback_button" = "Tentar usar %@"; // Widget -"widget_no_integrations_server_configured" = "O gerenciador de integrações não está configurado"; -"widget_integrations_server_failed_to_connect" = "Falha ao conectar-se no servidor de integrações"; +"widget_no_integrations_server_configured" = "Nenhum servidor de integrações configurado"; +"widget_integrations_server_failed_to_connect" = "Falha para conectar-se a servidor de integrações"; "widget_menu_refresh" = "Recarregar"; -"widget_menu_open_outside" = "Abrir no navegador"; -"widget_menu_revoke_permission" = "Remover para mim"; -"widget_menu_remove" = "Remover para todos"; +"widget_menu_open_outside" = "Abrir em browser"; +"widget_menu_revoke_permission" = "Revogar acesso para mim"; +"widget_menu_remove" = "Remover para todas as pessoas"; // Widget Picker "widget_picker_title" = "Integrações"; "widget_picker_manage_integrations" = "Gerenciar integrações…"; // Room widget permissions -"room_widget_permission_title" = "Carregar widget"; -"room_widget_permission_creator_info_title" = "Widget adicionado por:"; -"room_widget_permission_webview_information_title" = "A sua utilização pode definir cookies e compartilhar dados com %@:↵\n"; -"room_widget_permission_information_title" = "A sua utilização pode compartilhar dados com %@:↵\n"; -"room_widget_permission_user_id_permission" = "Sua ID de usuário"; +"room_widget_permission_title" = "Carregar Widget"; +"room_widget_permission_creator_info_title" = "Este widget foi adicionado por:"; +"room_widget_permission_webview_information_title" = "Usá-lo pode definir cookies e compartilhar dados com %@:\n"; +"room_widget_permission_information_title" = "Usá-lo pode compartilhar dados com %@:\n"; +"room_widget_permission_user_id_permission" = "Sua ID de usuária(o)"; "room_widget_permission_theme_permission" = "Seu tema"; -"room_widget_permission_widget_id_permission" = "ID do widget"; -"room_widget_permission_room_id_permission" = "ID da sala"; +"room_widget_permission_widget_id_permission" = "ID de widget"; +"room_widget_permission_room_id_permission" = "ID de sala"; // Service terms -"service_terms_modal_title" = "Termos de serviço"; -"service_terms_modal_message" = "Para continuar, você precisa aceitar os termos de serviço (%@)."; +"service_terms_modal_title" = "Termos De Serviço"; +"service_terms_modal_message" = "Para continuar você precisa aceitar os termos deste serviço (%@)."; "service_terms_modal_accept_button" = "Aceitar"; -"service_terms_modal_decline_button" = "Recusar"; +"service_terms_modal_decline_button" = "Declinar"; // Service terms - Variant for identity server when displayed out of a context -"service_terms_modal_title_identity_server" = "Encontrar contatos"; +"service_terms_modal_title_identity_server" = "Descoberta de contatos"; "service_terms_modal_message_identity_server" = "Aceite os termos do servidor de identidade (%@) para descobrir contatos."; "service_terms_modal_policy_checkbox_accessibility_hint" = "Marque para aceitar %@"; -"secure_key_backup_setup_intro_title" = "Backup online"; -"secure_key_backup_setup_intro_info" = "Previna-se contra a perda de acesso a mensagens e dados criptografados, fazendo backup das chaves de criptografia no seu servidor."; -"secure_key_backup_setup_intro_use_security_key_title" = "Use uma Chave de Segurança"; -"secure_key_backup_setup_intro_use_security_key_info" = "Gere uma chave de segurança para armazenar num lugar seguro, como um gerenciador de senhas ou um cofre."; -"secure_key_backup_setup_intro_use_security_passphrase_title" = "Use uma Frase de Segurança"; -"secure_key_backup_setup_intro_use_security_passphrase_info" = "Digite uma frase secreta que só você conhece, e gere uma chave para backup."; -"secure_key_backup_setup_existing_backup_error_title" = "Já existe um backup de mensagens"; -"secure_key_backup_setup_existing_backup_error_info" = "Desbloqueie-o para reutilizá-lo no backup online ou exclua-o para criar um novo backup de mensagens no backup online."; -"key_backup_setup_intro_setup_connect_action_with_existing_backup" = "Autorize este aparelho a fazer o backup de chaves"; -"device_verification_incoming_description_1" = "Confirme se esta sessão é sua. Confirmar sessões fornece segurança adicional, ao usar mensagens criptografadas de ponta a ponta."; -"device_verification_incoming_description_2" = "Se você confirmar essa sessão, você também a tornará confirmada para o seu contato."; +"secure_key_backup_setup_intro_title" = "Backup Seguro"; +"secure_key_backup_setup_intro_info" = "Salvaguardar-se contra perda de acesso a mensagens & dados encriptados ao fazer backup de chaves de encriptação em seu servidor."; +"secure_key_backup_setup_intro_use_security_key_title" = "Usar uma Chave de Segurança"; +"secure_key_backup_setup_intro_use_security_key_info" = "Gere uma chave de segurança para armazenar em algum lugar seguro como um gerenciador de senhas ou um cofre."; +"secure_key_backup_setup_intro_use_security_passphrase_title" = "Usar uma Frase de Segurança"; +"secure_key_backup_setup_intro_use_security_passphrase_info" = "Entre uma frase secreta que somente você conhece, e gere uma chave para backup."; +"secure_key_backup_setup_existing_backup_error_title" = "Um backup para mensagens já existe"; +"secure_key_backup_setup_existing_backup_error_info" = "Destranque-o para reusá-lo no backup seguro ou delete-o para criar um novo backup de mensagens no backup seguro."; +"key_backup_setup_intro_setup_connect_action_with_existing_backup" = "Conectar este dispositivo a Backup de Chave"; +"device_verification_incoming_description_1" = "Verifique esta sessão para marcá-la como confiada. Confiar em sessões de parceiras(os) dá a você paz de mente extra quando usando mensagens encriptadas ponta-a-ponta."; +"device_verification_incoming_description_2" = "Verificar esta sessão vai marcá-la como confiada, e também marcar sua sessão como confiada para a/o parceira(o)."; // MARK: Start -"device_verification_start_title" = "Confirmar comparando um texto curto"; -"device_verification_start_use_legacy" = "Não aparece nada? Nem todos os clientes suportam a confirmação interativa. Use a confirmação tradicional."; -"device_verification_start_verify_button" = "Iniciar a confirmação"; -"device_verification_start_use_legacy_action" = "Use a confirmação tradicional"; +"device_verification_start_title" = "Verificar ao comparar um string de texto curto"; +"device_verification_start_use_legacy" = "Nada aparecendo? Não todos os clientes suportam verificação interativa ainda. Use verificação legado."; +"device_verification_start_verify_button" = "Começar a Verificar"; +"device_verification_start_use_legacy_action" = "Usar Verificação Legado"; // New login "device_verification_self_verify_alert_title" = "Novo login. Foi você?"; -"device_verification_self_verify_alert_validate_action" = "Confirmar"; -"device_verification_self_verify_start_verify_action" = "Iniciar a confirmação"; -"device_verification_self_verify_start_information" = "Use esta sessão para confirmar a sua nova sessão, dando a ela acesso às mensagens criptografadas."; -"key_verification_self_verify_current_session_alert_title" = "Confirmar esta sessão"; +"device_verification_self_verify_alert_validate_action" = "Verificar"; +"device_verification_self_verify_start_verify_action" = "Começar verificação"; +"device_verification_self_verify_start_information" = "Use esta sessão para verificar sua nova, garantindo-lhe acesso a mensagens encriptadas."; +"key_verification_self_verify_current_session_alert_title" = "Verificar esta sessão"; "key_verification_self_verify_current_session_alert_message" = "Outros usuários podem não confiar nela."; "key_verification_self_verify_current_session_alert_validate_action" = "Confirmar"; "key_verification_self_verify_unverified_sessions_alert_title" = "Revisar onde você está logado"; @@ -1161,8 +1161,8 @@ "biometrics_cant_unlocked_alert_message_login" = "Entrar novamente"; "biometrics_cant_unlocked_alert_message_retry" = "Tentar novamente"; "pin_protection_kick_user_alert_message" = "Muitos erros, vocês foi desconectada/o"; -"room_details_advanced_e2e_encryption_disabled_for_dm" = "A criptografia não está ativada nesta sala."; -"room_details_advanced_e2e_encryption_enabled_for_dm" = "A criptografia está ativada nesta sala"; +"room_details_advanced_e2e_encryption_disabled_for_dm" = "Encriptação não está ativada aqui."; +"room_details_advanced_e2e_encryption_enabled_for_dm" = "Encriptação está ativada aqui"; "room_details_advanced_room_id_for_dm" = "ID:"; "room_details_no_local_addresses_for_dm" = "Isto não tem nenhum endereço local"; "room_details_access_section_directory_toggle_for_dm" = "Listar em diretório de salas"; @@ -1256,7 +1256,7 @@ "invite_friends_action" = "Convidar amigos para o %@"; "pin_protection_settings_change_pin" = "Alterar o PIN"; "pin_protection_confirm_pin_to_change" = "Confirme o PIN para alterá-lo"; -"bug_report_background_mode" = "Continuar em segundo plano"; +"bug_report_background_mode" = "Continuar em background"; "social_login_button_title_sign_up" = "Registrar-Se com %@"; "social_login_button_title_sign_in" = "Fazer Signin com %@"; "social_login_button_title_continue" = "Continuar com %@"; @@ -1274,7 +1274,7 @@ "call_transfer_contacts_all" = "Todos"; "call_transfer_contacts_recent" = "Recente"; "call_transfer_users" = "Pessoas"; -"event_formatter_call_has_ended" = "Encerrou %@"; +"event_formatter_call_has_ended" = "Terminou %@"; "room_intro_cell_information_multiple_dm_sentence2" = "Somente vocês estão nesta conversa, ao menos até que convidem alguém para participar."; "room_intro_cell_information_dm_sentence2" = "Apenas vocês dois/duas estão nesta conversa, ninguém mais pode entrar."; "room_intro_cell_information_dm_sentence1_part3" = ". "; @@ -1299,7 +1299,7 @@ "dialpad_title" = "Teclado de discagem"; "call_actions_unhold" = "Retomar"; "event_formatter_call_back" = "Ligar de volta"; -"event_formatter_call_you_declined" = "Você recusou esta chamada"; +"event_formatter_call_you_declined" = "Você declinou esta chamada"; "event_formatter_call_you_currently_in" = "Chamada ativa"; "event_formatter_call_video" = "Chamada de vídeo"; "event_formatter_call_voice" = "Chamada de voz"; From 1c10443cb36c352a61d67960d47b23a3f83f607c Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Thu, 17 Jun 2021 21:29:47 +0000 Subject: [PATCH 373/393] Translated using Weblate (Portuguese (Brazil)) Currently translated at 98.4% (1214 of 1233 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/ --- Riot/Assets/pt_BR.lproj/Vector.strings | 94 +++++++++++++------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index b72c6685e..7ec83aa59 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -566,7 +566,7 @@ "settings_key_backup_info" = "Mensagens encriptadas são asseguradas com encriptação ponta-a-ponta. Somente você e a(s)/o(s) recipiente(s) têm as chaves para ler estas mensagens."; "settings_key_backup_info_checking" = "Checando…"; "settings_key_backup_info_none" = "Backup de suas chaves não está sendo feito desta sessão."; -"settings_key_backup_info_signout_warning" = "Conecte esta sessão a backup de chave antes de fazer signout para evitar perder quaisquer chaves que podem somente estar neste dispositivo."; +"settings_key_backup_info_signout_warning" = "Faça backup de suas chaves antes de fazer signout para evitar perdê-las."; "settings_key_backup_info_version" = "Versão de Backup de Chave: %@"; "settings_key_backup_info_algorithm" = "Algoritmo: %@"; "settings_key_backup_info_valid" = "Esta sessão está fazendo backup de suas chaves."; @@ -588,7 +588,7 @@ "room_does_not_exist" = "%@ não existe"; // Key backup wrong version "e2e_key_backup_wrong_version_title" = "Novo Backup de Chave"; -"e2e_key_backup_wrong_version" = "Um novo backup de chave de mensagem segura tem sido detectado.\n\nSe isto não foi você, defina uma nova frasepasse em Configurações."; +"e2e_key_backup_wrong_version" = "Um novo backup de chave de mensagem segura tem sido detectado.\n\nSe isto não foi você, defina uma nova Frase de Segurança em Configurações."; "e2e_key_backup_wrong_version_button_settings" = "Configurações"; "e2e_key_backup_wrong_version_button_wasme" = "Foi eu"; "key_backup_setup_title" = "Backup de Chave"; @@ -601,46 +601,46 @@ "key_backup_setup_intro_setup_action_with_existing_backup" = "Usar Backup de Chave"; "key_backup_setup_intro_manual_export_info" = "(Avançada)"; "key_backup_setup_intro_manual_export_action" = "Exportar chaves manualmente"; -"key_backup_setup_passphrase_title" = "Assegure seu backup com uma Frasepasse"; -"key_backup_setup_passphrase_info" = "Nós vamos armazenar uma cópia encriptada de suas chaves em nosso servidor. Proteja seu backup com uma frasepasse para mantê-lo seguro.\n\nPara segurança máxima, esta deveria ser diferente da senha de sua conta."; +"key_backup_setup_passphrase_title" = "Assegure seu backup com uma Frase de Segurança"; +"key_backup_setup_passphrase_info" = "Nós vamos armazenar uma cópia encriptada de suas chaves em nosso servidor. Proteja seu backup com uma frase para mantê-lo seguro.\n\nPara segurança máxima, esta deveria ser diferente da senha de sua conta."; "key_backup_setup_passphrase_passphrase_title" = "Entrar"; -"key_backup_setup_passphrase_passphrase_placeholder" = "Entrar frasepasse"; +"key_backup_setup_passphrase_passphrase_placeholder" = "Entrar frase"; "key_backup_setup_passphrase_passphrase_valid" = "Ótimo!"; "key_backup_setup_passphrase_passphrase_invalid" = "Tente adicionar uma palavra"; "key_backup_setup_passphrase_confirm_passphrase_title" = "Confirmar"; -"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Confirmar frasepasse"; +"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Confirmar frase"; "key_backup_setup_passphrase_confirm_passphrase_valid" = "Ótimo!"; -"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Frasepasse não corresponde"; -"key_backup_setup_passphrase_set_passphrase_action" = "Definir Frasepasse"; -"key_backup_setup_passphrase_setup_recovery_key_info" = "Ou, assegure seu backup com uma Chave de Recuperação, salvando-a em algum lugar seguro."; -"key_backup_setup_passphrase_setup_recovery_key_action" = "(Avançado) Configurar com Chave de Recuperação"; +"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Frase não corresponde"; +"key_backup_setup_passphrase_set_passphrase_action" = "Definir Frase"; +"key_backup_setup_passphrase_setup_recovery_key_info" = "Ou, assegure seu backup com uma Chave de Segurança, salvando-a em algum lugar seguro."; +"key_backup_setup_passphrase_setup_recovery_key_action" = "(Avançada) Configurar com Chave de Segurança"; "key_backup_setup_success_title" = "Sucesso!"; // Success from passphrase -"key_backup_setup_success_from_passphrase_info" = "Backup de suas chaves está sendo feito.\n\nSua chave de recuperação é uma rede de segurança - você pode usá-la para restaurar acesso a suas mensagens encriptadas se você esquecer sua frasepasse.\n\nMantenha sua chave de recuperação em algum lugar muito seguro, como um gerenciador de senhas (ou um cofre)."; -"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Salvar Chave de Recuperação"; +"key_backup_setup_success_from_passphrase_info" = "Backup de suas chaves está sendo feito.\n\nSua Chave de Segurança é uma rede de segurança - você pode usá-la para restaurar acesso a suas mensagens encriptadas se você esquecer sua frasepasse.\n\nMantenha sua Chave de Segurança em algum lugar muito seguro, como um gerenciador de senhas (ou um cofre)."; +"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Salvar Chave de Segurança"; "key_backup_setup_success_from_passphrase_done_action" = "Feito"; // Success from recovery key -"key_backup_setup_success_from_recovery_key_info" = "Backup de suas chaves está sendo feito.\n\nFaça uma cópia desta chave de recuperação e mantenha-a segura."; -"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Chave de Recuperação"; +"key_backup_setup_success_from_recovery_key_info" = "Backup de suas chaves está sendo feito.\n\nFaça uma cópia desta Chave de Segurança e mantenha-a segura."; +"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Chave de Segurança"; "key_backup_setup_success_from_recovery_key_make_copy_action" = "Fazer uma Cópia"; "key_backup_setup_success_from_recovery_key_made_copy_action" = "Eu tenho feito uma cópia"; "key_backup_recover_title" = "Mensagens Seguras"; -"key_backup_recover_invalid_passphrase_title" = "Frasepasse de Recuperação Incorreta"; -"key_backup_recover_invalid_passphrase" = "Backup não pôde ser decriptado com esta frasepasse: por favor verifique que você entrou a frasepasse de recuperação correta."; -"key_backup_recover_invalid_recovery_key_title" = "Disparidade de Chave de Recuperação"; -"key_backup_recover_invalid_recovery_key" = "Backup não pôde ser decriptografado com esta chave: por favor verifique que você entrou a chave de recuperação correta."; -"key_backup_recover_from_passphrase_info" = "Use sua frasepasse de recuperação para destrancar seu histórico de mensagens seguras"; +"key_backup_recover_invalid_passphrase_title" = "Frase de Segurança Incorreta"; +"key_backup_recover_invalid_passphrase" = "Backup não pôde ser decriptado com esta frase: por favor verifique que você entrou a Frase de Segurança correta."; +"key_backup_recover_invalid_recovery_key_title" = "Disparidade de Chave de Segurança"; +"key_backup_recover_invalid_recovery_key" = "Backup não pôde ser decriptografado com esta chave: por favor verifique que você entrou a Chave de Segurança correta."; +"key_backup_recover_from_passphrase_info" = "Use sua Frase de Segurança para destrancar seu histórico de mensagens seguras"; "key_backup_recover_from_passphrase_passphrase_title" = "Entrar"; -"key_backup_recover_from_passphrase_passphrase_placeholder" = "Entrar Frasepasse"; +"key_backup_recover_from_passphrase_passphrase_placeholder" = "Entrar Frase"; "key_backup_recover_from_passphrase_recover_action" = "Destrancar Histórico"; -"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Não sabe sua frasepasse de recuperação? Você pode "; -"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "usar sua chave de recuperação"; +"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Não sabe sua Frase de Segurança? Você pode "; +"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "usar sua Chave de Segurança"; "key_backup_recover_from_passphrase_lost_passphrase_action_part3" = "."; -"key_backup_recover_from_recovery_key_info" = "Use sua chave de recuperação para destrancar seu histórico de mensagens seguras"; +"key_backup_recover_from_recovery_key_info" = "Use sua Chave de Segurança para destrancar seu histórico de mensagens seguras"; "key_backup_recover_from_recovery_key_recovery_key_title" = "Entrar"; -"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Entrar Chave de Recuperação"; +"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Entrar Chave de Segurança"; "key_backup_recover_from_recovery_key_recover_action" = "Destrancar Histórico"; -"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Perdeu sua chave de recuperação? Você pode configurar uma nova em configurações."; +"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Perdeu sua Chave de Segurança? Você pode configurar uma nova em configurações."; "key_backup_recover_success_info" = "Backup Restaurado!"; "key_backup_recover_done_action" = "Feito"; "key_backup_setup_banner_title" = "Nunca perca mensagens criptografadas"; @@ -790,9 +790,9 @@ "security_settings_crosssigning_info_not_bootstrapped" = "Assinatura cruzada não está ainda configurada."; "security_settings_crosssigning_info_exists" = "Sua conta tem uma identidade de assinatura cruzada, mas ainda não é confiada por esta sessão. Complete segurança desta sessão."; "security_settings_crosssigning_info_trusted" = "Assinatura cruzada está ativada. Você pode confiar em outras(os) usuárias(os) e suas outras sessões baseada(o) em assinatura cruzada mas você não pode fazer assinar cruzado desta sessão porque ela não tem chaves privadas de assinatura cruzada. Complete segurança desta sessão."; -"security_settings_crosssigning_info_ok" = "Assinatura cruzada está ativada."; -"security_settings_crosssigning_bootstrap" = "Fazer bootstrap de assinatura cruzada"; -"security_settings_crosssigning_reset" = "Resettar assinatura cruzada"; +"security_settings_crosssigning_info_ok" = "Assinatura cruzada está pronta para uso."; +"security_settings_crosssigning_bootstrap" = "Configurar"; +"security_settings_crosssigning_reset" = "Resettar"; "identity_server_settings_disconnect_info" = "Desconectar-se de seu servidor de identidade vai significar que você não vai ser descobertável por outras(os) usuárias(os) e ser capaz de convidar outras(os) por email ou telefone."; "identity_server_settings_alert_disconnect_still_sharing_3pid" = "Você ainda está compartilhando seus dados pessoais no servidor de identidade %@.\n\nNós recomendamos que você remova seus endereços de email e números de telefone do servidor de identidade antes de se desconectar."; "call_no_stun_server_error_title" = "Chamada falhou devido a servidor malconfigurado"; @@ -807,8 +807,8 @@ "key_verification_bootstrap_not_setup_message" = "Você precisa fazer a autoverificação em primeiro lugar."; "user_verification_sessions_list_user_trust_level_warning_title" = "Atenção"; "user_verification_sessions_list_information" = "As mensagens com este usuário nesta sala estão criptografadas de ponta a ponta e não podem ser lidas por terceiros."; -"secrets_recovery_with_passphrase_information_default" = "Digite a sua senha de recuperação para acessar o seu histórico de mensagens seguras e a sua identidade autoverificada para confirmar outras sessões."; -"secrets_recovery_with_key_information_default" = "Digite a sua chave de recuperação para acessar o seu histórico de mensagens seguras e para confirmar outras sessões com sua identidade autoverificada."; +"secrets_recovery_with_passphrase_information_default" = "Acesse seu histórico de mensagens seguras e sua identidade de assinatura cruzada para verificar outras sessões ao entrar sua Frase de Segurança."; +"secrets_recovery_with_key_information_default" = "Acesse seu histórico de mensagens seguras e sua identidade de assinatura cruzada para verificar outras sessões ao entrar sua Chave de Segurança."; "secrets_setup_recovery_key_done_action" = "Fechar"; "secrets_setup_recovery_passphrase_validate_action" = "Fechar"; "pin_protection_settings_enabled_forced" = "PIN ativado"; @@ -876,10 +876,10 @@ "security_settings_crypto_sessions" = "MINHAS SESSÕES"; "security_settings_crypto_sessions_loading" = "Carregando sessões…"; "security_settings_secure_backup" = "BACKUP SEGURO"; -"security_settings_secure_backup_description" = "Salvaguardar-se contra perda de acesso a mensagens & dados encriptados ao fazer backup de chaves de encriptação em seu servidor."; +"security_settings_secure_backup_description" = "Faça backup de suas chaves de decriptação em caso você perca acesso a suas sessões. Suas chaves vão estar asseguradas com uma Chave de Segurança única."; "security_settings_secure_backup_setup" = "Configurar"; "security_settings_secure_backup_synchronise" = "Sincronizar"; -"security_settings_secure_backup_delete" = "Deletar"; +"security_settings_secure_backup_delete" = "Deletar Backup"; "security_settings_backup" = "BACKUP DE MENSAGEM"; "security_settings_crosssigning_complete_security" = "Completar segurança"; "security_settings_cryptography" = "CRIPTOGRAFIA"; @@ -974,8 +974,8 @@ "device_verification_self_verify_wait_title" = "Concluir segurança"; "device_verification_self_verify_wait_new_sign_in_title" = "Confirmar este login"; "device_verification_self_verify_wait_information" = "Confirme esta sessão a partir de uma de suas outras sessões, concedendo acesso às mensagens criptografadas.↵\n↵\nUse o Element mais recente em seus outros aparelhos:"; -"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Usar chave de recuperação"; -"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Use a chave de recuperação, ou a frase de recuperação"; +"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Usar Chave de Segurança"; +"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Usar Chave ou Frase de Segurança"; "device_verification_self_verify_wait_recover_secrets_additional_information" = "Se você não tem acesso a uma sessão existente"; "key_verification_verify_sas_title_number" = "Comparar números"; "key_verification_verify_sas_cancel_action" = "Não correspondem"; @@ -1103,25 +1103,25 @@ "user_verification_session_details_information_untrusted_current_user" = "Confirme esta sessão para marcá-la como confiável e conceder a ela acesso a mensagens criptografadas:"; "user_verification_session_details_information_untrusted_other_user" = " ·entrou usando uma nova sessão:"; "user_verification_session_details_additional_information_untrusted_current_user" = "Se você não fez login nesta sessão, sua conta pode estar comprometida."; -"secrets_recovery_with_passphrase_title" = "Frase secreta de recuperação"; -"secrets_recovery_with_passphrase_information_verify_device" = "Use sua frase secreta de recuperação para confirmar este aparelho."; +"secrets_recovery_with_passphrase_title" = "Frase de Segurança"; +"secrets_recovery_with_passphrase_information_verify_device" = "Use sua Frase de Segurança para verificar este dispositivo."; "secrets_recovery_with_passphrase_passphrase_title" = "Digite"; -"secrets_recovery_with_passphrase_passphrase_placeholder" = "Digite a senha de recuperação"; -"secrets_recovery_with_passphrase_recover_action" = "Use a frase secreta"; -"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Não sabe sua frase de recuperação? Você pode· "; -"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "use sua chave de recuperação"; +"secrets_recovery_with_passphrase_passphrase_placeholder" = "Entrar Frase de Segurança"; +"secrets_recovery_with_passphrase_recover_action" = "Usar Frase"; +"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Não sabe sua Frase de Segurança? Você pode "; +"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "usar sua Chave de Segurança"; "secrets_recovery_with_passphrase_lost_passphrase_action_part3" = "."; "secrets_recovery_with_passphrase_invalid_passphrase_title" = "Não foi possível acessar o armazenamento secreto"; -"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Verifique se você digitou a frase de recuperação correta."; -"secrets_recovery_with_key_title" = "Chave de recuperação"; -"secrets_recovery_with_key_information_verify_device" = "Use sua chave de recuperação para confirmar este aparelho."; +"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Por favor verifique que você entrou a Frase de Segurança correta."; +"secrets_recovery_with_key_title" = "Chave de Segurança"; +"secrets_recovery_with_key_information_verify_device" = "Use sua Chave de Segurança para verificar este dispositivo."; "secrets_recovery_with_key_recovery_key_title" = "Digite"; -"secrets_recovery_with_key_recovery_key_placeholder" = "Digite a chave de recuperação"; +"secrets_recovery_with_key_recovery_key_placeholder" = "Entrar Chave de Segurança"; "secrets_recovery_with_key_recover_action" = "Usar chave"; "secrets_recovery_with_key_invalid_recovery_key_title" = "Não foi possível acessar o armazenamento secreto"; -"secrets_recovery_with_key_invalid_recovery_key_message" = "Verifique se você digitou a chave de recuperação correta."; +"secrets_recovery_with_key_invalid_recovery_key_message" = "Por favor verifique que você entrou a Chave de Segurança correta."; "secrets_setup_recovery_key_title" = "Salve a sua chave de segurança"; -"secrets_setup_recovery_key_information" = "Guarde sua chave de recuperação em um lugar seguro. Ela pode ser usada para desbloquear suas mensagens e dados criptografados."; +"secrets_setup_recovery_key_information" = "Armazene sua Chave de Segurança em algum lugar seguro. Ela pode ser usada para destrancar suas mensagens & dados encriptados."; "secrets_setup_recovery_key_loading" = "Acessar…"; "secrets_setup_recovery_key_export_action" = "Salvar"; "secrets_setup_recovery_key_storage_alert_title" = "Guarde num lugar seguro"; @@ -1131,7 +1131,7 @@ "secrets_setup_recovery_passphrase_additional_information" = "Não use a senha da sua conta."; "secrets_setup_recovery_passphrase_confirm_information" = "Digite sua frase de segurança novamente para confirmá-la."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Confirmar"; -"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Confirme a frase secreta"; +"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Confirmar frase"; "cross_signing_setup_banner_title" = "Configurar a criptografia"; "cross_signing_setup_banner_subtitle" = "Confirme seus outros aparelhos com mais facilidade"; "major_update_title" = "Riot agora é Element"; From d48a1d56212cd2216a40cb3c930c744eef8b33a7 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Thu, 17 Jun 2021 21:35:15 +0000 Subject: [PATCH 374/393] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (1233 of 1233 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/ --- Riot/Assets/pt_BR.lproj/Vector.strings | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index 7ec83aa59..f578675a9 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -1353,3 +1353,30 @@ "event_formatter_call_you_missed" = "Você perdeu esta chamada"; "event_formatter_call_ringing" = "Tocando…"; "event_formatter_call_connecting" = "Conectando…"; +"side_menu_app_version" = "Versão %@"; +"side_menu_action_feedback" = "Feedback"; +"side_menu_action_help" = "Ajuda"; +"side_menu_action_settings" = "Configurações"; +"side_menu_action_invite_friends" = "Convidar amigas(os)"; + +// Mark: - Side menu + +"side_menu_reveal_action_accessibility_label" = "Painel esquerdo"; +"user_avatar_view_accessibility_hint" = "Mudar avatar de usuária(o)"; + +// Mark: - User avatar view + +"user_avatar_view_accessibility_label" = "avatar"; +"secrets_recovery_with_key_information_unlock_secure_backup_with_key" = "Entre sua Chave de Segurança para continuar."; +"secrets_recovery_with_key_information_unlock_secure_backup_with_phrase" = "Entre sua Frase de Segurança para continuar."; + +// Success from secure backup +"key_backup_setup_success_from_secure_backup_info" = "Backup de suas chaves está sendo feito."; +"security_settings_secure_backup_restore" = "Restaurar de Backup"; +"security_settings_secure_backup_reset" = "Resettar"; +"security_settings_secure_backup_info_valid" = "Esta sessão está fazendo backup de suas chaves."; +"security_settings_secure_backup_info_checking" = "Checando…"; +"settings_ui_theme_picker_message_match_system_theme" = "\"Auto\" corresponde ao tema de sistema de seu dispositivo"; +"settings_ui_theme_picker_message_invert_colours" = "\"Auto\" usa as configurações \"Inverter Cores\" de seu dispositivo"; +"room_recents_unknown_room_error_message" = "Não dá para encontrar esta sala. Assegure que ela existe"; +"room_creation_dm_error" = "Nós não conseguimos criar sua DM. Por favor cheque as/os usuárias(os) que você quer convidar e tente de novo."; From 4a1ba11da3138a2887907ece6e620b0750e3cf23 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Thu, 17 Jun 2021 23:05:57 +0000 Subject: [PATCH 375/393] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (1233 of 1233 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/ --- Riot/Assets/pt_BR.lproj/Vector.strings | 356 ++++++++++++------------- 1 file changed, 178 insertions(+), 178 deletions(-) diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index f578675a9..488e493fa 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -693,7 +693,7 @@ "device_verification_security_advice_number" = "Compare os números, garantindo que eles aparecem na mesma ordem."; "device_verification_cancelled_by_me" = "A verificação tem sido cancelada. Razão: %@"; "device_verification_error_cannot_load_device" = "Não dá para carregar informação de sessão."; -"major_update_information" = "Estamos felizes em anunciar que mudamos de nome! Seu aplicativo está atualizado e você está conectado à sua conta."; +"major_update_information" = "Nós estamos animados em anunciar que nós temos mudado de nome! Seu app está atualizado e você está com signin feito a sua conta."; "room_action_camera" = "Tirar foto ou vídeo"; "room_accessibility_call" = "Chamar"; "media_type_accessibility_video" = "Vídeo"; @@ -734,13 +734,13 @@ "device_verification_incoming_title" = "Requisição de Verificação Recebendo"; "device_verification_start_wait_partner" = "Esperando por parceira(o) aceitar…"; "device_verification_self_verify_start_waiting" = "Esperando…"; -"device_verification_verify_wait_partner" = "Aguardando seu contato confirmar…"; -"key_verification_tile_request_status_waiting" = "Aguardando…"; +"device_verification_verify_wait_partner" = "Esperando por parceira(o) confirmar…"; +"key_verification_tile_request_status_waiting" = "Esperando…"; // Scanning -"key_verification_scan_confirmation_scanning_title" = "Quase lá! Aguardando a confirmação…"; -"key_verification_scan_confirmation_scanning_user_waiting_other" = "Aguardando %@…"; -"key_verification_scan_confirmation_scanning_device_waiting_other" = "Aguardando o outro aparelho…"; -"user_verification_start_waiting_partner" = "Aguardando %@…"; +"key_verification_scan_confirmation_scanning_title" = "Quase lá! Esperando por confirmação…"; +"key_verification_scan_confirmation_scanning_user_waiting_other" = "Esperando por %@…"; +"key_verification_scan_confirmation_scanning_device_waiting_other" = "Esperando por outro dispositivo…"; +"user_verification_start_waiting_partner" = "Esperando por %@…"; "settings_devices_description" = "O nome público de uma sessão é visível para pessoas com quem você se comunica"; "security_settings_crypto_sessions_description_2" = "Se você não reconhece um login, mude sua senha e resette Backup Seguro."; "security_settings_export_keys_manually" = "Exportar chaves manualmente"; @@ -753,25 +753,25 @@ "room_widget_permission_display_name_permission" = "Seu nome de exibição"; "device_verification_security_advice_emoji" = "Compare os emoji únicos, garantindo que eles aparecem na mesma ordem."; "device_verification_self_verify_alert_message" = "Verifique o novo login acessando sua conta: %@"; -"key_verification_verify_sas_title_emoji" = "Compare os emojis"; -"key_verification_manually_verify_device_title" = "Confirme manualmente por texto"; +"key_verification_verify_sas_title_emoji" = "Comparar emoji"; +"key_verification_manually_verify_device_title" = "Verificar Manualmente por Texto"; "device_verification_emoji_scissors" = "Tesoura"; "device_verification_emoji_guitar" = "Guitarra"; -"emoji_picker_people_category" = "Sorrisos e pessoas"; -"emoji_picker_nature_category" = "Animais e natureza"; -"emoji_picker_foods_category" = "Comidas e bebidas"; +"emoji_picker_people_category" = "Smileys & Pessoas"; +"emoji_picker_nature_category" = "Animais & Natureza"; +"emoji_picker_foods_category" = "Comida & Bebida"; "emoji_picker_activity_category" = "Atividades"; -"emoji_picker_places_category" = "Viagem e lugares"; +"emoji_picker_places_category" = "Viagem & Lugares"; "emoji_picker_objects_category" = "Objetos"; "emoji_picker_symbols_category" = "Símbolos"; "emoji_picker_flags_category" = "Bandeiras"; -"key_verification_verify_qr_code_scan_code_action" = "Escanear o código do seu contato"; +"key_verification_verify_qr_code_scan_code_action" = "Scannar código dela(e)"; // Scanned "key_verification_scan_confirmation_scanned_title" = "Quase lá!"; -"user_verification_session_details_additional_information_untrusted_other_user" = "Até que este usuário confirme esta sessão, as mensagens enviadas para e a partir dela são rotuladas com alertas. Como alternativa, você pode confirmá-la manualmente."; -"user_verification_session_details_verify_action_current_user" = "Confirmem interativamente"; -"user_verification_session_details_verify_action_current_user_manually" = "Confirme manualmente por texto"; -"user_verification_session_details_verify_action_other_user" = "Confirmar manualmente"; +"user_verification_session_details_additional_information_untrusted_other_user" = "Até que esta(e) usuária(o) confie nesta sessão, mensagens enviadas para e desde ela são etiquetadas com avisos. Alternativamente, você pode verificá-la manualmente."; +"user_verification_session_details_verify_action_current_user" = "Verificar Interativamente"; +"user_verification_session_details_verify_action_current_user_manually" = "Verificar Manualmente por Texto"; +"user_verification_session_details_verify_action_other_user" = "Verificar manualmente"; "auth_add_email_phone_message_2" = "Defina um email para recuperação de conta. Use depois email ou telefone para ser opcionalmente descobertável por pessoas que conhecem você."; "auth_email_is_required" = "Nenhum servidor de identidade está configurado então você não pode adicionar um endereço de email a fim de resettar sua senha no futuro."; "auth_softlogout_clear_data_message_1" = "Aviso: Seus dados pessoais (incluindo chaves de encriptação) ainda estão armazenados neste dispositivo."; @@ -799,24 +799,24 @@ "widget_integration_manager_disabled" = "Você precisa ativar Gerenciador de Integração em configurações"; "service_terms_modal_description_for_identity_server_1" = "Encontrar outras(os) por telefone ou email"; "service_terms_modal_description_for_identity_server_2" = "Ser encontrada(o) por telefone ou email"; -"device_verification_self_verify_wait_additional_information" = "Isso funciona no Element e em outros clientes da Matrix capazes de fazer autoverificação."; -"key_verification_verified_user_information" = "As mensagens com este usuário estão criptografadas de ponta a ponta e não podem ser lidas por terceiros."; -"device_verification_emoji_smiley" = "Sorriso"; +"device_verification_self_verify_wait_additional_information" = "Isto funciona com Element e outros clientes Matrix capazes de assinatura cruzada."; +"key_verification_verified_user_information" = "Mensagens com esta(e) usuária(o) são encriptadas ponta-a-ponta e não podem ser lidas por terceiros."; +"device_verification_emoji_smiley" = "Smiley"; // Generic errors -"error_invite_3pid_with_no_identity_server" = "Adicionar um servidor de identidade nas suas configurações para convidar por e-mail."; -"key_verification_bootstrap_not_setup_message" = "Você precisa fazer a autoverificação em primeiro lugar."; -"user_verification_sessions_list_user_trust_level_warning_title" = "Atenção"; -"user_verification_sessions_list_information" = "As mensagens com este usuário nesta sala estão criptografadas de ponta a ponta e não podem ser lidas por terceiros."; +"error_invite_3pid_with_no_identity_server" = "Adicione um servidor de identidade em suas configurações para convidar por email."; +"key_verification_bootstrap_not_setup_message" = "Você precisa fazer bootstrap de assinatura cruzada primeiro."; +"user_verification_sessions_list_user_trust_level_warning_title" = "Aviso"; +"user_verification_sessions_list_information" = "Mensagens com esta(e) usuária(o) nesta sala são encriptadas ponta-a-ponta e não podem ser lidas por terceiros."; "secrets_recovery_with_passphrase_information_default" = "Acesse seu histórico de mensagens seguras e sua identidade de assinatura cruzada para verificar outras sessões ao entrar sua Frase de Segurança."; "secrets_recovery_with_key_information_default" = "Acesse seu histórico de mensagens seguras e sua identidade de assinatura cruzada para verificar outras sessões ao entrar sua Chave de Segurança."; "secrets_setup_recovery_key_done_action" = "Fechar"; -"secrets_setup_recovery_passphrase_validate_action" = "Fechar"; +"secrets_setup_recovery_passphrase_validate_action" = "Feito"; "pin_protection_settings_enabled_forced" = "PIN ativado"; -"pin_protection_settings_enable_pin" = "Ativar o PIN"; +"pin_protection_settings_enable_pin" = "Ativar PIN"; "biometrics_settings_enable_x" = "Ativar %@"; "biometrics_setup_title_x" = "Ativar %@"; "biometrics_setup_enable_button_title_x" = "Ativar %@"; -"biometrics_cant_unlocked_alert_message_x" = "Para desbloquear, use %@ ou faça login novamente e ative %@ novamente"; +"biometrics_cant_unlocked_alert_message_x" = "Para destrancar, use %@ ou faça login de volta e ative %@ de novo"; // Accessibility "accessibility_checkbox_label" = "checkbox"; // MARK: Clients @@ -966,33 +966,33 @@ "device_verification_self_verify_start_verify_action" = "Começar verificação"; "device_verification_self_verify_start_information" = "Use esta sessão para verificar sua nova, garantindo-lhe acesso a mensagens encriptadas."; "key_verification_self_verify_current_session_alert_title" = "Verificar esta sessão"; -"key_verification_self_verify_current_session_alert_message" = "Outros usuários podem não confiar nela."; -"key_verification_self_verify_current_session_alert_validate_action" = "Confirmar"; -"key_verification_self_verify_unverified_sessions_alert_title" = "Revisar onde você está logado"; -"key_verification_self_verify_unverified_sessions_alert_message" = "Verifique todas as suas sessões para garantir que sua conta e mensagens estão seguras."; +"key_verification_self_verify_current_session_alert_message" = "Outras(os) usuárias(os) podem não confiar nela."; +"key_verification_self_verify_current_session_alert_validate_action" = "Verificar"; +"key_verification_self_verify_unverified_sessions_alert_title" = "Revisar onde você tem sido feito login"; +"key_verification_self_verify_unverified_sessions_alert_message" = "Verifique todas as suas sessões para assegurar que sua conta & mensagens estão seguras."; "key_verification_self_verify_unverified_sessions_alert_validate_action" = "Revisar"; -"device_verification_self_verify_wait_title" = "Concluir segurança"; -"device_verification_self_verify_wait_new_sign_in_title" = "Confirmar este login"; -"device_verification_self_verify_wait_information" = "Confirme esta sessão a partir de uma de suas outras sessões, concedendo acesso às mensagens criptografadas.↵\n↵\nUse o Element mais recente em seus outros aparelhos:"; +"device_verification_self_verify_wait_title" = "Completar segurança"; +"device_verification_self_verify_wait_new_sign_in_title" = "Verificar este login"; +"device_verification_self_verify_wait_information" = "Confirme sua identidade ao verificar este login desde uma de suas outras sessões, garantindo-lhe acesso a mensagens encriptadas.\n\nUse o Element mais recente em seus outros dispositivos:"; "device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Usar Chave de Segurança"; -"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Usar Chave ou Frase de Segurança"; -"device_verification_self_verify_wait_recover_secrets_additional_information" = "Se você não tem acesso a uma sessão existente"; +"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Usar Frase ou Chave de Segurança"; +"device_verification_self_verify_wait_recover_secrets_additional_information" = "Se você não consegue acessar uma sessão existente"; "key_verification_verify_sas_title_number" = "Comparar números"; -"key_verification_verify_sas_cancel_action" = "Não correspondem"; -"key_verification_verify_sas_validate_action" = "Correspondem"; -"key_verification_verify_sas_additional_information" = "Para maior segurança, use outro meio de comunicação confiável ou faça isso pessoalmente."; -"key_verification_manually_verify_device_instruction" = "Compare as seguintes informações com aquelas na sessão do outro usuário e confirme:"; -"key_verification_manually_verify_device_name_title" = "Nome da sessão"; -"key_verification_manually_verify_device_id_title" = "ID da sessão"; -"key_verification_manually_verify_device_key_title" = "Chave da sessão"; -"key_verification_manually_verify_device_additional_information" = "Se eles não corresponderem, a segurança da sua comunicação pode estar comprometida."; -"key_verification_manually_verify_device_validate_action" = "Confirmar"; -"device_verification_verified_title" = "Confirmado!"; -"device_verification_verified_got_it_button" = "Ok, entendi"; -"key_verification_verified_new_session_title" = "Sessão confirmada!"; -"key_verification_verified_other_session_information" = "Agora você poderá ler mensagens seguras em sua outra sessão, e os usuários saberão que podem confiar nela."; -"key_verification_verified_new_session_information" = "Agora você poderá ler mensagens seguras em seu outro aparelho, e os usuários saberão que podem confiar nele."; -"key_verification_verified_this_session_information" = "Agora você poderá ler mensagens seguras neste aparelho, e os usuários saberão que podem confiar nele."; +"key_verification_verify_sas_cancel_action" = "Eles não correspondem"; +"key_verification_verify_sas_validate_action" = "Eles correspondem"; +"key_verification_verify_sas_additional_information" = "Para segurança ótima, use um outro meio de comunicação confiado ou faça isto em pessoa."; +"key_verification_manually_verify_device_instruction" = "Confirme ao comparar o seguinte com as Configurações de Usuária(o) em sua outra sessão:"; +"key_verification_manually_verify_device_name_title" = "Nome de sessão"; +"key_verification_manually_verify_device_id_title" = "ID de sessão"; +"key_verification_manually_verify_device_key_title" = "Chave de sessão"; +"key_verification_manually_verify_device_additional_information" = "Se eles não corresponderem, a segurança de sua comunicação pode estar comprometida."; +"key_verification_manually_verify_device_validate_action" = "Verificar"; +"device_verification_verified_title" = "Verificado!"; +"device_verification_verified_got_it_button" = "Entendido"; +"key_verification_verified_new_session_title" = "Nova sessão verificada!"; +"key_verification_verified_other_session_information" = "Você pode agora ler mensagens seguras em sua outra sessão, e outras(os) usuárias(os) vão saber que elas(es) podem confiar nela."; +"key_verification_verified_new_session_information" = "Você poder agora ler mensagens seguras em seu novo dispositivo, e outras(os) usuárias(os) vão saber que elas(es) podem confiar nele."; +"key_verification_verified_this_session_information" = "Você pode agora ler mensagens seguras neste dispositivo, e outras(os) usuárias(os) vão saber que elas(es) podem confiar nele."; // MARK: Emoji "device_verification_emoji_dog" = "Cachorro"; "device_verification_emoji_cat" = "Gato"; @@ -1011,7 +1011,7 @@ "device_verification_emoji_butterfly" = "Borboleta"; "device_verification_emoji_flower" = "Flor"; "device_verification_emoji_tree" = "Árvore"; -"device_verification_emoji_cactus" = "Cacto"; +"device_verification_emoji_cactus" = "Cactus"; "device_verification_emoji_mushroom" = "Cogumelo"; "device_verification_emoji_globe" = "Globo"; "device_verification_emoji_moon" = "Lua"; @@ -1027,16 +1027,16 @@ "device_verification_emoji_hat" = "Chapéu"; "device_verification_emoji_glasses" = "Óculos"; "device_verification_emoji_spanner" = "Chave inglesa"; -"device_verification_emoji_santa" = "Papai-noel"; +"device_verification_emoji_santa" = "Noel"; "device_verification_emoji_thumbs up" = "Joinha"; -"device_verification_emoji_umbrella" = "Guarda-chuva"; +"device_verification_emoji_umbrella" = "Guardachuva"; "device_verification_emoji_hourglass" = "Ampulheta"; "device_verification_emoji_clock" = "Relógio"; "device_verification_emoji_gift" = "Presente"; "device_verification_emoji_light bulb" = "Lâmpada"; "device_verification_emoji_book" = "Livro"; "device_verification_emoji_pencil" = "Lápis"; -"device_verification_emoji_paperclip" = "Clipe de papel"; +"device_verification_emoji_paperclip" = "Clip de papel"; "device_verification_emoji_lock" = "Cadeado"; "device_verification_emoji_key" = "Chave"; "device_verification_emoji_hammer" = "Martelo"; @@ -1055,112 +1055,112 @@ "device_verification_emoji_folder" = "Pasta"; "device_verification_emoji_pin" = "Alfinete"; // MARK: File upload -"file_upload_error_title" = "Envio de arquivo"; -"file_upload_error_unsupported_file_type_message" = "Tipo de arquivo não compatível."; +"file_upload_error_title" = "Upload de arquivo"; +"file_upload_error_unsupported_file_type_message" = "Tipo de arquivo não suportado."; // MARK: Emoji picker "emoji_picker_title" = "Reações"; // MARK: Reaction history "reaction_history_title" = "Reações"; -"error_not_supported_on_mobile" = "Você não pode fazer isso no %@ para iOS."; +"error_not_supported_on_mobile" = "Você não pode fazer isto desde %@ mobile."; "key_verification_bootstrap_not_setup_title" = "Erro"; -"key_verification_tile_request_incoming_title" = "Solicitação de confirmação"; -"key_verification_tile_request_outgoing_title" = "Confirmação enviada"; -"key_verification_tile_request_status_data_loading" = "Carregando…"; -"key_verification_tile_request_status_expired" = "Expirado"; +"key_verification_tile_request_incoming_title" = "Requisição de verificação"; +"key_verification_tile_request_outgoing_title" = "Verificação enviada"; +"key_verification_tile_request_status_data_loading" = "Dados carregando…"; +"key_verification_tile_request_status_expired" = "Expirada"; "key_verification_tile_request_status_cancelled_by_me" = "Você cancelou"; "key_verification_tile_request_status_cancelled" = "%@ cancelou"; "key_verification_tile_request_status_accepted" = "Você aceitou"; "key_verification_tile_request_incoming_approval_accept" = "Aceitar"; -"key_verification_tile_request_incoming_approval_decline" = "Recusar"; -"key_verification_tile_conclusion_done_title" = "Confirmado"; -"key_verification_tile_conclusion_warning_title" = "Login não confiável"; -"key_verification_incoming_request_incoming_alert_message" = "%@ solicita confirmação"; -"key_verification_verify_qr_code_title" = "Confirmar através de QR Code"; -"key_verification_verify_qr_code_information" = "Escaneie o código para confirmar um ao outro com segurança."; -"key_verification_verify_qr_code_information_other_device" = "Escaneie o código abaixo para confirmar:"; -"key_verification_verify_qr_code_emoji_information" = "Confirmar comparando emojis únicos."; -"key_verification_verify_qr_code_cannot_scan_action" = "Não consegue escanear?"; -"key_verification_verify_qr_code_start_emoji_action" = "Confirmar por emojis"; -"key_verification_verify_qr_code_other_scan_my_code_title" = "O seu contato escaneou o código QR com sucesso?"; +"key_verification_tile_request_incoming_approval_decline" = "Declinar"; +"key_verification_tile_conclusion_done_title" = "Verificada"; +"key_verification_tile_conclusion_warning_title" = "Signin não-confiado"; +"key_verification_incoming_request_incoming_alert_message" = "%@ quer verificar"; +"key_verification_verify_qr_code_title" = "Verificar por scanning"; +"key_verification_verify_qr_code_information" = "Scanne o código para verificar seguramente um/uma a/o outra(o)."; +"key_verification_verify_qr_code_information_other_device" = "Scanne o código abaixo para verificar:"; +"key_verification_verify_qr_code_emoji_information" = "Verificar ao comparar emoji únicos."; +"key_verification_verify_qr_code_cannot_scan_action" = "Não dá pra scannar?"; +"key_verification_verify_qr_code_start_emoji_action" = "Verificar por emoji"; +"key_verification_verify_qr_code_other_scan_my_code_title" = "A/o outra(o) usuária(o) scannou o QR code com sucesso?"; "key_verification_verify_qr_code_scan_other_code_success_title" = "Código validado!"; -"key_verification_verify_qr_code_scan_other_code_success_message" = "O código QR foi validado com sucesso."; -"key_verification_scan_confirmation_scanned_user_information" = "Este escudo também aparece para %@?"; -"key_verification_scan_confirmation_scanned_device_information" = "O outro aparelho está mostrando o mesmo escudo?"; -"user_verification_start_verify_action" = "Iniciar a confirmação"; -"user_verification_start_information_part1" = "Para segurança extra, confirme· "; -"user_verification_start_information_part2" = " comparando um código único em ambos os aparelhos."; -"user_verification_start_additional_information" = "Para sua segurança, faça isso pessoalmente ou use outra forma de comunicação."; -"user_verification_sessions_list_user_trust_level_trusted_title" = "Confiável"; +"key_verification_verify_qr_code_scan_other_code_success_message" = "QR code tem sido validado com sucesso."; +"key_verification_scan_confirmation_scanned_user_information" = "%@ está mostrando o mesmo escudo?"; +"key_verification_scan_confirmation_scanned_device_information" = "O outro dispositivo está mostrando o mesmo escudo?"; +"user_verification_start_verify_action" = "Começar verificação"; +"user_verification_start_information_part1" = "Para segurança extra, verifique "; +"user_verification_start_information_part2" = " ao checar um código de uma vez em ambos seus dispositivos."; +"user_verification_start_additional_information" = "Para estar segura(o), faça isto em pessoa ou use uma outra forma de se comunicar."; +"user_verification_sessions_list_user_trust_level_trusted_title" = "Confiado"; "user_verification_sessions_list_user_trust_level_unknown_title" = "Desconhecido"; "user_verification_sessions_list_table_title" = "Sessões"; -"user_verification_sessions_list_session_trusted" = "Confiável"; -"user_verification_sessions_list_session_untrusted" = "Não confiável"; -"user_verification_session_details_trusted_title" = "Confiável"; -"user_verification_session_details_untrusted_title" = "Não confiável"; -"user_verification_session_details_information_trusted_current_user" = "Esta sessão é confiável para o envio de mensagens seguras porque você a confirmou:"; -"user_verification_session_details_information_trusted_other_user_part1" = "Esta sessão é confiável para o envio de mensagens seguras porque· "; -"user_verification_session_details_information_trusted_other_user_part2" = " ·confirmou:"; -"user_verification_session_details_information_untrusted_current_user" = "Confirme esta sessão para marcá-la como confiável e conceder a ela acesso a mensagens criptografadas:"; -"user_verification_session_details_information_untrusted_other_user" = " ·entrou usando uma nova sessão:"; -"user_verification_session_details_additional_information_untrusted_current_user" = "Se você não fez login nesta sessão, sua conta pode estar comprometida."; +"user_verification_sessions_list_session_trusted" = "Confiada"; +"user_verification_sessions_list_session_untrusted" = "Não confiada"; +"user_verification_session_details_trusted_title" = "Confiada"; +"user_verification_session_details_untrusted_title" = "Não Confiada"; +"user_verification_session_details_information_trusted_current_user" = "Esta sessão é confiada para mensageria segura porque você a verificou:"; +"user_verification_session_details_information_trusted_other_user_part1" = "Esta sessão é confiada para mensageria segura porque "; +"user_verification_session_details_information_trusted_other_user_part2" = " a verificou:"; +"user_verification_session_details_information_untrusted_current_user" = "Verifique esta sessão para marcá-la como confiada & garantir-lhe acesso a mensagens encriptadas:"; +"user_verification_session_details_information_untrusted_other_user" = " fez signin usando uma nova sessão:"; +"user_verification_session_details_additional_information_untrusted_current_user" = "Se você não fez signin a esta sessão, sua conta pode estar comprometida."; "secrets_recovery_with_passphrase_title" = "Frase de Segurança"; "secrets_recovery_with_passphrase_information_verify_device" = "Use sua Frase de Segurança para verificar este dispositivo."; -"secrets_recovery_with_passphrase_passphrase_title" = "Digite"; +"secrets_recovery_with_passphrase_passphrase_title" = "Entrar"; "secrets_recovery_with_passphrase_passphrase_placeholder" = "Entrar Frase de Segurança"; "secrets_recovery_with_passphrase_recover_action" = "Usar Frase"; "secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Não sabe sua Frase de Segurança? Você pode "; "secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "usar sua Chave de Segurança"; "secrets_recovery_with_passphrase_lost_passphrase_action_part3" = "."; -"secrets_recovery_with_passphrase_invalid_passphrase_title" = "Não foi possível acessar o armazenamento secreto"; +"secrets_recovery_with_passphrase_invalid_passphrase_title" = "Incapaz de acessar armazenamento secreto"; "secrets_recovery_with_passphrase_invalid_passphrase_message" = "Por favor verifique que você entrou a Frase de Segurança correta."; "secrets_recovery_with_key_title" = "Chave de Segurança"; "secrets_recovery_with_key_information_verify_device" = "Use sua Chave de Segurança para verificar este dispositivo."; -"secrets_recovery_with_key_recovery_key_title" = "Digite"; +"secrets_recovery_with_key_recovery_key_title" = "Entrar"; "secrets_recovery_with_key_recovery_key_placeholder" = "Entrar Chave de Segurança"; -"secrets_recovery_with_key_recover_action" = "Usar chave"; -"secrets_recovery_with_key_invalid_recovery_key_title" = "Não foi possível acessar o armazenamento secreto"; +"secrets_recovery_with_key_recover_action" = "Usar Chave"; +"secrets_recovery_with_key_invalid_recovery_key_title" = "Incapaz de acessar armazenamento secreto"; "secrets_recovery_with_key_invalid_recovery_key_message" = "Por favor verifique que você entrou a Chave de Segurança correta."; -"secrets_setup_recovery_key_title" = "Salve a sua chave de segurança"; +"secrets_setup_recovery_key_title" = "Salvar sua Chave de Segurança"; "secrets_setup_recovery_key_information" = "Armazene sua Chave de Segurança em algum lugar seguro. Ela pode ser usada para destrancar suas mensagens & dados encriptados."; -"secrets_setup_recovery_key_loading" = "Acessar…"; +"secrets_setup_recovery_key_loading" = "Carregando…"; "secrets_setup_recovery_key_export_action" = "Salvar"; -"secrets_setup_recovery_key_storage_alert_title" = "Guarde num lugar seguro"; -"secrets_setup_recovery_key_storage_alert_message" = "✓ Imprima e guarde em algum lugar seguro\n✓ Salve em uma chave USB ou unidade de backup\n✓ Copie para o seu armazenamento em nuvem pessoal"; -"secrets_setup_recovery_passphrase_title" = "Defina uma Frase de Segurança"; -"secrets_setup_recovery_passphrase_information" = "Digite uma frase de segurança que só você conheça, usada para proteger segredos em seu servidor."; -"secrets_setup_recovery_passphrase_additional_information" = "Não use a senha da sua conta."; -"secrets_setup_recovery_passphrase_confirm_information" = "Digite sua frase de segurança novamente para confirmá-la."; +"secrets_setup_recovery_key_storage_alert_title" = "Mantenha-a segura"; +"secrets_setup_recovery_key_storage_alert_message" = "✓ Imprima-a e armazene-a em algum lugar seguro\n✓ Salve-a em uma chave USB ou drive de backup \n✓ Copie-a para seu armazenamento nuvem pessoal"; +"secrets_setup_recovery_passphrase_title" = "Definir uma Frase de Segurança"; +"secrets_setup_recovery_passphrase_information" = "Entre uma frase de segurança que só você conheça, usada para assegurar segredos em seu servidor."; +"secrets_setup_recovery_passphrase_additional_information" = "Não use a senha de sua conta."; +"secrets_setup_recovery_passphrase_confirm_information" = "Entre sua Frase de Segurança de novo para confirmá-la."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Confirmar"; "secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Confirmar frase"; -"cross_signing_setup_banner_title" = "Configurar a criptografia"; -"cross_signing_setup_banner_subtitle" = "Confirme seus outros aparelhos com mais facilidade"; +"cross_signing_setup_banner_title" = "Configurar encriptação"; +"cross_signing_setup_banner_subtitle" = "Verifique seus outros dispositivos mais fácil"; "major_update_title" = "Riot agora é Element"; "major_update_learn_more_action" = "Saiba mais"; -"major_update_done_action" = "Ok, entendi"; -"pin_protection_choose_pin" = "Crie um PIN de segurança"; +"major_update_done_action" = "Entendido"; +"pin_protection_choose_pin" = "Crie um PIN por segurança"; "pin_protection_confirm_pin" = "Confirme seu PIN"; -"pin_protection_confirm_pin_to_disable" = "Confirme o PIN para desativar o PIN"; -"pin_protection_enter_pin" = "Digite seu PIN"; -"pin_protection_forgot_pin" = "Esqueci o PIN"; -"pin_protection_reset_alert_title" = "Redefinir o PIN"; -"pin_protection_reset_alert_message" = "Para redefinir seu PIN, você precisará fazer um novo login e em seguida criar um novo PIN"; -"pin_protection_reset_alert_action_reset" = "Redefinir"; -"pin_protection_mismatch_error_title" = "PINs não coincidem"; -"pin_protection_mismatch_error_message" = "Por favor, tente novamente"; -"pin_protection_mismatch_too_many_times_error_message" = "Se você não se lembrar do PIN, toque no botão Esqueci o PIN."; -"pin_protection_settings_section_header_x" = "PIN e %@"; -"pin_protection_settings_section_footer" = "Para redefinir seu PIN, você precisará fazer login novamente e criar um novo PIN."; +"pin_protection_confirm_pin_to_disable" = "Confirme PIN para desativar PIN"; +"pin_protection_enter_pin" = "Entre seu PIN"; +"pin_protection_forgot_pin" = "Esqueci PIN"; +"pin_protection_reset_alert_title" = "Resettar PIN"; +"pin_protection_reset_alert_message" = "Para resettar seu PIN, você vai precisar re-fazer login e criar um novo"; +"pin_protection_reset_alert_action_reset" = "Resettar"; +"pin_protection_mismatch_error_title" = "PINs não correspondem"; +"pin_protection_mismatch_error_message" = "Por favor tente de novo"; +"pin_protection_mismatch_too_many_times_error_message" = "Se você não consegue se lembrar de seu PIN, toque no botão esqueci PIN."; +"pin_protection_settings_section_header_x" = "PIN & %@"; +"pin_protection_settings_section_footer" = "Para resettar seu PIN, você vai precisar re-fazer login e criar um novo."; "biometrics_mode_touch_id" = "Touch ID"; "biometrics_mode_face_id" = "Face ID"; -"biometrics_setup_subtitle" = "Poupe tempo"; +"biometrics_setup_subtitle" = "Poupe a si mesma(o) tempo"; "biometrics_desetup_title_x" = "Desativar %@"; "biometrics_desetup_subtitle" = "biometrics_desetup_subtitle"; "biometrics_desetup_disable_button_title_x" = "Desativar %@"; -"biometrics_usage_reason" = "A autenticação é necessária para acessar seu aplicativo"; -"biometrics_cant_unlocked_alert_title" = "Não foi possível desbloquear o app"; -"biometrics_cant_unlocked_alert_message_login" = "Entrar novamente"; -"biometrics_cant_unlocked_alert_message_retry" = "Tentar novamente"; -"pin_protection_kick_user_alert_message" = "Muitos erros, vocês foi desconectada/o"; +"biometrics_usage_reason" = "Autenticação é necessitada para acessar seu app"; +"biometrics_cant_unlocked_alert_title" = "Não dá para destrancar app"; +"biometrics_cant_unlocked_alert_message_login" = "Fazer login de volta"; +"biometrics_cant_unlocked_alert_message_retry" = "Retentar"; +"pin_protection_kick_user_alert_message" = "Erros demais, você tem sido feito logout"; "room_details_advanced_e2e_encryption_disabled_for_dm" = "Encriptação não está ativada aqui."; "room_details_advanced_e2e_encryption_enabled_for_dm" = "Encriptação está ativada aqui"; "room_details_advanced_room_id_for_dm" = "ID:"; @@ -1177,85 +1177,85 @@ "room_participants_filter_room_members_for_dm" = "Filtrar membros"; "room_participants_leave_prompt_msg_for_dm" = "Tem certeza que você quer sair?"; "room_participants_leave_prompt_title_for_dm" = "Sair"; -"room_info_list_section_other" = "Outros"; -"room_info_list_several_members" = "%@ integrantes"; +"room_info_list_section_other" = "Outras"; +"room_info_list_several_members" = "%@ membros"; // MARK: - Room Info -"room_info_list_one_member" = "1 integrante"; -"create_room_placeholder_address" = "#saladeteste:matrix.org"; -"create_room_section_header_address" = "Endereço da sala"; -"create_room_show_in_directory" = "Exibir a sala na lista pública de salas"; -"create_room_section_footer_type" = "Pessoas entram em uma sala privada apenas com o convite da sala."; -"create_room_type_public" = "Sala pública"; -"create_room_type_private" = "Sala privada"; +"room_info_list_one_member" = "1 membro"; +"create_room_placeholder_address" = "#salateste:matrix.org"; +"create_room_section_header_address" = "Endereço de sala"; +"create_room_show_in_directory" = "Mostrar a sala no diretório"; +"create_room_section_footer_type" = "Pessoas se juntam a uma sala privada somente com o convite da sala."; +"create_room_type_public" = "Sala Pública"; +"create_room_type_private" = "Sala Privada"; "create_room_section_header_type" = "Tipo de sala"; -"create_room_section_footer_encryption" = "A criptografia não poderá ser desativada posteriormente."; -"create_room_enable_encryption" = "Ativar criptografia"; -"create_room_section_header_encryption" = "Criptografia da sala"; -"create_room_placeholder_topic" = "Descrição"; -"create_room_section_header_topic" = "Descrição da sala (opcional)"; +"create_room_section_footer_encryption" = "Encriptação não pode ser desativada em seguida."; +"create_room_enable_encryption" = "Ativar Encriptação"; +"create_room_section_header_encryption" = "Encriptação de sala"; +"create_room_placeholder_topic" = "Tópico"; +"create_room_section_header_topic" = "Tópico de sala (opcional)"; "create_room_placeholder_name" = "Nome"; -"create_room_section_header_name" = "Nome da sala"; +"create_room_section_header_name" = "Nome de sala"; // MARK: - Create Room -"create_room_title" = "Nova sala"; +"create_room_title" = "Nova Sala"; "searchable_directory_search_placeholder" = "Nome ou ID"; "searchable_directory_x_network" = "Rede %@"; // MARK: - Searchable Directory View Controller "searchable_directory_create_new_room" = "Criar uma nova sala"; -"pin_protection_explanatory" = "Configurar um PIN permite que você proteja dados como mensagens e contatos, de forma que somente você possa acessá-los inserindo o PIN ao iniciar o aplicativo."; -"pin_protection_not_allowed_pin" = "Por motivos de segurança, este PIN não está disponível. Por favor, escolha outra PIN"; -"pin_protection_choose_pin_welcome_after_register" = "Boas-vindas."; -"device_verification_self_verify_wait_recover_secrets_checking_availability" = "Procurando outras possibilidades de confirmação..."; +"pin_protection_explanatory" = "Configurar um PIN permite você proteger dados como mensagens e contatos, para que somente você possa acessá-los entrando o PIN no início do app."; +"pin_protection_not_allowed_pin" = "Por razões de segurança, este PIN não está disponível. Por favor tente um outro PIN"; +"pin_protection_choose_pin_welcome_after_register" = "Boas vindas."; +"device_verification_self_verify_wait_recover_secrets_checking_availability" = "Checando por outras capabilidades de verificação ..."; // MARK: - PIN Protection -"pin_protection_choose_pin_welcome_after_login" = "Bem-vindo de volta."; +"pin_protection_choose_pin_welcome_after_login" = "Boas vindas de volta."; "more" = "Mais"; "switch" = "Trocar"; "joined" = "Juntou-Se"; -"secrets_reset_authentication_message" = "Digite a senha da sua conta para confirmar"; -"secrets_reset_reset_action" = "Redefinir"; -"secrets_reset_warning_message" = "Você não terá mais o histórico de mensagens, aparelhos confiáveis e contatos confirmados."; -"secrets_reset_warning_title" = "Se você redefinir tudo"; -"secrets_reset_information" = "Apenas faça isso se você não tiver outro aparelho para confirmar este aparelho."; +"secrets_reset_authentication_message" = "Entre a senha de sua conta para confirmar"; +"secrets_reset_reset_action" = "Resettar"; +"secrets_reset_warning_message" = "Você vai recomeçar com nada de histórico, mensagens, dispositivos confiados ou usuárias(os) confiadas(os)."; +"secrets_reset_warning_title" = "Se você resettar tudo"; +"secrets_reset_information" = "Somente faça isto se você não tem nenhum outro dispositivo com o qual você pode verificar este dispositivo."; // MARK: - Secrets reset -"secrets_reset_title" = "Remover tudo"; +"secrets_reset_title" = "Resettar tudo"; // MARK: - Secrets recovery -"secrets_recovery_reset_action_part_1" = "Esqueceu as senhas ou perdeu todas opções de recuperação? "; +"secrets_recovery_reset_action_part_1" = "Esqueceu ou perdeu todas opções de recuperação? "; "less" = "Menos"; -"secrets_recovery_reset_action_part_2" = "Redefinir tudo"; -"secrets_setup_recovery_passphrase_summary_information" = "Lembre-se da sua frase de segurança. Ela pode ser usada para desbloquear suas mensagens e dados criptografados."; -"secrets_setup_recovery_passphrase_summary_title" = "Salve a sua frase de segurança"; -"home_empty_view_information" = "O aplicativo de conversas seguro e completo para equipes, amigos e organizações. Toque no botão + abaixo para adicionar pessoas e salas."; +"secrets_recovery_reset_action_part_2" = "Resettar tudo"; +"secrets_setup_recovery_passphrase_summary_information" = "Lembre-se de sua Frase de Segurança. Ela pode ser usada para destrancar suas mensagens & dados encriptados."; +"secrets_setup_recovery_passphrase_summary_title" = "Salvar sua Frase de Segurança"; +"home_empty_view_information" = "O app de chat seguro tudo-em-um para equipes, amigas(os) e organizações. Toque no botão + abaixo para adicionar pessoas e salas."; // MARK: - Home -"home_empty_view_title" = "Boas-vindas ao %@,\n%@"; +"home_empty_view_title" = "Boas vindas a %@,\n%@"; "people_empty_view_title" = "Pessoas"; -"favourites_empty_view_information" = "Você pode adicionar aos favoritos de algumas maneiras - a mais rápida é simplesmente pressionar e segurar. Toque na estrela e eles aparecerão automaticamente aqui, para fins de segurança."; +"favourites_empty_view_information" = "Você pode favoritar de algumas formas - a mais rápida é só pressionar e segurar. Toque na estrela e elas vão automaticamente aparecer aqui para mantimento seguro."; // MARK: - Favourites -"favourites_empty_view_title" = "Salas e pessoas favoritas"; +"favourites_empty_view_title" = "Favoritar salas e pessoas"; "rooms_empty_view_information" = "Salas são ótimas para qualquer chat de grupo, privado ou público. Toque no + para encontrar salas existentes, ou criar umas novas."; "rooms_empty_view_title" = "Salas"; "people_empty_view_information" = "Faça chat seguramene com qualquer pessoa. Toque no + para começar a adicionar pessoas."; -"invite_friends_share_text" = "Ei, converse comigo no %@: %@"; +"invite_friends_share_text" = "Hey, fale comigo em %@: %@"; // MARK: - Invite friends -"invite_friends_action" = "Convidar amigos para o %@"; -"pin_protection_settings_change_pin" = "Alterar o PIN"; -"pin_protection_confirm_pin_to_change" = "Confirme o PIN para alterá-lo"; +"invite_friends_action" = "Convidar amigas(os) para %@"; +"pin_protection_settings_change_pin" = "Mudar PIN"; +"pin_protection_confirm_pin_to_change" = "Confirme PIN para mudar PIN"; "bug_report_background_mode" = "Continuar em background"; "social_login_button_title_sign_up" = "Registrar-Se com %@"; "social_login_button_title_sign_in" = "Fazer Signin com %@"; @@ -1266,37 +1266,37 @@ // Social login "social_login_list_title_continue" = "Continuar com"; -"room_avatar_view_accessibility_hint" = "Alterar a imagem da sala"; +"room_avatar_view_accessibility_hint" = "Mudar avatar de sala"; // Mark: - Room avatar view -"room_avatar_view_accessibility_label" = "imagem"; +"room_avatar_view_accessibility_label" = "avatar"; "call_transfer_contacts_all" = "Todos"; -"call_transfer_contacts_recent" = "Recente"; -"call_transfer_users" = "Pessoas"; +"call_transfer_contacts_recent" = "Recentes"; +"call_transfer_users" = "Usuárias(os)"; "event_formatter_call_has_ended" = "Terminou %@"; -"room_intro_cell_information_multiple_dm_sentence2" = "Somente vocês estão nesta conversa, ao menos até que convidem alguém para participar."; -"room_intro_cell_information_dm_sentence2" = "Apenas vocês dois/duas estão nesta conversa, ninguém mais pode entrar."; +"room_intro_cell_information_multiple_dm_sentence2" = "Somente vocês estão nesta conversa, a menos que algum(a) de você convide alguém para se juntar."; +"room_intro_cell_information_dm_sentence2" = "Somente vocês dois/duas estão nesta conversa, ninguém mais pode juntar-se."; "room_intro_cell_information_dm_sentence1_part3" = ". "; -"room_intro_cell_information_dm_sentence1_part1" = "Este é o início de sua conversa com "; -"room_intro_cell_information_room_without_topic_sentence2_part2" = " para que as pessoas saibam do que se trata essa sala."; -"room_intro_cell_information_room_without_topic_sentence2_part1" = "Adicionar uma descrição"; -"room_intro_cell_information_room_with_topic_sentence2" = "Descrição: %@"; +"room_intro_cell_information_dm_sentence1_part1" = "Este é o começo de sua mensagem direta com "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " para deixar pessoas saberem do que esta sala se trata."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Adicionar um tópico"; +"room_intro_cell_information_room_with_topic_sentence2" = "Tópico: %@"; "room_intro_cell_information_room_sentence1_part3" = ". "; "room_intro_cell_information_room_sentence1_part1" = "Este é o começo de "; // Mark: - Room creation introduction cell "room_intro_cell_add_participants_action" = "Adicionar pessoas"; -"call_transfer_error_message" = "Falha ao transferir a chamada"; +"call_transfer_error_message" = "Transferência de chamada falhou"; "call_transfer_error_title" = "Erro"; -"call_transfer_dialpad" = "Teclado de discagem"; +"call_transfer_dialpad" = "Pad de disco"; // MARK: - Call Transfer "call_transfer_title" = "Transferir"; // MARK: - Dial Pad -"dialpad_title" = "Teclado de discagem"; +"dialpad_title" = "Pad de disco"; "call_actions_unhold" = "Retomar"; "event_formatter_call_back" = "Ligar de volta"; "event_formatter_call_you_declined" = "Você declinou esta chamada"; From dbe56829f104fbbe82443c032348797e757f488b Mon Sep 17 00:00:00 2001 From: manuroe Date: Fri, 18 Jun 2021 15:44:57 +0200 Subject: [PATCH 376/393] Room lists: Avoid app freezes by building them on a separated thread #3777 --- CHANGES.rst | 1 + .../Recents/DataSources/RecentsDataSource.m | 737 ++++++++++-------- .../DataSources/RecentsDataSourceState.swift | 79 ++ 3 files changed, 500 insertions(+), 317 deletions(-) create mode 100644 Riot/Modules/Common/Recents/DataSources/RecentsDataSourceState.swift diff --git a/CHANGES.rst b/CHANGES.rst index 0bae4ae8e..ed19d3fdb 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -14,6 +14,7 @@ Changes to be released in next version * Security settings: The Secure backup section has been updated to match element-web UX (#4430). * Wording: Replace Recovery Passphrase and Recovery Key by Security Phrase and Security Key (#4268). * Room directory: Join room by alias or id (#4429). + * Room lists: Avoid app freezes by building them on a separated thread (#3777). 🐛 Bugfix * StartChatViewController: Add more helpful message when trying to start DM with a user that does not exist (#224). diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m index 207e1975f..ea4eb52ec 100644 --- a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m @@ -43,12 +43,8 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou @interface RecentsDataSource() { - NSMutableArray* invitesCellDataArray; - NSMutableArray* favoriteCellDataArray; - NSMutableArray* peopleCellDataArray; - NSMutableArray* conversationCellDataArray; - NSMutableArray* lowPriorityCellDataArray; - NSMutableArray* serverNoticeCellDataArray; + RecentsDataSourceState *state; + dispatch_queue_t processingQueue; NSInteger shrinkedSectionsBitMask; @@ -72,19 +68,13 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou @implementation RecentsDataSource @synthesize directorySection, invitesSection, favoritesSection, peopleSection, conversationSection, lowPrioritySection, serverNoticeSection, secureBackupBannerSection, crossSigningBannerSection; @synthesize hiddenCellIndexPath, droppingCellIndexPath, droppingCellBackGroundView; -@synthesize invitesCellDataArray, favoriteCellDataArray, peopleCellDataArray, conversationCellDataArray, lowPriorityCellDataArray, serverNoticeCellDataArray; - (instancetype)init { self = [super init]; if (self) { - invitesCellDataArray = [[NSMutableArray alloc] init]; - favoriteCellDataArray = [[NSMutableArray alloc] init]; - peopleCellDataArray = [[NSMutableArray alloc] init]; - lowPriorityCellDataArray = [[NSMutableArray alloc] init]; - serverNoticeCellDataArray = [[NSMutableArray alloc] init]; - conversationCellDataArray = [[NSMutableArray alloc] init]; + processingQueue = dispatch_queue_create("MXRestClient", DISPATCH_QUEUE_SERIAL); _crossSigningBannerDisplay = CrossSigningBannerDisplayNone; crossSigningBannerSection = -1; @@ -112,6 +102,71 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou return self; } + +#pragma mark - Properties + +- (NSArray *)invitesCellDataArray +{ + return state.invitesCellDataArray; +} +- (NSArray *)favoriteCellDataArray +{ + return state.favoriteCellDataArray; +} +- (NSArray *)peopleCellDataArray +{ + return state.peopleCellDataArray; +} +- (NSArray *)conversationCellDataArray +{ + return state.conversationCellDataArray; +} +- (NSArray *)lowPriorityCellDataArray +{ + return state.lowPriorityCellDataArray; +} +- (NSArray *)serverNoticeCellDataArray +{ + return state.serverNoticeCellDataArray; +} + +- (NSUInteger)missedFavouriteDiscussionsCount +{ + return state.favouriteMissedDiscussionsCount.count; +} +- (NSUInteger)missedHighlightFavouriteDiscussionsCount +{ + return state.favouriteMissedDiscussionsCount.highlightCount; +} + +- (NSUInteger)missedDirectDiscussionsCount +{ + return state.directMissedDiscussionsCount.count; +} +- (NSUInteger)missedHighlightDirectDiscussionsCount +{ + return state.directMissedDiscussionsCount.highlightCount; +} + +- (NSUInteger)missedGroupDiscussionsCount +{ + return state.groupMissedDiscussionsCount.count; +} +- (NSUInteger)groupMissedDiscussionsCount +{ + return state.favouriteMissedDiscussionsCount.highlightCount; +} + +- (NSUInteger)unsentMessagesDirectDiscussionsCount +{ + return state.unsentMessagesDirectDiscussionsCount; +} +- (NSUInteger)unsentMessagesGroupDiscussionsCount +{ + return state.unsentMessagesGroupDiscussionsCount; +} + + #pragma mark - - (void)setDelegate:(id)delegate andRecentsDataSourceMode:(RecentsDataSourceMode)recentsDataSourceMode @@ -364,10 +419,10 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou // Refresh is disabled during drag&drop animation" if (!self.droppingCellIndexPath) { - [self refreshRoomsSections]; - - // And inform the delegate about the update - [self.delegate dataSource:self didCellChange:nil]; + [self refreshRoomsSection:^{ + // And inform the delegate about the update + [self.delegate dataSource:self didCellChange:nil]; + }]; } } @@ -407,12 +462,12 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou secureBackupBannerSection = sectionsCount++; } - if (invitesCellDataArray.count > 0) + if (self.invitesCellDataArray.count > 0) { invitesSection = sectionsCount++; } - if (favoriteCellDataArray.count > 0) + if (self.favoriteCellDataArray.count > 0) { favoritesSection = sectionsCount++; } @@ -435,12 +490,12 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou directorySection = sectionsCount++; } - if (lowPriorityCellDataArray.count > 0) + if (self.lowPriorityCellDataArray.count > 0) { lowPrioritySection = sectionsCount++; } - if (serverNoticeCellDataArray.count > 0) + if (self.serverNoticeCellDataArray.count > 0) { serverNoticeSection = sectionsCount++; } @@ -470,15 +525,15 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou } else if (section == favoritesSection && !(shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_FAVORITES)) { - count = favoriteCellDataArray.count; + count = self.favoriteCellDataArray.count; } else if (section == peopleSection && !(shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_PEOPLE)) { - count = peopleCellDataArray.count ? peopleCellDataArray.count : 1; + count = self.peopleCellDataArray.count ? self.peopleCellDataArray.count : 1; } else if (section == conversationSection && !(shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_CONVERSATIONS)) { - count = conversationCellDataArray.count ? conversationCellDataArray.count : 1; + count = self.conversationCellDataArray.count ? self.conversationCellDataArray.count : 1; } else if (section == directorySection && !(shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_DIRECTORY)) { @@ -486,15 +541,15 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou } else if (section == lowPrioritySection && !(shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_LOWPRIORITY)) { - count = lowPriorityCellDataArray.count; + count = self.lowPriorityCellDataArray.count; } else if (section == serverNoticeSection && !(shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_SERVERNOTICE)) { - count = serverNoticeCellDataArray.count; + count = self.serverNoticeCellDataArray.count; } else if (section == invitesSection && !(shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_INVITES)) { - count = invitesCellDataArray.count; + count = self.invitesCellDataArray.count; } // Adjust this count according to the potential dragged cell. @@ -535,17 +590,17 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou if (section == favoritesSection) { - count = favoriteCellDataArray.count; + count = self.favoriteCellDataArray.count; title = NSLocalizedStringFromTable(@"room_recents_favourites_section", @"Vector", nil); } else if (section == peopleSection) { - count = peopleCellDataArray.count; + count = self.peopleCellDataArray.count; title = NSLocalizedStringFromTable(@"room_recents_people_section", @"Vector", nil); } else if (section == conversationSection) { - count = conversationCellDataArray.count; + count = self.conversationCellDataArray.count; if (_recentsDataSourceMode == RecentsDataSourceModePeople) { @@ -562,17 +617,17 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou } else if (section == lowPrioritySection) { - count = lowPriorityCellDataArray.count; + count = self.lowPriorityCellDataArray.count; title = NSLocalizedStringFromTable(@"room_recents_low_priority_section", @"Vector", nil); } else if (section == serverNoticeSection) { - count = serverNoticeCellDataArray.count; + count = self.serverNoticeCellDataArray.count; title = NSLocalizedStringFromTable(@"room_recents_server_notice_section", @"Vector", nil); } else if (section == invitesSection) { - count = invitesCellDataArray.count; + count = self.invitesCellDataArray.count; if (_recentsDataSourceMode == RecentsDataSourceModePeople) { @@ -616,23 +671,23 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou if (section == favoritesSection) { - sectionArray = favoriteCellDataArray; + sectionArray = self.favoriteCellDataArray; } else if (section == peopleSection) { - sectionArray = peopleCellDataArray; + sectionArray = self.peopleCellDataArray; } else if (section == conversationSection) { - sectionArray = conversationCellDataArray; + sectionArray = self.conversationCellDataArray; } else if (section == lowPrioritySection) { - sectionArray = lowPriorityCellDataArray; + sectionArray = self.lowPriorityCellDataArray; } else if (section == serverNoticeSection) { - sectionArray = serverNoticeCellDataArray; + sectionArray = self.serverNoticeCellDataArray; } BOOL highlight = NO; @@ -877,8 +932,8 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou return cell; } - else if ((indexPath.section == conversationSection && !conversationCellDataArray.count) - || (indexPath.section == peopleSection && !peopleCellDataArray.count)) + else if ((indexPath.section == conversationSection && !self.conversationCellDataArray.count) + || (indexPath.section == peopleSection && !self.peopleCellDataArray.count)) { MXKTableViewCell *tableViewCell = [tableView dequeueReusableCellWithIdentifier:[MXKTableViewCell defaultReuseIdentifier]]; if (!tableViewCell) @@ -927,44 +982,44 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou if (tableSection == favoritesSection) { - if (cellDataIndex < favoriteCellDataArray.count) + if (cellDataIndex < self.favoriteCellDataArray.count) { - cellData = favoriteCellDataArray[cellDataIndex]; + cellData = self.favoriteCellDataArray[cellDataIndex]; } } else if (tableSection == peopleSection) { - if (cellDataIndex < peopleCellDataArray.count) + if (cellDataIndex < self.peopleCellDataArray.count) { - cellData = peopleCellDataArray[cellDataIndex]; + cellData = self.peopleCellDataArray[cellDataIndex]; } } else if (tableSection== conversationSection) { - if (cellDataIndex < conversationCellDataArray.count) + if (cellDataIndex < self.conversationCellDataArray.count) { - cellData = conversationCellDataArray[cellDataIndex]; + cellData = self.conversationCellDataArray[cellDataIndex]; } } else if (tableSection == lowPrioritySection) { - if (cellDataIndex < lowPriorityCellDataArray.count) + if (cellDataIndex < self.lowPriorityCellDataArray.count) { - cellData = lowPriorityCellDataArray[cellDataIndex]; + cellData = self.lowPriorityCellDataArray[cellDataIndex]; } } else if (tableSection == serverNoticeSection) { - if (cellDataIndex < serverNoticeCellDataArray.count) + if (cellDataIndex < self.serverNoticeCellDataArray.count) { - cellData = serverNoticeCellDataArray[cellDataIndex]; + cellData = self.serverNoticeCellDataArray[cellDataIndex]; } } else if (tableSection == invitesSection) { - if (cellDataIndex < invitesCellDataArray.count) + if (cellDataIndex < self.invitesCellDataArray.count) { - cellData = invitesCellDataArray[cellDataIndex]; + cellData = self.invitesCellDataArray[cellDataIndex]; } } @@ -981,8 +1036,8 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou { return self.droppingCellBackGroundView.frame.size.height; } - if ((indexPath.section == conversationSection && !conversationCellDataArray.count) - || (indexPath.section == peopleSection && !peopleCellDataArray.count)) + if ((indexPath.section == conversationSection && !self.conversationCellDataArray.count) + || (indexPath.section == peopleSection && !self.peopleCellDataArray.count)) { return 50.0; } @@ -1015,7 +1070,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou #pragma mark - -- (NSInteger)cellIndexPosWithRoomId:(NSString*)roomId andMatrixSession:(MXSession*)matrixSession within:(NSMutableArray*)cellDataArray +- (NSInteger)cellIndexPosWithRoomId:(NSString*)roomId andMatrixSession:(MXSession*)matrixSession within:(NSArray*)cellDataArray { if (roomId && matrixSession && cellDataArray.count) { @@ -1040,7 +1095,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou if (invitesSection >= 0) { - index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:invitesCellDataArray]; + index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:self.invitesCellDataArray]; if (index != NSNotFound) { @@ -1055,7 +1110,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou if (!indexPath && (favoritesSection >= 0)) { - index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:favoriteCellDataArray]; + index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:self.favoriteCellDataArray]; if (index != NSNotFound) { @@ -1070,7 +1125,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou if (!indexPath && (peopleSection >= 0)) { - index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:peopleCellDataArray]; + index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:self.peopleCellDataArray]; if (index != NSNotFound) { @@ -1085,7 +1140,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou if (!indexPath && (conversationSection >= 0)) { - index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:conversationCellDataArray]; + index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:self.conversationCellDataArray]; if (index != NSNotFound) { @@ -1100,7 +1155,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou if (!indexPath && (lowPrioritySection >= 0)) { - index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:lowPriorityCellDataArray]; + index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:self.lowPriorityCellDataArray]; if (index != NSNotFound) { @@ -1115,7 +1170,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou if (!indexPath && (serverNoticeSection >= 0)) { - index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:serverNoticeCellDataArray]; + index = [self cellIndexPosWithRoomId:roomId andMatrixSession:matrixSession within:self.serverNoticeCellDataArray]; if (index != NSNotFound) { @@ -1134,268 +1189,266 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou #pragma mark - MXKDataSourceDelegate -- (void)refreshRoomsSections +- (void)refreshRoomsSection:(void (^)(void))onComplete; { - NSDate *startDate = [NSDate date]; - - [invitesCellDataArray removeAllObjects]; - [favoriteCellDataArray removeAllObjects]; - [peopleCellDataArray removeAllObjects]; - [conversationCellDataArray removeAllObjects]; - [lowPriorityCellDataArray removeAllObjects]; - [serverNoticeCellDataArray removeAllObjects]; - - _missedFavouriteDiscussionsCount = _missedHighlightFavouriteDiscussionsCount = 0; - _missedDirectDiscussionsCount = _missedHighlightDirectDiscussionsCount = 0; - _missedGroupDiscussionsCount = _missedHighlightGroupDiscussionsCount = 0; - _unsentMessagesDirectDiscussionsCount = 0; - _unsentMessagesGroupDiscussionsCount = 0; - secureBackupBannerSection = directorySection = favoritesSection = peopleSection = conversationSection = lowPrioritySection = serverNoticeSection = invitesSection = -1; - + if (displayedRecentsDataSourceArray.count > 0) { // FIXME manage multi accounts MXKSessionRecentsDataSource *recentsDataSource = displayedRecentsDataSourceArray[0]; - MXSession* session = recentsDataSource.mxSession; + NSMutableArray> *cells = [NSMutableArray new]; NSInteger count = recentsDataSource.numberOfCells; - for (int index = 0; index < count; index++) + for (NSUInteger index = 0; index < count; index++) { - id recentCellDataStoring = [recentsDataSource cellDataAtIndex:index]; - MXRoom* room = recentCellDataStoring.roomSummary.room; + id cell = [recentsDataSource cellDataAtIndex:index]; + [cells addObject:cell]; + } + + MXWeakify(self); + [self computeStateAsyncWithCells:cells recentsDataSourceMode:self.recentsDataSourceMode matrixSession:recentsDataSource.mxSession onComplete:^(RecentsDataSourceState *newState) { + MXStrongifyAndReturnIfNil(self); - if (_recentsDataSourceMode == RecentsDataSourceModeHome) + self->state = newState; + onComplete(); + }]; + } + else + { + onComplete(); + } +} + +- (void)computeStateAsyncWithCells:(NSArray> *)cells + recentsDataSourceMode:(RecentsDataSourceMode)recentsDataSourceMode + matrixSession:(MXSession*)mxSession + onComplete:(void (^)(RecentsDataSourceState *newState))onComplete +{ + dispatch_async(processingQueue, ^{ + RecentsDataSourceState *newState = [RecentsDataSource computeStateWithCells:cells recentsDataSourceMode:recentsDataSourceMode matrixSession:mxSession]; + dispatch_async(dispatch_get_main_queue(), ^{ + onComplete(newState); + }); + }); +} + ++ (RecentsDataSourceState *)computeStateWithCells:(NSArray> *)cells + recentsDataSourceMode:(RecentsDataSourceMode)recentsDataSourceMode + matrixSession:(MXSession*)mxSession +{ + NSDate *startDate = [NSDate date]; + + NSMutableArray> *invitesCellDataArray = [NSMutableArray new]; + NSMutableArray> *favoriteCellDataArray = [NSMutableArray new]; + NSMutableArray> *peopleCellDataArray = [NSMutableArray new]; + NSMutableArray> *conversationCellDataArray = [NSMutableArray new]; + NSMutableArray> *lowPriorityCellDataArray = [NSMutableArray new]; + NSMutableArray> *serverNoticeCellDataArray = [NSMutableArray new]; + + MissedDiscussionsCount *favouriteMissedDiscussionsCount = [MissedDiscussionsCount new]; + MissedDiscussionsCount *directMissedDiscussionsCount = [MissedDiscussionsCount new]; + MissedDiscussionsCount *groupMissedDiscussionsCount = [MissedDiscussionsCount new]; + NSUInteger unsentMessagesDirectDiscussionsCount = 0; + NSUInteger unsentMessagesGroupDiscussionsCount = 0; + + for (id recentCellDataStoring in cells) + { + MXRoom* room = recentCellDataStoring.roomSummary.room; + + if (recentsDataSourceMode == RecentsDataSourceModeHome) + { + if (room.accountData.tags[kMXRoomTagServerNotice]) { - if (room.accountData.tags[kMXRoomTagServerNotice]) - { - [serverNoticeCellDataArray addObject:recentCellDataStoring]; - } - else if (room.accountData.tags[kMXRoomTagFavourite]) - { - [favoriteCellDataArray addObject:recentCellDataStoring]; - } - else if (room.accountData.tags[kMXRoomTagLowPriority]) - { - [lowPriorityCellDataArray addObject:recentCellDataStoring]; - } - else if (room.summary.membership == MXMembershipInvite) - { - [invitesCellDataArray addObject:recentCellDataStoring]; - } - else if (room.isDirect) - { - [peopleCellDataArray addObject:recentCellDataStoring]; - } - else - { - // Hide spaces from home (keep space invites) - if (room.summary.roomType != MXRoomTypeSpace) - { - [conversationCellDataArray addObject:recentCellDataStoring]; - } - } + [serverNoticeCellDataArray addObject:recentCellDataStoring]; } - else if (_recentsDataSourceMode == RecentsDataSourceModeFavourites) + else if (room.accountData.tags[kMXRoomTagFavourite]) { - // Keep only the favourites rooms. - if (room.accountData.tags[kMXRoomTagFavourite]) - { - [favoriteCellDataArray addObject:recentCellDataStoring]; - } + [favoriteCellDataArray addObject:recentCellDataStoring]; } - else if (_recentsDataSourceMode == RecentsDataSourceModePeople) + else if (room.accountData.tags[kMXRoomTagLowPriority]) { - // Keep only the direct rooms which are not low priority - if (room.isDirect && !room.accountData.tags[kMXRoomTagLowPriority]) - { - if (room.summary.membership == MXMembershipInvite) - { - [invitesCellDataArray addObject:recentCellDataStoring]; - } - else - { - [conversationCellDataArray addObject:recentCellDataStoring]; - } - } - } - else if (_recentsDataSourceMode == RecentsDataSourceModeRooms) - { - // Consider only non direct rooms. - if (!room.isDirect) - { - // Keep only the invites, the favourites and the rooms without tag and room type different from space - if (room.summary.membership == MXMembershipInvite) - { - [invitesCellDataArray addObject:recentCellDataStoring]; - } - else if ((!room.accountData.tags.count || room.accountData.tags[kMXRoomTagFavourite]) && room.summary.roomType != MXRoomTypeSpace) - { - [conversationCellDataArray addObject:recentCellDataStoring]; - } - } - } - - // Update missed conversations counts - NSUInteger notificationCount = recentCellDataStoring.roomSummary.notificationCount; - - // Ignore the regular notification count if the room is in 'mentions only" mode at the Riot level. - if (room.isMentionsOnly) - { - // Only the highlighted missed messages must be considered here. - notificationCount = recentCellDataStoring.roomSummary.highlightCount; - } - - if (notificationCount) - { - if (room.accountData.tags[kMXRoomTagFavourite]) - { - _missedFavouriteDiscussionsCount ++; - - if (recentCellDataStoring.roomSummary.highlightCount) - { - _missedHighlightFavouriteDiscussionsCount ++; - } - } - - if (room.isDirect) - { - _missedDirectDiscussionsCount ++; - - if (recentCellDataStoring.roomSummary.highlightCount) - { - _missedHighlightDirectDiscussionsCount ++; - } - } - else if (!room.accountData.tags.count || room.accountData.tags[kMXRoomTagFavourite]) - { - _missedGroupDiscussionsCount ++; - - if (recentCellDataStoring.roomSummary.highlightCount) - { - _missedHighlightGroupDiscussionsCount ++; - } - } + [lowPriorityCellDataArray addObject:recentCellDataStoring]; } else if (room.summary.membership == MXMembershipInvite) { - if (room.isDirect) - { - _missedDirectDiscussionsCount ++; - } - else - { - _missedGroupDiscussionsCount ++; - } + [invitesCellDataArray addObject:recentCellDataStoring]; } - - if (room.sentStatus != RoomSentStatusOk) + else if (room.isDirect) { - if (room.isDirect) + [peopleCellDataArray addObject:recentCellDataStoring]; + } + else + { + // Hide spaces from home (keep space invites) + if (room.summary.roomType != MXRoomTypeSpace) { - _unsentMessagesDirectDiscussionsCount ++; + [conversationCellDataArray addObject:recentCellDataStoring]; + } + } + } + else if (recentsDataSourceMode == RecentsDataSourceModeFavourites) + { + // Keep only the favourites rooms. + if (room.accountData.tags[kMXRoomTagFavourite]) + { + [favoriteCellDataArray addObject:recentCellDataStoring]; + } + } + else if (recentsDataSourceMode == RecentsDataSourceModePeople) + { + // Keep only the direct rooms which are not low priority + if (room.isDirect && !room.accountData.tags[kMXRoomTagLowPriority]) + { + if (room.summary.membership == MXMembershipInvite) + { + [invitesCellDataArray addObject:recentCellDataStoring]; } else { - _unsentMessagesGroupDiscussionsCount ++; + [conversationCellDataArray addObject:recentCellDataStoring]; + } + } + } + else if (recentsDataSourceMode == RecentsDataSourceModeRooms) + { + // Consider only non direct rooms. + if (!room.isDirect) + { + // Keep only the invites, the favourites and the rooms without tag and room type different from space + if (room.summary.membership == MXMembershipInvite) + { + [invitesCellDataArray addObject:recentCellDataStoring]; + } + else if ((!room.accountData.tags.count || room.accountData.tags[kMXRoomTagFavourite]) && room.summary.roomType != MXRoomTypeSpace) + { + [conversationCellDataArray addObject:recentCellDataStoring]; } } - } - if (_recentsDataSourceMode == RecentsDataSourceModeHome) + // Update missed conversations counts + NSUInteger notificationCount = recentCellDataStoring.roomSummary.notificationCount; + + // Ignore the regular notification count if the room is in 'mentions only" mode at the Riot level. + if (room.isMentionsOnly) { - BOOL pinMissedNotif = RiotSettings.shared.pinRoomsWithMissedNotificationsOnHome; - BOOL pinUnread = RiotSettings.shared.pinRoomsWithUnreadMessagesOnHome; - NSComparator comparator = nil; - - if (pinMissedNotif) + // Only the highlighted missed messages must be considered here. + notificationCount = recentCellDataStoring.roomSummary.highlightCount; + } + + if (notificationCount) + { + if (room.accountData.tags[kMXRoomTagFavourite]) { - // Sort each rooms collection by considering first the rooms with some missed notifs, the rooms with unread, then the others. - comparator = ^NSComparisonResult(id recentCellData1, id recentCellData2) { - - if (recentCellData1.roomSummary.room.sentStatus != RoomSentStatusOk - && recentCellData2.roomSummary.room.sentStatus == RoomSentStatusOk) - { - return NSOrderedAscending; - } - - if (recentCellData2.roomSummary.room.sentStatus != RoomSentStatusOk - && recentCellData1.roomSummary.room.sentStatus == RoomSentStatusOk) - { - return NSOrderedDescending; - } - - if (recentCellData1.highlightCount) - { - if (recentCellData2.highlightCount) - { - return NSOrderedSame; - } - else - { - return NSOrderedAscending; - } - } - else if (recentCellData2.highlightCount) - { - return NSOrderedDescending; - } - else if (recentCellData1.notificationCount) - { - if (recentCellData2.notificationCount) - { - return NSOrderedSame; - } - else - { - return NSOrderedAscending; - } - } - else if (recentCellData2.notificationCount) - { - return NSOrderedDescending; - } - else if (pinUnread) - { - if (recentCellData1.hasUnread) - { - if (recentCellData2.hasUnread) - { - return NSOrderedSame; - } - else - { - return NSOrderedAscending; - } - } - else if (recentCellData2.hasUnread) - { - return NSOrderedDescending; - } - } - - return NSOrderedSame; - }; + favouriteMissedDiscussionsCount.count ++; + + if (recentCellDataStoring.roomSummary.highlightCount) + { + favouriteMissedDiscussionsCount.highlightCount ++; + } } - else if (pinUnread) + + if (room.isDirect) { - // Sort each rooms collection by considering first the rooms with some unread messages then the others. - comparator = ^NSComparisonResult(id recentCellData1, id recentCellData2) { - - if (recentCellData1.roomSummary.room.sentStatus != RoomSentStatusOk - && recentCellData2.roomSummary.room.sentStatus == RoomSentStatusOk) + directMissedDiscussionsCount.count ++; + + if (recentCellDataStoring.roomSummary.highlightCount) + { + directMissedDiscussionsCount.highlightCount ++; + } + } + else if (!room.accountData.tags.count || room.accountData.tags[kMXRoomTagFavourite]) + { + groupMissedDiscussionsCount.count ++; + + if (recentCellDataStoring.roomSummary.highlightCount) + { + groupMissedDiscussionsCount.highlightCount ++; + } + } + } + else if (room.summary.membership == MXMembershipInvite) + { + if (room.isDirect) + { + directMissedDiscussionsCount.count ++; + } + else + { + groupMissedDiscussionsCount.highlightCount ++; + } + } + + if (room.sentStatus != RoomSentStatusOk) + { + if (room.isDirect) + { + unsentMessagesDirectDiscussionsCount ++; + } + else + { + unsentMessagesGroupDiscussionsCount ++; + } + } + } + + if (recentsDataSourceMode == RecentsDataSourceModeHome) + { + BOOL pinMissedNotif = RiotSettings.shared.pinRoomsWithMissedNotificationsOnHome; + BOOL pinUnread = RiotSettings.shared.pinRoomsWithUnreadMessagesOnHome; + NSComparator comparator = nil; + + if (pinMissedNotif) + { + // Sort each rooms collection by considering first the rooms with some missed notifs, the rooms with unread, then the others. + comparator = ^NSComparisonResult(id recentCellData1, id recentCellData2) { + + if (recentCellData1.roomSummary.room.sentStatus != RoomSentStatusOk + && recentCellData2.roomSummary.room.sentStatus == RoomSentStatusOk) + { + return NSOrderedAscending; + } + + if (recentCellData2.roomSummary.room.sentStatus != RoomSentStatusOk + && recentCellData1.roomSummary.room.sentStatus == RoomSentStatusOk) + { + return NSOrderedDescending; + } + + if (recentCellData1.highlightCount) + { + if (recentCellData2.highlightCount) + { + return NSOrderedSame; + } + else { return NSOrderedAscending; } - - if (recentCellData2.roomSummary.room.sentStatus != RoomSentStatusOk - && recentCellData1.roomSummary.room.sentStatus == RoomSentStatusOk) + } + else if (recentCellData2.highlightCount) + { + return NSOrderedDescending; + } + else if (recentCellData1.notificationCount) + { + if (recentCellData2.notificationCount) { - return NSOrderedDescending; + return NSOrderedSame; } - + else + { + return NSOrderedAscending; + } + } + else if (recentCellData2.notificationCount) + { + return NSOrderedDescending; + } + else if (pinUnread) + { if (recentCellData1.hasUnread) { if (recentCellData2.hasUnread) @@ -1411,33 +1464,15 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou { return NSOrderedDescending; } - - return NSOrderedSame; - }; - } - - if (comparator) - { - // Sort the rooms collections - [favoriteCellDataArray sortUsingComparator:comparator]; - [peopleCellDataArray sortUsingComparator:comparator]; - [conversationCellDataArray sortUsingComparator:comparator]; - [lowPriorityCellDataArray sortUsingComparator:comparator]; - [serverNoticeCellDataArray sortUsingComparator:comparator]; - } - } - else if (favoriteCellDataArray.count > 0 && _recentsDataSourceMode == RecentsDataSourceModeFavourites) - { - // Sort them according to their tag order - [favoriteCellDataArray sortUsingComparator:^NSComparisonResult(id recentCellData1, id recentCellData2) { + } - return [session compareRoomsByTag:kMXRoomTagFavourite room1:recentCellData1.roomSummary.room room2:recentCellData2.roomSummary.room]; - - }]; + return NSOrderedSame; + }; } - else if (conversationCellDataArray.count > 0 && (_recentsDataSourceMode == RecentsDataSourceModeRooms || _recentsDataSourceMode == RecentsDataSourceModePeople)) + else if (pinUnread) { - [conversationCellDataArray sortUsingComparator:^NSComparisonResult(id recentCellData1, id recentCellData2) { + // Sort each rooms collection by considering first the rooms with some unread messages then the others. + comparator = ^NSComparisonResult(id recentCellData1, id recentCellData2) { if (recentCellData1.roomSummary.room.sentStatus != RoomSentStatusOk && recentCellData2.roomSummary.room.sentStatus == RoomSentStatusOk) @@ -1450,13 +1485,80 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou { return NSOrderedDescending; } - - return NSOrderedAscending; - }]; + + if (recentCellData1.hasUnread) + { + if (recentCellData2.hasUnread) + { + return NSOrderedSame; + } + else + { + return NSOrderedAscending; + } + } + else if (recentCellData2.hasUnread) + { + return NSOrderedDescending; + } + + return NSOrderedSame; + }; + } + + if (comparator) + { + // Sort the rooms collections + [favoriteCellDataArray sortUsingComparator:comparator]; + [peopleCellDataArray sortUsingComparator:comparator]; + [conversationCellDataArray sortUsingComparator:comparator]; + [lowPriorityCellDataArray sortUsingComparator:comparator]; + [serverNoticeCellDataArray sortUsingComparator:comparator]; } } - + else if (favoriteCellDataArray.count > 0 && recentsDataSourceMode == RecentsDataSourceModeFavourites) + { + // Sort them according to their tag order + [favoriteCellDataArray sortUsingComparator:^NSComparisonResult(id recentCellData1, id recentCellData2) { + + return [mxSession compareRoomsByTag:kMXRoomTagFavourite room1:recentCellData1.roomSummary.room room2:recentCellData2.roomSummary.room]; + + }]; + } + else if (conversationCellDataArray.count > 0 && (recentsDataSourceMode == RecentsDataSourceModeRooms || recentsDataSourceMode == RecentsDataSourceModePeople)) + { + [conversationCellDataArray sortUsingComparator:^NSComparisonResult(id recentCellData1, id recentCellData2) { + + if (recentCellData1.roomSummary.room.sentStatus != RoomSentStatusOk + && recentCellData2.roomSummary.room.sentStatus == RoomSentStatusOk) + { + return NSOrderedAscending; + } + + if (recentCellData2.roomSummary.room.sentStatus != RoomSentStatusOk + && recentCellData1.roomSummary.room.sentStatus == RoomSentStatusOk) + { + return NSOrderedDescending; + } + + return NSOrderedAscending; + }]; + } + MXLogDebug(@"[RecentsDataSource] refreshRoomsSections: Done in %.0fms", [[NSDate date] timeIntervalSinceDate:startDate] * 1000); + + return [[RecentsDataSourceState alloc] + initWithInvitesCellDataArray:invitesCellDataArray + favoriteCellDataArray:favoriteCellDataArray + peopleCellDataArray:peopleCellDataArray + conversationCellDataArray:conversationCellDataArray + lowPriorityCellDataArray:lowPriorityCellDataArray + serverNoticeCellDataArray:serverNoticeCellDataArray + favouriteMissedDiscussionsCount:favouriteMissedDiscussionsCount + directMissedDiscussionsCount:directMissedDiscussionsCount + groupMissedDiscussionsCount:groupMissedDiscussionsCount + unsentMessagesDirectDiscussionsCount:unsentMessagesDirectDiscussionsCount + unsentMessagesGroupDiscussionsCount:unsentMessagesGroupDiscussionsCount]; } - (void)dataSource:(MXKDataSource*)dataSource didCellChange:(id)changes @@ -1479,10 +1581,11 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou // 2 - call [self refreshRoomsSections] // refresh the sections - [self refreshRoomsSections]; - - // Call super to keep update readyRecentsDataSourceArray. - [super dataSource:dataSource didCellChange:changes]; + [self refreshRoomsSection:^{ + // Call super to keep update readyRecentsDataSourceArray. + [super dataSource:dataSource didCellChange:changes]; + }]; + } #pragma mark - Drag & Drop handling diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSourceState.swift b/Riot/Modules/Common/Recents/DataSources/RecentsDataSourceState.swift new file mode 100644 index 000000000..5f7b376dd --- /dev/null +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSourceState.swift @@ -0,0 +1,79 @@ +// +// Copyright 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. +// + +import Foundation + +/// The state for a room list screens. +@objcMembers +class RecentsDataSourceState: NSObject { + + // MARK: - Properties + + // MARK: Cells + let invitesCellDataArray: [MXKRecentCellDataStoring] + let favoriteCellDataArray: [MXKRecentCellDataStoring] + let peopleCellDataArray: [MXKRecentCellDataStoring] + let conversationCellDataArray: [MXKRecentCellDataStoring] + let lowPriorityCellDataArray: [MXKRecentCellDataStoring] + let serverNoticeCellDataArray: [MXKRecentCellDataStoring] + + // MARK: Notifications counts + let favouriteMissedDiscussionsCount: MissedDiscussionsCount + let directMissedDiscussionsCount: MissedDiscussionsCount + let groupMissedDiscussionsCount: MissedDiscussionsCount + + // MARK: Unsent counts + let unsentMessagesDirectDiscussionsCount: UInt + let unsentMessagesGroupDiscussionsCount: UInt + + + // MARK: - Setup + init(invitesCellDataArray: [MXKRecentCellDataStoring], + favoriteCellDataArray: [MXKRecentCellDataStoring], + peopleCellDataArray: [MXKRecentCellDataStoring], + conversationCellDataArray: [MXKRecentCellDataStoring], + lowPriorityCellDataArray: [MXKRecentCellDataStoring], + serverNoticeCellDataArray: [MXKRecentCellDataStoring], + favouriteMissedDiscussionsCount: MissedDiscussionsCount, + directMissedDiscussionsCount: MissedDiscussionsCount, + groupMissedDiscussionsCount: MissedDiscussionsCount, + unsentMessagesDirectDiscussionsCount: UInt, + unsentMessagesGroupDiscussionsCount: UInt) { + self.invitesCellDataArray = invitesCellDataArray + self.favoriteCellDataArray = favoriteCellDataArray + self.peopleCellDataArray = peopleCellDataArray + self.conversationCellDataArray = conversationCellDataArray + self.lowPriorityCellDataArray = lowPriorityCellDataArray + self.serverNoticeCellDataArray = serverNoticeCellDataArray + self.favouriteMissedDiscussionsCount = favouriteMissedDiscussionsCount + self.directMissedDiscussionsCount = directMissedDiscussionsCount + self.groupMissedDiscussionsCount = groupMissedDiscussionsCount + self.unsentMessagesDirectDiscussionsCount = unsentMessagesDirectDiscussionsCount + self.unsentMessagesGroupDiscussionsCount = unsentMessagesGroupDiscussionsCount + super.init() + } +} + + +/// Noticiations counts per section +@objcMembers +class MissedDiscussionsCount: NSObject { + /// Regular notifications + var count: UInt = 0 + + /// Mentions like notications + var highlightCount: UInt = 0 +} From a27a4d235f44fa95d6c21617f266a91ad12ac35e Mon Sep 17 00:00:00 2001 From: manuroe Date: Fri, 18 Jun 2021 16:34:38 +0200 Subject: [PATCH 377/393] Update Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m Co-authored-by: ismailgulek --- Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m index ea4eb52ec..a63d14489 100644 --- a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m @@ -74,7 +74,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou self = [super init]; if (self) { - processingQueue = dispatch_queue_create("MXRestClient", DISPATCH_QUEUE_SERIAL); + processingQueue = dispatch_queue_create("RecentsDataSource", DISPATCH_QUEUE_SERIAL); _crossSigningBannerDisplay = CrossSigningBannerDisplayNone; crossSigningBannerSection = -1; From 87f40c679f582ffadf3bacc6fa569a7563288a91 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Fri, 18 Jun 2021 19:45:14 +0300 Subject: [PATCH 378/393] Recreate background sync service if credentials changed --- RiotNSE/NotificationService.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RiotNSE/NotificationService.swift b/RiotNSE/NotificationService.swift index 3ac8cd0bd..85bdde3d5 100644 --- a/RiotNSE/NotificationService.swift +++ b/RiotNSE/NotificationService.swift @@ -163,7 +163,7 @@ class NotificationService: UNNotificationServiceExtension { MXKAccountManager.shared()?.forceReloadAccounts() self.userAccount = MXKAccountManager.shared()?.activeAccounts.first if let userAccount = userAccount { - if NotificationService.backgroundSyncService == nil { + if NotificationService.backgroundSyncService?.credentials != userAccount.mxCredentials { MXLog.debug("[NotificationService] setup: MXBackgroundSyncService init: BEFORE") self.logMemory() NotificationService.backgroundSyncService = MXBackgroundSyncService(withCredentials: userAccount.mxCredentials) From b042e6558661a18c96dc3dd7de3c1588787c2cb1 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Fri, 18 Jun 2021 19:46:00 +0300 Subject: [PATCH 379/393] Update CHANGES.rst --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index ed19d3fdb..c2c909dde 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -24,6 +24,7 @@ Changes to be released in next version * VoIP: Handle application inactive state too for VoIP pushes (#4269). * VoIP: Do not terminate the app if protected data not available (#4419). * KeyVerification: Listen for request state changes and show QR reader option when it's ready. + * NSE: Recreate background sync service if credentials changed (#3695). ⚠️ API Changes * From 17bd76dc49ba19d431a79da33a4debedcb20eb1b Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Fri, 18 Jun 2021 19:26:55 +0200 Subject: [PATCH 380/393] UIButton: Add shortcut to button label property `adjustsFontForContentSizeCategory`. --- Riot/Categories/UIButton.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Riot/Categories/UIButton.swift b/Riot/Categories/UIButton.swift index 0e3af78ef..6f896bb58 100644 --- a/Riot/Categories/UIButton.swift +++ b/Riot/Categories/UIButton.swift @@ -40,4 +40,15 @@ extension UIButton { let image = UIImage.vc_image(from: color) self.setBackgroundImage(image, for: state) } + + /// Shortcut to button label property `adjustsFontForContentSizeCategory` + @IBInspectable + var vc_adjustsFontForContentSizeCategory: Bool { + get { + return self.titleLabel?.adjustsFontForContentSizeCategory ?? false + } + set { + self.titleLabel?.adjustsFontForContentSizeCategory = newValue + } + } } From 8c0411c4e5844b8e11ec639b107474a43bfe56db Mon Sep 17 00:00:00 2001 From: SBiOSoftWhare Date: Fri, 18 Jun 2021 19:27:34 +0200 Subject: [PATCH 381/393] Side menu: Support Dynamic Type. --- Riot/Modules/SideMenu/SideMenuActionView.swift | 1 + Riot/Modules/SideMenu/SideMenuActionView.xib | 6 ++++++ Riot/Modules/SideMenu/SideMenuVersionView.xib | 2 +- Riot/Modules/SideMenu/SideMenuViewController.storyboard | 4 ++-- Riot/Modules/SideMenu/SideMenuViewController.swift | 5 ++++- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Riot/Modules/SideMenu/SideMenuActionView.swift b/Riot/Modules/SideMenu/SideMenuActionView.swift index 6d4dc27a6..72ff6a852 100644 --- a/Riot/Modules/SideMenu/SideMenuActionView.swift +++ b/Riot/Modules/SideMenu/SideMenuActionView.swift @@ -53,6 +53,7 @@ final class SideMenuActionView: UIView, NibOwnerLoadable { private func commonInit() { self.button.contentHorizontalAlignment = .left + self.button.titleLabel?.lineBreakMode = .byTruncatingTail } convenience init() { diff --git a/Riot/Modules/SideMenu/SideMenuActionView.xib b/Riot/Modules/SideMenu/SideMenuActionView.xib index b1ea1a367..c23367b54 100644 --- a/Riot/Modules/SideMenu/SideMenuActionView.xib +++ b/Riot/Modules/SideMenu/SideMenuActionView.xib @@ -21,11 +21,17 @@