Files
bundesmessenger-ios/Riot/Utils/EventFormatter.m
T
ismailgulek f5fa20ed84 Release 1.9.9 (#6924)
* Login with QR UI components (#6790)

* Display QR button on login screen if HS supports

* Create start screen

* Add build flag

* Connect start screen to the login

* QR display screen

* Move `LabelledDividerView` into separate file

* Show display QR screen on button tap

* Add swift concurreny to CameraAccessManager

* Introduce `QRLoginServiceProtocol`

* Use new service in screens

* Introduce scan QR code screen

* Remove hardcoded service availability

* Remove unnecessary import

* Add confirmation screen

* Add loading screen

* Fix ZXingObjc targets

* Add failure screen

* Add strings

* Various UI tweaks, navigation according to the service state

* Fix tests

* Add string for invalid QR error

* Add QR login service mode

* dark mode support almost completed

* 'View all' button in other sessions list

* Changelog

* Only use device type name as fallback for session display name

* Add changelog

* Revert translation changes

* Fix copyright year

* updated the package and added a circle background to the + button

* QR login from device manager (#6818)

* Add link device button into the sessions overview screen

* Run Swift format

* Fix tests

* Fix a crash in tests

* Fix PR remark

* Bring back English string for now to unbreak the build

* pr comment addressed

* Fix composer resizing animations

* Remove prefix from tests

* Add back generated user session name string

* Fixed swiftformat warnings

* Remove current app name from device type name

* updated package version

* QR Login additional flags (#6825)

* Include app name in default session display name

* Add changelog

* edit is displayed in the WYSIWYG, but the send button still sends a new message instead of correcting the edit

* Move composer send media selection to it's own coordinator and us e ioS 15 api for sheet

* fix newline in pod lockfile

* fix newline

* Add labs flag and strings

* Translated using Weblate (Italian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Estonian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (German)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Icelandic)

Currently translated at 86.0% (1919 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/is/

* Split out models, add some tests and fix some formatting.

* Fixed formatting

* Expose AuthenticationRestClient async login token generation method (MSC3882)

* Only update the nav bar from the top SwiftUI view.

* Bugfix: Element freezes after searching in a room #6762

* Tidy-up formatting.

* Hide Maximise button as animations not working correctly

* Remove the ffmpeg pod.

* created the replace formatted text function

* Fix authentication tests.

* Translated using Weblate (Swedish)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/sv/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translations update from Weblate (#6843)

* Translated using Weblate (Italian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Estonian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (German)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Icelandic)

Currently translated at 86.0% (1919 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/is/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Thomas Schmidt <thomas@thsmdt.com>
Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6844)

* Translated using Weblate (Icelandic)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/is/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/sv/

Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Co-authored-by: LinAGKar <linus.kardell@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>

* edit works functionally (no UI changes yet)

* package update

* formatted reply support

* error logging improvement

* code improvements

* improving code

* improving overall code

* Filter button

* Verified sessions

* reverting the xcscheme file

* revert

* todo reminder

* Ignore OS version from web based sessions (PSG-826) (#6852)

* Ignore OS version from web based sessions

* Add changelog

* Clear filter button

* Device Manager: Rename Session (#6826)

* Publish the user sessions overview data.
* Add UserSessionName screen.
* Update logout action to match Figma more closely.

* UI and unit tests

* Device Manager: Verify session (#6832)

* Initial implementation
* Add verificationState to UserSessionInfo
* Listen for changes device changes in the service.

* Remove loader for static location sharing

* Remove loader for live location sharing

* Move completions around

* Add changelog.d file

* edit mode changes the send button

* right assets

* color improvements and implementing the cancel callback

* implemented cancel, but I need to actually need to solve a problem where the previous text is not stored in case of cancel of the reply/edit

* edit reply completed, just need to polish the UI a bit more.

* Renamed  OtherUserSessionsFilter  to UserOtherSessionsFilter

* Changelog

* Formating

* some UI tweaks

* Add voice broadcast state event (#6785)

* Tidy up TabBarCoordinator now that AllChatsCoordinator exists.

* Update Riot/Assets/en.lproj/Vector.strings

Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>

* Update RiotSwiftUI/Modules/UserSessions/UserOtherSessions/UserOtherSessionsModels.swift

Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>

* Single scale image

* Renamed filerWasChanged to filterWasChanged

* Revert collections update

* Added accessibility label to filter menu

* pr comment + some design improvements

* should now be aligned to the designs

* get rid of additional UIHostingController. Cleanup and comments.

* legacy sendMode code separation to have RiotSwiftUI be able to build.

* Added last activity item to session details screen

* fix

* More comments

* Update strings for unknown sessions.

* Fix RiotTests.

* code improvements

* wiftlint

* Remove verify session button for other sessions when the current session is unverified

* Implement login with scanned QR code flows

* Fix initiator flows and e2e tests

* Add missing rendezvousServerBaseURL buildSetting

* Add changelog

* Remove extra step as no longer required

* Fix typo

* Remove now unnecessary creator public key publishing. Rebuilt flows and fixed tests

* Fix UI tests for features currently disabled

* composer code improvement

* improving code

* unit tests

* Tests completed! The only doubt I have left is about testing the string content considering the localisations in tests

* code improvement

* code improvement

* ui tests should now work on CI

* ui test should work now

* ui tests fix on ci

* ui test improvements

* Correct verificationStatusAdditionalInfoText for other session

* Changelog

* Correct label for other verified session

* Formating fixes

* Update enhancement issue template

Link to discussions for cross-platform and feature requests

* Updates based on comments.

* more comment updates

* unit tests improved!

* improved UI tests

* Add a SignOutFlowPresenter. (#6854)

Used in AllChats, UserSessions and Settings.
(TabBarCoordinator is unnecessary as signout will be removed from there).

* Additional translations and accessiblity labels

* Added E2EE support on sessions created through QR code login

* Fixed various SwiftFormat warnings

* Remove unnecessary private key requests as it already happens automatically when marking the existing device as verified

* Allow the login with qr button to be shown on the login screen if the currently selected homeserver supports it

* Check login intents match between QR code and current flow

* Fix authentication unit tests

* Login against the homeserver provided through the QR code

* Navigating to session overview goes to session details

* Changelog

* Fix typo

* custom tint + blinking dark theme text color issue fix

* Identify inactive sessions

* Changelog

* Translated using Weblate (German)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (French)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/fr/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* opacity transition implemented

* 0.15 animation

* updated UI tests

* project yml with the latest working version of the package

* "Notifications on this device" not refreshed in user settings screen

* Update tools.

• Un-pin versions to update tools on each release.
• Switch to SwiftFormat as a pod.

* All chats shows no rooms in the list

- Fixed

* added the grabber and the corner radius

* the right corner radius value

* ios 16 custom detent

* height value

* Revert "height value"

This reverts commit fae63c6f768d2dd375d431bc16acca31e2dd56bb.

* Revert "ios 16 custom detent"

This reverts commit 758dacc00e77c57b787aae71405a1f90c03c3666.

* better padding

* Update Wysiwyg dep and use new focused param on WysiwygComposerView

* Filter out application section if needed

* Add changelog.d file

* design improvements!

* designs are perfect now

* Fix bubble cell visibility (#6893)

* updated the swiftpm

* package resolved

* Set inputAccessoryViewForKeyboard so that interactive dismissal works.

* [Voice Broadcast] Aggregate the chunks of voice messages in room timeline (#6891)

* Add missing changelogs

* changelog

* changelog

* changelog linked to an issue

* Add weak self reference to closure

* spacing improved further

* Use unstable prefixes for QR code login

* Changelog

* Force update client information

* Changelog

* Fix incorrect Task creation for processing scanned qr codes

* Check and mark the received MSK as trusted before locally verifying the existing device

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6909)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (49 of 49 strings)

Translation: Element iOS/Element iOS (Push)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-push/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6910)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6909)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (49 of 49 strings)

Translation: Element iOS/Element iOS (Push)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-push/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6911)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6909)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (49 of 49 strings)

Translation: Element iOS/Element iOS (Push)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-push/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6910)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6909)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (49 of 49 strings)

Translation: Element iOS/Element iOS (Push)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-push/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6915)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Missing change from fix

* changelog

* Only running alpha builds when PR labeled with `Trigger-PR-Build`

* Configure codecov flags and have them be carried forward

* Add pull request change types for triggering alpha builds

* changelog.d: Upgrade MatrixSDK version ([v0.24.1](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.24.1)).

* version++

Co-authored-by: Anderas <andyuhnak@gmail.com>
Co-authored-by: Mauro Romito <mauro.romito@element.io>
Co-authored-by: Aleksandrs Proskurins <paleksandrs@gmail.com>
Co-authored-by: Johannes Marbach <johannesm@element.io>
Co-authored-by: aringenbach <arnaudr@element.io>
Co-authored-by: David Langley <langley.dave@gmail.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Thomas Schmidt <thomas@thsmdt.com>
Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Co-authored-by: Stefan Ceriu <stefanc@matrix.org>
Co-authored-by: Aleksandrs Proskurins <aleksandrsp@element.io>
Co-authored-by: Doug <douglase@element.io>
Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>
Co-authored-by: Shunmugaraj <toshanmugaraj@gmail.com>
Co-authored-by: LinAGKar <linus.kardell@gmail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Element Translate Bot <admin@riot.im>
Co-authored-by: Alfonso Grillo <alfogrillo@gmail.com>
Co-authored-by: Alfonso Grillo <alfogrillo@element.io>
Co-authored-by: Yoan Pintas <y.pintas@gmail.com>
Co-authored-by: Gil Eluard <gile@element.io>
Co-authored-by: Hugh Nimmo-Smith <hughns@element.io>
Co-authored-by: Kat Gerasimova <ekaterinag@element.io>
Co-authored-by: Velin92 <34335419+Velin92@users.noreply.github.com>
Co-authored-by: Thibault Martin <mail@thibaultmart.in>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: gulekismail <ismailgulek0@gmail.com>
2022-10-18 16:09:06 +03:00

736 lines
33 KiB
Objective-C

/*
Copyright 2015 OpenMarket Ltd
Copyright 2017 Vector Creations 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 "EventFormatter.h"
#import "ThemeService.h"
#import "GeneratedInterface-Swift.h"
#import "WidgetManager.h"
#import "MXDecryptionResult.h"
#import "DecryptionFailureTracker.h"
#import "EventFormatter+DTCoreTextFix.h"
#import <MatrixSDK/MatrixSDK.h>
#pragma mark - Constants definitions
NSString *const EventFormatterOnReRequestKeysLinkAction = @"EventFormatterOnReRequestKeysLinkAction";
NSString *const EventFormatterLinkActionSeparator = @"/";
NSString *const EventFormatterEditedEventLinkAction = @"EventFormatterEditedEventLinkAction";
NSString *const FunctionalMembersStateEventType = @"io.element.functional_members";
NSString *const FunctionalMembersServiceMembersKey = @"service_members";
static NSString *const kEventFormatterTimeFormat = @"HH:mm";
@interface EventFormatter ()
{
/**
The calendar used to retrieve the today date.
*/
NSCalendar *calendar;
}
@end
@implementation EventFormatter
+ (void)load
{
[self fixDTCoreTextFont];
}
- (void)initDateTimeFormatters
{
[super initDateTimeFormatters];
timeFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
[timeFormatter setDateFormat:kEventFormatterTimeFormat];
}
- (NSString *)stringFromEvent:(MXEvent *)event
withRoomState:(MXRoomState *)roomState
andLatestRoomState:(MXRoomState *)latestRoomState
error:(MXKEventFormatterError *)error
{
NSString *stringFromEvent;
NSAttributedString *attributedStringFromEvent = [self attributedStringFromEvent:event
withRoomState:roomState
andLatestRoomState:latestRoomState
displayPills:NO
error:error];
if (*error == MXKEventFormatterErrorNone)
{
stringFromEvent = attributedStringFromEvent.string;
}
return stringFromEvent;
}
- (NSAttributedString *)attributedStringFromEvent:(MXEvent *)event
withRoomState:(MXRoomState *)roomState
andLatestRoomState:(MXRoomState *)latestRoomState
displayPills:(BOOL)displayPills
error:(MXKEventFormatterError *)error
{
NSAttributedString *string = [self unsafeAttributedStringFromEvent:event
withRoomState:roomState
andLatestRoomState:latestRoomState
error:error];
if (!string)
{
MXLogDebug(@"[EventFormatter]: No attributed string for event: %@, type: %@, msgtype: %@, has room state: %d, members: %lu, error: %lu",
event.eventId,
event.type,
event.content[@"msgtype"],
roomState != nil,
roomState.membersCount.members,
*error);
// If we cannot create attributed string, but the message is nevertheless meant for display, show generic error
// instead of a missing message on a timeline.
if ([self shouldDisplayEvent:event]) {
MXLogErrorDetails(@"[EventFormatter]: Missing attributed string for message event", @{
@"event_id": event.eventId ?: @"unknown"
});
string = [[NSAttributedString alloc] initWithString:[VectorL10n noticeErrorUnformattableEvent] attributes:@{
NSFontAttributeName: [self encryptedMessagesTextFont]
}];
}
}
if (@available(iOS 15.0, *))
{
if (displayPills && roomState && [self shouldDisplayEvent:event])
{
string = [PillsFormatter insertPillsIn:string
withSession:mxSession
eventFormatter:self
event:event
roomState:roomState
andLatestRoomState:latestRoomState
isEditMode:NO];
}
}
return string;
}
- (NSAttributedString *)attributedStringFromEvent:(MXEvent *)event
withRoomState:(MXRoomState *)roomState
andLatestRoomState:(MXRoomState *)latestRoomState
error:(MXKEventFormatterError *)error
{
return [self attributedStringFromEvent:event
withRoomState:roomState
andLatestRoomState:latestRoomState
displayPills:YES
error:error];
}
- (BOOL)shouldDisplayEvent:(MXEvent *)event {
return event.eventType == MXEventTypeRoomMessage
&& !event.isEditEvent
&& !event.isRedactedEvent;
}
// The attributed string can fail to be created for a number of reasons, and the size of the function (as well as super's implementation) makes
// it impossible to catch all the `return nil` and failure states.
// To make catching of missing strings reliable (and not place that burden on callers), we use private `unsafeAttributedStringFromEvent` method
// which is called by the public `attributedStringFromEvent`, and which also handles the catch-all missing message.
- (NSAttributedString *)unsafeAttributedStringFromEvent:(MXEvent *)event
withRoomState:(MXRoomState *)roomState
andLatestRoomState:(MXRoomState *)latestRoomState
error:(MXKEventFormatterError *)error
{
if (event.isRedactedEvent)
{
if (event.eventType == MXEventTypeReaction)
{
// do not show redacted reactions in the timeline
return nil;
}
// Check whether the event is a thread root or redacted information is required
if ((RiotSettings.shared.enableThreads && [mxSession.threadingService isEventThreadRoot:event])
|| self.settings.showRedactionsInRoomHistory)
{
NSAttributedString *result = [self redactedMessageReplacementAttributedString];
if (error)
{
*error = MXKEventFormatterErrorNone;
}
return result;
}
}
BOOL isEventSenderMyUser = [event.sender isEqualToString:mxSession.myUserId];
if (event.eventType == MXEventTypeCustom) {
// Build strings for widget events
if ([event.type isEqualToString:kWidgetMatrixEventTypeString]
|| [event.type isEqualToString:kWidgetModularEventTypeString])
{
NSString *displayText;
Widget *widget = [[Widget alloc] initWithWidgetEvent:event inMatrixSession:mxSession];
if (widget)
{
// Prepare the display name of the sender
NSString *senderDisplayName = roomState ? [self senderDisplayNameForEvent:event withRoomState:roomState] : event.sender;
if (widget.isActive)
{
if ([widget.type isEqualToString:kWidgetTypeJitsiV1]
|| [widget.type isEqualToString:kWidgetTypeJitsiV2])
{
// This is an alive jitsi widget
if (isEventSenderMyUser)
{
displayText = [VectorL10n eventFormatterJitsiWidgetAddedByYou];
}
else
{
displayText = [VectorL10n eventFormatterJitsiWidgetAdded:senderDisplayName];
}
}
else
{
if (isEventSenderMyUser)
{
displayText = [VectorL10n eventFormatterWidgetAddedByYou:(widget.name ? widget.name : widget.type)];
}
else
{
displayText = [VectorL10n eventFormatterWidgetAdded:(widget.name ? widget.name : widget.type) :senderDisplayName];
}
}
}
else
{
// This is a closed widget
// Check if it corresponds to a jitsi widget by looking at other state events for
// this jitsi widget (widget id = event.stateKey).
// Get all widgets state events in the room
NSMutableArray<MXEvent*> *widgetStateEvents = [NSMutableArray arrayWithArray:[roomState stateEventsWithType:kWidgetMatrixEventTypeString]];
[widgetStateEvents addObjectsFromArray:[roomState stateEventsWithType:kWidgetModularEventTypeString]];
for (MXEvent *widgetStateEvent in widgetStateEvents)
{
if ([widgetStateEvent.stateKey isEqualToString:widget.widgetId])
{
Widget *activeWidget = [[Widget alloc] initWithWidgetEvent:widgetStateEvent inMatrixSession:mxSession];
if (activeWidget.isActive)
{
if ([activeWidget.type isEqualToString:kWidgetTypeJitsiV1]
|| [activeWidget.type isEqualToString:kWidgetTypeJitsiV2])
{
// This was a jitsi widget
return nil;
}
else
{
if (isEventSenderMyUser)
{
displayText = [VectorL10n eventFormatterWidgetRemovedByYou:(activeWidget.name ? activeWidget.name : activeWidget.type)];
}
else
{
displayText = [VectorL10n eventFormatterWidgetRemoved:(activeWidget.name ? activeWidget.name : activeWidget.type) :senderDisplayName];
}
}
break;
}
}
}
}
}
if (displayText)
{
if (error)
{
*error = MXKEventFormatterErrorNone;
}
// Build the attributed string with the right font and color for the events
return [self renderString:displayText forEvent:event];
}
} else if ([event.type isEqualToString:VoiceBroadcastSettings.eventType]) {
MXLogDebug(@"VB incoming build string")
}
}
switch (event.eventType)
{
case MXEventTypeRoomCreate:
{
MXRoomCreateContent *createContent = [MXRoomCreateContent modelFromJSON:event.content];
NSString *roomPredecessorId = createContent.roomPredecessorInfo.roomId;
if (roomPredecessorId)
{
return [self roomCreatePredecessorAttributedStringWithPredecessorRoomId:roomPredecessorId];
}
else
{
NSAttributedString *string = [super attributedStringFromEvent:event
withRoomState:roomState
andLatestRoomState:latestRoomState
error:error];
NSMutableAttributedString *result = [[NSMutableAttributedString alloc] initWithString:@"· "];
[result appendAttributedString:string];
return result;
}
}
break;
case MXEventTypeCallCandidates:
case MXEventTypeCallSelectAnswer:
case MXEventTypeCallNegotiate:
case MXEventTypeCallReplaces:
case MXEventTypeCallRejectReplacement:
// Do not show call events except invite and reject in timeline
return nil;
case MXEventTypeCallInvite:
{
MXCallInviteEventContent *content = [MXCallInviteEventContent modelFromJSON:event.content];
MXCall *call = [mxSession.callManager callWithCallId:content.callId];
if (call && call.isIncoming && call.state == MXCallStateRinging)
{
// incoming call UI will be handled by CallKit (or incoming call screen if CallKit disabled)
// do not show a bubble for this case
return nil;
}
}
break;
case MXEventTypeKeyVerificationCancel:
case MXEventTypeKeyVerificationDone:
// Make event types MXEventTypeKeyVerificationCancel and MXEventTypeKeyVerificationDone visible in timeline.
// TODO: Find another way to keep them visible and avoid instantiate empty NSMutableAttributedString.
return [NSMutableAttributedString new];
default:
break;
}
NSAttributedString *attributedString = [super attributedStringFromEvent:event
withRoomState:roomState
andLatestRoomState:latestRoomState
error:error];
if (event.sentState == MXEventSentStateSent
&& [event.decryptionError.domain isEqualToString:MXDecryptingErrorDomain])
{
// Track e2e failures
dispatch_async(dispatch_get_main_queue(), ^{
[[DecryptionFailureTracker sharedInstance] reportUnableToDecryptErrorForEvent:event withRoomState:roomState myUser:self->mxSession.myUser.userId];
});
if (event.decryptionError.code == MXDecryptingErrorUnknownInboundSessionIdCode)
{
// Append to the displayed error an attibuted string with a tappable link
// so that the user can try to fix the UTD
NSMutableAttributedString *attributedStringWithRerequestMessage = [attributedString mutableCopy];
[attributedStringWithRerequestMessage appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n"]];
NSString *linkActionString = [NSString stringWithFormat:@"%@%@%@", EventFormatterOnReRequestKeysLinkAction,
EventFormatterLinkActionSeparator,
event.eventId];
[attributedStringWithRerequestMessage appendAttributedString:
[[NSAttributedString alloc] initWithString:[VectorL10n eventFormatterRerequestKeysPart1Link]
attributes:@{
NSLinkAttributeName: linkActionString,
NSForegroundColorAttributeName: self.sendingTextColor,
NSFontAttributeName: self.encryptedMessagesTextFont
}]];
[attributedStringWithRerequestMessage appendAttributedString:
[[NSAttributedString alloc] initWithString:[VectorL10n eventFormatterRerequestKeysPart2]
attributes:@{
NSForegroundColorAttributeName: self.sendingTextColor,
NSFontAttributeName: self.encryptedMessagesTextFont
}]];
attributedString = attributedStringWithRerequestMessage;
}
}
else if (self.showEditionMention && event.contentHasBeenEdited)
{
NSMutableAttributedString *attributedStringWithEditMention = [attributedString mutableCopy];
NSString *linkActionString = [NSString stringWithFormat:@"%@%@%@", EventFormatterEditedEventLinkAction,
EventFormatterLinkActionSeparator,
event.eventId];
[attributedStringWithEditMention appendAttributedString:
[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@" %@", [VectorL10n eventFormatterMessageEditedMention]]
attributes:@{
NSLinkAttributeName: linkActionString,
// NOTE: Color is curretly overidden by UIText.tintColor as we use `NSLinkAttributeName`.
// If we use UITextView.linkTextAttributes to set link color we will also have the issue that color will be the same for all kind of links.
NSForegroundColorAttributeName: self.editionMentionTextColor,
NSFontAttributeName: self.editionMentionTextFont
}]];
attributedString = attributedStringWithEditMention;
}
return attributedString;
}
- (NSAttributedString*)attributedStringFromEvents:(NSArray<MXEvent*>*)events
withRoomState:(MXRoomState*)roomState
andLatestRoomState:(MXRoomState*)latestRoomState
error:(MXKEventFormatterError*)error
{
NSString *displayText;
if (events.count)
{
MXEvent *roomCreateEvent = [events filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"type == %@", kMXEventTypeStringRoomCreate]].firstObject;
MXEvent *callInviteEvent = [events filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"type == %@", kMXEventTypeStringCallInvite]].firstObject;
if (roomCreateEvent)
{
MXKEventFormatterError tmpError;
displayText = [super attributedStringFromEvent:roomCreateEvent
withRoomState:roomState
andLatestRoomState:latestRoomState
error:&tmpError].string;
NSAttributedString *rendered = [self renderString:displayText forEvent:roomCreateEvent];
NSMutableAttributedString *result = [[NSMutableAttributedString alloc] initWithString:@"· "];
[result appendAttributedString:rendered];
[result setAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:13],
NSForegroundColorAttributeName: ThemeService.shared.theme.textSecondaryColor
} range:NSMakeRange(0, result.length)];
// add one-char space
[result appendAttributedString:[[NSAttributedString alloc] initWithString:@" "]];
// add more link
NSAttributedString *linkMore = [[NSAttributedString alloc] initWithString:[VectorL10n more] attributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:13],
NSForegroundColorAttributeName: ThemeService.shared.theme.tintColor
}];
[result appendAttributedString:linkMore];
return result;
}
else if (callInviteEvent)
{
// return a non-nil value
return [NSMutableAttributedString new];
}
else if (events[0].eventType == MXEventTypeRoomMember)
{
// This is a series for cells tagged with RoomBubbleCellDataTagMembership
// TODO: Build a complete summary like Riot-web
displayText = [VectorL10n eventFormatterMemberUpdates:events.count];
}
}
if (displayText)
{
// Build the attributed string with the right font and color for the events
return [self renderString:displayText forEvent:events[0]];
}
return [super attributedStringFromEvents:events
withRoomState:roomState
andLatestRoomState:latestRoomState
error:error];
}
- (instancetype)initWithMatrixSession:(MXSession *)matrixSession
{
self = [super initWithMatrixSession:matrixSession];
if (self)
{
calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
// Use the selected bg color to set the code block background color in the default CSS.
NSUInteger bgColor = [MXKTools rgbValueWithColor:ThemeService.shared.theme.selectedBackgroundColor];
self.defaultCSS = [NSString stringWithFormat:@" \
pre,code { \
background-color: #%06lX; \
display: inline; \
font-family: monospace; \
white-space: pre; \
-coretext-fontname: Menlo-Regular; \
font-size: small; \
} \
h1,h2 { \
font-size: 1.2em; \
}", (unsigned long)bgColor];
self.defaultTextColor = ThemeService.shared.theme.textPrimaryColor;
self.subTitleTextColor = ThemeService.shared.theme.textSecondaryColor;
self.prefixTextColor = ThemeService.shared.theme.textSecondaryColor;
self.bingTextColor = ThemeService.shared.theme.noticeColor;
self.encryptingTextColor = ThemeService.shared.theme.textPrimaryColor;
self.sendingTextColor = ThemeService.shared.theme.textPrimaryColor;
self.errorTextColor = ThemeService.shared.theme.textPrimaryColor;
self.showEditionMention = YES;
self.editionMentionTextColor = ThemeService.shared.theme.textSecondaryColor;
self.defaultTextFont = [UIFont systemFontOfSize:15];
self.prefixTextFont = [UIFont boldSystemFontOfSize:15];
self.bingTextFont = [UIFont systemFontOfSize:15 weight:UIFontWeightMedium];
self.stateEventTextFont = [UIFont italicSystemFontOfSize:15];
self.callNoticesTextFont = [UIFont italicSystemFontOfSize:15];
self.encryptedMessagesTextFont = [UIFont italicSystemFontOfSize:15];
self.emojiOnlyTextFont = [UIFont systemFontOfSize:48];
self.editionMentionTextFont = [UIFont systemFontOfSize:12];
// Handle space and video room types, enables their display in the room list
defaultRoomSummaryUpdater.showRoomTypeStrings = @[
MXRoomTypeStringSpace,
MXRoomTypeStringVideo
];
}
return self;
}
- (NSDictionary*)stringAttributesForEventTimestamp
{
return @{
NSForegroundColorAttributeName : [UIColor lightGrayColor],
NSFontAttributeName: [UIFont systemFontOfSize:10]
};
}
#pragma mark event sender info
- (NSString*)senderAvatarUrlForEvent:(MXEvent*)event withRoomState:(MXRoomState*)roomState
{
// Override this method to ignore the identicons defined by default in matrix kit.
// Consider first the avatar url defined in provided room state (Note: this room state is supposed to not take the new event into account)
NSString *senderAvatarUrl = [roomState.members memberWithUserId:event.sender].avatarUrl;
// Check whether this avatar url is updated by the current event (This happens in case of new joined member)
NSString* membership = event.content[@"membership"];
NSString* eventAvatarUrl = event.content[@"avatar_url"];
NSString* prevEventAvatarUrl = event.prevContent[@"avatar_url"];
if (membership && [membership isEqualToString:@"join"] && [eventAvatarUrl length] && ![eventAvatarUrl isEqualToString:prevEventAvatarUrl])
{
// Use the actual avatar
senderAvatarUrl = eventAvatarUrl;
}
// We ignore non mxc avatar url (The identicons are removed here).
if (senderAvatarUrl && [senderAvatarUrl hasPrefix:kMXContentUriScheme] == NO)
{
senderAvatarUrl = nil;
}
return senderAvatarUrl;
}
#pragma mark - MXRoomSummaryUpdating
- (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary withStateEvents:(NSArray<MXEvent *> *)stateEvents roomState:(MXRoomState *)roomState
{
BOOL updated = [super session:session updateRoomSummary:summary withStateEvents:stateEvents roomState:roomState];
// Customisation for EMS Functional Members in direct rooms
if (BuildSettings.supportFunctionalMembers && summary.room.isDirect)
{
if ([self functionalMembersEventFromStateEvents:stateEvents])
{
MXLogDebug(@"[EventFormatter] The functional members event has been updated.")
// The stateEvents parameter contains state events that may change the room summary. If service members are found,
// it's likely that something changed. As they aren't stored, the only reliable check would be to compute the
// room name which we'll do twice more in updateRoomSummary:withServerRoomSummary:roomState: anyway.
//
// So return YES and let that happen there.
return YES;
}
}
return updated;
}
- (NSAttributedString *)redactedMessageReplacementAttributedString
{
UIFont *font = self.defaultTextFont;
UIColor *color = ThemeService.shared.theme.colors.secondaryContent;
NSString *string = [NSString stringWithFormat:@" %@", VectorL10n.eventFormatterMessageDeleted];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:string
attributes:@{
NSFontAttributeName: font,
NSForegroundColorAttributeName: color
}];
CGSize imageSize = CGSizeMake(20, 20);
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [[AssetImages.roomContextMenuDelete.image vc_resizedWith:imageSize] vc_tintedImageUsingColor:color];
attachment.bounds = CGRectMake(0, font.descender, imageSize.width, imageSize.height);
NSAttributedString *imageString = [NSAttributedString attributedStringWithAttachment:attachment];
NSMutableAttributedString *result = [[NSMutableAttributedString alloc] initWithAttributedString:imageString];
[result appendAttributedString:attrString];
return result;
}
- (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary withServerRoomSummary:(MXRoomSyncSummary *)serverRoomSummary roomState:(MXRoomState *)roomState
{
BOOL updated = [super session:session updateRoomSummary:summary withServerRoomSummary:serverRoomSummary roomState:roomState];
// Customisation for EMS Functional Members in direct rooms
if (BuildSettings.supportFunctionalMembers && summary.room.isDirect)
{
MXEvent *functionalMembersEvent = [self functionalMembersEventFromStateEvents:roomState.stateEvents];
if (functionalMembersEvent)
{
MXLogDebug(@"[EventFormatter] Computing the room name and avatar excluding functional members.")
NSArray<NSString*> *serviceMemberIDs = functionalMembersEvent.content[FunctionalMembersServiceMembersKey] ?: @[];
updated |= [defaultRoomSummaryUpdater updateSummaryDisplayname:summary
session:session
withServerRoomSummary:serverRoomSummary
roomState:roomState
excludingUserIDs:serviceMemberIDs];
updated |= [defaultRoomSummaryUpdater updateSummaryAvatar:summary
session:session
withServerRoomSummary:serverRoomSummary
roomState:roomState
excludingUserIDs:serviceMemberIDs];
}
}
return updated;
}
/**
Gets the latest state event of type `io.element.functional_members` from the supplied array of state events.
Note: This function will be expensive on big rooms, recommended for use only on DMs.
@return An event of type `io.element.functional_members`, or nil if the event wasn't found.
*/
- (MXEvent *)functionalMembersEventFromStateEvents:(NSArray<MXEvent *> *)stateEvents
{
NSPredicate *functionalMembersPredicate = [NSPredicate predicateWithFormat:@"type == %@", FunctionalMembersStateEventType];
return [stateEvents filteredArrayUsingPredicate:functionalMembersPredicate].lastObject;
}
#pragma mark - Timestamp formatting
- (NSString*)dateStringFromDate:(NSDate *)date withTime:(BOOL)time
{
// Check the provided date
if (!date)
{
return nil;
}
// Retrieve today date at midnight
NSDate *today = [calendar startOfDayForDate:[NSDate date]];
NSTimeInterval interval = -[date timeIntervalSinceDate:today];
if (interval > 60*60*24*364)
{
[dateFormatter setDateFormat:@"MMM dd yyyy"];
// Ignore time information here
return [super dateStringFromDate:date withTime:NO];
}
else if (interval > 60*60*24*6)
{
[dateFormatter setDateFormat:@"MMM dd"];
// Ignore time information here
return [super dateStringFromDate:date withTime:NO];
}
else if (interval > 60*60*24)
{
if (time)
{
[dateFormatter setDateFormat:@"EEE"];
}
else
{
[dateFormatter setDateFormat:@"EEEE"];
}
return [super dateStringFromDate:date withTime:time];
}
else if (interval > 0)
{
if (time)
{
[dateFormatter setDateFormat:nil];
return [NSString stringWithFormat:@"%@ %@", [VectorL10n yesterday], [super dateStringFromDate:date withTime:YES]];
}
return [VectorL10n yesterday];
}
else if (interval > - 60*60*24)
{
if (time)
{
[dateFormatter setDateFormat:nil];
return [NSString stringWithFormat:@"%@", [super dateStringFromDate:date withTime:YES]];
}
return [VectorL10n today];
}
else
{
// Date in future
[dateFormatter setDateFormat:@"EEE MMM dd yyyy"];
return [super dateStringFromDate:date withTime:time];
}
}
#pragma mark - Room create predecessor
- (NSAttributedString*)roomCreatePredecessorAttributedStringWithPredecessorRoomId:(NSString*)predecessorRoomId
{
NSDictionary *roomPredecessorReasonAttributes = @{
NSFontAttributeName : self.defaultTextFont
};
NSDictionary *roomLinkAttributes = @{
NSFontAttributeName : self.defaultTextFont,
NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle)
};
NSMutableAttributedString *roomPredecessorAttributedString = [NSMutableAttributedString new];
NSString *roomPredecessorReasonString = [NSString stringWithFormat:@"%@\n", [VectorL10n roomPredecessorInformation]];
NSAttributedString *roomPredecessorReasonAttributedString = [[NSAttributedString alloc] initWithString:roomPredecessorReasonString attributes:roomPredecessorReasonAttributes];
NSString *predecessorRoomLinkString = [VectorL10n roomPredecessorLink];
NSAttributedString *predecessorRoomLinkAttributedString = [[NSAttributedString alloc] initWithString:predecessorRoomLinkString attributes:roomLinkAttributes];
[roomPredecessorAttributedString appendAttributedString:roomPredecessorReasonAttributedString];
[roomPredecessorAttributedString appendAttributedString:predecessorRoomLinkAttributedString];
NSRange wholeStringRange = NSMakeRange(0, roomPredecessorAttributedString.length);
[roomPredecessorAttributedString addAttribute:NSForegroundColorAttributeName value:self.defaultTextColor range:wholeStringRange];
return roomPredecessorAttributedString;
}
@end