diff --git a/CHANGES.md b/CHANGES.md index f62115f7c..e4d8ef4d8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,43 @@ +## Changes in 1.9.16 (2023-01-24) + +✨ Features + +- Rich Text Composer: Enable bulleted/numbered lists support ([#7238](https://github.com/vector-im/element-ios/issues/7238)) +- Rich Text Composer: Enable quote & code blocks support ([#7271](https://github.com/vector-im/element-ios/issues/7271)) +- Voice Broadcast: When deleting a voice broadcast, all data is now deleted on server side (MSC3912 implementation). ([#7283](https://github.com/vector-im/element-ios/issues/7283)) + +🙌 Improvements + +- Labs: VoiceBroadcast: Handle VoIP buttons when VB is used ([#7225](https://github.com/vector-im/element-ios/pull/7225)) +- Polls: add UI for active poll history. ([#7267](https://github.com/vector-im/element-ios/pull/7267)) +- CryptoSDK: Add labs settings to enable Crypto SDK ([#7272](https://github.com/vector-im/element-ios/pull/7272)) +- Voice Broadcast: Improved detection of voice broadcast completion during playback. ([#7273](https://github.com/vector-im/element-ios/pull/7273)) +- Remove "Leave" button on Room details screen ([#7275](https://github.com/vector-im/element-ios/pull/7275)) +- Polls: poll history UI for past polls. ([#7278](https://github.com/vector-im/element-ios/pull/7278)) +- Polls: render replies to poll events better. ([#7284](https://github.com/vector-im/element-ios/pull/7284)) +- CryptoV2: Display migration progress during startup ([#7286](https://github.com/vector-im/element-ios/pull/7286)) +- Upgrade MatrixSDK version ([v0.24.8](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.24.8)). +- Voice broadcast connection error handling while recording. ([#7229](https://github.com/vector-im/element-ios/issues/7229)) +- Handle a connection issue when we try to start a new voice broadcast. ([#7234](https://github.com/vector-im/element-ios/issues/7234)) +- Rich Text Editor: https:// or mailto: scheme is automatically added when creating a link if no scheme is specified. ([#7279](https://github.com/vector-im/element-ios/issues/7279)) +- Rich Text Editor: Adding a link over a blank selection, prompts the user to create a new link with new text to replace such selection. ([#7280](https://github.com/vector-im/element-ios/issues/7280)) +- Voice Broadcast: handle the lost of connectivity with the homeserver while recording. ([#7285](https://github.com/vector-im/element-ios/issues/7285)) + +🐛 Bugfixes + +- Voice Broadcast: The Now Playing Info Center now displays a voice broadcast instead of a voice message when a user is listening to a voice broadcast. ([#7257](https://github.com/vector-im/element-ios/pull/7257)) +- Fix a crash caused by the missing Avatar Service dependency. ([#7268](https://github.com/vector-im/element-ios/pull/7268)) +- The (edited) tag for messages is now light grey like on web and Android. ([#5148](https://github.com/vector-im/element-ios/issues/5148)) +- Live Location Sharing does not work on first selection after granting "Allow always" location permission. ([#7222](https://github.com/vector-im/element-ios/issues/7222)) +- Voice Broadcast: Fixed an issue where the voice broadcast audio player progress bar behaved unexpectedly. ([#7252](https://github.com/vector-im/element-ios/issues/7252)) +- Voice Broadcast: VoiceBroadcast chunks are no longer resent as voice messages ([#7261](https://github.com/vector-im/element-ios/issues/7261)) +- Timeline's links and hyperlinks match now the blue colour of Android and Web. ([#7263](https://github.com/vector-im/element-ios/issues/7263)) + +🧱 Build + +- Fix Element Alpha workflow not being able to run. ([#7256](https://github.com/vector-im/element-ios/pull/7256)) + + ## Changes in 1.9.15 (2023-01-10) ✨ Features diff --git a/Config/AppVersion.xcconfig b/Config/AppVersion.xcconfig index 7271fabb8..210603b23 100644 --- a/Config/AppVersion.xcconfig +++ b/Config/AppVersion.xcconfig @@ -15,5 +15,5 @@ // // Version -MARKETING_VERSION = 1.9.16 -CURRENT_PROJECT_VERSION = 1.9.16 +MARKETING_VERSION = 1.9.17 +CURRENT_PROJECT_VERSION = 1.9.17 diff --git a/Podfile b/Podfile index 02f9e605f..35ba935b2 100644 --- a/Podfile +++ b/Podfile @@ -16,7 +16,7 @@ use_frameworks! # - `{ :specHash => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for MatrixSDK 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 -$matrixSDKVersion = '= 0.24.7' +$matrixSDKVersion = '= 0.24.8' # $matrixSDKVersion = :local # $matrixSDKVersion = { :branch => 'develop'} # $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } } diff --git a/Podfile.lock b/Podfile.lock index dbc139f68..24b937005 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -55,9 +55,9 @@ PODS: - LoggerAPI (1.9.200): - Logging (~> 1.1) - Logging (1.4.0) - - MatrixSDK (0.24.7): - - MatrixSDK/Core (= 0.24.7) - - MatrixSDK/Core (0.24.7): + - MatrixSDK (0.24.8): + - MatrixSDK/Core (= 0.24.8) + - MatrixSDK/Core (0.24.8): - AFNetworking (~> 4.0.0) - GZIP (~> 1.3.0) - libbase58 (~> 0.1.4) @@ -65,12 +65,12 @@ PODS: - OLMKit (~> 3.2.5) - Realm (= 10.27.0) - SwiftyBeaver (= 1.9.5) - - MatrixSDK/CryptoSDK (0.24.7): - - MatrixSDKCrypto (= 0.1.7) - - MatrixSDK/JingleCallStack (0.24.7): + - MatrixSDK/CryptoSDK (0.24.8): + - MatrixSDKCrypto (= 0.1.8) + - MatrixSDK/JingleCallStack (0.24.8): - JitsiMeetSDK (= 5.0.2) - MatrixSDK/Core - - MatrixSDKCrypto (0.1.7) + - MatrixSDKCrypto (0.1.8) - OLMKit (3.2.12): - OLMKit/olmc (= 3.2.12) - OLMKit/olmcpp (= 3.2.12) @@ -122,8 +122,8 @@ DEPENDENCIES: - KeychainAccess (~> 4.2.2) - KTCenterFlowLayout (~> 1.3.1) - libPhoneNumber-iOS (~> 0.9.13) - - MatrixSDK (= 0.24.7) - - MatrixSDK/JingleCallStack (= 0.24.7) + - MatrixSDK (= 0.24.8) + - MatrixSDK/JingleCallStack (= 0.24.8) - OLMKit - PostHog (~> 1.4.4) - ReadMoreTextView (~> 3.0.1) @@ -197,7 +197,7 @@ CHECKOUT OPTIONS: :git: https://github.com/matrix-org/matrix-analytics-events.git SPEC CHECKSUMS: - AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce + AFNetworking: 3bd23d814e976cd148d7d44c3ab78017b744cd58 AnalyticsEvents: 0cc8cf52da2fd464a2f39b788a295988151116ce BlueCryptor: b0aee3d9b8f367b49b30de11cda90e1735571c24 BlueECC: 0d18e93347d3ec6d41416de21c1ffa4d4cd3c2cc @@ -220,8 +220,8 @@ SPEC CHECKSUMS: libPhoneNumber-iOS: 0a32a9525cf8744fe02c5206eb30d571e38f7d75 LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d Logging: beeb016c9c80cf77042d62e83495816847ef108b - MatrixSDK: 895929fad10b7ec9aa96d557403b44c5e3522211 - MatrixSDKCrypto: 2bd9ca41b2c644839f4e680a64897d56b3f95392 + MatrixSDK: cf1c1b2a9742f7f4fad21e94bd94cd8f13c47369 + MatrixSDKCrypto: 862d9b4dbb6861da030943f5a18c39258ed7345b OLMKit: da115f16582e47626616874e20f7bb92222c7a51 PostHog: 4b6321b521569092d4ef3a02238d9435dbaeb99f ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d @@ -241,6 +241,6 @@ SPEC CHECKSUMS: zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb -PODFILE CHECKSUM: 56782e2abd382278b3c5b23824ca74994fd0a97e +PODFILE CHECKSUM: 079b57b800c666ad864e1f059ae69e150a98a4f0 COCOAPODS: 1.11.3 diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/Contents.json b/Riot/Assets/Images.xcassets/AllChatsOnboarding/Contents.json deleted file mode 100644 index 73c00596a..000000000 --- a/Riot/Assets/Images.xcassets/AllChatsOnboarding/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/Contents.json b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/Contents.json deleted file mode 100644 index d6a6b5903..000000000 --- a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "all_chats_onboarding1.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "all_chats_onboarding1@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "all_chats_onboarding1@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/all_chats_onboarding1.png b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/all_chats_onboarding1.png deleted file mode 100644 index 95fb854c7..000000000 Binary files a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/all_chats_onboarding1.png and /dev/null differ diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/all_chats_onboarding1@2x.png b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/all_chats_onboarding1@2x.png deleted file mode 100644 index 40c13c07a..000000000 Binary files a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/all_chats_onboarding1@2x.png and /dev/null differ diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/all_chats_onboarding1@3x.png b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/all_chats_onboarding1@3x.png deleted file mode 100644 index 8cb11ba5d..000000000 Binary files a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding1.imageset/all_chats_onboarding1@3x.png and /dev/null differ diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/Contents.json b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/Contents.json deleted file mode 100644 index 99aa89f84..000000000 --- a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/Contents.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "images" : [ - { - "filename" : "all_chats_onboarding2.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "all_chats_onboarding2@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "all_chats_onboarding2@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "preserves-vector-representation" : true - } -} diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2.png b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2.png deleted file mode 100644 index 119903ee6..000000000 Binary files a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2.png and /dev/null differ diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2@2x.png b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2@2x.png deleted file mode 100644 index 5e33559ac..000000000 Binary files a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2@2x.png and /dev/null differ diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2@3x.png b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2@3x.png deleted file mode 100644 index b36afc879..000000000 Binary files a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2@3x.png and /dev/null differ diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/Contents.json b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/Contents.json deleted file mode 100644 index fd0b40307..000000000 --- a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "all_chats_onboarding3.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "all_chats_onboarding3@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "all_chats_onboarding3@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/all_chats_onboarding3.png b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/all_chats_onboarding3.png deleted file mode 100644 index 274db9f56..000000000 Binary files a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/all_chats_onboarding3.png and /dev/null differ diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/all_chats_onboarding3@2x.png b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/all_chats_onboarding3@2x.png deleted file mode 100644 index 6c2ae7bbf..000000000 Binary files a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/all_chats_onboarding3@2x.png and /dev/null differ diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/all_chats_onboarding3@3x.png b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/all_chats_onboarding3@3x.png deleted file mode 100644 index 8bb136ca1..000000000 Binary files a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding3.imageset/all_chats_onboarding3@3x.png and /dev/null differ diff --git a/Riot/Assets/ar.lproj/Vector.strings b/Riot/Assets/ar.lproj/Vector.strings index a9a7b2cb6..7810fc3cc 100644 --- a/Riot/Assets/ar.lproj/Vector.strings +++ b/Riot/Assets/ar.lproj/Vector.strings @@ -455,7 +455,7 @@ "sign_up" = "الاِشتِراك"; "dismiss" = "إبعَاد"; "discard" = "اِستِبعاد"; -"abort" = "إِجهَاض"; +"abort" = "إنهاء"; "yes" = "نَعَم"; // Action @@ -1078,3 +1078,8 @@ /* The placeholder will show the email address that was entered. */ "authentication_verify_email_waiting_message" = "اتبع التعليمات المرسلة إلى %@"; "invite_to" = "الدعوة إلى %@"; +"password_policy_pwd_in_dict_error" = "تم العثور على كلمة المرور هذه في القاموس لدينا، وهي كلمة مرور غير مسموح في استخدامها."; + +// Others +"or" = "أو"; +"accessibility_selected" = "تم تحديده"; diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index f1886a04c..1bff71b29 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -2457,9 +2457,7 @@ "all_chats_all_filter" = "Alle"; "all_chats_edit_layout_show_filters" = "Filter anzeigen"; "all_chats_edit_menu_leave_space" = "%@ verlassen"; -"all_chats_onboarding_page_title3" = "Rückmeldung geben"; "room_invites_empty_view_information" = "Hier erscheinen deine Einladungen."; -"all_chats_onboarding_try_it" = "Probiere es aus"; "threads_discourage_information_1" = "Dein Heimserver unterstützt aktuell keine Threads, weshalb diese Funktion unzuverlässig sein könnte. Manche Thread-Nachrichten könnten nicht zuverlässig verfügbar sein. "; "all_chats_nothing_found_placeholder_title" = "Nichts gefunden."; "spaces_create_subspace_title" = "Sub-Space erstellen"; @@ -2475,16 +2473,10 @@ "room_access_settings_screen_private_message" = "Nur sichtbar und betretbar für eingeladene Personen."; "location_sharing_allow_background_location_message" = "Wenn du deinen Echtzeit-Standort freigeben möchtest, benötigt Element den Standortzugriff auch im Hintergrund. Um den Zugriff zu gewähren, tippe auf Einstellungen > Standort und wähle „Immer“"; "space_selector_empty_view_information" = "Spaces sind eine neue Möglichkeit, Räume und Personen zu gruppieren. Erstelle einen Space, um zu beginnen."; -"all_chats_onboarding_title" = "Was ist neu"; -"all_chats_onboarding_page_message3" = "Drücke auf dein Profil um uns Wissen zu lassen, was du denkst."; -"all_chats_onboarding_page_message2" = "Greife auf deine Spaces (unten links) schneller und einfacher denn je zu."; -"all_chats_onboarding_page_title2" = "Auf Spaces zugreifen"; -"all_chats_onboarding_page_message1" = "Um dein Element zu vereinfachen, sind Tabs nun optional. Verwalte sie mit dem Menü oben rechts."; "all_chats_empty_view_information" = "Die Komplettlösung für sichere Kommunikation unter Freunden, in Gruppen oder in Organisationen. Erstelle eine Unterhaltung oder trete einem bestehenden Raum bei, um loszulegen."; "all_chats_empty_space_information" = "Spaces sind eine neue Möglichkeit, Räume und Personen zu gruppieren. Füge einen bestehenden Raum hinzu oder erstelle einen neuen mit der Schaltfläche unten rechts."; "all_chats_edit_layout_sorting_options_title" = "Sortiere deine Nachrichten nach"; "space_detail_nav_title" = "Space-Details"; -"all_chats_onboarding_page_title1" = "Willkommen in einer neuen Übersicht!"; "all_chats_edit_menu_space_settings" = "Space-Einstellungen"; "all_chats_user_menu_settings" = "Nutzereinstellungen"; "room_recents_recently_viewed_section" = "Kürzlich angesehen"; @@ -2700,5 +2692,34 @@ "notice_voice_broadcast_live" = "Echtzeitübertragung"; "user_other_session_security_recommendation_title" = "Andere Sitzungen"; "voice_message_broadcast_in_progress_title" = "Kann Sprachnachricht nicht beginnen"; -"poll_timeline_decryption_error" = "Aufgrund von Entschlüsselungsfehlern könnten einige Stimmen nicht gezählt werden"; -"voice_message_broadcast_in_progress_message" = "Du kannst kein Gespräch beginnen, da du im Moment eine Sprachübertragung aufzeichnest. Bitte beende deine Sprachübertragung, um ein Gespräch zu beginnen"; +"poll_timeline_decryption_error" = "Evtl. werden infolge von Entschlüsselungsfehlern einige Stimmen nicht gezählt"; +"voice_message_broadcast_in_progress_message" = "Du kannst keine Sprachnachricht beginnen, da du im Moment eine Echtzeitübertragung aufzeichnest. Bitte beende deine Sprachübertragung, um ein Gespräch zu beginnen"; +"poll_timeline_ended_text" = "Umfrage beendet"; +"voice_broadcast_voip_cannot_start_description" = "Du kannst keinen Anruf beginnen, da du im Moment eine Sprachübertragung aufzeichnest. Bitte beende deine Sprachübertragung, um ein Gespräch zu beginnen."; +"voice_broadcast_voip_cannot_start_title" = "Kann keinen Anruf beginnen"; +"poll_history_no_past_poll_text" = "In diesem Raum gibt es keine abgeschlossenen Umfragen"; +"poll_history_no_active_poll_text" = "In diesem Raum gibt es keine aktiven Umfragen"; +"poll_history_past_segment_title" = "Vergangene Umfragen"; +"poll_history_active_segment_title" = "Aktive Umfragen"; + +// MARK: - Polls history + +"poll_history_title" = "Umfrageverlauf"; +"room_details_polls" = "Umfrageverlauf"; +"accessibility_selected" = "ausgewählt"; +"voice_broadcast_playback_lock_screen_placeholder" = "Sprachübertragung"; +"voice_broadcast_connection_error_message" = "Leider ist es aktuell nicht möglich, eine Aufnahme zu beginnen. Bitte versuche es später erneut."; +"voice_broadcast_connection_error_title" = "Verbindungsfehler"; +"wysiwyg_composer_format_action_code_block" = "Quelltextblock umschalten"; +"wysiwyg_composer_format_action_quote" = "Zitat umschalten"; +"wysiwyg_composer_format_action_ordered_list" = "Nummerierte Liste umschalten"; +"wysiwyg_composer_format_action_unordered_list" = "Unsortierte Liste umschalten"; +"voice_broadcast_recorder_connection_error" = "Verbindungsfehler – Aufzeichnung pausiert"; +"poll_timeline_reply_ended_poll" = "Beendete Umfrage"; + +// MARK: - Launch loading + +"launch_loading_migrating_data" = "Migriere Daten\n%@ %%"; +"settings_labs_disable_crypto_sdk" = "Krypto-SDK ist aktiviert. Zum Deaktivieren, bitte die App neu installieren"; +"settings_labs_confirm_crypto_sdk" = "Dies kann nicht rückgängig gemacht werden"; +"settings_labs_enable_crypto_sdk" = "Rust-basiertes Krypto-SDK aktivieren"; diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index d0cff8767..c5d6c22ae 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -2277,15 +2277,6 @@ Tap the + to start adding people."; "all_chats_edit_menu_leave_space" = "Leave %@"; "all_chats_edit_menu_space_settings" = "Space settings"; -"all_chats_onboarding_page_title1" = "Welcome to a new view!"; -"all_chats_onboarding_page_message1" = "To simplify your Element, tabs are now optional. Manage them using the top-right menu."; -"all_chats_onboarding_page_title2" = "Access Spaces"; -"all_chats_onboarding_page_message2" = "Access your Spaces (bottom-left) faster and easier than ever before."; -"all_chats_onboarding_page_title3" = "Give Feedback"; -"all_chats_onboarding_page_message3" = "Tap your profile to let us know what you think."; -"all_chats_onboarding_title" = "What's new"; -"all_chats_onboarding_try_it" = "Try it out"; - // MARK: - Room invites "room_invites_empty_view_title" = "Nothing new."; @@ -2312,6 +2303,8 @@ Tap the + to start adding people."; "poll_history_no_active_poll_period_text" = "There are no active polls for the past %@ days. Load more polls to view polls for previous months"; "poll_history_no_past_poll_period_text" = "There are no past polls for the past %@ days. Load more polls to view polls for previous months"; "poll_history_detail_view_in_timeline" = "View poll in timeline"; +"poll_history_load_more" = "Load more polls"; + // MARK: - Polls "poll_edit_form_create_poll" = "Create poll"; diff --git a/Riot/Assets/et.lproj/Localizable.strings b/Riot/Assets/et.lproj/Localizable.strings index 9f1002800..b3a015217 100644 --- a/Riot/Assets/et.lproj/Localizable.strings +++ b/Riot/Assets/et.lproj/Localizable.strings @@ -118,3 +118,6 @@ /* New file message from a specific person, not referencing a room. */ "LOCATION_FROM_USER" = "%@ jagas oma asukohta"; + +/* New voice broadcast from a specific person, not referencing a room. */ +"VOICE_BROADCAST_FROM_USER" = "%@ alustas ringhäälingukõnet"; diff --git a/Riot/Assets/et.lproj/Vector.strings b/Riot/Assets/et.lproj/Vector.strings index d84b26c76..c64a5133f 100644 --- a/Riot/Assets/et.lproj/Vector.strings +++ b/Riot/Assets/et.lproj/Vector.strings @@ -2417,14 +2417,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Uut teavet ei leidu."; -"all_chats_onboarding_try_it" = "Proovi nüüd"; -"all_chats_onboarding_title" = "Mida on meil uut"; -"all_chats_onboarding_page_message3" = "Kui soovid meile teada anda oma arvamustest, siis klõpsi oma profiili ikooni."; -"all_chats_onboarding_page_title3" = "Jaga tagasisidet"; -"all_chats_onboarding_page_message2" = "Kogukonnad leiad alt vasakult kiiremini ja lihtsamini, kui varem."; -"all_chats_onboarding_page_title2" = "Ligipääs kogukondadele"; -"all_chats_onboarding_page_message1" = "Et Element'i kasutamine oleks lihtsam, siis kaardid on nüüd valikulised. Neid saad hallata ülal paremal avanevast menüüst."; -"all_chats_onboarding_page_title1" = "Meie liidesel on nüüd uus vaade!"; "all_chats_nothing_found_placeholder_message" = "Proovi muuta oma otsingut."; "all_chats_nothing_found_placeholder_title" = "Mitte midagi ei leidu."; "all_chats_empty_unreads_placeholder_message" = "Kui sul on lugemata sõnumeid, siis nad on siit leitavad."; @@ -2640,3 +2632,32 @@ "poll_timeline_decryption_error" = "Krüptimisvigade tõttu jääb osa hääli lugemata"; "voice_message_broadcast_in_progress_title" = "Häälsõnumi salvestamine või esitamine ei õnnestu"; "voice_message_broadcast_in_progress_message" = "Kuna sa hetkel salvestad ringhäälingukõnet, siis häälsõnumi salvestamine või esitamine ei õnnestu. Selleks palun lõpeta ringhäälingukõne"; +"poll_timeline_ended_text" = "Küsitlus on lõppenud"; +"voice_broadcast_voip_cannot_start_description" = "Kuna sa hetkel salvestad ringhäälingukõnet, siis tavakõne algatamine ei õnnestu. Kõne alustamiseks palun lõpeta ringhäälingukõne."; +"voice_broadcast_voip_cannot_start_title" = "Kõne algatamine ei õnnestu"; +"poll_history_no_past_poll_text" = "Selles jututoas pole varasemaid küsitlusi"; +"poll_history_no_active_poll_text" = "Selles jututoas pole käimasolevaid küsitlusi"; +"poll_history_past_segment_title" = "Varasemad küsitlused"; +"poll_history_active_segment_title" = "Käimasolevad küsitlused"; + +// MARK: - Polls history + +"poll_history_title" = "Küsitluste ajalugu"; +"room_details_polls" = "Küsitluste ajalugu"; +"accessibility_selected" = "valitud"; +"voice_broadcast_playback_lock_screen_placeholder" = "Ringhäälingukõne"; +"voice_broadcast_connection_error_message" = "Kahjuks me ei saa hetkel salvestamist alustada. Palun proovi hiljem uuesti."; +"voice_broadcast_connection_error_title" = "Ühenduse viga"; +"wysiwyg_composer_format_action_quote" = "Lülita tsiteerimine sisse/välja"; +"wysiwyg_composer_format_action_code_block" = "Lülita koodiblokk sisse/välja"; +"wysiwyg_composer_format_action_ordered_list" = "Lülita nummerdatud loend sisse/välja"; +"wysiwyg_composer_format_action_unordered_list" = "Lülita täpploend sisse/välja"; +"voice_broadcast_recorder_connection_error" = "Viga võrguühenduses - salvestamine on peatatud"; +"poll_timeline_reply_ended_poll" = "Lõppenud küsitlus"; + +// MARK: - Launch loading + +"launch_loading_migrating_data" = "Tõstame andmeid ümber\n%@ %%"; +"settings_labs_disable_crypto_sdk" = "Uus Crypto SDK on kasutusel. Tema väljalülitamiseks palun paigalda rakendus uuesti"; +"settings_labs_confirm_crypto_sdk" = "Seda toimingut ei saa tagasi pöörata"; +"settings_labs_enable_crypto_sdk" = "Võta kasutusele uus Rust-keelel põhinev Crypto SDK"; diff --git a/Riot/Assets/fr.lproj/Vector.strings b/Riot/Assets/fr.lproj/Vector.strings index ed4a3820f..4d9490190 100644 --- a/Riot/Assets/fr.lproj/Vector.strings +++ b/Riot/Assets/fr.lproj/Vector.strings @@ -2440,7 +2440,6 @@ "room_access_space_chooser_other_spaces_section_info" = "Ce sont probablement des choses auxquelles les autres admins de %@ participent."; "authentication_choose_password_not_verified_message" = "Vérifiez votre boîte de réception"; "authentication_choose_password_not_verified_title" = "Email non vérifié"; -"all_chats_onboarding_page_title3" = "Donner mon avis"; // MARK: User sessions management @@ -2460,13 +2459,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Rien de neuf."; -"all_chats_onboarding_try_it" = "Essayez"; -"all_chats_onboarding_title" = "Quoi de neuf"; -"all_chats_onboarding_page_message3" = "Appuyez sur votre profil pour nous faire vos retours."; -"all_chats_onboarding_page_message2" = "Accédez à vos espaces (en bas à gauche) plus rapidement et facilement qu’avant."; -"all_chats_onboarding_page_title2" = "Accéder aux espaces"; -"all_chats_onboarding_page_message1" = "Pour simplifier Element, les onglets sont désormais facultatifs. Gérez les depuis le menu en haut à droite."; -"all_chats_onboarding_page_title1" = "Bienvenu dans une nouvelle vue !"; "all_chats_edit_menu_space_settings" = "Paramètres de l’espace"; "all_chats_edit_menu_leave_space" = "Quitter %@"; "all_chats_user_menu_settings" = "Paramètres utilisateur"; diff --git a/Riot/Assets/hu.lproj/Localizable.strings b/Riot/Assets/hu.lproj/Localizable.strings index 82161237e..fee155510 100644 --- a/Riot/Assets/hu.lproj/Localizable.strings +++ b/Riot/Assets/hu.lproj/Localizable.strings @@ -120,3 +120,6 @@ /* New video message from a specific person, not referencing a room. */ "VIDEO_FROM_USER" = "%@ videót küldött"; + +/* New voice broadcast from a specific person, not referencing a room. */ +"VOICE_BROADCAST_FROM_USER" = "%@ hang közvetítést indított"; diff --git a/Riot/Assets/hu.lproj/Vector.strings b/Riot/Assets/hu.lproj/Vector.strings index 53debbedb..1cfd48147 100644 --- a/Riot/Assets/hu.lproj/Vector.strings +++ b/Riot/Assets/hu.lproj/Vector.strings @@ -2467,14 +2467,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Semmi új."; -"all_chats_onboarding_try_it" = "Próbáld ki"; -"all_chats_onboarding_title" = "Újdonságok"; -"all_chats_onboarding_page_message3" = "Koppints a profilodra és mond el mit gondolsz."; -"all_chats_onboarding_page_title3" = "Visszajelzés adása"; -"all_chats_onboarding_page_message2" = "A terekhez való hozzáférés (balra lent) gyorsabb és egyszerűbb mint valaha."; -"all_chats_onboarding_page_title2" = "Hozzáférés a terekhez"; -"all_chats_onboarding_page_message1" = "Element egyszerűsítéséhez a lapok mostantól választhatók. Beállítani a jobb felső menüből lehet."; -"all_chats_onboarding_page_title1" = "Üdv az új kinézetben!"; "all_chats_nothing_found_placeholder_message" = "Próbáld meg a keresést módosítani."; "all_chats_nothing_found_placeholder_title" = "Nincs találat."; "all_chats_empty_unreads_placeholder_message" = "Ez az a hely ahol az olvasatlan üzeneteid megjelennek, ha lesznek."; @@ -2688,3 +2680,25 @@ "poll_timeline_decryption_error" = "Visszafejtési hibák miatt néhány szavazat nem kerül beszámításra"; "voice_message_broadcast_in_progress_message" = "Nem lehet hang üzenetet indítani élő közvetítés felvétele közben. Az élő közvetítés bejezése szükséges a hang üzenet indításához"; "voice_message_broadcast_in_progress_title" = "Hang üzenetet nem lehet elindítani"; +"poll_timeline_ended_text" = "Szavazás vége"; +"voice_broadcast_voip_cannot_start_description" = "Nem lehet hívást kezdeményezni élő közvetítés felvétele közben. Az élő közvetítés bejezése szükséges a hívás indításához."; +"voice_broadcast_voip_cannot_start_title" = "Nem sikerült hívást indítani"; +"poll_history_no_past_poll_text" = "Nincsenek régi szavazások ebben a szobában"; +"poll_history_no_active_poll_text" = "Nincsenek aktív szavazások ebben a szobában"; +"poll_history_past_segment_title" = "Régi szavazások"; +"poll_history_active_segment_title" = "Aktív szavazások"; + +// MARK: - Polls history + +"poll_history_title" = "Szavazás alakulása"; +"room_details_polls" = "Szavazás alakulása"; +"accessibility_selected" = "kiválasztva"; +"wysiwyg_composer_format_action_quote" = "Idézet be/ki"; +"wysiwyg_composer_format_action_code_block" = "Kód blokk be/ki"; +"wysiwyg_composer_format_action_ordered_list" = "Számozott lista ki-,bekapcsolása"; +"wysiwyg_composer_format_action_unordered_list" = "Lista ki-,bekapcsolása"; +"poll_timeline_reply_ended_poll" = "Lezárt szavazások"; +"voice_broadcast_recorder_connection_error" = "Kapcsolódási hiba – Felvétel szüneteltetve"; +"voice_broadcast_connection_error_message" = "Sajnos most nem lehet elindítani a felvételt. Próbálja meg később."; +"voice_broadcast_connection_error_title" = "Kapcsolat hiba"; +"voice_broadcast_playback_lock_screen_placeholder" = "Hang közvetítés"; diff --git a/Riot/Assets/id.lproj/Vector.strings b/Riot/Assets/id.lproj/Vector.strings index d6449680c..82ef32120 100644 --- a/Riot/Assets/id.lproj/Vector.strings +++ b/Riot/Assets/id.lproj/Vector.strings @@ -2672,14 +2672,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Belum ada yang baru."; -"all_chats_onboarding_try_it" = "Coba"; -"all_chats_onboarding_title" = "Apa yang baru"; -"all_chats_onboarding_page_message3" = "Ketuk profil Anda untuk memberi tahu kami bagaimana menurut Anda."; -"all_chats_onboarding_page_title3" = "Berikan Masukan"; -"all_chats_onboarding_page_message2" = "Akses Space Anda (di kiri bawah) dengan lebih cepat dan lebih mudah dari sebelumnya."; -"all_chats_onboarding_page_title2" = "Akses Space"; -"all_chats_onboarding_page_message1" = "Untuk membuat Element Anda lebih sederhana, fitur tab sekarang opsional. Kelola menggunakan menu kanan atas."; -"all_chats_onboarding_page_title1" = "Selamat datang di tampilan yang baru!"; "all_chats_nothing_found_placeholder_message" = "Coba atur pencarian Anda."; "all_chats_nothing_found_placeholder_title" = "Tidak ada yang ditemukan."; "all_chats_empty_unreads_placeholder_message" = "Ini di mana pesan Anda yang belum dibaca akan ditampilkan, ketika Anda menerimanya."; @@ -2893,5 +2885,34 @@ "notice_voice_broadcast_live" = "Siaran langsung"; "user_other_session_security_recommendation_title" = "Sesi lainnya"; "poll_timeline_decryption_error" = "Karena kesalahan enkripsi, beberapa suara mungkin tidak terhitung"; -"voice_message_broadcast_in_progress_message" = "Anda tidak dapat memulai sebuah pesan suara selagi Anda merekam sebuah siaran langsung. Silakan mengakhiri siaran langsung Anda untuk memulai merekam sebuah pesan suara"; +"voice_message_broadcast_in_progress_message" = "Anda tidak dapat memulai sebuah pesan suara karena Anda saat ini merekam sebuah siaran langsung. Silakan mengakhiri siaran langsung Anda untuk memulai merekam sebuah pesan suara"; "voice_message_broadcast_in_progress_title" = "Tidak dapat memulai pesan suara"; +"poll_timeline_ended_text" = "Mengakhiri pemungutan suara"; +"voice_broadcast_voip_cannot_start_description" = "Anda tidak dapat memulai sebuah panggilan karena Anda saat ini merekam sebuah siaran langsung. Mohon akhiri siaran langsung Anda untuk memulai sebuah panggilan."; +"voice_broadcast_voip_cannot_start_title" = "Tidak dapat memulai sebuah panggilan"; +"poll_history_no_past_poll_text" = "Tidak ada pemungutan suara masa lalu di ruangan ini"; +"poll_history_no_active_poll_text" = "Tidak ada pemungutan suara yang aktifk di ruangan ini"; +"poll_history_past_segment_title" = "Pemungutan suara sebelumnya"; +"poll_history_active_segment_title" = "Pemungutan suara aktif"; + +// MARK: - Polls history + +"poll_history_title" = "Riwayat pemungutan suara"; +"room_details_polls" = "Riwayat pemungutan suara"; +"accessibility_selected" = "dipilih"; +"voice_broadcast_playback_lock_screen_placeholder" = "Siaran suara"; +"wysiwyg_composer_format_action_quote" = "Saklar kutipan"; +"wysiwyg_composer_format_action_code_block" = "Saklar blok kode"; +"wysiwyg_composer_format_action_ordered_list" = "Saklar daftar bernomor"; +"wysiwyg_composer_format_action_unordered_list" = "Saklar daftar bulat"; +"voice_broadcast_connection_error_message" = "Sayangnya kami tidak dapat memulai sebuah rekaman saat ini. Silakan coba lagi nanti."; +"voice_broadcast_connection_error_title" = "Kesalahan koneksi"; +"voice_broadcast_recorder_connection_error" = "Kesalahan koneksi - Perekaman dijeda"; +"poll_timeline_reply_ended_poll" = "Pemungutan suara berakhir"; + +// MARK: - Launch loading + +"launch_loading_migrating_data" = "Memigrasikan data\n%@ %%"; +"settings_labs_disable_crypto_sdk" = "SDK Kripto diaktifkan. Untuk menonaktifkan, mohon memasang ulang aplikasi"; +"settings_labs_confirm_crypto_sdk" = "Tindakan ini tidak dapat diurungkan"; +"settings_labs_enable_crypto_sdk" = "Aktifkan SDK Kripto baru berbasis Rust"; diff --git a/Riot/Assets/is.lproj/Localizable.strings b/Riot/Assets/is.lproj/Localizable.strings index ec3fdaace..d47171514 100644 --- a/Riot/Assets/is.lproj/Localizable.strings +++ b/Riot/Assets/is.lproj/Localizable.strings @@ -170,3 +170,6 @@ /* Look, stuff's happened, alright? Just open the app. */ "MSGS_IN_TWO_PLUS_ROOMS" = "%@ ný skilaboð í %@, %@ og fleirum"; + +/* New voice broadcast from a specific person, not referencing a room. */ +"VOICE_BROADCAST_FROM_USER" = "%@ byrjaði talútsendingu"; diff --git a/Riot/Assets/is.lproj/Vector.strings b/Riot/Assets/is.lproj/Vector.strings index aba02e2d6..1a0e5981e 100644 --- a/Riot/Assets/is.lproj/Vector.strings +++ b/Riot/Assets/is.lproj/Vector.strings @@ -1283,7 +1283,7 @@ "settings_add_3pid_invalid_password_message" = "Ógild auðkenni"; "settings_add_3pid_password_title_msidsn" = "Bæta við símanúmeri"; "settings_add_3pid_password_title_email" = "Bæta við tölvupóstfangi"; -"settings_labs_enable_threads" = "Skilaboð í spjallþráðum"; +"settings_labs_enable_threads" = "Spjallþræðir skilaboða"; "settings_labs_enabled_polls" = "Kannanir"; "settings_integrations_allow_button" = "Sýsla með samþættingar"; "settings_new_keyword" = "Bæta við nýju stikkorði"; @@ -2132,7 +2132,6 @@ "user_sessions_overview_title" = "Setur"; "space_selector_create_space" = "Búa til svæði"; -"all_chats_onboarding_try_it" = "Prófaðu það"; "all_chats_edit_menu_space_settings" = "Stillingar svæðis"; "all_chats_edit_menu_leave_space" = "Yfirgefa %@"; "room_recents_recently_viewed_section" = "Nýlega skoðað"; @@ -2234,7 +2233,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Ekkert nýtt."; -"all_chats_onboarding_page_title1" = "Velkomin í nýja sýn!"; "all_chats_nothing_found_placeholder_message" = "Reyndu að aðlaga leitina þína."; "all_chats_edit_layout_alphabetical_order" = "Raða A-Ö"; "all_chats_edit_layout_activity_order" = "Raða eftir virkni"; @@ -2317,7 +2315,7 @@ "device_name_mobile" = "%@ fyrir farsíma"; "device_name_web" = "%@ á vefnum"; "device_name_desktop" = "%@ fyrir einkatölvur"; -"user_session_item_details" = "%@ · Síðasta virkni %@"; +"user_session_item_details" = "%1$@ · %2$@"; "location_sharing_live_loading" = "Hleð inn rauntímastaðsetningu..."; "location_sharing_live_list_item_time_left" = "%@ fór"; "location_sharing_map_credits_title" = "© Höfundarréttur"; @@ -2330,9 +2328,6 @@ // Mark: - Space Selector "space_selector_title" = "Svæðin mín"; -"all_chats_onboarding_title" = "Hvað er nýtt"; -"all_chats_onboarding_page_title3" = "Gefðu umsögn"; -"all_chats_onboarding_page_title2" = "Aðgangur að svæðum"; "all_chats_user_menu_settings" = "Notandastillingar"; "all_chats_edit_layout_pin_spaces_title" = "Festu svæðin þín"; @@ -2368,3 +2363,119 @@ // MARK: Authentication "authentication_registration_title" = "Búðu til aðganginn þinn"; +"notice_voice_broadcast_ended_by_you" = "Þú endaðir talútsendingu."; +"notice_voice_broadcast_ended" = "%@ endaði talútsendingu."; +"notice_voice_broadcast_live" = "Bein útsending"; +"deselect_all" = "Afvelja allt"; +"wysiwyg_composer_link_action_edit_title" = "Breyta tengli"; +"wysiwyg_composer_link_action_create_title" = "Búa til tengil"; +"wysiwyg_composer_link_action_link" = "Tengill"; + + + +// Links +"wysiwyg_composer_link_action_text" = "Texti"; +"wysiwyg_composer_start_action_voice_broadcast" = "Útvörpun tals"; +"wysiwyg_composer_start_action_text_formatting" = "Sníðing texta"; +"wysiwyg_composer_start_action_camera" = "Myndavél"; +"wysiwyg_composer_start_action_location" = "Staðsetning"; +"wysiwyg_composer_start_action_polls" = "Kannanir"; +"wysiwyg_composer_start_action_attachments" = "Viðhengi"; +"wysiwyg_composer_start_action_stickers" = "Límmerki"; + + +// MARK: - WYSIWYG Composer + +// Send Media Actions +"wysiwyg_composer_start_action_media_picker" = "Ljósmyndasafn"; +"user_session_overview_session_details_button_title" = "Nánar um setuna"; +"user_session_overview_session_title" = "Seta"; +"user_session_overview_current_session_title" = "Núverandi seta"; +"user_session_details_application_url" = "Slóð (URL)"; +"user_session_details_application_version" = "Útgáfa"; +"user_session_details_application_name" = "Heiti"; +"user_session_details_device_os" = "Stýrikerfi"; +"user_session_details_device_browser" = "Vafri"; +"user_session_details_device_model" = "Gerð"; +"user_session_details_device_ip_location" = "Staðsetning IP-vistfangs"; +"user_session_details_device_ip_address" = "IP-vistfang"; +"user_session_details_last_activity" = "Síðasta virkni"; +"user_session_details_session_id" = "Auðkenni setu"; +"user_session_details_session_name" = "Nafn á setu"; +"user_session_details_device_section_header" = "Tæki"; +"user_session_details_application_section_header" = "Forrit"; +"user_session_details_session_section_header" = "Seta"; +"user_session_details_title" = "Nánar um setuna"; +"device_type_name_unknown" = "Óþekkt"; +"device_type_name_mobile" = "Farsími"; +"device_type_name_web" = "Vefur"; +"device_type_name_desktop" = "Borðtölva"; +"user_other_session_selected_count" = "%@ valið"; +"user_other_session_clear_filter" = "Hreinsa síu"; +"user_other_session_no_unverified_sessions" = "Engar óstaðfestar setur fundust."; +"user_other_session_no_verified_sessions" = "Engar staðfestar setur fundust."; +"user_other_session_no_inactive_sessions" = "Engar óvirkar setur fundust."; +"user_other_session_filter_menu_inactive" = "Óvirkt"; +"user_other_session_filter_menu_unverified" = "Óstaðfestar"; +"user_other_session_filter_menu_verified" = "Staðfestar"; +"user_other_session_filter_menu_all" = "Allar setur"; +"user_other_session_filter" = "Sía"; +"user_other_session_security_recommendation_title" = "Aðrar setur"; +"user_session_inactive_session_title" = "Óvirkar setur"; +"user_session_unverified_session_title" = "Óstaðfest seta"; +"user_session_verified_session_title" = "Sannreyndar setur"; +"user_session_got_it" = "Náði því"; +"user_session_push_notifications" = "Ýti-tilkynningar"; +"user_session_verification_unknown_short" = "Óþekkt"; +"user_session_verification_unknown" = "Óþekkt staða sannvottunar"; +"user_sessions_view_all_action" = "Skoða öll (%d)"; +"user_sessions_overview_link_device" = "Tengja tæki"; +"user_sessions_overview_current_session_section_title" = "Núverandi seta"; +"user_sessions_hide_location_info" = "Fela IP-vistfang"; +"user_sessions_show_location_info" = "Birta IP-vistfang"; +"user_sessions_overview_other_sessions_section_title" = "Aðrar setur"; +"user_sessions_overview_security_recommendations_inactive_title" = "Óvirkar setur"; +"user_sessions_overview_security_recommendations_unverified_title" = "Óstaðfestar setur"; +"user_sessions_overview_security_recommendations_section_title" = "Ráðleggingar varðandi öryggi"; + +// MARK: User sessions management + +// Parameter is the application display name (e.g. "Element") +"user_sessions_default_session_display_name" = "%@ iOS"; +"location_sharing_live_lab_promotion_activation" = "Virkja deilingu rauntímastaðsetninga"; +"location_sharing_live_timer_incoming" = "Í beinni til %@"; +"poll_timeline_reply_ended_poll" = "Lauk könnun"; +"poll_timeline_ended_text" = "Lauk könnuninni"; +"poll_history_past_segment_title" = "Fyrri kannanir"; +"poll_history_active_segment_title" = "Virkar kannanir"; + +// MARK: - Polls history + +"poll_history_title" = "Breytingaskrá könnunar"; +"all_chats_user_menu_accessibility_label" = "Valmynd notandans"; +"voice_broadcast_connection_error_title" = "Villa í tengingu"; +"voice_broadcast_voip_cannot_start_title" = "Get ekki hafið símtal"; +"voice_broadcast_stop_alert_agree_button" = "Já, stöðva"; +"voice_broadcast_buffering" = "Hleð í biðminni..."; +"voice_broadcast_time_left" = "%@ eftir"; +"voice_broadcast_tile" = "Útvörpun tals"; +"voice_broadcast_live" = "Beint"; +"voice_broadcast_playback_lock_screen_placeholder" = "Útvörpun tals"; + +// Unverified sessions +"key_verification_alert_title" = "Þú ert með óstaðfestar setur"; +"sign_out_confirmation_message" = "Ertu viss um að þú viljir skrá þig út?"; + +// MARK: Sign out warning + +"sign_out" = "Skrá út"; +"secure_key_backup_setup_cancel_alert_message" = "Ef þú hættir við núna, geturðu tapað dulrituðum skilaboðum og gögnum ef þú missir aðgang að innskráningum þínum.\n\nÞú getur víka sett upp örugga afritun og sýslað með dulritunarlyklana þína í stillingunum."; +"room_details_polls" = "Breytingaskrá könnunar"; +"manage_session_sign_out_other_sessions" = "Skrá út úr öllum öðrum setum"; +"manage_session_rename" = "Endurnefna setu"; +"settings_labs_enable_voice_broadcast" = "Útvörpun tals"; +"authentication_qr_login_failure_retry" = "Reyna aftur"; +"authentication_qr_login_loading_connecting_device" = "Tengist við tæki"; +"authentication_qr_login_scan_title" = "Skanna QR-kóða"; +"authentication_qr_login_start_title" = "Skanna QR-kóða"; +"authentication_login_with_qr" = "Skrá inn með QR-kóða"; diff --git a/Riot/Assets/it.lproj/Localizable.strings b/Riot/Assets/it.lproj/Localizable.strings index bb8b3e707..3232ff2a4 100644 --- a/Riot/Assets/it.lproj/Localizable.strings +++ b/Riot/Assets/it.lproj/Localizable.strings @@ -118,3 +118,6 @@ /* New file message from a specific person, not referencing a room. */ "LOCATION_FROM_USER" = "%@ ha condiviso la sua posizione"; + +/* New voice broadcast from a specific person, not referencing a room. */ +"VOICE_BROADCAST_FROM_USER" = "%@ ha iniziato una trasmissione vocale"; diff --git a/Riot/Assets/it.lproj/Vector.strings b/Riot/Assets/it.lproj/Vector.strings index 35bd94c35..952758a08 100644 --- a/Riot/Assets/it.lproj/Vector.strings +++ b/Riot/Assets/it.lproj/Vector.strings @@ -2445,14 +2445,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Niente di nuovo."; -"all_chats_onboarding_try_it" = "Provalo"; -"all_chats_onboarding_title" = "Novità"; -"all_chats_onboarding_page_message3" = "Tocca il tuo profilo per farci sapere cosa ne pensi."; -"all_chats_onboarding_page_title3" = "Invia un feedback"; -"all_chats_onboarding_page_message2" = "Accedi ai tuoi spazi (in basso a sinistra) più velocemente e più facilmente che mai."; -"all_chats_onboarding_page_title2" = "Accedi agli spazi"; -"all_chats_onboarding_page_message1" = "Per semplificare Element, le schede ora sono opzionali. Gestiscile usando il menu in alto a destra."; -"all_chats_onboarding_page_title1" = "Benvenuti ad una nuova panoramica!"; "all_chats_nothing_found_placeholder_message" = "Prova a cambiare la tua ricerca."; "all_chats_nothing_found_placeholder_title" = "Non è stato trovato niente."; "all_chats_empty_unreads_placeholder_message" = "Qui è dove verranno mostrati i messaggi non letti, quando ne avrai qualcuno."; @@ -2665,3 +2657,28 @@ "notice_voice_broadcast_live" = "Trasmissione in diretta"; "wysiwyg_composer_format_action_inline_code" = "Applica formato codice interlinea"; "user_other_session_security_recommendation_title" = "Altre sessioni"; +"poll_timeline_ended_text" = "Sondaggio terminato"; +"poll_timeline_decryption_error" = "A causa di errori di decifrazione, alcuni voti potrebbero non venire contati"; +"voice_broadcast_voip_cannot_start_description" = "Non puoi avviare una chiamata perché stai registrando una trasmissione in diretta. Termina la trasmissione per potere iniziare una chiamata."; +"voice_broadcast_voip_cannot_start_title" = "Impossibile avviare una chiamata"; +"voice_message_broadcast_in_progress_title" = "Impossibile iniziare il messaggio vocale"; +"voice_message_broadcast_in_progress_message" = "Non puoi iniziare un messaggio vocale perché stai registrando una trasmissione in diretta. Termina la trasmissione per potere iniziare un messaggio vocale"; +"poll_history_no_past_poll_text" = "In questa stanza non ci sono sondaggi passati"; +"poll_history_no_active_poll_text" = "In questa stanza non ci sono sondaggi attivi"; +"poll_history_past_segment_title" = "Sondaggi passati"; +"poll_history_active_segment_title" = "Sondaggi attivi"; + +// MARK: - Polls history + +"poll_history_title" = "Cronologia sondaggi"; +"voice_broadcast_playback_lock_screen_placeholder" = "Trasmissione vocale"; +"room_details_polls" = "Cronologia sondaggi"; +"accessibility_selected" = "selezionato"; +"wysiwyg_composer_format_action_quote" = "Attiva/disattiva citazione"; +"wysiwyg_composer_format_action_code_block" = "Attiva/disattiva blocco di codice"; +"wysiwyg_composer_format_action_ordered_list" = "Attiva/disattiva elenco numerato"; +"wysiwyg_composer_format_action_unordered_list" = "Attiva/disattiva elenco puntato"; +"poll_timeline_reply_ended_poll" = "Sondaggio terminato"; +"voice_broadcast_recorder_connection_error" = "Errore di connessione - Registrazione in pausa"; +"voice_broadcast_connection_error_message" = "Sfortunatamente non riusciamo ad iniziare una registrazione al momento. Riprova più tardi."; +"voice_broadcast_connection_error_title" = "Errore di connessione"; diff --git a/Riot/Assets/ja.lproj/Vector.strings b/Riot/Assets/ja.lproj/Vector.strings index 88f0760ee..de3ff9574 100644 --- a/Riot/Assets/ja.lproj/Vector.strings +++ b/Riot/Assets/ja.lproj/Vector.strings @@ -1720,7 +1720,7 @@ "pin_protection_reset_alert_action_reset" = "リセット"; "authentication_recaptcha_title" = "あなたは人間ですか?"; "authentication_verify_msisdn_waiting_button" = "コードを再送信"; -"authentication_choose_password_submit_button" = "パスワードをリセット"; +"authentication_choose_password_submit_button" = "パスワードを再設定"; "authentication_choose_password_signout_all_devices" = "全ての端末からサインアウト"; "authentication_choose_password_text_field_placeholder" = "新しいパスワード"; "authentication_terms_title" = "プライバシーポリシー"; @@ -1763,13 +1763,13 @@ "home_context_menu_favourite" = "お気に入り"; "all_chats_user_menu_settings" = "ユーザー設定"; "all_chats_edit_layout_show_filters" = "フィルターを表示"; -"all_chats_edit_layout_show_recents" = "最近使用したものを表示"; +"all_chats_edit_layout_show_recents" = "最近の履歴を表示"; "all_chats_edit_layout_alphabetical_order" = "アルファベット順で並び替え"; "all_chats_edit_layout_activity_order" = "アクティビティで並び替え"; "space_selector_create_space" = "スペースを作成"; -"space_selector_empty_view_information" = "スペースは、ルームや連絡先をグループ化する方法です。以下からスペースを作成できます。"; +"space_selector_empty_view_information" = "スペースは、ルームと連絡先をまとめる方法です。はじめに、スペースを作成しましょう。"; "all_chats_all_filter" = "全て"; -"all_chats_edit_layout_recents" = "最近"; +"all_chats_edit_layout_recents" = "履歴"; "all_chats_edit_layout_unreads" = "未読"; "all_chats_section_title" = "チャット"; @@ -1799,3 +1799,4 @@ "service_terms_modal_information_title_identity_server" = "IDサーバー"; "location_sharing_invalid_power_level_message" = "位置情報(ライブ)の共有には適切な権限が必要です。"; "location_sharing_live_error" = "位置情報(ライブ)のエラー"; +"all_chats_edit_layout" = "レイアウトの設定"; diff --git a/Riot/Assets/nl.lproj/Vector.strings b/Riot/Assets/nl.lproj/Vector.strings index ab294231c..a814c281b 100644 --- a/Riot/Assets/nl.lproj/Vector.strings +++ b/Riot/Assets/nl.lproj/Vector.strings @@ -2605,14 +2605,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Niets nieuws."; -"all_chats_onboarding_try_it" = "Probeer het uit"; -"all_chats_onboarding_title" = "Wat is nieuw"; -"all_chats_onboarding_page_message3" = "Tik op je profiel om ons te laten weten wat je ervan vindt."; -"all_chats_onboarding_page_title3" = "Geef feedback"; -"all_chats_onboarding_page_message2" = "Krijg sneller en gemakkelijker toegang tot je Spaces (linksonder) dan ooit tevoren."; -"all_chats_onboarding_page_title2" = "Toegang tot spaces"; -"all_chats_onboarding_page_message1" = "Om je Element te vereenvoudigen, zijn tabbladen nu optioneel. Beheer ze met behulp van het menu rechtsboven."; -"all_chats_onboarding_page_title1" = "Welkom bij de nieuwe weergave!"; "all_chats_edit_menu_space_settings" = "Space instellingen"; "all_chats_edit_menu_leave_space" = "Verlaat %@"; "all_chats_user_menu_settings" = "Gebruikersinstellingen"; diff --git a/Riot/Assets/pl.lproj/Vector.strings b/Riot/Assets/pl.lproj/Vector.strings index 8532c4b4d..9106d3eea 100644 --- a/Riot/Assets/pl.lproj/Vector.strings +++ b/Riot/Assets/pl.lproj/Vector.strings @@ -2533,13 +2533,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Nic nowego."; -"all_chats_onboarding_try_it" = "Wypróbuj"; -"all_chats_onboarding_title" = "Co nowego"; -"all_chats_onboarding_page_message3" = "Dotknij swojego profilu by poinformować nas, co o tym sądzisz."; -"all_chats_onboarding_page_title3" = "Prześlij opinię"; -"all_chats_onboarding_page_message2" = "Uzyskaj dostęp do twoich przestrzeni (lewy dolny róg) szybciej i prościej niż kiedykolwiek."; -"all_chats_onboarding_page_message1" = "Aby uprościć korzystanie z Element, karty są teraz opcjonalne. Możesz nimi zarządzać w menu w prawym górnym rogu."; -"all_chats_onboarding_page_title1" = "Witaj w nowym widoku!"; "all_chats_edit_menu_space_settings" = "Ustawienia przestrzeni"; "all_chats_edit_menu_leave_space" = "Opuść %@"; "all_chats_user_menu_settings" = "Ustawienia użytkownika"; diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index 582951c39..0d9dbe5d9 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -2446,14 +2446,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Nada novo."; -"all_chats_onboarding_try_it" = "Experimentar"; -"all_chats_onboarding_title" = "O que tem de novo"; -"all_chats_onboarding_page_message3" = "Toque em seu perfil para nos deixar sabendo do que você acha."; -"all_chats_onboarding_page_title3" = "Dê Feedback"; -"all_chats_onboarding_page_message2" = "Acesse seus Espaços (esquerda fundo) mais rápido e fácil que jamais antes."; -"all_chats_onboarding_page_title2" = "Acesse Espaços"; -"all_chats_onboarding_page_message1" = "Para simplificar seu Element, abas são agora opcionais. Gerencie-as usando o menu direito topo."; -"all_chats_onboarding_page_title1" = "Boas vindas a uma nova visão!"; "all_chats_nothing_found_placeholder_message" = "Tente ajustar sua pesquisa."; "all_chats_nothing_found_placeholder_title" = "Nada encontrado."; "all_chats_empty_unreads_placeholder_message" = "Isto é onde suas mensagens não-lidas vão aparecer, quando você tiver algumas."; diff --git a/Riot/Assets/sk.lproj/Localizable.strings b/Riot/Assets/sk.lproj/Localizable.strings index 612c4f691..02c086065 100644 --- a/Riot/Assets/sk.lproj/Localizable.strings +++ b/Riot/Assets/sk.lproj/Localizable.strings @@ -168,3 +168,6 @@ /* New file message from a specific person, not referencing a room. */ "LOCATION_FROM_USER" = "%@ zdieľal/a svoju polohu"; + +/* New voice broadcast from a specific person, not referencing a room. */ +"VOICE_BROADCAST_FROM_USER" = "%@ začal/a hlasové vysielanie"; diff --git a/Riot/Assets/sk.lproj/Vector.strings b/Riot/Assets/sk.lproj/Vector.strings index 87edea36c..6d69e6c98 100644 --- a/Riot/Assets/sk.lproj/Vector.strings +++ b/Riot/Assets/sk.lproj/Vector.strings @@ -2668,14 +2668,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Nič nové."; -"all_chats_onboarding_try_it" = "Vyskúšajte si to"; -"all_chats_onboarding_title" = "Čo je nové"; -"all_chats_onboarding_page_message3" = "Ťuknite na svoj profil a dajte nám vedieť, čo si myslíte."; -"all_chats_onboarding_page_title3" = "Poskytnite spätnú väzbu"; -"all_chats_onboarding_page_title2" = "Prístup k priestorom"; -"all_chats_onboarding_page_message2" = "Získajte prístup k svojim priestorom (vľavo dole) rýchlejšie a jednoduchšie ako kedykoľvek predtým."; -"all_chats_onboarding_page_message1" = "Pre zjednodušenie vašej aplikácie Element, sú teraz karty voliteľné. Spravujte ich pomocou ponuky vpravo hore."; -"all_chats_onboarding_page_title1" = "Vitajte v novom zobrazení!"; "all_chats_nothing_found_placeholder_message" = "Skúste upraviť svoje hľadanie."; "all_chats_nothing_found_placeholder_title" = "Nič sa nenašlo."; "all_chats_empty_unreads_placeholder_message" = "Tu sa zobrazia neprečítané správy, ak nejaké máte."; @@ -2891,3 +2883,32 @@ "poll_timeline_decryption_error" = "Z dôvodu chýb v dešifrovaní sa niektoré hlasy nemusia započítať"; "voice_message_broadcast_in_progress_message" = "Nemôžete spustiť hlasovú správu, pretože práve nahrávate živé vysielanie. Ukončite prosím živé vysielanie, aby ste mohli začať nahrávať hlasovú správu"; "voice_message_broadcast_in_progress_title" = "Nemožno spustiť hlasovú správu"; +"poll_timeline_ended_text" = "Ukončil anketu"; +"voice_broadcast_voip_cannot_start_description" = "Nemôžete spustiť hovor, pretože práve nahrávate živé vysielanie. Ukončite živé vysielanie, aby ste mohli začať hovor."; +"voice_broadcast_voip_cannot_start_title" = "Nie je možné začať hovor"; +"poll_history_no_past_poll_text" = "V tejto miestnosti nie sú žiadne predchádzajúce ankety"; +"poll_history_no_active_poll_text" = "V tejto miestnosti nie sú žiadne aktívne ankety"; +"poll_history_past_segment_title" = "Predchádzajúce ankety"; +"poll_history_active_segment_title" = "Aktívne ankety"; + +// MARK: - Polls history + +"poll_history_title" = "História ankety"; +"room_details_polls" = "História ankety"; +"accessibility_selected" = "vybrané"; +"voice_broadcast_connection_error_message" = "Bohužiaľ teraz nemôžeme spustiť nahrávanie. Skúste to prosím neskôr."; +"voice_broadcast_connection_error_title" = "Chyba pripojenia"; +"voice_broadcast_playback_lock_screen_placeholder" = "Hlasové vysielanie"; +"wysiwyg_composer_format_action_quote" = "Prepínanie citácie"; +"wysiwyg_composer_format_action_code_block" = "Prepnutie bloku kódu"; +"wysiwyg_composer_format_action_ordered_list" = "Prepínanie číslovaného zoznamu"; +"wysiwyg_composer_format_action_unordered_list" = "Prepnúť zoznam s odrážkami"; +"voice_broadcast_recorder_connection_error" = "Chyba pripojenia - nahrávanie pozastavené"; +"poll_timeline_reply_ended_poll" = "Ukončená anketa"; + +// MARK: - Launch loading + +"launch_loading_migrating_data" = "Migrácia údajov\n%@ %%"; +"settings_labs_disable_crypto_sdk" = "Crypto SDK je povolené. Ak to chcete vypnúť, preinštalujte prosím aplikáciu"; +"settings_labs_confirm_crypto_sdk" = "Túto akciu nemožno vrátiť späť"; +"settings_labs_enable_crypto_sdk" = "Zapnúť nové Crypto SDK využívajúce Rust"; diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index f484f7275..eaa376f3a 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -2417,7 +2417,6 @@ // MARK: Authentication "authentication_registration_title" = "Krijoni llogarinë tuaj"; -"all_chats_onboarding_page_message3" = "Prekni profilin tuaj që të na bëni të ditur se ç’mendoni."; "all_chats_edit_layout_add_section_message" = "Fiksoni ndarje te kreu, për hyrje të lehtë në ta"; "room_event_encryption_info_key_authenticity_not_guaranteed" = "S’mund të garantohet mirëfilltësia e këtij mesazhi të fshehtëzuar në këtë pajisje."; "deselect_all" = "Shpërzgjidhi Krejt"; @@ -2534,13 +2533,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "S’ka gjë të re."; -"all_chats_onboarding_try_it" = "Provojeni"; -"all_chats_onboarding_title" = "Ç’ka të re"; -"all_chats_onboarding_page_title3" = "Jepni Përshtypje"; -"all_chats_onboarding_page_message2" = "Hyni në Hapësirat tuaja (poshtë djathtas) më shpejt dhe më kollaj se kurrë më parë."; -"all_chats_onboarding_page_title2" = "Hyni Në Hapësira"; -"all_chats_onboarding_page_message1" = "Që të thjeshtohet Element-i juaj, skedat tanimë janë opsionale. Administrojini duke përdorur menunë djathtas në krye."; -"all_chats_onboarding_page_title1" = "Mirë se vini te një pamje e re!"; "all_chats_edit_menu_space_settings" = "Rregullime hapësire"; "all_chats_edit_menu_leave_space" = "Braktise %@"; "all_chats_user_menu_settings" = "Rregullime përdoruesi"; @@ -2676,3 +2668,14 @@ "notice_voice_broadcast_ended" = "%@ përfundoi një transmetim zanor."; "notice_voice_broadcast_live" = "Transmetim i drejtëpërdrejtë"; "user_other_session_security_recommendation_title" = "Sesione të tjerë"; +"poll_timeline_ended_text" = "Përfundoi pyetësori"; +"poll_timeline_decryption_error" = "Për shkak gabimesh shfshehtëzimi, mund të mos jenë numëruar disa vota"; +"poll_history_no_past_poll_text" = "Në këtë dhomë s’ka pyetësorë të dikurshëm"; +"poll_history_no_active_poll_text" = "Në këtë dhomë s’ka pyetësorë aktivë"; +"poll_history_past_segment_title" = "Pyetësorë të dikurshëm"; +"poll_history_active_segment_title" = "Pyetësorë aktivë"; +"voice_broadcast_playback_lock_screen_placeholder" = "Transmetim zanor"; +"voice_broadcast_voip_cannot_start_description" = "S’mund të niset thirrje, ngaqë aktualisht po regjistroni një transmetim të drejtpërdrejtë. Ju lutemi, përfundoni transmetimin e drejtpërdrejtë, që të mund të nisni një thirrje."; +"voice_broadcast_voip_cannot_start_title" = "S’niset dot një thirrje"; +"voice_message_broadcast_in_progress_message" = "S’mund të niset mesazh zanor, ngaqë aktualisht po regjistroni një transmetim të drejtpërdrejtë. Ju lutemi, përfundoni transmetimin e drejtpërdrejtë, që të mund të nisni regjistrimin e një mesazhi zanor"; +"voice_message_broadcast_in_progress_title" = "S’niset dot mesazh zanor"; diff --git a/Riot/Assets/sv.lproj/Localizable.strings b/Riot/Assets/sv.lproj/Localizable.strings index 5b3e918dd..fc7c18b9e 100644 --- a/Riot/Assets/sv.lproj/Localizable.strings +++ b/Riot/Assets/sv.lproj/Localizable.strings @@ -118,3 +118,6 @@ /* New file message from a specific person, not referencing a room. */ "LOCATION_FROM_USER" = "%@ delade sin plats"; + +/* New voice broadcast from a specific person, not referencing a room. */ +"VOICE_BROADCAST_FROM_USER" = "%@ påbörjade en röstsändning"; diff --git a/Riot/Assets/sv.lproj/Vector.strings b/Riot/Assets/sv.lproj/Vector.strings index 53b8d822f..872645f66 100644 --- a/Riot/Assets/sv.lproj/Vector.strings +++ b/Riot/Assets/sv.lproj/Vector.strings @@ -2310,7 +2310,7 @@ "authentication_terms_policy_url_error" = "Kan inte hitta den valda policyn. Vänligen pröva igen senare."; /* The placeholder will show the homeserver's domain */ "authentication_terms_message" = "Vänligen läs villkor och policyer för %@"; -"authentication_terms_title" = "Serverpolicyer"; +"authentication_terms_title" = "Sekretesspolicyer"; "authentication_verify_msisdn_invalid_phone_number" = "Ogiltigt telefonnummer"; "authentication_verify_msisdn_waiting_button" = "Skicka kod igen"; /* The placeholder will show the phone number that was entered. */ @@ -2363,3 +2363,112 @@ // MARK: Authentication "authentication_registration_title" = "Skapa ditt konto"; +"voice_broadcast_time_left" = "%@ kvar"; +"all_chats_empty_list_placeholder_title" = "Du är ikapp."; +"all_chats_empty_view_information" = "Den säkra allt-i-ett-chattappen för lag, vänner och organisationer. Skapa en chatt, eller gå med i ett existerande rum, för att komma igång."; +"all_chats_empty_space_information" = "Utrymmen är ett nytt sätt att gruppera rum och personer. Lägg till ett existerande rum, eller skapa ett nytt, med knappen nere till höger."; +"all_chats_empty_view_title" = "%@\nser lite tom ut."; +"all_chats_all_filter" = "Alla"; +"all_chats_edit_layout_alphabetical_order" = "Sortera A-Ö"; +"all_chats_edit_layout_activity_order" = "Sortera efter aktivitet"; +"all_chats_edit_layout_show_filters" = "Visa filter"; +"all_chats_edit_layout_show_recents" = "Visa nyliga"; +"all_chats_edit_layout_sorting_options_title" = "Sortera meddelanden efter"; +"all_chats_edit_layout_pin_spaces_title" = "Fäst dina utrymmen"; +"all_chats_edit_layout_add_filters_message" = "Filtrera automatiskt dina meddelanden i valfria kategorier"; +"all_chats_edit_layout_add_filters_title" = "Filtrera dina meddelanden"; +"all_chats_edit_layout_add_section_message" = "Fäst sektioner till hem för enkel åtkomst"; +"all_chats_edit_layout_add_section_title" = "Lägg till sektion i hem"; +"all_chats_edit_layout_unreads" = "Olästa"; +"all_chats_edit_layout_recents" = "Nyliga"; +"all_chats_edit_layout" = "Layoutalternativ"; +"all_chats_section_title" = "Chattar"; + +// MARK: - All Chats + +"all_chats_title" = "Alla chattar"; +"voice_broadcast_voip_cannot_start_description" = "Du kan inte starta ett samtal eftersom att du för närvarande spelar in en direktsändning. Vänligen avsluta din direktsändning för att starta ett samtal."; +"voice_broadcast_voip_cannot_start_title" = "Kan inte starta ett samtal"; +"voice_broadcast_stop_alert_agree_button" = "Ja, avsluta"; +"voice_broadcast_stop_alert_description" = "Är du säker på att du vill avsluta din direktsändning? Det här kommer att avsluta sändningen, och den fulla inspelningen kommer att bli tillgänglig i rummet."; +"voice_broadcast_stop_alert_title" = "Avsluta direktsändning?"; +"voice_broadcast_buffering" = "Buffrar…"; +"voice_broadcast_tile" = "Röstsändning"; +"voice_broadcast_live" = "Live"; +"voice_broadcast_playback_loading_error" = "Kunde inte spela den här röstsändningen."; +"voice_broadcast_already_in_progress_message" = "Du spelar redan in en röstsändning. Vänligen avsluta din nuvarande röstsändning för att starta en ny."; +"voice_broadcast_blocked_by_someone_else_message" = "Någon annan spelar redan in en röstsändning. Vänta på att deras röstsändning avslutas för att starta en ny."; +"voice_broadcast_permission_denied_message" = "Du har inte behörigheten som krävs för att starta en röstsändning i det här rummet. Kontakta en rumsadministratör för att uppgradera din behörighet."; + +// MARK: - Voice Broadcast +"voice_broadcast_unauthorized_title" = "Du kan inte starta en ny röstsändning"; +"voice_message_broadcast_in_progress_message" = "Du kan inte starta ett röstmeddelande eftersom att du för närvarande spelar in en direktsändning. Vänligen avsluta din direktsändning för att börja spela in ett röstmeddelande"; +"voice_message_broadcast_in_progress_title" = "Kan inte starta röstmeddelande"; +"spaces_subspace_creation_visibility_message" = "Det skapade utrymmet kommer att läggas till i %@."; +"spaces_subspace_creation_visibility_title" = "Vad för sorts utrymme vill du skapa?"; +"spaces_explore_rooms_format" = "Utforska %@"; +"spaces_create_subspace_title" = "Skapa ett underutrymme"; +"spaces_add_subspace_title" = "Skapa utrymme inuti %@"; +"launch_loading_processing_response" = "Hanterar data\n%@ %%"; +"launch_loading_server_syncing_nth_attempt" = "Synkar med servern\n(%@ försök)"; + +// MARK: - Launch loading + +"launch_loading_server_syncing" = "Synkar med servern"; +"key_verification_alert_body" = "Granska för att försäkra att ditt konto är säkert."; + +// Unverified sessions +"key_verification_alert_title" = "Du har overifierade sessioner"; +"sign_out_confirmation_message" = "Är du säker på att du vill logga ut?"; + +// MARK: Sign out warning + +"sign_out" = "Logga ut"; +// User sessions management +"user_sessions_settings" = "Hantera sessioner"; +"manage_session_sign_out_other_sessions" = "Logga ut ur alla andra sessioner"; +"manage_session_rename" = "Döp om session"; +"manage_session_name_info_link" = "Läs mer"; +/* The placeholder will be replaces with manage_session_name_info_link */ +"manage_session_name_info" = "Observera att sessionsnamn också är synliga för personer du pratar med. %@"; +"manage_session_name_hint" = "Anpassade sessionsnamn kan hjälpa dig att känna igen dina enheter lättare."; +"settings_labs_enable_voice_broadcast" = "Röstsändning"; +"settings_labs_enable_wysiwyg_composer" = "Pröva den nya riktextredigeraren"; +"settings_labs_enable_new_app_layout" = "Ny applikationslayout"; +"settings_labs_enable_new_client_info_feature" = "Spara klientens namn, version och URL för att lättare känna igen sessioner i sessionshanteraren"; +"settings_labs_enable_new_session_manager" = "My sessionshanterare"; +"room_first_message_placeholder" = "Skicka ditt första meddelande…"; +"password_policy_pwd_in_dict_error" = "Det här lösenordet har hittats i en ordlista, och tillåts inte."; +"password_policy_weak_pwd_error" = "Det här lösenordet är för svagt. Det måste innehålla minst 8 tecken, och minst ett tecken av varje typ: stor bokstav, liten bokstav, siffra och specialtecken."; + +// MARK: Password policy errors +"password_policy_too_short_pwd_error" = "För kort lösenord"; +"authentication_qr_login_failure_retry" = "Pröva igen"; +"authentication_qr_login_failure_request_timed_out" = "Länkningen slutfördes inte inom den krävda tiden."; +"authentication_qr_login_failure_request_denied" = "Förfrågan nekades på en andra enheten."; +"authentication_qr_login_failure_invalid_qr" = "QR-kod är ogiltig."; +"authentication_qr_login_failure_title" = "Länkning misslyckades"; +"authentication_qr_login_loading_signed_in" = "Du är nu inloggad på din andra enhet."; +"authentication_qr_login_loading_waiting_signin" = "Väntar på att enheten loggar in."; +"authentication_qr_login_loading_connecting_device" = "Ansluter till enhet"; +"authentication_qr_login_confirm_alert" = "Vänligen försäkra att du känner till källan till den här koden. Genom att länka enheter så ger du någon full åtkomst till ditt konto."; +"authentication_qr_login_confirm_subtitle" = "Bekräfta att koden nedan matchar den andra enheten:"; +"authentication_qr_login_confirm_title" = "Säker kommunikation etablerad"; +"authentication_qr_login_scan_subtitle" = "Placera QR-koden i rutan nedan"; +"authentication_qr_login_scan_title" = "Skanna QR-kod"; +"authentication_qr_login_display_step2" = "Välj 'Logga in med QR-kod'"; +"authentication_qr_login_display_step1" = "Öppna Element på din andra enhet"; +"authentication_qr_login_display_subtitle" = "Skanna QR-koden nedan med din enhet som är utloggad."; +"authentication_qr_login_display_title" = "Länka en enhet"; +"authentication_qr_login_start_display_qr" = "Visa QR-kod på den här enheten"; +"authentication_qr_login_start_need_alternative" = "Behöver du en alternativ metod?"; +"authentication_qr_login_start_step4" = "Välj 'Visa QR-kod på den här enheten'"; +"authentication_qr_login_start_step3" = "Välj 'Länka en enhet'"; +"authentication_qr_login_start_step2" = "Gå till Inställningar -> Säkerhet & sekretess"; +"authentication_qr_login_start_step1" = "Öppna Element på den andra enheten"; +"authentication_qr_login_start_subtitle" = "Använd kameran på den här enheten för att skanna QR-koden som visas på den andra enheten:"; +"authentication_qr_login_start_title" = "Skanna QR-kod"; +"authentication_choose_password_not_verified_message" = "Kolla din inkorg"; +"authentication_choose_password_not_verified_title" = "E-post inte verifierad"; +"authentication_login_with_qr" = "Logga in med QR-kod"; +"invite_to" = "Bjud in till %@"; diff --git a/Riot/Assets/uk.lproj/Localizable.strings b/Riot/Assets/uk.lproj/Localizable.strings index 276df4c3e..90e0de28e 100644 --- a/Riot/Assets/uk.lproj/Localizable.strings +++ b/Riot/Assets/uk.lproj/Localizable.strings @@ -118,3 +118,6 @@ /* New file message from a specific person, not referencing a room. */ "LOCATION_FROM_USER" = "%@ надсилає дані про своє місцеперебування"; + +/* New voice broadcast from a specific person, not referencing a room. */ +"VOICE_BROADCAST_FROM_USER" = "%@ розпочинає голосову трансляцію"; diff --git a/Riot/Assets/uk.lproj/Vector.strings b/Riot/Assets/uk.lproj/Vector.strings index 96e8166d7..89455745f 100644 --- a/Riot/Assets/uk.lproj/Vector.strings +++ b/Riot/Assets/uk.lproj/Vector.strings @@ -2670,14 +2670,6 @@ // Mark: - Room invites "room_invites_empty_view_title" = "Нічого нового."; -"all_chats_onboarding_try_it" = "Спробувати"; -"all_chats_onboarding_title" = "Що нового"; -"all_chats_onboarding_page_message3" = "Торкніться свого профілю, щоб розповісти нам свою думку."; -"all_chats_onboarding_page_title3" = "Напишіть відгук"; -"all_chats_onboarding_page_message2" = "Отримуйте доступ до своїх просторів (унизу ліворуч) швидше та легше, ніж раніше."; -"all_chats_onboarding_page_title2" = "Доступ до просторів"; -"all_chats_onboarding_page_message1" = "Щоб спростити ваш Element, вкладки тепер необов’язкові. Керуйте ними у верхньому правому меню."; -"all_chats_onboarding_page_title1" = "Вітаємо в новому вигляді!"; "all_chats_nothing_found_placeholder_message" = "Спробуйте налаштувати пошук."; "all_chats_nothing_found_placeholder_title" = "Нічого не знайдено."; "all_chats_empty_unreads_placeholder_message" = "Тут з'являтимуться ваші непрочитані повідомлення, якщо вони є."; @@ -2893,3 +2885,32 @@ "poll_timeline_decryption_error" = "Через помилки під час розшифрування деякі голоси можуть бути не враховані"; "voice_message_broadcast_in_progress_title" = "Неможливо розпочати запис голосового повідомлення"; "voice_message_broadcast_in_progress_message" = "Ви не можете розпочати запис голосового повідомлення, оскільки зараз триває запис трансляції наживо. Будь ласка, завершіть трансляцію, щоб розпочати запис голосового повідомлення"; +"poll_timeline_ended_text" = "Опитування завершено"; +"voice_broadcast_voip_cannot_start_description" = "Ви не можете розпочати виклик, оскільки зараз відбувається запис трансляції наживо. Завершіть трансляцію, щоб розпочати виклик."; +"voice_broadcast_voip_cannot_start_title" = "Неможливо розпочати виклик"; +"poll_history_no_past_poll_text" = "У цій кімнаті немає минулих опитувань"; +"poll_history_no_active_poll_text" = "У цій кімнаті немає активних опитувань"; +"poll_history_past_segment_title" = "Минулі опитування"; +"poll_history_active_segment_title" = "Активні опитування"; + +// MARK: - Polls history + +"poll_history_title" = "Історія опитувань"; +"room_details_polls" = "Історія опитувань"; +"accessibility_selected" = "вибрано"; +"voice_broadcast_playback_lock_screen_placeholder" = "Голосові трансляції"; +"voice_broadcast_connection_error_message" = "На жаль, ми не можемо розпочати запис прямо зараз. Повторіть спробу пізніше."; +"voice_broadcast_connection_error_title" = "Помилка з'єднання"; +"wysiwyg_composer_format_action_quote" = "Перемкнути цитування"; +"wysiwyg_composer_format_action_code_block" = "Перемкнути блок коду"; +"wysiwyg_composer_format_action_ordered_list" = "Перемкнути на нумерований список"; +"wysiwyg_composer_format_action_unordered_list" = "Перемкнути на маркований список"; +"voice_broadcast_recorder_connection_error" = "Помилка з'єднання - Запис призупинено"; +"poll_timeline_reply_ended_poll" = "Завершене опитування"; + +// MARK: - Launch loading + +"launch_loading_migrating_data" = "Перенесення даних\n%@ %%"; +"settings_labs_disable_crypto_sdk" = "Crypto SDK увімкнено. Щоб вимкнути, перевстановіть застосунок"; +"settings_labs_confirm_crypto_sdk" = "Дію не можна скасувати"; +"settings_labs_enable_crypto_sdk" = "Увімкнути новий заснований на rust Crypto SDK"; diff --git a/Riot/Assets/zh_Hans.lproj/Localizable.strings b/Riot/Assets/zh_Hans.lproj/Localizable.strings index 1e13dc6f6..2b4f707e2 100644 --- a/Riot/Assets/zh_Hans.lproj/Localizable.strings +++ b/Riot/Assets/zh_Hans.lproj/Localizable.strings @@ -123,3 +123,6 @@ /* New file message from a specific person, not referencing a room. */ "LOCATION_FROM_USER" = "%@ 分享了他们的位置"; + +/* New voice broadcast from a specific person, not referencing a room. */ +"VOICE_BROADCAST_FROM_USER" = "%@开始语音广播"; diff --git a/Riot/Assets/zh_Hans.lproj/Vector.strings b/Riot/Assets/zh_Hans.lproj/Vector.strings index d7a775d4b..f7fd8166c 100644 --- a/Riot/Assets/zh_Hans.lproj/Vector.strings +++ b/Riot/Assets/zh_Hans.lproj/Vector.strings @@ -196,7 +196,7 @@ "room_event_action_copy" = "复制"; "room_event_action_quote" = "引用"; "room_event_action_redact" = "移除"; -"room_event_action_more" = "移动"; +"room_event_action_more" = "更多"; "room_event_action_share" = "分享"; "room_event_action_permalink" = "复制消息的链接"; "room_event_action_view_source" = "查看源数据"; @@ -2231,3 +2231,47 @@ "onboarding_congratulations_home_button" = "带我到主页"; "onboarding_use_case_message" = "我们将帮助你连接"; "invite_to" = "邀请到%@"; +"threads_empty_title" = "保持讨论的有条理性"; +"threads_action_my_threads" = "我的消息列"; +"threads_action_all_threads" = "所有消息列"; +"threads_title" = "消息列"; +"thread_copy_link_to_thread" = "将链接复制到消息列"; + +// MARK: Threads +"room_thread_title" = "消息列"; +"room_accessibility_record_voice_message_hint" = "双击并保持录音。"; +"room_accessibility_record_voice_message" = "录制语音消息"; +"room_accessibility_thread_more" = "更多"; +"room_accessibility_threads" = "消息列"; +"room_event_copy_link_info" = "链接已复制到剪贴板。"; +"room_event_action_reply_in_thread" = "消息列"; +"room_event_action_view_in_room" = "在房间浏览"; +"room_first_message_placeholder" = "发送您的第一条消息……"; +"room_participants_invite_prompt_to_msg" = "您确定要邀请%@ 到 %@吗?"; +"room_participants_leave_success" = "离开房间"; +"room_participants_leave_processing" = "离开"; +"search_filter_placeholder" = "过滤"; +"password_policy_pwd_in_dict_error" = "此密码已在字典中找到,不允许使用。"; +"password_policy_weak_pwd_error" = "此密码太弱了。它必须包含至少8个字符,每种类型至少有一个字符: 大写、小写、数字和特殊字符。"; + +// MARK: Password policy errors +"password_policy_too_short_pwd_error" = "密码过短"; +"authentication_qr_login_failure_retry" = "再试一次"; +"authentication_qr_login_failure_request_timed_out" = "连接没有在规定的时间内完成。"; +"authentication_qr_login_failure_request_denied" = "请求在另一个设备上被拒绝。"; +"authentication_qr_login_failure_invalid_qr" = "二维码无效。"; +"authentication_qr_login_failure_title" = "连接失败"; +"authentication_qr_login_loading_signed_in" = "您现在已经登录到另一个设备上。"; +"authentication_qr_login_loading_waiting_signin" = "等待设备登录。"; +"authentication_qr_login_loading_connecting_device" = "连接到设备"; +"authentication_qr_login_confirm_alert" = "请确保您知道此代码的来源。通过连接设备,您将为某人提供对您帐户的完全访问权限。"; +"authentication_qr_login_confirm_subtitle" = "确认下面的代码与您的其他设备匹配:"; +"authentication_qr_login_confirm_title" = "建立安全连接"; +"authentication_qr_login_scan_subtitle" = "将二维码放置在下面的方框中"; +"authentication_qr_login_scan_title" = "扫描二维码"; +"authentication_qr_login_display_step2" = "选择“以二维码登入”"; +"authentication_qr_login_display_step1" = "在您的其它设备中打开Element"; +"onboarding_splash_page_4_title_no_pun" = "为您的团队发送消息。"; +"user_session_learn_more" = "了解更多"; +"manage_session_name_info_link" = "了解更多"; +"threads_beta_information_link" = "了解更多"; diff --git a/Riot/Generated/Images.swift b/Riot/Generated/Images.swift index 5cbcab2e2..ccad26c35 100644 --- a/Riot/Generated/Images.swift +++ b/Riot/Generated/Images.swift @@ -22,9 +22,6 @@ internal typealias AssetImageTypeAlias = ImageAsset.Image internal class Asset: NSObject { @objcMembers @objc(AssetImages) internal class Images: NSObject { - internal static let allChatsOnboarding1 = ImageAsset(name: "all_chats_onboarding1") - internal static let allChatsOnboarding2 = ImageAsset(name: "all_chats_onboarding2") - internal static let allChatsOnboarding3 = ImageAsset(name: "all_chats_onboarding3") internal static let analyticsCheckmark = ImageAsset(name: "AnalyticsCheckmark") internal static let analyticsLogo = ImageAsset(name: "AnalyticsLogo") internal static let socialLoginButtonApple = ImageAsset(name: "social_login_button_apple") diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 456b9177f..96ff9ba79 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -211,38 +211,6 @@ public class VectorL10n: NSObject { public static var allChatsNothingFoundPlaceholderTitle: String { return VectorL10n.tr("Vector", "all_chats_nothing_found_placeholder_title") } - /// To simplify your Element, tabs are now optional. Manage them using the top-right menu. - public static var allChatsOnboardingPageMessage1: String { - return VectorL10n.tr("Vector", "all_chats_onboarding_page_message1") - } - /// Access your Spaces (bottom-left) faster and easier than ever before. - public static var allChatsOnboardingPageMessage2: String { - return VectorL10n.tr("Vector", "all_chats_onboarding_page_message2") - } - /// Tap your profile to let us know what you think. - public static var allChatsOnboardingPageMessage3: String { - return VectorL10n.tr("Vector", "all_chats_onboarding_page_message3") - } - /// Welcome to a new view! - public static var allChatsOnboardingPageTitle1: String { - return VectorL10n.tr("Vector", "all_chats_onboarding_page_title1") - } - /// Access Spaces - public static var allChatsOnboardingPageTitle2: String { - return VectorL10n.tr("Vector", "all_chats_onboarding_page_title2") - } - /// Give Feedback - public static var allChatsOnboardingPageTitle3: String { - return VectorL10n.tr("Vector", "all_chats_onboarding_page_title3") - } - /// What's new - public static var allChatsOnboardingTitle: String { - return VectorL10n.tr("Vector", "all_chats_onboarding_title") - } - /// Try it out - public static var allChatsOnboardingTryIt: String { - return VectorL10n.tr("Vector", "all_chats_onboarding_try_it") - } /// Chats public static var allChatsSectionTitle: String { return VectorL10n.tr("Vector", "all_chats_section_title") @@ -4854,6 +4822,9 @@ public class VectorL10n: NSObject { /// View poll in timeline public static var pollHistoryDetailViewInTimeline: String { return VectorL10n.tr("Vector", "poll_history_detail_view_in_timeline") + /// Load more polls + public static var pollHistoryLoadMore: String { + return VectorL10n.tr("Vector", "poll_history_load_more") } /// Displaying polls public static var pollHistoryLoadingText: String { diff --git a/Riot/Managers/Settings/RiotSettings.swift b/Riot/Managers/Settings/RiotSettings.swift index d9e64a1af..c6617ad10 100644 --- a/Riot/Managers/Settings/RiotSettings.swift +++ b/Riot/Managers/Settings/RiotSettings.swift @@ -408,11 +408,6 @@ final class RiotSettings: NSObject { @UserDefault(key: "lastNumberOfTrackedSpaces", defaultValue: nil, storage: defaults) var lastNumberOfTrackedSpaces: Int? - // MARK: - All Chats Onboarding - - @UserDefault(key: "allChatsOnboardingHasBeenDisplayed", defaultValue: false, storage: defaults) - var allChatsOnboardingHasBeenDisplayed - } // MARK: - RiotSettings notification constants diff --git a/Riot/Modules/Application/AppCoordinator.swift b/Riot/Modules/Application/AppCoordinator.swift index 8c84e8bb0..c356d0b86 100755 --- a/Riot/Modules/Application/AppCoordinator.swift +++ b/Riot/Modules/Application/AppCoordinator.swift @@ -100,14 +100,8 @@ final class AppCoordinator: NSObject, AppCoordinatorType { if AppDelegate.theDelegate().isOffline { self.splitViewCoordinator?.showAppStateIndicator(with: VectorL10n.networkOfflineTitle, icon: UIImage(systemName: "wifi.slash")) - - // Pause voice broadcast recording without sending pending events. - VoiceBroadcastRecorderProvider.shared.pauseRecordingOnError() } else { - self.splitViewCoordinator?.hideAppStateIndicator() - - // Send pause voice broadcast event. - VoiceBroadcastRecorderProvider.shared.pauseRecording() + self.splitViewCoordinator?.hideAppStateIndicator() } } diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index 7bf51dd46..a28ee037f 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -2216,9 +2216,6 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni // Logout all matrix account [[MXKAccountManager sharedManager] logoutWithCompletion:^{ - // We reset allChatsOnboardingHasBeenDisplayed flag on logout - RiotSettings.shared.allChatsOnboardingHasBeenDisplayed = NO; - if (completion) { completion (YES); diff --git a/Riot/Modules/Home/AllChats/AllChatsViewController.swift b/Riot/Modules/Home/AllChats/AllChatsViewController.swift index 4b7ff566c..d6bef4e8e 100644 --- a/Riot/Modules/Home/AllChats/AllChatsViewController.swift +++ b/Riot/Modules/Home/AllChats/AllChatsViewController.swift @@ -70,8 +70,6 @@ class AllChatsViewController: HomeViewController { private var isOnboardingCoordinatorPreparing: Bool = false - private var allChatsOnboardingCoordinatorBridgePresenter: AllChatsOnboardingCoordinatorBridgePresenter? - private var theme: Theme { ThemeService.shared().theme } @@ -181,10 +179,6 @@ class AllChatsViewController: HomeViewController { } AppDelegate.theDelegate().checkAppVersion() - - if BuildSettings.newAppLayoutEnabled && !RiotSettings.shared.allChatsOnboardingHasBeenDisplayed { - self.showAllChatsOnboardingScreen() - } } override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { @@ -674,20 +668,6 @@ class AllChatsViewController: HomeViewController { self.navigationController?.pushViewController(invitesViewController, animated: true) } - private func showAllChatsOnboardingScreen() { - let allChatsOnboardingCoordinatorBridgePresenter = AllChatsOnboardingCoordinatorBridgePresenter() - allChatsOnboardingCoordinatorBridgePresenter.completion = { [weak self] in - RiotSettings.shared.allChatsOnboardingHasBeenDisplayed = true - - guard let self = self else { return } - self.allChatsOnboardingCoordinatorBridgePresenter?.dismiss(animated: true, completion: { - self.allChatsOnboardingCoordinatorBridgePresenter = nil - }) - } - - allChatsOnboardingCoordinatorBridgePresenter.present(from: self, animated: true) - self.allChatsOnboardingCoordinatorBridgePresenter = allChatsOnboardingCoordinatorBridgePresenter - } } private extension AllChatsViewController { diff --git a/Riot/Modules/Room/RoomViewController.m b/Riot/Modules/Room/RoomViewController.m index a1a0b6b6c..3792fee64 100644 --- a/Riot/Modules/Room/RoomViewController.m +++ b/Riot/Modules/Room/RoomViewController.m @@ -4302,8 +4302,14 @@ static CGSize kThreadListBarButtonItemImageSize; [self startActivityIndicator]; + NSArray* relationTypes = nil; + // If it's a voice broadcast, delete the selected event and all related events. + if (selectedEvent.eventType == MXEventTypeCustom && [selectedEvent.type isEqualToString:VoiceBroadcastSettings.voiceBroadcastInfoContentKeyType]) { + relationTypes = @[MXEventRelationTypeReference]; + } + MXWeakify(self); - [self.roomDataSource.room redactEvent:selectedEvent.eventId reason:nil success:^{ + [self.roomDataSource.room redactEvent:selectedEvent.eventId withRelations:relationTypes reason:nil success:^{ MXStrongifyAndReturnIfNil(self); [self stopActivityIndicator]; } failure:^(NSError *error) { diff --git a/Riot/Modules/Room/Settings/RoomSettingsViewController.m b/Riot/Modules/Room/Settings/RoomSettingsViewController.m index d042a5f18..d958bd2e8 100644 --- a/Riot/Modules/Room/Settings/RoomSettingsViewController.m +++ b/Riot/Modules/Room/Settings/RoomSettingsViewController.m @@ -52,8 +52,7 @@ enum ROOM_SETTINGS_MAIN_SECTION_ROW_TOPIC, ROOM_SETTINGS_MAIN_SECTION_ROW_TAG, ROOM_SETTINGS_MAIN_SECTION_ROW_DIRECT_CHAT, - ROOM_SETTINGS_MAIN_SECTION_ROW_MUTE_NOTIFICATIONS, - ROOM_SETTINGS_MAIN_SECTION_ROW_LEAVE + ROOM_SETTINGS_MAIN_SECTION_ROW_MUTE_NOTIFICATIONS }; enum @@ -515,7 +514,6 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti { [sectionMain addRowWithTag:ROOM_SETTINGS_MAIN_SECTION_ROW_MUTE_NOTIFICATIONS]; } - [sectionMain addRowWithTag:ROOM_SETTINGS_MAIN_SECTION_ROW_LEAVE]; [tmpSections addObject:sectionMain]; if (RiotSettings.shared.roomSettingsScreenAllowChangingAccessSettings) @@ -2325,22 +2323,6 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti cell = favoriteCell; } } - else if (row == ROOM_SETTINGS_MAIN_SECTION_ROW_LEAVE) - { - MXKTableViewCellWithButton *leaveCell = [tableView dequeueReusableCellWithIdentifier:[MXKTableViewCellWithButton defaultReuseIdentifier] forIndexPath:indexPath]; - - NSString* title = [VectorL10n leave]; - - [leaveCell.mxkButton setTitle:title forState:UIControlStateNormal]; - [leaveCell.mxkButton setTitle:title forState:UIControlStateHighlighted]; - [leaveCell.mxkButton setTintColor:ThemeService.shared.theme.tintColor]; - leaveCell.mxkButton.titleLabel.font = [UIFont systemFontOfSize:17]; - - [leaveCell.mxkButton removeTarget:self action:nil forControlEvents:UIControlEventTouchUpInside]; - [leaveCell.mxkButton addTarget:self action:@selector(onLeave:) forControlEvents:UIControlEventTouchUpInside]; - - cell = leaveCell; - } } else if (section == SECTION_TAG_ACCESS) { @@ -3196,76 +3178,6 @@ NSString *const kRoomSettingsAdvancedE2eEnabledCellViewIdentifier = @"kRoomSetti #pragma mark - actions -- (void)onLeave:(id)sender -{ - // Prompt user before leaving the room - __weak typeof(self) weakSelf = self; - - [currentAlert dismissViewControllerAnimated:NO completion:nil]; - - NSString *title, *message; - if ([self.mainSession roomWithRoomId:self.roomId].isDirect) - { - title = [VectorL10n roomParticipantsLeavePromptTitleForDm]; - message = [VectorL10n roomParticipantsLeavePromptMsgForDm]; - } - else - { - title = [VectorL10n roomParticipantsLeavePromptTitle]; - message = [VectorL10n roomParticipantsLeavePromptMsg]; - } - - currentAlert = [UIAlertController alertControllerWithTitle:title - message:message - preferredStyle:UIAlertControllerStyleAlert]; - - [currentAlert addAction:[UIAlertAction actionWithTitle:[VectorL10n cancel] - style:UIAlertActionStyleCancel - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - } - - }]]; - - [currentAlert addAction:[UIAlertAction actionWithTitle:[VectorL10n leave] - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - - [self startActivityIndicator]; - [self->mxRoom leave:^{ - - if (self.delegate) { - [self.delegate roomSettingsViewControllerDidLeaveRoom:self]; - } else { - [[LegacyAppDelegate theDelegate] restoreInitialDisplay:nil]; - } - - } failure:^(NSError *error) { - - [self stopActivityIndicator]; - - MXLogDebug(@"[RoomSettingsViewController] Leave room failed"); - // Alert user - [[AppDelegate theDelegate] showErrorAsAlert:error]; - - }]; - } - - }]]; - - [currentAlert mxk_setAccessibilityIdentifier:@"RoomSettingsVCLeaveAlert"]; - [self presentViewController:currentAlert animated:YES completion:nil]; -} - - (void)onRoomAvatarTap:(UITapGestureRecognizer *)recognizer { SingleImagePickerPresenter *singleImagePickerPresenter = [[SingleImagePickerPresenter alloc] initWithSession:self.mainSession]; diff --git a/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastService.swift b/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastService.swift index c41d5d37d..66bd6dd57 100644 --- a/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastService.swift +++ b/Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastService.swift @@ -298,7 +298,7 @@ extension MXRoom { threadId: String? = nil, sequence: UInt, success: @escaping ((String?) -> Void), - failure: @escaping ((Error?) -> Void)) -> MXHTTPOperation? { + failure: @escaping ((Swift.Error?) -> Void)) -> MXHTTPOperation? { guard let relatesTo = MXEventContentRelatesTo(relationType: MXEventRelationTypeReference, eventId: voiceBroadcastId).jsonDictionary() as? [String: Any] else { failure(VoiceBroadcastServiceError.unknown) diff --git a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/AllChatsOnboardingModels.swift b/RiotSwiftUI/Modules/Room/AllChatsOnboarding/AllChatsOnboardingModels.swift deleted file mode 100644 index 76beb1205..000000000 --- a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/AllChatsOnboardingModels.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// Copyright 2021 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import Foundation -import UIKit - -// MARK: - Coordinator - -// MARK: View model - -enum AllChatsOnboardingViewModelResult { - case cancel -} - -// MARK: View - -struct AllChatsOnboardingPageData: Identifiable { - let id = UUID().uuidString - let image: UIImage - let title: String - let message: String -} - -struct AllChatsOnboardingViewState: BindableState { - let pages: [AllChatsOnboardingPageData] -} - -enum AllChatsOnboardingViewAction { - case cancel -} diff --git a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/AllChatsOnboardingViewModel.swift b/RiotSwiftUI/Modules/Room/AllChatsOnboarding/AllChatsOnboardingViewModel.swift deleted file mode 100644 index 0ba19872a..000000000 --- a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/AllChatsOnboardingViewModel.swift +++ /dev/null @@ -1,63 +0,0 @@ -// -// Copyright 2021 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import Combine -import SwiftUI - -typealias AllChatsOnboardingViewModelType = StateStoreViewModel - -class AllChatsOnboardingViewModel: AllChatsOnboardingViewModelType, AllChatsOnboardingViewModelProtocol { - // MARK: - Properties - - // MARK: Private - - // MARK: Public - - var completion: ((AllChatsOnboardingViewModelResult) -> Void)? - - // MARK: - Setup - - static func makeAllChatsOnboardingViewModel() -> AllChatsOnboardingViewModelProtocol { - AllChatsOnboardingViewModel() - } - - private init() { - super.init(initialViewState: Self.defaultState()) - } - - private static func defaultState() -> AllChatsOnboardingViewState { - AllChatsOnboardingViewState(pages: [ - AllChatsOnboardingPageData(image: Asset.Images.allChatsOnboarding1.image, - title: VectorL10n.allChatsOnboardingPageTitle1, - message: VectorL10n.allChatsOnboardingPageMessage1), - AllChatsOnboardingPageData(image: Asset.Images.allChatsOnboarding2.image, - title: VectorL10n.allChatsOnboardingPageTitle2, - message: VectorL10n.allChatsOnboardingPageMessage2), - AllChatsOnboardingPageData(image: Asset.Images.allChatsOnboarding3.image, - title: VectorL10n.allChatsOnboardingPageTitle3, - message: VectorL10n.allChatsOnboardingPageMessage3) - ]) - } - - // MARK: - Public - - override func process(viewAction: AllChatsOnboardingViewAction) { - switch viewAction { - case .cancel: - completion?(.cancel) - } - } -} diff --git a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/AllChatsOnboardingViewModelProtocol.swift b/RiotSwiftUI/Modules/Room/AllChatsOnboarding/AllChatsOnboardingViewModelProtocol.swift deleted file mode 100644 index dd963c407..000000000 --- a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/AllChatsOnboardingViewModelProtocol.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright 2021 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import Foundation - -protocol AllChatsOnboardingViewModelProtocol { - var completion: ((AllChatsOnboardingViewModelResult) -> Void)? { get set } - static func makeAllChatsOnboardingViewModel() -> AllChatsOnboardingViewModelProtocol - var context: AllChatsOnboardingViewModelType.Context { get } -} diff --git a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/Coordinator/AllChatsOnboardingCoordinator.swift b/RiotSwiftUI/Modules/Room/AllChatsOnboarding/Coordinator/AllChatsOnboardingCoordinator.swift deleted file mode 100644 index df189c144..000000000 --- a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/Coordinator/AllChatsOnboardingCoordinator.swift +++ /dev/null @@ -1,92 +0,0 @@ -// -// Copyright 2021 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import CommonKit -import SwiftUI - -/// All Chats onboarding screen -final class AllChatsOnboardingCoordinator: NSObject, Coordinator, Presentable { - // MARK: - Properties - - // MARK: Private - - private let hostingController: UIViewController - private var viewModel: AllChatsOnboardingViewModelProtocol - - private var indicatorPresenter: UserIndicatorTypePresenterProtocol - private var loadingIndicator: UserIndicator? - - // MARK: Public - - // Must be used only internally - var childCoordinators: [Coordinator] = [] - var completion: (() -> Void)? - - // MARK: - Setup - - override init() { - let viewModel = AllChatsOnboardingViewModel.makeAllChatsOnboardingViewModel() - let view = AllChatsOnboarding(viewModel: viewModel.context) - self.viewModel = viewModel - hostingController = VectorHostingController(rootView: view) - indicatorPresenter = UserIndicatorTypePresenter(presentingViewController: hostingController) - - super.init() - - hostingController.presentationController?.delegate = self - } - - // MARK: - Public - - func start() { - MXLog.debug("[AllChatsOnboardingCoordinator] did start.") - viewModel.completion = { [weak self] result in - guard let self = self else { return } - MXLog.debug("[AllChatsOnboardingCoordinator] AllChatsOnboardingViewModel did complete with result: \(result).") - switch result { - case .cancel: - self.completion?() - } - } - } - - func toPresentable() -> UIViewController { - hostingController - } - - // MARK: - Private - - /// Show an activity indicator whilst loading. - /// - Parameters: - /// - label: The label to show on the indicator. - /// - isInteractionBlocking: Whether the indicator should block any user interaction. - private func startLoading(label: String = VectorL10n.loading, isInteractionBlocking: Bool = true) { - loadingIndicator = indicatorPresenter.present(.loading(label: label, isInteractionBlocking: isInteractionBlocking)) - } - - /// Hide the currently displayed activity indicator. - private func stopLoading() { - loadingIndicator = nil - } -} - -// MARK: - UIAdaptivePresentationControllerDelegate - -extension AllChatsOnboardingCoordinator: UIAdaptivePresentationControllerDelegate { - func presentationControllerDidDismiss(_ presentationController: UIPresentationController) { - completion?() - } -} diff --git a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/Coordinator/AllChatsOnboardingCoordinatorBridgePresenter.swift b/RiotSwiftUI/Modules/Room/AllChatsOnboarding/Coordinator/AllChatsOnboardingCoordinatorBridgePresenter.swift deleted file mode 100644 index 75977054d..000000000 --- a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/Coordinator/AllChatsOnboardingCoordinatorBridgePresenter.swift +++ /dev/null @@ -1,63 +0,0 @@ -// -// Copyright 2022 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import Foundation - -@objc protocol AllChatsOnboardingCoordinatorBridgePresenterDelegate { - func allChatsOnboardingCoordinatorBridgePresenterDidCancel(_ coordinatorBridgePresenter: AllChatsOnboardingCoordinatorBridgePresenter) -} - -/// `AllChatsOnboardingCoordinatorBridgePresenter` enables to start `AllChatsOnboardingCoordinator` from a view controller. -/// This bridge is used while waiting for global usage of coordinator pattern. -/// It breaks the Coordinator abstraction and it has been introduced for Objective-C compatibility (mainly for integration in legacy view controllers). -/// Each bridge should be removed once the underlying Coordinator has been integrated by another Coordinator. -@objcMembers -final class AllChatsOnboardingCoordinatorBridgePresenter: NSObject { - // MARK: - Properties - - // MARK: Private - - private var coordinator: AllChatsOnboardingCoordinator? - - // MARK: Public - - var completion: (() -> Void)? - - // MARK: - Public - - func present(from viewController: UIViewController, animated: Bool) { - let coordinator = AllChatsOnboardingCoordinator() - coordinator.completion = { [weak self] in - guard let self = self else { return } - self.completion?() - } - let presentable = coordinator.toPresentable() - viewController.present(presentable, animated: animated, completion: nil) - coordinator.start() - - self.coordinator = coordinator - } - - func dismiss(animated: Bool, completion: (() -> Void)?) { - guard let coordinator = coordinator else { - return - } - coordinator.toPresentable().dismiss(animated: animated) { - self.coordinator = nil - completion?() - } - } -} diff --git a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/View/AllChatsOnboarding.swift b/RiotSwiftUI/Modules/Room/AllChatsOnboarding/View/AllChatsOnboarding.swift deleted file mode 100644 index 513cc55a3..000000000 --- a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/View/AllChatsOnboarding.swift +++ /dev/null @@ -1,80 +0,0 @@ -// -// Copyright 2021 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import SwiftUI - -struct AllChatsOnboarding: View { - // MARK: - Properties - - // MARK: Private - - @Environment(\.theme) private var theme: ThemeSwiftUI - @State private var selectedTab = 0 - - // MARK: Public - - @ObservedObject var viewModel: AllChatsOnboardingViewModel.Context - - var body: some View { - VStack { - Text(VectorL10n.allChatsOnboardingTitle) - .font(theme.fonts.title3SB) - .foregroundColor(theme.colors.primaryContent) - .padding() - TabView(selection: $selectedTab) { - ForEach(viewModel.viewState.pages.indices, id: \.self) { index in - let page = viewModel.viewState.pages[index] - AllChatsOnboardingPage(image: page.image, - title: page.title, - message: page.message) - .tag(index) - } - } - .tabViewStyle(PageTabViewStyle(indexDisplayMode: .automatic)) - .indexViewStyle(.page(backgroundDisplayMode: .always)) - - Button { onCallToAction() } label: { - Text(selectedTab == viewModel.viewState.pages.count - 1 ? VectorL10n.allChatsOnboardingTryIt : VectorL10n.next) - .animation(nil) - } - .buttonStyle(PrimaryActionButtonStyle()) - .padding() - } - .background(theme.colors.background.ignoresSafeArea()) - .frame(maxHeight: .infinity) - } - - // MARK: - Private - - private func onCallToAction() { - if selectedTab == viewModel.viewState.pages.count - 1 { - viewModel.send(viewAction: .cancel) - } else { - withAnimation { - selectedTab += 1 - } - } - } -} - -// MARK: - Previews - -struct AllChatsOnboarding_Previews: PreviewProvider { - static var previews: some View { - AllChatsOnboarding(viewModel: AllChatsOnboardingViewModel.makeAllChatsOnboardingViewModel().context).theme(.light).preferredColorScheme(.light) - AllChatsOnboarding(viewModel: AllChatsOnboardingViewModel.makeAllChatsOnboardingViewModel().context).theme(.dark).preferredColorScheme(.dark) - } -} diff --git a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/View/AllChatsOnboardingPage.swift b/RiotSwiftUI/Modules/Room/AllChatsOnboarding/View/AllChatsOnboardingPage.swift deleted file mode 100644 index c6a5f06fa..000000000 --- a/RiotSwiftUI/Modules/Room/AllChatsOnboarding/View/AllChatsOnboardingPage.swift +++ /dev/null @@ -1,62 +0,0 @@ -// -// Copyright 2022 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import SwiftUI - -struct AllChatsOnboardingPage: View { - // MARK: - Properties - - let image: UIImage - let title: String - let message: String - - // MARK: Private - - @Environment(\.theme) private var theme: ThemeSwiftUI - - var body: some View { - VStack { - Spacer() - Image(uiImage: image) - Spacer() - Text(title) - .font(theme.fonts.title2B) - .foregroundColor(theme.colors.primaryContent) - .padding(.bottom, 16) - Text(message) - .multilineTextAlignment(.center) - .font(theme.fonts.callout) - .foregroundColor(theme.colors.primaryContent) - Spacer() - } - .padding(.horizontal) - } -} - -// MARK: - Previews - -struct AllChatsOnboardingPage_Previews: PreviewProvider { - static var previews: some View { - preview.theme(.light).preferredColorScheme(.light) - preview.theme(.dark).preferredColorScheme(.dark) - } - - private static var preview: some View { - AllChatsOnboardingPage(image: Asset.Images.allChatsOnboarding1.image, - title: VectorL10n.allChatsOnboardingPageTitle1, - message: VectorL10n.allChatsOnboardingPageMessage1) - } -} diff --git a/RiotSwiftUI/Modules/Room/PollHistory/MockPollHistoryScreenState.swift b/RiotSwiftUI/Modules/Room/PollHistory/MockPollHistoryScreenState.swift index 4fc9f6cef..d939dab2f 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/MockPollHistoryScreenState.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/MockPollHistoryScreenState.swift @@ -47,17 +47,17 @@ enum MockPollHistoryScreenState: MockScreenState, CaseIterable { pollHistoryMode = .past case .activeEmpty: pollHistoryMode = .active - pollService.nextPublisher = Empty(completeImmediately: true, + pollService.nextBatchPublisher = Empty(completeImmediately: true, outputType: TimelinePollDetails.self, failureType: Error.self).eraseToAnyPublisher() case .pastEmpty: pollHistoryMode = .past - pollService.nextPublisher = Empty(completeImmediately: true, + pollService.nextBatchPublisher = Empty(completeImmediately: true, outputType: TimelinePollDetails.self, failureType: Error.self).eraseToAnyPublisher() case .loading: pollHistoryMode = .active - pollService.nextPublisher = Empty(completeImmediately: false, + pollService.nextBatchPublisher = Empty(completeImmediately: false, outputType: TimelinePollDetails.self, failureType: Error.self).eraseToAnyPublisher() } diff --git a/RiotSwiftUI/Modules/Room/PollHistory/PollHistoryViewModel.swift b/RiotSwiftUI/Modules/Room/PollHistory/PollHistoryViewModel.swift index 230bef3b6..0d1834c73 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/PollHistoryViewModel.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/PollHistoryViewModel.swift @@ -51,7 +51,7 @@ private extension PollHistoryViewModel { state.isLoading = true pollService - .next() + .nextBatch() .collect() .sink { [weak self] _ in #warning("Handle errors") @@ -69,7 +69,7 @@ private extension PollHistoryViewModel { pollService .updates .sink { [weak self] detail in - self?.updatePolls(with: detail) + self?.update(poll: detail) self?.updateViewState() } .store(in: &subcriptions) @@ -82,7 +82,7 @@ private extension PollHistoryViewModel { .store(in: &subcriptions) } - func updatePolls(with poll: TimelinePollDetails) { + func update(poll: TimelinePollDetails) { guard let pollIndex = polls?.firstIndex(where: { $0.id == poll.id }) else { return } @@ -103,3 +103,20 @@ private extension PollHistoryViewModel { state.polls = renderedPolls?.sorted(by: { $0.startDate > $1.startDate }) } } + +extension PollHistoryViewModel.Context { + var emptyPollsText: String { + let days = PollHistoryConstants.chunkSizeInDays + + switch (viewState.bindings.mode, viewState.canLoadMoreContent) { + case (.active, true): + return VectorL10n.pollHistoryNoActivePollPeriodText("\(days)") + case (.active, false): + return VectorL10n.pollHistoryNoActivePollText + case (.past, true): + return VectorL10n.pollHistoryNoPastPollPeriodText("\(days)") + case (.past, false): + return VectorL10n.pollHistoryNoPastPollText + } + } +} diff --git a/RiotSwiftUI/Modules/Room/PollHistory/Service/MatrixSDK/PollHistoryService.swift b/RiotSwiftUI/Modules/Room/PollHistory/Service/MatrixSDK/PollHistoryService.swift index 3afd48887..a57731cdd 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/Service/MatrixSDK/PollHistoryService.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/Service/MatrixSDK/PollHistoryService.swift @@ -48,7 +48,7 @@ final class PollHistoryService: PollHistoryServiceProtocol { setup(timeline: timeline) } - func next() -> AnyPublisher { + func nextBatch() -> AnyPublisher { currentBatchSubject?.eraseToAnyPublisher() ?? startPagination() } } diff --git a/RiotSwiftUI/Modules/Room/PollHistory/Service/Mock/MockPollHistoryService.swift b/RiotSwiftUI/Modules/Room/PollHistory/Service/Mock/MockPollHistoryService.swift index 9cfa8da3b..acd9543e3 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/Service/Mock/MockPollHistoryService.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/Service/Mock/MockPollHistoryService.swift @@ -27,13 +27,13 @@ final class MockPollHistoryService: PollHistoryServiceProtocol { pollErrorPublisher } - lazy var nextPublisher: AnyPublisher = (activePollsData + pastPollsData) + lazy var nextBatchPublisher: AnyPublisher = (activePollsData + pastPollsData) .publisher .setFailureType(to: Error.self) .eraseToAnyPublisher() - func next() -> AnyPublisher { - nextPublisher + func nextBatch() -> AnyPublisher { + nextBatchPublisher } } diff --git a/RiotSwiftUI/Modules/Room/PollHistory/Service/PollHistoryServiceProtocol.swift b/RiotSwiftUI/Modules/Room/PollHistory/Service/PollHistoryServiceProtocol.swift index 3458c3d64..637ba393f 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/Service/PollHistoryServiceProtocol.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/Service/PollHistoryServiceProtocol.swift @@ -1,4 +1,4 @@ -// +// // Copyright 2023 New Vector Ltd // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,13 +18,13 @@ import Combine protocol PollHistoryServiceProtocol { /// Returns a Publisher publishing the polls in the next batch. - /// Implementations should return the same publisher if `next()` is called again before the previous publisher completes. - func next() -> AnyPublisher + /// Implementations should return the same publisher if `nextBatch()` is called again before the previous publisher completes. + func nextBatch() -> AnyPublisher - /// Publishes updates for the polls previously pusblished by the `next()` publishers. + /// Publishes updates for the polls previously pusblished by the `nextBatch()` publishers. var updates: AnyPublisher { get } /// Publishes errors regarding poll aggregations. - /// Note: `next()` will continue to publish new polls even if some poll isn't being aggregated correctly. + /// Note: `nextBatch()` will continue to publish new polls even if some poll isn't being aggregated correctly. var pollErrors: AnyPublisher { get } } diff --git a/RiotSwiftUI/Modules/Room/PollHistory/Test/UI/PollHistoryUITests.swift b/RiotSwiftUI/Modules/Room/PollHistory/Test/UI/PollHistoryUITests.swift index bd08d10c2..986fd37bd 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/Test/UI/PollHistoryUITests.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/Test/UI/PollHistoryUITests.swift @@ -40,7 +40,7 @@ final class PollHistoryUITests: MockScreenTestCase { let emptyText = app.staticTexts["PollHistory.emptyText"] let items = app.staticTexts["PollListItem.title"] let selectedSegment = app.buttons[VectorL10n.pollHistoryPastSegmentTitle] - let winningOption = app.staticTexts["PollListData.winningOption"] + let winningOption = app.buttons["PollAnswerOption0"] XCTAssertEqual(title, VectorL10n.pollHistoryTitle) XCTAssertTrue(items.exists) @@ -53,7 +53,7 @@ final class PollHistoryUITests: MockScreenTestCase { func testPastPollHistoryIsEmpty() { app.goToScreenWithIdentifier(MockPollHistoryScreenState.pastEmpty.title) let title = app.navigationBars.firstMatch.identifier - let emptyText = app.staticTexts["PollHistory.emptyLoadMoreText"] + let emptyText = app.staticTexts["PollHistory.emptyText"] let items = app.staticTexts["PollListItem.title"] let selectedSegment = app.buttons[VectorL10n.pollHistoryPastSegmentTitle] let winningOption = app.staticTexts["PollListData.winningOption"] diff --git a/RiotSwiftUI/Modules/Room/PollHistory/Test/Unit/PollHistoryViewModelTests.swift b/RiotSwiftUI/Modules/Room/PollHistory/Test/Unit/PollHistoryViewModelTests.swift index f5694a7bb..e2eff7475 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/Test/Unit/PollHistoryViewModelTests.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/Test/Unit/PollHistoryViewModelTests.swift @@ -42,7 +42,7 @@ final class PollHistoryViewModelTests: XCTestCase { func testLoadingStateIsTrueWhileLoading() { XCTAssertFalse(viewModel.state.isLoading) - pollHistoryService.nextPublisher = Empty(completeImmediately: false, outputType: TimelinePollDetails.self, failureType: Error.self).eraseToAnyPublisher() + pollHistoryService.nextBatchPublisher = Empty(completeImmediately: false, outputType: TimelinePollDetails.self, failureType: Error.self).eraseToAnyPublisher() viewModel.process(viewAction: .viewAppeared) XCTAssertTrue(viewModel.state.isLoading) } @@ -53,7 +53,7 @@ final class PollHistoryViewModelTests: XCTestCase { viewModel.process(viewAction: .viewAppeared) var firstPoll = try XCTUnwrap(try polls.first) - XCTAssertEqual(firstPoll.question, "Do you like the active poll number 9?") + XCTAssertEqual(firstPoll.question, "Do you like the active poll number 1?") firstPoll.question = "foo" mockUpdates.send(firstPoll) diff --git a/RiotSwiftUI/Modules/Room/PollHistory/View/PollHistory.swift b/RiotSwiftUI/Modules/Room/PollHistory/View/PollHistory.swift index abbfceea6..0c819bf3a 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/View/PollHistory.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/View/PollHistory.swift @@ -85,42 +85,32 @@ struct PollHistory: View { Button { #warning("handle action in next ticket") } label: { - Text("Load more polls") + Text(VectorL10n.pollHistoryLoadMore) + .font(theme.fonts.body) } .disabled(viewModel.viewState.isLoading) } } - @ViewBuilder private var spinner: some View { ProgressView() .progressViewStyle(CircularProgressViewStyle()) } - @ViewBuilder private var noPollsView: some View { - if viewModel.viewState.canLoadMoreContent { - let days = PollHistoryConstants.chunkSizeInDays - - VStack(spacing: 32) { - Text(viewModel.mode == .active ? VectorL10n.pollHistoryNoActivePollPeriodText("\(days)") : VectorL10n.pollHistoryNoPastPollPeriodText("\(days)")) - .font(theme.fonts.body) - .foregroundColor(theme.colors.secondaryContent) - .multilineTextAlignment(.center) - .padding(.horizontal, 16) - .accessibilityIdentifier("PollHistory.emptyLoadMoreText") - - loadMoreButton - } - .frame(maxHeight: .infinity) - } else { - Text(viewModel.mode == .active ? VectorL10n.pollHistoryNoActivePollText : VectorL10n.pollHistoryNoPastPollText) + VStack(spacing: 32) { + Text(viewModel.emptyPollsText) .font(theme.fonts.body) + .multilineTextAlignment(.center) .foregroundColor(theme.colors.secondaryContent) - .frame(maxHeight: .infinity) .padding(.horizontal, 16) .accessibilityIdentifier("PollHistory.emptyText") + + if viewModel.viewState.canLoadMoreContent { + loadMoreButton + } } + .frame(maxHeight: .infinity) } private var loadingView: some View { diff --git a/RiotSwiftUI/Modules/Room/PollHistory/View/PollListItem.swift b/RiotSwiftUI/Modules/Room/PollHistory/View/PollListItem.swift index 04acaab6e..df7cb3774 100644 --- a/RiotSwiftUI/Modules/Room/PollHistory/View/PollListItem.swift +++ b/RiotSwiftUI/Modules/Room/PollHistory/View/PollListItem.swift @@ -48,56 +48,17 @@ struct PollListItem: View { if pollData.closed { VStack(alignment: .leading, spacing: 12) { let winningOptions = pollData.answerOptions.filter(\.winner) + ForEach(winningOptions) { - optionView(winningOption: $0) + TimelinePollAnswerOptionButton(poll: pollData, answerOption: $0, action: nil) } + resultView } } } } - private var clipShape: some Shape { - RoundedRectangle(cornerRadius: 4.0) - } - - private func optionView(winningOption: TimelinePollAnswerOption) -> some View { - VStack(alignment: .leading, spacing: 12.0) { - HStack(alignment: .top, spacing: 8.0) { - Text(winningOption.text) - .font(theme.fonts.body) - .foregroundColor(theme.colors.primaryContent) - .accessibilityIdentifier("PollListData.winningOption") - - Spacer() - - votesText(winningOption: winningOption) - } - - ProgressView(value: Double(winningOption.count), - total: Double(pollData.totalAnswerCount)) - .progressViewStyle(LinearProgressViewStyle()) - .scaleEffect(x: 1.0, y: 1.2, anchor: .center) - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.horizontal, 8.0) - .padding(.top, 12.0) - .padding(.bottom, 12.0) - .clipShape(clipShape) - .overlay(clipShape.stroke(theme.colors.accent, lineWidth: 1.0)) - .accentColor(theme.colors.accent) - } - - private func votesText(winningOption: TimelinePollAnswerOption) -> some View { - Label { - Text(winningOption.count == 1 ? VectorL10n.pollTimelineOneVote : VectorL10n.pollTimelineVotesCount(Int(winningOption.count))) - .font(theme.fonts.footnote) - .foregroundColor(theme.colors.accent) - } icon: { - Image(uiImage: Asset.Images.pollWinnerIcon.image) - } - } - private var resultView: some View { let text = pollData.totalAnswerCount == 1 ? VectorL10n.pollTimelineTotalFinalResultsOneVote : VectorL10n.pollTimelineTotalFinalResults(Int(pollData.totalAnswerCount)) @@ -133,8 +94,7 @@ struct PollListItem_Previews: PreviewProvider { maxAllowedSelections: 1, hasBeenEdited: false, hasDecryptionError: false) - - + let pollData2 = TimelinePollDetails(id: UUID().uuidString, question: "Do you like polls?", answerOptions: [.init(id: "id", text: "Yes, of course!", count: 18, winner: true, selected: true)], diff --git a/RiotSwiftUI/Modules/Room/TimelinePoll/Coordinator/TimelinePollCoordinator.swift b/RiotSwiftUI/Modules/Room/TimelinePoll/Coordinator/TimelinePollCoordinator.swift index 25f96f7b6..77b0e29ba 100644 --- a/RiotSwiftUI/Modules/Room/TimelinePoll/Coordinator/TimelinePollCoordinator.swift +++ b/RiotSwiftUI/Modules/Room/TimelinePoll/Coordinator/TimelinePollCoordinator.swift @@ -139,17 +139,21 @@ extension TimelinePollDetails { closed: poll.isClosed, startDate: poll.startDate, totalAnswerCount: poll.totalAnswerCount, - type: Self.pollKindToTimelinePollType(poll.kind), + type: poll.kind.timelinePollType, eventType: eventType, maxAllowedSelections: poll.maxAllowedSelections, hasBeenEdited: poll.hasBeenEdited, hasDecryptionError: poll.hasDecryptionError) } - - private static func pollKindToTimelinePollType(_ kind: PollKind) -> TimelinePollType { - let mapping = [PollKind.disclosed: TimelinePollType.disclosed, - PollKind.undisclosed: TimelinePollType.undisclosed] - - return mapping[kind] ?? .disclosed +} + +private extension PollKind { + var timelinePollType: TimelinePollType { + switch self { + case .disclosed: + return .disclosed + case .undisclosed: + return .undisclosed + } } } diff --git a/RiotSwiftUI/Modules/Room/TimelinePoll/TimelinePollModels.swift b/RiotSwiftUI/Modules/Room/TimelinePoll/TimelinePollModels.swift index 3ad624f57..0ee87c55f 100644 --- a/RiotSwiftUI/Modules/Room/TimelinePoll/TimelinePollModels.swift +++ b/RiotSwiftUI/Modules/Room/TimelinePoll/TimelinePollModels.swift @@ -71,33 +71,9 @@ struct TimelinePollDetails { var type: TimelinePollType var eventType: TimelinePollEventType var maxAllowedSelections: UInt - var hasBeenEdited = true + var hasBeenEdited: Bool var hasDecryptionError: Bool - init(id: String, - question: String, - answerOptions: [TimelinePollAnswerOption], - closed: Bool, - startDate: Date, - totalAnswerCount: UInt, - type: TimelinePollType, - eventType: TimelinePollEventType, - maxAllowedSelections: UInt, - hasBeenEdited: Bool, - hasDecryptionError: Bool) { - self.id = id - self.question = question - self.answerOptions = answerOptions - self.closed = closed - self.startDate = startDate - self.totalAnswerCount = totalAnswerCount - self.type = type - self.eventType = eventType - self.maxAllowedSelections = maxAllowedSelections - self.hasBeenEdited = hasBeenEdited - self.hasDecryptionError = hasDecryptionError - } - var hasCurrentUserVoted: Bool { answerOptions.contains(where: \.selected) } diff --git a/RiotSwiftUI/Modules/Room/TimelinePoll/View/TimelinePollAnswerOptionButton.swift b/RiotSwiftUI/Modules/Room/TimelinePoll/View/TimelinePollAnswerOptionButton.swift index 498fe29f5..6b0765a49 100644 --- a/RiotSwiftUI/Modules/Room/TimelinePoll/View/TimelinePollAnswerOptionButton.swift +++ b/RiotSwiftUI/Modules/Room/TimelinePoll/View/TimelinePollAnswerOptionButton.swift @@ -25,23 +25,26 @@ struct TimelinePollAnswerOptionButton: View { let poll: TimelinePollDetails let answerOption: TimelinePollAnswerOption - let action: () -> Void + let action: (() -> Void)? // MARK: Public var body: some View { - Button(action: action) { + Button { + action?() + } label: { let rect = RoundedRectangle(cornerRadius: 4.0) answerOptionLabel .frame(maxWidth: .infinity, alignment: .leading) .padding(.horizontal, 8.0) .padding(.top, 12.0) - .padding(.bottom, 12.0) + .padding(.bottom, 8.0) .clipShape(rect) .overlay(rect.stroke(borderAccentColor, lineWidth: 1.0)) .accentColor(progressViewAccentColor) } .accessibilityIdentifier("PollAnswerOption\(optionIndex)") + .disabled(action == nil) } var answerOptionLabel: some View { @@ -60,23 +63,20 @@ struct TimelinePollAnswerOptionButton: View { Spacer() Image(uiImage: Asset.Images.pollWinnerIcon.image) } + + if poll.shouldDiscloseResults { + Text(answerOption.count == 1 ? VectorL10n.pollTimelineOneVote : VectorL10n.pollTimelineVotesCount(Int(answerOption.count))) + .font(theme.fonts.footnote) + .foregroundColor(poll.closed && answerOption.winner ? theme.colors.accent : theme.colors.secondaryContent) + .accessibilityIdentifier("PollAnswerOption\(optionIndex)Count") + } } if poll.type == .disclosed || poll.closed { - HStack { - ProgressView(value: Double(poll.shouldDiscloseResults ? answerOption.count : 0), - total: Double(poll.totalAnswerCount)) - .progressViewStyle(LinearProgressViewStyle()) - .scaleEffect(x: 1.0, y: 1.2, anchor: .center) - .accessibilityIdentifier("PollAnswerOption\(optionIndex)Progress") - - if poll.shouldDiscloseResults { - Text(answerOption.count == 1 ? VectorL10n.pollTimelineOneVote : VectorL10n.pollTimelineVotesCount(Int(answerOption.count))) - .font(theme.fonts.footnote) - .foregroundColor(poll.closed && answerOption.winner ? theme.colors.accent : theme.colors.secondaryContent) - .accessibilityIdentifier("PollAnswerOption\(optionIndex)Count") - } - } + ProgressView(value: Double(poll.shouldDiscloseResults ? answerOption.count : 0), total: Double(poll.totalAnswerCount)) + .progressViewStyle(LinearProgressViewStyle.linear) + .scaleEffect(x: 1.0, y: 1.2, anchor: .center) + .accessibilityIdentifier("PollAnswerOption\(optionIndex)Progress") } } } @@ -143,6 +143,7 @@ struct TimelinePollAnswerOptionButton_Previews: PreviewProvider { } } } + .padding() } static func buildPoll(closed: Bool, type: TimelinePollType) -> TimelinePollDetails { diff --git a/RiotSwiftUI/Modules/Room/VoiceBroadcastPlayback/Coordinator/VoiceBroadcastPlaybackCoordinator.swift b/RiotSwiftUI/Modules/Room/VoiceBroadcastPlayback/Coordinator/VoiceBroadcastPlaybackCoordinator.swift index 963dba558..7df3eaa04 100644 --- a/RiotSwiftUI/Modules/Room/VoiceBroadcastPlayback/Coordinator/VoiceBroadcastPlaybackCoordinator.swift +++ b/RiotSwiftUI/Modules/Room/VoiceBroadcastPlayback/Coordinator/VoiceBroadcastPlaybackCoordinator.swift @@ -57,7 +57,8 @@ final class VoiceBroadcastPlaybackCoordinator: Coordinator, Presentable { } deinit { - viewModel.context.send(viewAction: .redact) + // If init has failed, our viewmodel will be nil. + viewModel?.context.send(viewAction: .redact) } // MARK: - Public diff --git a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift index 9ef2d5c98..b69476593 100644 --- a/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift +++ b/RiotSwiftUI/Modules/Room/VoiceBroadcastRecorder/Coordinator/VoiceBroadcastRecorderProvider.swift @@ -32,6 +32,9 @@ import Foundation coordinatorsForEventIdentifiers.removeAll() } } + didSet { + sessionState = session?.state + } } private var coordinatorsForEventIdentifiers = [String: VoiceBroadcastRecorderCoordinator]() { didSet { @@ -49,9 +52,19 @@ import Foundation // MARK: Private private var currentEventIdentifier: String? + private var sessionState: MXSessionState? + + private var sessionStateDidChangeObserver: Any? // MARK: - Setup - private override init() { } + private override init() { + super.init() + self.registerNotificationObservers() + } + + deinit { + unregisterNotificationObservers() + } // MARK: - Public @@ -121,4 +134,36 @@ import Foundation coordinator = nil } } + + // MARK: - Notification handling + + private func registerNotificationObservers() { + self.sessionStateDidChangeObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name.mxSessionStateDidChange, object: session, queue: nil) { [weak self] notification in + guard let self else { return } + guard let concernedSession = notification.object as? MXSession, self.session === concernedSession else { return } + + self.update(sessionState: concernedSession.state) + } + } + + private func unregisterNotificationObservers() { + if let observer = self.sessionStateDidChangeObserver { + NotificationCenter.default.removeObserver(observer) + } + } + + // MARK: - Session state + private func update(sessionState: MXSessionState) { + let oldState = self.sessionState + self.sessionState = sessionState + + switch (oldState, sessionState) { + case (_, .homeserverNotReachable): + pauseRecordingOnError() + case (_, .running): + pauseRecording() + default: + break + } + } } diff --git a/changelog.d/5148.bugfix b/changelog.d/5148.bugfix deleted file mode 100644 index 7f1ddcb3e..000000000 --- a/changelog.d/5148.bugfix +++ /dev/null @@ -1 +0,0 @@ -The (edited) tag for messages is now light grey like on web and Android. \ No newline at end of file diff --git a/changelog.d/7222.bugfix b/changelog.d/7222.bugfix deleted file mode 100644 index e1402cb0d..000000000 --- a/changelog.d/7222.bugfix +++ /dev/null @@ -1 +0,0 @@ -Live Location Sharing does not work on first selection after granting "Allow always" location permission. diff --git a/changelog.d/7229.change b/changelog.d/7229.change deleted file mode 100644 index 7099b8500..000000000 --- a/changelog.d/7229.change +++ /dev/null @@ -1 +0,0 @@ -Voice broadcast connection error handling while recording. diff --git a/changelog.d/7234.change b/changelog.d/7234.change deleted file mode 100644 index 52af7685d..000000000 --- a/changelog.d/7234.change +++ /dev/null @@ -1 +0,0 @@ -Handle a connection issue when we try to start a new voice broadcast. diff --git a/changelog.d/7238.feature b/changelog.d/7238.feature deleted file mode 100644 index 173f1195e..000000000 --- a/changelog.d/7238.feature +++ /dev/null @@ -1 +0,0 @@ -Rich Text Composer: Enable bulleted/numbered lists support diff --git a/changelog.d/7252.bugfix b/changelog.d/7252.bugfix deleted file mode 100644 index 0e823509f..000000000 --- a/changelog.d/7252.bugfix +++ /dev/null @@ -1 +0,0 @@ -Voice Broadcast: Fixed an issue where the voice broadcast audio player progress bar behaved unexpectedly. diff --git a/changelog.d/7261.bugfix b/changelog.d/7261.bugfix deleted file mode 100644 index 3594c5980..000000000 --- a/changelog.d/7261.bugfix +++ /dev/null @@ -1 +0,0 @@ -Voice Broadcast: VoiceBroadcast chunks are no longer resent as voice messages diff --git a/changelog.d/7263.bugfix b/changelog.d/7263.bugfix deleted file mode 100644 index 425e2dd95..000000000 --- a/changelog.d/7263.bugfix +++ /dev/null @@ -1 +0,0 @@ -Timeline's links and hyperlinks match now the blue colour of Android and Web. \ No newline at end of file diff --git a/changelog.d/7271.feature b/changelog.d/7271.feature deleted file mode 100644 index f2ae089f9..000000000 --- a/changelog.d/7271.feature +++ /dev/null @@ -1 +0,0 @@ -Rich Text Composer: Enable quote & code blocks support diff --git a/changelog.d/7279.change b/changelog.d/7279.change deleted file mode 100644 index c605f8920..000000000 --- a/changelog.d/7279.change +++ /dev/null @@ -1 +0,0 @@ -Rich Text Editor: https:// or mailto: scheme is automatically added when creating a link if no scheme is specified. diff --git a/changelog.d/7280.change b/changelog.d/7280.change deleted file mode 100644 index d387d563d..000000000 --- a/changelog.d/7280.change +++ /dev/null @@ -1 +0,0 @@ -Rich Text Editor: Adding a link over a blank selection, prompts the user to create a new link with new text to replace such selection. diff --git a/changelog.d/7298.change b/changelog.d/7298.change new file mode 100644 index 000000000..a7f7a74ce --- /dev/null +++ b/changelog.d/7298.change @@ -0,0 +1 @@ +App Layout: Removed the onboarding flow diff --git a/changelog.d/pr-7225.change b/changelog.d/pr-7225.change deleted file mode 100644 index df6cfd7a7..000000000 --- a/changelog.d/pr-7225.change +++ /dev/null @@ -1 +0,0 @@ -Labs: VoiceBroadcast: Handle VoIP buttons when VB is used diff --git a/changelog.d/pr-7256.build b/changelog.d/pr-7256.build deleted file mode 100644 index 9a2cd140b..000000000 --- a/changelog.d/pr-7256.build +++ /dev/null @@ -1 +0,0 @@ -Fix Element Alpha workflow not being able to run. diff --git a/changelog.d/pr-7257.bugfix b/changelog.d/pr-7257.bugfix deleted file mode 100644 index 8a41b21c8..000000000 --- a/changelog.d/pr-7257.bugfix +++ /dev/null @@ -1 +0,0 @@ -Voice Broadcast: The Now Playing Info Center now displays a voice broadcast instead of a voice message when a user is listening to a voice broadcast. diff --git a/changelog.d/pr-7267.change b/changelog.d/pr-7267.change deleted file mode 100644 index cab02bc6a..000000000 --- a/changelog.d/pr-7267.change +++ /dev/null @@ -1 +0,0 @@ -Polls: add UI for active poll history. diff --git a/changelog.d/pr-7268.bugfix b/changelog.d/pr-7268.bugfix deleted file mode 100644 index b6af7cd57..000000000 --- a/changelog.d/pr-7268.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix a crash caused by the missing Avatar Service dependency. diff --git a/changelog.d/pr-7272.change b/changelog.d/pr-7272.change deleted file mode 100644 index 04a8dcc2e..000000000 --- a/changelog.d/pr-7272.change +++ /dev/null @@ -1 +0,0 @@ -CryptoSDK: Add labs settings to enable Crypto SDK diff --git a/changelog.d/pr-7273.change b/changelog.d/pr-7273.change deleted file mode 100644 index 2c3d47b2e..000000000 --- a/changelog.d/pr-7273.change +++ /dev/null @@ -1 +0,0 @@ -Voice Broadcast: Improved detection of voice broadcast completion during playback. diff --git a/changelog.d/pr-7278.change b/changelog.d/pr-7278.change deleted file mode 100644 index f7254ebb9..000000000 --- a/changelog.d/pr-7278.change +++ /dev/null @@ -1 +0,0 @@ -Polls: poll history UI for past polls. diff --git a/changelog.d/pr-7284.change b/changelog.d/pr-7284.change deleted file mode 100644 index edab71856..000000000 --- a/changelog.d/pr-7284.change +++ /dev/null @@ -1 +0,0 @@ -Polls: render replies to poll events better. diff --git a/changelog.d/pr-7286.change b/changelog.d/pr-7286.change deleted file mode 100644 index ff8cbb820..000000000 --- a/changelog.d/pr-7286.change +++ /dev/null @@ -1 +0,0 @@ -CryptoV2: Display migration progress during startup