Merge pull request #4694 from vector-im/release/1.5.0/release

Release 1.5.0
This commit is contained in:
manuroe
2021-08-11 15:20:26 +02:00
committed by GitHub
106 changed files with 1470 additions and 1594 deletions
+2 -2
View File
@@ -3,6 +3,6 @@
* [ ] I read the [contributing guide](https://github.com/vector-im/element-ios/blob/develop/CONTRIBUTING.md)
* [ ] UI change has been tested on both light and dark themes, in portrait and landscape orientations and on iPhone and iPad simulators
* [ ] Pull request is based on the develop branch
* [ ] Pull request updates [CHANGES.rst](https://github.com/vector-im/riot-ios/blob/develop/CHANGES.rst)
* [ ] Pull request contains a [changelog file](https://github.com/matrix-org/matrix-ios-sdk/blob/develop/CONTRIBUTING.md#changelog) in ./changelog.d
* [ ] Pull request includes screenshots or videos of UI changes
* [ ] Pull request includes a [sign off](https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.md#sign-off)
* [ ] Pull request includes a [sign off](https://github.com/matrix-org/matrix-ios-sdk/blob/develop/CONTRIBUTING.md#sign-off)
+284 -1014
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
# Contributing code to Matrix
Please read Synapse [contributing guide](https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.md).
Please read the matrix-ios-sdk [contributing guide](https://github.com/matrix-org/matrix-ios-sdk/blob/develop/CONTRIBUTING.md).
# Contributing code to Element iOS
+2 -2
View File
@@ -22,8 +22,8 @@ APPLICATION_GROUP_IDENTIFIER = group.im.vector
APPLICATION_SCHEME = element
// Version
MARKETING_VERSION = 1.4.9
CURRENT_PROJECT_VERSION = 1.4.9
MARKETING_VERSION = 1.5.0
CURRENT_PROJECT_VERSION = 1.5.0
// Team
+3 -4
View File
@@ -204,6 +204,9 @@ final class BuildSettings: NSObject {
static let enableSideMenu: Bool = true
/// Whether to read the `io.element.functional_members` state event and exclude any service members when computing a room's name and avatar.
static let supportFunctionalMembers: Bool = true
// MARK: - Feature Specifics
/// Not allowed pin codes. User won't be able to select one of the pin in the list.
@@ -309,10 +312,6 @@ final class BuildSettings: NSObject {
static let messageDetailsAllowCopyMedia: Bool = true
static let messageDetailsAllowPasteMedia: Bool = true
// MARK: - Voice Message
static let voiceMessagesEnabled = false
// MARK: - Notifications
static let decryptNotificationsByDefault: Bool = true
+13 -4
View File
@@ -77,7 +77,14 @@ Every time you change the `$matrixKitVersion` variable in the `Podfile`, you hav
## Build
## Generate Xcode project
### Configure project
You may need to change the bundle identifier and app group identifier to be unique to get Xcode to build the app. Make sure to change the bundle identifier, application group identifier and app name in the `Config/AppIdentifiers.xcconfig` file to your new identifiers.
More advanced build configuration can be found in the `project.yml` file and each target has a `target.yml` file in its respective folder.
### Generate Xcode project
In order to get rid of git conflicts, the `Riot.xcodeproj` is not pushed into the git repository anymore but generated using `XcodeGen`. To generate the `xcodeproj` file simply run the following command line from the root folder :
@@ -117,12 +124,14 @@ $ open Riot.xcworkspace
**Note**: If you have multiple Xcode versions installed don't forget to use the right version of Command Line Tools when you are building the app. To check the Command Line Tools version go to `Xcode > Preferences > Locations > Command Line Tools` and check that the displayed version match your Xcode version.
### Configure project
You may need to change the bundle identifier and app group identifier to be unique to get Xcode to build the app. Make sure to change the bundle identifier, application group identifier and app name in the `project.yml` file to your new identifiers.
### Generate the project in one line without effort
Each target has its own YAML file in the folder Targets folder.
If you want to generate the project easily and quickly, there is a local script called `setup_project.sh` that creates the `xcodeproj` and `xcworkspace` with all source files and dependencies with commands described before. It automatically selects the right dependencies based on your local Git branch or your Podfile local modifications. All you have to do is to go in the project root folder and run the script:
```
$ ./setup_project.sh
```
## Generate IPA
+1 -1
View File
@@ -11,7 +11,7 @@ use_frameworks!
# - `{ {kit spec hash} => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for each repo. Used by Fastfile during CI
#
# Warning: our internal tooling depends on the name of this variable name, so be sure not to change it
$matrixKitVersion = '= 0.15.6'
$matrixKitVersion = '= 0.15.7'
# $matrixKitVersion = :local
# $matrixKitVersion = {'develop' => 'develop'}
@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Video.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Video@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Video@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 B

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "Voice call.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Voice call@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Voice call@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 633 B

@@ -1,17 +1,17 @@
{
"images" : [
{
"filename" : "24.png",
"filename" : "Video.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "24@2x.png",
"filename" : "Video@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "24@3x.png",
"filename" : "Video@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

-1
View File
@@ -298,7 +298,6 @@
"settings_global_settings_info" = "Глобални настройки на известия са налични на Вашия %@ уеб клиент";
"settings_pin_rooms_with_missed_notif" = "Закачане на стаи с пропуснати известия";
"settings_pin_rooms_with_unread" = "Закачане на стаи с непрочетени съобщения";
"settings_on_denied_notification" = "Известията са отказани за %@. Моля, включете ги в настройките на устройството";
"settings_enable_callkit" = "Интегрирани разговори";
"settings_callkit_info" = "Получаване на входящи повиквания при заключен екран. Показване на Element разговори в историята на системата. Ако iCloud е включен, историята на разговорите се споделя с Apple.";
"settings_ui_language" = "Език";
-1
View File
@@ -295,7 +295,6 @@
"settings_global_settings_info" = "Els paràmetres de notificació globals estan disponibles al teu client web %@";
"settings_pin_rooms_with_missed_notif" = "Fixa sales amb notificacions pendents";
"settings_pin_rooms_with_unread" = "Fixa sales amb missatges pendents";
"settings_on_denied_notification" = "%@ no permet notificacions, si us plau activa-les en els ajustos del teu dispositiu";
"settings_enable_callkit" = "Trucades integrades";
"settings_callkit_info" = "Rep les trucades entrants a la pantalla de bloqueig. Consulta les trucades de Element a l'historial de trucades del sistema. Si està habilitat iCloud, aquest historial de trucades es compartirà amb Apple.";
"settings_ui_language" = "Llenguatge";
-1
View File
@@ -373,7 +373,6 @@
"settings_global_settings_info" = "Mae gosodiadau hysbysu eang ar gael ar eich cleient %@ gwe";
"settings_pin_rooms_with_missed_notif" = "Pinio ystafelloedd gyda hysbysiadau heb eu gweld";
"settings_pin_rooms_with_unread" = "Pinio ystafelloedd gyda negeseuon heb eu darllen";
"settings_on_denied_notification" = "Gwrthodir hysbysiadau i %@, caniatewch nhw yn eich gosodiadau dyfais";
"settings_enable_callkit" = "Galw integredig";
"settings_callkit_info" = "Derbyn galwadau sy'n dod i mewn ar eich sgrin clo. Gwelwch eich galwadau Element yn hanes galwadau'r system. Os yw iCloud wedi'i alluogi, bydd yr hanes galw hwn yn cael ei rannu gydag Apple.";
"settings_calls_stun_server_fallback_button" = "Caniatáu gweinydd cymorth galw wrth gefn";
+1 -1
View File
@@ -1,7 +1,7 @@
// Permissions usage explanations
"NSCameraUsageDescription" = "Die Kamera wird verwendet, um Fotos und Videos aufzunehmen sowie Videoanrufe durchzuführen.";
"NSPhotoLibraryUsageDescription" = "Die Fotobibliothek wird verwendet, um Fotos und Videos zu versenden.";
"NSMicrophoneUsageDescription" = "Das Mikrofon wird verwendet, um Videos aufzunehmen sowie Gespräche zu führen.";
"NSMicrophoneUsageDescription" = "Element benötigt Zugriff auf das Mikrofon um Anrufe zu tätigen und Videos oder Sprachnachrichten aufzunehmen.";
"NSContactsUsageDescription" = "Element kann E-Mail-Adressen und Telefonnummern aus deinem Adressbuch zu deinem Matrix-Identitätsserver schicken, um Kontakte zu finden, die bereits Matrix verwenden. Wenn verfügbar, werden persönliche Daten vor dem Versand gehasht. Für weitere Informationen schaue bitte in die Datenschutzerklärung deines Identitätsservers.";
"NSCalendarsUsageDescription" = "Sieh dir deine geplanten Meetings in der App an.";
"NSFaceIDUsageDescription" = "Face-ID wird zum Zugriff auf deine App verwendet.";
+6 -2
View File
@@ -316,7 +316,6 @@
"settings_global_settings_info" = "Globale Benachrichtigungseinstellungen sind auf deinem %@ web-Client verfügbar";
"settings_pin_rooms_with_missed_notif" = "Pinnen von Räumen mit verpassten Benachrichtigungen";
"settings_pin_rooms_with_unread" = "Pinnen von Räumen mit ungelesenen Nachrichten";
"settings_on_denied_notification" = "Benachrichtigungen verboten für %@, bitte in den Geräte-Einstellungen erlauben";
"settings_contacts_discover_matrix_users" = "Entdecke andere Benutzer mittels E-Mail-Adressen oder Telefonnummern";
"settings_labs_e2e_encryption_prompt_message" = "Zum Fertigstellen der Verschlüsselung bitte neu anmelden.";
"settings_third_party_notices" = "Anmerkungen von Dritten";
@@ -1306,7 +1305,7 @@
"dialpad_title" = "Wähltastatur";
"call_actions_unhold" = "Fortsetzen";
"event_formatter_call_back" = "Zurückrufen";
"event_formatter_call_you_declined" = "Du lehntest diesen Anruf ab";
"event_formatter_call_you_declined" = "Anruf abgelehnt";
"event_formatter_call_you_currently_in" = "Aktueller Anruf";
"event_formatter_call_has_ended" = "%@ beendet";
"event_formatter_call_video" = "Videoanruf";
@@ -1401,3 +1400,8 @@
// Room Notification Settings
"room_notifs_settings_notify_me_for" = "Benachrichtige mich bei";
"room_details_notifs" = "Benachrichtigungen";
"event_formatter_call_missed_voice" = "Verpasster Anruf";
"event_formatter_call_incoming_voice" = "Eingehender Anruf";
"settings_labs_voice_messages" = "Sprachnachrichten";
"settings_notifications_disabled_alert_message" = "Öffne die Systemeinstellungen um Benachrichtigungen zu aktivieren.";
"settings_notifications_disabled_alert_title" = "Benachrichtigungen deaktiviert";
+14 -8
View File
@@ -492,11 +492,13 @@ Tap the + to start adding people.";
"settings_security" = "SECURITY";
"settings_enable_push_notif" = "Notifications on this device";
"settings_device_notifications" = "Device notifications";
"settings_show_decrypted_content" = "Show decrypted content";
"settings_global_settings_info" = "Global notification settings are available on your %@ web client";
"settings_pin_rooms_with_missed_notif" = "Pin rooms with missed notifications";
"settings_pin_rooms_with_unread" = "Pin rooms with unread messages";
"settings_on_denied_notification" = "Notifications are denied for %@, please allow them in your device settings";
"settings_notifications_disabled_alert_title" = "Notifications disabled";
"settings_notifications_disabled_alert_message" = "To enable notifications, go to your device settings.";
//"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";
@@ -552,7 +554,7 @@ Tap the + to start adding people.";
"settings_fail_to_update_password" = "Fail to update password";
"settings_password_updated" = "Your password has been updated";
"settings_add_3pid_password_title_email" = "Add email adress";
"settings_add_3pid_password_title_email" = "Add email address";
"settings_add_3pid_password_title_msidsn" = "Add phone number";
"settings_add_3pid_password_message" = "To continue, please enter your password";
"settings_add_3pid_invalid_password_message" = "Invalid credentials";
@@ -844,14 +846,17 @@ Tap the + to start adding people.";
"event_formatter_rerequest_keys_part1_link" = "Re-request encryption keys";
"event_formatter_rerequest_keys_part2" = " from your other sessions.";
"event_formatter_message_edited_mention" = "(edited)";
"event_formatter_call_voice" = "Voice call";
"event_formatter_call_video" = "Video call";
"event_formatter_call_connecting" = "Connecting…";
"event_formatter_call_ringing" = "Ringing…";
"event_formatter_call_has_ended" = "Ended %@";
"event_formatter_call_you_currently_in" = "Active call";
"event_formatter_call_you_declined" = "You declined this call";
"event_formatter_call_you_missed" = "You missed this call";
"event_formatter_call_has_ended" = "Call ended";
"event_formatter_call_has_ended_with_time" = "Call ended • %@";
"event_formatter_call_incoming_voice" = "Incoming voice call";
"event_formatter_call_incoming_video" = "Incoming video call";
"event_formatter_call_active_voice" = "Active voice call";
"event_formatter_call_active_video" = "Active video call";
"event_formatter_call_you_declined" = "Call declined";
"event_formatter_call_missed_voice" = "Missed voice call";
"event_formatter_call_missed_video" = "Missed video call";
"event_formatter_call_connection_failed" = "Connection failed";
"event_formatter_call_back" = "Call back";
"event_formatter_call_decline" = "Decline";
@@ -1687,3 +1692,4 @@ Tap the + to start adding people.";
"voice_message_release_to_send" = "Hold to record, release to send";
"voice_message_remaining_recording_time" = "%@s left";
"voice_message_stop_locked_mode_recording" = "Tap on your recording to stop or listen";
"voice_message_lock_screen_placeholder" = "Voice message";
-1
View File
@@ -975,7 +975,6 @@
"settings_calls_stun_server_fallback_description" = "Permesi repaŝan servilon %@ asistan je vokoj, kiam la hejmservilo ne provizas servilon (via IP-adreso ne doniĝus dum voko).";
"settings_calls_stun_server_fallback_button" = "Permesi repaŝan servilon asistan je vokoj";
"settings_callkit_info" = "Ricevi vokpetojn ĉe via ŝlosa ekrano. Vidi viajn vokojn de Element ĉe la sistema vokhistorio. Se iCloud estas ŝaltita, la vokhistorio doniĝas ankaŭ al Apple.";
"settings_on_denied_notification" = "Sciigo por %s estas malŝaltitaj, bonvole permesu ilin per la agordoj de via aparato";
"settings_pin_rooms_with_unread" = "Alpingli ĉambrojn kun nelegitaj mesaĝoj";
"settings_pin_rooms_with_missed_notif" = "Alpinigli ĉambrojn kun nerimarkitaj sciigoj";
"settings_show_decrypted_content" = "Montri malĉifritajn enhavojn";
-1
View File
@@ -321,7 +321,6 @@
"settings_global_settings_info" = "Los ajustes de notificación globales están disponibles en tu cliente web %@";
"settings_pin_rooms_with_missed_notif" = "Fijar salas con notificaciones pendientes";
"settings_pin_rooms_with_unread" = "Fijar salas con mensajes no leídos";
"settings_on_denied_notification" = "Las notificaciones están denegadas para %@, por favor habilita notificaciones en los ajustes de tu dispositivo";
"settings_enable_callkit" = "Integración de llamadas";
"settings_callkit_info" = "Recibe llamadas entrantes en tu pantalla de bloqueo. Ve tus llamadas de Element en el historial de llamadas del sistema. Si iCloud está habilitado, este historial de llamadas se compartirá con Apple.";
"settings_ui_language" = "Idioma";
+10 -2
View File
@@ -497,7 +497,6 @@
"settings_global_settings_info" = "Üldised teavituste seadistused leiduvad sinu %@ veebikliendis";
"settings_pin_rooms_with_missed_notif" = "Klammerda jututoad, kus leidub lugemata teavitusi";
"settings_pin_rooms_with_unread" = "Klammerda jututoad, kus leidub lugemata sõnumeid";
"settings_on_denied_notification" = "Teavitused on %@ jaoks keelatud, palun luba nad oma seadme seadistustes";
"settings_enable_callkit" = "Lõimitud helistamine";
"settings_callkit_info" = "Vasta kõnedele lukustuskuvalt. Vaata Element'i kõnesid süsteemi kõnelogist. Kui iCloud on kasutusel, siis kõnede ajalugu jagatakse Applega.";
"settings_calls_stun_server_fallback_button" = "Kasuta kõnehõlbustusserverit";
@@ -1267,7 +1266,7 @@
"dialpad_title" = "Numbriklahvistik";
"call_actions_unhold" = "Jätka";
"event_formatter_call_back" = "Helista tagasi";
"event_formatter_call_you_declined" = "Sina keeldusid sellest kõnest";
"event_formatter_call_you_declined" = "Osapool keeldus kõnest";
"event_formatter_call_you_currently_in" = "Kõne on käsil";
"event_formatter_call_has_ended" = "%@ kõne on lõppenud";
"event_formatter_call_video" = "Videokõne";
@@ -1368,3 +1367,12 @@
"voice_message_release_to_send" = "Salvestamiseks vajuta nuppu, saatmiseks lase nupp lahti";
"settings_labs_voice_messages" = "Häälsõnumid";
"event_formatter_call_missed_video" = "Vastamata videokõne";
"event_formatter_call_missed_voice" = "Vastamata kõne";
"event_formatter_call_active_video" = "Pooleliolev videokõne";
"event_formatter_call_active_voice" = "Pooleliolev kõne";
"event_formatter_call_incoming_video" = "Saabuv videokõne";
"event_formatter_call_incoming_voice" = "Saabuv häälkõne";
"settings_notifications_disabled_alert_message" = "Teavituste kasutamiseks ava seadistuste vaade.";
"settings_notifications_disabled_alert_title" = "Teavitused on välja lülitatud";
"settings_device_notifications" = "Teavitused seadmes";
-1
View File
@@ -396,7 +396,6 @@
"room_participants_remove_third_party_invite_msg" = "Hirugarrengoen gonbidapenak kentzea ez da onartzen APIa ez dagoen bitartean";
"settings_sign_out_e2e_warn" = "Zure muturretik muturrerako zifratze gakoak galduko dituzu. Horrek esan nahi du ezin izango dituzula mezu zaharrak gehiago irakurri zifratutako geletan gailu honetatik.";
"settings_global_settings_info" = "Jakinarazpen orokorren ezarpenak eskuragarri daude zure %@ web bezeroan";
"settings_on_denied_notification" = "Jakinarazpenak ukatu dira %@(e)n, baimendu zure gailuaren ezarpenetan";
"room_details_history_section_prompt_msg" = "Historiala nork irakurri dezakeen aldatzea gelak honetara aurrerantzean bidalitako mezuei besterik ez zaie aplikatuko. Badagoen historialaren ikusgaitasuna ez da aldatuko.";
// Call
"call_incoming_voice_prompt" = "%@ erabiltzailearen deia jasotzen";
-1
View File
@@ -278,7 +278,6 @@
"settings_global_settings_info" = "Les paramètres de notification globaux sont disponibles sur votre client web %@";
"settings_pin_rooms_with_missed_notif" = "Épingler les salons avec des notifications non lues";
"settings_pin_rooms_with_unread" = "Épingler les salons avec des messages non lus";
"settings_on_denied_notification" = "Les notifications sont refusées pour %@, merci de les autoriser dans les paramètres de votre appareil";
"settings_unignore_user" = "Afficher tous les messages de %@ ?";
"settings_contacts_discover_matrix_users" = "Utiliser un e-mail ou un numéro de téléphone pour retrouver des utilisateurs";
"settings_contacts_phonebook_country" = "Pays pour le répertoire téléphonique";
+11 -3
View File
@@ -311,7 +311,6 @@
"settings_global_settings_info" = "Globális értesítési beállításokat a webes kliensedben találod: %@";
"settings_pin_rooms_with_missed_notif" = "Szobák kitűzése elszalasztott értesítésekkel";
"settings_pin_rooms_with_unread" = "Szobák kitűzése olvasatlan üzenetekkel";
"settings_on_denied_notification" = "Az értesítések tiltva vannak ehhez: %@, kérlek engedélyezd az eszköz beállításaiban";
"settings_enable_callkit" = "Beépített hívás";
"settings_callkit_info" = "Hívások fogadása a zárolt képernyőn. Element hívások megjelenítése a rendszer hívás naplójában. Ha az iCloud engedélyezett akkor a hívásnapló az Apple-el megosztásra kerül.";
"settings_ui_language" = "Nyelv";
@@ -1330,9 +1329,9 @@
"dialpad_title" = "Tárcsázó számlap";
"call_actions_unhold" = "Folytatás";
"event_formatter_call_back" = "Visszahívás";
"event_formatter_call_you_declined" = "Elutasította ezt a hívást";
"event_formatter_call_you_declined" = "Hívás elutasítva";
"event_formatter_call_you_currently_in" = "Aktív hívás";
"event_formatter_call_has_ended" = "Befejeződött: %@";
"event_formatter_call_has_ended" = "Hívás vége: %@";
"event_formatter_call_video" = "Videóhívás";
"event_formatter_call_voice" = "Hang hívás";
"room_open_dialpad" = "Tárcsázó számlap";
@@ -1431,3 +1430,12 @@
"voice_message_release_to_send" = "Felvételhez tartsd nyomva, a küldéshez engedd el";
"settings_labs_voice_messages" = "Hang üzenetek";
"settings_notifications_disabled_alert_message" = "Az értesítések engedélyezéséhez lépj be az eszköz beállításokba.";
"settings_notifications_disabled_alert_title" = "Értesítések tiltva";
"settings_device_notifications" = "Eszköz értesítések";
"event_formatter_call_missed_video" = "Nem fogadott videóhívás";
"event_formatter_call_missed_voice" = "Nem fogadott hanghívás";
"event_formatter_call_active_video" = "Videó hívás folyamatban";
"event_formatter_call_active_voice" = "Hanghívás folyamatban";
"event_formatter_call_incoming_video" = "Bejövő videó hívás";
"event_formatter_call_incoming_voice" = "Bejövő hanghívás";
+35
View File
@@ -70,3 +70,38 @@
// Titles
"title_home" = "Beranda";
"auth_email_validation_message" = "Silakan periksa surel Anda untuk melanjutkan pendaftaran";
"auth_use_server_options" = "Gunakan opsi server khusus (lanjutan)";
"auth_email_not_found" = "Gagal mengirim surel: Alamat email ini tidak ditemukan";
"auth_forgot_password_error_no_configured_identity_server" = "Tidak ada server identitas yang dikonfigurasikan: tambahkan satu untuk mengatur ulang kata sandi Anda.";
"auth_forgot_password" = "Lupa kata sandi?";
"auth_username_in_use" = "Nama pengguna sudah dipakai";
"auth_password_dont_match" = "Kata sandi tidak cocok";
"auth_untrusted_id_server" = "Server identitas tidak dipercaya";
"auth_phone_is_required" = "Tidak ada server identitas yang dikonfigurasi sehingga Anda tidak dapat menambahkan nomor telepon untuk mengatur ulang kata sandi Anda di masa depan.";
"auth_email_is_required" = "Tidak ada server identitas yang dikonfigurasi sehingga Anda tidak dapat menambahkan alamat email untuk mengatur ulang kata sandi Anda di masa depan.";
"auth_phone_in_use" = "Nomor telepon ini sudah dipakai";
"auth_email_in_use" = "Surel ini sudah dipakai";
"auth_missing_email_or_phone" = "Tidak ada surel atau nomor telepon";
"auth_missing_phone" = "Tidak ada nomor telepon";
"auth_missing_email" = "Tidak ada surel";
"auth_add_email_phone_message_2" = "Tetapkan surel untuk pemulihan akun. Gunakan email atau telepon selanjutnya untuk dapat ditemukan oleh orang-orang yang mengenal Anda secara opsional.";
"auth_add_phone_message_2" = "Atur telepon, dan nanti dapat ditemukan oleh orang-orang yang mengenal Anda secara opsional.";
"auth_add_email_message_2" = "Tetapkan surel untuk pemulihan akun, dan nanti dapat ditemukan oleh orang-orang yang mengenal Anda secara opsional.";
"auth_missing_password" = "Tidak ada kata sandi";
"auth_invalid_phone" = "Ini tidak terlihat seperti nomor telepon yang valid";
"auth_invalid_email" = "Ini tidak terlihat seperti surel yang valid";
"auth_invalid_password" = "Kata sandi terlalu pendek (min 6)";
"auth_invalid_user_name" = "Nama pengguna hanya dapat berisi huruf, angka, titik, tanda hubung, dan garis bawah";
"auth_send_reset_email" = "Kirim Reset Email";
"auth_submit" = "Kirim";
// Accessibility
"accessibility_checkbox_label" = "centang";
"callbar_only_single_active_group" = "Ketuk untuk Bergabung panggilan grup (%@)";
"joined" = "Bergabung";
"collapse" = "tutup";
"store_promotional_text" = "Aplikasi perpesanan dan kolaborasi yang menjaga privasi, pada jaringan terbuka. Terdesentralisasi untuk Anda kendali. Tidak ada penambangan data, tidak ada backdoor dan tidak ada akses pihak ketiga.";
"store_full_description" = "Element adalah aplikasi messenger dan kolaborasi tipe baru yang:\n\n1. Menempatkan Anda dalam kendali untuk mempertahankan privasi Anda\n2. Memungkinkan Anda berkomunikasi dengan siapa pun di jaringan Matrix, dan bahkan di luar dengan mengintegrasikan dengan aplikasi seperti Slack\n3. Melindungi Anda dari iklan, menambangan data, backdoor, dan taman berdinding\n4. Mengamankan Anda melalui enkripsi ujung-ke-ujung, dengan penandatanganan-silang untuk memverifikasi orang lain\n\nElement benar-benar berbeda dari aplikasi perpesanan dan kolaborasi lain karena terdesentralisasi dan sumber terbuka.\n\nElement memungkinkan Anda host sendiri - atau memilih host - sehingga Anda memiliki privasi, kepemilikan, dan kontrol data dan percakapan Anda. Ini memberi Anda akses ke jaringan terbuka; jadi Anda tidak hanya terjebak berbicara dengan pengguna Element. Itu sangat aman.\n\nElement dapat melakukan semua ini karena beroperasi pada Matrix - standar untuk komunikasi terdesentralisasi terbuka.\n\nElement menempatkan Anda dalam kendali dengan membiarkan Anda memilih siapa yang meng-host percakapan Anda. Dari aplikasi Element, Anda dapat memilih untuk meng-host dengan cara yang berbeda:\n\n1. Dapatkan akun gratis pada server publik matrix.org\n2. Host sendiri akun Anda dengan menjalankan server pada perangkat keras Anda sendiri\n3. Mendaftar untuk akun di server khusus dengan hanya berlangganan platform hosting Element Matrix Services\n\nMengapa memilih Element?\n\nMILIKI DATA ANDA: Anda memutuskan di mana harus menyimpan data dan pesan Anda. Anda memilikinya dan mengendalikannya, bukan perusahaan besar yang menambang data Anda atau memberikan akses ke pihak ketiga.\n\nPESAN DAN KOLABORASI TERBUKA: Anda dapat mengobrol dengan orang lain di jaringan Matrix, jika mereka menggunakan Element atau aplikasi Matrix lain, dan bahkan jika mereka menggunakan sistem perpesanan seperti Slack, IRC atau XMPP.\n\nSUPER-AMAN: Enkripsi ujung-ke-ujung (hanya mereka yang dalam percakapan dapat mendekripsi pesan), dan penandatanganan-silang untuk memverifikasi perangkat peserta percakapan.\n\nKOMUNIKASI LENGKAP: Pesan, panggilan suara dan video, berbagi file, berbagi layar dan banyak integrasi, bot dan widget. Buat ruangan, komunitas, tetap terhubung dan selesaikan hal-hal.\n\nDI MANA PUN ANDA BERADA: Tetap berkomunikasi di mana pun Anda berada dengan riwayat pesan yang sepenuhnya disinkronkan di semua perangkat Anda dan di web di https://element.io/app.";
// String for App Store
"store_short_description" = "Obrolan/VoIP terdesentralisasi aman";
-1
View File
@@ -442,7 +442,6 @@
"settings_fail_to_update_profile" = "Mistókst að uppfæra notandasnið";
"settings_pin_rooms_with_missed_notif" = "Festa spjallrásir með óskoðuðum tilkynningum";
"settings_pin_rooms_with_unread" = "Festa spjallrásir með ólesnum skilaboðum";
"settings_on_denied_notification" = "Tilkynningum er hafnað fyrir %@, leyfðu þær í stillingum tækisins";
"settings_ui_theme_picker_message" = "\"Sjálfvirkt\" notar \"Umsnúa litum\" stillingar tækisins";
"settings_contacts_discover_matrix_users" = "Notaðu tölvupóstföng og símanúmer til að finna notendur";
"settings_labs_e2e_encryption_prompt_message" = "Til að ljúka við uppsetningu á dulritun verðurðu að skrá þig inn aftur.";
+11 -3
View File
@@ -327,7 +327,6 @@
"settings_global_settings_info" = "Le impostazioni di notifica avanzate sono disponibili nel tuo %@ web client";
"settings_pin_rooms_with_missed_notif" = "Segna le stanze con notifiche perse";
"settings_pin_rooms_with_unread" = "Segna le stanze con messaggi non letti";
"settings_on_denied_notification" = "Le notifiche non sono permesse per %@, abilitale nelle impostazioni del tuo dispositivo";
"settings_enable_callkit" = "Chiamate integrate";
"settings_callkit_info" = "Ricevi le chiamate in arrivo sul blocca schermo. Mostra le chiamate Element nella cronologia di chiamate del dispositivo. Se iCloud è attivo, questa cronologia sarà condivisa con Apple.";
"settings_ui_language" = "Lingua";
@@ -1300,9 +1299,9 @@
"dialpad_title" = "Tastierino numerico";
"call_actions_unhold" = "Riprendi";
"event_formatter_call_back" = "Richiama";
"event_formatter_call_you_declined" = "Hai rifiutato questa chiamata";
"event_formatter_call_you_declined" = "Chiamata rifiutata";
"event_formatter_call_you_currently_in" = "Chiamata attiva";
"event_formatter_call_has_ended" = "Terminato %@";
"event_formatter_call_has_ended" = "Chiamata terminata %@";
"event_formatter_call_video" = "Videochiamata";
"event_formatter_call_voice" = "Telefonata";
"settings_show_NSFW_public_rooms" = "Mostra stanze pubbliche per adulti";
@@ -1402,3 +1401,12 @@
"voice_message_release_to_send" = "Tieni premuto per registrare, rilascia per inviare";
"settings_labs_voice_messages" = "Messaggi vocali";
"settings_notifications_disabled_alert_message" = "Per attivare le notifiche, vai nelle impostazioni del tuo dispositivo.";
"settings_notifications_disabled_alert_title" = "Notifiche disattivate";
"settings_device_notifications" = "Notifiche del dispositivo";
"event_formatter_call_missed_video" = "Videochiamata persa";
"event_formatter_call_missed_voice" = "Telefonata persa";
"event_formatter_call_active_video" = "Videochiamata attiva";
"event_formatter_call_active_voice" = "Telefonata attiva";
"event_formatter_call_incoming_video" = "Videochiamata in arrivo";
"event_formatter_call_incoming_voice" = "Telefonata in arrivo";
-1
View File
@@ -289,7 +289,6 @@
"settings_show_decrypted_content" = "復号化された文章を表示";
"settings_global_settings_info" = "あなたの %@ webクライアント上で、全体の通知設定が可能です";
"settings_pin_rooms_with_missed_notif" = "通知の届かなかった部屋をピン止めする";
"settings_on_denied_notification" = "%@で通知されないように設定されています。あなたの端末設定で許可してください";
"settings_callkit_info" = "画面がロックされているときに着信がありました。Elementの着信はシステムの通話履歴で確認できます。 iCloudが有効になっている場合、この通話履歴はAppleと共有されます。";
"settings_ui_language" = "言語";
"settings_ui_theme" = "外観";
-1
View File
@@ -1305,7 +1305,6 @@
"security_settings_blacklist_unverified_devices" = "Ɣur-k·m ad tazneḍ akk iznan ɣer tɣimiyin ur nettwattkal ara";
"security_settings_crypto_sessions_description_2" = "MA yella ur tessineḍ ara anekcum, senfel awal-ik·imuffir, rnu wennez aḥraz aɣellsan.";
"settings_send_crash_report" = "Azen tura tura isefka yerrẓen & useqdec";
"settings_on_denied_notification" = "Ttwagin yilɣa i %@, ttxil-k·m sireg-iten deg yiɣewaren n yibenk-inek·inem";
"settings_global_settings_info" = "Iɣewwaren n yilɣa imatuyen llan ɣef umsaɣ-inek·inem web %@";
"room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Ulac aqeddac n timagit i yettusbadun, ihi ur tezmireḍ ara ad tebduḍ adiwenni akked unermis isseqdacen imayl.";
"contacts_address_book_permission_required" = "Ttusrant tsirag i unekcum ɣer yinermisen idiganen";
-1
View File
@@ -857,7 +857,6 @@
"room_details_photo_for_dm" = "Bilde";
"room_details_photo" = "Rombilde";
"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";
"pin_protection_not_allowed_pin" = "Av sikkerhetsårsaker er denne PIN-koden ikke tilgjengelig. Prøv en annen PIN-kode";
+1 -1
View File
@@ -17,7 +17,7 @@
// Permissions usage explanations
"NSCameraUsageDescription" = "De camera wordt gebruikt om fotos en videos te maken, en voor videogesprekken.";
"NSPhotoLibraryUsageDescription" = "De fotogalerij wordt gebruikt om fotos en videos te versturen.";
"NSMicrophoneUsageDescription" = "De microfoon wordt gebruikt om videos te maken, en voor spraakoproepen.";
"NSMicrophoneUsageDescription" = "Element heeft toegang nodig tot uw microfoon nodig voor oproepen, maken van video's en spraakberichten opnemen.";
"NSContactsUsageDescription" = "Om u te kunnen tonen welke van uw contacten reeds Matrix gebruiken, kan Element de e-mailadressen en telefoonnummers in uw adresboek naar uw gekozen Matrix-identiteitsserver sturen. Waar mogelijk worden persoonlijke gegevens gehasht voor verzending - bekijk het privacybeleid van uw identiteitsserver voor meer informatie.";
"NSCalendarsUsageDescription" = "Bekijk uw geplande afspraken in de app.";
"NSFaceIDUsageDescription" = "Face ID wordt gebruikt om toegang te krijgen tot uw app.";
+3 -3
View File
@@ -55,11 +55,11 @@
/** Invites **/
/* A user has invited you to a chat */
"USER_INVITE_TO_CHAT" = "%@ heeft u voor een gesprek uitgenodigd";
"USER_INVITE_TO_CHAT" = "%@ heeft u uitgenodigd om te chatten";
/* A user has invited you to an (unamed) group chat */
"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ heeft u in een groepsgesprek uitgenodigd";
"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ heeft u uitgenodigd in een groepschat";
/* A user has invited you to a named room */
"USER_INVITE_TO_NAMED_ROOM" = "%@ heeft u in %@ uitgenodigd";
"USER_INVITE_TO_NAMED_ROOM" = "%@ heeft u in %@-kamer uitgenodigd";
/** Calls **/
/* Incoming one-to-one voice call */
+147 -132
View File
@@ -18,7 +18,7 @@
"title_home" = "Thuis";
"title_favourites" = "Favorieten";
"title_people" = "Personen";
"title_rooms" = "Gesprekken";
"title_rooms" = "Kamers";
"warning" = "Waarschuwing";
// Actions
"view" = "Weergeven";
@@ -84,18 +84,18 @@
"auth_msisdn_validation_title" = "Verificatie in afwachting";
"auth_msisdn_validation_message" = "We hebben een sms met een activatiecode gestuurd. Voer deze code hieronder in.";
"auth_msisdn_validation_error" = "Kan het telefoonnummer niet verifiëren.";
"auth_recaptcha_message" = "Deze thuisserver wil er graag zeker van zijn dat u geen robot bent";
"auth_recaptcha_message" = "Deze server wil er graag zeker van zijn dat u geen robot bent";
"auth_reset_password_message" = "Voer het e-mailadres dat met uw account verbonden is in om uw wachtwoord opnieuw in te stellen:";
"auth_reset_password_missing_email" = "Het e-mailadres dat met uw account verbonden is moet ingevoerd worden.";
"auth_reset_password_missing_password" = "Er moet een nieuw wachtwoord ingevoerd worden.";
"auth_reset_password_email_validation_message" = "Er is een e-mail naar %@ gestuurd. Klik hieronder zodra u de koppeling erin hebt gevolgd.";
"auth_reset_password_next_step_button" = "Ik heb mijn e-mailadres geverifieerd";
"auth_reset_password_error_unauthorized" = "Verifiëren van e-mailadres is mislukt: wees er zeker van dat u op de koppeling in de e-mail hebt getikt";
"auth_reset_password_error_not_found" = "Het ziet er niet naar uit dat uw e-mailadres met een Matrix-ID op deze thuisserver is verbonden.";
"auth_reset_password_error_not_found" = "Het ziet er niet naar uit dat uw e-mailadres met een Matrix-ID is verbonden op deze server.";
"auth_reset_password_success_message" = "Uw wachtwoord is opnieuw ingesteld.\n\nU bent op alle apparaten afgemeld en u zult geen pushmeldingen meer ontvangen. Om meldingen weer in te schakelen, meldt u zich op elk apparaat opnieuw aan.";
"auth_add_email_and_phone_warning" = "Registratie met e-mailadres en telefoonnummer tegelijkertijd wordt, totdat de API bestaat, nog niet ondersteund. Alleen het telefoonnummer zal worden gebruikt. U kunt uw e-mailadres later aan uw profiel in de instellingen toevoegen.";
// Chat creation
"room_creation_title" = "Nieuw gesprek";
"room_creation_title" = "Nieuwe chat";
"room_creation_account" = "Account";
"room_creation_appearance" = "Uiterlijk";
"room_creation_appearance_name" = "Naam";
@@ -108,29 +108,29 @@
"room_creation_make_public_prompt_msg" = "Weet u zeker dat u dit gesprek publiek wilt maken? Iedereen kan uw berichten lezen en aan het gesprek deelnemen.";
"room_creation_keep_private" = "Privé houden";
"room_creation_make_private" = "Privé maken";
"room_creation_wait_for_creation" = "Er wordt al een gesprek aangemaakt. Even geduld.";
"room_creation_wait_for_creation" = "Er wordt al een kamer aangemaakt. Even geduld.";
"room_creation_invite_another_user" = "Zoeken/uitnodigen met gebruikers-ID, naam of e-mailadres";
// Room recents
"room_recents_directory_section" = "GESPREKSCATALOGUS";
"room_recents_directory_section" = "KAMERGIDS";
"room_recents_favourites_section" = "FAVORIETEN";
"room_recents_people_section" = "PERSONEN";
"room_recents_conversations_section" = "GESPREKKEN";
"room_recents_no_conversation" = "Geen gesprekken";
"room_recents_conversations_section" = "KAMERS";
"room_recents_no_conversation" = "Geen kamers";
"room_recents_low_priority_section" = "LAGE PRIORITEIT";
"room_recents_invites_section" = "UITNODIGINGEN";
"room_recents_start_chat_with" = "Gesprek beginnen";
"room_recents_create_empty_room" = "Gesprek aanmaken";
"room_recents_join_room" = "Gesprek toetreden";
"room_recents_join_room_title" = "Neem aan een gesprek deel";
"room_recents_join_room_prompt" = "Voer een gespreks(bij)naam in";
"room_recents_create_empty_room" = "Kamer aanmaken";
"room_recents_join_room" = "Kamer toetreden";
"room_recents_join_room_title" = "Kamer toetreden";
"room_recents_join_room_prompt" = "Voer een kamer-ID of kameralias in";
// People tab
"people_invites_section" = "UITNODIGINGEN";
"people_conversation_section" = "GESPREKKEN";
"people_no_conversation" = "Geen gesprekken";
// Rooms tab
"room_directory_no_public_room" = "Geen publieke gesprekken beschikbaar";
"room_directory_no_public_room" = "Geen publieke kamers beschikbaar";
// Search
"search_rooms" = "Gesprekken";
"search_rooms" = "Kamers";
"search_messages" = "Berichten";
"search_people" = "Personen";
"search_files" = "Bestanden";
@@ -139,7 +139,7 @@
"search_no_result" = "Geen resultaten";
// Directory
"directory_cell_title" = "Bladeren door de catalogus";
"directory_cell_description" = "%tu gesprekken";
"directory_cell_description" = "%tu kamers";
"directory_search_results_title" = "Bladeren door catalogusresultaten";
"directory_search_results" = "%tu resultaten gevonden voor %@";
"directory_search_results_more_than" = ">%tu resultaten gevonden voor %@";
@@ -156,14 +156,14 @@
"room_participants_add_participant" = "Deelnemer toevoegen";
"room_participants_one_participant" = "1 deelnemer";
"room_participants_multi_participants" = "%d deelnemers";
"room_participants_leave_prompt_title" = "Gesprek verlaten";
"room_participants_leave_prompt_msg" = "Weet u zeker dat u het gesprek wilt verlaten?";
"room_participants_leave_prompt_title" = "Kamer verlaten";
"room_participants_leave_prompt_msg" = "Weet u zeker dat u de kamer wilt verlaten?";
"room_participants_remove_prompt_title" = "Bevestiging";
"room_participants_remove_prompt_msg" = "Weet u zeker dat u %@ uit dit gesprek wilt verwijderen?";
"room_participants_remove_third_party_invite_msg" = "Verwijderen van uitnodigingen door derde partijen wordt, totdat de API bestaat, nog niet ondersteund";
"room_participants_invite_prompt_title" = "Bevestiging";
"room_participants_invite_prompt_msg" = "Weet u zeker dat u %@ in dit gesprek wilt uitnodigen?";
"room_participants_filter_room_members" = "Filter gespreksleden";
"room_participants_filter_room_members" = "Kamerleden filteren";
"room_participants_invite_another_user" = "Zoeken/uitnodigen met gebruikers-ID, naam of e-mailadres";
"room_participants_invite_malformed_id_title" = "Uitnodigingsfout";
"room_participants_invite_malformed_id" = "Ongeldige ID. Dit zou een e-mailadres of een Matrix-ID zoals @gebruikersnaam:domein moeten zijn";
@@ -179,9 +179,9 @@
"room_participants_action_section_devices" = "Apparaten";
"room_participants_action_section_other" = "Overige";
"room_participants_action_invite" = "Uitnodigen";
"room_participants_action_leave" = "Dit gesprek verlaten";
"room_participants_action_remove" = "Verwijderen uit dit gesprek";
"room_participants_action_ban" = "Verbannen uit dit gesprek";
"room_participants_action_leave" = "Deze kamer verlaten";
"room_participants_action_remove" = "Verwijderen uit deze kamer";
"room_participants_action_ban" = "Verbannen uit deze kamer";
"room_participants_action_unban" = "Ontbannen";
"room_participants_action_ignore" = "Alle berichten van deze gebruiker verbergen";
"room_participants_action_unignore" = "Alle berichten van deze gebruiker tonen";
@@ -226,28 +226,28 @@
"room_event_action_cancel_upload" = "Uploaden annuleren";
"room_event_action_cancel_download" = "Downloaden annuleren";
"room_event_action_view_encryption" = "Versleutelingsinformatie";
"room_warning_about_encryption" = "Eind-tot-eindversleuteling is in bèta en kan onbetrouwbaar zijn.\n\nHet is beter om het nog niet met gevoelige gegevens te vertrouwen.\n\nApparaten kunnen de geschiedenis van vóór ze het gesprek betraden nog niet ontsleutelen.\n\nVersleutelde berichten zullen niet zichtbaar zijn op cliënten die nog geen versleuteling ondersteunen.";
"room_warning_about_encryption" = "Eind-tot-eindversleuteling is in bèta en kan onbetrouwbaar zijn.\n\nHet is beter om het nog niet met gevoelige gegevens te vertrouwen.\n\nApparaten kunnen de geschiedenis van vóór ze de kamer betraden nog niet ontsleutelen.\n\nVersleutelde berichten zullen niet zichtbaar zijn op cliënten die nog geen versleuteling ondersteunen.";
// Unknown devices
"unknown_devices_alert_title" = "Gesprek bevat onbekende sessies";
"unknown_devices_alert" = "Dit gesprek bevat onbekende apparaten die niet geverifieerd zijn.\nDit betekent dat er geen garantie is dat de apparaten bij de gebruikers horen waarbij ze beweren te horen.\nWe raden u aan om bij elk apparaat door het verificatieproces heen te gaan voordat u verdergaat, maar u kunt het bericht ook zonder verificatie opnieuw versturen.";
"unknown_devices_alert_title" = "Kamer bevat onbekende sessies";
"unknown_devices_alert" = "Deze kamer bevat onbekende apparaten die niet geverifieerd zijn.\nDit betekent dat er geen garantie is dat de apparaten bij de personen horen waarbij ze beweren te horen.\nWe raden u aan om bij elk apparaat door het verificatieproces heen te gaan voordat u verdergaat, maar u kunt het bericht ook zonder verificatie opnieuw versturen.";
"unknown_devices_send_anyway" = "Alsnog versturen";
"unknown_devices_call_anyway" = "Alsnog bellen";
"unknown_devices_answer_anyway" = "Alsnog beantwoorden";
"unknown_devices_verify" = "Verifiëren…";
"unknown_devices_title" = "Onbekende apparaten";
// Room Title
"room_title_new_room" = "Nieuw gesprek";
"room_title_new_room" = "Nieuwe kamer";
"room_title_multiple_active_members" = "%@/%@ actieve leden";
"room_title_one_active_member" = "%@/%@ actief lid";
"room_title_invite_members" = "Leden uitnodigen";
"room_title_members" = "%@ leden";
"room_title_one_member" = "1 lid";
// Room Preview
"room_preview_invitation_format" = "U bent door %@ uitgenodigd om dit gesprek toe te treden";
"room_preview_subtitle" = "Dit is een voorvertoning van dit gesprek. Gespreksinteracties zijn uitgeschakeld.";
"room_preview_invitation_format" = "U bent door %@ uitgenodigd om deze kamer toe te treden";
"room_preview_subtitle" = "Dit is een voorvertoning van deze kamer. Kamerinteracties zijn uitgeschakeld.";
"room_preview_unlinked_email_warning" = "Deze uitnodiging is naar %@ verstuurd, maar dat is niet geassocieerd met deze account. U kunt zich met een andere account aanmelden, of dit e-mailadres aan deze account toevoegen.";
"room_preview_try_join_an_unknown_room" = "U probeert toegang te verkrijgen tot %@. Zou u willen toetreden om aan het gesprek deel te nemen?";
"room_preview_try_join_an_unknown_room_default" = "een gesprek";
"room_preview_try_join_an_unknown_room_default" = "een kamer";
// Settings
"settings_title" = "Instellingen";
"account_logout_all" = "Alle accounts afmelden";
@@ -255,7 +255,7 @@
"settings_mark_all_as_read" = "Alle berichten als gelezen markeren";
"settings_report_bug" = "Fout rapporteren";
"settings_clear_cache" = "Cache verwijderen";
"settings_config_home_server" = "Thuisserver is %@";
"settings_config_home_server" = "Server is %@";
"settings_config_identity_server" = "Identiteitsserver is %@";
"settings_config_user_id" = "Aangemeld als %@";
"settings_user_settings" = "GEBRUIKERSINSTELLINGEN";
@@ -269,7 +269,7 @@
"settings_cryptography" = "CRYPTOGRAFIE";
"settings_sign_out" = "Afmelden";
"settings_sign_out_confirmation" = "Weet u het zeker?";
"settings_sign_out_e2e_warn" = "U zult uw sleutels voor eind-tot-eind-versleuteling kwijtraken. Dat betekent dat u op dit apparaat geen oude berichten in versleutelde gesprekken meer zult kunnen lezen.";
"settings_sign_out_e2e_warn" = "U zult uw sleutels voor eind-tot-eindversleuteling kwijtraken. Dat betekent dat u op dit apparaat geen oude berichten in versleutelde gesprekken meer zult kunnen lezen.";
"settings_profile_picture" = "Profielfoto";
"settings_display_name" = "Weergavenaam";
"settings_first_name" = "Voornaam";
@@ -287,9 +287,8 @@
"settings_fail_to_update_profile" = "Bijwerken van profiel is mislukt";
"settings_enable_push_notif" = "Meldingen op dit apparaat";
"settings_global_settings_info" = "Globale meldingsinstellingen zijn beschikbaar op uw %@-webcliënt";
"settings_pin_rooms_with_missed_notif" = "Gesprekken met gemiste meldingen vastprikken";
"settings_pin_rooms_with_unread" = "Gesprekken met ongelezen berichten vastprikken";
"settings_on_denied_notification" = "Meldingen worden geweigerd voor %@, sta ze toe in uw apparaatinstellingen";
"settings_pin_rooms_with_missed_notif" = "Kamers met gemiste meldingen vastprikken";
"settings_pin_rooms_with_unread" = "Kamers met ongelezen berichten vastprikken";
//"settings_enable_all_notif" = "Alle notificaties aanzetten";
//"settings_messages_my_display_name" = "Bericht dat mijn naam bevat";
//"settings_messages_my_user_name" = "Bericht dat mijn gebruikersnaam bevat";
@@ -323,71 +322,71 @@
"settings_crypto_export" = "Sleutels exporteren";
"settings_crypto_blacklist_unverified_devices" = "Alleen naar geverifieerde apparaten versleutelen";
// Room Details
"room_details_title" = "Gespreksdetails";
"room_details_title" = "Kamerdetails";
"room_details_people" = "Leden";
"room_details_files" = "Bestanden";
"room_details_settings" = "Instellingen";
"room_details_photo" = "Gespreksfoto";
"room_details_room_name" = "Gespreksnaam";
"room_details_photo" = "Kamerfoto";
"room_details_room_name" = "Kamernaam";
"room_details_topic" = "Onderwerp";
"room_details_favourite_tag" = "Favoriet";
"room_details_low_priority_tag" = "Lage prioriteit";
"room_details_mute_notifs" = "Meldingen dempen";
"room_details_access_section" = "Wie kan er tot dit gesprek toetreden?";
"room_details_access_section" = "Wie kan er tot deze kamer toetreden?";
"room_details_access_section_invited_only" = "Alleen personen die zijn uitgenodigd";
"room_details_access_section_anyone_apart_from_guest" = "Iedereen die de koppeling van het gesprek kent, behalve gasten";
"room_details_access_section_anyone" = "Iedereen die de koppeling van het gesprek kent, inclusief gasten";
"room_details_access_section_no_address_warning" = "Het gesprek moet een adres hebben om ernaar te verwijzen";
"room_details_access_section_directory_toggle" = "Gesprek tonen in gesprekscatalogus";
"room_details_access_section_anyone_apart_from_guest" = "Iedereen die het adres van deze kamer kent, behalve gasten";
"room_details_access_section_anyone" = "Iedereen die het adres van deze kamer kent, inclusief gasten";
"room_details_access_section_no_address_warning" = "De kamer moet een adres hebben om ernaar te verwijzen";
"room_details_access_section_directory_toggle" = "Kamer tonen in de kamersgids";
"room_details_history_section" = "Wie kan er de geschiedenis lezen?";
"room_details_history_section_anyone" = "Iedereen";
"room_details_history_section_members_only" = "Alleen leden (vanaf het moment dat deze optie geselecteerd wordt)";
"room_details_history_section_members_only_since_invited" = "Alleen leden (vanaf het moment dat ze uitgenodigd zijn)";
"room_details_history_section_members_only_since_joined" = "Alleen leden (vanaf het moment dat ze toetreden)";
"room_details_history_section_prompt_title" = "Privacywaarschuwing";
"room_details_history_section_prompt_msg" = "Veranderingen aan wie de geschiedenis kan lezen zullen alleen gelden voor toekomstige berichten in dit gesprek. De zichtbaarheid van de bestaande geschiedenis zal onveranderd blijven.";
"room_details_history_section_prompt_msg" = "Veranderingen aan wie de geschiedenis kan lezen zullen alleen gelden voor toekomstige berichten in deze kamer. De zichtbaarheid van de bestaande geschiedenis zal onveranderd blijven.";
"room_details_addresses_section" = "Adressen";
"room_details_no_local_addresses" = "Dit gesprek heeft geen lokale adressen";
"room_details_no_local_addresses" = "Deze kamer heeft geen lokale adressen";
"room_details_new_address" = "Nieuw adres toevoegen";
"room_details_new_address_placeholder" = "Nieuw adres toevoegen (bv. #foo%@)";
"room_details_addresses_invalid_address_prompt_title" = "Ongeldig bijnaamformaat";
"room_details_addresses_invalid_address_prompt_msg" = "%@ is geen geldig formaat voor een bijnaam";
"room_details_addresses_disable_main_address_prompt_title" = "Hoofdadreswaarschuwing";
"room_details_addresses_disable_main_address_prompt_msg" = "U heeft geen hoofdadres opgegeven. Het standaardhoofdadres voor dit gesprek zal willekeurig gekozen worden";
"room_details_addresses_disable_main_address_prompt_msg" = "U heeft geen hoofdadres opgegeven. Het standaardhoofdadres voor deze kamer zal willekeurig gekozen worden";
"room_details_banned_users_section" = "Verbannen gebruikers";
"room_details_advanced_section" = "Geavanceerd";
"room_details_advanced_room_id" = "Gespreks-ID:";
"room_details_advanced_room_id" = "Kamer-ID:";
"room_details_advanced_enable_e2e_encryption" = "Versleuteling inschakelen (let op: dit kan niet meer worden uitgeschakeld!)";
"room_details_advanced_e2e_encryption_enabled" = "Versleuteling is ingeschakeld in dit gesprek";
"room_details_advanced_e2e_encryption_disabled" = "Versleuteling is niet ingeschakeld in dit gesprek.";
"room_details_advanced_e2e_encryption_enabled" = "Versleuteling is ingeschakeld in deze kamer";
"room_details_advanced_e2e_encryption_disabled" = "Versleuteling is niet ingeschakeld in deze kamer.";
"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Alleen naar geverifieerde apparaten versleutelen";
"room_details_advanced_e2e_encryption_prompt_message" = "End-to-endbeveiliging is experimenteel en kan onbetrouwbaar zijn.\n\nHet is beter om het nog niet met gevoelige gegevens te vertrouwen.\n\nApparaten kunnen de geschiedenis van voordat ze de ruimte betraden nog niet ontsleutelen.\n\nZodra de versleuteling aan staat kan het (voorlopig) niet worden uitgezet.\n\nVersleutelde berichten zullen nog niet zichtbaar zijn op programma's die geen versleuteling ondersteunen.";
"room_details_fail_to_update_avatar" = "Bijwerken van gespreksfoto is mislukt";
"room_details_fail_to_update_room_name" = "Bijwerken van gespreksnaam is mislukt";
"room_details_fail_to_update_avatar" = "Bijwerken van kamerafbeelding is mislukt";
"room_details_fail_to_update_room_name" = "Bijwerken van kamernaam is mislukt";
"room_details_fail_to_update_topic" = "Bijwerken van gespreksonderwerp is mislukt";
"room_details_fail_to_update_room_guest_access" = "Bijwerken van gasttoegang tot gesprek is mislukt";
"room_details_fail_to_update_room_guest_access" = "Bijwerken van gasttoegang voor kamer is mislukt";
"room_details_fail_to_update_room_join_rule" = "Bijwerken van toetredingsregel is mislukt";
"room_details_fail_to_update_room_directory_visibility" = "Bijwerken van zichtbaarheid in de gesprekscatalogus is mislukt";
"room_details_fail_to_update_room_directory_visibility" = "Bijwerken van zichtbaarheid in de kamersgids is mislukt";
"room_details_fail_to_update_history_visibility" = "Bijwerken van zichtbaarheid van geschiedenis is mislukt";
"room_details_fail_to_add_room_aliases" = "Toevoegen van nieuwe gespreksadressen is mislukt";
"room_details_fail_to_remove_room_aliases" = "Verwijderen van gespreksadressen is mislukt";
"room_details_fail_to_add_room_aliases" = "Toevoegen van nieuwe kameradressen is mislukt";
"room_details_fail_to_remove_room_aliases" = "Verwijderen van kameradressen is mislukt";
"room_details_fail_to_update_room_canonical_alias" = "Bijwerken van hoofdadres is mislukt";
"room_details_fail_to_enable_encryption" = "Inschakelen van versleuteling in dit gesprek is mislukt";
"room_details_fail_to_enable_encryption" = "Inschakelen van versleuteling in deze kamer is mislukt";
"room_details_save_changes_prompt" = "Wilt u de wijzigingen opslaan?";
"room_details_set_main_address" = "Instellen als hoofdadres";
"room_details_unset_main_address" = "Niet instellen als hoofdadres";
"room_details_copy_room_id" = "Gespreks-ID kopiëren";
"room_details_copy_room_address" = "Gespreksadres kopiëren";
"room_details_copy_room_url" = "Gespreks-URL kopiëren";
"room_details_copy_room_id" = "Kamer-ID kopiëren";
"room_details_copy_room_address" = "Kameradres kopiëren";
"room_details_copy_room_url" = "Kamer-URL kopiëren";
// Media picker
"media_picker_library" = "Bibliotheek";
"media_picker_select" = "Selecteren";
// Directory
"directory_title" = "Catalogus";
"directory_server_picker_title" = "Selecteer een catalogus";
"directory_server_all_rooms" = "Alle gesprekken op server %@";
"directory_server_all_native_rooms" = "Alle lokale Matrix-gesprekken";
"directory_server_type_homeserver" = "Voer een thuisserver in om de publieke gesprekken ervan weer te geven";
"directory_server_all_rooms" = "Alle kamers op server %@";
"directory_server_all_native_rooms" = "Alle lokale Matrix-kamers";
"directory_server_type_homeserver" = "Voer een server in om de publieke kamers ervan weer te geven";
"directory_server_placeholder" = "matrix.org";
// Others
"or" = "of";
@@ -395,7 +394,7 @@
"today" = "Vandaag";
"yesterday" = "Gisteren";
"network_offline_prompt" = "Het ziet er naar uit dat de internetverbinding offline is.";
"public_room_section_title" = "Publieke gesprekken (op %@):";
"public_room_section_title" = "Publieke kamers (op %@):";
"bug_report_prompt" = "De app is de vorige keer gecrasht. Wilt u een crashrapport indienen?";
"rage_shake_prompt" = "Het ziet er naar uit dat u de telefoon in frustratie schudt. Wilt u een foutmelding indienen?";
"camera_access_not_granted" = "%@ heeft geen toestemming om de camera te gebruiken, pas de privacy-instellingen aan";
@@ -410,7 +409,7 @@
"google_analytics_use_prompt" = "Wilt u helpen met het verbeteren van %@ door anonieme crashrapporten en gebruiksstatistieken te versturen?";
// Crypto
"e2e_enabling_on_app_update" = "Element ondersteunt nu eind-tot-eind-versleuteling, maar u moet zich opnieuw aanmelden om het in te schakelen.\n\nU kunt dit nu of later doen vanuit de app-instellingen.";
"e2e_need_log_in_again" = "U moet zich opnieuw aanmelden om sleutels voor eind-tot-eind-versleuteling te genereren voor dit apparaat, en om de publieke sleutel naar uw thuisserver te sturen.\nDit is eenmalig; excuses voor het ongemak.";
"e2e_need_log_in_again" = "U moet zich opnieuw aanmelden om sleutels voor eind-tot-eind-versleuteling te genereren voor dit apparaat, en om de publieke sleutel naar uw server te sturen.\nDit is eenmalig; excuses voor het ongemak.";
// Bug report
"bug_report_title" = "Foutmelding";
"bug_report_description" = "Beschrijf de foutmelding. Wat heeft u gedaan? Wat verwachtte u dat er zou gebeuren? Wat is er echt gebeurd?";
@@ -440,12 +439,12 @@
"auth_identity_server_placeholder" = "URL (bv. https://vector.im)";
"room_ongoing_conference_call_with_close" = "Er is een vergadergesprek gaande. Neem deel met %@ of %@. %@ het.";
"room_ongoing_conference_call_close" = "Sluiten";
"room_conference_call_no_power" = "U heeft toestemming nodig om vergadergesprekken in dit groepsgesprek te beheren";
"room_conference_call_no_power" = "U heeft toestemming nodig om vergaderingen in deze kamer te beheren";
"settings_labs_create_conference_with_jitsi" = "Maak vergadergesprekken met jitsi";
"call_already_displayed" = "Er is al een oproep aan de gang.";
"call_jitsi_error" = "Deelnemen aan het vergadergesprek is mislukt.";
// Widget
"widget_no_power_to_manage" = "U heeft toestemming nodig om widgets in dit gesprek te beheren";
"widget_no_power_to_manage" = "U heeft toestemming nodig om widgets in deze kamer te beheren";
"widget_creation_failure" = "Aanmaken van widget is mislukt";
"send_to" = "Stuur naar %@";
"sending" = "Wordt verstuurd";
@@ -465,7 +464,7 @@
"settings_ui_theme_picker_message" = "Automatisch gebruikt de instelling Kleurweergave omkeren van uw apparaat";
"settings_enable_rageshake" = "Schud de telefoon om een fout te rapporteren";
"room_details_direct_chat" = "Tweegesprek";
"room_details_fail_to_update_room_direct" = "Bijwerken van de tweegespreksvlag in dit gesprek is mislukt";
"room_details_fail_to_update_room_direct" = "Bijwerken van de directe chat-vlag in deze kamer is mislukt";
"event_formatter_widget_added" = "%@ widget toegevoegd door %@";
"event_formatter_widget_removed" = "%@ widget verwijderd door %@";
"event_formatter_jitsi_widget_added" = "VoIP-vergadergesprek toegevoegd door %@";
@@ -477,16 +476,16 @@
"widget_integration_need_to_be_able_to_invite" = "U moet gebruikers kunnen uitnodigen om dat te kunnen doen.";
"widget_integration_unable_to_create" = "Kan widget niet aanmaken.";
"widget_integration_failed_to_send_request" = "Versturen van verzoek is mislukt.";
"widget_integration_room_not_recognised" = "Dit gesprek wordt niet herkend.";
"widget_integration_room_not_recognised" = "Deze kamer wordt niet herkend.";
"widget_integration_positive_power_level" = "Het machtsniveau moet een positief geheel getal zijn.";
"widget_integration_must_be_in_room" = "U zit niet in dit gesprek.";
"widget_integration_no_permission_in_room" = "U heeft geen toestemming om dat in dit gesprek te doen.";
"widget_integration_missing_room_id" = "room_id ontbreekt in het verzoek.";
"widget_integration_must_be_in_room" = "U zit niet in deze kamer.";
"widget_integration_no_permission_in_room" = "U heeft geen toestemming om dat in deze kamer te doen.";
"widget_integration_missing_room_id" = "kamer_id ontbreekt in het verzoek.";
"widget_integration_missing_user_id" = "user_id ontbreekt in het verzoek.";
"widget_integration_room_not_visible" = "Gesprek %@ is niet zichtbaar.";
"widget_integration_room_not_visible" = "Kamer %@ is niet zichtbaar.";
// Share extension
"share_extension_auth_prompt" = "Meld u aan in de hoofdapp om inhoud te delen";
"share_extension_failed_to_encrypt" = "Versturen is mislukt. Controleer in de hoofdapp de versleutelingsinstellingen van dit gesprek";
"share_extension_failed_to_encrypt" = "Versturen is mislukt. Controleer in de hoofdapp de versleutelingsinstellingen van deze kamer";
// Room key request dialog
"e2e_room_key_request_title" = "Versleutelingssleutelverzoek";
"e2e_room_key_request_message" = "Uw ongeverifieerde apparaat %@ vraagt naar versleutelingssleutels.";
@@ -497,7 +496,7 @@
// Groups tab
"group_invite_section" = "UITNODIGINGEN";
"group_section" = "GEMEENSCHAPPEN";
"room_do_not_have_permission_to_post" = "U heeft geen toestemming om in dit gesprek te posten";
"room_do_not_have_permission_to_post" = "U heeft geen toestemming om in deze kamer te plaatsen";
"settings_flair" = "Badge weergeven waar toegestaan";
"room_details_flair_section" = "Badge voor gemeenschappen weergeven";
"room_details_new_flair_placeholder" = "Nieuwe gemeenschaps-ID toevoegen (bv. +foo%@)";
@@ -508,12 +507,12 @@
"group_details_title" = "Gemeenschapsdetails";
"group_details_home" = "Thuis";
"group_details_people" = "Personen";
"group_details_rooms" = "Gesprekken";
"group_details_rooms" = "Kamers";
// Group Home
"group_home_one_member_format" = "1 lid";
"group_home_multi_members_format" = "%tu leden";
"group_home_one_room_format" = "1 gesprek";
"group_home_multi_rooms_format" = "%tu gesprekken";
"group_home_one_room_format" = "1 kamer";
"group_home_multi_rooms_format" = "%tu kamers";
"group_invitation_format" = "%@ heeft u uitgenodigd om tot deze gemeenschap toe te treden";
// Group participants
"group_participants_add_participant" = "Deelnemer toevoegen";
@@ -529,12 +528,12 @@
"group_participants_invite_malformed_id" = "Misvormde ID. Dit moet een Matrix-ID zijn, zoals @gebruikersnaam:domein";
"group_participants_invited_section" = "UITGENODIGD";
// Group rooms
"group_rooms_filter_rooms" = "Gemeenschapsgesprekken filteren";
"group_rooms_filter_rooms" = "Gemeenschapskamers filteren";
"e2e_room_key_request_message_new_device" = "U heeft een nieuw apparaat %@ toegevoegd, dat vraagt naar versleutelingssleutels.";
"room_event_action_kick_prompt_reason" = "Reden voor het verwijderen van deze gebruiker";
"room_event_action_ban_prompt_reason" = "Reden voor het verbannen van deze gebruiker";
// GDPR
"gdpr_consent_not_given_alert_message" = "Om de %@-thuisserver te blijven gebruiken moet u de algemene voorwaarden lezen en er mee akkoord gaan.";
"gdpr_consent_not_given_alert_message" = "Om de %@-server te blijven gebruiken moet u de algemene voorwaarden lezen en er mee akkoord gaan.";
"gdpr_consent_not_given_alert_review_now_action" = "Nu lezen";
"room_action_send_photo_or_video" = "Foto of video versturen";
"room_action_send_sticker" = "Sticker versturen";
@@ -549,7 +548,7 @@
"widget_sticker_picker_no_stickerpacks_alert" = "U heeft momenteel geen stickerpakketten ingeschakeld.";
"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Wilt u er nu een paar toevoegen?";
"deactivate_account_title" = "Account deactiveren";
"deactivate_account_informations_part1" = "Dit zal uw account voorgoed onbruikbaar maken. U zult zich niet meer kunnen aanmelden, en niemand anders zal zich met dezelfde gebruikers-ID kunnen registreren. Dit zal er voor zorgen dat uw account alle gesprekken verlaat waar deze momenteel lid van is, en het verwijdert uw accountgegevens van de identiteitsserver. ";
"deactivate_account_informations_part1" = "Dit zal uw account voorgoed onbruikbaar maken. U zult zich niet meer kunnen aanmelden, en niemand anders zal zich met dezelfde persoon-ID kunnen registreren. Dit zal er voor zorgen dat uw account alle kamers verlaat waar deze momenteel lid van is, en het verwijdert uw gegevens van de identiteitsserver. ";
"deactivate_account_informations_part2_emphasize" = "Deze actie is onomkeerbaar.";
"deactivate_account_informations_part3" = "\n\nHet deactiveren van uw account ";
"deactivate_account_informations_part4_emphasize" = "zal er standaard niet voor zorgen dat de berichten die u heeft verzonden worden vergeten. ";
@@ -565,21 +564,21 @@
"room_message_reply_to_short_placeholder" = "Stuur een antwoord…";
// String for App Store
"store_short_description" = "Veilig en gedecentraliseerd chatten en bellen";
"store_full_description" = "Element is een nieuw type messenger en samenwerkings app die:\n\n1. U de controle geeft om uw privacy te behouden\n2. U laat communiceren met iedereen in het Matrix-netwerk, en zelfs daarbuiten door integratie met apps zoals Slack\n3. Beschermt u tegen reclame, datamining, achterdeurtjes en ommuurde netwerken\n4. Beveiligt u door eind-tot-eind versleuteling, met kruislings ondertekenen om anderen te verifiëren\n\nElement is compleet anders dan andere messengers en samenwerkings-apps, omdat het gedecentraliseerd en open source is.\n\nMet Element kunt u zelf hosten - of een host kiezen - zodat u privacy, eigendom en controle heeft over uw gegevens en gesprekken. Het geeft u toegang tot een open netwerk; u zit dus niet vast aan het praten met alleen andere Element-gebruikers. En het is zeer veilig.\n\nElement is hiertoe in staat omdat het werkt op basis van Matrix - de standaard voor open, gedecentraliseerde communicatie. \n\nElement geeft u de controle door u te laten kiezen wie uw gesprekken host. Vanuit de Element app kunt u kiezen om op verschillende manieren te hosten:\n\n1. Neem een gratis account op de publieke server matrix.org\n2. Host het zelf, uw account door draait op uw eigen server\n3. Laat ons het hosten, meld u aan voor een account op een aangepaste server bij het Element Matrix Services hosting platform\n\nWaarom kiest u voor Element?\n\nEIGENAAR VAN UW GEGEVENS: U bepaalt waar uw gegevens en berichten worden bewaard. U bent de eigenaar en heeft de controle, niet een of andere MEGACORP die uw gegevens mijnt of toegang geeft aan derden.\n\nOPEN MESSAGING EN SAMENWERKING: U kunt met iedereen in het Matrix-netwerk chatten, of ze nu Element of een andere Matrix-app gebruiken, en zelfs als ze een ander messaging-systeem gebruiken zoals Slack, IRC of XMPP.\n\nSUPER-VEILIG: Echte eind-tot-eind versleuteling (alleen degenen in de conversatie kunnen berichten ontsleutelen), en kruislings ondertekenen om de apparaten van gespreksdeelnemers te verifiëren.\n\nCOMPLETE COMMUNICATIE: Berichten, spraak- en videogesprekken, bestandsdeling, schermdeling en een heleboel integraties, bots en widgets. Bouw gesprekken, gemeenschappen, blijf in contact en krijg het gedaan.\n\nOVERAL WAAR U BENT: Blijf in contact waar u ook bent met volledig gesynchroniseerde berichtgeschiedenis op al uw apparaten en op het web op https://element.io/app.";
"store_full_description" = "Element is een nieuw type messenger en samenwerkings app die:\n\n1. U de controle geeft om uw privacy te behouden\n2. U laat communiceren met iedereen in het Matrix-netwerk, en zelfs daarbuiten door integratie met apps zoals Slack\n3. Beschermt u tegen reclame, datamining, achterdeurtjes en ommuurde netwerken\n4. Beveiligt u door eind-tot-eind versleuteling, met kruislings ondertekenen om anderen te verifiëren\n\nElement is compleet anders dan andere messengers en samenwerkings-apps, omdat het gedecentraliseerd en open source is.\n\nMet Element kunt u zelf hosten - of een host kiezen - zodat u privacy, eigendom en controle heeft over uw gegevens en gesprekken. Het geeft u toegang tot een open netwerk; u zit dus niet vast aan het praten met alleen andere Element-gebruikers. En het is zeer veilig.\n\nElement is hiertoe in staat omdat het werkt op basis van Matrix - de standaard voor open, gedecentraliseerde communicatie. \n\nElement geeft u de controle door u te laten kiezen wie uw gesprekken host. Vanuit de Element app kunt u kiezen om op verschillende manieren te hosten:\n\n1. Neem een gratis account op de publieke server matrix.org\n2. Host het zelf, uw account door draait op uw eigen server\n3. Laat ons het hosten, meld u aan voor een account op een aangepaste server bij het Element Matrix Services hosting platform\n\nWaarom kiest u voor Element?\n\nEIGENAAR VAN UW GEGEVENS: U bepaalt waar uw gegevens en berichten worden bewaard. U bent de eigenaar en heeft de controle, niet een of andere MEGACORP die uw gegevens mijnt of toegang geeft aan derden.\n\nOPEN MESSAGING EN SAMENWERKING: U kunt met iedereen in het Matrix-netwerk chatten, of ze nu Element of een andere Matrix-app gebruiken, en zelfs als ze een ander messaging-systeem gebruiken zoals Slack, IRC of XMPP.\n\nSUPER-VEILIG: Echte eind-tot-eind versleuteling (alleen degenen in de conversatie kunnen berichten ontsleutelen), en kruislings ondertekenen om de apparaten van gespreksdeelnemers te verifiëren.\n\nCOMPLETE COMMUNICATIE: Berichten, spraak- en videogesprekken, bestandsdeling, schermdeling en een heleboel integraties, bots en widgets. Bouw kamers, spaces, blijf in contact en krijg het gedaan.\n\nOVERAL WAAR U BENT: Blijf in contact waar u ook bent met volledig gesynchroniseerde berichtgeschiedenis op al uw apparaten en op het web op https://element.io/app.";
"auth_login_single_sign_on" = "Aanmelden met enkele aanmelding";
"auth_accept_policies" = "Gelieve het beleid van deze thuisserver te lezen en aanvaarden:";
"auth_autodiscover_invalid_response" = "Ongeldig thuisserverontdekkingsantwoord";
"auth_accept_policies" = "Gelieve het beleid van deze server te lezen en aanvaarden:";
"auth_autodiscover_invalid_response" = "Ongeldig server-ontdekkings-antwoord";
"room_recents_server_notice_section" = "SYSTEEMMELDINGEN";
"room_message_unable_open_link_error_message" = "Kan de koppeling niet openen.";
"room_replacement_information" = "Dit gesprek is vervangen en is niet langer actief.";
"room_replacement_information" = "Deze kamer is vervangen en is niet langer actief.";
"room_replacement_link" = "Het gesprek gaat hier verder.";
"room_predecessor_information" = "Dit gesprek is een voortzetting van een ander gesprek.";
"room_predecessor_information" = "Deze kamer is een voortzetting van een eerdere kamer.";
"room_predecessor_link" = "Tik hier om oudere berichten te zien.";
"room_resource_limit_exceeded_message_contact_1" = " Gelieve ";
"room_resource_limit_exceeded_message_contact_2_link" = "contact op te nemen met uw dienstbeheerder";
"room_resource_limit_exceeded_message_contact_3" = " om deze dienst te blijven gebruiken.";
"room_resource_usage_limit_reached_message_1_default" = "Deze thuisserver heeft één van zijn bronlimieten overschreden, dus ";
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Deze thuisserver heeft zijn limiet voor maandelijks actieve gebruikers overschreden, dus ";
"room_resource_usage_limit_reached_message_1_default" = "Deze server heeft één van zijn bronlimieten overschreden, dus ";
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Deze server heeft zijn limiet voor maandelijks actieve gebruikers overschreden, dus ";
"room_resource_usage_limit_reached_message_2" = "sommige gebruikers zullen zich niet kunnen aanmelden.";
"room_resource_usage_limit_reached_message_contact_3" = " om deze limiet te verhogen.";
"settings_key_backup" = "SLEUTELBACK-UP";
@@ -606,7 +605,7 @@
"settings_key_backup_button_delete" = "Back-up verwijderen";
"settings_key_backup_delete_confirmation_prompt_title" = "Back-up verwijderen";
"settings_key_backup_delete_confirmation_prompt_msg" = "Weet u het zeker? Als uw sleutels niet correct geback-upt zijn, zult u uw versleutelde berichten verliezen.";
"homeserver_connection_lost" = "Kon geen verbinding maken met de thuisserver.";
"homeserver_connection_lost" = "Kon geen verbinding maken met de server.";
"room_does_not_exist" = "%@ bestaat niet";
// Key backup wrong version
"e2e_key_backup_wrong_version_title" = "Nieuwe sleutelback-up";
@@ -618,7 +617,7 @@
"key_backup_setup_skip_alert_message" = "U verliest mogelijk uw versleutelde berichten als u zich afmeldt of uw apparaat verliest.";
"key_backup_setup_skip_alert_skip_action" = "Overslaan";
"key_backup_setup_intro_title" = "Verlies nooit uw versleutelde berichten";
"key_backup_setup_intro_info" = "Berichten in versleutelde gesprekken worden versleuteld met eind-tot-eind-beveiliging. Enkel de ontvanger(s) en u hebben de sleutels om deze berichten te lezen.\n\nMaak een veilige back-up van uw sleutels om deze niet te verliezen.";
"key_backup_setup_intro_info" = "Berichten in versleutelde kamers worden versleuteld met eind-tot-eind-versleuteling. Enkel de ontvanger(s) en u hebben de sleutels om deze berichten te lezen.\n\nMaak een veilige back-up van uw sleutels om deze niet te verliezen.";
"key_backup_setup_intro_setup_action_without_existing_backup" = "Begin sleutelback-up te gebruiken";
"key_backup_setup_intro_manual_export_info" = "(Geavanceerd)";
"key_backup_setup_intro_manual_export_action" = "Sleutels handmatig exporteren";
@@ -788,7 +787,7 @@
"close" = "Sluiten";
"auth_softlogout_signed_out" = "U bent afgemeld";
"auth_softlogout_sign_in" = "Aanmelden";
"auth_softlogout_reason" = "De beheerder van uw thuisserver (%1$@) heeft u van uw account %2$@ afgemeld (%3$@).";
"auth_softlogout_reason" = "De beheerder van uw server (%1$@) heeft u van uw account %2$@ afgemeld (%3$@).";
"auth_softlogout_recover_encryption_keys" = "Meld u aan om de versleutelingssleutels te herstellen die uitsluitend op dit apparaat worden opgeslagen. U heeft ze nodig om uw versleutelde berichten op al uw apparaten te kunnen lezen.";
"auth_softlogout_clear_data" = "Persoonlijke gegevens wissen";
"auth_softlogout_clear_data_message_1" = "Let op: uw persoonlijke gegevens (inclusief versleutelingssleutels) worden nog altijd op dit apparaat opgeslagen.";
@@ -835,7 +834,7 @@
"service_terms_modal_description_for_identity_server" = "Wees vindbaar voor anderen";
"service_terms_modal_description_for_integration_manager" = "Gebruik bots, bruggen, widgets en stickerpakketten";
// Errors
"error_user_already_logged_in" = "Het lijkt alsof u probeert te verbinden met een andere thuisserver. Wilt u zich afmelden?";
"error_user_already_logged_in" = "Het lijkt alsof u probeert te verbinden met een andere server. Wilt u zich afmelden?";
"room_participants_remove_third_party_invite_prompt_msg" = "Weet u zeker dat u deze uitnodiging wilt intrekken?";
"room_accessiblity_scroll_to_bottom" = "Scrollen naar onderen";
"room_accessibility_search" = "Zoeken";
@@ -888,7 +887,7 @@
"room_intro_cell_information_dm_sentence2" = "Alleen u twee zijn in dit gesprek, niemand anders kan deelnemen.";
"room_intro_cell_information_dm_sentence1_part3" = ". ";
"room_intro_cell_information_dm_sentence1_part1" = "Dit is het begin van uw directe gesprek met ";
"room_intro_cell_information_room_without_topic_sentence2_part2" = " om personen te laten weten waar dit gesprek over gaat.";
"room_intro_cell_information_room_without_topic_sentence2_part2" = " om personen te laten weten waar deze kamer over gaat.";
"room_intro_cell_information_room_without_topic_sentence2_part1" = "Voeg een onderwerp toe";
"room_intro_cell_information_room_with_topic_sentence2" = "Onderwerp: %@";
"room_intro_cell_information_room_sentence1_part3" = ". ";
@@ -897,11 +896,11 @@
// Mark: - Room creation introduction cell
"room_intro_cell_add_participants_action" = "Personen toevoegen";
"room_avatar_view_accessibility_hint" = "Gespreksfoto wijzigen";
"room_avatar_view_accessibility_hint" = "Kamerafbeelding wijzigen";
// Mark: - Room avatar view
"room_avatar_view_accessibility_label" = "profielfoto";
"room_avatar_view_accessibility_label" = "afbeelding";
"invite_friends_share_text" = "Hoi, start een gesprek met me op %@: %@";
// MARK: - Invite friends
@@ -911,8 +910,8 @@
// MARK: - Favourites
"favourites_empty_view_title" = "Favoriete gesprekken en personen";
"home_empty_view_information" = "De alles-in-één veilige chat-app voor teams, vrienden en organisaties. Druk op de + knop hieronder om personen en gesprekken toe te voegen.";
"favourites_empty_view_title" = "Favoriete kamers en personen";
"home_empty_view_information" = "De alles-in-één veilige chat-app voor teams, vrienden en organisaties. Druk op de + knop hieronder om personen en kamers toe te voegen.";
// MARK: - Home
@@ -935,30 +934,30 @@
"room_info_list_one_member" = "1 persoon";
"room_info_list_several_members" = "%@ personen";
"create_room_placeholder_address" = "#testroom:matrix.org";
"create_room_section_header_address" = "Adres";
"create_room_show_in_directory" = "Gesprek weergeven in de catalogus";
"create_room_section_footer_type" = "Mensen kunnen alleen met een uitnodiging deelnemen aan een privégesprek.";
"create_room_type_public" = "Openbaar gesprek";
"create_room_type_private" = "Privégesprek";
"create_room_section_header_type" = "Type gesprek";
"create_room_placeholder_address" = "#testkamer:matrix.org";
"create_room_section_header_address" = "Kameradres";
"create_room_show_in_directory" = "Kamer weergeven in de gids";
"create_room_section_footer_type" = "Personen kunnen alleen met een uitnodiging deelnemen aan een privékamer.";
"create_room_type_public" = "Publieke Kamer";
"create_room_type_private" = "Privékamer";
"create_room_section_header_type" = "Type kamer";
"create_room_section_footer_encryption" = "Versleuteling kan achteraf niet worden uitgeschakeld.";
"create_room_enable_encryption" = "Versleuteling inschakelen";
"create_room_section_header_encryption" = "Gespreksversleuteling";
"create_room_section_header_encryption" = "Kamerversleuteling";
"create_room_placeholder_topic" = "Onderwerp";
"create_room_section_header_topic" = "Onderwerp (optioneel)";
"create_room_section_header_topic" = "Kameronderwerp (optioneel)";
"create_room_placeholder_name" = "Naam";
"create_room_section_header_name" = "Naam";
"create_room_section_header_name" = "Kamernaam";
// MARK: - Create Room
"create_room_title" = "Nieuw Gesprek";
"create_room_title" = "Nieuwe Kamer";
"searchable_directory_search_placeholder" = "Naam of ID";
"searchable_directory_x_network" = "%@-netwerk";
// MARK: - Searchable Directory View Controller
"searchable_directory_create_new_room" = "Maak een nieuw gesprek";
"searchable_directory_create_new_room" = "Maak een nieuwe kamer";
"biometrics_cant_unlocked_alert_message_retry" = "Opnieuw proberen";
"biometrics_cant_unlocked_alert_message_login" = "Log opnieuw in";
"biometrics_cant_unlocked_alert_message_x" = "Gebruik %@ om te ontgrendelen of log opnieuw in en schakel %@ opnieuw in";
@@ -1080,7 +1079,7 @@
"user_verification_sessions_list_session_untrusted" = "Niet vertrouwd";
"user_verification_sessions_list_session_trusted" = "Vertrouwd";
"user_verification_sessions_list_table_title" = "Sessies";
"user_verification_sessions_list_information" = "Berichten met deze gebruiker zijn eind-tot-eind versleuteld en kunnen niet door derde partijen gelezen worden.";
"user_verification_sessions_list_information" = "Berichten met deze persoon in deze kamer zijn eind-tot-eind versleuteld en kunnen niet door derde partijen gelezen worden.";
"user_verification_sessions_list_user_trust_level_unknown_title" = "Onbekend";
"user_verification_sessions_list_user_trust_level_warning_title" = "Waarschuwing";
@@ -1252,11 +1251,11 @@
"service_terms_modal_description_for_identity_server_2" = "Wees vindbaar via telefoonnummer of e-mailadres";
"service_terms_modal_description_for_identity_server_1" = "Vind anderen via telefoonnummer of e-mailadres";
"service_terms_modal_decline_button" = "Weigeren";
"room_widget_permission_room_id_permission" = "Gespreks-ID";
"room_widget_permission_room_id_permission" = "Kamer-ID";
"room_widget_permission_widget_id_permission" = "Widget-ID";
"room_widget_permission_theme_permission" = "Uw thema";
"room_widget_permission_user_id_permission" = "Uw gebruikers-ID";
"room_widget_permission_avatar_url_permission" = "Uw profielfoto-URL";
"room_widget_permission_avatar_url_permission" = "Uw afbeelding-URL";
"room_widget_permission_display_name_permission" = "Uw weergavenaam";
"room_widget_permission_information_title" = "Dit gebruiken kan gegevens delen met %@:\n";
"room_widget_permission_webview_information_title" = "Dit gebruiken kan cookies toevoegen en gegevens delen met %@:\n";
@@ -1274,7 +1273,7 @@
"call_actions_unhold" = "Hervatten";
"call_no_stun_server_error_use_fallback_button" = "Probeer %@ te gebruiken";
"call_no_stun_server_error_message_2" = "U kunt ook de publieke server op %@ gebruiken, maar dit zal minder betrouwbaar zijn, en zal uw IP-adres met die server delen. U kunt dit ook beheren in de Instellingen";
"call_no_stun_server_error_message_1" = "Vraag uw thuisserverbeheerder %@ een TURN-server te configureren teneinde oproepen betrouwbaar te doen werken.";
"call_no_stun_server_error_message_1" = "Vraag uw serverbeheerder %@ een TURN-server te configureren teneinde oproepen betrouwbaar te doen werken.";
"call_no_stun_server_error_title" = "Oproep mislukt door verkeerd geconfigureerde server";
"event_formatter_jitsi_widget_removed_by_you" = "U heeft een VoIP-vergadering verwijderd";
"event_formatter_jitsi_widget_added_by_you" = "U heeft een VoIP-vergadering toegevoegd";
@@ -1283,16 +1282,16 @@
// Events formatter with you
"event_formatter_widget_added_by_you" = "U heeft deze widget toegevoegd: %@";
"event_formatter_call_back" = "Terugbellen";
"event_formatter_call_you_declined" = "U heeft de oproep afgewezen";
"event_formatter_call_you_declined" = "Oproep geweigerd";
"event_formatter_call_you_currently_in" = "Actieve oproep";
"event_formatter_call_has_ended" = "Beëindigd %@";
"event_formatter_call_has_ended" = "Oproep beëindigd %@";
"event_formatter_call_video" = "Video-oproep";
"event_formatter_call_voice" = "Audio-oproep";
"room_details_advanced_e2e_encryption_disabled_for_dm" = "Versleuteling is hier niet ingeschakeld.";
"room_details_advanced_e2e_encryption_enabled_for_dm" = "Versleuteling is hier ingeschakeld";
"room_details_advanced_room_id_for_dm" = "ID:";
"room_details_no_local_addresses_for_dm" = "Geen lokaaladres bekend";
"room_details_access_section_directory_toggle_for_dm" = "Weergeven in publieke groepsgesprekkencatalogus";
"room_details_access_section_directory_toggle_for_dm" = "Weergeven in publieke kamersgids";
"room_details_access_section_anyone_for_dm" = "Iedereen die de koppeling kent, inclusief gasten";
"room_details_access_section_anyone_apart_from_guest_for_dm" = "Iedereen die de koppeling kent, behalve gasten";
"room_details_access_section_for_dm" = "Wie heeft toegang?";
@@ -1322,7 +1321,7 @@
"identity_server_settings_title" = "Identiteitsserver";
// AuthenticatedSessionViewControllerFactory
"authenticated_session_flow_not_supported" = "Deze app ondersteunt de verificatiemethode op uw homeserver niet.";
"authenticated_session_flow_not_supported" = "Deze app ondersteunt de verificatiemethode op uw server niet.";
"manage_session_sign_out" = "Deze sessie afmelden";
"manage_session_not_trusted" = "Niet vertrouwd";
"manage_session_trusted" = "Door u vertrouwd";
@@ -1360,7 +1359,7 @@
// Security settings
"security_settings_title" = "Beveiliging";
"settings_show_NSFW_public_rooms" = "NSFW openbare gesprekken weergeven";
"settings_show_NSFW_public_rooms" = "NSFW publieke kamers weergeven";
"settings_identity_server_no_is_description" = "U gebruikt momenteel geen identiteitsserver. Voeg er hierboven één toe om bekenden te kunnen vinden en voor hen vindbaar te zijn.";
"settings_identity_server_no_is" = "Geen identiteitsserver geconfigureerd";
"settings_identity_server_description" = "Met de hierboven ingestelde identiteitsserver kan u uw contacten vinden en bent u vindbaar voor uw contacten.";
@@ -1368,14 +1367,14 @@
"settings_discovery_three_pid_details_cancel_email_validation_action" = "E-mailbevestiging afbreken";
"settings_discovery_three_pid_details_revoke_action" = "Intrekken";
"settings_discovery_three_pid_details_share_action" = "Delen";
"settings_discovery_three_pid_details_information_phone_number" = "Beheer de voorkeuren voor dit telefoonnummer, dat andere gebruikers kunnen gebruiken om u te vinden en u uit te nodigen tot gesprekken. Telefoonnummers toevoegen of verwijderen in Accounts.";
"settings_discovery_three_pid_details_information_phone_number" = "Beheer de voorkeuren voor dit telefoonnummer, dat andere personen kunnen gebruiken om u te vinden en u uit te nodigen tot gesprekken. Telefoonnummers toevoegen of verwijderen in Accounts.";
"settings_discovery_three_pid_details_title_phone_number" = "Beheer telefoonnummer";
"settings_discovery_three_pid_details_information_email" = "Beheer de voorkeuren voor dit e-mailadres, dat andere gebruikers kunnen gebruiken om u te vinden en u uit te nodigen tot gesprekken. E-mailadressen toevoegen of verwijderen in Accounts.";
"settings_discovery_three_pid_details_information_email" = "Beheer de voorkeuren voor dit e-mailadres, dat andere personen kunnen gebruiken om u te vinden en u uit te nodigen tot gesprekken. E-mailadressen toevoegen of verwijderen in Accounts.";
"settings_discovery_three_pid_details_title_email" = "E-mail beheren";
"settings_discovery_error_message" = "Er is een fout opgetreden. Probeer het opnieuw.";
"settings_discovery_three_pids_management_information_part3" = ".";
"settings_discovery_three_pids_management_information_part2" = "Gebruikersinstellingen";
"settings_discovery_three_pids_management_information_part1" = "Beheer e-mailadressen en telefoonnummers die andere gebruikers kunnen gebruiken om u te vinden en u uit te nodigen voor een gesprekken. E-mailadressen of telefoonnummers toevoegen of verwijderen van deze lijst kan in ";
"settings_discovery_three_pids_management_information_part1" = "Beheer e-mailadressen en telefoonnummers die andere personen kunnen gebruiken om u te vinden en u uit te nodigen voor kamers. E-mailadressen of telefoonnummers toevoegen of verwijderen van deze lijst kan in ";
"settings_discovery_terms_not_signed" = "Aanvaard de gebruikersvoorwaarden van de identiteitsserver (%@) om vindbaar te zijn op e-mailadres of telefoonnummer.";
"settings_discovery_no_identity_server" = "U gebruikt momenteel geen identiteitsserver. Om door de u bekende contacten vindbaar te zijn, voeg er een toe.";
"settings_devices_description" = "De publieke naam van een sessie is zichtbaar voor de personen waarmee u communiceert";
@@ -1383,9 +1382,9 @@
"settings_add_3pid_password_message" = "Geef uw wachtwoord om verder te gaan";
"settings_add_3pid_password_title_msidsn" = "Telefoonnummer toevoegen";
"settings_add_3pid_password_title_email" = "E-mailadres toevoegen";
"settings_integrations_allow_description" = "Gebruik een integratiebeheerder om bots, bruggen, widgets en stickerpakketten te beheren.\n\nIntegratiebeheerders ontvangen configuratiedata en kunnen widgets aanpassen, gespreksuitnodigingen versturen en bestuursniveaus instellen namens u.";
"settings_integrations_allow_description" = "Gebruik een integratiebeheerder om bots, bruggen, widgets en stickerpakketten te beheren.\n\nIntegratiebeheerders ontvangen configuratiedata en kunnen widgets aanpassen, kameruitnodigingen versturen en bestuursniveaus instellen namens u.";
"settings_integrations_allow_button" = "Beheer integraties";
"settings_calls_stun_server_fallback_description" = "Sta de terugvalserver voor oproepbijstand %@ toe wanneer uw homeserver er geen aanbiedt (uw IP-adres wordt gedeeld gedurende een oproep).";
"settings_calls_stun_server_fallback_description" = "Sta de terugvalserver voor oproepbijstand %@ toe wanneer uw server er geen aanbiedt (uw IP-adres wordt gedeeld gedurende een oproep).";
"settings_calls_stun_server_fallback_button" = "Terugvalserver voor oproepen toestaan";
"settings_security" = "BEVEILIGING";
"settings_three_pids_management_information_part3" = ".";
@@ -1400,7 +1399,7 @@
"room_place_voice_call" = "Audio-oproep";
"room_event_action_delete_confirmation_message" = "Weet u zeker dat u alle niet verzonden berichten wilt verwijderen?";
"room_event_action_delete_confirmation_title" = "Niet verzonden berichten verwijderen";
"room_unsent_messages_cancel_message" = "Weet u zeker dat u alle niet verzonden berichten in dit gesprek wilt verwijderen?";
"room_unsent_messages_cancel_message" = "Weet u zeker dat u alle niet verzonden berichten in deze kamer wilt verwijderen?";
"room_unsent_messages_cancel_title" = "Niet verzonden berichten verwijderen";
"room_member_power_level_short_custom" = "Aangepast";
"room_member_power_level_short_moderator" = "Mod";
@@ -1409,9 +1408,9 @@
"room_member_power_level_moderator_in" = "Moderator in %@";
"room_member_power_level_admin_in" = "Beheerder in %@";
"room_participants_security_information_room_encrypted_for_dm" = "Berichten zijn hier eind-tot-eind versleuteld.\n\nUw berichten zijn met een digitale sleutel beveiligd, alleen u en de ontvanger hebben de unieke sleutels om deze berichten te ontgrendelen.";
"room_participants_security_information_room_encrypted" = "Berichten in dit gesprek zijn eind-tot-eind versleuteld.\n\nUw berichten zijn met een digitale sleutel beveiligd, alleen u en de ontvanger hebben de unieke sleutels om deze berichten te ontgrendelen.";
"room_participants_security_information_room_encrypted" = "Berichten in deze kamer zijn eind-tot-eind versleuteld.\n\nUw berichten zijn met een sleutel beveiligd, alleen u en de ontvanger hebben de unieke sleutels om deze berichten te ontgrendelen.";
"room_participants_security_information_room_not_encrypted_for_dm" = "Berichten zijn hier niet eind-tot-eind versleuteld.";
"room_participants_security_information_room_not_encrypted" = "Berichten in dit gesprek zijn niet eind-tot-eind versleuteld.";
"room_participants_security_information_room_not_encrypted" = "Berichten in deze kamer zijn niet eind-tot-eind versleuteld.";
"room_participants_security_loading" = "Laden…";
"room_participants_action_security_status_loading" = "Laden…";
"room_participants_action_security_status_warning" = "Waarschuwing";
@@ -1423,8 +1422,8 @@
"room_participants_leave_prompt_msg_for_dm" = "Weet u zeker dat u het gesprek wilt verlaten?";
"room_participants_leave_prompt_title_for_dm" = "Verlaten";
"contacts_address_book_no_identity_server" = "Geen identiteitsserver geconfigureerd";
"rooms_empty_view_information" = "Groepsgesprekken zijn geschikt voor alle gesprekken, privé of publiek. Klik op de + om de bestaande groepen te verkennen of maak een nieuwe.";
"rooms_empty_view_title" = "Gesprekken";
"rooms_empty_view_information" = "Kamers zijn geschikt voor alle groepsgesprekken, privé of publiek. Klik op de + om de bestaande kamers te verkennen of maak een nieuwe aan.";
"rooms_empty_view_title" = "Kamers";
"people_empty_view_information" = "Veilig communiceren met iedereen. Druk op + om personen toe te voegen.";
"people_empty_view_title" = "Personen";
"social_login_button_title_sign_up" = "Registreren met %@";
@@ -1450,7 +1449,7 @@
"joined" = "Toegetreden";
"store_promotional_text" = "Privacy-beschermende chat- en samenwerkingsapp, op een open netwerk. Gedecentraliseerd, zodat u de controle hebt. Geen datamining, geen achterdeurtjes en geen toegang voor derden.";
"room_details_integrations" = "Integraties";
"room_details_search" = "Zoek in gesprek";
"room_details_search" = "Kamer doorzoeken";
"room_multiple_typing_notification" = "%@ en anderen";
"room_accessibility_video_call" = "Video-oproep";
"room_message_replying_to" = "Antwoord aan %@";
@@ -1474,8 +1473,8 @@
// 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_information" = "Spaces zijn de nieuwe manier om kamers en personen te groeperen. Dit is nog niet beschikbaar op iOS, maar u kunt ze nu al gebruiken op Web en Desktop.";
"space_feature_unavailable_information" = "Spaces zijn de nieuwe manier om kamers en personen te groeperen. \n\nHet is binnenkort beschikbaar. U kan aan spaces deelnemen via andere platformen en die kamer 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";
@@ -1493,11 +1492,11 @@
// Mark: - Side menu
"side_menu_reveal_action_accessibility_label" = "Linkerpaneel";
"user_avatar_view_accessibility_hint" = "Avatar veranderen";
"user_avatar_view_accessibility_hint" = "Afbeelding veranderen";
// Mark: - User avatar view
"user_avatar_view_accessibility_label" = "avatar";
"user_avatar_view_accessibility_label" = "afbeelding";
"secrets_recovery_with_key_information_unlock_secure_backup_with_key" = "Voor uw veiligheidssleutel in om door te gaan.";
"secrets_recovery_with_key_information_unlock_secure_backup_with_phrase" = "Voer uw veiligheidswachtwoord in om door te gaan.";
@@ -1509,10 +1508,10 @@
"security_settings_secure_backup_info_checking" = "Controleren…";
"settings_ui_theme_picker_message_match_system_theme" = "'Automatisch' gebruikt uw apparaat thema instelling";
"settings_ui_theme_picker_message_invert_colours" = "Automatisch gebruikt de instelling Kleurweergave omkeren van uw apparaat";
"room_recents_unknown_room_error_message" = "Dit gesprek is niet gevonden. Controleer of het bestaat";
"room_recents_unknown_room_error_message" = "Deze kamer is niet gevonden. Controleer of het bestaat";
"room_creation_dm_error" = "Uw direct gesprek kon niet aangemaakt worden. Controleer de gebruikers die u wilt uitnodigen en probeer het opnieuw.";
"key_verification_verify_qr_code_scan_code_other_device_action" = "Scan met dit apparaat";
"room_notifs_settings_encrypted_room_notice" = "Let op dat vermeldingen & trefwoorden-meldingen niet beschikbaar zijn in versleutelde gesprekken op mobiel.";
"room_notifs_settings_encrypted_room_notice" = "Let op dat vermeldingen & trefwoorden-meldingen niet beschikbaar zijn in versleutelde kamers op mobiel.";
"room_notifs_settings_account_settings" = "Accountinstellingen";
"room_notifs_settings_manage_notifications" = "U kunt uw meldingen beheren in %@";
"room_notifs_settings_cancel_action" = "Annuleer";
@@ -1524,3 +1523,19 @@
// Room Notification Settings
"room_notifs_settings_notify_me_for" = "Stuur een melding voor";
"room_details_notifs" = "Meldingen";
"voice_message_stop_locked_mode_recording" = "Tik op uw opname om te stoppen of te luisteren";
"voice_message_remaining_recording_time" = "%@s is vertrokken";
// Mark: - Voice Messages
"voice_message_release_to_send" = "Vasthouden om op te nemen, loslaten om te verzenden";
"settings_labs_voice_messages" = "Spraakberichten";
"settings_notifications_disabled_alert_message" = "Om in te schakelen, ga naar uw apparaatinstellingen.";
"settings_notifications_disabled_alert_title" = "Meldingen uitgeschakeld";
"settings_device_notifications" = "Apparaatmeldingen";
"event_formatter_call_missed_video" = "Video-oproep gemist";
"event_formatter_call_missed_voice" = "Audio-oproep gemist";
"event_formatter_call_active_video" = "Actieve video-oproep";
"event_formatter_call_active_voice" = "Actieve audio-oproep";
"event_formatter_call_incoming_video" = "Inkomende video-oproep";
"event_formatter_call_incoming_voice" = "Inkomende audio-oproep";
-1
View File
@@ -503,7 +503,6 @@
"settings_key_backup" = "KOPIA ZAPASOWA KLUCZY";
"settings_enable_push_notif" = "Powiadomienia na tym urządzeniu";
"settings_global_settings_info" = "Globalne i szczegółowe ustawienia powiadomień są dostępne z poziomu klienta webowego: %@";
"settings_on_denied_notification" = "Powiadomienia dla aplikacji %@ są wyłączone. Proszę zezwól na nie w ustawieniach urządzenia";
"settings_callkit_info" = "Odbieraj połączenia przychodzące na ekranie blokady. Zobacz swoje połęczenia Element w historii połączeń w systemie. Jeśli usługa iCloud jest włączona, historia połączeń zostanie udostępniona Apple.";
"settings_ui_theme_picker_message" = "\"Auto\" używa ustawienia \"Odwróć kolory\" Twojego urządzenia";
"close" = "Zamknij";
+42 -34
View File
@@ -86,7 +86,7 @@
"auth_reset_password_next_step_button" = "Eu tenho verificado meu endereço de email";
"auth_reset_password_error_unauthorized" = "Falha para verificar endereço de email: assegure que você clicou no link no email";
"auth_reset_password_error_not_found" = "Seu endereço de email não parece estar associado a uma ID Matrix neste servidorcasa.";
"auth_reset_password_success_message" = "Sua senha tem sido resettada.\n\nVocê tem sido feito logout de todas as sessões e não vai mais receber notificações push. Para re-ativar as notificações, refaça login em cada dispositivo.";
"auth_reset_password_success_message" = "Sua senha tem sido resettada.\n\nVocê tem sido feito logout de todas as sessões e não vai mais receber notificações push. Para re-habilitar notificações, refaça login em cada dispositivo.";
"auth_add_email_and_phone_warning" = "Registro com email e número de telefone ao mesmo tempo não é suportado ainda até que a api exista. Somente o número de telefone vai ser levado em conta. Você pode adicionar seu email a seu perfil em configurações.";
"room_creation_appearance" = "Aparência";
"room_creation_appearance_name" = "Nome";
@@ -270,7 +270,7 @@
// Room Preview
"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_subtitle" = "Esta é uma previsualização desta sala. Interações de sala têm sido desabilitadas.";
"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";
@@ -317,9 +317,8 @@
"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_callkit_info" = "Receba chamadas entrantes em sua tela de bloqueio. Veja suas chamadas Element no histórico de chamadas do sistema. Se iCloud está habilitado, este histórico de chamadas vai ser compartilhado com Apple.";
"settings_ui_language" = "Língua";
"settings_ui_theme" = "Tema";
"settings_ui_theme_auto" = "Auto";
@@ -398,9 +397,9 @@
"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 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_enable_e2e_encryption" = "Habilitar encriptação (aviso: não pode ser desabilitada de novo!)";
"room_details_advanced_e2e_encryption_enabled" = "Encriptação está habilitada nesta sala";
"room_details_advanced_e2e_encryption_disabled" = "Encriptação não está habilitada 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";
@@ -415,7 +414,7 @@
"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_fail_to_enable_encryption" = "Falha para habilitar 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";
@@ -486,19 +485,19 @@
"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" = "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_incoming_voice_prompt" = "Chamada de voz entrante de %@";
"call_incoming_video_prompt" = "Chamada de vídeo entrante de %@";
"call_incoming_voice" = "Chamada entrante…";
"call_incoming_video" = "Chamada de vídeo entrante…";
"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" = "Chamada recebendo";
"no_voip_title" = "Chamada entrante";
"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 %@ ao reportar automaticamente reportes de crash e dados de uso anônimos?";
// Crypto
"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_enabling_on_app_update" = "Element agora suporta encriptação ponta-a-ponta mas você precisa fazer login de novo para habilitá-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" = "Report de Bug";
@@ -514,7 +513,7 @@
// Widget
"widget_no_power_to_manage" = "Você precisa de permissão para gerenciar widgets nesta sala";
"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" = "Você não tem atualmente nenhum pacote de stickers habilitado.";
"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Adicionar alguns agora?";
// Widget Integration Manager
"widget_integration_need_to_be_able_to_invite" = "Você precisa ser capaz de convidar usuárias(os) para fazer isso.";
@@ -721,7 +720,7 @@
"settings_three_pids_management_information_part3" = ".";
"settings_security" = "SEGURANÇA";
"settings_integrations_allow_button" = "Gerenciar integrações";
"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_integrations_allow_description" = "Use um Gerenciador de Integrações (%@) para gerenciar bots, bridges, widgets e pacotes de stickers.\n\nGerenciadores de Integrações recebem dados de configuração, e podem modificar widgets, enviar convites de sala e definir níveis de poder em seu nome.";
"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" = ".";
@@ -730,7 +729,7 @@
"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" = "Requisição de Verificação Recebendo";
"device_verification_incoming_title" = "Requisição de Verificação Entrante";
"device_verification_start_wait_partner" = "Esperando por parceira(o) aceitar…";
"device_verification_self_verify_start_waiting" = "Esperando…";
"device_verification_verify_wait_partner" = "Esperando por parceira(o) confirmar…";
@@ -788,14 +787,14 @@
"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_trusted" = "Assinatura cruzada está habilitada. 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á 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";
"widget_integration_manager_disabled" = "Você precisa ativar Gerenciador de Integração em configurações";
"widget_integration_manager_disabled" = "Você precisa habilitar Gerenciador de Integrações 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" = "Isto funciona com Element e outros clientes Matrix capazes de assinatura cruzada.";
@@ -810,12 +809,12 @@
"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" = "Feito";
"pin_protection_settings_enabled_forced" = "PIN ativado";
"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 destrancar, use %@ ou faça login de volta e ative %@ de novo";
"pin_protection_settings_enabled_forced" = "PIN habilitado";
"pin_protection_settings_enable_pin" = "Habilitar PIN";
"biometrics_settings_enable_x" = "Habilitar %@";
"biometrics_setup_title_x" = "Habilitar %@";
"biometrics_setup_enable_button_title_x" = "Habilitar %@";
"biometrics_cant_unlocked_alert_message_x" = "Para destrancar, use %@ ou faça login de volta e habilite %@ de novo";
// Accessibility
"accessibility_checkbox_label" = "checkbox";
// MARK: Clients
@@ -1138,7 +1137,7 @@
"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 PIN para desativar PIN";
"pin_protection_confirm_pin_to_disable" = "Confirme PIN para desabilitar PIN";
"pin_protection_enter_pin" = "Entre seu PIN";
"pin_protection_forgot_pin" = "Esqueci PIN";
"pin_protection_reset_alert_title" = "Resettar PIN";
@@ -1152,16 +1151,16 @@
"biometrics_mode_touch_id" = "Touch ID";
"biometrics_mode_face_id" = "Face ID";
"biometrics_setup_subtitle" = "Poupe a si mesma(o) tempo";
"biometrics_desetup_title_x" = "Desativar %@";
"biometrics_desetup_title_x" = "Desabilitar %@";
"biometrics_desetup_subtitle" = "biometrics_desetup_subtitle";
"biometrics_desetup_disable_button_title_x" = "Desativar %@";
"biometrics_desetup_disable_button_title_x" = "Desabilitar %@";
"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_e2e_encryption_disabled_for_dm" = "Encriptação não está habilitada aqui.";
"room_details_advanced_e2e_encryption_enabled_for_dm" = "Encriptação está habilitada 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";
@@ -1189,8 +1188,8 @@
"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" = "Encriptação não pode ser desativada em seguida.";
"create_room_enable_encryption" = "Ativar Encriptação";
"create_room_section_footer_encryption" = "Encriptação não pode ser desabilitada em seguida.";
"create_room_enable_encryption" = "Habilitar 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)";
@@ -1273,7 +1272,7 @@
"call_transfer_contacts_all" = "Todos";
"call_transfer_contacts_recent" = "Recentes";
"call_transfer_users" = "Usuárias(os)";
"event_formatter_call_has_ended" = "Terminou %@";
"event_formatter_call_has_ended" = "Chamada terminou %@";
"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" = ". ";
@@ -1298,7 +1297,7 @@
"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";
"event_formatter_call_you_declined" = "Chamada declinada";
"event_formatter_call_you_currently_in" = "Chamada ativa";
"event_formatter_call_video" = "Chamada de vídeo";
"event_formatter_call_voice" = "Chamada de voz";
@@ -1399,3 +1398,12 @@
"voice_message_release_to_send" = "Segure para gravar, solte para enviar";
"settings_labs_voice_messages" = "Mensagens de voz";
"settings_notifications_disabled_alert_title" = "Notificações desabilitadas";
"settings_notifications_disabled_alert_message" = "Para habilitar notificações, vá para suas configurações de dispositivo.";
"settings_device_notifications" = "Notificações de dispositivo";
"event_formatter_call_incoming_video" = "Chamada de vídeo entrante";
"event_formatter_call_incoming_voice" = "Chamada de voz entrante";
"event_formatter_call_missed_video" = "Chamada de vídeo perdida";
"event_formatter_call_missed_voice" = "Chamada de voz perdida";
"event_formatter_call_active_video" = "Chamada de vídeo ativa";
"event_formatter_call_active_voice" = "Chamada de voz ativa";
+1 -1
View File
@@ -1,7 +1,7 @@
// Permissions usage explanations
"NSCameraUsageDescription" = "Камера используется для съемки фотографий и видеороликов, а также для видеозвонков.";
"NSPhotoLibraryUsageDescription" = "Галерея используется для отправки фотографий и видео.";
"NSMicrophoneUsageDescription" = "Микрофон используется при съемке видео и выполнении звонков.";
"NSMicrophoneUsageDescription" = "Element необходим доступ к вашему микрофону, чтобы совершать и принимать звонки, снимать видео и записывать голосовые сообщения.";
"NSContactsUsageDescription" = "Чтобы обнаружить контакты, уже использующие Matrix, Element может отправлять адреса электронной почты и номера телефонов из адресной книги на выбранный вами сервер идентификации Matrix. Если поддерживается, то личные данные перед отправкой хэшируются - пожалуйста, ознакомьтесь с политикой конфиденциальности вашего сервера идентификации для получения более подробной информации.";
"NSCalendarsUsageDescription" = "Ознакомьтесь со своими запланированными встречами в приложении.";
"NSFaceIDUsageDescription" = "Face ID используется для доступа к вашему приложению.";
+6
View File
@@ -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" = "Начался групповой вызов";
+134 -51
View File
@@ -162,7 +162,7 @@
"room_participants_action_start_voice_call" = "Начать голосовой вызов";
"room_participants_action_start_video_call" = "Начать видеовызов";
// Chat
"room_jump_to_first_unread" = "Перейти к первому непрочитанному сообщению";
"room_jump_to_first_unread" = "Перейти к непрочитанному";
"room_creation_appearance" = "Внешний вид";
"directory_cell_description" = "%tu комнат";
"directory_search_results_title" = "Просмотр результатов поиска";
@@ -259,7 +259,6 @@
"settings_fail_to_update_profile" = "Не удалось обновить профиль";
"settings_enable_push_notif" = "Уведомления на этом устройстве";
"settings_global_settings_info" = "Глобальные настройки уведомлений доступны в вашем %@ веб-клиенте";
"settings_on_denied_notification" = "Уведомления для %@ запрещены, пожалуйста, разрешите их в настройках вашего устройства";
"settings_ui_language" = "Язык";
"settings_unignore_user" = "Показать все сообщения от %@?";
"settings_labs_e2e_encryption" = "Сквозное шифрование";
@@ -586,49 +585,49 @@
"key_backup_setup_intro_title" = "Никогда не теряйте зашифрованных сообщений";
"key_backup_setup_intro_info" = "Сообщения в зашифрованных комнатах защищены сквозным шифрованием. Только вы и получатель(и) имеют ключи для чтения этих сообщений.\n\nСохраните ключи надежно, чтобы не потерять их.";
"key_backup_setup_intro_setup_action" = "Настроить";
"key_backup_setup_passphrase_info" = "Мы будем хранить зашифрованную копию ваших ключей на нашем сервере. Для безопасности, защитите резервную копию парольной фразой.\n\nДля обеспечения максимальной безопасности он должен отличаться от пароля учетной записи.";
"key_backup_setup_passphrase_info" = "Мы будем хранить зашифрованную копию ваших ключей на нашем сервере. Для безопасности, защитите резервную копию секретной фразой.\n\nДля обеспечения максимальной безопасности она должна отличаться от пароля учетной записи.";
"key_backup_setup_passphrase_passphrase_title" = "Ввод";
"key_backup_setup_passphrase_passphrase_placeholder" = "Введите парольную фразу";
"key_backup_setup_passphrase_passphrase_placeholder" = "Введите секретную фразу";
"key_backup_setup_passphrase_passphrase_valid" = "Отлично!";
"key_backup_setup_passphrase_passphrase_invalid" = "Попробуйте добавить слово";
"key_backup_setup_passphrase_confirm_passphrase_title" = "Подтвердить";
"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Повторите парольную фразу";
"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Повторите секретную фразу";
"key_backup_setup_passphrase_confirm_passphrase_valid" = "Отлично!";
"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Парольные фразы не совпадает";
"key_backup_setup_passphrase_set_passphrase_action" = "Установить парольную фразу";
"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Секретная фраза не совпадает";
"key_backup_setup_passphrase_set_passphrase_action" = "Установить секретную фразу";
"key_backup_setup_recovery_key_recovery_key_title" = "Ключ для восстановления";
"key_backup_setup_recovery_key_make_copy_action" = "Сделать копию";
"key_backup_setup_recovery_key_made_copy_action" = "Я сделал копию";
"key_backup_recover_title" = "Безопасные Сообщения";
"key_backup_recover_empty_backup_title" = "Пустая резервная копия";
"key_backup_recover_empty_backup_message" = "Нет ключа для восстановления";
"key_backup_recover_from_passphrase_info" = "Используйте парольную фразу восстановления для разблокировки истории безопасных сообщений";
"key_backup_recover_from_passphrase_info" = "Используйте секретную фразу восстановления для разблокировки истории безопасных сообщений";
"key_backup_recover_from_passphrase_passphrase_title" = "Ввод";
"key_backup_recover_from_passphrase_passphrase_placeholder" = "Введите парольную фразу";
"key_backup_recover_from_passphrase_passphrase_placeholder" = "Введите секретную фразу";
"key_backup_recover_from_passphrase_recover_action" = "Разблокировать историю";
"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Не знаете вашу парольную фразу для восстановления? Вы можете ";
"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "используйте ключ восстановления";
"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Не знаете вашу секретную фразу для восстановления? Вы можете ";
"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "использовать ключ безопасности";
"key_backup_recover_from_passphrase_lost_passphrase_action_part3" = ".";
"key_backup_recover_from_recovery_key_info" = "Используйте ключ восстановления для разблокировки истории безопасных сообщений";
"key_backup_recover_from_recovery_key_info" = "Используйте ключ безопасности для разблокировки истории безопасных сообщений";
"key_backup_recover_from_recovery_key_recovery_key_title" = "Ввод";
"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Введите ключ восстановления";
"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Введите ключ безопасности";
"key_backup_recover_from_recovery_key_recover_action" = "Разблокировать историю";
"key_backup_recover_success_info" = "Резервная копия восстановлена!";
"key_backup_recover_done_action" = "Готово";
"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Потеряли ключ восстановления? В настройках вы можете создать новый.";
"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Потеряли ключ безопасности? В настройках вы можете создать новый.";
"key_backup_setup_banner_title_part1" = "Настройка Безопасного Восстановления Сообщений";
"key_backup_recover_banner_title_part1" = "Запуск Безопасного Восстановления Сообщений";
"key_backup_recover_banner_title_part2" = " для чтения истории зашифрованных сообщений на этом устройстве";
"key_backup_setup_banner_title_part2" = " чтобы никогда не потерять зашифрованные сообщения";
"key_backup_setup_recovery_key_info" = "Сделайте копию ключа восстановления и надёжно сохраните его.\n\nЕго можно будет использовать для восстановления истории зашифрованных сообщений, на случай если вы забудете парольную фразу восстановления.";
"key_backup_setup_success_title" = "Успех!";
"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Сохранить ключ восстановления";
"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Сохранить ключ безопасности";
"key_backup_setup_success_from_passphrase_done_action" = "Готово";
"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Ключ восстановления";
"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Ключ безопасности";
"key_backup_setup_success_from_recovery_key_make_copy_action" = "Сделать копию";
"key_backup_setup_success_from_recovery_key_made_copy_action" = "Я сделал копию";
"key_backup_recover_invalid_passphrase_title" = "Неверная парольная фраза для восстановления";
"key_backup_recover_invalid_recovery_key_title" = "Несоответствующий ключ восстановления";
"key_backup_recover_invalid_passphrase_title" = "Неверная секретная фраза для восстановления";
"key_backup_recover_invalid_recovery_key_title" = "Несоответствующий ключ безопасности";
"key_backup_setup_banner_title" = "Не теряйте зашифрованные сообщения";
"key_backup_setup_banner_subtitle" = "Начать использовать ключ восстановления";
"key_backup_recover_banner_title" = "Не теряйте зашифрованные сообщения";
@@ -643,12 +642,12 @@
"key_backup_setup_intro_setup_action_without_existing_backup" = "Начать использовать ключ восстановления";
"key_backup_setup_intro_setup_action_with_existing_backup" = "Использовать ключ восстановления";
"settings_key_backup_info" = "Зашифрованные сообщения защищены сквозным шифрованием. Только вы и получатель(и) имеют ключи для чтения этих сообщений.";
"settings_key_backup_info_signout_warning" = "Подключите этот сеанс к резервному копированию ключей перед выходом из системы, чтобы избежать потери ключей, которые могут быть только на этом устройстве.";
"key_backup_setup_passphrase_title" = "Защитите резервную копию парольной фразой";
"key_backup_setup_passphrase_setup_recovery_key_info" = "Или защитите резервную копию с помощью ключа восстановления, сохранив его в безопасном месте.";
"key_backup_setup_passphrase_setup_recovery_key_action" = "(Расширенный) Настройка с ключом восстановления";
"settings_key_backup_info_signout_warning" = "Сделайте резервную копию ключей перед выходом, чтобы не потерять их.";
"key_backup_setup_passphrase_title" = "Защитите резервную копию секретной фразой";
"key_backup_setup_passphrase_setup_recovery_key_info" = "Или защитите свою резервную копию с помощью ключа безопасности, сохранив ее в безопасном месте.";
"key_backup_setup_passphrase_setup_recovery_key_action" = "(Расширенный) Настройка с ключом безопасности";
// Success from passphrase
"key_backup_setup_success_from_passphrase_info" = "Выполняется резервная копия ключей.\n\nКлюч восстановления — это страховка — вы можете использовать его для восстановления доступа к вашим зашифрованным сообщениям, если забудете пароль.\n\nХраните ключ восстановления в очень надежном месте, например, в менеджере паролей (или сейфе).";
"key_backup_setup_success_from_passphrase_info" = "Выполняется резервная копия ключей.\n\nКлюч безопасности — это страховка — вы можете использовать его для восстановления доступа к вашим зашифрованным сообщениям, если забудете пароль.\n\nХраните ключ безопасности в очень надежном месте, например, в менеджере паролей (или сейфе).";
// Success from recovery key
"key_backup_setup_success_from_recovery_key_info" = "Выполняется резервная копия ключей.\n\nСохраните его в безопасном месте.";
"sign_out_key_backup_in_progress_alert_discard_key_backup_action" = "Мне не нужны мои зашифрованные сообщения";
@@ -657,15 +656,15 @@
"sign_out_non_existing_key_backup_sign_out_confirmation_alert_title" = "Зашифрованные сообщения будут утеряны";
"sign_out_non_existing_key_backup_alert_discard_key_backup_action" = "Мне не нужны мои зашифрованные сообщения";
"sign_out_non_existing_key_backup_alert_title" = "Вы потеряете доступ к зашифрованным сообщениям если выйдете сейчас";
"key_backup_recover_invalid_passphrase" = "Невозможно расшифровать резервную копию с помощью этой парольной фразы: убедитесь, что вы ввели верную парольную фразу для восстановления.";
"key_backup_recover_invalid_recovery_key" = "Невозможно расшифровать резервную копию с помощью этого ключа: убедитесь, что вы ввели верный ключ восстановления.";
"key_backup_recover_invalid_passphrase" = "Невозможно расшифровать резервную копию с помощью этой секретной фразы: убедитесь, что вы ввели верную секретную фразу для восстановления.";
"key_backup_recover_invalid_recovery_key" = "Невозможно расшифровать резервную копию с помощью этого ключа: убедитесь, что вы ввели верный ключ безопасности.";
"e2e_key_backup_wrong_version_button_settings" = "Настойки";
"key_backup_setup_intro_manual_export_info" = "(Расширенный)";
"e2e_key_backup_wrong_version_button_wasme" = "Это был я";
"key_backup_setup_intro_manual_export_action" = "Ручной экспорт ключей";
// Key backup wrong version
"e2e_key_backup_wrong_version_title" = "Новая резервная копия ключей";
"e2e_key_backup_wrong_version" = "Обнаружена новая резервная копия ключа защищенного сообщения.\n\nЕсли это не вы, установите новый пароль в настройках.";
"e2e_key_backup_wrong_version" = "Обнаружена новая резервная копия ключа защищенного сообщения.\n\nЕсли это не вы, установите новую секретную фразу в настройках.";
// String for App Store
"store_short_description" = "Безопасный децентрализованный чат/VoIP";
"store_full_description" = "Element - это новый тип мессенджера и приложения для совместной работы, которое:\n\n1. Ставит вас под контроль, чтобы сохранить вашу частную жизнь\n2. Позволяет вам общаться с кем угодно в cети Matrix и даже за ее пределами, интегрируясь с такими приложениями, как Slack\n3. Защищает вас от рекламы, сбора данных, бэкдоров и огороженных стеной садов\n4. Обеспечивает безопасность с помощью сквозного шифрования с кросс-подписью для проверки других пользователей\n\nElement полностью отличается от других приложений для обмена сообщениями и совместной работы, поскольку он децентрализован и имеет открытый исходный код.\n\nElement позволяет вам самостоятельно разместить или выбрать хост так, чтобы у вас была конфиденциальность, право собственности и контроль над вашими данными и разговорами. Это дает вам доступ к открытой сети; так чтобы вы не были ограничены, разговаривая только с другими пользователями Element. И это очень безопасно.\n\nElement способен делать все это, потому что он работает на Matrix - стандарте открытой, децентрализованной коммуникации.\n\nElement дает вам возможность контролировать, позволяя вам выбирать, кто будет вести ваши разговоры. В приложении Element вы можете выбрать размещение различными способами:\n\n1. Получите бесплатный аккаунт на сайте matrix.org - это публичный сервер\n2. Самостоятельно разместите свою учетную запись, запустив сервер на собственном оборудовании\n3. Подпишитесь на учетную запись на пользовательском сервере, просто подписавшись на хостинг-платформу Element Matrix Services\n\nПочему нужно использовать Element?\n\nВЛАДЕЙТЕ ВАШИМИ ДАННЫМИ: вы сами решаете, где хранить ваши данные и сообщения. Вы владеете ими и контролируете их, а не какая-то мегакорпорация, которая добывает ваши данные или предоставляет к ним доступ третьим лицам.\n\nОТКРЫТОЕ ОБЩЕНИЕ И СОВМЕСТНАЯ РАБОТА: вы можете общаться с кем угодно в сети Matrix, независимо от того, используют ли сам Element или другое приложение Matrix, и даже если они используют другую систему обмена сообщениями, такую как Slack, IRC или XMPP.\n\nАБСОЛЮТНАЯ БЕЗОПАСНОСТЬ: реальное сквозное шифрование (только те, кто находится в разговоре, могут расшифровывать сообщения) и кросс-подпись для проверки устройств участников разговора.\n\nСОВЕРШЕННАЯ КОММУНИКАЦИЯ: обмен сообщениями, голосовые и видеозвонки, общий доступ к файлам, общий доступ к экрану и целая куча интеграций, ботов и виджетов. Создавайте комнаты, сообщества, оставайтесь на связи и делайте все возможное.\n\nГДЕ БЫ ВЫ НЕ БЫЛИ: оставайтесь на связи, где бы вы ни находились, с полностью синхронизированной историей сообщений на всех ваших устройствах и в Интернете по адресу https://element.io/app.";
@@ -930,18 +929,18 @@
"security_settings_crypto_sessions_loading" = "Загрузка сеансов…";
"security_settings_crypto_sessions_description_2" = "Если вы не узнали логин, измените пароль и сбросьте Безопасное резервное копирование.";
"security_settings_secure_backup" = "БЕЗОПАСНОЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ";
"security_settings_secure_backup_description" = "Защитите себя от потери доступа к зашифрованным сообщениям и данным, создав резервную копию ключей шифрования на своём сервере.";
"security_settings_secure_backup_description" = "Сделайте резервную копию ключей шифрования с данными вашей учетной записи на случай, если вы потеряете доступ к своим сеансам. Ваши ключи будут защищены уникальным электронным ключом.";
"security_settings_secure_backup_setup" = "Настроить";
"security_settings_secure_backup_synchronise" = "Синхронизировать";
"security_settings_secure_backup_delete" = "Удалить";
"security_settings_secure_backup_delete" = "Удалить резервную копию";
"security_settings_backup" = "РЕЗЕРВНОЕ КОПИРОВАНИЕ СООБЩЕНИЯ";
"security_settings_crosssigning" = "КРОСС-ПОДПИСЬ";
"security_settings_crosssigning_info_not_bootstrapped" = "Кросс-подпись еще не настроена.";
"security_settings_crosssigning_info_exists" = "У вашей учётной записи есть кросс-подпись, но она еще не пользуется доверием в этом сеансе. Настройте безопасность этого сеанса.";
"security_settings_crosssigning_info_trusted" = "Кросс-подпись включена. Вы можете доверять другим пользователям и другим своим сеансам на основе кросс-подписи, но вы не можете перекрестно подписывать из этого сеанса, потому что он не имеет закрытых ключей кросс-подписи. Завершите настройку безопасности этого сеанса.";
"security_settings_crosssigning_info_ok" = "Кросс-подпись включена.";
"security_settings_crosssigning_bootstrap" = "Инициализация кросс-подписи";
"security_settings_crosssigning_reset" = "Сбросить кросс-подпись";
"security_settings_crosssigning_info_ok" = "Кросс-подпись готова к использованию.";
"security_settings_crosssigning_bootstrap" = "Настроить";
"security_settings_crosssigning_reset" = "Сброс";
"security_settings_crosssigning_complete_security" = "Завершите настройку безопасности";
"security_settings_cryptography" = "КРИПТОГРАФИЯ";
"security_settings_export_keys_manually" = "Экспорт ключей вручную";
@@ -1037,8 +1036,8 @@
"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" = "Это работает с 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_without_passphrase" = "Используйте ключ безопасности";
"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Используйте секретную фразу или ключ безопасности";
"device_verification_self_verify_wait_recover_secrets_additional_information" = "Если вы не можете получить доступ к существующему сеансу";
"key_verification_verify_sas_title_emoji" = "Сравните смайлы";
"key_verification_verify_sas_title_number" = "Сравните числа";
@@ -1116,27 +1115,27 @@
"user_verification_session_details_verify_action_current_user" = "Интерактивная проверка";
"user_verification_session_details_verify_action_current_user_manually" = "Ручная проверка с помощью текста";
"user_verification_session_details_verify_action_other_user" = "Подтверждение вручную";
"secrets_recovery_with_passphrase_title" = "Парольная фраза для восстановления";
"secrets_recovery_with_passphrase_information_default" = "Получите доступ к своей защищённой истории сообщений и вашей личности с кросс-подписью для проверки других сеансов, введя кодовую фразу для восстановления.";
"secrets_recovery_with_passphrase_information_verify_device" = "Используйте кодовую фразу для восстановления, чтобы проверить это устройство.";
"secrets_recovery_with_passphrase_title" = "Секретная фраза";
"secrets_recovery_with_passphrase_information_default" = "Получите доступ к своей защищённой истории сообщений и вашей личности с кросс-подписью для проверки других сеансов, введя секретную фразу.";
"secrets_recovery_with_passphrase_information_verify_device" = "Используйте секретную фразу, чтобы проверить это устройство.";
"secrets_recovery_with_passphrase_passphrase_title" = "Ввод";
"secrets_recovery_with_passphrase_passphrase_placeholder" = "Введите пароль восстановления";
"secrets_recovery_with_passphrase_recover_action" = "Использовать парольную фразу";
"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Не знаете вашу парольную фразу для восстановления? Вы можете ";
"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "используйте ключ восстановления";
"secrets_recovery_with_passphrase_passphrase_placeholder" = "Введите секретную фразу";
"secrets_recovery_with_passphrase_recover_action" = "Использовать секретную фразу";
"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Не знаете вашу секретную фразу? Вы можете ";
"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "использовать ключ безопасности";
"secrets_recovery_with_passphrase_lost_passphrase_action_part3" = ".";
"secrets_recovery_with_passphrase_invalid_passphrase_title" = "Невозможно получить доступ к секретному хранилищу";
"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Убедитесь, что вы ввели правильный пароль для восстановления.";
"secrets_recovery_with_key_title" = "Ключ для восстановления";
"secrets_recovery_with_key_information_default" = "Получите доступ к своей защищённой истории сообщений и вашей личности с кросс-подписью для проверки других сеансов, введя ключ восстановления.";
"secrets_recovery_with_key_information_verify_device" = "Используйте ключ восстановления, чтобы проверить это устройство.";
"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Убедитесь, что вы ввели правильную секретную фразу.";
"secrets_recovery_with_key_title" = "Ключ безопасности";
"secrets_recovery_with_key_information_default" = "Получите доступ к своей защищённой истории сообщений и вашей личности с кросс-подписью для проверки других сеансов, введя ключ безопасности.";
"secrets_recovery_with_key_information_verify_device" = "Используйте ключ безопасности, чтобы проверить это устройство.";
"secrets_recovery_with_key_recovery_key_title" = "Ввод";
"secrets_recovery_with_key_recovery_key_placeholder" = "Введите ключ восстановления";
"secrets_recovery_with_key_recovery_key_placeholder" = "Введите ключ безопасности";
"secrets_recovery_with_key_recover_action" = "Использовать ключ";
"secrets_recovery_with_key_invalid_recovery_key_title" = "Невозможно получить доступ к секретному хранилищу";
"secrets_recovery_with_key_invalid_recovery_key_message" = "Убедитесь, что вы ввели правильный ключ восстановления.";
"secrets_recovery_with_key_invalid_recovery_key_message" = "Убедитесь, что вы ввели правильный ключ безопасности.";
"secrets_setup_recovery_key_title" = "Сохраните ваш ключ безопасности";
"secrets_setup_recovery_key_information" = "Храните ключ восстановления в надежном месте. Его можно использовать для разблокировки ваших зашифрованных сообщений и данных.";
"secrets_setup_recovery_key_information" = "Храните ключ безопасности в надежном месте. Его можно использовать для разблокировки ваших зашифрованных сообщений и данных.";
"secrets_setup_recovery_key_loading" = "Загрузка…";
"secrets_setup_recovery_key_export_action" = "Сохранить";
"secrets_setup_recovery_key_done_action" = "Готово";
@@ -1148,7 +1147,7 @@
"secrets_setup_recovery_passphrase_validate_action" = "Готово";
"secrets_setup_recovery_passphrase_confirm_information" = "Для подтверждения введите вашу секретную фразу ещё раз.";
"secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Подтвердить";
"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Подтвердить парольную фразу";
"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Подтвердить секретную фразу";
"cross_signing_setup_banner_title" = "Настройка шифрования";
"cross_signing_setup_banner_subtitle" = "Упростите проверку других ваших устройств";
"major_update_title" = "Riot теперь Element";
@@ -1312,9 +1311,9 @@
"callbar_return" = "Вернуться";
"call_actions_unhold" = "Возобновить";
"event_formatter_call_back" = "Перезвонить";
"event_formatter_call_you_declined" = "Вы отклонили этот вызов";
"event_formatter_call_you_declined" = "Вызов отклонён";
"event_formatter_call_you_currently_in" = "Вы в этом вызове";
"event_formatter_call_has_ended" = "Этот вызов закончился";
"event_formatter_call_has_ended" = "Вызов закончен %@";
"event_formatter_call_video" = "Видео вызов";
"event_formatter_call_voice" = "Голосовой вызов";
"settings_show_NSFW_public_rooms" = "Показать публичные комнаты с чувствительным контентом";
@@ -1330,10 +1329,94 @@
"callbar_active_and_single_paused" = "1 активный вызов (%@) · 1 приостановленный вызов";
// Call Bar
"callbar_only_single_active" = "Активный вызов (%@)";
"callbar_only_single_active" = "Нажмите для возврата к вызову (%@)";
"room_details_integrations" = "Интеграции";
"room_details_search" = "Искать комнату";
"room_multiple_typing_notification" = "%@ и другие";
"room_accessibility_video_call" = "Видео вызов";
"room_message_replying_to" = "В ответ %@";
"room_message_editing" = "Редактирование";
"voice_message_stop_locked_mode_recording" = "Нажмите на запись, чтобы остановить или прослушать ее";
"voice_message_remaining_recording_time" = "%@s осталось";
// Mark: - Voice Messages
"voice_message_release_to_send" = "Удерживайте для записи, отпустите для отправки";
"side_menu_app_version" = "Версия %@";
"side_menu_action_feedback" = "Отзыв";
"side_menu_action_help" = "Помощь";
"side_menu_action_settings" = "Настойки";
"side_menu_action_invite_friends" = "Пригласить друзей";
// Mark: - Side menu
"side_menu_reveal_action_accessibility_label" = "Левая панель";
"user_avatar_view_accessibility_hint" = "Изменить аватар пользователя";
// Mark: - User avatar view
"user_avatar_view_accessibility_label" = "аватар";
"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" = "Пространств ещё нет";
"secrets_recovery_with_key_information_unlock_secure_backup_with_key" = "Введите свой ключ безопасности, чтобы продолжить.";
"secrets_recovery_with_key_information_unlock_secure_backup_with_phrase" = "Введите секретную фразу, чтобы продолжить.";
"key_verification_verify_qr_code_scan_code_other_device_action" = "Сканирование с помощью этого устройства";
// Success from secure backup
"key_backup_setup_success_from_secure_backup_info" = "Ваши ключи резервируются.";
"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_connection_failed" = "Ошибка соединения";
"event_formatter_call_missed_video" = "Пропущенный видеовызов";
"event_formatter_call_missed_voice" = "Пропущенный голосовой вызов";
"event_formatter_call_active_video" = "Активный видеовызов";
"event_formatter_call_active_voice" = "Активный голосовой вызов";
"event_formatter_call_incoming_video" = "Входящий видеовызов";
"event_formatter_call_incoming_voice" = "Входящий голосовой вызов";
"event_formatter_call_ringing" = "Звонок…";
"event_formatter_call_connecting" = "Соединение…";
"room_notifs_settings_encrypted_room_notice" = "Обратите внимание, что уведомления об упоминаниях и ключевых словах недоступны в зашифрованных комнатах на мобильных устройствах.";
"room_notifs_settings_account_settings" = "Настройки аккаунта";
"room_notifs_settings_manage_notifications" = "Вы можете управлять уведомлениями в %@";
"room_notifs_settings_cancel_action" = "Отмена";
"room_notifs_settings_done_action" = "Готово";
"room_notifs_settings_none" = "Ничего";
"room_notifs_settings_mentions_and_keywords" = "Только упоминаниях и ключевых словах";
"room_notifs_settings_all_messages" = "Всех сообщениях";
// Room Notification Settings
"room_notifs_settings_notify_me_for" = "Уведомлять меня о";
"room_details_notifs" = "Уведомления";
"security_settings_secure_backup_restore" = "Восстановить из резервной копии";
"security_settings_secure_backup_reset" = "Сброс";
"security_settings_secure_backup_info_valid" = "В этом сеансе выполняется резервное копирование ваших ключей.";
"security_settings_secure_backup_info_checking" = "Проверка…";
"settings_labs_voice_messages" = "Голосовые сообщения";
"settings_labs_enable_ringing_for_group_calls" = "Звонок для групповых вызовов";
"settings_ui_theme_picker_message_match_system_theme" = "\"Автоматически\" соответствует системной теме вашего устройства";
"settings_ui_theme_picker_message_invert_colours" = "\"Автоматически\" использует настройки \"Инвертировать цвета\" вашего устройства";
"settings_notifications_disabled_alert_message" = "Чтобы включить уведомления, перейдите в настройки устройства.";
"settings_notifications_disabled_alert_title" = "Уведомления отключены";
"settings_device_notifications" = "Уведомления устройства";
"room_no_privileges_to_create_group_call" = "Чтобы начать разговор, необходимо быть администратором или модератором.";
"room_join_group_call" = "Присоединиться";
// Chat
"room_slide_to_end_group_call" = "Проведите, чтобы завершить звонок для всех";
"room_recents_unknown_room_error_message" = "Не удалось найти эту комнату. Убедитесь, что она существует";
"room_creation_dm_error" = "Мы не смогли создать ваш диалог. Пожалуйста, проверьте пользователей, которых вы хотите пригласить, и повторите попытку.";
"callbar_only_single_active_group" = "Нажмите для присоединения к групповому вызову (%@)";
+1 -1
View File
@@ -1,7 +1,7 @@
// Permissions usage explanations
"NSCameraUsageDescription" = "Kamera përdoret për të bërë foto dhe regjistruar video, dhe për të bërë thirrje video.";
"NSPhotoLibraryUsageDescription" = "Fototeka përdoret për të dërguar foto dhe video.";
"NSMicrophoneUsageDescription" = "Mikrofoni përdoret për të regjistruar video, dhe për të bërë thirrje.";
"NSMicrophoneUsageDescription" = "Element-it i duhet të përdorë mikrofonin tuaj për të bërë dhe marrë thirrje, për të regjistruar video, dhe për të regjistruar mesazhe zanorë.";
"NSContactsUsageDescription" = "Për zbulim kontaktesh që përdorin tashmë Matrix-in, Element-i mund të dërgojë adresa email dhe numra telefonash nga libri juaj i adresave te shërbyesi juaj i zgjedhur Matrix i identiteteve. Kur kjo mbulohet, të dhënat personale fshehtëzohen, para se të dërgohen - ju lutemi, për më tepër hollësi, shihni rregulla privatësie të shërbyesit tuaj të identiteteve.";
"NSCalendarsUsageDescription" = "Shihini te aplikacioni takimet tuaja të planifikuara.";
"NSFaceIDUsageDescription" = "Face ID përdoret që të hyni në aplikacionin tuaj.";
+18 -3
View File
@@ -493,7 +493,6 @@
"settings_sign_out_e2e_warn" = "Do të humbni kyçet tuaj të fshehtëzimit skaj-më-skaj. Kjo do të thotë se sdo të jeni më në gjendje të lexoni mesazhe të vjetër te dhoma të fshehtëzuara në këtë pajisje.";
"settings_surname" = "Mbiemër";
"settings_global_settings_info" = "Rregullimet globale për njoftime i gjeni te klienti juaj %@ web";
"settings_on_denied_notification" = "Njoftimet për %@ spranohen, ju lutemi, lejojini që nga rregullimet e pajisjes tuaj";
"settings_enable_callkit" = "Thirrje të integruara";
"settings_callkit_info" = "Merrini thirrjet ardhëse edhe me ekran të kyçur. Shihni thirrjet tuaja nën Element te historiku i thirrjeve të sistemit. Nëse iCloud është i aktivizuar, ky historik thirrjesh do ti jepet kompanisë Apple.";
"settings_ui_theme_picker_message" = "\"Auto\" përdor rregullimet \"Përmbysi Ngjyrat\" të pajisjes tuaj";
@@ -1307,9 +1306,9 @@
"bug_report_background_mode" = "Vazhdo në prapaskenë";
"call_actions_unhold" = "Rimerre";
"event_formatter_call_back" = "Ktheji thirrjen";
"event_formatter_call_you_declined" = "Hodhët poshtë këtë thirrje";
"event_formatter_call_you_declined" = "Thirrja u hodh poshtë";
"event_formatter_call_you_currently_in" = "Thirrje aktive";
"event_formatter_call_has_ended" = "Përfundoi %@";
"event_formatter_call_has_ended" = "Thirrja përfundoi %@";
"event_formatter_call_video" = "Thirrje video";
"event_formatter_call_voice" = "Thirrje audio";
"security_settings_crosssigning_reset" = "Rikthe te parazgjedhjet";
@@ -1413,3 +1412,19 @@
// Room Notification Settings
"room_notifs_settings_notify_me_for" = "Njoftomëni për";
"room_details_notifs" = "Njoftime";
"voice_message_stop_locked_mode_recording" = "Për ta ndalur ose regjistruar, prekni mbi regjistrimin tuaj";
"voice_message_remaining_recording_time" = "Edhe %@s";
// Mark: - Voice Messages
"voice_message_release_to_send" = "Mbajeni, që të regjistrojë, lëshojeni që të dërgohet";
"event_formatter_call_missed_video" = "Thirrje video e humbur";
"event_formatter_call_missed_voice" = "Thirrje zanore e humbur";
"event_formatter_call_active_video" = "Thirrje video aktive";
"event_formatter_call_active_voice" = "Thirrje zanore aktive";
"event_formatter_call_incoming_video" = "Thirrje video ardhëse";
"event_formatter_call_incoming_voice" = "Thirrje zanore ardhëse";
"settings_labs_voice_messages" = "Mesazhe zanore";
"settings_notifications_disabled_alert_message" = "Që të aktivizoni njoftimet, kaloni te rregullimet e pajisjes tuaj.";
"settings_notifications_disabled_alert_title" = "Njoftime të çaktivizuara";
"settings_device_notifications" = "Njoftime pajisjesh";
+1 -1
View File
@@ -2,6 +2,6 @@
"NSCalendarsUsageDescription" = "Se dina schemalagda möten i appen.";
// Permissions usage explanations
"NSCameraUsageDescription" = "Kameran används för att ta bilder och videor, och ringa videosamtal.";
"NSMicrophoneUsageDescription" = "Mikrofonen används för att spela in videor och ringa samtal.";
"NSMicrophoneUsageDescription" = "Element behöver åtkomst till din mikrofon för att kunna ringa och ta emot samtal samt spela in video och röstmeddelanden.";
"NSContactsUsageDescription" = "För att upptäcka kontakter som redan använder Matrix kan Element skicka e-postadresser och telefonnummer i din adressbok till din valda Matrix-identitetsserver. Där det stöds hashas personuppgifter innan de skickas - kontrollera din identitetsservers integritetspolicy för mer information.";
"NSFaceIDUsageDescription" = "Face ID används för att komma åt appen.";
-1
View File
@@ -309,7 +309,6 @@
"settings_show_decrypted_content" = "Visa avkrypterat innehåll";
"settings_pin_rooms_with_missed_notif" = "Fäst rum med missade aviseringar";
"settings_pin_rooms_with_unread" = "Fäst rum med olästa meddelanden";
"settings_on_denied_notification" = "Aviseringar har nekats för %@, vänligen tillåt dem i dina enhetsinställningar";
"settings_enable_callkit" = "Integrerade samtal";
"settings_integrations_allow_button" = "Hantera integrationer";
"settings_ui_language" = "Språk";
-1
View File
@@ -290,7 +290,6 @@
"settings_global_settings_info" = "Cài đặt thông báo toàn cầu khả dụng trên %@ trình duyệt khách của bạn";
"settings_pin_rooms_with_missed_notif" = "Neo phòng có thông báo bỏ lỡ";
"settings_pin_rooms_with_unread" = "Neo phòng có tin nhắn chưa đọc";
"settings_on_denied_notification" = "Thông báo bị từ chối cho %@, vui lòng cho phép trong cài đặt thiết bị của bạn";
"settings_enable_callkit" = "Cuộc gọi tích hợp";
"settings_callkit_info" = "Nhận cuộc gọi tới trên màn hình khóa. Xem lịch sử cuộc gọi trong lịch sử cuộc gọi của hệ thống. Nếu iCloud được kích hoạt, lịch sử cuộc gọi sẽ được chia sẻ với Apple.";
"settings_ui_language" = "Ngôn ngữ";
+11 -3
View File
@@ -272,7 +272,6 @@
"settings_global_settings_info" = "全局通知设置可在 %@ 的网页客户端中修改";
"settings_pin_rooms_with_missed_notif" = "置顶含有错过的通知的聊天室";
"settings_pin_rooms_with_unread" = "置顶含有未读消息的聊天室";
"settings_on_denied_notification" = "%@ 的通知请求被拒绝,请在系统设置中允许";
"settings_unignore_user" = "显示所有来自 %@ 的消息?";
"settings_contacts_discover_matrix_users" = "使用电子邮件和手机号码来发现用户";
"settings_contacts_phonebook_country" = "电话本国家";
@@ -1365,9 +1364,9 @@
"event_formatter_call_back" = "回拨";
"event_formatter_call_connection_failed" = "连接失败";
"event_formatter_call_you_missed" = "你错过此通话";
"event_formatter_call_you_declined" = "拒绝了通话";
"event_formatter_call_you_declined" = "拒绝了通话";
"event_formatter_call_you_currently_in" = "当前通话";
"event_formatter_call_has_ended" = "结束 %@";
"event_formatter_call_has_ended" = "通话结束 %@";
"event_formatter_call_ringing" = "响铃中……";
"event_formatter_call_connecting" = "连接中……";
"event_formatter_call_video" = "视频通话";
@@ -1446,3 +1445,12 @@
"room_notifs_settings_notify_me_for" = "通知内容";
"room_details_notifs" = "通知";
"settings_labs_voice_messages" = "语音消息";
"settings_notifications_disabled_alert_message" = "要启用通知,请转到您的设备设置。";
"settings_notifications_disabled_alert_title" = "已禁用通知";
"settings_device_notifications" = "设备通知";
"event_formatter_call_missed_video" = "未接视频通话";
"event_formatter_call_missed_voice" = "未接语音通话";
"event_formatter_call_active_video" = "活跃视频通话";
"event_formatter_call_active_voice" = "活跃语音通话";
"event_formatter_call_incoming_voice" = "语音来电";
"event_formatter_call_incoming_video" = "视频来电";
-1
View File
@@ -344,7 +344,6 @@
"room_ongoing_conference_call_with_close" = "群組通話進行中。 以 %@ 或 %@ 加入。%@ 該通話。";
"settings_pin_rooms_with_missed_notif" = "釘選含有錯過的通知的聊天室";
"settings_pin_rooms_with_unread" = "釘選含有未讀訊息的聊天室";
"settings_on_denied_notification" = "因 %@ 的通知不被允許,請在裝置設定中允許";
"settings_enable_callkit" = "整合式通話";
"settings_callkit_info" = "在鎖定畫面接聽 Element 來電、在通話紀錄中顯示 Element 通話。 如果您已啟用 iCloud ,則這些通話紀錄會與蘋果公司共享。";
"settings_ui_language" = "語言";
+2
View File
@@ -36,6 +36,8 @@ internal enum Asset {
internal static let callDialpadCallIcon = ImageAsset(name: "call_dialpad_call_icon")
internal static let callGoToChatIcon = ImageAsset(name: "call_go_to_chat_icon")
internal static let callHangupLarge = ImageAsset(name: "call_hangup_large")
internal static let callMissedVideo = ImageAsset(name: "call_missed_video")
internal static let callMissedVoice = ImageAsset(name: "call_missed_voice")
internal static let callMoreIcon = ImageAsset(name: "call_more_icon")
internal static let callPausedIcon = ImageAsset(name: "call_paused_icon")
internal static let callPausedWhiteIcon = ImageAsset(name: "call_paused_white_icon")
+48 -24
View File
@@ -1242,6 +1242,14 @@ internal enum VectorL10n {
internal static var errorUserAlreadyLoggedIn: String {
return VectorL10n.tr("Vector", "error_user_already_logged_in")
}
/// Active video call
internal static var eventFormatterCallActiveVideo: String {
return VectorL10n.tr("Vector", "event_formatter_call_active_video")
}
/// Active voice call
internal static var eventFormatterCallActiveVoice: String {
return VectorL10n.tr("Vector", "event_formatter_call_active_voice")
}
/// Answer
internal static var eventFormatterCallAnswer: String {
return VectorL10n.tr("Vector", "event_formatter_call_answer")
@@ -1266,9 +1274,29 @@ internal enum VectorL10n {
internal static var eventFormatterCallEndCall: String {
return VectorL10n.tr("Vector", "event_formatter_call_end_call")
}
/// Ended %@
internal static func eventFormatterCallHasEnded(_ p1: String) -> String {
return VectorL10n.tr("Vector", "event_formatter_call_has_ended", p1)
/// Call ended
internal static var eventFormatterCallHasEnded: String {
return VectorL10n.tr("Vector", "event_formatter_call_has_ended")
}
/// Call ended %@
internal static func eventFormatterCallHasEndedWithTime(_ p1: String) -> String {
return VectorL10n.tr("Vector", "event_formatter_call_has_ended_with_time", p1)
}
/// Incoming video call
internal static var eventFormatterCallIncomingVideo: String {
return VectorL10n.tr("Vector", "event_formatter_call_incoming_video")
}
/// Incoming voice call
internal static var eventFormatterCallIncomingVoice: String {
return VectorL10n.tr("Vector", "event_formatter_call_incoming_voice")
}
/// Missed video call
internal static var eventFormatterCallMissedVideo: String {
return VectorL10n.tr("Vector", "event_formatter_call_missed_video")
}
/// Missed voice call
internal static var eventFormatterCallMissedVoice: String {
return VectorL10n.tr("Vector", "event_formatter_call_missed_voice")
}
/// Retry
internal static var eventFormatterCallRetry: String {
@@ -1278,26 +1306,10 @@ internal enum VectorL10n {
internal static var eventFormatterCallRinging: String {
return VectorL10n.tr("Vector", "event_formatter_call_ringing")
}
/// Video call
internal static var eventFormatterCallVideo: String {
return VectorL10n.tr("Vector", "event_formatter_call_video")
}
/// Voice call
internal static var eventFormatterCallVoice: String {
return VectorL10n.tr("Vector", "event_formatter_call_voice")
}
/// Active call
internal static var eventFormatterCallYouCurrentlyIn: String {
return VectorL10n.tr("Vector", "event_formatter_call_you_currently_in")
}
/// You declined this call
/// Call declined
internal static var eventFormatterCallYouDeclined: String {
return VectorL10n.tr("Vector", "event_formatter_call_you_declined")
}
/// You missed this call
internal static var eventFormatterCallYouMissed: String {
return VectorL10n.tr("Vector", "event_formatter_call_you_missed")
}
/// Group call
internal static var eventFormatterGroupCall: String {
return VectorL10n.tr("Vector", "event_formatter_group_call")
@@ -4114,6 +4126,10 @@ internal enum VectorL10n {
internal static var settingsDeactivateMyAccount: String {
return VectorL10n.tr("Vector", "settings_deactivate_my_account")
}
/// Device notifications
internal static var settingsDeviceNotifications: String {
return VectorL10n.tr("Vector", "settings_device_notifications")
}
/// SESSIONS
internal static var settingsDevices: String {
return VectorL10n.tr("Vector", "settings_devices")
@@ -4390,6 +4406,14 @@ internal enum VectorL10n {
internal static var settingsNightMode: String {
return VectorL10n.tr("Vector", "settings_night_mode")
}
/// To enable notifications, go to your device settings.
internal static var settingsNotificationsDisabledAlertMessage: String {
return VectorL10n.tr("Vector", "settings_notifications_disabled_alert_message")
}
/// Notifications disabled
internal static var settingsNotificationsDisabledAlertTitle: String {
return VectorL10n.tr("Vector", "settings_notifications_disabled_alert_title")
}
/// NOTIFICATION SETTINGS
internal static var settingsNotificationsSettings: String {
return VectorL10n.tr("Vector", "settings_notifications_settings")
@@ -4402,10 +4426,6 @@ internal enum VectorL10n {
internal static func settingsOlmVersion(_ p1: String) -> String {
return VectorL10n.tr("Vector", "settings_olm_version", p1)
}
/// Notifications are denied for %@, please allow them in your device settings
internal static func settingsOnDeniedNotification(_ p1: String) -> String {
return VectorL10n.tr("Vector", "settings_on_denied_notification", p1)
}
/// OTHER
internal static var settingsOther: String {
return VectorL10n.tr("Vector", "settings_other")
@@ -4882,6 +4902,10 @@ internal enum VectorL10n {
internal static var voice: String {
return VectorL10n.tr("Vector", "voice")
}
/// Voice message
internal static var voiceMessageLockScreenPlaceholder: String {
return VectorL10n.tr("Vector", "voice_message_lock_screen_placeholder")
}
/// Hold to record, release to send
internal static var voiceMessageReleaseToSend: String {
return VectorL10n.tr("Vector", "voice_message_release_to_send")
-10
View File
@@ -52,7 +52,6 @@ final class RiotSettings: NSObject {
static let roomCreationScreenRoomIsPublic = "roomCreationScreenRoomIsPublic"
static let allowInviteExernalUsers = "allowInviteExernalUsers"
static let enableRingingForGroupCalls = "enableRingingForGroupCalls"
static let enableVoiceMessages = "enableVoiceMessages"
static let roomSettingsScreenShowLowPriorityOption = "roomSettingsScreenShowLowPriorityOption"
static let roomSettingsScreenShowDirectChatOption = "roomSettingsScreenShowDirectChatOption"
static let roomSettingsScreenAllowChangingAccessSettings = "roomSettingsScreenAllowChangingAccessSettings"
@@ -96,7 +95,6 @@ final class RiotSettings: NSObject {
private override init() {
super.init()
defaults.register(defaults: [UserDefaultsKeys.enableVoiceMessages: BuildSettings.voiceMessagesEnabled])
}
// MARK: Servers
@@ -221,14 +219,6 @@ final class RiotSettings: NSObject {
}
}
var enableVoiceMessages: Bool {
get {
return defaults.bool(forKey: UserDefaultsKeys.enableVoiceMessages)
} set {
defaults.set(newValue, forKey: UserDefaultsKeys.enableVoiceMessages)
}
}
// MARK: Calls
/// Indicate if `allowStunServerFallback` settings has been set once.
@@ -48,12 +48,10 @@ final class SSOAuthenticationService: NSObject {
return nil
}
let ssoRedirectPath: String
var ssoRedirectPath = SSOURLConstants.Paths.redirect
if let identityProvider = identityProvider {
ssoRedirectPath = SSOURLConstants.Paths.unstableRedirect + identityProvider
} else {
ssoRedirectPath = SSOURLConstants.Paths.redirect
ssoRedirectPath.append(identityProvider)
}
authenticationComponent.path = ssoRedirectPath
@@ -24,7 +24,6 @@ enum SSOURLConstants {
}
enum Paths {
static let redirect = "/_matrix/client/r0/login/sso/redirect"
static let unstableRedirect = "/_matrix/client/unstable/org.matrix.msc2858/login/sso/redirect/"
static let redirect = "/_matrix/client/r0/login/sso/redirect/"
}
}
@@ -23,7 +23,6 @@
@property (weak, nonatomic) IBOutlet UIView *missedNotifAndUnreadIndicator;
@property (weak, nonatomic) IBOutlet MXKImageView *roomAvatar;
@property (weak, nonatomic) IBOutlet UIView *directRoomBorderView;
@property (weak, nonatomic) IBOutlet UIImageView *encryptedRoomIcon;
@property (weak, nonatomic) IBOutlet UILabel *missedNotifAndUnreadBadgeLabel;
@@ -27,11 +27,6 @@
#import "MXRoomSummary+Riot.h"
#pragma mark - Defines & Constants
static const CGFloat kDirectRoomBorderColorAlpha = 0.75;
static const CGFloat kDirectRoomBorderWidth = 3.0;
@implementation RecentTableViewCell
#pragma mark - Class methods
@@ -54,16 +49,6 @@ static const CGFloat kDirectRoomBorderWidth = 3.0;
self.lastEventDate.textColor = ThemeService.shared.theme.textSecondaryColor;
self.missedNotifAndUnreadBadgeLabel.textColor = ThemeService.shared.theme.baseTextPrimaryColor;
// Prepare direct room border
CGColorRef directRoomBorderColor = CGColorCreateCopyWithAlpha(ThemeService.shared.theme.tintColor.CGColor, kDirectRoomBorderColorAlpha);
[self.directRoomBorderView.layer setCornerRadius:self.directRoomBorderView.frame.size.width / 2];
self.directRoomBorderView.clipsToBounds = YES;
self.directRoomBorderView.layer.borderColor = directRoomBorderColor;
self.directRoomBorderView.layer.borderWidth = kDirectRoomBorderWidth;
CFRelease(directRoomBorderColor);
self.roomAvatar.defaultBackgroundColor = [UIColor clearColor];
}
@@ -138,8 +123,6 @@ static const CGFloat kDirectRoomBorderWidth = 3.0;
// The room title is not bold anymore
self.roomTitle.font = [UIFont systemFontOfSize:17 weight:UIFontWeightMedium];
}
self.directRoomBorderView.hidden = !roomCellData.roomSummary.room.isDirect;
[roomCellData.roomSummary setRoomAvatarImageIn:self.roomAvatar];
}
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17703"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -34,14 +34,6 @@
<constraint firstAttribute="height" constant="42" id="WPC-tL-hnM"/>
</constraints>
</view>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8CY-Ku-0qh">
<rect key="frame" x="13" y="15" width="42" height="42"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="42" id="ize-F0-OeQ"/>
<constraint firstAttribute="width" constant="42" id="t6V-Zm-EM3"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="RoomTitle" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lg1-xQ-AGn">
<rect key="frame" x="69" y="14" width="451" height="21"/>
<accessibility key="accessibilityConfiguration" identifier="TitleLabel"/>
@@ -109,7 +101,6 @@
</subviews>
<constraints>
<constraint firstItem="F6K-PV-15f" firstAttribute="trailing" secondItem="360-Go-RcG" secondAttribute="trailing" id="3qB-Na-Eqs"/>
<constraint firstItem="8CY-Ku-0qh" firstAttribute="centerX" secondItem="RX5-eD-c3c" secondAttribute="centerX" id="FVh-1h-VkB"/>
<constraint firstItem="360-Go-RcG" firstAttribute="leading" secondItem="OeZ-wN-eil" secondAttribute="trailing" constant="8" id="KuE-8m-e9A"/>
<constraint firstItem="e7r-zL-9bw" firstAttribute="leading" secondItem="aXz-IR-jj5" secondAttribute="leading" id="PUW-if-ewh"/>
<constraint firstItem="Lg1-xQ-AGn" firstAttribute="leading" secondItem="RX5-eD-c3c" secondAttribute="trailing" constant="14" id="Pgp-JM-oQd"/>
@@ -127,13 +118,11 @@
<constraint firstAttribute="trailing" secondItem="dQt-mN-T6b" secondAttribute="trailing" constant="30" id="t2m-pb-5zd"/>
<constraint firstItem="Lg1-xQ-AGn" firstAttribute="top" secondItem="aXz-IR-jj5" secondAttribute="top" constant="14" id="tY3-6V-A3B"/>
<constraint firstItem="RX5-eD-c3c" firstAttribute="leading" secondItem="aXz-IR-jj5" secondAttribute="leading" constant="13" id="tgy-cX-Wxm"/>
<constraint firstItem="8CY-Ku-0qh" firstAttribute="centerY" secondItem="RX5-eD-c3c" secondAttribute="centerY" id="ukJ-yz-Kit"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="RecentTableViewCell"/>
<connections>
<outlet property="directRoomBorderView" destination="8CY-Ku-0qh" id="vKk-ZO-TQq"/>
<outlet property="encryptedRoomIcon" destination="NAZ-zd-MHS" id="ZsH-Zr-Q4K"/>
<outlet property="lastEventDate" destination="360-Go-RcG" id="Y0L-Dj-ZVn"/>
<outlet property="lastEventDecriptionLabelTrailingConstraint" destination="t2m-pb-5zd" id="cxp-7Z-bEg"/>
@@ -196,21 +196,25 @@
[hsUserDirectoryOperation cancel];
hsUserDirectoryOperation = nil;
}
MXWeakify(self);
hsUserDirectoryOperation = [self.mxSession.matrixRestClient searchUsers:searchText limit:50 success:^(MXUserSearchResponse *userSearchResponse) {
filteredMatrixContacts = [NSMutableArray arrayWithCapacity:userSearchResponse.results.count];
MXStrongifyAndReturnIfNil(self);
self->filteredMatrixContacts = [NSMutableArray arrayWithCapacity:userSearchResponse.results.count];
// Keep the response order as the hs ordered users by relevance
for (MXUser *mxUser in userSearchResponse.results)
{
MXKContact *contact = [[MXKContact alloc] initMatrixContactWithDisplayName:mxUser.displayname andMatrixID:mxUser.userId];
[filteredMatrixContacts addObject:contact];
[self->filteredMatrixContacts addObject:contact];
}
hsUserDirectoryOperation = nil;
self->hsUserDirectoryOperation = nil;
_userDirectoryState = userSearchResponse.limited ? ContactsDataSourceUserDirectoryStateLoadedButLimited : ContactsDataSourceUserDirectoryStateLoaded;
self->_userDirectoryState = userSearchResponse.limited ? ContactsDataSourceUserDirectoryStateLoadedButLimited : ContactsDataSourceUserDirectoryStateLoaded;
// And inform the delegate about the update
[self.delegate dataSource:self didCellChange:nil];
@@ -230,28 +234,32 @@
// Disclose the sections
shrinkedSectionsBitMask = 0;
}
MXWeakify(self);
dispatch_async(searchProcessingQueue, ^{
MXStrongifyAndReturnIfNil(self);
// Reset the current arrays if it is required
if (!searchText.length)
{
searchProcessingLocalContacts = nil;
searchProcessingMatrixContacts = nil;
self->searchProcessingLocalContacts = nil;
self->searchProcessingMatrixContacts = nil;
}
else if (unfilteredLocalContacts)
{
searchProcessingLocalContacts = unfilteredLocalContacts;
searchProcessingMatrixContacts = unfilteredMatrixContacts;
self->searchProcessingLocalContacts = unfilteredLocalContacts;
self->searchProcessingMatrixContacts = unfilteredMatrixContacts;
}
for (NSUInteger index = 0; index < searchProcessingLocalContacts.count;)
for (NSUInteger index = 0; index < self->searchProcessingLocalContacts.count;)
{
MXKContact* contact = searchProcessingLocalContacts[index];
MXKContact* contact = self->searchProcessingLocalContacts[index];
if (![contact hasPrefix:searchText])
{
[searchProcessingLocalContacts removeObjectAtIndex:index];
[self->searchProcessingLocalContacts removeObjectAtIndex:index];
}
else
{
@@ -260,13 +268,13 @@
}
}
for (NSUInteger index = 0; index < searchProcessingMatrixContacts.count;)
for (NSUInteger index = 0; index < self->searchProcessingMatrixContacts.count;)
{
MXKContact* contact = searchProcessingMatrixContacts[index];
MXKContact* contact = self->searchProcessingMatrixContacts[index];
if (![contact hasPrefix:searchText])
{
[searchProcessingMatrixContacts removeObjectAtIndex:index];
[self->searchProcessingMatrixContacts removeObjectAtIndex:index];
}
else
{
@@ -276,42 +284,41 @@
}
// Sort the refreshed list of the invitable contacts
[[MXKContactManager sharedManager] sortAlphabeticallyContacts:searchProcessingLocalContacts];
[[MXKContactManager sharedManager] sortContactsByLastActiveInformation:searchProcessingMatrixContacts];
[[MXKContactManager sharedManager] sortAlphabeticallyContacts:self->searchProcessingLocalContacts];
[[MXKContactManager sharedManager] sortContactsByLastActiveInformation:self->searchProcessingMatrixContacts];
searchProcessingText = searchText;
self->searchProcessingText = searchText;
MXWeakify(self);
dispatch_sync(dispatch_get_main_queue(), ^{
// Sanity check: check whether self has been destroyed.
if (!searchProcessingQueue)
{
return;
}
MXStrongifyAndReturnIfNil(self);
// Render the search result only if there is no other search in progress.
searchProcessingCount --;
self->searchProcessingCount --;
if (!searchProcessingCount)
if (!self->searchProcessingCount)
{
if (!forceSearchResultRefresh)
if (!self->forceSearchResultRefresh)
{
// Update the filtered contacts.
currentSearchText = searchProcessingText;
filteredLocalContacts = searchProcessingLocalContacts;
self->currentSearchText = self->searchProcessingText;
self->filteredLocalContacts = self->searchProcessingLocalContacts;
if (!hsUserDirectory)
{
filteredMatrixContacts = searchProcessingMatrixContacts;
_userDirectoryState = ContactsDataSourceUserDirectoryStateOfflineLoaded;
self->filteredMatrixContacts = self->searchProcessingMatrixContacts;
self->_userDirectoryState = ContactsDataSourceUserDirectoryStateOfflineLoaded;
}
if (!self.forceMatrixIdInDisplayName)
{
[isMultiUseNameByDisplayName removeAllObjects];
for (MXKContact* contact in filteredMatrixContacts)
[self->isMultiUseNameByDisplayName removeAllObjects];
for (MXKContact* contact in self->filteredMatrixContacts)
{
isMultiUseNameByDisplayName[contact.displayName] = (isMultiUseNameByDisplayName[contact.displayName] ? @(YES) : @(NO));
self->isMultiUseNameByDisplayName[contact.displayName] = (self->isMultiUseNameByDisplayName[contact.displayName] ? @(YES) : @(NO));
}
}
@@ -321,8 +328,8 @@
else
{
// Launch a new search
forceSearchResultRefresh = NO;
[self searchWithPattern:searchProcessingText forceReset:YES];
self->forceSearchResultRefresh = NO;
[self searchWithPattern:self->searchProcessingText forceReset:YES];
}
}
});
@@ -22,7 +22,6 @@
@interface RoomTableViewCell : MXKTableViewCell
@property (weak, nonatomic) IBOutlet MXKImageView *avatarImageView;
@property (weak, nonatomic) IBOutlet UIView *directRoomBorderView;
@property (weak, nonatomic) IBOutlet UIImageView *encryptedRoomIcon;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@@ -22,11 +22,6 @@
#import "MXRoomSummary+Riot.h"
#pragma mark - Defines & Constants
static const CGFloat kDirectRoomBorderColorAlpha = 0.75;
static const CGFloat kDirectRoomBorderWidth = 3.0;
@implementation RoomTableViewCell
#pragma mark - Class methods
@@ -37,16 +32,6 @@ static const CGFloat kDirectRoomBorderWidth = 3.0;
self.titleLabel.textColor = ThemeService.shared.theme.textPrimaryColor;
// Prepare direct room border
CGColorRef directRoomBorderColor = CGColorCreateCopyWithAlpha(ThemeService.shared.theme.tintColor.CGColor, kDirectRoomBorderColorAlpha);
[self.directRoomBorderView.layer setCornerRadius:self.directRoomBorderView.frame.size.width / 2];
self.directRoomBorderView.clipsToBounds = YES;
self.directRoomBorderView.layer.borderColor = directRoomBorderColor;
self.directRoomBorderView.layer.borderWidth = kDirectRoomBorderWidth;
CFRelease(directRoomBorderColor);
self.avatarImageView.defaultBackgroundColor = [UIColor clearColor];
}
@@ -64,15 +49,6 @@ static const CGFloat kDirectRoomBorderWidth = 3.0;
[room.summary setRoomAvatarImageIn:self.avatarImageView];
self.titleLabel.text = room.summary.displayname;
self.directRoomBorderView.hidden = !room.isDirect;
}
- (void)prepareForReuse
{
[super prepareForReuse];
self.directRoomBorderView.hidden = YES;
}
+ (CGFloat)cellHeight
@@ -1,11 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -14,8 +12,8 @@
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="L2L-l5-wPx" customClass="RoomTableViewCell">
<rect key="frame" x="0.0" y="0.0" width="600" height="74"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="L2L-l5-wPx" id="aXz-IR-jj5">
<rect key="frame" x="0.0" y="0.0" width="600" height="73.5"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" ambiguous="YES" tableViewCell="L2L-l5-wPx" id="aXz-IR-jj5">
<rect key="frame" x="0.0" y="0.0" width="600" height="74"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FfX-ul-Kr4" customClass="MXKImageView">
@@ -23,19 +21,12 @@
<color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="AvatarImageView"/>
<constraints>
<constraint firstAttribute="width" constant="42" id="DCk-EO-Wpn"/>
<constraint firstAttribute="height" constant="42" id="bkm-0A-IeX"/>
<constraint firstAttribute="width" secondItem="FfX-ul-Kr4" secondAttribute="height" multiplier="1:1" id="ycc-8M-xEj"/>
</constraints>
</view>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="O8i-B6-S6A">
<rect key="frame" x="26" y="16" width="42" height="42"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" secondItem="O8i-B6-S6A" secondAttribute="height" multiplier="1:1" id="KP4-Uc-4pf"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lg1-xQ-AGn">
<rect key="frame" x="82" y="27" width="34" height="20"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" ambiguous="YES" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lg1-xQ-AGn">
<rect key="frame" x="82" y="27" width="33" height="20"/>
<accessibility key="accessibilityConfiguration" identifier="TitleLabel"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="NW9-MB-gf4"/>
@@ -45,7 +36,7 @@
<nil key="highlightedColor"/>
</label>
<imageView hidden="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="e2e_verified" translatesAutoresizingMaskIntoConstraints="NO" id="apY-Nk-wQh">
<rect key="frame" x="62" y="45" width="11" height="13"/>
<rect key="frame" x="58" y="45" width="11" height="13"/>
<accessibility key="accessibilityConfiguration" identifier="EncryptedRoomIcon"/>
<constraints>
<constraint firstAttribute="width" constant="11" id="6Pz-2E-7D8"/>
@@ -56,25 +47,22 @@
<constraints>
<constraint firstItem="Lg1-xQ-AGn" firstAttribute="leading" secondItem="FfX-ul-Kr4" secondAttribute="trailing" constant="14" id="A6H-TC-2Pg"/>
<constraint firstAttribute="bottom" secondItem="FfX-ul-Kr4" secondAttribute="bottom" constant="15.5" id="D2o-qq-OsZ"/>
<constraint firstItem="O8i-B6-S6A" firstAttribute="centerY" secondItem="FfX-ul-Kr4" secondAttribute="centerY" id="L8U-Xi-rD7"/>
<constraint firstItem="Lg1-xQ-AGn" firstAttribute="centerY" secondItem="aXz-IR-jj5" secondAttribute="centerY" id="O6E-Di-2d4"/>
<constraint firstItem="apY-Nk-wQh" firstAttribute="top" secondItem="aXz-IR-jj5" secondAttribute="topMargin" constant="34" id="Rlm-bQ-Qpr"/>
<constraint firstItem="O8i-B6-S6A" firstAttribute="width" secondItem="FfX-ul-Kr4" secondAttribute="width" id="Sej-VT-sBx"/>
<constraint firstAttribute="trailingMargin" relation="greaterThanOrEqual" secondItem="Lg1-xQ-AGn" secondAttribute="trailing" constant="15" id="U1F-vo-7f6"/>
<constraint firstItem="apY-Nk-wQh" firstAttribute="leading" secondItem="aXz-IR-jj5" secondAttribute="leadingMargin" constant="42" id="dut-Df-DIU"/>
<constraint firstItem="FfX-ul-Kr4" firstAttribute="leading" secondItem="aXz-IR-jj5" secondAttribute="leadingMargin" constant="6" id="qey-6T-URF"/>
<constraint firstItem="FfX-ul-Kr4" firstAttribute="leading" secondItem="aXz-IR-jj5" secondAttribute="leadingMargin" constant="10" id="qey-6T-URF"/>
<constraint firstItem="FfX-ul-Kr4" firstAttribute="top" secondItem="aXz-IR-jj5" secondAttribute="top" constant="16" id="wyT-JI-kQS"/>
<constraint firstItem="O8i-B6-S6A" firstAttribute="centerX" secondItem="FfX-ul-Kr4" secondAttribute="centerX" id="xfK-sI-YJQ"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="RoomTableViewCell"/>
<connections>
<outlet property="avatarImageView" destination="FfX-ul-Kr4" id="NOo-Lj-BBY"/>
<outlet property="directRoomBorderView" destination="O8i-B6-S6A" id="b7x-Sz-SiX"/>
<outlet property="encryptedRoomIcon" destination="apY-Nk-wQh" id="qlf-6j-voX"/>
<outlet property="titleLabel" destination="Lg1-xQ-AGn" id="uqU-hH-KT0"/>
</connections>
<point key="canvasLocation" x="-14" y="132"/>
</tableViewCell>
</objects>
<resources>
@@ -36,7 +36,6 @@
@property (weak, nonatomic) IBOutlet UIView *editionArrowView;
@property (weak, nonatomic) IBOutlet UIView *directRoomBorderView;
@property (weak, nonatomic) IBOutlet MXKImageView *roomAvatar;
@property (weak, nonatomic) IBOutlet UIImageView *encryptedRoomIcon;
@@ -26,11 +26,6 @@
#import "MXTools.h"
#pragma mark - Defines & Constants
static const CGFloat kDirectRoomBorderColorAlpha = 0.75;
static const CGFloat kDirectRoomBorderWidth = 3.0;
@implementation RoomCollectionViewCell
#pragma mark - Class methods
@@ -67,16 +62,6 @@ static const CGFloat kDirectRoomBorderWidth = 3.0;
self.roomTitle1.textColor = ThemeService.shared.theme.textPrimaryColor;
self.roomTitle2.textColor = ThemeService.shared.theme.textPrimaryColor;
// Prepare direct room border
CGColorRef directRoomBorderColor = CGColorCreateCopyWithAlpha(ThemeService.shared.theme.tintColor.CGColor, kDirectRoomBorderColorAlpha);
[self.directRoomBorderView.layer setCornerRadius:self.directRoomBorderView.frame.size.width / 2];
self.directRoomBorderView.clipsToBounds = YES;
self.directRoomBorderView.layer.borderColor = directRoomBorderColor;
self.directRoomBorderView.layer.borderWidth = kDirectRoomBorderWidth;
CFRelease(directRoomBorderColor);
self.editionArrowView.backgroundColor = ThemeService.shared.theme.headerBackgroundColor;
self.roomAvatar.defaultBackgroundColor = [UIColor clearColor];
@@ -145,8 +130,6 @@ static const CGFloat kDirectRoomBorderWidth = 3.0;
}
self.directRoomBorderView.hidden = !roomCellData.roomSummary.room.isDirect;
[roomCellData.roomSummary setRoomAvatarImageIn:self.roomAvatar];
}
}
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17703"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -24,16 +24,8 @@
<constraint firstAttribute="width" secondItem="T1Q-RS-8o6" secondAttribute="height" multiplier="1:1" id="zmb-Nw-TEX"/>
</constraints>
</view>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xws-BR-H47">
<rect key="frame" x="10" y="10" width="60" height="60"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" constant="60" id="3OW-3y-Rg7"/>
<constraint firstAttribute="width" secondItem="xws-BR-H47" secondAttribute="height" multiplier="1:1" id="bEP-hL-5lg"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="!" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="scs-Ov-Tjv" customClass="BadgeLabel" customModule="Riot" customModuleProvider="target">
<rect key="frame" x="56" y="8" width="16.5" height="16.5"/>
<rect key="frame" x="62" y="9" width="4.5" height="14.5"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="12"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
@@ -81,9 +73,8 @@
<constraint firstItem="oxX-IL-dG4" firstAttribute="top" secondItem="T1Q-RS-8o6" secondAttribute="bottom" constant="4" id="2DB-H2-E2v"/>
<constraint firstAttribute="bottom" secondItem="jta-3V-4wL" secondAttribute="bottom" id="3rt-Ig-1rG"/>
<constraint firstItem="oxX-IL-dG4" firstAttribute="leading" secondItem="eCk-zY-LXq" secondAttribute="leading" constant="4" id="6gu-JD-Gb1"/>
<constraint firstItem="scs-Ov-Tjv" firstAttribute="centerY" secondItem="xws-BR-H47" secondAttribute="top" constant="6" id="CRF-wK-Lcp"/>
<constraint firstItem="scs-Ov-Tjv" firstAttribute="centerY" secondItem="T1Q-RS-8o6" secondAttribute="top" constant="6" id="CRF-wK-Lcp"/>
<constraint firstItem="X8H-1U-wc3" firstAttribute="centerX" secondItem="oxX-IL-dG4" secondAttribute="centerX" id="K9T-eO-WNb"/>
<constraint firstItem="xws-BR-H47" firstAttribute="centerX" secondItem="T1Q-RS-8o6" secondAttribute="centerX" id="Lo3-Ov-Bw8"/>
<constraint firstItem="Jkz-Zp-aaG" firstAttribute="centerX" secondItem="oxX-IL-dG4" secondAttribute="centerX" id="OQy-tF-e3Z"/>
<constraint firstItem="jta-3V-4wL" firstAttribute="centerX" secondItem="eCk-zY-LXq" secondAttribute="centerX" id="R87-mq-SlO"/>
<constraint firstItem="5Yd-df-HbB" firstAttribute="bottom" secondItem="T1Q-RS-8o6" secondAttribute="bottom" constant="2" id="RQU-MS-Qfr"/>
@@ -91,8 +82,7 @@
<constraint firstItem="X8H-1U-wc3" firstAttribute="leading" secondItem="eCk-zY-LXq" secondAttribute="leading" constant="7" id="XU5-Lv-9Xn"/>
<constraint firstItem="T1Q-RS-8o6" firstAttribute="top" secondItem="eCk-zY-LXq" secondAttribute="top" constant="10" id="cc7-bg-15Z"/>
<constraint firstItem="Jkz-Zp-aaG" firstAttribute="leading" secondItem="eCk-zY-LXq" secondAttribute="leading" constant="7" id="fPh-Lb-Bv9"/>
<constraint firstItem="xws-BR-H47" firstAttribute="centerY" secondItem="T1Q-RS-8o6" secondAttribute="centerY" id="faX-hg-WfP"/>
<constraint firstItem="scs-Ov-Tjv" firstAttribute="centerX" secondItem="xws-BR-H47" secondAttribute="trailing" priority="750" constant="-6" id="fgA-Sf-Y4E"/>
<constraint firstItem="scs-Ov-Tjv" firstAttribute="centerX" secondItem="T1Q-RS-8o6" secondAttribute="trailing" priority="750" constant="-6" id="fgA-Sf-Y4E"/>
<constraint firstAttribute="trailing" secondItem="oxX-IL-dG4" secondAttribute="trailing" constant="4" id="hDl-X9-M4n"/>
<constraint firstItem="T1Q-RS-8o6" firstAttribute="centerX" secondItem="eCk-zY-LXq" secondAttribute="centerX" id="hmB-fl-oN2"/>
<constraint firstAttribute="trailing" secondItem="X8H-1U-wc3" secondAttribute="trailing" constant="7" id="o5i-7H-n0G"/>
@@ -103,7 +93,6 @@
</constraints>
<connections>
<outlet property="badgeLabel" destination="scs-Ov-Tjv" id="KPV-Qb-cnT"/>
<outlet property="directRoomBorderView" destination="xws-BR-H47" id="34A-hu-DXq"/>
<outlet property="editionArrowView" destination="jta-3V-4wL" id="XLj-Cx-3bn"/>
<outlet property="encryptedRoomIcon" destination="5Yd-df-HbB" id="5pc-Vi-wMZ"/>
<outlet property="roomAvatar" destination="T1Q-RS-8o6" id="4sR-Wm-jwz"/>
@@ -116,11 +105,11 @@
</objects>
<designables>
<designable name="scs-Ov-Tjv">
<size key="intrinsicContentSize" width="16.5" height="16.5"/>
<size key="intrinsicContentSize" width="4.5" height="14.5"/>
</designable>
</designables>
<resources>
<image name="encryption_normal" width="16" height="16"/>
<image name="encryption_normal" width="12" height="12"/>
<systemColor name="groupTableViewBackgroundColor">
<color red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
+2
View File
@@ -998,6 +998,8 @@ const NSTimeInterval kResizeComposerAnimationDuration = .05;
}
[self refreshRoomInputToolbar];
[VoiceMessageMediaServiceProvider.sharedProvider setCurrentRoomSummary:dataSource.room.summary];
}
- (void)onRoomDataSourceReady
@@ -32,8 +32,6 @@ class CallBubbleCellBaseContentView: UIView {
@IBOutlet weak var avatarImageView: MXKImageView!
@IBOutlet weak var callerNameLabel: UILabel!
@IBOutlet weak var callIconView: UIImageView!
@IBOutlet weak var callTypeLabel: UILabel!
@IBOutlet weak var dotLabel: UILabel!
@IBOutlet private weak var callStatusLabel: UILabel!
@IBOutlet private weak var callSummaryHeightConstraint: NSLayoutConstraint!
@@ -51,7 +49,6 @@ class CallBubbleCellBaseContentView: UIView {
var statusText: String? {
didSet {
dotLabel.isHidden = statusText == nil
callStatusLabel.text = statusText
}
}
@@ -105,9 +102,7 @@ extension CallBubbleCellBaseContentView: Themable {
bgView.backgroundColor = theme.colors.tile
callerNameLabel.textColor = theme.textPrimaryColor
callIconView.tintColor = theme.textTertiaryColor
callTypeLabel.textColor = theme.textSecondaryColor
dotLabel.textColor = theme.textSecondaryColor
callIconView.tintColor = theme.textSecondaryColor
callStatusLabel.textColor = theme.textSecondaryColor
if let bottomContainerView = bottomContainerView as? Themable {
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17703"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -78,7 +78,7 @@
<nil key="highlightedColor"/>
</label>
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="6" translatesAutoresizingMaskIntoConstraints="NO" id="kdm-vj-rsY">
<rect key="frame" x="92" y="98" width="160.5" height="20"/>
<rect key="frame" x="130" y="98" width="84" height="20"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="voice_call_hangon_icon" translatesAutoresizingMaskIntoConstraints="NO" id="iQL-Bn-D9b">
<rect key="frame" x="0.0" y="2" width="16" height="16"/>
@@ -87,20 +87,8 @@
<constraint firstAttribute="height" constant="16" id="OdD-1h-kkV"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Voice call" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="alq-3S-yHg">
<rect key="frame" x="22" y="2" width="58" height="16"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="•" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6xJ-gU-ls1">
<rect key="frame" x="86" y="2" width="6.5" height="16"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Active call" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="A3h-4o-nXF">
<rect key="frame" x="98.5" y="2" width="62" height="16"/>
<rect key="frame" x="22" y="2" width="62" height="16"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
@@ -197,9 +185,7 @@
<outlet property="callIconView" destination="iQL-Bn-D9b" id="Cih-PG-EM2"/>
<outlet property="callStatusLabel" destination="A3h-4o-nXF" id="9Zf-aC-DAq"/>
<outlet property="callSummaryHeightConstraint" destination="xI1-oH-QU6" id="EnC-Bt-TkY"/>
<outlet property="callTypeLabel" destination="alq-3S-yHg" id="lgA-Dw-PH2"/>
<outlet property="callerNameLabel" destination="ONW-WU-t2g" id="0Vj-Xn-CLD"/>
<outlet property="dotLabel" destination="6xJ-gU-ls1" id="8ln-dF-l7V"/>
<outlet property="paginationLabel" destination="GQH-kh-LXA" id="Mww-Ps-yv1"/>
<outlet property="paginationSeparatorView" destination="YdR-PH-eGM" id="aK7-LF-awm"/>
<outlet property="paginationTitleView" destination="H6S-AE-DTm" id="yep-a0-QYq"/>
@@ -57,6 +57,7 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
private var viewState: ViewState = .unknown {
didSet {
updateBottomContentView()
updateCallIcon()
}
}
@@ -78,11 +79,24 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
return formatter
}
private func updateCallIcon() {
switch viewState {
case .missed:
innerContentView.callIconView.image = isVideoCall ?
Asset.Images.callMissedVideo.image :
Asset.Images.callMissedVoice.image
default:
innerContentView.callIconView.image = isVideoCall ?
Asset.Images.callVideoIcon.image :
Asset.Images.voiceCallHangonIcon.image
}
}
private func updateBottomContentView() {
bottomContentView = bottomView(for: viewState)
}
private var callTypeIcon: UIImage {
private var callButtonIcon: UIImage {
if isVideoCall {
return Asset.Images.callVideoIcon.image
} else {
@@ -112,7 +126,7 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
view.secondButton.style = .positive
view.secondButton.setTitle(VectorL10n.eventFormatterCallAnswer, for: .normal)
view.secondButton.setImage(callTypeIcon, for: .normal)
view.secondButton.setImage(callButtonIcon, for: .normal)
view.secondButton.removeTarget(nil, action: nil, for: .touchUpInside)
view.secondButton.addTarget(self, action: #selector(answerCallAction(_:)), for: .touchUpInside)
@@ -134,7 +148,7 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
view.firstButton.style = .positive
view.firstButton.setTitle(VectorL10n.eventFormatterCallBack, for: .normal)
view.firstButton.setImage(callTypeIcon, for: .normal)
view.firstButton.setImage(callButtonIcon, for: .normal)
view.firstButton.removeTarget(nil, action: nil, for: .touchUpInside)
view.firstButton.addTarget(self, action: #selector(callBackAction(_:)), for: .touchUpInside)
@@ -145,7 +159,7 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
view.firstButton.style = .positive
view.firstButton.setTitle(VectorL10n.eventFormatterCallBack, for: .normal)
view.firstButton.setImage(callTypeIcon, for: .normal)
view.firstButton.setImage(callButtonIcon, for: .normal)
view.firstButton.removeTarget(nil, action: nil, for: .touchUpInside)
view.firstButton.addTarget(self, action: #selector(callBackAction(_:)), for: .touchUpInside)
@@ -158,7 +172,7 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
view.firstButton.style = .positive
view.firstButton.setTitle(VectorL10n.eventFormatterCallRetry, for: .normal)
view.firstButton.setImage(callTypeIcon, for: .normal)
view.firstButton.setImage(callButtonIcon, for: .normal)
view.firstButton.removeTarget(nil, action: nil, for: .touchUpInside)
view.firstButton.addTarget(self, action: #selector(callBackAction(_:)), for: .touchUpInside)
@@ -174,13 +188,13 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
.connecting:
viewState = .active
if call.isIncoming {
statusText = VectorL10n.eventFormatterCallYouCurrentlyIn
statusText = isVideoCall ? VectorL10n.eventFormatterCallActiveVideo : VectorL10n.eventFormatterCallActiveVoice
} else {
statusText = VectorL10n.eventFormatterCallConnecting
}
case .inviteSent:
if call.isIncoming {
statusText = VectorL10n.eventFormatterCallYouCurrentlyIn
statusText = isVideoCall ? VectorL10n.eventFormatterCallActiveVideo : VectorL10n.eventFormatterCallActiveVoice
} else {
statusText = VectorL10n.eventFormatterCallRinging
}
@@ -189,14 +203,14 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
.onHold,
.remotelyOnHold:
viewState = .active
statusText = VectorL10n.eventFormatterCallYouCurrentlyIn
statusText = isVideoCall ? VectorL10n.eventFormatterCallActiveVideo : VectorL10n.eventFormatterCallActiveVoice
case .ringing:
if call.isIncoming {
viewState = .ringing
statusText = nil
statusText = isVideoCall ? VectorL10n.eventFormatterCallIncomingVideo : VectorL10n.eventFormatterCallIncomingVoice
} else {
viewState = .active
statusText = VectorL10n.eventFormatterCallYouCurrentlyIn
statusText = isVideoCall ? VectorL10n.eventFormatterCallActiveVideo : VectorL10n.eventFormatterCallActiveVoice
}
case .ended:
switch call.endReason {
@@ -206,27 +220,27 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
.remoteHangup,
.answeredElseWhere:
viewState = .ended
statusText = VectorL10n.eventFormatterCallHasEnded(callDurationString)
updateStatusTextForEndedCall()
case .missed:
if call.isIncoming {
viewState = .missed
statusText = VectorL10n.eventFormatterCallYouMissed
statusText = isVideoCall ? VectorL10n.eventFormatterCallMissedVideo : VectorL10n.eventFormatterCallMissedVoice
} else {
statusText = VectorL10n.eventFormatterCallHasEnded(callDurationString)
updateStatusTextForEndedCall()
}
case .busy:
configureForRejectedCall(call: call)
@unknown default:
viewState = .ended
statusText = VectorL10n.eventFormatterCallHasEnded(callDurationString)
updateStatusTextForEndedCall()
}
case .inviteExpired,
.answeredElseWhere:
viewState = .ended
statusText = VectorL10n.eventFormatterCallHasEnded(callDurationString)
updateStatusTextForEndedCall()
@unknown default:
viewState = .ended
statusText = VectorL10n.eventFormatterCallHasEnded(callDurationString)
updateStatusTextForEndedCall()
}
}
@@ -247,21 +261,21 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
statusText = VectorL10n.eventFormatterCallYouDeclined
} else {
viewState = .ended
statusText = VectorL10n.eventFormatterCallHasEnded(callDurationString)
updateStatusTextForEndedCall()
}
}
private func configureForHangupCall(withEvent event: MXEvent) {
guard let hangupEventContent = MXCallHangupEventContent(fromJSON: event.content) else {
viewState = .ended
statusText = VectorL10n.eventFormatterCallHasEnded(callDurationString)
updateStatusTextForEndedCall()
return
}
switch hangupEventContent.reasonType {
case .userHangup:
viewState = .ended
statusText = VectorL10n.eventFormatterCallHasEnded(callDurationString)
updateStatusTextForEndedCall()
default:
viewState = .failed
statusText = VectorL10n.eventFormatterCallConnectionFailed
@@ -272,11 +286,19 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
if isIncoming {
// missed call
viewState = .missed
statusText = VectorL10n.eventFormatterCallYouMissed
statusText = isVideoCall ? VectorL10n.eventFormatterCallMissedVideo : VectorL10n.eventFormatterCallMissedVoice
} else {
// outgoing unanswered call
viewState = .ended
statusText = VectorL10n.eventFormatterCallHasEnded(callDurationString)
updateStatusTextForEndedCall()
}
}
private func updateStatusTextForEndedCall() {
if callDurationString.count > 0 {
statusText = VectorL10n.eventFormatterCallHasEndedWithTime(callDurationString)
} else {
statusText = VectorL10n.eventFormatterCallHasEnded
}
}
@@ -366,11 +388,7 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
callDurationString = readableCallDuration(from: events)
isIncoming = inviteEvent.sender != bubbleCellData.mxSession.myUserId
callInviteEvent = inviteEvent
innerContentView.callIconView.image = self.callTypeIcon
innerContentView.callTypeLabel.text = isVideoCall ?
VectorL10n.eventFormatterCallVideo :
VectorL10n.eventFormatterCallVoice
updateCallIcon()
let callId = callInviteEventContent.callId
guard let call = bubbleCellData.mxSession.callManager.call(withCallId: callId) else {
@@ -394,7 +412,7 @@ class RoomDirectCallStatusBubbleCell: RoomBaseCallBubbleCell {
// there is no reject or hangup event, we can just say this call has ended
viewState = .ended
statusText = VectorL10n.eventFormatterCallHasEnded(callDurationString)
updateStatusTextForEndedCall()
return
}
@@ -158,6 +158,14 @@ class RoomGroupCallStatusBubbleCell: RoomBaseCallBubbleCell {
}
}
private func updateStatusTextForEndedCall() {
if callDurationString.count > 0 {
statusText = VectorL10n.eventFormatterCallHasEndedWithTime(callDurationString)
} else {
statusText = VectorL10n.eventFormatterCallHasEnded
}
}
// MARK: - Actions
@objc
@@ -224,7 +232,6 @@ class RoomGroupCallStatusBubbleCell: RoomBaseCallBubbleCell {
self.widgetEvent = widgetEvent
self.widgetId = widgetId
innerContentView.callIconView.image = Asset.Images.callVideoIcon.image
innerContentView.callTypeLabel.text = VectorL10n.eventFormatterCallVideo
if isIncoming && !isJoined &&
TimeInterval(widgetEvent.age)/MSEC_PER_SEC < Constants.secondsToDisplayAnswerDeclineOptions {
@@ -266,7 +273,7 @@ class RoomGroupCallStatusBubbleCell: RoomBaseCallBubbleCell {
in: room,
with: roomState) else {
self.viewState = .ended
self.statusText = VectorL10n.eventFormatterCallHasEnded(self.callDurationString)
self.updateStatusTextForEndedCall()
return
}
@@ -278,14 +285,14 @@ class RoomGroupCallStatusBubbleCell: RoomBaseCallBubbleCell {
guard let widget = widgets.first(where: { $0.widgetId == widgetId }) else {
self.viewState = .ended
self.statusText = VectorL10n.eventFormatterCallHasEnded(self.callDurationString)
self.updateStatusTextForEndedCall()
return
}
if widget.isActive {
if !self.isIncoming {
self.viewState = .active
self.statusText = VectorL10n.eventFormatterCallYouCurrentlyIn
self.statusText = VectorL10n.eventFormatterCallActiveVideo
} else if !self.isJoined &&
TimeInterval(widgetEvent.age)/MSEC_PER_SEC < Constants.secondsToDisplayAnswerDeclineOptions {
@@ -298,11 +305,11 @@ class RoomGroupCallStatusBubbleCell: RoomBaseCallBubbleCell {
}
} else {
self.viewState = .active
self.statusText = VectorL10n.eventFormatterCallYouCurrentlyIn
self.statusText = VectorL10n.eventFormatterCallActiveVideo
}
} else {
self.viewState = .ended
self.statusText = VectorL10n.eventFormatterCallHasEnded(self.callDurationString)
self.updateStatusTextForEndedCall()
}
}
}
@@ -82,10 +82,6 @@ const CGFloat kComposerContainerTrailingPadding = 12;
- (void)setVoiceMessageToolbarView:(UIView *)voiceMessageToolbarView
{
if (RiotSettings.shared.enableVoiceMessages == NO) {
return;
}
_voiceMessageToolbarView = voiceMessageToolbarView;
self.voiceMessageToolbarView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:self.voiceMessageToolbarView];
@@ -407,10 +403,7 @@ const CGFloat kComposerContainerTrailingPadding = 12;
[UIView animateWithDuration:kActionMenuContentAlphaAnimationDuration delay:_actionMenuOpened ? 0 : .1 options:UIViewAnimationOptionCurveEaseIn animations:^{
self->messageComposerContainer.alpha = actionMenuOpened ? 0 : 1;
self.rightInputToolbarButton.alpha = self->growingTextView.text.length == 0 || actionMenuOpened ? 0 : 1;
if (RiotSettings.shared.enableVoiceMessages)
{
self.voiceMessageToolbarView.alpha = self->growingTextView.text.length > 0 || actionMenuOpened ? 0 : 1;
}
self.voiceMessageToolbarView.alpha = self->growingTextView.text.length > 0 || actionMenuOpened ? 0 : 1;
} completion:nil];
[UIView animateWithDuration:kActionMenuComposerHeightAnimationDuration animations:^{
@@ -442,16 +435,7 @@ const CGFloat kComposerContainerTrailingPadding = 12;
- (void)updateUIWithTextMessage:(NSString *)textMessage animated:(BOOL)animated
{
self.actionMenuOpened = NO;
if (RiotSettings.shared.enableVoiceMessages == NO) {
self.rightInputToolbarButton.alpha = textMessage.length ? 1.0f : 0.0f;
self.messageComposerContainerTrailingConstraint.constant = (textMessage.length ? self.frame.size.width - self.rightInputToolbarButton.frame.origin.x : 0.0f) + kComposerContainerTrailingPadding;
[self layoutIfNeeded];
return;
}
[UIView animateWithDuration:(animated ? 0.15f : 0.0f) animations:^{
self.rightInputToolbarButton.alpha = textMessage.length ? 1.0f : 0.0f;
self.voiceMessageToolbarView.alpha = textMessage.length ? 0.0f : 1.0;
@@ -24,12 +24,12 @@ enum VoiceMessageAudioConverterError: Error {
struct VoiceMessageAudioConverter {
static func convertToOpusOgg(sourceURL: URL, destinationURL: URL, completion: @escaping (Result<Void, VoiceMessageAudioConverterError>) -> Void) {
let command = "-hide_banner -y -i \"\(sourceURL.path)\" -c:a libopus \"\(destinationURL.path)\""
let command = "-hide_banner -y -i \"\(sourceURL.path)\" -c:a libopus -b:a 24k \"\(destinationURL.path)\""
executeCommand(command, completion: completion)
}
static func convertToMPEG4AAC(sourceURL: URL, destinationURL: URL, completion: @escaping (Result<Void, VoiceMessageAudioConverterError>) -> Void) {
let command = "-hide_banner -y -i \"\(sourceURL.path)\" -c:a aac_at -b:a 192k \"\(destinationURL.path)\""
let command = "-hide_banner -y -i \"\(sourceURL.path)\" -c:a aac_at \"\(destinationURL.path)\""
executeCommand(command, completion: completion)
}
@@ -45,6 +45,7 @@ class VoiceMessageAudioPlayer: NSObject {
private let delegateContainer = DelegateContainer()
private(set) var url: URL?
private(set) var displayName: String?
var isPlaying: Bool {
guard let audioPlayer = audioPlayer else {
@@ -68,12 +69,13 @@ class VoiceMessageAudioPlayer: NSObject {
removeObservers()
}
func loadContentFromURL(_ url: URL) {
func loadContentFromURL(_ url: URL, displayName: String? = nil) {
if self.url == url {
return
}
self.url = url
self.displayName = displayName
removeObservers()
@@ -51,7 +51,8 @@ class VoiceMessageAudioRecorder: NSObject, AVAudioRecorderDelegate {
func recordWithOutputURL(_ url: URL) {
let settings = [AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVSampleRateKey: 48000,
AVEncoderBitRateKey: 128000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue]
@@ -88,6 +88,8 @@ public class VoiceMessageController: NSObject, VoiceMessageToolbarViewDelegate,
NotificationCenter.default.addObserver(self, selector: #selector(updateTheme), name: .themeServiceDidChangeTheme, object: nil)
updateTheme()
NotificationCenter.default.addObserver(self, selector: #selector(applicationWillResignActive), name: UIApplication.willResignActiveNotification, object: nil)
updateUI()
}
@@ -312,6 +314,10 @@ public class VoiceMessageController: NSObject, VoiceMessageToolbarViewDelegate,
_voiceMessageToolbarView.update(theme: themeService.theme)
}
@objc private func applicationWillResignActive() {
finishRecording()
}
@objc private func handleDisplayLinkTick() {
updateUI()
}
@@ -15,20 +15,84 @@
//
import Foundation
import MediaPlayer
@objc public class VoiceMessageMediaServiceProvider: NSObject, VoiceMessageAudioPlayerDelegate, VoiceMessageAudioRecorderDelegate {
private enum Constants {
static let roomAvatarImageSize: CGSize = CGSize(width: 600, height: 600)
static let roomAvatarFontSize: CGFloat = 40.0
static let roomAvatarMimetype: String = "image/jpeg"
}
private var roomAvatarLoader: MXMediaLoader?
private let audioPlayers: NSMapTable<NSString, VoiceMessageAudioPlayer>
private let audioRecorders: NSHashTable<VoiceMessageAudioRecorder>
// Retain currently playing audio player so it doesn't stop playing on timeline cell reusage
private var displayLink: CADisplayLink!
// Retain currently playing audio player so it doesn't stop playing on timeline cell reuse
private var currentlyPlayingAudioPlayer: VoiceMessageAudioPlayer?
@objc public static let sharedProvider = VoiceMessageMediaServiceProvider()
private var roomAvatar: UIImage?
@objc public var currentRoomSummary: MXRoomSummary? {
didSet {
// set avatar placeholder for now
roomAvatar = AvatarGenerator.generateAvatar(forMatrixItem: currentRoomSummary?.roomId,
withDisplayName: currentRoomSummary?.displayname,
size: Constants.roomAvatarImageSize.width,
andFontSize: Constants.roomAvatarFontSize)
guard let avatarUrl = currentRoomSummary?.avatar else {
return
}
if let cachePath = MXMediaManager.thumbnailCachePath(forMatrixContentURI: avatarUrl,
andType: Constants.roomAvatarMimetype,
inFolder: currentRoomSummary?.roomId,
toFitViewSize: Constants.roomAvatarImageSize,
with: MXThumbnailingMethodCrop),
FileManager.default.fileExists(atPath: cachePath) {
// found in the cache, load it
roomAvatar = MXMediaManager.loadThroughCache(withFilePath: cachePath)
} else {
// cancel previous loader first
roomAvatarLoader?.cancel()
roomAvatarLoader = nil
guard let mediaManager = currentRoomSummary?.mxSession.mediaManager else {
return
}
// not found in the cache, download it
roomAvatarLoader = mediaManager.downloadThumbnail(fromMatrixContentURI: avatarUrl,
withType: Constants.roomAvatarMimetype,
inFolder: currentRoomSummary?.roomId,
toFitViewSize: Constants.roomAvatarImageSize,
with: MXThumbnailingMethodCrop,
success: { filePath in
if let filePath = filePath {
self.roomAvatar = MXMediaManager.loadThroughCache(withFilePath: filePath)
}
self.roomAvatarLoader = nil
}, failure: { error in
self.roomAvatarLoader = nil
})
}
}
}
private override init() {
audioPlayers = NSMapTable<NSString, VoiceMessageAudioPlayer>(valueOptions: .weakMemory)
audioRecorders = NSHashTable<VoiceMessageAudioRecorder>(options: .weakMemory)
super.init()
displayLink = CADisplayLink(target: WeakTarget(self, selector: #selector(handleDisplayLinkTick)), selector: WeakTarget.triggerSelector)
displayLink.isPaused = true
displayLink.add(to: .current, forMode: .common)
}
@objc func audioPlayerForIdentifier(_ identifier: String) -> VoiceMessageAudioPlayer {
@@ -57,12 +121,21 @@ import Foundation
func audioPlayerDidStartPlaying(_ audioPlayer: VoiceMessageAudioPlayer) {
currentlyPlayingAudioPlayer = audioPlayer
setUpRemoteCommandCenter()
stopAllServicesExcept(audioPlayer)
}
func audioPlayerDidStopPlaying(_ audioPlayer: VoiceMessageAudioPlayer) {
if currentlyPlayingAudioPlayer == audioPlayer {
currentlyPlayingAudioPlayer = nil
tearDownRemoteCommandCenter()
}
}
func audioPlayerDidFinishPlaying(_ audioPlayer: VoiceMessageAudioPlayer) {
if currentlyPlayingAudioPlayer == audioPlayer {
currentlyPlayingAudioPlayer = nil
tearDownRemoteCommandCenter()
}
}
@@ -96,4 +169,90 @@ import Foundation
audioPlayer.unloadContent()
}
}
@objc private func handleDisplayLinkTick() {
updateNowPlayingInfoCenter()
}
private func setUpRemoteCommandCenter() {
displayLink.isPaused = false
UIApplication.shared.beginReceivingRemoteControlEvents()
let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.playCommand.isEnabled = true
commandCenter.playCommand.removeTarget(nil)
commandCenter.playCommand.addTarget { [weak self] event in
guard let audioPlayer = self?.currentlyPlayingAudioPlayer else {
return MPRemoteCommandHandlerStatus.commandFailed
}
audioPlayer.play()
return MPRemoteCommandHandlerStatus.success
}
commandCenter.pauseCommand.isEnabled = true
commandCenter.pauseCommand.removeTarget(nil)
commandCenter.pauseCommand.addTarget { [weak self] event in
guard let audioPlayer = self?.currentlyPlayingAudioPlayer else {
return MPRemoteCommandHandlerStatus.commandFailed
}
audioPlayer.pause()
return MPRemoteCommandHandlerStatus.success
}
commandCenter.skipForwardCommand.isEnabled = true
commandCenter.skipForwardCommand.removeTarget(nil)
commandCenter.skipForwardCommand.addTarget { [weak self] event in
guard let audioPlayer = self?.currentlyPlayingAudioPlayer, let skipEvent = event as? MPSkipIntervalCommandEvent else {
return MPRemoteCommandHandlerStatus.commandFailed
}
audioPlayer.seekToTime(audioPlayer.currentTime + skipEvent.interval)
return MPRemoteCommandHandlerStatus.success
}
commandCenter.skipBackwardCommand.isEnabled = true
commandCenter.skipBackwardCommand.removeTarget(nil)
commandCenter.skipBackwardCommand.addTarget { [weak self] event in
guard let audioPlayer = self?.currentlyPlayingAudioPlayer, let skipEvent = event as? MPSkipIntervalCommandEvent else {
return MPRemoteCommandHandlerStatus.commandFailed
}
audioPlayer.seekToTime(audioPlayer.currentTime - skipEvent.interval)
return MPRemoteCommandHandlerStatus.success
}
}
private func tearDownRemoteCommandCenter() {
displayLink.isPaused = true
UIApplication.shared.endReceivingRemoteControlEvents()
let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()
nowPlayingInfoCenter.nowPlayingInfo = nil
}
private func updateNowPlayingInfoCenter() {
guard let audioPlayer = currentlyPlayingAudioPlayer else {
return
}
let artwork = MPMediaItemArtwork(boundsSize: Constants.roomAvatarImageSize) { [weak self] size in
return self?.roomAvatar ?? UIImage()
}
let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()
nowPlayingInfoCenter.nowPlayingInfo = [MPMediaItemPropertyTitle: audioPlayer.displayName ?? VectorL10n.voiceMessageLockScreenPlaceholder,
MPMediaItemPropertyArtist: currentRoomSummary?.displayname as Any,
MPMediaItemPropertyArtwork: artwork,
MPMediaItemPropertyPlaybackDuration: audioPlayer.duration as Any,
MPNowPlayingInfoPropertyElapsedPlaybackTime: audioPlayer.currentTime as Any]
}
}
@@ -56,8 +56,7 @@ class VoiceMessagePlaybackController: VoiceMessageAudioPlayerDelegate, VoiceMess
let playbackView: VoiceMessagePlaybackView
init(mediaServiceProvider: VoiceMessageMediaServiceProvider,
cacheManager: VoiceMessageAttachmentCacheManager) {
init(mediaServiceProvider: VoiceMessageMediaServiceProvider, cacheManager: VoiceMessageAttachmentCacheManager) {
self.mediaServiceProvider = mediaServiceProvider
self.cacheManager = cacheManager
@@ -93,7 +92,7 @@ class VoiceMessagePlaybackController: VoiceMessageAudioPlayerDelegate, VoiceMess
audioPlayer.play()
}
} else if let url = urlToLoad {
audioPlayer.loadContentFromURL(url)
audioPlayer.loadContentFromURL(url, displayName: attachment?.originalFileName)
audioPlayer.play()
}
}
@@ -153,6 +152,7 @@ class VoiceMessagePlaybackController: VoiceMessageAudioPlayerDelegate, VoiceMess
details.progress = (audioPlayer.duration > 0.0 ? audioPlayer.currentTime / audioPlayer.duration : 0.0)
}
}
details.loading = self.loading
playbackView.configureWithDetails(details)
+84 -27
View File
@@ -89,6 +89,7 @@ enum
enum
{
NOTIFICATION_SETTINGS_ENABLE_PUSH_INDEX = 0,
NOTIFICATION_SETTINGS_SYSTEM_SETTINGS,
NOTIFICATION_SETTINGS_SHOW_DECODED_CONTENT,
NOTIFICATION_SETTINGS_GLOBAL_SETTINGS_INDEX,
NOTIFICATION_SETTINGS_PIN_MISSED_NOTIFICATIONS_INDEX,
@@ -143,7 +144,6 @@ enum
enum
{
LABS_ENABLE_RINGING_FOR_GROUP_CALLS_INDEX = 0,
LABS_ENABLE_VOICE_MESSAGES = 1
};
enum
@@ -235,6 +235,11 @@ TableViewSectionsDelegate>
*/
@property (nonatomic) BOOL newPhoneEditingEnabled;
/**
The current `UNUserNotificationCenter` notification settings for the app.
*/
@property (nonatomic) UNNotificationSettings *systemNotificationSettings;
@property (nonatomic, weak) DeactivateAccountViewController *deactivateAccountViewController;
@property (nonatomic, strong) SignOutAlertPresenter *signOutAlertPresenter;
@property (nonatomic, weak) UIButton *signOutButton;
@@ -351,6 +356,7 @@ TableViewSectionsDelegate>
Section *sectionNotificationSettings = [Section sectionWithTag:SECTION_TAG_NOTIFICATIONS];
[sectionNotificationSettings addRowWithTag:NOTIFICATION_SETTINGS_ENABLE_PUSH_INDEX];
[sectionNotificationSettings addRowWithTag:NOTIFICATION_SETTINGS_SYSTEM_SETTINGS];
if (RiotSettings.shared.settingsScreenShowNotificationDecodedContentOption)
{
[sectionNotificationSettings addRowWithTag:NOTIFICATION_SETTINGS_SHOW_DECODED_CONTENT];
@@ -488,7 +494,6 @@ TableViewSectionsDelegate>
{
Section *sectionLabs = [Section sectionWithTag:SECTION_TAG_LABS];
[sectionLabs addRowWithTag:LABS_ENABLE_RINGING_FOR_GROUP_CALLS_INDEX];
[sectionLabs addRowWithTag:LABS_ENABLE_VOICE_MESSAGES];
sectionLabs.headerTitle = NSLocalizedStringFromTable(@"settings_labs", @"Vector", nil);
if (sectionLabs.hasAnyRows)
{
@@ -1231,6 +1236,24 @@ TableViewSectionsDelegate>
[self editNewPhoneNumberTextField];
keepNewPhoneNumberEditing = NO;
}
// Update notification access
[self refreshSystemNotificationSettings];
}
- (void)refreshSystemNotificationSettings
{
MXWeakify(self);
// Get the system notification settings to check authorization status and configuration.
[UNUserNotificationCenter.currentNotificationCenter getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
dispatch_async(dispatch_get_main_queue(), ^{
MXStrongifyAndReturnIfNil(self);
self.systemNotificationSettings = settings;
[self.tableView reloadData];
});
}];
}
- (void)formatNewPhoneNumber
@@ -1791,13 +1814,38 @@ TableViewSectionsDelegate>
MXKTableViewCellWithLabelAndSwitch* labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
labelAndSwitchCell.mxkLabel.text = NSLocalizedStringFromTable(@"settings_enable_push_notif", @"Vector", nil);
labelAndSwitchCell.mxkSwitch.on = account.pushNotificationServiceIsActive;
labelAndSwitchCell.mxkSwitch.onTintColor = ThemeService.shared.theme.tintColor;
labelAndSwitchCell.mxkSwitch.enabled = YES;
[labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(togglePushNotifications:) forControlEvents:UIControlEventTouchUpInside];
BOOL isPushEnabled = account.pushNotificationServiceIsActive;
// Even if push is enabled for the account, the user may have turned off notifications in system settings
if (isPushEnabled && self.systemNotificationSettings)
{
isPushEnabled = self.systemNotificationSettings.authorizationStatus == UNAuthorizationStatusAuthorized;
}
labelAndSwitchCell.mxkSwitch.on = isPushEnabled;
cell = labelAndSwitchCell;
}
else if (row == NOTIFICATION_SETTINGS_SYSTEM_SETTINGS)
{
cell = [tableView dequeueReusableCellWithIdentifier:kSettingsViewControllerPhoneBookCountryCellId];
if (!cell)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:kSettingsViewControllerPhoneBookCountryCellId];
}
cell.textLabel.textColor = ThemeService.shared.theme.textPrimaryColor;
cell.textLabel.text = NSLocalizedStringFromTable(@"settings_device_notifications", @"Vector", nil);
cell.detailTextLabel.text = @"";
[cell vc_setAccessoryDisclosureIndicatorWithCurrentTheme];
cell.selectionStyle = UITableViewCellSelectionStyleDefault;
}
else if (row == NOTIFICATION_SETTINGS_SHOW_DECODED_CONTENT)
{
MXKTableViewCellWithLabelAndSwitch* labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
@@ -2265,17 +2313,6 @@ TableViewSectionsDelegate>
[labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(toggleEnableRingingForGroupCalls:) forControlEvents:UIControlEventValueChanged];
cell = labelAndSwitchCell;
} else if (row == LABS_ENABLE_VOICE_MESSAGES)
{
MXKTableViewCellWithLabelAndSwitch *labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
labelAndSwitchCell.mxkLabel.text = NSLocalizedStringFromTable(@"settings_labs_voice_messages", @"Vector", nil);
labelAndSwitchCell.mxkSwitch.on = RiotSettings.shared.enableVoiceMessages;
labelAndSwitchCell.mxkSwitch.onTintColor = ThemeService.shared.theme.tintColor;
[labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(toggleEnableVoiceMessages:) forControlEvents:UIControlEventValueChanged];
cell = labelAndSwitchCell;
}
}
@@ -2501,6 +2538,10 @@ TableViewSectionsDelegate>
UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
[self showInviteFriendsFromSourceView:selectedCell];
}
else if (section == SECTION_TAG_NOTIFICATIONS && row == NOTIFICATION_SETTINGS_SYSTEM_SETTINGS)
{
[self openSystemSettingsApp];
}
else if (section == SECTION_TAG_DISCOVERY)
{
[self.settingsDiscoveryTableViewSection selectRow:row];
@@ -2804,20 +2845,20 @@ TableViewSectionsDelegate>
- (void)togglePushNotifications:(UISwitch *)sender
{
// Check first whether the user allow notification from device settings
UIUserNotificationType currentUserNotificationTypes = UIApplication.sharedApplication.currentUserNotificationSettings.types;
if (currentUserNotificationTypes == UIUserNotificationTypeNone)
// Check first whether the user allow notification from system settings
if (self.systemNotificationSettings.authorizationStatus == UNAuthorizationStatusDenied)
{
[currentAlert dismissViewControllerAnimated:NO completion:nil];
__weak typeof(self) weakSelf = self;
NSString *appDisplayName = [[NSBundle mainBundle] infoDictionary][@"CFBundleDisplayName"];
currentAlert = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:NSLocalizedStringFromTable(@"settings_on_denied_notification", @"Vector", nil), appDisplayName] message:nil preferredStyle:UIAlertControllerStyleAlert];
NSString *title = NSLocalizedStringFromTable(@"settings_notifications_disabled_alert_title", @"Vector", nil);
NSString *message = NSLocalizedStringFromTable(@"settings_notifications_disabled_alert_message", @"Vector", nil);
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"]
style:UIAlertActionStyleDefault
currentAlert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"]
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * action) {
if (weakSelf)
@@ -2828,6 +2869,21 @@ TableViewSectionsDelegate>
}]];
UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"settings"]
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
self->currentAlert = nil;
[self openSystemSettingsApp];
}
}];
[currentAlert addAction:settingsAction];
currentAlert.preferredAction = settingsAction;
[currentAlert mxk_setAccessibilityIdentifier: @"SettingsVCPushNotificationsAlert"];
[self presentViewController:currentAlert animated:YES completion:nil];
@@ -2871,6 +2927,12 @@ TableViewSectionsDelegate>
}
}
- (void)openSystemSettingsApp
{
NSURL *settingsAppURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:settingsAppURL options:@{} completionHandler:nil];
}
- (void)toggleCallKit:(UISwitch *)sender
{
[MXKAppSettings standardAppSettings].enableCallKit = sender.isOn;
@@ -2959,11 +3021,6 @@ TableViewSectionsDelegate>
RiotSettings.shared.enableRingingForGroupCalls = sender.isOn;
}
- (void)toggleEnableVoiceMessages:(UISwitch *)sender
{
RiotSettings.shared.enableVoiceMessages = sender.isOn;
}
- (void)togglePinRoomsWithMissedNotif:(UISwitch *)sender
{
RiotSettings.shared.pinRoomsWithMissedNotificationsOnHome = sender.isOn;
+70
View File
@@ -34,6 +34,9 @@ NSString *const EventFormatterOnReRequestKeysLinkAction = @"EventFormatterOnReRe
NSString *const EventFormatterLinkActionSeparator = @"/";
NSString *const EventFormatterEditedEventLinkAction = @"EventFormatterEditedEventLinkAction";
NSString *const FunctionalMembersStateEventType = @"io.element.functional_members";
NSString *const FunctionalMembersServiceMembersKey = @"service_members";
static NSString *const kEventFormatterTimeFormat = @"HH:mm";
@interface EventFormatter ()
@@ -408,6 +411,73 @@ static NSString *const kEventFormatterTimeFormat = @"HH:mm";
return senderAvatarUrl;
}
#pragma mark - MXRoomSummaryUpdating
- (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary withStateEvents:(NSArray<MXEvent *> *)stateEvents roomState:(MXRoomState *)roomState
{
BOOL updated = [super session:session updateRoomSummary:summary withStateEvents:stateEvents roomState:roomState];
// Customisation for EMS Functional Members in direct rooms
if (BuildSettings.supportFunctionalMembers && summary.room.isDirect)
{
if ([self functionalMembersEventFromStateEvents:stateEvents])
{
MXLogDebug(@"[EventFormatter] The functional members event has been updated.")
// The stateEvents parameter contains state events that may change the room summary. If service members are found,
// it's likely that something changed. As they aren't stored, the only reliable check would be to compute the
// room name which we'll do twice more in updateRoomSummary:withServerRoomSummary:roomState: anyway.
//
// So return YES and let that happen there.
return YES;
}
}
return updated;
}
- (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary withServerRoomSummary:(MXRoomSyncSummary *)serverRoomSummary roomState:(MXRoomState *)roomState
{
BOOL updated = [super session:session updateRoomSummary:summary withServerRoomSummary:serverRoomSummary roomState:roomState];
// Customisation for EMS Functional Members in direct rooms
if (BuildSettings.supportFunctionalMembers && summary.room.isDirect)
{
MXEvent *functionalMembersEvent = [self functionalMembersEventFromStateEvents:roomState.stateEvents];
if (functionalMembersEvent)
{
MXLogDebug(@"[EventFormatter] Computing the room name and avatar excluding functional members.")
NSArray<NSString*> *serviceMemberIDs = functionalMembersEvent.content[FunctionalMembersServiceMembersKey] ?: @[];
updated |= [defaultRoomSummaryUpdater updateSummaryDisplayname:summary
session:session
withServerRoomSummary:serverRoomSummary
roomState:roomState
excludingUserIDs:serviceMemberIDs];
updated |= [defaultRoomSummaryUpdater updateSummaryAvatar:summary
session:session
withServerRoomSummary:serverRoomSummary
roomState:roomState
excludingUserIDs:serviceMemberIDs];
}
}
return updated;
}
/**
Gets the latest state event of type `io.element.functional_members` from the supplied array of state events.
Note: This function will be expensive on big rooms, recommended for use only on DMs.
@return An event of type `io.element.functional_members`, or nil if the event wasn't found.
*/
- (MXEvent *)functionalMembersEventFromStateEvents:(NSArray<MXEvent *> *)stateEvents
{
NSPredicate *functionalMembersPredicate = [NSPredicate predicateWithFormat:@"type == %@", FunctionalMembersStateEventType];
return [stateEvents filteredArrayUsingPredicate:functionalMembersPredicate].lastObject;
}
#pragma mark - Timestamp formatting
- (NSString*)dateStringFromDate:(NSDate *)date withTime:(BOOL)time
+1
View File
@@ -0,0 +1 @@
!.gitignore
+1
View File
@@ -0,0 +1 @@
Settings: The notifications toggle no longer detects the system's "Deliver Quietly" configuration as disabled.
+1
View File
@@ -0,0 +1 @@
SSO: Stable ids for MSC 2858.
+1
View File
@@ -0,0 +1 @@
CHANGES.md: Use towncrier to manage the change log. More info in [CONTRIBUTING](CONTRIBUTING.md#changelog).
+1
View File
@@ -0,0 +1 @@
Convert CHANGES to MarkDown.
+1
View File
@@ -0,0 +1 @@
fix typo in email settings
+1
View File
@@ -0,0 +1 @@
Room: Remove the green border from direct message room avatars.
+1
View File
@@ -0,0 +1 @@
Settings: Adds a link to open the Settings app to quickly configure app notifications.
+1
View File
@@ -0,0 +1 @@
Add a script to initialize quickly and easily the project.
+1
View File
@@ -0,0 +1 @@
Add support for Functional Members.
+1
View File
@@ -0,0 +1 @@
VoIP: Additional changes on call tiles.
+1
View File
@@ -0,0 +1 @@
Voice messages: Allow voice message playback control from the iOS lock screen and control center.
+1
View File
@@ -0,0 +1 @@
Voice messages: Stop recording and go into locked mode when the application becomes inactive.
+1
View File
@@ -0,0 +1 @@
Voice messages: Improve audio recording quality.
+1
View File
@@ -0,0 +1 @@
Voice messages: Remove labs setting and enable them by default.
+1
View File
@@ -0,0 +1 @@
Add reference to AppIdentifiers.xcconfig in INSTALL.md.

Some files were not shown because too many files have changed in this diff Show More