mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-22 01:22:46 +02:00
Merge branch 'ismail/5068_start_thread' into ismail/5096_thread_notifications
This commit is contained in:
@@ -492,8 +492,15 @@
|
||||
"call_consulting_with_user" = "Bei %@ anfragen";
|
||||
"microphone_access_not_granted_for_voice_message" = "%@ fehlt die Berechtigung, für Sprachnachrichten auf das Mikrofon zuzugreifen";
|
||||
"message_reply_to_sender_sent_a_voice_message" = "hat eine Sprachnachricht gesendet.";
|
||||
"attachment_size_prompt_title" = "Größe zum Senden";
|
||||
"attachment_size_prompt_title" = "Zum Senden die Größe auswählen";
|
||||
"attachment_large_with_resolution" = "Groß %@ (~%@)";
|
||||
"attachment_medium_with_resolution" = "Mittel %@ (~%@)";
|
||||
"attachment_small_with_resolution" = "Klein %@ (~%@)";
|
||||
"attachment_size_prompt_message" = "Du kannst dies in den Einstellungen ausschalten.";
|
||||
"attachment_size_prompt_message" = "Dies kannst du in den Einstellungen abschalten.";
|
||||
"auth_reset_password_error_not_found" = "Nicht gefunden";
|
||||
"auth_username_in_use" = "Benutzername bereits verwendet";
|
||||
"auth_invalid_user_name" = "Ungültiger Benutzername";
|
||||
"rename" = "Umbenennen";
|
||||
"attachment_unsupported_preview_message" = "Dieser Dateityp wird nicht unterstützt.";
|
||||
"attachment_unsupported_preview_title" = "Vorschau kann nicht angezeigt werden";
|
||||
"auth_reset_password_error_unauthorized" = "Nicht Authorisiert";
|
||||
|
||||
@@ -258,6 +258,7 @@
|
||||
"message_reply_to_sender_sent_an_audio_file" = "sent an audio file.";
|
||||
"message_reply_to_sender_sent_a_voice_message" = "sent a voice message.";
|
||||
"message_reply_to_sender_sent_a_file" = "sent a file.";
|
||||
"message_reply_to_sender_sent_their_location" = "has shared their location.";
|
||||
"message_reply_to_message_to_reply_to_prefix" = "In reply to";
|
||||
|
||||
// Room members
|
||||
|
||||
@@ -470,6 +470,11 @@
|
||||
"attachment_small_with_resolution" = "Petit %@ (~%@)";
|
||||
"attachment_size_prompt_message" = "Vous pouvez désactiver ceci dans les paramètres.";
|
||||
"attachment_size_prompt_title" = "Préciser la taille pour l’envoi";
|
||||
"auth_username_in_use" = "";
|
||||
"auth_username_in_use" = "Nom d’utilisateur déjà pris";
|
||||
"auth_invalid_user_name" = "Nom d’utilisateur invalide";
|
||||
"rename" = "Renommer";
|
||||
"auth_reset_password_error_not_found" = "Non trouvé";
|
||||
"auth_reset_password_error_unauthorized" = "Non autorisé";
|
||||
"attachment_unsupported_preview_message" = "Ce type de fichier n’est pas pris en charge.";
|
||||
"attachment_unsupported_preview_title" = "Prévisualisation impossible";
|
||||
"room_displayname_all_other_members_left" = "%@ (Quitté)";
|
||||
|
||||
@@ -345,7 +345,7 @@
|
||||
// Country picker
|
||||
"country_picker_title" = "Pilih sebuah negara";
|
||||
"microphone_access_not_granted_for_voice_message" = "Pesan suara membutuhkan akses ke Mikrofon tetapi %@ tidak memiliki izin untuk menggunakannya";
|
||||
"local_contacts_access_discovery_warning" = "Untuk menemukan kontak Anda yang sudah menggunakan Matrix, %@ dapat mengirim alamat email dan nomor telepon di kontak Anda ke server identitas Matrix yang Anda pilih. Di mana saja yang didukung, data personal akan di-hash sebelum dikirim - mohon cek kebijakan privasi identitas server Anda untuk detail lainnya.";
|
||||
"local_contacts_access_discovery_warning" = "Untuk menemukan kontak Anda yang sudah menggunakan Matrix, %@ dapat mengirim alamat email dan nomor telepon di kontak Anda ke server identitas Matrix yang Anda pilih. Di mana saja yang didukung, data personal akan di-hash sebelum dikirim — mohon cek kebijakan privasi identitas server Anda untuk detail lainnya.";
|
||||
"local_contacts_access_discovery_warning_title" = "Penemuan pengguna";
|
||||
"local_contacts_access_not_granted" = "Penemuan pengguna dari kontak lokal membutuhkan akses ke kontak Anda tetapi %@ tidak memiliki izin untuk menggunakannya";
|
||||
"microphone_access_not_granted_for_call" = "Panggilan membutuhkan akses ke Mikrofon tetapi %@ tidak memiliki izin untuk menggunakannya";
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -1 +1,545 @@
|
||||
|
||||
|
||||
"login_error_login_email_not_yet" = "Zatiaľ ste neklikli na odkaz zaslaný emailom";
|
||||
"login_error_user_in_use" = "Toto používateľské meno sa už používa";
|
||||
"login_error_limit_exceeded" = "Bol prekročený maximálny počet požiadaviek";
|
||||
"room_left_for_dm" = "Odišli ste";
|
||||
|
||||
// Room creation
|
||||
"room_creation_name_title" = "Názov miestnosti:";
|
||||
"account_msisdn_validation_title" = "Čaká sa na overenie";
|
||||
"account_email_validation_title" = "Čaká sa na overenie";
|
||||
|
||||
// Account
|
||||
"account_save_changes" = "Uložiť zmeny";
|
||||
"room_event_encryption_verify_title" = "Overiť reláciu\n\n";
|
||||
"room_event_encryption_info_device_not_verified" = "Neoverené";
|
||||
"room_event_encryption_info_device_fingerprint" = "Ed25519 odtlačok prsta\n";
|
||||
"room_event_encryption_info_device_name" = "Verejný názov\n";
|
||||
"room_event_encryption_info_device_unknown" = "neznáma relácia\n";
|
||||
"room_event_encryption_info_event_decryption_error" = "Chyba dešifrovania\n";
|
||||
"room_event_encryption_info_event_session_id" = "ID relácie\n";
|
||||
"room_event_encryption_info_event_user_id" = "ID používateľa:\n";
|
||||
"room_event_encryption_info_event" = "Informácie o udalosti\n";
|
||||
"device_details_rename_prompt_title" = "Názov relácie";
|
||||
"device_details_last_seen" = "Naposledy videné\n";
|
||||
"device_details_name" = "Verejný názov\n";
|
||||
|
||||
// Devices
|
||||
"device_details_title" = "Informácie o relácii\n";
|
||||
"room_displayname_all_other_members_left" = "%@ (Odišiel)";
|
||||
|
||||
// room display name
|
||||
"room_displayname_empty_room" = "Prázdna miestnosť";
|
||||
"notice_invalid_attachment" = "neplatná príloha";
|
||||
"notice_file_attachment" = "súborová attachment";
|
||||
"notice_video_attachment" = "video príloha";
|
||||
"notice_audio_attachment" = "zvuková príloha";
|
||||
"notice_image_attachment" = "obrázková príloha";
|
||||
"notice_encrypted_message" = "Šifrovaná správa";
|
||||
"notice_room_created_for_dm" = "%@ sa pripojil/a.";
|
||||
"end_call" = "Ukončiť hovor";
|
||||
"reject_call" = "Odmietnuť hovor";
|
||||
"show_details" = "Zobraziť podrobnosti";
|
||||
"cancel_download" = "Zrušiť sťahovanie";
|
||||
"cancel_upload" = "Zrušiť nahrávanie";
|
||||
"select_all" = "Vybrať všetko";
|
||||
"start_chat" = "Začať konverzáciu";
|
||||
"sign_up" = "Zaregistrovať sa";
|
||||
"login_error_resource_limit_exceeded_contact_button" = "Kontaktovať správcu";
|
||||
"register_error_title" = "Registrácia zlyhala";
|
||||
"login_invalid_param" = "Neplatný parameter";
|
||||
"login_error_bad_json" = "Chybné údaje vo formáte JSON";
|
||||
"login_error_forbidden" = "Neplatné používateľské meno/heslo";
|
||||
|
||||
// Room Screen
|
||||
|
||||
// general errors
|
||||
|
||||
// Home Screen
|
||||
|
||||
// Last seen time
|
||||
|
||||
// call events
|
||||
|
||||
/* -*-
|
||||
Automatic localization for en
|
||||
|
||||
The following key/value pairs were extracted from the android i18n file:
|
||||
/console/src/main/res/values/strings.xml.
|
||||
*/
|
||||
|
||||
|
||||
// titles
|
||||
|
||||
// button names
|
||||
"ok" = "OK";
|
||||
"login_error_title" = "Prihlásenie zlyhalo";
|
||||
"login_prompt_email_token" = "Zadajte svoj e-mailový overovací token:";
|
||||
"login_email_info" = "Zadanie e-mailovej adresy umožní ostatným používateľom ľahšie vás nájsť v službe Matrix a umožní vám v budúcnosti obnoviť heslo.";
|
||||
"login_display_name_placeholder" = "Zobrazované meno (napr. Fero Novák)";
|
||||
"login_user_id_placeholder" = "Matrix ID (napr. @fero:matrix.org alebo fero)";
|
||||
"login_identity_server_info" = "Matrix poskytuje servery totožnosti na sledovanie, ktoré e-maily atď. patria k jednotlivým Matrix ID. V súčasnosti existuje iba stránka https://matrix.org.";
|
||||
"login_home_server_info" = "Váš domovský server ukladá všetky vaše konverzácie a údaje o účte";
|
||||
"ssl_fingerprint_hash" = "Odtlačok (%s):";
|
||||
"call_more_actions_dialpad" = "Číselník";
|
||||
"call_ended" = "Hovor ukončený";
|
||||
|
||||
// gcm section
|
||||
"settings_config_home_server" = "Domovský server: %@";
|
||||
"notification_settings_custom_sound" = "Vlastný zvuk";
|
||||
"notification_settings_always_notify" = "Vždy oznamovať";
|
||||
"notification_settings_never_notify" = "Nikdy neoznamovať";
|
||||
|
||||
// members list Screen
|
||||
|
||||
// accounts list Screen
|
||||
|
||||
// image size selection
|
||||
|
||||
// invitation members list Screen
|
||||
|
||||
// room creation dialog Screen
|
||||
|
||||
// room info dialog Screen
|
||||
|
||||
// room details dialog screen
|
||||
"room_details_title" = "Podrobnosti o miestnosti";
|
||||
"num_members_other" = "%@ používatelia";
|
||||
"num_members_one" = "%@ používateľ";
|
||||
"create_account" = "Vytvoriť účet";
|
||||
"create_room" = "Vytvoriť miestnosť";
|
||||
"notice_room_leave_by_you" = "Odišli ste";
|
||||
"notice_room_join_by_you" = "Vstúpili ste";
|
||||
"notice_room_leave" = "%@ odišiel/a";
|
||||
"notice_room_join" = "%@ sa pripojil/a";
|
||||
"language_picker_default_language" = "Predvolené (%@)";
|
||||
"user_id_placeholder" = "napr.: @fero:domovskyserver";
|
||||
"power_level" = "Úroveň právomoci";
|
||||
|
||||
// Others
|
||||
"user_id_title" = "ID používateľa:";
|
||||
"e2e_passphrase_create" = "Vytvoriť heslo";
|
||||
"e2e_passphrase_confirm" = "Potvrďte heslo";
|
||||
"e2e_passphrase_enter" = "Zadajte heslo";
|
||||
|
||||
// Search
|
||||
"search_no_results" = "Žiadne výsledky";
|
||||
"contact_local_contacts" = "Lokálne kontakty";
|
||||
|
||||
// Contacts
|
||||
"contact_mx_users" = "Používatelia Matrix";
|
||||
"attachment_multiselection_original" = "Aktuálna veľkosť";
|
||||
"login_optional_field" = "voliteľné";
|
||||
"ssl_remain_offline" = "Ignorovať";
|
||||
"ssl_logout_account" = "Odhlásiť sa";
|
||||
"call_ringing" = "Vyzváňanie…";
|
||||
|
||||
// Settings keys
|
||||
|
||||
// call string
|
||||
"call_connecting" = "Pripájanie…";
|
||||
"notification_settings_sender_hint" = "@pouzivatel:domena.sk";
|
||||
|
||||
// Settings screen
|
||||
"settings_title_config" = "Nastavenie";
|
||||
"unban" = "Zrušiť zákaz";
|
||||
"ban" = "Zakázať";
|
||||
"kick" = "Vylúčiť";
|
||||
"invite" = "Pozvať";
|
||||
"membership_ban" = "Vylúčený";
|
||||
"membership_invite" = "Pozvaní";
|
||||
"login" = "Prihlásiť sa";
|
||||
|
||||
// actions
|
||||
"action_logout" = "Odhlásiť sa";
|
||||
"rename" = "Premenovať";
|
||||
"view" = "Zobraziť";
|
||||
"delete" = "Vymazať";
|
||||
"share" = "Zdieľať";
|
||||
"redact" = "Odstrániť";
|
||||
"resend" = "Odoslať znovu";
|
||||
"copy_button_name" = "Kopírovať";
|
||||
"send" = "Odoslať";
|
||||
"leave" = "Opustiť";
|
||||
"save" = "Uložiť";
|
||||
"cancel" = "Zrušiť";
|
||||
"private" = "Súkromné";
|
||||
"public" = "Verejné";
|
||||
"default" = "predvolené";
|
||||
"error" = "Chyba";
|
||||
"unsent" = "Neodoslané";
|
||||
"offline" = "nedostupný";
|
||||
"e2e_export" = "Exportovať";
|
||||
"e2e_import" = "Importovať";
|
||||
"format_time_d" = "d";
|
||||
"format_time_h" = "h";
|
||||
"format_time_m" = "m";
|
||||
|
||||
// Time
|
||||
"format_time_s" = "s";
|
||||
"group_section" = "Skupiny";
|
||||
|
||||
// Groups
|
||||
"group_invite_section" = "Pozvánky";
|
||||
"attachment_e2e_keys_import" = "Importovať...";
|
||||
"room_creation_participants_title" = "Účastníci:";
|
||||
"room_event_encryption_verify_ok" = "Overiť";
|
||||
"room_event_encryption_info_unverify" = "Zrušiť overenie";
|
||||
"room_event_encryption_info_verify" = "Overiť...";
|
||||
"room_event_encryption_info_device_blocked" = "Na čiernej listine";
|
||||
"room_event_encryption_info_device_verified" = "Overené";
|
||||
"room_event_encryption_info_device_verification" = "Overenie\n";
|
||||
"room_event_encryption_info_device_id" = "ID\n";
|
||||
"room_event_encryption_info_event_none" = "žiadne";
|
||||
"room_event_encryption_info_event_unencrypted" = "nezašifrované";
|
||||
"room_event_encryption_info_event_algorithm" = "Algoritmus\n";
|
||||
"device_details_delete_prompt_title" = "Overenie";
|
||||
"device_details_identifier" = "ID\n";
|
||||
|
||||
// Settings
|
||||
"settings" = "Nastavenia";
|
||||
"notice_sticker" = "nálepka";
|
||||
"unignore" = "Prestať ignorovať";
|
||||
"ignore" = "Ignorovať";
|
||||
"mention" = "Zmieniť sa";
|
||||
"submit" = "Odoslať";
|
||||
"retry" = "Skúsiť znovu";
|
||||
"continue" = "Pokračovať";
|
||||
"close" = "Zavrieť";
|
||||
"back" = "Späť";
|
||||
"abort" = "Prerušiť";
|
||||
"yes" = "Áno";
|
||||
|
||||
// Action
|
||||
"no" = "Nie";
|
||||
"login_desktop_device" = "Desktop";
|
||||
"login_tablet_device" = "Tablet";
|
||||
"login_mobile_device" = "Mobil";
|
||||
"login_leave_fallback" = "Zrušiť";
|
||||
"login_home_server_title" = "URL domovského servera:";
|
||||
"login_email_placeholder" = "Emailová adresa";
|
||||
"login_password_placeholder" = "Heslo";
|
||||
"login_identity_server_title" = "URL adresa servera totožností:";
|
||||
"login_server_url_placeholder" = "URL (napr. https://matrix.org)";
|
||||
|
||||
// Login Screen
|
||||
"login_create_account" = "Vytvoriť účet:";
|
||||
/* *********************** */
|
||||
/* iOS specific */
|
||||
/* *********************** */
|
||||
|
||||
"matrix" = "Matrix";
|
||||
"notification_settings_select_room" = "Vybrať miestnosť";
|
||||
"notification_settings_enable_notifications_warning" = "Všetky oznámenia sú v súčasnosti vypnuté pre všetky zariadenia.";
|
||||
"notification_settings_enable_notifications" = "Povoliť oznámenia";
|
||||
|
||||
// Notification settings screen
|
||||
"notification_settings_disable_all" = "Zakázať všetky oznámenia";
|
||||
"settings_title_notifications" = "Oznámenia";
|
||||
"notification_settings_room_rule_title" = "Miestnosť: '%@'";
|
||||
"auth_username_in_use" = "Používateľské meno sa už používa";
|
||||
"login_error_must_start_http" = "URL adresa musí začínať http[s]://";
|
||||
"auth_reset_password_error_not_found" = "Nenájdené";
|
||||
"notice_unsupported_attachment" = "Nepodporovaná príloha: %@";
|
||||
"notice_encryption_enabled_unknown_algorithm" = "%1$@ zapol end-to-end šifrovanie (nerozpoznaný algoritmus %2$@).";
|
||||
"notice_encryption_enabled_ok" = "%@ zapol end-to-end šifrovanie.";
|
||||
"notice_room_related_groups" = "Skupiny pridružené k tejto miestnosti sú: %@";
|
||||
"notice_room_aliases_for_dm" = "Aliasy sú: %@";
|
||||
"notice_room_aliases" = "Aliasy miestnosti sú: %@";
|
||||
"notice_room_power_level_acting_requirement" = "Minimálne úrovne oprávnenia, ktoré musí mať používateľ pred konaním, sú:";
|
||||
"notice_room_power_level_intro" = "Úrovne oprávnenia členov miestnosti sú:";
|
||||
"notice_room_power_level_intro_for_dm" = "Úrovne oprávnenia členov sú:";
|
||||
"notice_room_join_rule_public_by_you_for_dm" = "Zverejnili ste ju.";
|
||||
"notice_room_join_rule_public_by_you" = "Túto miestnosť ste zverejnili.";
|
||||
"notification_settings_global_info" = "Nastavenia oznámení sa ukladajú do vášho používateľského účtu a sú zdieľané medzi všetkými klientmi, ktorí ich podporujú (vrátane oznámení na ploche).\n\nPravidlá sa uplatňujú v poradí; prvé pravidlo, ktoré sa zhoduje, určuje výsledok správy.\nTakže: Oznámenia o správe sú dôležitejšie ako oznámenia na miestnosť, ktoré sú dôležitejšie ako oznámenia na odosielateľa.\nPri viacerých pravidlách rovnakého druhu má prednosť to, ktoré sa zhoduje ako prvé v zozname.";
|
||||
|
||||
// contacts list screen
|
||||
"invitation_message" = "Rád by som sa s vami porozprával pomocou Matrixu. Viac informácií nájdete na webovej stránke http://matrix.org.";
|
||||
"notice_room_history_visible_to_members_from_joined_point_by_you" = "Zviditeľnili ste budúcu históriu miestnosti pre všetkých členov miestnosti, od okamihu ich vstupu.";
|
||||
"notice_room_history_visible_to_members_from_invited_point_by_you_for_dm" = "Zviditeľnili ste budúce správy pre všetkých, od okamihu pozvania.";
|
||||
"notice_room_history_visible_to_members_from_invited_point_by_you" = "Zviditeľnili ste budúcu históriu miestnosti pre všetkých členov miestnosti, od okamihu pozvania.";
|
||||
"notice_room_history_visible_to_members_by_you_for_dm" = "Zviditeľnili ste budúce správy pre všetkých členov miestnosti.";
|
||||
"notice_room_history_visible_to_members_by_you" = "Zviditeľnili ste budúcu históriu miestnosti pre všetkých jej členov.";
|
||||
"notice_room_history_visible_to_anyone_by_you" = "Sprístupnili ste budúcu históriu miestnosti každému.";
|
||||
"notice_encryption_enabled_unknown_algorithm_by_you" = "Zapli ste end-to-end šifrovanie (nerozpoznaný algoritmus %@).";
|
||||
"notice_encryption_enabled_ok_by_you" = "Zapli ste end-to-end šifrovanie.";
|
||||
"notice_room_created_by_you_for_dm" = "Vstúpili ste.";
|
||||
"notice_room_created_by_you" = "Vytvorili ste a nastavili ste miestnosť.";
|
||||
"notice_profile_change_redacted_by_you" = "Aktualizovali ste svoj profil %@";
|
||||
"notice_room_topic_removed_by_you" = "Odstránili ste tému";
|
||||
"notice_room_name_removed_by_you_for_dm" = "Odstránili ste názov";
|
||||
"notice_room_name_removed_by_you" = "Odstránili ste názov miestnosti";
|
||||
"notice_conference_call_request_by_you" = "Požiadali ste o VoIP konferenciu";
|
||||
"notice_declined_video_call_by_you" = "Odmietli ste hovor";
|
||||
"notice_ended_video_call_by_you" = "Ukončili ste hovor";
|
||||
"notice_room_name_changed_by_you_for_dm" = "Zmenili ste svoje meno na %@.";
|
||||
"notice_room_name_changed_by_you" = "Zmenili ste názov miestnosti na %@.";
|
||||
"notice_topic_changed_by_you" = "Zmenili ste tému na \"%@\".";
|
||||
"notice_display_name_removed_by_you" = "Odstránili ste svoje zobrazované meno";
|
||||
"notice_display_name_changed_from_by_you" = "Zmenili ste si zobrazované meno z %@ na %@";
|
||||
"notice_display_name_set_by_you" = "Nastavili ste si zobrazované meno na %@";
|
||||
"notice_avatar_url_changed_by_you" = "Zmenili ste si obrázok v profile";
|
||||
"notice_room_withdraw_by_you" = "Odvolali ste pozvánku pre %@";
|
||||
"notice_room_ban_by_you" = "Zakázali ste používateľa %@";
|
||||
"notice_room_unban_by_you" = "Zrušili ste zákaz pre %@";
|
||||
"notice_room_kick_by_you" = "Vylúčili ste používateľa %@";
|
||||
"notice_room_reject_by_you" = "Odmietli ste pozvanie";
|
||||
"notice_room_third_party_revoked_invite_by_you_for_dm" = "Odvolali ste pozvánku pre %@";
|
||||
"notice_room_third_party_revoked_invite_by_you" = "Odvolali ste pozvánku pre %@ do miestnosti";
|
||||
"notice_room_third_party_registered_invite_by_you" = "Prijali ste pozvanie do %@";
|
||||
"notice_room_third_party_invite_by_you_for_dm" = "Pozvali ste používateľa %@";
|
||||
"notice_room_third_party_invite_by_you" = "Odoslali ste pozvánku používateľovi %@ do miestnosti";
|
||||
"notice_room_invite_you" = "%@ vás pozval";
|
||||
|
||||
// Notice Events with "You"
|
||||
"notice_room_invite_by_you" = "Pozvali ste %@";
|
||||
"notice_conference_call_finished" = "Skončila sa VoIP konferencia";
|
||||
"notice_conference_call_started" = "Začala sa VoIP konferencia";
|
||||
"notice_conference_call_request" = "%@ požiadal/a o VoIP konferenciu";
|
||||
"notice_declined_video_call" = "%@ odmietol hovor";
|
||||
"notice_ended_video_call" = "%s ukončil/a hovor";
|
||||
"notice_room_name_changed_for_dm" = "%@ zmenil/a svoje meno na %@.";
|
||||
"notice_room_name_changed" = "%@ zmenil názov miestnosti na %@.";
|
||||
"notice_topic_changed" = "%@ zmenil tému na \"%@\".";
|
||||
"notice_display_name_removed" = "%@ odstránil svoje zobrazované meno";
|
||||
"notice_display_name_changed_from" = "%@ zmenil/a svoje zobrazované meno z %@ na %@";
|
||||
"notice_display_name_set" = "%@ nastavil/a svoje zobrazované meno na %@";
|
||||
"notice_avatar_url_changed" = "%@ zmenil/a svoj obrázok";
|
||||
"notice_room_reason" = ". Dôvod: %@";
|
||||
"notice_room_withdraw" = "%@ odvolal pozvanie od %@";
|
||||
"notice_room_ban" = "%@ zakázal používateľa %@";
|
||||
"notice_room_unban" = "%@ zrušil zákaz pre %@";
|
||||
"notice_room_reject" = "%@ odmietol pozvanie";
|
||||
"notice_room_third_party_revoked_invite_for_dm" = "%@ odvolal pozvánku pre %@";
|
||||
"notice_room_third_party_revoked_invite" = "%@ odvolal pozvánku pre %@, aby sa pripojil k miestnosti";
|
||||
"notice_room_third_party_registered_invite" = "%@ prijal pozvanie do %@";
|
||||
"notice_room_third_party_invite_for_dm" = "%@ pozval %@";
|
||||
"notice_room_third_party_invite" = "%@ poslal pozvánku %@ do miestnosti";
|
||||
|
||||
/* -*-
|
||||
Automatic localization for en
|
||||
|
||||
The following key/value pairs were extracted from the android i18n file:
|
||||
/matrix-sdk/src/main/res/values/strings.xml.
|
||||
*/
|
||||
|
||||
"notice_room_invite" = "%@ pozval %@";
|
||||
|
||||
// Language picker
|
||||
"language_picker_title" = "Vyberte jazyk";
|
||||
|
||||
// Country picker
|
||||
"country_picker_title" = "Vyberte krajnu";
|
||||
"microphone_access_not_granted_for_voice_message" = "Hlasové správy vyžadujú prístup k mikrofónu, ale %@ nemá povolenie na jeho používanie";
|
||||
"local_contacts_access_discovery_warning" = "Ak chcete vyhľadať kontakty, ktoré už používajú Matrix, %@ môže odoslať e-mailové adresy a telefónne čísla z vášho adresára na zvolený server identity Matrix. Ak je to podporované, osobné údaje sa pred odoslaním zahašujú - ďalšie podrobnosti nájdete v zásadách ochrany osobných údajov vášho servera totožností.";
|
||||
"local_contacts_access_discovery_warning_title" = "Vyhľadávanie používateľov";
|
||||
"local_contacts_access_not_granted" = "Zisťovanie používateľov z lokálnych kontaktov vyžaduje prístup k vašim kontaktom, ale %@ nemá oprávnenie na ich používanie";
|
||||
"microphone_access_not_granted_for_call" = "Hovory vyžadujú prístup k mikrofónu, ale %@ nemá povolenie na jeho používanie";
|
||||
|
||||
// Permissions
|
||||
"camera_access_not_granted_for_call" = "Videohovory vyžadujú prístup ku kamere, ale %@ nemá povolenie na jej používanie";
|
||||
"ssl_homeserver_url" = "URL adresa domovského servera: %@";
|
||||
"network_error_not_reachable" = "Skontrolujte prosím pripojenie k sieti";
|
||||
"not_supported_yet" = "Zatiaľ nie je podporované";
|
||||
"error_common_message" = "Vyskytla sa chyba. Skúste to prosím neskôr.";
|
||||
"e2e_passphrase_not_match" = "Prístupové frázy sa musia zhodovať";
|
||||
"e2e_passphrase_empty" = "Prístupová fráza nesmie byť prázdna";
|
||||
"e2e_passphrase_too_short" = "Príliš krátka prístupová fráza (Musí mať minimálne %d znakov)";
|
||||
"e2e_export_prompt" = "Tento proces umožňuje exportovať kľúče od správ, ktoré ste prijali v zašifrovaných miestnostiach, do lokálneho súboru. Tento súbor potom budete môcť v budúcnosti importovať do iného klienta Matrix, takže tento klient bude môcť tieto správy tiež dešifrovať.\nExportovaný súbor umožní komukoľvek, kto si ho môže prečítať, dešifrovať všetky zašifrované správy, ktoré vidíte, preto by ste mali dbať na jeho bezpečnosť.";
|
||||
|
||||
// E2E export
|
||||
"e2e_export_room_keys" = "Exportovať kľúče miestností";
|
||||
"e2e_import_prompt" = "Tento proces umožňuje importovať šifrovacie kľúče, ktoré ste predtým exportovali z iného klienta Matrix. Potom budete môcť dešifrovať všetky správy, ktoré mohol dešifrovať iný klient.\nExportovaný súbor je chránený prístupovou frázou. Tu by ste mali zadať prístupovú frázu, aby ste súbor dešifrovali.";
|
||||
|
||||
// E2E import
|
||||
"e2e_import_room_keys" = "Importovať kľúče miestností";
|
||||
"search_searching" = "Prebieha vyhľadávanie...";
|
||||
"attachment_unsupported_preview_message" = "Tento typ súboru nie je podporovaný.";
|
||||
"attachment_unsupported_preview_title" = "Nie je možné zobraziť náhľad";
|
||||
"attachment_e2e_keys_file_prompt" = "Tento súbor obsahuje šifrovacie kľúče exportované z klienta Matrix.\nChcete zobraziť obsah súboru alebo importovať kľúče, ktoré obsahuje?";
|
||||
"attachment_multiselection_size_prompt" = "Chcete odoslať obrázok ako:";
|
||||
"attachment_cancel_upload" = "Zrušiť nahrávanie?";
|
||||
"attachment_cancel_download" = "Zrušiť sťahovanie?";
|
||||
"attachment_large_with_resolution" = "Veľká %@ (~%@)";
|
||||
"attachment_medium_with_resolution" = "Stredná %@ (~%@)";
|
||||
"attachment_small_with_resolution" = "Malá %@ (~%@)";
|
||||
"attachment_large" = "Veľká (~%@)";
|
||||
"attachment_original" = "Skutočná veľkosť (%@)";
|
||||
"attachment_size_prompt_message" = "Túto funkciu môžete kedykoľvek vypnúť v nastaveniach.";
|
||||
|
||||
// Attachment
|
||||
"attachment_size_prompt" = "Chcete odoslať ako:";
|
||||
"room_member_power_level_prompt" = "Túto zmenu nebudete môcť vrátiť späť, pretože tomuto používateľovi udeľujete rovnakú úroveň moci, akú máte vy.\nSte si istí?";
|
||||
|
||||
// Room members
|
||||
"room_member_ignore_prompt" = "Ste si istí, že chcete skryť všetky správy od tohto používateľa?";
|
||||
"message_reply_to_sender_sent_a_file" = "poslal súbor.";
|
||||
"message_reply_to_sender_sent_a_voice_message" = "poslal/a zvukovú správu.";
|
||||
"message_reply_to_sender_sent_an_audio_file" = "poslal/a zvukový súbor.";
|
||||
"message_reply_to_sender_sent_a_video" = "poslal video.";
|
||||
|
||||
// Reply to message
|
||||
"message_reply_to_sender_sent_an_image" = "poslal obrázok.";
|
||||
"room_left" = "Opustili ste miestnosť";
|
||||
"room_error_timeline_event_not_found" = "Aplikácia sa pokúšala načítať konkrétny bod na časovej osi tejto miestnosti, ale nedokázala ho nájsť";
|
||||
"room_error_timeline_event_not_found_title" = "Nepodarilo sa načítať pozíciu na časovej osi";
|
||||
"room_error_cannot_load_timeline" = "Nepodarilo sa načítať časovú os";
|
||||
"room_error_topic_edition_not_authorized" = "Nie ste oprávnený upraviť tému tejto miestnosti";
|
||||
"room_error_name_edition_not_authorized" = "Nemáte oprávnenie upraviť názov tejto miestnosti";
|
||||
"room_error_join_failed_empty_room" = "V súčasnosti nie je možné znovu vstúpiť do prázdnej miestnosti.";
|
||||
"room_error_join_failed_title" = "Nepodarilo sa vstúpiť do miestnosti";
|
||||
|
||||
// Room
|
||||
"room_please_select" = "Prosím, vyberte si miestnosť";
|
||||
"room_creation_participants_placeholder" = "(napr. @fero:domovskyserver1; @jano:domovskyserver2...)";
|
||||
"room_creation_alias_placeholder_with_homeserver" = "(napr. #foo%@)";
|
||||
"room_creation_alias_placeholder" = "(napr. #foo:napriklad.sk)";
|
||||
"room_creation_alias_title" = "Alias miestnosti:";
|
||||
"account_error_push_not_allowed" = "Oznámenia nie sú povolené";
|
||||
"account_error_msisdn_wrong_description" = "Zdá sa, že toto nie je platné telefónne číslo";
|
||||
"account_error_msisdn_wrong_title" = "Neplatné telefónne číslo";
|
||||
"account_error_email_wrong_description" = "Toto nevyzerá ako platná e-mailová adresa";
|
||||
"account_error_email_wrong_title" = "Neplatná e-mailová adresa";
|
||||
"account_error_matrix_session_is_not_opened" = "Relácia Matrix nie je otvorená";
|
||||
"account_error_picture_change_failed" = "Zmena obrázka sa nepodarila";
|
||||
"account_error_display_name_change_failed" = "Zmena zobrazovaného mena sa nepodarila";
|
||||
"account_msisdn_validation_error" = "Nie je možné overiť telefónne číslo.";
|
||||
"account_msisdn_validation_message" = "Odoslali sme SMS s aktivačným kódom. Zadajte prosím tento kód nižšie.";
|
||||
"account_email_validation_error" = "Nie je možné overiť e-mailovú adresu. Skontrolujte svoj e-mail a kliknite na odkaz, ktorý obsahuje. Po vykonaní tohto kroku kliknite na tlačidlo Pokračovať";
|
||||
"account_email_validation_message" = "Prosím, skontrolujte svoj e-mail a kliknite na odkaz, ktorý obsahuje. Po dokončení tohto kroku kliknite na tlačidlo Pokračovať.";
|
||||
"room_event_encryption_verify_message" = "Ak chcete overiť, či je táto relácia dôveryhodná, kontaktujte jej vlastníka iným spôsobom (napr. osobne alebo telefonicky) a opýtajte sa ho, či kľúč, ktorý vidí v nastaveniach používateľa pre túto reláciu, sa zhoduje s nižšie uvedeným kľúčom:\n\n\tNázov relácie: %@\n\tID relácie: %@\n\tKľúč relácie: %@\n\nAk sa zhoduje, stlačte tlačidlo overiť nižšie. Ak nie, potom túto reláciu zachytáva niekto iný a pravdepodobne budete chcieť namiesto toho stlačiť tlačidlo čiernej listiny.\n\nV budúcnosti bude tento proces overovania sofistikovanejší.";
|
||||
"room_event_encryption_info_block" = "Pridať na čiernu listinu";
|
||||
"room_event_encryption_info_unblock" = "Odstrániť z čiernej listiny";
|
||||
"room_event_encryption_info_device" = "\nInformácie o relácii odosielateľa\n";
|
||||
"room_event_encryption_info_event_identity_key" = "Identifikačný kľúč Curve25519\n";
|
||||
|
||||
// Encryption information
|
||||
"room_event_encryption_info_title" = "Informácie o end-to-end šifrovaní\n\n";
|
||||
"device_details_last_seen_format" = "%@ @ %@\n";
|
||||
"settings_enable_push_notifications" = "Zapnúť push oznámenia";
|
||||
"settings_enable_inapp_notifications" = "Zapnúť oznámenia v aplikácii";
|
||||
"room_displayname_more_than_two_members" = "%@ a %@ ďalší";
|
||||
"room_displayname_two_members" = "%@ a %@";
|
||||
"notice_crypto_error_unknown_inbound_session_id" = "Relácia odosielateľa nám neposlala kľúče pre túto správu.";
|
||||
"notice_crypto_unable_to_decrypt" = "** Nepodarilo sa dešifrovať: %@ **";
|
||||
"notice_room_history_visible_to_members_from_invited_point" = "%@ zviditeľnil/a budúcu históriu miestnosti pre všetkých jej členov od okamihu, keď sú pozvaní.";
|
||||
"notice_room_history_visible_to_members_for_dm" = "%@ zmenil/a nastavenie, aby budúce správy boli viditeľné pre všetkých členov miestnosti.";
|
||||
"notice_room_history_visible_to_members" = "%@ zviditeľnil/a budúcu históriu miestnosti pre všetkých členov miestnosti.";
|
||||
"notice_room_history_visible_to_anyone" = "%@ zviditeľnil/a budúcu históriu miestnosti pre každého.";
|
||||
"notification_settings_by_default" = "Predvolene...";
|
||||
"notification_settings_other_alerts" = "Iné upozornenia";
|
||||
"room_creation_name_placeholder" = "(napr. pracovnaSkupina)";
|
||||
"message_reply_to_message_to_reply_to_prefix" = "V odpovedi na";
|
||||
"notice_in_reply_to" = "V odpovedi na";
|
||||
"notice_room_history_visible_to_members_from_joined_point_for_dm" = "%@ zviditeľnil budúce správy pre všetkých, od okamihu pripojenia.";
|
||||
"notice_room_history_visible_to_members_from_joined_point" = "%@ zviditeľnil budúcu históriu miestnosti pre všetkých členov miestnosti, od okamihu ich vstupu.";
|
||||
"notice_room_history_visible_to_members_from_invited_point_for_dm" = "%@ zviditeľnil budúce správy pre všetkých, od okamihu pozvania.";
|
||||
"notice_error_unknown_event_type" = "Neznámy typ udalosti";
|
||||
"notice_room_power_level_event_requirement" = "Minimálne úrovne oprávnenia súvisiace s udalosťami sú:";
|
||||
"notice_room_join_rule_public_for_dm" = "%@ ju zverejnil/a.";
|
||||
"notice_room_join_rule_public" = "%@ zverejnil/a túto miestnosť.";
|
||||
"notice_room_join_rule_invite_by_you_for_dm" = "Ste ju vytvorili len na pozvanie.";
|
||||
"notice_room_join_rule_invite_for_dm" = "%@ ju vytvoril len na pozvanie.";
|
||||
"notice_event_redacted" = "<redigované%@>";
|
||||
"capture_media" = "Spraviť fotografiu/video";
|
||||
"auth_reset_password_error_unauthorized" = "Neoprávnené";
|
||||
"auth_invalid_user_name" = "Neplatné používateľské meno";
|
||||
"ssl_only_accept" = "Certifikát akceptujte IBA vtedy, ak správca servera zverejnil odtlačok prsta, ktorý sa zhoduje s vyššie uvedeným.";
|
||||
"ssl_expected_existing_expl" = "Certifikát sa zmenil z predtým dôveryhodného na nedôveryhodný. Server mohol obnoviť svoj certifikát. Obráťte sa na správcu servera, aby vám poskytol očakávaný odtlačok.";
|
||||
"ssl_unexpected_existing_expl" = "Certifikát sa zmenil na iný, ktorému dôveroval váš telefón. To je VEĽMI NEOBVYKLÉ. Odporúča sa, aby ste tento nový certifikát NEPRIJALI.";
|
||||
"ssl_cert_new_account_expl" = "Ak správca servera uviedol, že sa to očakáva, skontrolujte, či sa odtlačok prsta uvedený nižšie zhoduje s odtlačkom prsta, ktorý poskytol.";
|
||||
"ssl_cert_not_trust" = "Môže to znamenať, že niekto úmyselne zachytáva vašu komunikáciu alebo že váš telefón nedôveruje certifikátu, ktorý poskytol vzdialený server.";
|
||||
"ssl_could_not_verify" = "Nepodarilo sa overiť identitu vzdialeného servera.";
|
||||
|
||||
// unrecognized SSL certificate
|
||||
"ssl_trust" = "Dôverovať";
|
||||
"call_video_with_user" = "Videohovor s %@";
|
||||
"call_voice_with_user" = "Hlasový hovor s %@";
|
||||
"call_more_actions_change_audio_device" = "Zmeniť zvukové zariadenie";
|
||||
"call_more_actions_hold" = "Podržať";
|
||||
"call_holded" = "Podržali ste hovor";
|
||||
"call_remote_holded" = "%@ podržal hovor";
|
||||
"incoming_voice_call" = "Prichádzajúci hlasový hovor";
|
||||
"incoming_video_call" = "Prichádzajúci videohovor";
|
||||
"settings_config_user_id" = "ID používateľa: %@";
|
||||
"settings_config_identity_server" = "Server totožností: %@";
|
||||
"notification_settings_suppress_from_bots" = "Stlmiť oznámenia od botov";
|
||||
"notification_settings_receive_a_call" = "Upozorniť ma, keď mi niekto zavolá";
|
||||
"notification_settings_people_join_leave_rooms" = "Upozorniť ma, keď sa ľudia pridajú alebo opustia miestnosti";
|
||||
"notification_settings_invite_to_a_new_room" = "Upozorniť ma, keď budem pozvaný do novej miestnosti";
|
||||
"notification_settings_just_sent_to_me" = "Upozorniť ma zvukom na správy odoslané len mne";
|
||||
"notification_settings_contain_my_display_name" = "Upozorniť ma zvukom na správy, ktoré obsahujú moje zobrazované meno";
|
||||
"notification_settings_contain_my_user_name" = "Upozorniť ma zvukom na správy, ktoré obsahujú moje používateľské meno";
|
||||
"notification_settings_highlight" = "Zvýrazniť";
|
||||
|
||||
// Login Screen
|
||||
"login_error_already_logged_in" = "Už ste prihlásení";
|
||||
"message_unsaved_changes" = "Máte neuložené zmeny. Opustením sa zrušia.";
|
||||
"membership_leave" = "Odišiel";
|
||||
"notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Zviditeľnili ste budúce správy pre všetkých, od okamihu pripojenia.";
|
||||
"notice_room_kick" = "%@ vylúčil %@";
|
||||
"attachment_medium" = "Stredná (~%@)";
|
||||
"attachment_small" = "Malá (~%@)";
|
||||
"room_no_conference_call_in_encrypted_rooms" = "Konferenčné hovory nie sú podporované v šifrovaných miestnostiach";
|
||||
"room_no_power_to_create_conference_call" = "Aby ste mohli začať konferenciu, musíte mať právo pozývať používateľov do miestnosti";
|
||||
"device_details_delete_prompt_message" = "Táto operácia si vyžaduje dodatočné overenie.\nAk chcete pokračovať, zadajte svoje heslo.";
|
||||
"device_details_rename_prompt_message" = "Verejný názov relácie je viditeľný pre ľudí, s ktorými komunikujete";
|
||||
"settings_enter_validation_token_for" = "Zadajte overovací token pre %@:";
|
||||
"notice_error_unexpected_event" = "Neočakávaná udalosť";
|
||||
"notice_error_unsupported_event" = "Nepodporovaná udalosť";
|
||||
"notice_room_join_rule_invite_by_you" = "Urobili ste miestnosť len pre pozvaných.";
|
||||
// New
|
||||
"notice_room_join_rule_invite" = "%@ vytvoril miestnosť len na pozvanie.";
|
||||
// Old
|
||||
"notice_room_join_rule" = "Pravidlo pripojenia je: %@";
|
||||
"notice_room_created" = "%@ vytvoril a nastavil miestnosť.";
|
||||
"notice_profile_change_redacted" = "%@ aktualizoval svoj profil %@";
|
||||
"notice_event_redacted_reason" = " [dôvod: %@]";
|
||||
"notice_event_redacted_by" = " používateľom %@";
|
||||
"notice_room_topic_removed" = "%@ odstránil tému";
|
||||
"notice_room_name_removed_for_dm" = "%@ odstránil názov";
|
||||
"notice_room_name_removed" = "%@ odstránil/a názov miestnosti";
|
||||
|
||||
// Events formatter
|
||||
"notice_avatar_changed_too" = "(obrázok bol tiež zmenený)";
|
||||
"resend_message" = "Znovu odoslať správu";
|
||||
"reset_to_default" = "Obnoviť na predvolené";
|
||||
"invite_user" = "Pozvať používateľa matrix";
|
||||
"attach_media" = "Pripojiť médium z knižnice";
|
||||
"select_account" = "Vyberte účet";
|
||||
"start_video_call" = "Spustiť videohovor";
|
||||
"start_voice_call" = "Spustiť hlasový hovor";
|
||||
"set_admin" = "Nastaviť správcu";
|
||||
"set_moderator" = "Nastaviť moderátora";
|
||||
"set_default_power_level" = "Vynulovať úroveň oprávnenia";
|
||||
"set_power_level" = "Nastaviť úroveň oprávnenia";
|
||||
"submit_code" = "Odoslať kód";
|
||||
"dismiss" = "Odmietnuť";
|
||||
"discard" = "Zahodiť";
|
||||
"login_error_resource_limit_exceeded_message_contact" = "\n\nAk chcete pokračovať v používaní tejto služby, obráťte sa na správcu služby.";
|
||||
"login_error_resource_limit_exceeded_message_monthly_active_user" = "Tento domovský server dosiahol svoj mesačný limit aktívnych používateľov.";
|
||||
"login_error_resource_limit_exceeded_message_default" = "Tento domovský server prekročil jeden z limitov zdroja.";
|
||||
"login_error_resource_limit_exceeded_title" = "Prekročený limit zdrojov";
|
||||
"login_error_forgot_password_is_not_supported" = "Zabudnuté heslo nie je v súčasnosti podporované";
|
||||
"login_error_not_json" = "Neobsahoval platný JSON";
|
||||
"login_error_unknown_token" = "Zadaný prístupový token nebol rozpoznaný";
|
||||
"login_error_registration_is_not_supported" = "Registrácia nie je v súčasnosti podporovaná";
|
||||
"login_error_do_not_support_login_flows" = "V súčasnosti nepodporujeme žiadny alebo všetky prihlasovacie toky definované týmto domovským serverom";
|
||||
"login_error_no_login_flow" = "Nepodarilo sa nám získať autentifikačné informácie z tohto domovského servera";
|
||||
"call_more_actions_audio_use_device" = "Reproduktor zariadenia";
|
||||
"call_more_actions_unhold" = "Pokračovať";
|
||||
"call_invite_expired" = "Platnosť pozvánky na hovor vypršala";
|
||||
"notification_settings_per_word_info" = "Slová sa porovnávajú bez ohľadu na veľkosť písmen a môžu obsahovať zástupný znak *. Takže:\nfoo zodpovedá reťazcu foo ohraničenému oddeľovačmi slov (napr. interpunkčnými znamienkami a medzerami alebo začiatkom/koncom riadku).\nfoo* zodpovedá každému takému slovu, ktoré začína foo.\n*foo* zodpovedá každému takému slovu, ktoré obsahuje 3 písmená foo.";
|
||||
"notice_redaction_by_you" = "Upravili ste udalosť (id: %@)";
|
||||
"notice_answered_video_call_by_you" = "Prijali ste hovor";
|
||||
"notice_placed_video_call_by_you" = "Uskutočnili ste videohovor";
|
||||
"notice_placed_voice_call_by_you" = "Uskutočnili ste hlasový hovor";
|
||||
"notice_answered_video_call" = "%@ prijal hovor";
|
||||
"notice_placed_video_call" = "%@ uskutočnil videohovor";
|
||||
"notice_placed_voice_call" = "%@ uskutočnil hlasový hovor";
|
||||
"attachment_size_prompt_title" = "Potvrdiť veľkosť na odoslanie";
|
||||
"notice_redaction" = "%@ upravil udalosť (id: %@)";
|
||||
"notice_feedback" = "Udalosť spätnej väzby (id: %@): %@";
|
||||
"resume_call" = "Pokračovať";
|
||||
"answer_call" = "Prijať hovor";
|
||||
|
||||
@@ -475,3 +475,6 @@
|
||||
"auth_username_in_use" = "Emër përdoruesi i përdorur";
|
||||
"auth_invalid_user_name" = "Emër i pavlefshëm përdoruesi";
|
||||
"rename" = "Riemërtojeni";
|
||||
"attachment_unsupported_preview_message" = "Ky lloj kartele nuk mbulohet.";
|
||||
"attachment_unsupported_preview_title" = "S’arrihet të bëhet paraparje";
|
||||
"room_displayname_all_other_members_left" = "%@ (Iku)";
|
||||
|
||||
@@ -470,3 +470,11 @@
|
||||
"attachment_size_prompt_message" = "Du kan stänga av detta i inställningarna.";
|
||||
"attachment_size_prompt_title" = "Bekräfta storlek att skicka";
|
||||
"room_displayname_all_other_participants_left" = "%@ (Kvar)";
|
||||
"auth_reset_password_error_not_found" = "Hittades inte";
|
||||
"auth_reset_password_error_unauthorized" = "Obehörig";
|
||||
"auth_username_in_use" = "Användarnamn upptaget";
|
||||
"auth_invalid_user_name" = "Ogiltigt användarnamn";
|
||||
"rename" = "Döp om";
|
||||
"attachment_unsupported_preview_message" = "Den här filtypen stöds inte.";
|
||||
"attachment_unsupported_preview_title" = "Kunde inte förhandsgranska";
|
||||
"room_displayname_all_other_members_left" = "%@ (Kvar)";
|
||||
|
||||
@@ -532,3 +532,29 @@
|
||||
"attachment_size_prompt_title" = "Підтвердити розмір, щоб надіслати";
|
||||
"room_no_power_to_create_conference_call" = "Вам потрібен дозвіл, щоб надсилати запрошення, щоб розпочати конференцію в цій кімнаті";
|
||||
"room_event_encryption_verify_message" = "Щоб переконатися, що цьому сеансу можна довіряти, зв’яжіться з його власником іншим способом (наприклад, особисто чи телефоном) і запитайте його, чи збігається ключ, який вони бачать у налаштуваннях користувача для цього сеансу, з ключем нижче:\n\nНазва сеансу: %@\nID сеансу: %@\nКлюч сеансу: %@\n\nЯкщо він збігається, натисніть кнопку підтвердження внизу. Якщо ні, значить хтось інший перехоплює цей сеанс, і ви, ймовірно, хочете натиснути кнопку чорного списку.\n\nУ майбутньому цей процес перевірки буде ускладнено.";
|
||||
"call_more_actions_hold" = "Утримувати";
|
||||
"call_holded" = "Ви утримуєте виклик";
|
||||
"call_remote_holded" = "%@ утримує виклик";
|
||||
|
||||
// Login Screen
|
||||
"login_error_already_logged_in" = "Вже ввійшли";
|
||||
"message_unsaved_changes" = "Ви маєте незбережені зміни. Якщо вийдете, їх буде скасовано.";
|
||||
"attachment_unsupported_preview_message" = "Цей тип файлу не підтримується.";
|
||||
"attachment_unsupported_preview_title" = "Не вдалося показати попередній перегляд";
|
||||
"attachment_e2e_keys_file_prompt" = "Цей файл містить ключі шифрування, експортовані з клієнта Matrix.\nБажаєте переглянути вміст файлу або імпортувати з нього ключі?";
|
||||
"room_member_power_level_prompt" = "Ви не зможете скасувати цю зміну, оскільки користувач отримає ті ж повноваження, що й ви.\nВи впевнені?";
|
||||
"room_error_timeline_event_not_found" = "Застосунок намагався завантажити певну точку стрічки у цій кімнаті, але не зміг її знайти";
|
||||
"room_error_timeline_event_not_found_title" = "Не вдалося завантажити позицію стрічки";
|
||||
"room_error_cannot_load_timeline" = "Не вдалося завантажити стрічку";
|
||||
"ssl_only_accept" = "Приймайте сертифікат ЛИШЕ якщо адміністратор сервера оприлюднив відбиток, збіжний із наведеним угорі.";
|
||||
"ssl_expected_existing_expl" = "Сертифікат, якому ви довіряли раніше, змінився на недовірений. Можливо, сервер оновив сертифікат. Запитайте в адміністратора, який відбиток очікуваний.";
|
||||
"ssl_unexpected_existing_expl" = "Сертифікат відрізняється від довіреного вашим телефоном. Це ВКРАЙ НЕЗВИЧНО. Радимо НЕ ПРИЙМАТИ цей новий сертифікат.";
|
||||
"ssl_cert_new_account_expl" = "Якщо адміністратор сервера каже, що так має бути, переконайтесь, що відбиток знизу збігається з відбитком адміністратора.";
|
||||
"ssl_cert_not_trust" = "Це може означати, що хтось зловмисно перехоплює ваш трафік або ваш телефон не довіряє сертифікату, наданому віддаленим сервером.";
|
||||
|
||||
// contacts list screen
|
||||
"invitation_message" = "Поговорімо в matrix? Сайт https://matrix.org описує, як це зробити.";
|
||||
"local_contacts_access_discovery_warning" = "Щоб виявляти, які ваші контакти вже в Matrix, %@ може надсилати адреси е-пошти й номери телефонів із вашої адресної книги на обраний сервер ідентифікації Matrix. Особисті дані хешуються перед надсиланням, якщо це підтримується: перегляньте політику приватності свого сервера ідентифікації, щоб дізнатися більше.";
|
||||
"local_contacts_access_not_granted" = "Для пошуку користувачів серед локальних контактів потрібен доступ до ваших контактів, але %@ не має такого дозволу";
|
||||
"e2e_export_prompt" = "Це дає змогу експортувати в локальний файл ключі до повідомлень, отриманих вами в зашифрованих кімнатах. Тоді ви зможете імпортувати файл до іншого клієнта Matrix у майбутньому, і той клієнт також зможе розшифрувати ці повідомлення.\nЕкспортований файл дасть змогу всім, хто його прочитає, розшифрувати всі видимі вам зашифровані повідомлення.";
|
||||
"e2e_import_prompt" = "Це дає змогу імпортувати ключі шифрування, які ви раніше експортували з іншого клієнта Matrix. Тоді ви зможете розшифрувати всі повідомлення, які міг розшифрувати той клієнт.\nФайл експорту захищений парольною фразою. Введіть парольну фразу сюди, щоб розшифрувати файл.";
|
||||
|
||||
@@ -2179,12 +2179,12 @@
|
||||
|
||||
if (event && event.eventType == MXEventTypeRoomMessage)
|
||||
{
|
||||
NSString *msgtype = event.content[@"msgtype"];
|
||||
NSString *msgtype = event.content[kMXMessageTypeKey];
|
||||
|
||||
NSString* textMessage;
|
||||
if ([msgtype isEqualToString:kMXMessageTypeText])
|
||||
{
|
||||
textMessage = event.content[@"body"];
|
||||
textMessage = event.content[kMXMessageBodyKey];
|
||||
}
|
||||
|
||||
// Show a confirmation popup to the end user
|
||||
@@ -3668,9 +3668,6 @@
|
||||
MXLogDebug(@"[MXKRoomVC] showAttachmentInCell on an unsent media");
|
||||
}
|
||||
}
|
||||
else if (selectedAttachment.type == MXKAttachmentTypeLocation)
|
||||
{
|
||||
}
|
||||
else if (selectedAttachment.type == MXKAttachmentTypeFile || selectedAttachment.type == MXKAttachmentTypeAudio)
|
||||
{
|
||||
// Start activity indicator as feedback on file selection.
|
||||
|
||||
@@ -1826,27 +1826,31 @@ static NSArray<NSNumber*> *initialSyncSilentErrorsHTTPStatusCodes;
|
||||
|
||||
dispatch_group_t dispatchGroup = dispatch_group_create();
|
||||
|
||||
for (MXRoomSummary *summary in mxSession.roomsSummaries)
|
||||
for (MXRoom *room in mxSession.rooms)
|
||||
{
|
||||
dispatch_group_enter(dispatchGroup);
|
||||
[summary.mxSession eventWithEventId:summary.lastMessage.eventId
|
||||
inRoom:summary.roomId
|
||||
success:^(MXEvent *event) {
|
||||
|
||||
if (event)
|
||||
{
|
||||
if (summary.lastMessage.others == nil)
|
||||
MXRoomSummary *summary = room.summary;
|
||||
if (summary)
|
||||
{
|
||||
dispatch_group_enter(dispatchGroup);
|
||||
[summary.mxSession eventWithEventId:summary.lastMessage.eventId
|
||||
inRoom:summary.roomId
|
||||
success:^(MXEvent *event) {
|
||||
|
||||
if (event)
|
||||
{
|
||||
summary.lastMessage.others = [NSMutableDictionary dictionary];
|
||||
if (summary.lastMessage.others == nil)
|
||||
{
|
||||
summary.lastMessage.others = [NSMutableDictionary dictionary];
|
||||
}
|
||||
summary.lastMessage.others[@"lastEventDate"] = [eventFormatter dateStringFromEvent:event withTime:YES];
|
||||
[self->mxSession.store.roomSummaryStore storeSummary:summary];
|
||||
}
|
||||
summary.lastMessage.others[@"lastEventDate"] = [eventFormatter dateStringFromEvent:event withTime:YES];
|
||||
[self->mxSession.store storeSummaryForRoom:summary.roomId summary:summary];
|
||||
}
|
||||
|
||||
dispatch_group_leave(dispatchGroup);
|
||||
} failure:^(NSError *error) {
|
||||
dispatch_group_leave(dispatchGroup);
|
||||
}];
|
||||
|
||||
dispatch_group_leave(dispatchGroup);
|
||||
} failure:^(NSError *error) {
|
||||
dispatch_group_leave(dispatchGroup);
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^{
|
||||
|
||||
@@ -33,7 +33,6 @@ typedef enum : NSUInteger {
|
||||
MXKAttachmentTypeAudio,
|
||||
MXKAttachmentTypeVoiceMessage,
|
||||
MXKAttachmentTypeVideo,
|
||||
MXKAttachmentTypeLocation,
|
||||
MXKAttachmentTypeFile,
|
||||
MXKAttachmentTypeSticker
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ NSString *const kMXKAttachmentFileNameBase = @"attatchment";
|
||||
else
|
||||
{
|
||||
// Note: mxEvent.eventType is supposed to be MXEventTypeRoomMessage here.
|
||||
NSString *msgtype = eventContent[@"msgtype"];
|
||||
NSString *msgtype = eventContent[kMXMessageTypeKey];
|
||||
if ([msgtype isEqualToString:kMXMessageTypeImage])
|
||||
{
|
||||
_type = MXKAttachmentTypeImage;
|
||||
@@ -109,12 +109,6 @@ NSString *const kMXKAttachmentFileNameBase = @"attatchment";
|
||||
_type = MXKAttachmentTypeVideo;
|
||||
MXJSONModelSetDictionary(_thumbnailInfo, eventContent[@"info"][@"thumbnail_info"]);
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeLocation])
|
||||
{
|
||||
// Not supported yet
|
||||
// _type = MXKAttachmentTypeLocation;
|
||||
return nil;
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeFile])
|
||||
{
|
||||
_type = MXKAttachmentTypeFile;
|
||||
@@ -125,7 +119,7 @@ NSString *const kMXKAttachmentFileNameBase = @"attatchment";
|
||||
}
|
||||
}
|
||||
|
||||
MXJSONModelSetString(_originalFileName, eventContent[@"body"]);
|
||||
MXJSONModelSetString(_originalFileName, eventContent[kMXMessageBodyKey]);
|
||||
MXJSONModelSetDictionary(_contentInfo, eventContent[@"info"]);
|
||||
MXJSONModelSetMXJSONModel(contentFile, MXEncryptedContentFile, eventContent[@"file"]);
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ static NSAttributedString *messageSeparator = nil;
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Add all components of the provided message
|
||||
for (MXKRoomBubbleComponent* component in cellData.bubbleComponents)
|
||||
{
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
NSString *messageType = self.event.content[@"msgtype"];
|
||||
NSString *messageType = self.event.content[kMXMessageTypeKey];
|
||||
|
||||
if (!messageType || !([messageType isEqualToString:kMXMessageTypeText] || [messageType isEqualToString:kMXMessageTypeNotice] || [messageType isEqualToString:kMXMessageTypeEmote]))
|
||||
{
|
||||
|
||||
@@ -605,6 +605,25 @@ extern NSString *const kMXKRoomDataSourceTimelineErrorErrorKey;
|
||||
success:(void (^)(NSString *eventId))success
|
||||
failure:(void (^)(NSError *error))failure;
|
||||
|
||||
/**
|
||||
Send a location message to a room.
|
||||
|
||||
While sending, a fake event will be echoed in the messages list.
|
||||
Once complete, this local echo will be replaced by the event saved by the homeserver.
|
||||
|
||||
@param latitude the location's latitude
|
||||
@param longitude the location's longitude
|
||||
@param description an optional description
|
||||
@param success A block object called when the operation succeeds. It returns
|
||||
the event id of the event generated on the homeserver
|
||||
@param failure A block object called when the operation fails.
|
||||
*/
|
||||
- (void)sendLocationWithLatitude:(double)latitude
|
||||
longitude:(double)longitude
|
||||
description:(NSString *)description
|
||||
success:(void (^)(NSString *))success
|
||||
failure:(void (^)(NSError *))failure;
|
||||
|
||||
/**
|
||||
Send a generic non state event to a room.
|
||||
|
||||
|
||||
@@ -2062,6 +2062,29 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
}
|
||||
}
|
||||
|
||||
- (void)sendLocationWithLatitude:(double)latitude
|
||||
longitude:(double)longitude
|
||||
description:(NSString *)description
|
||||
success:(void (^)(NSString *))success
|
||||
failure:(void (^)(NSError *))failure
|
||||
{
|
||||
__block MXEvent *localEchoEvent = nil;
|
||||
|
||||
// Make the request to the homeserver
|
||||
[_room sendLocationWithLatitude:latitude
|
||||
longitude:longitude
|
||||
description:description
|
||||
localEcho:&localEchoEvent
|
||||
success:success failure:failure];
|
||||
|
||||
if (localEchoEvent)
|
||||
{
|
||||
// Make the data source digest this fake local echo message
|
||||
[self queueEventForProcessing:localEchoEvent withRoomState:self.roomState direction:MXTimelineDirectionForwards];
|
||||
[self processQueuedEvents:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)sendEventOfType:(MXEventTypeString)eventTypeString content:(NSDictionary<NSString*, id>*)msgContent success:(void (^)(NSString *eventId))success failure:(void (^)(NSError *error))failure
|
||||
{
|
||||
__block MXEvent *localEchoEvent = nil;
|
||||
@@ -2099,7 +2122,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
else if ([event.type isEqualToString:kMXEventTypeStringRoomMessage])
|
||||
{
|
||||
// And retry the send the message according to its type
|
||||
NSString *msgType = event.content[@"msgtype"];
|
||||
NSString *msgType = event.content[kMXMessageTypeKey];
|
||||
if ([msgType isEqualToString:kMXMessageTypeText] || [msgType isEqualToString:kMXMessageTypeEmote])
|
||||
{
|
||||
// Resend the Matrix event by reusing the existing echo
|
||||
@@ -2860,7 +2883,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
NSString *messageType = event.content[@"msgtype"];
|
||||
NSString *messageType = event.content[kMXMessageTypeKey];
|
||||
if (messageType == nil || [messageType isEqualToString:@"m.bad.encrypted"]) {
|
||||
return NO;
|
||||
}
|
||||
@@ -4058,7 +4081,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
|
||||
if ([self canPerformActionOnEvent:event])
|
||||
{
|
||||
NSString *messageType = event.content[@"msgtype"];
|
||||
NSString *messageType = event.content[kMXMessageTypeKey];
|
||||
|
||||
if ([messageType isEqualToString:kMXMessageTypeKeyVerificationRequest])
|
||||
{
|
||||
@@ -4101,7 +4124,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
{
|
||||
MXEvent *event = [self eventWithEventId:eventId];
|
||||
BOOL isRoomMessage = event.eventType == MXEventTypeRoomMessage;
|
||||
NSString *messageType = event.content[@"msgtype"];
|
||||
NSString *messageType = event.content[kMXMessageTypeKey];
|
||||
|
||||
return isRoomMessage
|
||||
&& ([messageType isEqualToString:kMXMessageTypeText] || [messageType isEqualToString:kMXMessageTypeEmote])
|
||||
@@ -4122,7 +4145,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
}
|
||||
else
|
||||
{
|
||||
editableTextMessage = event.content[@"body"];
|
||||
editableTextMessage = event.content[kMXMessageBodyKey];
|
||||
}
|
||||
|
||||
return editableTextMessage;
|
||||
@@ -4239,7 +4262,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
NSString *sanitizedText = [self sanitizedMessageText:text];
|
||||
NSString *formattedText = [self htmlMessageFromSanitizedText:sanitizedText];
|
||||
|
||||
NSString *eventBody = event.content[@"body"];
|
||||
NSString *eventBody = event.content[kMXMessageBodyKey];
|
||||
NSString *eventFormattedBody = event.content[@"formatted_body"];
|
||||
|
||||
if (![sanitizedText isEqualToString:eventBody] && (!eventFormattedBody || ![formattedText isEqualToString:eventFormattedBody]))
|
||||
|
||||
@@ -45,6 +45,11 @@
|
||||
return [MatrixKitL10n messageReplyToSenderSentAFile];
|
||||
}
|
||||
|
||||
- (NSString *)senderSentTheirLocation
|
||||
{
|
||||
return [MatrixKitL10n messageReplyToSenderSentTheirLocation];
|
||||
}
|
||||
|
||||
- (NSString *)messageToReplyToPrefix
|
||||
{
|
||||
return [MatrixKitL10n messageReplyToMessageToReplyToPrefix];
|
||||
|
||||
@@ -46,7 +46,14 @@
|
||||
|
||||
- (MXSession *)mxSession
|
||||
{
|
||||
return dataSource.mxSession;
|
||||
MXSession *session = dataSource.mxSession;
|
||||
|
||||
if (session == nil)
|
||||
{
|
||||
session = roomSummary.mxSession;
|
||||
}
|
||||
|
||||
return session;
|
||||
}
|
||||
|
||||
- (NSString*)lastEventDate
|
||||
|
||||
@@ -25,52 +25,6 @@
|
||||
|
||||
#pragma mark - Constant definitions
|
||||
NSString *const kMXKRecentCellIdentifier = @"kMXKRecentCellIdentifier";
|
||||
static NSTimeInterval const roomSummaryChangeThrottlerDelay = .5;
|
||||
|
||||
|
||||
@interface MXKSessionRecentsDataSource ()
|
||||
{
|
||||
MXKRoomDataSourceManager *roomDataSourceManager;
|
||||
|
||||
/**
|
||||
Internal array used to regulate change notifications.
|
||||
Cell data changes are stored instantly in this array.
|
||||
These changes are reported to the delegate only if no server sync is in progress.
|
||||
*/
|
||||
NSMutableArray *internalCellDataArray;
|
||||
|
||||
/**
|
||||
Store the current search patterns list.
|
||||
*/
|
||||
NSArray* searchPatternsList;
|
||||
|
||||
/**
|
||||
Do not react on every summary change
|
||||
*/
|
||||
MXThrottler *roomSummaryChangeThrottler;
|
||||
|
||||
/**
|
||||
Last received suggested rooms per space ID
|
||||
*/
|
||||
NSMutableDictionary<NSString*, NSArray<MXSpaceChildInfo *> *> *lastSuggestedRooms;
|
||||
|
||||
/**
|
||||
Event listener of the current space used to update the UI if an event occurs.
|
||||
*/
|
||||
id spaceEventsListener;
|
||||
|
||||
/**
|
||||
Observer used to reload data when the space service is initialised
|
||||
*/
|
||||
id spaceServiceDidInitialiseObserver;
|
||||
}
|
||||
|
||||
/**
|
||||
Additional suggestedRooms related to the current selected Space
|
||||
*/
|
||||
@property (nonatomic, strong) NSArray<MXSpaceChildInfo *> *suggestedRooms;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MXKSessionRecentsDataSource
|
||||
|
||||
@@ -79,474 +33,52 @@ static NSTimeInterval const roomSummaryChangeThrottlerDelay = .5;
|
||||
self = [super initWithMatrixSession:matrixSession];
|
||||
if (self)
|
||||
{
|
||||
roomDataSourceManager = [MXKRoomDataSourceManager sharedManagerForMatrixSession:self.mxSession];
|
||||
// Update here data source state
|
||||
if (state != MXKDataSourceStateReady)
|
||||
{
|
||||
state = MXKDataSourceStateReady;
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(dataSource:didStateChange:)])
|
||||
{
|
||||
[self.delegate dataSource:self didStateChange:state];
|
||||
}
|
||||
}
|
||||
|
||||
internalCellDataArray = [NSMutableArray array];
|
||||
filteredCellDataArray = nil;
|
||||
|
||||
lastSuggestedRooms = [NSMutableDictionary new];
|
||||
|
||||
// Set default data and view classes
|
||||
[self registerCellDataClass:MXKRecentCellData.class forCellIdentifier:kMXKRecentCellIdentifier];
|
||||
|
||||
roomSummaryChangeThrottler = [[MXThrottler alloc] initWithMinimumDelay:roomSummaryChangeThrottlerDelay];
|
||||
|
||||
[[MXKAppSettings standardAppSettings] addObserver:self forKeyPath:@"showAllRoomsInHomeSpace" options:0 context:nil];
|
||||
// And inform the delegate about the update
|
||||
[self.delegate dataSource:self didCellChange:nil];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)destroy
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXRoomSummaryDidChangeNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXKRoomDataSourceSyncStatusChanged object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionNewRoomNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionDidLeaveRoomNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionDirectRoomsDidChangeNotification object:nil];
|
||||
|
||||
if (spaceServiceDidInitialiseObserver) {
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:spaceServiceDidInitialiseObserver];
|
||||
}
|
||||
|
||||
[roomSummaryChangeThrottler cancelAll];
|
||||
roomSummaryChangeThrottler = nil;
|
||||
|
||||
cellDataArray = nil;
|
||||
internalCellDataArray = nil;
|
||||
filteredCellDataArray = nil;
|
||||
lastSuggestedRooms = nil;
|
||||
|
||||
searchPatternsList = nil;
|
||||
|
||||
[[MXKAppSettings standardAppSettings] removeObserver:self forKeyPath:@"showAllRoomsInHomeSpace" context:nil];
|
||||
|
||||
[super destroy];
|
||||
}
|
||||
|
||||
- (void)didMXSessionStateChange
|
||||
{
|
||||
if (MXSessionStateStoreDataReady <= self.mxSession.state)
|
||||
{
|
||||
// Check whether some data have been already load
|
||||
if (0 == internalCellDataArray.count)
|
||||
{
|
||||
[self loadData];
|
||||
}
|
||||
else if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
// Sort cell data and notify the delegate
|
||||
[self sortCellDataAndNotifyChanges];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setCurrentSpace:(MXSpace *)currentSpace
|
||||
{
|
||||
if (_currentSpace == currentSpace)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (_currentSpace && spaceEventsListener)
|
||||
{
|
||||
[_currentSpace.room removeListener:spaceEventsListener];
|
||||
}
|
||||
|
||||
_currentSpace = currentSpace;
|
||||
|
||||
self.suggestedRooms = _currentSpace ? lastSuggestedRooms[_currentSpace.spaceId] : nil;
|
||||
[self updateSuggestedRooms];
|
||||
|
||||
MXWeakify(self);
|
||||
spaceEventsListener = [self.currentSpace.room listenToEvents:^(MXEvent *event, MXTimelineDirection direction, MXRoomState *roomState) {
|
||||
MXStrongifyAndReturnIfNil(self);
|
||||
[self updateSuggestedRooms];
|
||||
}];
|
||||
}
|
||||
|
||||
-(void)setSuggestedRooms:(NSArray<MXSpaceChildInfo *> *)suggestedRooms
|
||||
{
|
||||
_suggestedRooms = suggestedRooms;
|
||||
[self loadData];
|
||||
}
|
||||
|
||||
-(void)updateSuggestedRooms
|
||||
{
|
||||
if (self.currentSpace)
|
||||
{
|
||||
NSString *currentSpaceId = self.currentSpace.spaceId;
|
||||
MXWeakify(self);
|
||||
[self.mxSession.spaceService getSpaceChildrenForSpaceWithId:currentSpaceId suggestedOnly:YES limit:5 maxDepth:1 paginationToken:nil success:^(MXSpaceChildrenSummary * _Nonnull childrenSummary) {
|
||||
MXLogDebug(@"[MXKSessionRecentsDataSource] getSpaceChildrenForSpaceWithId %@: %ld found", self.currentSpace.spaceId, childrenSummary.childInfos.count);
|
||||
MXStrongifyAndReturnIfNil(self);
|
||||
self->lastSuggestedRooms[currentSpaceId] = childrenSummary.childInfos;
|
||||
if ([self.currentSpace.spaceId isEqual:currentSpaceId]) {
|
||||
self.suggestedRooms = childrenSummary.childInfos;
|
||||
}
|
||||
} failure:^(NSError * _Nonnull error) {
|
||||
MXLogError(@"[MXKSessionRecentsDataSource] getSpaceChildrenForSpaceWithId failed with error: %@", error);
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
- (NSInteger)numberOfCells
|
||||
{
|
||||
if (filteredCellDataArray)
|
||||
{
|
||||
return filteredCellDataArray.count;
|
||||
}
|
||||
return cellDataArray.count;
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (BOOL)hasUnread
|
||||
{
|
||||
// Check all current cells
|
||||
// Use numberOfRowsInSection methods so that we take benefit of the filtering
|
||||
for (NSUInteger i = 0; i < self.numberOfCells; i++)
|
||||
{
|
||||
id<MXKRecentCellDataStoring> cellData = [self cellDataAtIndex:i];
|
||||
if (cellData.hasUnread)
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)searchWithPatterns:(NSArray*)patternsList
|
||||
{
|
||||
if (patternsList.count)
|
||||
{
|
||||
searchPatternsList = patternsList;
|
||||
|
||||
if (filteredCellDataArray)
|
||||
{
|
||||
[filteredCellDataArray removeAllObjects];
|
||||
}
|
||||
else
|
||||
{
|
||||
filteredCellDataArray = [NSMutableArray arrayWithCapacity:cellDataArray.count];
|
||||
}
|
||||
|
||||
for (id<MXKRecentCellDataStoring> cellData in cellDataArray)
|
||||
{
|
||||
for (NSString* pattern in patternsList)
|
||||
{
|
||||
if (cellData.roomDisplayname && [cellData.roomDisplayname rangeOfString:pattern options:NSCaseInsensitiveSearch].location != NSNotFound)
|
||||
{
|
||||
[filteredCellDataArray addObject:cellData];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
filteredCellDataArray = nil;
|
||||
searchPatternsList = nil;
|
||||
}
|
||||
|
||||
[self.delegate dataSource:self didCellChange:nil];
|
||||
}
|
||||
|
||||
- (id<MXKRecentCellDataStoring>)cellDataAtIndex:(NSInteger)index
|
||||
{
|
||||
if (filteredCellDataArray)
|
||||
{
|
||||
if (index < filteredCellDataArray.count)
|
||||
{
|
||||
return filteredCellDataArray[index];
|
||||
}
|
||||
}
|
||||
else if (index < cellDataArray.count)
|
||||
{
|
||||
return cellDataArray[index];
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (CGFloat)cellHeightAtIndex:(NSInteger)index
|
||||
{
|
||||
if (self.delegate)
|
||||
{
|
||||
id<MXKRecentCellDataStoring> cellData = [self cellDataAtIndex:index];
|
||||
|
||||
Class<MXKCellRendering> class = [self.delegate cellViewClassForCellData:cellData];
|
||||
return [class heightForCellData:cellData withMaximumWidth:0];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#pragma mark - Events processing
|
||||
|
||||
/**
|
||||
Filtering in this method won't have any effect anymore. This class is not maintained.
|
||||
*/
|
||||
- (void)loadData
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXRoomSummaryDidChangeNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXKRoomDataSourceSyncStatusChanged object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionNewRoomNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionDidLeaveRoomNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionDirectRoomsDidChangeNotification object:nil];
|
||||
|
||||
if (!self.mxSession.spaceService.isInitialised && !spaceServiceDidInitialiseObserver) {
|
||||
MXWeakify(self);
|
||||
spaceServiceDidInitialiseObserver = [[NSNotificationCenter defaultCenter] addObserverForName:MXSpaceService.didInitialise object:self.mxSession.spaceService queue:nil usingBlock:^(NSNotification * _Nonnull note) {
|
||||
MXStrongifyAndReturnIfNil(self);
|
||||
[self loadData];
|
||||
}];
|
||||
}
|
||||
|
||||
// Reset the table
|
||||
[internalCellDataArray removeAllObjects];
|
||||
|
||||
// Retrieve the MXKCellData class to manage the data
|
||||
Class class = [self cellDataClassForCellIdentifier:kMXKRecentCellIdentifier];
|
||||
NSAssert([class conformsToProtocol:@protocol(MXKRecentCellDataStoring)], @"MXKSessionRecentsDataSource only manages MXKCellData that conforms to MXKRecentCellDataStoring protocol");
|
||||
|
||||
NSDate *startDate = [NSDate date];
|
||||
|
||||
for (MXRoomSummary *roomSummary in self.mxSession.roomsSummaries)
|
||||
{
|
||||
// Filter out private rooms with conference users
|
||||
if (!roomSummary.isConferenceUserRoom // @TODO Abstract this condition with roomSummary.hiddenFromUser
|
||||
&& !roomSummary.hiddenFromUser)
|
||||
{
|
||||
id<MXKRecentCellDataStoring> cellData = [[class alloc] initWithRoomSummary:roomSummary dataSource:self];
|
||||
if (cellData)
|
||||
{
|
||||
[internalCellDataArray addObject:cellData];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (MXSpaceChildInfo *childInfo in _suggestedRooms)
|
||||
{
|
||||
id<MXRoomSummaryProtocol> summary = [[MXRoomSummary alloc] initWithSpaceChildInfo:childInfo];
|
||||
id<MXKRecentCellDataStoring> cellData = [[class alloc] initWithRoomSummary:summary
|
||||
dataSource:self];
|
||||
if (cellData)
|
||||
{
|
||||
[internalCellDataArray addObject:cellData];
|
||||
}
|
||||
}
|
||||
|
||||
MXLogDebug(@"[MXKSessionRecentsDataSource] Loaded %tu recents in %.3fms", self.mxSession.rooms.count, [[NSDate date] timeIntervalSinceDate:startDate] * 1000);
|
||||
|
||||
// Make sure all rooms have a last message
|
||||
[self.mxSession fixRoomsSummariesLastMessage];
|
||||
|
||||
// Report loaded array except if sync is in progress
|
||||
if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
[self sortCellDataAndNotifyChanges];
|
||||
}
|
||||
|
||||
// Listen to MXSession rooms count changes
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didMXSessionHaveNewRoom:) name:kMXSessionNewRoomNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didMXSessionDidLeaveRoom:) name:kMXSessionDidLeaveRoomNotification object:nil];
|
||||
|
||||
// Listen to the direct rooms list
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didDirectRoomsChange:) name:kMXSessionDirectRoomsDidChangeNotification object:nil];
|
||||
|
||||
// Listen to MXRoomSummary
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRoomSummaryChanged:) name:kMXRoomSummaryDidChangeNotification object:nil];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didMXSessionStateChange) name:kMXKRoomDataSourceSyncStatusChanged object:nil];
|
||||
}
|
||||
|
||||
- (void)didDirectRoomsChange:(NSNotification *)notif
|
||||
{
|
||||
// Inform the delegate about the update
|
||||
[self.delegate dataSource:self didCellChange:nil];
|
||||
}
|
||||
|
||||
- (void)didRoomSummaryChanged:(NSNotification *)notif
|
||||
{
|
||||
[roomSummaryChangeThrottler throttle:^{
|
||||
[self didRoomSummaryChanged2:notif];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)didRoomSummaryChanged2:(NSNotification *)notif
|
||||
{
|
||||
MXRoomSummary *roomSummary = notif.object;
|
||||
if (roomSummary.mxSession == self.mxSession && internalCellDataArray.count)
|
||||
{
|
||||
// Find the index of the related cell data
|
||||
NSInteger index = NSNotFound;
|
||||
for (index = 0; index < internalCellDataArray.count; index++)
|
||||
{
|
||||
id<MXKRecentCellDataStoring> theRoomData = [internalCellDataArray objectAtIndex:index];
|
||||
if (theRoomData.roomSummary == roomSummary)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (index < internalCellDataArray.count)
|
||||
{
|
||||
if (roomSummary.hiddenFromUser)
|
||||
{
|
||||
[internalCellDataArray removeObjectAtIndex:index];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Create a new instance to not modify the content of 'cellDataArray' (the copy is not a deep copy).
|
||||
Class class = [self cellDataClassForCellIdentifier:kMXKRecentCellIdentifier];
|
||||
id<MXKRecentCellDataStoring> cellData = [[class alloc] initWithRoomSummary:roomSummary dataSource:self];
|
||||
if (cellData)
|
||||
{
|
||||
[internalCellDataArray replaceObjectAtIndex:index withObject:cellData];
|
||||
}
|
||||
}
|
||||
|
||||
// Report change except if sync is in progress
|
||||
if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
[self sortCellDataAndNotifyChanges];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MXLogDebug(@"[MXKSessionRecentsDataSource] didRoomLastMessageChanged: Cannot find the changed room summary for %@ (%@). It is probably not managed by this recents data source", roomSummary.roomId, roomSummary);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Inform the delegate that all the room summaries have been updated.
|
||||
[self.delegate dataSource:self didCellChange:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)didMXSessionHaveNewRoom:(NSNotification *)notif
|
||||
{
|
||||
MXSession *mxSession = notif.object;
|
||||
if (mxSession == self.mxSession)
|
||||
{
|
||||
NSString *roomId = notif.userInfo[kMXSessionNotificationRoomIdKey];
|
||||
|
||||
// Add the room if there is not yet a cell for it
|
||||
id<MXKRecentCellDataStoring> roomData = [self cellDataWithRoomId:roomId];
|
||||
if (nil == roomData)
|
||||
{
|
||||
MXLogDebug(@"MXKSessionRecentsDataSource] Add newly joined room: %@", roomId);
|
||||
|
||||
// Retrieve the MXKCellData class to manage the data
|
||||
Class class = [self cellDataClassForCellIdentifier:kMXKRecentCellIdentifier];
|
||||
|
||||
MXRoomSummary *roomSummary = [mxSession roomSummaryWithRoomId:roomId];
|
||||
id<MXKRecentCellDataStoring> cellData = [[class alloc] initWithRoomSummary:roomSummary dataSource:self];
|
||||
if (cellData)
|
||||
{
|
||||
[internalCellDataArray addObject:cellData];
|
||||
|
||||
// Report change except if sync is in progress
|
||||
if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
[self sortCellDataAndNotifyChanges];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)didMXSessionDidLeaveRoom:(NSNotification *)notif
|
||||
{
|
||||
MXSession *mxSession = notif.object;
|
||||
if (mxSession == self.mxSession)
|
||||
{
|
||||
NSString *roomId = notif.userInfo[kMXSessionNotificationRoomIdKey];
|
||||
id<MXKRecentCellDataStoring> roomData = [self cellDataWithRoomId:roomId];
|
||||
|
||||
if (roomData)
|
||||
{
|
||||
MXLogDebug(@"MXKSessionRecentsDataSource] Remove left room: %@", roomId);
|
||||
|
||||
[internalCellDataArray removeObject:roomData];
|
||||
|
||||
// Report change except if sync is in progress
|
||||
if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
[self sortCellDataAndNotifyChanges];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Order cells
|
||||
- (void)sortCellDataAndNotifyChanges
|
||||
{
|
||||
// Order them by origin_server_ts
|
||||
[internalCellDataArray sortUsingComparator:^NSComparisonResult(id<MXKRecentCellDataStoring> cellData1, id<MXKRecentCellDataStoring> cellData2)
|
||||
{
|
||||
return [cellData1.roomSummary.lastMessage compareOriginServerTs:cellData2.roomSummary.lastMessage];
|
||||
}];
|
||||
|
||||
// Snapshot the cell data array
|
||||
cellDataArray = [internalCellDataArray copy];
|
||||
|
||||
// Update search result if any
|
||||
if (searchPatternsList)
|
||||
{
|
||||
[self searchWithPatterns:searchPatternsList];
|
||||
}
|
||||
|
||||
// Update here data source state
|
||||
if (state != MXKDataSourceStateReady)
|
||||
{
|
||||
state = MXKDataSourceStateReady;
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(dataSource:didStateChange:)])
|
||||
{
|
||||
[self.delegate dataSource:self didStateChange:state];
|
||||
}
|
||||
}
|
||||
|
||||
// And inform the delegate about the update
|
||||
[self.delegate dataSource:self didCellChange:nil];
|
||||
}
|
||||
|
||||
// Find the cell data that stores information about the given room id
|
||||
- (id<MXKRecentCellDataStoring>)cellDataWithRoomId:(NSString*)roomId
|
||||
{
|
||||
id<MXKRecentCellDataStoring> theRoomData;
|
||||
|
||||
NSMutableArray *dataArray = internalCellDataArray;
|
||||
if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
dataArray = cellDataArray;
|
||||
}
|
||||
|
||||
for (id<MXKRecentCellDataStoring> roomData in dataArray)
|
||||
{
|
||||
if ([roomData.roomSummary.roomId isEqualToString:roomId])
|
||||
{
|
||||
theRoomData = roomData;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return theRoomData;
|
||||
}
|
||||
|
||||
#pragma mark - KVO
|
||||
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath
|
||||
ofObject:(id)object
|
||||
change:(NSDictionary *)change
|
||||
context:(void *)context
|
||||
{
|
||||
if (object == [MXKAppSettings standardAppSettings] && [keyPath isEqualToString:@"showAllRoomsInHomeSpace"])
|
||||
{
|
||||
if (self.currentSpace == nil)
|
||||
{
|
||||
[self loadData];
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
date = [searchDataSource.eventFormatter dateStringFromEvent:searchResult.result withTime:YES];
|
||||
|
||||
// Code from [MXEventFormatter stringFromEvent] for the particular case of a text message
|
||||
message = [searchResult.result.content[@"body"] isKindOfClass:[NSString class]] ? searchResult.result.content[@"body"] : nil;
|
||||
message = [searchResult.result.content[kMXMessageBodyKey] isKindOfClass:[NSString class]] ? searchResult.result.content[kMXMessageBodyKey] : nil;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -175,10 +175,6 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
{
|
||||
isSupportedAttachment = hasUrl || hasFile;
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeLocation])
|
||||
{
|
||||
// Not supported yet
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeFile])
|
||||
{
|
||||
isSupportedAttachment = hasUrl || hasFile;
|
||||
@@ -1252,7 +1248,7 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
else
|
||||
{
|
||||
NSString *msgtype;
|
||||
MXJSONModelSetString(msgtype, event.content[@"msgtype"]);
|
||||
MXJSONModelSetString(msgtype, event.content[kMXMessageTypeKey]);
|
||||
|
||||
NSString *body;
|
||||
BOOL isHTML = NO;
|
||||
@@ -1267,12 +1263,12 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
else if (eventThreadId && !RiotSettings.shared.enableThreads)
|
||||
{
|
||||
isHTML = YES;
|
||||
MXJSONModelSetString(body, event.content[@"body"]);
|
||||
MXJSONModelSetString(body, event.content[kMXMessageBodyKey]);
|
||||
MXEvent *threadRootEvent = [mxSession.store eventWithEventId:eventThreadId
|
||||
inRoom:event.roomId];
|
||||
|
||||
NSString *threadRootEventContent;
|
||||
MXJSONModelSetString(threadRootEventContent, threadRootEvent.content[@"body"]);
|
||||
MXJSONModelSetString(threadRootEventContent, threadRootEvent.content[kMXMessageBodyKey]);
|
||||
body = [NSString stringWithFormat:@"<mx-reply><blockquote><a href=\"%@\">In reply to</a> <a href=\"%@\">%@</a><br>%@</blockquote></mx-reply>%@",
|
||||
[MXTools permalinkToEvent:eventThreadId inRoom:event.roomId],
|
||||
[MXTools permalinkToUserWithUserId:threadRootEvent.sender],
|
||||
@@ -1283,7 +1279,7 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
}
|
||||
else
|
||||
{
|
||||
MXJSONModelSetString(body, event.content[@"body"]);
|
||||
MXJSONModelSetString(body, event.content[kMXMessageBodyKey]);
|
||||
}
|
||||
|
||||
if (body)
|
||||
@@ -1333,23 +1329,6 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
*error = MXKEventFormatterErrorUnsupported;
|
||||
}
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeLocation])
|
||||
{
|
||||
body = body? body : [MatrixKitL10n noticeLocationAttachment];
|
||||
if (![self isSupportedAttachment:event])
|
||||
{
|
||||
MXLogDebug(@"[MXKEventFormatter] Warning: Unsupported attachment %@", event.description);
|
||||
if (_isForSubtitle || !_settings.showUnsupportedEventsInRoomHistory)
|
||||
{
|
||||
body = [MatrixKitL10n noticeInvalidAttachment];
|
||||
}
|
||||
else
|
||||
{
|
||||
body = [MatrixKitL10n noticeUnsupportedAttachment:event.description];
|
||||
}
|
||||
*error = MXKEventFormatterErrorUnsupported;
|
||||
}
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeFile])
|
||||
{
|
||||
body = body? body : [MatrixKitL10n noticeFileAttachment];
|
||||
@@ -1582,7 +1561,7 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
else
|
||||
{
|
||||
NSString *body;
|
||||
MXJSONModelSetString(body, event.content[@"body"]);
|
||||
MXJSONModelSetString(body, event.content[kMXMessageBodyKey]);
|
||||
|
||||
// Check sticker validity
|
||||
if (![self isSupportedAttachment:event])
|
||||
@@ -2000,7 +1979,7 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
|
||||
if (event.eventType == MXEventTypeRoomMessage)
|
||||
{
|
||||
NSString *msgtype = event.content[@"msgtype"];
|
||||
NSString *msgtype = event.content[kMXMessageTypeKey];
|
||||
if ([msgtype isEqualToString:kMXMessageTypeEmote] == NO)
|
||||
{
|
||||
NSString *senderDisplayName = [self senderDisplayNameForEvent:event withRoomState:roomState];
|
||||
@@ -2121,7 +2100,7 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
else if (!_isForSubtitle && event.eventType == MXEventTypeRoomMessage && (_emojiOnlyTextFont || _singleEmojiTextFont))
|
||||
{
|
||||
NSString *message;
|
||||
MXJSONModelSetString(message, event.content[@"body"]);
|
||||
MXJSONModelSetString(message, event.content[kMXMessageBodyKey]);
|
||||
|
||||
if (_emojiOnlyTextFont && [MXKTools isEmojiOnlyString:message])
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user