diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c45428232..d9c3901ec 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,8 +1,10 @@ ### Pull Request Checklist -* [ ] I read the [contributing guide](https://github.com/vector-im/element-ios/blob/develop/CONTRIBUTING.md) -* [ ] UI change has been tested on both light and dark themes, in portrait and landscape orientations and on iPhone and iPad simulators +- [ ] I read the [contributing guide](https://github.com/vector-im/element-ios/blob/develop/CONTRIBUTING.md) +- [ ] UI change has been tested on both light and dark themes, in portrait and landscape orientations and on iPhone and iPad simulators +- [ ] Accessibility has been taken into account. * [ ] Pull request is based on the develop branch -* [ ] Pull request contains a [changelog file](https://github.com/matrix-org/matrix-ios-sdk/blob/develop/CONTRIBUTING.md#changelog) in ./changelog.d -* [ ] Pull request includes screenshots or videos of UI changes -* [ ] Pull request includes a [sign off](https://github.com/matrix-org/matrix-ios-sdk/blob/develop/CONTRIBUTING.md#sign-off) +- [ ] Pull request contains a [changelog file](https://github.com/matrix-org/matrix-ios-sdk/blob/develop/CONTRIBUTING.md#changelog) in ./changelog.d +- [ ] You've made a self review of your PR +- [ ] Pull request includes screenshots or videos of UI changes +- [ ] Pull request includes a [sign off](https://github.com/matrix-org/matrix-ios-sdk/blob/develop/CONTRIBUTING.md#sign-off) diff --git a/.github/workflows/release-alpha.yml b/.github/workflows/release-alpha.yml index af74f4827..ed175fe20 100644 --- a/.github/workflows/release-alpha.yml +++ b/.github/workflows/release-alpha.yml @@ -15,7 +15,7 @@ env: jobs: build: name: Release - runs-on: macos-latest + runs-on: macos-11 steps: - uses: actions/checkout@v2 diff --git a/CHANGES.md b/CHANGES.md index 7ace58680..ecde7c1af 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,31 @@ +## Changes in 1.6.2 (2021-10-08) + +🙌 Improvements + +- Upgrade MatrixKit version ([v0.16.5](https://github.com/matrix-org/matrix-ios-kit/releases/tag/v0.16.5)). +- URL Previews: Use attributed string whitespace for cell heights and stop breaking up the bubble data. ([#4896](https://github.com/vector-im/element-ios/issues/4896)) +- Replaced localizable strings with generated ones throughout the code. Fixed various translation issues. ([#4899](https://github.com/vector-im/element-ios/issues/4899)) +- Voice Message scrubbing should require a slightly longer press, to avoid accidental scrubbing when scrolling the timeline ([#4935](https://github.com/vector-im/element-ios/issues/4935)) +- Pods: Update ffmpeg-kit-ios-audio, FLEX, FlowCommoniOS, Reusable and SwiftLint. ([#4939](https://github.com/vector-im/element-ios/issues/4939)) +- Service Terms: Track an analytics value on accept/decline of an identity server. ([#4955](https://github.com/vector-im/element-ios/issues/4955)) + +🐛 Bugfixes + +- RecentsDataSource: Memory leak in [RecentsDataSource dataSource:didStateChange:]. ([#4193](https://github.com/vector-im/element-ios/pull/4193)) +- i18n: Standardise casing of identity server and integration manager. ([#4559](https://github.com/vector-im/element-ios/issues/4559)) +- MasterTabBarController: Listen to `MXSpaceNotificationCounter` to update the notification badge ([#4898](https://github.com/vector-im/element-ios/issues/4898)) +- Fixed unintentional voice message drafts on automatically cancelled recordings (under 1 second) ([#4970](https://github.com/vector-im/element-ios/issues/4970)) + +🧱 Build + +- Element Alpha: Build on macOS 11 to fix iOS 15 installation error. ([#4937](https://github.com/vector-im/element-ios/issues/4937)) +- Bundler: Update CocoaPods and fastlane and xcode-install. ([#4951](https://github.com/vector-im/element-ios/issues/4951)) + +📄 Documentation + +- Update PR template with a checkbox for accessibility and self review. ([#4920](https://github.com/vector-im/element-ios/issues/4920)) + + ## Changes in 1.6.1 (2021-09-30) 🙌 Improvements diff --git a/Config/AppVersion.xcconfig b/Config/AppVersion.xcconfig index 51e60cfea..2f0eca71b 100644 --- a/Config/AppVersion.xcconfig +++ b/Config/AppVersion.xcconfig @@ -15,5 +15,5 @@ // // Version -MARKETING_VERSION = 1.6.1 -CURRENT_PROJECT_VERSION = 1.6.1 +MARKETING_VERSION = 1.6.2 +CURRENT_PROJECT_VERSION = 1.6.2 diff --git a/Gemfile b/Gemfile index 3ba15fb52..53efbaf92 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,7 @@ source "https://rubygems.org" gem "xcode-install" gem "fastlane" -gem "cocoapods", '~>1.10.1' +gem "cocoapods", '~>1.11.2' plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') eval_gemfile(plugins_path) if File.exist?(plugins_path) diff --git a/Gemfile.lock b/Gemfile.lock index d1cdbdf51..a8674758c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,12 +1,14 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.3) - activesupport (5.2.4.5) + CFPropertyList (3.0.4) + rexml + activesupport (6.1.4.1) concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) algoliasearch (1.27.5) @@ -14,28 +16,28 @@ GEM json (>= 1.5.1) artifactory (3.0.15) atomos (0.1.3) - aws-eventstream (1.1.1) - aws-partitions (1.487.0) - aws-sdk-core (3.119.0) + aws-eventstream (1.2.0) + aws-partitions (1.510.0) + aws-sdk-core (3.121.1) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.46.0) - aws-sdk-core (~> 3, >= 3.119.0) + aws-sdk-kms (1.48.0) + aws-sdk-core (~> 3, >= 3.120.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.98.0) - aws-sdk-core (~> 3, >= 3.119.0) + aws-sdk-s3 (1.103.0) + aws-sdk-core (~> 3, >= 3.120.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.4) + aws-sigv4 (~> 1.4) + aws-sigv4 (1.4.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) claide (1.0.3) - cocoapods (1.10.1) - addressable (~> 2.6) + cocoapods (1.11.2) + addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.10.1) + cocoapods-core (= 1.11.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 1.4.0, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -46,26 +48,26 @@ GEM escape (~> 0.0.4) fourflusher (>= 2.3.0, < 3.0) gh_inspector (~> 1.0) - molinillo (~> 0.6.6) + molinillo (~> 0.8.0) nap (~> 1.0) - ruby-macho (~> 1.4) - xcodeproj (>= 1.19.0, < 2.0) - cocoapods-core (1.10.1) - activesupport (> 5.0, < 6) - addressable (~> 2.6) + ruby-macho (>= 1.0, < 3.0) + xcodeproj (>= 1.21.0, < 2.0) + cocoapods-core (1.11.2) + activesupport (>= 5.0, < 7) + addressable (~> 2.8) algoliasearch (~> 1.0) concurrent-ruby (~> 1.1) fuzzy_match (~> 2.0.4) nap (~> 1.0) netrc (~> 0.11) - public_suffix + public_suffix (~> 4.0) typhoeus (~> 1.0) - cocoapods-deintegrate (1.0.4) - cocoapods-downloader (1.4.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (1.5.1) cocoapods-plugins (1.0.0) nap - cocoapods-search (1.0.0) - cocoapods-trunk (1.5.0) + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) nap (>= 0.8, < 2.0) netrc (~> 0.11) cocoapods-try (1.2.0) @@ -73,19 +75,19 @@ GEM colored2 (3.1.2) commander (4.6.0) highline (~> 2.0.0) - concurrent-ruby (1.1.8) + concurrent-ruby (1.1.9) declarative (0.0.20) digest-crc (0.6.4) rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) dotenv (2.7.6) - emoji_regex (3.2.2) + emoji_regex (3.2.3) escape (0.0.4) - ethon (0.12.0) - ffi (>= 1.3.0) - excon (0.85.0) - faraday (1.7.0) + ethon (0.14.0) + ffi (>= 1.15.0) + excon (0.86.0) + faraday (1.8.0) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -110,7 +112,7 @@ GEM faraday_middleware (1.1.0) faraday (~> 1.0) fastimage (2.2.5) - fastlane (2.191.0) + fastlane (2.195.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -136,6 +138,7 @@ GEM mini_magick (>= 4.9.4, < 5.0.0) multipart-post (~> 2.0.0) naturally (~> 2.2) + optparse (~> 0.1.1) plist (>= 3.1.0, < 4.0.0) rubyzip (>= 2.0.0, < 3.0.0) security (= 0.1.3) @@ -152,13 +155,13 @@ GEM fastlane-plugin-diawi (2.1.0) rest-client (>= 2.0.0) fastlane-plugin-versioning (0.5.0) - fastlane-plugin-xcodegen (1.0.0) + fastlane-plugin-xcodegen (1.1.0) fastlane-plugin-brew (~> 0.1.1) - ffi (1.13.1) + ffi (1.15.4) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.10.0) + google-apis-androidpublisher_v3 (0.11.0) google-apis-core (>= 0.4, < 2.a) google-apis-core (0.4.1) addressable (~> 2.5, >= 2.5.1) @@ -169,18 +172,18 @@ GEM retriable (>= 2.0, < 4.a) rexml webrick - google-apis-iamcredentials_v1 (0.6.0) + google-apis-iamcredentials_v1 (0.7.0) google-apis-core (>= 0.4, < 2.a) google-apis-playcustomapp_v1 (0.5.0) google-apis-core (>= 0.4, < 2.a) - google-apis-storage_v1 (0.6.0) + google-apis-storage_v1 (0.8.0) google-apis-core (>= 0.4, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) google-cloud-env (1.5.0) faraday (>= 0.17.3, < 2.0) - google-cloud-errors (1.1.0) + google-cloud-errors (1.2.0) google-cloud-storage (1.34.1) addressable (~> 2.5) digest-crc (~> 0.4) @@ -189,37 +192,38 @@ GEM google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (0.17.0) + googleauth (1.0.0) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) - signet (~> 0.14) + signet (>= 0.16, < 2.a) highline (2.0.3) http-accept (1.7.0) http-cookie (1.0.4) domain_name (~> 0.5) httpclient (2.8.3) - i18n (1.8.9) + i18n (1.8.10) concurrent-ruby (~> 1.0) jmespath (1.4.0) json (2.5.1) - jwt (2.2.3) + jwt (2.3.0) memoist (0.16.2) mime-types (3.3.1) mime-types-data (~> 3.2015) - mime-types-data (3.2021.0704) + mime-types-data (3.2021.0901) mini_magick (4.11.0) - mini_mime (1.1.0) + mini_mime (1.1.1) minitest (5.14.4) - molinillo (0.6.6) + molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.0.0) nanaimo (0.3.0) nap (1.1.0) naturally (2.2.1) netrc (0.11.0) + optparse (0.1.1) os (1.1.1) plist (3.6.0) public_suffix (4.0.6) @@ -236,12 +240,12 @@ GEM retriable (3.1.2) rexml (3.2.5) rouge (2.0.7) - ruby-macho (1.4.0) + ruby-macho (2.5.1) ruby2_keywords (0.0.5) rubyzip (2.3.2) security (0.1.3) - signet (0.15.0) - addressable (~> 2.3) + signet (0.16.0) + addressable (~> 2.8) faraday (>= 0.17.3, < 2.0) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) @@ -251,7 +255,6 @@ GEM terminal-notifier (2.0.0) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) trailblazer-option (0.1.1) tty-cursor (0.7.1) tty-screen (0.8.1) @@ -259,16 +262,16 @@ GEM tty-cursor (~> 0.7) typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (1.2.9) - thread_safe (~> 0.1) + tzinfo (2.0.4) + concurrent-ruby (~> 1.0) uber (0.1.0) unf (0.1.4) unf_ext - unf_ext (0.0.7.7) - unicode-display_width (1.7.0) + unf_ext (0.0.8) + unicode-display_width (1.8.0) webrick (1.7.0) word_wrap (1.0.0) - xcode-install (2.6.7) + xcode-install (2.8.0) claide (>= 0.9.1, < 1.1.0) fastlane (>= 2.1.0, < 3.0.0) xcodeproj (1.21.0) @@ -282,12 +285,13 @@ GEM rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) + zeitwerk (2.4.2) PLATFORMS ruby DEPENDENCIES - cocoapods (~> 1.10.1) + cocoapods (~> 1.11.2) fastlane fastlane-plugin-diawi fastlane-plugin-versioning @@ -295,4 +299,4 @@ DEPENDENCIES xcode-install BUNDLED WITH - 2.2.24 + 2.2.28 diff --git a/Podfile b/Podfile index f495b4ef3..49dec32b5 100644 --- a/Podfile +++ b/Podfile @@ -13,7 +13,7 @@ use_frameworks! # - `{ {kit spec hash} => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for each repo. Used by Fastfile during CI # # Warning: our internal tooling depends on the name of this variable name, so be sure not to change it -$matrixKitVersion = '= 0.16.4' +$matrixKitVersion = '= 0.16.5' # $matrixKitVersion = :local # $matrixKitVersion = {'develop' => 'develop'} @@ -59,22 +59,22 @@ abstract_target 'RiotPods' do # Tools pod 'SwiftGen', '~> 6.3' - pod 'SwiftLint', '~> 0.43.0' + pod 'SwiftLint', '~> 0.44.0' target "Riot" do import_MatrixKit pod 'DGCollectionViewLeftAlignFlowLayout', '~> 1.0.4' pod 'KTCenterFlowLayout', '~> 1.3.1' pod 'ZXingObjC', '~> 3.6.5' - pod 'FlowCommoniOS', '~> 1.10.0' + pod 'FlowCommoniOS', '~> 1.12.0' pod 'ReadMoreTextView', '~> 3.0.1' pod 'SwiftBase32', '~> 0.9.0' pod 'SwiftJWT', '~> 3.6.200' pod 'SideMenu', '~> 6.5' pod 'DSWaveformImage', '~> 6.1.1' - pod 'ffmpeg-kit-ios-audio', '~> 4.4' + pod 'ffmpeg-kit-ios-audio', '~> 4.5' - pod 'FLEX', '~> 4.4.1', :configurations => ['Debug'] + pod 'FLEX', '~> 4.5.0', :configurations => ['Debug'] target 'RiotTests' do inherit! :search_paths diff --git a/Podfile.lock b/Podfile.lock index 4c40e016b..27e8a2ced 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -37,9 +37,9 @@ PODS: - DTFoundation/Core - DTFoundation/UIKit (1.7.18): - DTFoundation/Core - - ffmpeg-kit-ios-audio (4.4) - - FLEX (4.4.1) - - FlowCommoniOS (1.10.0) + - ffmpeg-kit-ios-audio (4.5) + - FLEX (4.5.0) + - FlowCommoniOS (1.12.0) - GBDeviceInfo (6.6.0): - GBDeviceInfo/Core (= 6.6.0) - GBDeviceInfo/Core (6.6.0) @@ -92,11 +92,11 @@ PODS: - Realm (10.7.6): - Realm/Headers (= 10.7.6) - Realm/Headers (10.7.6) - - Reusable (4.1.1): - - Reusable/Storyboard (= 4.1.1) - - Reusable/View (= 4.1.1) - - Reusable/Storyboard (4.1.1) - - Reusable/View (4.1.1) + - Reusable (4.1.2): + - Reusable/Storyboard (= 4.1.2) + - Reusable/View (= 4.1.2) + - Reusable/Storyboard (4.1.2) + - Reusable/View (4.1.2) - SideMenu (6.5.0) - SwiftBase32 (0.9.0) - SwiftGen (6.4.0) @@ -106,7 +106,7 @@ PODS: - BlueRSA (~> 1.0) - KituraContracts (~> 1.2) - LoggerAPI (~> 1.7) - - SwiftLint (0.43.1) + - SwiftLint (0.44.0) - SwiftyBeaver (1.9.5) - zxcvbn-ios (1.0.4) - ZXingObjC (3.6.5): @@ -116,9 +116,9 @@ PODS: DEPENDENCIES: - DGCollectionViewLeftAlignFlowLayout (~> 1.0.4) - DSWaveformImage (~> 6.1.1) - - ffmpeg-kit-ios-audio (~> 4.4) - - FLEX (~> 4.4.1) - - FlowCommoniOS (~> 1.10.0) + - ffmpeg-kit-ios-audio (~> 4.5) + - FLEX (~> 4.5.0) + - FlowCommoniOS (~> 1.12.0) - GBDeviceInfo (~> 6.6.0) - HPGrowingTextView - KeychainAccess (~> 4.2.2) @@ -134,7 +134,7 @@ DEPENDENCIES: - SwiftBase32 (~> 0.9.0) - SwiftGen (~> 6.3) - SwiftJWT (~> 3.6.200) - - SwiftLint (~> 0.43.0) + - SwiftLint (~> 0.44.0) - zxcvbn-ios - ZXingObjC (~> 3.6.5) @@ -189,9 +189,9 @@ SPEC CHECKSUMS: DSWaveformImage: 3c718a0cf99291887ee70d1d0c18d80101d3d9ce DTCoreText: ec749e013f2e1f76de5e7c7634642e600a7467ce DTFoundation: a53f8cda2489208cbc71c648be177f902ee17536 - ffmpeg-kit-ios-audio: ddfc3dac6f574e83d53f8ae33586711162685d3e - FLEX: 7ca2c8cd3a435ff501ff6d2f2141e9bdc934eaab - FlowCommoniOS: bcdf81a5f30717e711af08a8c812eb045411ba94 + ffmpeg-kit-ios-audio: 8c44d93054e1a9743a7014ec3dd26cd1ad8f2a59 + FLEX: e51461dd6f0bfb00643c262acdfea5d5d12c596b + FlowCommoniOS: e9ecbc97fb9ce5c593fb3da0e1073b65a3902026 GBDeviceInfo: ed0db16230d2fa280e1cbb39a5a7f60f6946aaec GZIP: 416858efbe66b41b206895ac6dfd5493200d95b3 HPGrowingTextView: 88a716d97fb853bcb08a4a08e4727da17efc9b19 @@ -209,16 +209,16 @@ SPEC CHECKSUMS: OLMKit: 9fb4799c4a044dd2c06bda31ec31a12191ad30b5 ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d Realm: ed860452717c8db8f4bf832b6807f7f2ce708839 - Reusable: 53a9acf5c536f229b31b5865782414b508252ddb + Reusable: 6bae6a5e8aa793c9c441db0213c863a64bce9136 SideMenu: f583187d21c5b1dd04c72002be544b555a2627a2 SwiftBase32: 9399c25a80666dc66b51e10076bf591e3bbb8f17 SwiftGen: 67860cc7c3cfc2ed25b9b74cfd55495fc89f9108 SwiftJWT: 88c412708f58c169d431d344c87bc79a87c830ae - SwiftLint: 99f82d07b837b942dd563c668de129a03fc3fb52 + SwiftLint: e96c0a8c770c7ebbc4d36c55baf9096bb65c4584 SwiftyBeaver: 84069991dd5dca07d7069100985badaca7f0ce82 zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb -PODFILE CHECKSUM: bdf413811d39894c938e52a7f4faf550040ab370 +PODFILE CHECKSUM: 367d7a514c7d8ea3cc4b0adb5878c8a192c7c2c8 COCOAPODS: 1.10.1 diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 916cb445f..244995f29 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -254,9 +254,9 @@ "room_details_access_section_anyone" = "Alle, die den Raumlink kennen - auch Gäste"; "room_details_history_section" = "Wer kann die Historie lesen?"; "room_details_history_section_anyone" = "Alle"; -"room_details_history_section_members_only" = "Nur Mitglieder (seit diese Option ausgewählt ist)"; +"room_details_history_section_members_only" = "Nur Mitglieder (ab Auswahl dieser Option)"; "room_details_history_section_members_only_since_invited" = "Nur Mitglieder (ab ihrer Einladung)"; -"room_details_history_section_members_only_since_joined" = "Nur Mitglieder (Ab ihrem Beitritt)"; +"room_details_history_section_members_only_since_joined" = "Nur Mitglieder (ab ihrem Beitritt)"; "room_details_history_section_prompt_title" = "Datenschutzwarnung"; "room_details_addresses_section" = "Adressen"; "room_details_no_local_addresses" = "Dieser Raum hat keine lokalen Adressen"; @@ -1438,7 +1438,7 @@ "settings_direct_messages" = "Direktnachrichten"; "settings_notify_me_for" = "Benachrichtige mich bei"; "settings_mentions_and_keywords" = "Erwähnungen und Schlüsselwörter"; -"settings_confirm_media_size_description" = "Wenn dies aktiviert ist, wirst du beim Senden von Bildern und Videos gefragt, wie groß sie gesendet werden sollen."; +"settings_confirm_media_size_description" = "Wenn dies aktiviert ist, wirst du beim Senden von Bildern und Videos gefragt, in welcher Größe sie gesendet werden sollen."; "settings_confirm_media_size" = "Größe beim Senden bestätigen"; "settings_notifications" = "BENACHRICHTIGUNGEN"; "settings_mentions_and_keywords_encryption_notice" = "Auf deinem Mobilgerät wirst du keine Benachrichtigungen für Erwähnungen und Schlüsselwörter in verschlüsselten Räumen erhalten."; @@ -1480,3 +1480,6 @@ "spaces_left_panel_title" = "Spaces"; "room_recents_suggested_rooms_section" = "VORGESCHLAGENE RÄUME"; "spaces_home_space_title" = "Start"; +"space_tag" = "Space"; +"open" = "Öffnen"; +"settings_links" = "LINKS"; diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index e0eb0c489..32c50a8e7 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -533,7 +533,7 @@ Tap the + to start adding people."; "settings_calls_stun_server_fallback_description" = "Allow fallback call assist server %@ when your homeserver does not offer one (your IP address would be shared during a call)."; "settings_integrations_allow_button" = "Manage integrations"; -"settings_integrations_allow_description" = "Use an Integration Manager (%@) to manage bots, bridges, widgets and sticker packs.\n\nIntegration Managers receive configuration data, and can modify widgets, send room invites and set power levels on your behalf."; +"settings_integrations_allow_description" = "Use an integration manager (%@) to manage bots, bridges, widgets and sticker packs.\n\nIntegration managers receive configuration data, and can modify widgets, send room invites and set power levels on your behalf."; "settings_ui_language" = "Language"; "settings_ui_theme" = "Theme"; @@ -618,7 +618,7 @@ Tap the + to start adding people."; "settings_devices_description" = "A session's public name is visible to people you communicate with"; "settings_discovery_no_identity_server" = "You are not currently using an identity server. To be discoverable by existing contacts you known, add one."; -"settings_discovery_terms_not_signed" = "Agree to the Identity Server (%@) Terms of Service to allow yourself to be discoverable by email address or phone number."; +"settings_discovery_terms_not_signed" = "Agree to the identity server (%@) Terms of Service to allow yourself to be discoverable by email address or phone number."; "settings_discovery_three_pids_management_information_part1" = "Manage which email addresses or phone numbers other users can use to discover you and use to invite you to rooms. Add or remove email addresses or phone numbers from this list in "; "settings_discovery_three_pids_management_information_part2" = "User Settings"; "settings_discovery_three_pids_management_information_part3" = "."; @@ -691,7 +691,7 @@ Tap the + to start adding people."; "authenticated_session_flow_not_supported" = "This app does not support the authentication mechanism on your homeserver."; // Identity server settings -"identity_server_settings_title" = "Identity Server"; +"identity_server_settings_title" = "Identity server"; "identity_server_settings_description" = "You are currently using %@ to discover and be discoverable by existing contacts you know."; "identity_server_settings_no_is_description" = "You are not currently using an identity server. To discover and be discoverable by existing contacts, add one above."; @@ -982,7 +982,7 @@ Tap the + to start adding people."; "widget_integration_missing_room_id" = "Missing room_id in request."; "widget_integration_missing_user_id" = "Missing user_id in request."; "widget_integration_room_not_visible" = "Room %@ is not visible."; -"widget_integration_manager_disabled" = "You need to enable Integration Manager in settings"; +"widget_integration_manager_disabled" = "You need to enable integration manager in settings"; // Widget Picker "widget_picker_title" = "Integrations"; diff --git a/Riot/Assets/fr.lproj/Vector.strings b/Riot/Assets/fr.lproj/Vector.strings index c9179bc7e..e46331558 100644 --- a/Riot/Assets/fr.lproj/Vector.strings +++ b/Riot/Assets/fr.lproj/Vector.strings @@ -1056,7 +1056,7 @@ "security_settings_complete_security_alert_message" = "Vous devriez d’abord améliorer la sécurité de votre session actuelle."; "security_settings_coming_soon" = "Désolé, cette action n’est pas encore disponible dans %@ iOS. Utilisez un autre client Matrix pour le configurer. %@ iOS l’utilisera."; "device_verification_self_verify_wait_new_sign_in_title" = "Vérifier cette connexion"; -"device_verification_self_verify_wait_additional_information" = "ou un autre client Matrix qui prend en charge la signature croisée."; +"device_verification_self_verify_wait_additional_information" = "Ceci fonctionne avec %@ ou un autre client Matrix prenant en charge la signature croisée."; // MARK: - Device Verification "key_verification_other_session_title" = "Vérifier la session"; "key_verification_new_session_title" = "Vérifiez votre nouvelle session"; @@ -1482,3 +1482,41 @@ "settings_mentions_and_keywords" = "Mentions et mots-clés"; "settings_default" = "Notifications par défaut"; "settings_notifications" = "NOTIFICATIONS"; +"version_check_modal_subtitle_deprecated" = "Nous avons travailler à améliorer %@ pour plus de rapidité et de confort. Malheureusement, la version d’iOS que vous utilisez n’est pas compatible avec certaines de ces améliorations et n’est plus prise en charge.\nNous vous recommandons de mettre à jour votre système pour utiliser %@ à son plein potentiel."; +"space_avatar_view_accessibility_hint" = "Changer l’avatar de l’espace"; + +// Mark: Avatar + +"space_avatar_view_accessibility_label" = "avatar"; +"space_public_join_rule" = "Espace public"; +"space_private_join_rule" = "Espace privé"; +"space_participants_action_ban" = "Supprimer de cet espace"; +"space_participants_action_remove" = "Enlever de cet espace"; +"spaces_coming_soon_detail" = "Cette fonctionnalité n’a pas été implémentée ici, mais elle arrive. Pour effectuer cette action, vous pouvez utiliser Element sur votre ordinateur."; +"spaces_invites_coming_soon_title" = "Les invitations arrivent prochainement"; +"spaces_add_rooms_coming_soon_title" = "L’ajout de salons arrive bientôt"; +"spaces_coming_soon_title" = "Prochainement"; +"spaces_no_member_found_detail" = "Vous cherchez quelqu’un qui n’est pas dans %@ ? Pour l’instant, vous pouvez l’inviter sur l’application web ou de bureau."; +"spaces_no_room_found_detail" = "Certains résultat peuvent être cachés car ils sont privés et requièrent une invitation."; +"spaces_no_result_found_title" = "Aucun résultat"; +"spaces_empty_space_detail" = "Certains salons peuvent être cachés car ils sont privés et requièrent une invitation."; +"spaces_empty_space_title" = "Cet espace n’a pas (encore) de salon"; +"space_tag" = "espace"; +"spaces_suggested_room" = "Recommandé"; +"spaces_explore_rooms" = "Parcourir les salons"; +"leave_space_and_all_rooms_action" = "Quitter tous les salons et espaces"; +"leave_space_only_action" = "Ne quitter aucun salon"; +"leave_space_message_admin_warning" = "Vous êtes administrateur de cet espace. Assurez-vous d’avoir transmis les droits d’administration à un autre membre avant de partir."; +"leave_space_message" = "Êtes vous sûr de vouloir quitter %@ ? Voulez-vous également quitter tous les salons et espaces faisant partie de cet espace ?"; +"leave_space_title" = "Quitter %@"; +"spaces_left_panel_title" = "Espaces"; +"spaces_home_space_title" = "Accueil"; +"settings_show_url_previews_description" = "Les aperçus ne seront affichés que dans les salons non-chiffrés."; +"settings_show_url_previews" = "Afficher les aperçus des sites web"; +"settings_confirm_media_size_description" = "Si activé, il vous sera demandé de préciser en quelle taille les images et vidéos doivent être envoyées."; +"settings_confirm_media_size" = "Préciser la taille lors de l’envoi"; +"settings_links" = "LIENS"; +"settings_sending_media" = "ENVOI D’IMAGES ET DE VIDÉOS"; +"room_recents_suggested_rooms_section" = "SALONS RECOMMANDÉS"; +"done" = "Terminé"; +"open" = "Ouvrir"; diff --git a/Riot/Assets/ko.lproj/Vector.strings b/Riot/Assets/ko.lproj/Vector.strings index 90d153d91..7e4ef9aac 100644 --- a/Riot/Assets/ko.lproj/Vector.strings +++ b/Riot/Assets/ko.lproj/Vector.strings @@ -43,7 +43,7 @@ "auth_register" = "등록"; "auth_submit" = "제출"; "auth_skip" = "넘기기"; -"auth_login_single_sign_on" = "통합 인증(SSO)으로 로그인"; +"auth_login_single_sign_on" = "로그인"; "auth_send_reset_email" = "초기화 이메일 보내기"; "auth_return_to_login" = "로그인 화면으로 돌아가기"; "auth_user_id_placeholder" = "이메일 혹은 사용자 이름"; @@ -170,7 +170,7 @@ "contacts_address_book_matrix_users_toggle" = "Matrix 사용자만"; "contacts_address_book_no_contact" = "로컬 연락처 없음"; "contacts_address_book_permission_required" = "로컬 연락처에 접근하는데 필요한 권한"; -"contacts_address_book_permission_denied" = "Riot이 로컬 연락처에 접근하도록 허용하지 않음"; +"contacts_address_book_permission_denied" = "%@이(가) 연락처에 접근하도록 허용하지 않음"; "contacts_user_directory_section" = "사용자 목록"; "contacts_user_directory_offline_section" = "사용자 목록 (오프라인)"; // Chat participants @@ -199,8 +199,8 @@ "room_participants_ago" = "전"; "room_participants_action_section_admin_tools" = "관리자 도구"; "room_participants_action_section_direct_chats" = "다이렉트 대화"; -"room_participants_action_section_devices" = "기기"; -"room_participants_action_section_other" = "기타"; +"room_participants_action_section_devices" = "세션"; +"room_participants_action_section_other" = "옵션"; "room_participants_action_invite" = "초대"; "room_participants_action_leave" = "이 방 떠나기"; "room_participants_action_remove" = "이 방에서 제거"; @@ -216,7 +216,7 @@ "room_participants_action_start_video_call" = "영상 통화 시작"; "room_participants_action_mention" = "언급"; // Chat -"room_jump_to_first_unread" = "처음으로 읽지 않은 메시지로 가기"; +"room_jump_to_first_unread" = "읽지 않은 메시지로 가기"; "room_new_message_notification" = "%d개의 새 메시지"; "room_new_messages_notification" = "%d개의 새 메시지"; "room_one_user_is_typing" = "%@님이 입력하는 중…"; @@ -231,8 +231,8 @@ "room_message_short_placeholder" = "메시지를 보내세요…"; "room_message_reply_to_short_placeholder" = "답장을 보내세요…"; "room_offline_notification" = "서버와의 연결이 끊겼습니다."; -"room_unsent_messages_notification" = "메시지가 보내지지 않았습니다. %1$s, %2$s, 둘 중 어느 것을 하겠습니까?"; -"room_unsent_messages_unknown_devices_notification" = "알 수 없는 기기가 있어 메시지가 보내지지 않았습니다. %1$s, %2$s, 둘 중 어느 것을 하겠습니까?"; +"room_unsent_messages_notification" = "메시지가 보내지지 않았습니다."; +"room_unsent_messages_unknown_devices_notification" = "알 수 없는 기기가 있어 메시지 전송이 실패했습니다."; "room_ongoing_conference_call" = "회의 전화가 진행 중입니다. %1$s 또는 %2$s로 참가하세요."; "room_ongoing_conference_call_with_close" = "회의 전화가 진행 중입니다. %1$s 또는 %2$s로 참가하세요. %@."; "room_ongoing_conference_call_close" = "닫기"; @@ -286,7 +286,7 @@ "room_message_edits_history_title" = "메시지 편집"; // Unknown devices "unknown_devices_alert_title" = "방에 알 수 없는 기기가 있음"; -"unknown_devices_alert" = "이 방에 확인되지 않은 알 수 없는 기기가 있습니다.이 기기가 확인한 사용자의 것이라는 보장이 없습니다.\n계속하기 전에 각 기기마다 확인 절차를 거치기를 권합니다, 하지만 원한다면 확인하지 않고 메시지를 다시 보낼 수 있습니다."; +"unknown_devices_alert" = "이 방에 검증되지 않은 알 수 없는 기기가 있습니다.\n이 기기가 사용자의 것이라는 보장이 없습니다.\n계속하기 전에 각 기기마다 검증 절차를 거치기를 권합니다, 하지만 원한다면 검증하지 않고 메시지를 다시 보낼 수 있습니다."; "unknown_devices_send_anyway" = "무시하고 보내기"; "unknown_devices_call_anyway" = "무시하고 전화"; "unknown_devices_answer_anyway" = "무시하고 답하기"; @@ -325,7 +325,7 @@ "settings_other" = "기타"; "settings_labs" = "연구실"; "settings_flair" = "허용되는 곳에 재능 보이기"; -"settings_devices" = "기기"; +"settings_devices" = "세션"; "settings_cryptography" = "암호화"; "settings_key_backup" = "키 백업"; "settings_deactivate_account" = "계정 비활성화"; @@ -354,7 +354,7 @@ "settings_pin_rooms_with_unread" = "읽지 않은 메시지가 있는 방을 고정"; "settings_on_denied_notification" = "%@에 의해 알림이 거부됬습니다, 기기 설정에서 %@을(를) 허용해주세요"; "settings_enable_callkit" = "통합 전화"; -"settings_callkit_info" = "잠금 화면에서 수신 전화를 받습니다. 시스템의 통화 내역에서 Riot 통화를 확인하세요. iCloud가 켜져있다면, 이 통화 기록은 Apple과 공유됩니다."; +"settings_callkit_info" = "잠금 화면에서 수신 전화를 받습니다. 시스템의 통화 내역에서 %@ 통화를 확인하세요. iCloud가 켜져있다면, 이 통화 기록은 Apple과 공유됩니다."; "settings_ui_language" = "언어"; "settings_ui_theme" = "테마"; "settings_ui_theme_auto" = "자동"; @@ -388,24 +388,24 @@ "settings_confirm_password" = "비밀번호 확인"; "settings_fail_to_update_password" = "비밀번호 업데이트에 실패함"; "settings_password_updated" = "비밀번호가 업데이트되었습니다"; -"settings_crypto_device_name" = "기기 공개 이름: "; -"settings_crypto_device_id" = "\n기기 ID: "; -"settings_crypto_device_key" = "\n기기 키:\n"; +"settings_crypto_device_name" = "세션 이름: "; +"settings_crypto_device_id" = "\n세션 ID: "; +"settings_crypto_device_key" = "\n세션 키:\n"; "settings_crypto_export" = "키 내보내기"; -"settings_crypto_blacklist_unverified_devices" = "확인된 기기만 암호화"; +"settings_crypto_blacklist_unverified_devices" = "검증된 세션만 암호화"; "settings_deactivate_my_account" = "내 계정 비활성화"; "settings_key_backup_info" = "암호화된 메시지는 종단간 암호화로 보호됩니다. 오직 당신과 참가자만 키를 갖고 있어서 이 메시지를 읽을 수 있습니다."; -"settings_key_backup_info_checking" = "확인 중..."; -"settings_key_backup_info_none" = "키가 이 기기에서 백업되지 않았습니다."; +"settings_key_backup_info_checking" = "확인 중…"; +"settings_key_backup_info_none" = "키가 이 세션에서 백업되지 않았습니다."; "settings_key_backup_info_signout_warning" = "이 기기에만 있을 수 있는 키를 잃지 않도록, 로그아웃하기 전에 이 기기를 키 백업에 연결하세요."; "settings_key_backup_info_version" = "키 백업 버전: %@"; "settings_key_backup_info_algorithm" = "알고리즘: %@"; -"settings_key_backup_info_valid" = "이 기기는 키를 백업하고 있습니다."; -"settings_key_backup_info_not_valid" = "이 기기는 키를 백업하고 있지 않습니다, 하지만 존재하는 백업이 있고 이것을 복구한 뒤 키를 추가할 수 있습니다."; -"settings_key_backup_info_progress" = "%@ 키를 백업하는 중..."; +"settings_key_backup_info_valid" = "이 세션은 키를 백업하고 있습니다."; +"settings_key_backup_info_not_valid" = "이 세션은 키를 백업하고 있지 않습니다, 하지만 존재하는 백업이 있고 이것을 복구한 뒤 키를 추가할 수 있습니다."; +"settings_key_backup_info_progress" = "%@ 키를 백업하는 중…"; "settings_key_backup_info_progress_done" = "모든 키가 백업됨"; -"settings_key_backup_info_trust_signature_unknown" = "백업은 기기로부터 ID로 된 서명을 갖습니다: %@"; -"settings_key_backup_info_trust_signature_valid" = "백업이 이 기기로부터 올바른 서명을 갖고 있음"; +"settings_key_backup_info_trust_signature_unknown" = "백업은 다음의 ID를 가진 세션으로부터 서명을 갖습니다: %@"; +"settings_key_backup_info_trust_signature_valid" = "백업이 이 세션부터 올바른 서명을 갖고 있음"; "settings_key_backup_info_trust_signature_valid_device_verified" = "백업이 %@(으)로부터 올바른 서명을 갖고 있음"; "settings_key_backup_info_trust_signature_valid_device_unverified" = "백업이 %@(으)로부터 서명을 갖고 있음"; "settings_key_backup_info_trust_signature_invalid_device_verified" = "백업이 %@(으)로부터 올바르지 않은 서명을 갖고 있음"; @@ -413,13 +413,13 @@ "settings_key_backup_button_create" = "키 백업 시작"; "settings_key_backup_button_restore" = "백업에서 복구"; "settings_key_backup_button_delete" = "백업 삭제"; -"settings_key_backup_button_connect" = "이 기기를 키 백업에 연결"; +"settings_key_backup_button_connect" = "이 세션을 키 백업에 연결"; "settings_key_backup_delete_confirmation_prompt_title" = "백업 삭제"; "settings_key_backup_delete_confirmation_prompt_msg" = "확신합니까? 키가 정상적으로 백업되지 않으면 암호화된 메시지를 잃게 됩니다."; // Room Details "room_details_title" = "방 세부 사항"; "room_details_people" = "구성원"; -"room_details_files" = "파일"; +"room_details_files" = "업로드"; "room_details_settings" = "설정"; "room_details_photo" = "방 사진"; "room_details_room_name" = "방 이름"; @@ -459,7 +459,7 @@ "room_details_advanced_enable_e2e_encryption" = "암호화 켜짐 (경고: 다시 끌 수 없습니다!)"; "room_details_advanced_e2e_encryption_enabled" = "이 방의 암호화가 켜졌습니다"; "room_details_advanced_e2e_encryption_disabled" = "이 방의 암호화가 꺼졌습니다."; -"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "확인된 기기만 암호화"; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "검증된 세션만 암호화"; "room_details_fail_to_update_avatar" = "방 사진 업데이트에 실패함"; "room_details_fail_to_update_room_name" = "방 이름 업데이트에 실패함"; "room_details_fail_to_update_topic" = "주제 업데이트에 실패함"; @@ -529,7 +529,7 @@ "event_formatter_jitsi_widget_added" = "%@님이 VoIP 회의를 추가했습니다"; "event_formatter_jitsi_widget_removed" = "%@님이 VoIP 회의를 제거했습니다"; "event_formatter_rerequest_keys_part1_link" = "암호화 키 다시 요청"; -"event_formatter_rerequest_keys_part2" = " 다른 기기에서."; +"event_formatter_rerequest_keys_part2" = " 다른 세션에서."; "event_formatter_message_edited_mention" = "(편집됨)"; // Others "or" = "또는"; @@ -539,7 +539,7 @@ "network_offline_prompt" = "인터넷이 오프라인입니다."; "homeserver_connection_lost" = "홈 서버에 연결할 수 없습니다."; "public_room_section_title" = "공개 방 (%@에 있음):"; -"bug_report_prompt" = "애플리케이션이 방금 충돌했군요.\n충돌 보고서를 제출하겠습니까?"; +"bug_report_prompt" = "애플리케이션이 방금 충돌했군요. 충돌 보고서를 제출하겠습니까?"; "rage_shake_prompt" = "좌절감에 휴대 전화를 흔들고 있군요. 버그 보고서를 제출하겠습니까?"; "do_not_ask_again" = "다시 묻지 않기"; "camera_access_not_granted" = "%@님은 카메라를 사용할 권한이 없습니다, 개인 정보 설정을 바꿔주세요"; @@ -550,8 +550,8 @@ // Call "call_incoming_voice_prompt" = "%@님으로부터 온 음성 통화"; "call_incoming_video_prompt" = "%@님으로부터 온 영상 통화"; -"call_incoming_voice" = "전화 수신 중..."; -"call_incoming_video" = "영상 통화 수신 중..."; +"call_incoming_voice" = "전화 수신 중...…"; +"call_incoming_video" = "영상 통화 수신 중...…"; "call_already_displayed" = "이미 전화가 진행 중입니다."; "call_jitsi_error" = "회의 전화 참가에 실패했습니다."; // No VoIP support @@ -560,8 +560,8 @@ // Crash report "google_analytics_use_prompt" = "%@이(가) 개선하도록 자동으로 익명의 충돌 보고서와 사용 데이터를 제공하겠습니까?"; // Crypto -"e2e_enabling_on_app_update" = "Riot는 이제 종단간 암호화를 지원하지만 암호화를 켜려면 다시 로그인해야 합니다.\n\n지금 다시 로그인하거나 나중에 애플리케이션 설정에서 할 수 있습니다."; -"e2e_need_log_in_again" = "이 기기에 종단간 암호화 키를 생성하고 공개 키를 홈서버에 제출하려면 다시 로그인해야 함니다.\n한 번만 하면 됩니다, 불편을 드려 죄송합니다."; +"e2e_enabling_on_app_update" = "%@는 이제 종단간 암호화를 지원하지만 암호화를 켜려면 다시 로그인해야 합니다.\n\n지금 다시 로그인하거나 나중에 애플리케이션 설정에서 할 수 있습니다."; +"e2e_need_log_in_again" = "이 세션에 종단간 암호화 키를 생성하고 공개 키를 홈서버에 제출하려면 다시 로그인해야 함니다.\n한 번만 하면 됩니다. 불편을 드려 죄송합니다."; // Key backup wrong version "e2e_key_backup_wrong_version_title" = "새 키 백업"; "e2e_key_backup_wrong_version" = "새 보안 메시지 키 백업이 감지되었습니다.\n\n당신이 한 것이 아니라면 설정에서 새 암호를 설정하세요."; @@ -601,9 +601,9 @@ "share_extension_failed_to_encrypt" = "보내기에 실패함. 기본 앱에서 이 방의 암호화 설정을 확인하세요"; // Room key request dialog "e2e_room_key_request_title" = "암호화 키 요청"; -"e2e_room_key_request_message_new_device" = "암호화 키를 요청한 새 기기 '%@'을(를) 추가했습니다."; -"e2e_room_key_request_message" = "확인하지 않은 기기 '%@'이(가) 암호화 키를 요청하고 있습니다."; -"e2e_room_key_request_start_verification" = "확인 시작..."; +"e2e_room_key_request_message_new_device" = "암호화 키를 요청한 새 세션 '%@'을(를) 추가했습니다."; +"e2e_room_key_request_message" = "확인하지 않은 세션 '%@'이(가) 암호화 키를 요청하고 있습니다."; +"e2e_room_key_request_start_verification" = "확인 시작…"; "e2e_room_key_request_share_without_verifying" = "확인없이 공유"; "e2e_room_key_request_ignore_request" = "요청 무시"; // GDPR @@ -629,7 +629,7 @@ "deactivate_account_password_alert_message" = "계속하려면, 비밀번호를 입력해주세요"; // Re-request confirmation dialog "rerequest_keys_alert_title" = "요청을 보냈습니다"; -"rerequest_keys_alert_message" = "메시지를 복호화해서 이 기기로 키를 보낼 수 있도록 Riot을 다른 기기에 설치해주세요."; +"rerequest_keys_alert_message" = "메시지를 복호화해서 이 세션으로 키를 보낼 수 있도록 %@를 다른 기기에 설치해주세요."; "key_backup_setup_title" = "키 백업"; "key_backup_setup_skip_alert_title" = "확신합니까?"; "key_backup_setup_skip_alert_message" = "로그아웃하거나 기기를 잃어버리면 보안 메시지를 잃게 됩니다."; @@ -703,21 +703,21 @@ "device_verification_security_advice" = "보안을 최대화하려면, 직접 또는 다른 신뢰할만한 통신 수단으로 확인하기를 추천합니다"; "device_verification_cancelled" = "상대방이 확인을 취소했습니다."; "device_verification_cancelled_by_me" = "확인이 취소됬습니다. 이유: %@"; -"device_verification_error_cannot_load_device" = "기기 정보를 불러올 수 없습니다."; +"device_verification_error_cannot_load_device" = "세션 정보를 불러올 수 없습니다."; // Mark: Incoming "device_verification_incoming_title" = "수신 확인 요청"; -"device_verification_incoming_description_1" = "이 기기를 신뢰하도록 확인합니다. 상대방의 신뢰하는 기기는 종단간 암호화된 메시지를 사용할 때 더 마음에 안심을 줍니다."; -"device_verification_incoming_description_2" = "이 기기를 신뢰하도록 확인합니다, 그리고 상대방도 당신의 기기를 신뢰하도록 합니다."; +"device_verification_incoming_description_1" = "이 세션을 신뢰하도록 확인합니다. 상대방의 신뢰하는 세션은 종단간 암호화된 메시지를 사용할 때 더 마음에 안심을 줍니다."; +"device_verification_incoming_description_2" = "이 세션을 신뢰하도록 확인합니다, 그리고 상대방도 당신의 세션을 신뢰하도록 합니다."; // MARK: Start "device_verification_start_title" = "짧은 문장을 비교하여 확인"; -"device_verification_start_wait_partner" = "상대방이 수락하기를 기다리는 중..."; +"device_verification_start_wait_partner" = "상대방이 수락하기를 기다리는 중…"; "device_verification_start_use_legacy" = "아무것도 안 나타나나요? 일부 클라이언트는 아직 상호작용 확인을 지원하지 않습니다. 예전 확인 방식을 사용하세요."; "device_verification_start_verify_button" = "확인 시작"; "device_verification_start_use_legacy_action" = "예전 확인 방식 사용"; // MARK: Verify "device_verification_verify_title_emoji" = "상대방의 화면에 나타나는 다음 이모지를 확인하는 것으로 이 기기를 확인합니다"; "device_verification_verify_title_number" = "상대방의 화면에 나타나는 다음 숫자를 확인하는 것으로 이 기기를 확인합니다"; -"device_verification_verify_wait_partner" = "상대방이 확인하기를 기다리는 중..."; +"device_verification_verify_wait_partner" = "상대방이 확인하기를 기다리는 중…"; // MARK: Verified "device_verification_verified_title" = "확인되었습니다!"; "device_verification_verified_description_1" = "성공적으로 이 기기를 확인했습니다."; @@ -834,7 +834,7 @@ "settings_three_pids_management_information_part3" = "."; "settings_calls_stun_server_fallback_button" = "대체 전화 지원 서버 허용"; "settings_calls_stun_server_fallback_description" = "홈서버가 전화 서버를 지원하지 않는다면 대체 전화 지원 서버 %@를 허용합니다 (전화하는 동안 IP 주소가 공유됩니다)."; -"settings_devices_description" = "기기 공개 이름은 소통하는 사람들에게 보여집니다"; +"settings_devices_description" = "세션의 공개 명칭은 대화하는 사람들에게 보여집니다"; "settings_discovery_no_identity_server" = "현재 ID 서버를 사용하고 있지 않습니다. 연락처에 알고 있는 사람들이 당신을 찾을 수 있도록 하려면 서버를 하나 추가하세요."; "settings_discovery_terms_not_signed" = "이메일이나 전화번호로 당신을 찾을 수 있도록 하려면 ID 서버 (%@)의 서비스 약관에 동의하세요."; "settings_discovery_three_pids_management_information_part1" = "무슨 이메일 주소나 전화번호로 다른 사용자가 당신을 찾고 방에 초대할 수 있는지 관리하세요. 이 목록에서 이메일 주소나 전화번호를 추가하거나 제거할 수 있습니다. "; @@ -886,8 +886,8 @@ "service_terms_modal_message_identity_server" = "연락처를 탐색하려면 ID 서버 (%@)의 약관에 동의해야 합니다."; "settings_add_3pid_password_title_email" = "이메일 주소 추가"; "settings_add_3pid_password_title_msidsn" = "전화번호 추가"; -"settings_add_3pid_password_message" = "계속하려면 비밀번호를 입력해주세요"; -"settings_add_3pid_invalid_password_message" = "잘못된 비밀번호"; +"settings_add_3pid_password_message" = "계속하려면, 비밀번호를 입력해주세요"; +"settings_add_3pid_invalid_password_message" = "유효하지 않은 인증정보"; "error_not_supported_on_mobile" = "%@ 모바일에서 할 수 없습니다."; "settings_integrations" = "통합"; "settings_integrations_allow_button" = "통합 관리"; @@ -897,3 +897,37 @@ "widget_menu_revoke_permission" = "액세스 취소"; "widget_menu_remove" = "모두를 위해 제거"; "widget_integration_manager_disabled" = "설정에서 통합 관리자를 켜야 합니다"; +"people_empty_view_information" = "누구든지 안전하게 대화하세요. 사람을 추가하려면 + 버튼을 누르세요."; +"people_empty_view_title" = "사람들"; +"room_recents_unknown_room_error_message" = "이 방을 찾을 수 없습니다. 방이 존재하는지 확인하세요"; +"room_recents_suggested_rooms_section" = "추천 방"; +"room_creation_dm_error" = "DM을 보내지 못했습니다. 초대하고 싶은 사람을 다시 확인하고 다시 시도해주세요."; +"social_login_button_title_sign_up" = "%@ (으)로 가입"; +"social_login_button_title_sign_in" = "%@ 으로 로그인하기"; +"social_login_button_title_continue" = "%@ 으로 계속하기"; +"social_login_list_title_sign_up" = "또는"; +"social_login_list_title_sign_in" = "또는"; + +// Social login + +"social_login_list_title_continue" = "다음으로 계속하기"; + +// Accessibility +"accessibility_checkbox_label" = "체크박스"; +"callbar_only_single_active_group" = "그룹 통화에 참여하기 (%@)"; +"callbar_return" = "돌아가기"; +"callbar_only_multiple_paused" = "%@ 일시정지된 통화"; +"callbar_only_single_paused" = "일시정지된 통화"; +"callbar_active_and_multiple_paused" = "1 활성화된 통화 (%@) · %@ 일시정지된 통화"; +"callbar_active_and_single_paused" = "1 활성화된 통화 (%@) · 1 일시정지된 통화"; + +// Call Bar +"callbar_only_single_active" = "전화로 돌아가기 (%@)"; +"done" = "완료"; +"open" = "열기"; +"less" = "줄이기"; +"more" = "더 보기"; +"switch" = "변경"; +"joined" = "참여했습니다"; +"skip" = "넘기기"; +"store_promotional_text" = "개방된 네트워크에서 프라이버시를 보장받을 수 있는 대화와 협업 앱. 분산화된 네트워크를 통해 정보를 제어할 수 있습니다. 데이터마이닝도 백도어도 다른 곳에서의 접근도 존재하지 않습니다."; diff --git a/Riot/Assets/nl.lproj/Vector.strings b/Riot/Assets/nl.lproj/Vector.strings index 4d8f5d3ba..2389ac4af 100644 --- a/Riot/Assets/nl.lproj/Vector.strings +++ b/Riot/Assets/nl.lproj/Vector.strings @@ -21,7 +21,7 @@ "title_rooms" = "Kamers"; "warning" = "Waarschuwing"; // Actions -"view" = "Weergeven"; +"view" = "Bekijken"; "next" = "Volgende"; "back" = "Terug"; "continue" = "Verdergaan"; @@ -1510,7 +1510,7 @@ "room_notifs_settings_encrypted_room_notice" = "Let op dat vermeldingen & trefwoorden-meldingen niet beschikbaar zijn in versleutelde kamers op mobiel."; "room_notifs_settings_account_settings" = "Accountinstellingen"; "room_notifs_settings_manage_notifications" = "U kunt uw meldingen beheren in %@"; -"room_notifs_settings_cancel_action" = "Annuleer"; +"room_notifs_settings_cancel_action" = "Annuleren"; "room_notifs_settings_done_action" = "Klaar"; "room_notifs_settings_none" = "Geen"; "room_notifs_settings_mentions_and_keywords" = "Alleen vermeldingen en trefwoorden"; diff --git a/Riot/Assets/sv.lproj/Vector.strings b/Riot/Assets/sv.lproj/Vector.strings index a51817da3..ccffe08ef 100644 --- a/Riot/Assets/sv.lproj/Vector.strings +++ b/Riot/Assets/sv.lproj/Vector.strings @@ -1406,7 +1406,14 @@ "settings_default" = "Förvalda aviseringar"; "settings_notifications" = "AVISERINGAR"; "settings_show_url_previews_description" = "Förhandsgranskningar kommer bara att visas i okrypterade rum."; -"settings_show_url_previews" = "Visa inbäddade URL-förhandsgranskningar"; +"settings_show_url_previews" = "Visa förhandsgranskningar av webbsidor"; "settings_confirm_media_size_description" = "När detta är på så kommer du få bekräfta vilken storlek bilder och videor kommer att skickas som."; "settings_confirm_media_size" = "Bekräfta storlek vid sparning"; "settings_sending_media" = "SÄNDNING AV BILDER OCH VIDEO"; +"leave_space_title" = "Lämna %@"; +"spaces_left_panel_title" = "Utrymmen"; +"spaces_home_space_title" = "Hem"; +"settings_links" = "LÄNKAR"; +"room_recents_suggested_rooms_section" = "FÖRESLAGNA RUM"; +"done" = "Klar"; +"open" = "Öppna"; diff --git a/Riot/Assets/uk.lproj/Vector.strings b/Riot/Assets/uk.lproj/Vector.strings index 11988a6b1..d91f1d708 100644 --- a/Riot/Assets/uk.lproj/Vector.strings +++ b/Riot/Assets/uk.lproj/Vector.strings @@ -76,8 +76,8 @@ "auth_use_server_options" = "Власні налаштування сервера"; "auth_email_validation_message" = "Перевірте свою пошту для продовження реєстрації"; "auth_msisdn_validation_title" = "Очікування перевірки"; -"auth_msisdn_validation_message" = "Ми надіслали SMS з кодом активації. Введіть цей код внизу."; -"auth_msisdn_validation_error" = "Неможливо перевірити номер телефону."; +"auth_msisdn_validation_message" = "Ми надіслали СМС із кодом активації. Введіть цей код унизу."; +"auth_msisdn_validation_error" = "Не вдалося перевірити номер телефону."; "auth_recaptcha_message" = "Цей домашній сервер бажає переконатися, що ви не робот"; "auth_reset_password_message" = "Щоб відновити пароль, введіть адресу е-пошти, пов'язану з вашим обліковим записом:"; "auth_reset_password_missing_email" = "Необхідно ввести адресу е-пошти, пов'язану з вашим обліковим записом."; @@ -139,7 +139,7 @@ "client_web_name" = "Element Web"; "client_ios_name" = "Element iOS"; "auth_login_single_sign_on" = "Увійти"; -"room_creation_invite_another_user" = "Пошук / запрошення по ідентифікатору користувача, імені або адреси електронної пошти"; +"room_creation_invite_another_user" = "Пошук / запрошення за ID користувача, іменем або е-поштою"; "room_creation_error_invite_user_by_email_without_identity_server" = "Сервер ідентифікації не налаштовано, тому ви не можете додати учасника з е-поштою."; // Room recents "room_recents_directory_section" = "КАТАЛОГ КІМНАТ"; @@ -234,7 +234,7 @@ "settings_change_password" = "Змінити пароль"; "settings_add_phone_number" = "Додати номер телефону"; "settings_phone_number" = "Телефон"; -"settings_add_email_address" = "Додати адресу електронної пошти"; +"settings_add_email_address" = "Додати адресу е-пошти"; "settings_email_address_placeholder" = "Введіть вашу адресу електронної пошти"; "room_title_one_active_member" = "%@/%@ активний учасник"; @@ -664,13 +664,13 @@ // MARK: QR code -"key_verification_verify_qr_code_title" = "Підтвердити скануванням"; +"key_verification_verify_qr_code_title" = "Звірити скануванням"; // Incoming key verification request -"key_verification_incoming_request_incoming_alert_message" = "%@ просить підтвердження"; +"key_verification_incoming_request_incoming_alert_message" = "%@ бажає звіритись"; "key_verification_tile_conclusion_warning_title" = "Не довірений вхід"; -"key_verification_tile_conclusion_done_title" = "Підтверджений"; +"key_verification_tile_conclusion_done_title" = "Звірений"; "key_verification_tile_request_incoming_approval_accept" = "Прийняти"; "key_verification_tile_request_status_accepted" = "Ви прийняли"; "key_verification_tile_request_status_cancelled" = "%@ скасовує"; @@ -681,8 +681,217 @@ // Tiles -"key_verification_tile_request_incoming_title" = "Запит підтвердження"; +"key_verification_tile_request_incoming_title" = "Запит звірення"; "space_beta_announce_badge" = "БЕТА"; "space_beta_announce_title" = "Простори скоро з'являться"; "space_beta_announce_subtitle" = "Нова версія спільнот"; "space_beta_announce_information" = "Простори — це новий спосіб об'єднати кімнати та людей. Їх ще не додано на iOS, але ви вже можете користуватися ними у вебпереглядачі та на комп'ютері."; + +// No VoIP support +"no_voip_title" = "Вхідний виклик"; +"call_actions_unhold" = "Продовжити"; + +// MARK: - Call Transfer +"call_transfer_title" = "Переведення"; +"space_avatar_view_accessibility_hint" = "Змінити аватар простору"; + +// Mark: Avatar + +"space_avatar_view_accessibility_label" = "аватар"; +"invite_friends_share_text" = "Агов, побалакай зі мною в %@: %@"; + +// MARK: - Invite friends + +"invite_friends_action" = "Запросити друзів до %@"; + +// MARK: - Dial Pad +"dialpad_title" = "Номеронабирач"; +"call_transfer_contacts_all" = "Усі"; +"call_transfer_contacts_recent" = "Недавні"; +"call_transfer_dialpad" = "Номеронабирач"; +"room_open_dialpad" = "Номеронабирач"; +"room_accessibility_search" = "Пошук"; +"room_action_send_file" = "Надіслати файл"; +"room_action_send_sticker" = "Надіслати наліпку"; +"room_action_send_photo_or_video" = "Надіслати світлину або відео"; +"room_event_failed_to_send" = "Не вдалося надіслати"; +"room_event_action_edit" = "Редагувати"; +"room_event_action_view_encryption" = "Відомості про шифрування"; +"room_event_action_cancel_download" = "Скасувати завантаження"; +"room_event_action_cancel_send" = "Скасувати надсилання"; +"room_message_reply_to_short_placeholder" = "Надіслати відповідь…"; +"room_message_short_placeholder" = "Надіслати повідомлення…"; +"room_message_replying_to" = "У відповідь %@"; +"room_message_editing" = "Редагування"; +"room_message_unable_open_link_error_message" = "Неможливо відкрити посилання."; +"room_message_reply_to_placeholder" = "Надіслати відповідь (не зашифровану)…"; +"room_message_placeholder" = "Надіслати повідомлення (не зашифроване)…"; +"room_many_users_are_typing" = "%@, %@ та інші друкують…"; +"room_two_users_are_typing" = "%@ і %@ друкують…"; +"room_one_user_is_typing" = "%@ друкує…"; +"room_new_messages_notification" = "%d нових повідомлень"; +"room_new_message_notification" = "%d нове повідомлення"; +"room_member_power_level_short_moderator" = "Модератор"; +"room_member_power_level_short_admin" = "Адміністратор"; +"room_member_power_level_moderator_in" = "Модератор у %@"; +"room_member_power_level_admin_in" = "Адміністратор у %@"; +"room_participants_security_loading" = "Завантаження…"; +"room_participants_action_security_status_loading" = "Завантаження…"; +"room_participants_action_security_status_warning" = "Попередження"; +"public_room_section_title" = "Загальнодоступні кімнати (на %@):"; +"do_not_ask_again" = "Не запитувати знову"; +"event_formatter_group_call_join" = "Приєднатися"; +"event_formatter_call_retry" = "Повторити"; +"event_formatter_message_edited_mention" = "(змінено)"; +"image_picker_action_library" = "Вибрати з бібліотеки"; + +// Image picker +"image_picker_action_camera" = "Сфотографувати"; +"media_picker_select" = "Вибрати"; +"room_participants_action_start_video_call" = "Почати відеовиклик"; +"room_participants_action_start_voice_call" = "Почати голосовий виклик"; +"security_settings_crypto_sessions_loading" = "Завантаження сеансів…"; +"room_participants_action_start_new_chat" = "Почати нову бесіду"; +"room_participants_action_set_admin" = "Зробити адміністратором"; +"room_participants_action_set_moderator" = "Зробити модератором"; +"security_settings_crypto_sessions" = "МОЇ СЕАНСИ"; +"room_participants_action_section_security" = "Безпека"; + +// Security settings +"security_settings_title" = "Безпека"; +"media_picker_library" = "Бібліотека"; + +// Media picker +"media_picker_title" = "Медіабібліотека"; +"room_participants_action_section_other" = "Опції"; +"room_participants_action_section_devices" = "Сеанси"; +"room_participants_action_section_admin_tools" = "Засоби адміністратора"; +"room_participants_ago" = "тому"; +"room_participants_now" = "зараз"; + +// Group rooms +"group_rooms_filter_rooms" = "Фільтр кімнат спільноти"; +"group_participants_invited_section" = "ЗАПРОШЕНІ"; +"room_participants_invited_section" = "ЗАПРОШЕНІ"; +"room_participants_invite_malformed_id" = "Хибний ID. Повинні бути адреса е-пошти або Matrix ID, наприклад, «@localpart:domain»"; +"room_participants_invite_another_user" = "Пошук / запрошення за ID користувача, іменем або е-поштою"; +"room_participants_filter_room_members_for_dm" = "Фільтр учасників"; +"room_participants_filter_room_members" = "Фільтр учасників кімнати"; +"room_participants_invite_prompt_msg" = "Ви впевнені, що хочете запросити %@ до цієї бесіди?"; +"room_participants_remove_third_party_invite_prompt_msg" = "Ви впевнені, що хочете відкликати запрошення?"; +"directory_search_results_title" = "Переглянути результати пошуку"; + +// Directory +"directory_cell_title" = "Огляд каталогу"; +"rooms_empty_view_information" = "Кімнати чудові для будь-яких групових бесід, приватних чи загальнодоступних. Натисніть +, щоб знайти наявні кімнати або створити нові."; +"room_recents_unknown_room_error_message" = "Не вдалося знайти цю кімнату. Переконайтеся, що вона існує"; +"room_recents_suggested_rooms_section" = "ПРОПОНОВАНІ КІМНАТИ"; +"room_creation_dm_error" = "Ми не можемо створити ваше особисте повідомлення. Перевірте користувачів, яких ви хочете запросити й повторіть спробу."; +"done" = "Готово"; +"open" = "Відкрити"; +"settings_devices_description" = "Загальнодоступну назву сеансу бачать люди, з якими ви спілкуєтесь"; +"no_voip" = "%@ викликає вас, але %@ поки що не підтримує дзвінки.\nВи можете знехтувати це сповіщення та відповісти на виклик з іншого пристрою, а можете відхилити його."; +"room_details_mute_notifs" = "Заглушити сповіщення"; +"settings_mentions_and_keywords_encryption_notice" = "Ви не отримуватимете сповіщення про згадки та ключові слова в зашифрованих кімнатах на мобільних пристроях."; +"settings_default" = "Типові сповіщення"; +"settings_notifications_disabled_alert_message" = "Щоб увімкнути сповіщення, перейдіть до налаштувань свого пристрою."; +"settings_notifications_disabled_alert_title" = "Сповіщення вимкнено"; +"room_offline_notification" = "Зв'язок з сервером втрачено."; +"room_unsent_messages_unknown_devices_notification" = "Не вдалося надіслати повідомлення через наявність невідомих сеансів."; +"room_unsent_messages_notification" = "Не вдалося надіслати повідомлення."; +"directory_server_all_native_rooms" = "Усі кімнати сервера Matrix"; +"group_participants_invite_malformed_id_title" = "Помилка запрошення"; +"group_participants_remove_prompt_msg" = "Ви справді хочете вилучити %@ з цієї групи?"; +"room_notifs_settings_encrypted_room_notice" = "Зверніть увагу, що сповіщення про згадки та ключові слова недоступні в зашифрованих кімнатах на мобільних пристроях."; +"room_notifs_settings_account_settings" = "Налаштування облікового запису"; +"room_notifs_settings_manage_notifications" = "Ви можете керувати сповіщеннями у %@"; +"room_notifs_settings_cancel_action" = "Скасувати"; +"key_backup_setup_success_from_passphrase_done_action" = "Готово"; +"room_notifs_settings_done_action" = "Готово"; +"room_notifs_settings_none" = "Нічого"; +"room_notifs_settings_mentions_and_keywords" = "Згадки та ключові слова"; +"room_notifs_settings_all_messages" = "Усі повідомлення"; +"settings_notify_me_for" = "Сповістити мене про"; + +// Room Notification Settings +"room_notifs_settings_notify_me_for" = "Сповістити мене про"; +"room_details_copy_room_url" = "Копіювати URL-адресу кімнати"; +"room_details_copy_room_address" = "Копіювати адресу кімнати"; +"room_details_copy_room_id" = "Копіювати ID кімнати"; +"room_details_unset_main_address" = "Не використовувати основною адресою"; +"room_details_set_main_address" = "Установити основною адресою"; +"room_details_save_changes_prompt" = "Бажаєте зберегти зміни?"; +"room_details_fail_to_enable_encryption" = "Не вдалося увімкнути шифрування цієї кімнати"; +"room_details_fail_to_update_room_communities" = "Не вдалося оновити пов'язані спільноти"; +"room_details_new_address_placeholder" = "Додати нову адресу (напр., #foo%@)"; +"room_details_new_address" = "Додати нову адресу"; + +// Re-request confirmation dialog +"rerequest_keys_alert_title" = "Запит надіслано"; +"settings_key_backup_info_algorithm" = "Алгоритм: %@"; +"settings_add_3pid_password_title_msidsn" = "Додати номер телефону"; +"settings_device_notifications" = "Сповіщення пристрою"; +"settings_add_3pid_password_title_email" = "Додати адресу е-пошти"; +"settings_password_updated" = "Пароль оновлено"; +"settings_fail_to_update_password" = "Не вдалося оновити пароль"; +"settings_confirm_password" = "підтвердити пароль"; +"settings_new_password" = "новий пароль"; +"settings_old_password" = "старий пароль"; +"room_details_advanced_e2e_encryption_disabled_for_dm" = "Шифрування не увімкнено тут."; +"room_details_advanced_e2e_encryption_disabled" = "Шифрування не увімкнено в цій кімнаті."; +"room_details_advanced_e2e_encryption_enabled_for_dm" = "Шифрування увімкнено тут"; +"room_details_advanced_e2e_encryption_enabled" = "Шифрування увімкнено в цій кімнаті"; +"room_details_advanced_enable_e2e_encryption" = "Увімкнути шифрування (попередження: вимкнути не можливо!)"; +"room_details_advanced_room_id_for_dm" = "ID:"; +"room_details_advanced_room_id" = "ID кімнати:"; +"room_details_advanced_section" = "Розширені"; +"room_details_fail_to_update_room_canonical_alias" = "Не вдалося оновити основну адресу"; +"room_details_fail_to_remove_room_aliases" = "Не вдалося вилучити адресу кімнати"; +"room_details_fail_to_add_room_aliases" = "Не вдалося додати нову адресу кімнати"; +"room_details_fail_to_update_history_visibility" = "Не вдалося оновити видимість історії"; +"room_details_fail_to_update_room_directory_visibility" = "Не вдалося оновити видимість каталогу кімнати"; +"room_details_fail_to_update_room_join_rule" = "Не вдалося оновити правила приєднання"; +"room_details_fail_to_update_room_guest_access" = "Не вдалося оновити гостьовий доступ до кімнати"; +"room_details_fail_to_update_topic" = "Не вдалося оновити тему"; +"room_details_fail_to_update_room_name" = "Не вдалося оновити назву кімнати"; +"room_details_fail_to_update_avatar" = "Не вдалося оновити світлину кімнати"; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Шифрування лише для звірених сеансів"; +"settings_crypto_blacklist_unverified_devices" = "Шифрування лише для звірених сеансів"; +"settings_crypto_export" = "Експорт ключів"; +"settings_crypto_device_key" = "\nКлюч сеансу:\n"; +"settings_crypto_device_id" = "\nID сеансу: "; +"settings_crypto_device_name" = "Назва сеансу: "; +"settings_add_3pid_invalid_password_message" = "Хибні облікові дані"; +"settings_add_3pid_password_message" = "Щоб продовжити, введіть пароль"; +"deactivate_account_password_alert_message" = "Щоб продовжити, введіть пароль"; + +// Deactivate account + +"deactivate_account_title" = "Деактивувати обліковий запис"; +"deactivate_account_password_alert_title" = "Деактивувати обліковий запис"; +"deactivate_account_validate_action" = "Деактивувати обліковий запис"; +"deactivate_account_forget_messages_information_part2_emphasize" = "Попередження"; +"key_verification_self_verify_unverified_sessions_alert_validate_action" = "Перевірити"; +"key_verification_self_verify_unverified_sessions_alert_message" = "Звірити всі свої сеанси, щоб переконатися, що ваш обліковий запис і повідомлення у безпеці."; + +// Unverified sessions + +"key_verification_self_verify_unverified_sessions_alert_title" = "Перевірте, де ви увійшли"; +"key_verification_self_verify_current_session_alert_validate_action" = "Звірити"; +"device_verification_self_verify_start_verify_action" = "Почати звірення"; +"device_verification_self_verify_alert_validate_action" = "Звірити"; +"key_verification_verified_new_session_title" = "Новий сеанс звірено!"; +"device_verification_verified_got_it_button" = "Зрозуміло"; + +// MARK: Verified + +// Device + +"device_verification_verified_title" = "Звірено!"; + +// Device + +"device_verification_verify_wait_partner" = "Очікування підтвердження партнером…"; +"key_verification_manually_verify_device_validate_action" = "Звірити"; +"room_participants_action_security_status_verify" = "Звірити"; +"room_participants_action_security_status_verified" = "Звірений"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 6891446ae..d82e45c6f 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -1595,7 +1595,7 @@ public class VectorL10n: NSObject { public static var identityServerSettingsPlaceHolder: String { return VectorL10n.tr("Vector", "identity_server_settings_place_holder") } - /// Identity Server + /// Identity server public static var identityServerSettingsTitle: String { return VectorL10n.tr("Vector", "identity_server_settings_title") } @@ -4207,7 +4207,7 @@ public class VectorL10n: NSObject { public static var settingsDiscoverySettings: String { return VectorL10n.tr("Vector", "settings_discovery_settings") } - /// Agree to the Identity Server (%@) Terms of Service to allow yourself to be discoverable by email address or phone number. + /// Agree to the identity server (%@) Terms of Service to allow yourself to be discoverable by email address or phone number. public static func settingsDiscoveryTermsNotSigned(_ p1: String) -> String { return VectorL10n.tr("Vector", "settings_discovery_terms_not_signed", p1) } @@ -4339,7 +4339,7 @@ public class VectorL10n: NSObject { public static var settingsIntegrationsAllowButton: String { return VectorL10n.tr("Vector", "settings_integrations_allow_button") } - /// Use an Integration Manager (%@) to manage bots, bridges, widgets and sticker packs.\n\nIntegration Managers receive configuration data, and can modify widgets, send room invites and set power levels on your behalf. + /// Use an integration manager (%@) to manage bots, bridges, widgets and sticker packs.\n\nIntegration managers receive configuration data, and can modify widgets, send room invites and set power levels on your behalf. public static func settingsIntegrationsAllowDescription(_ p1: String) -> String { return VectorL10n.tr("Vector", "settings_integrations_allow_description", p1) } @@ -5183,7 +5183,7 @@ public class VectorL10n: NSObject { public static var widgetIntegrationFailedToSendRequest: String { return VectorL10n.tr("Vector", "widget_integration_failed_to_send_request") } - /// You need to enable Integration Manager in settings + /// You need to enable integration manager in settings public static var widgetIntegrationManagerDisabled: String { return VectorL10n.tr("Vector", "widget_integration_manager_disabled") } diff --git a/Riot/Managers/Analytics/Analytics.h b/Riot/Managers/Analytics/Analytics.h index 03870bef7..5ad851929 100644 --- a/Riot/Managers/Analytics/Analytics.h +++ b/Riot/Managers/Analytics/Analytics.h @@ -22,6 +22,10 @@ // Metrics related to notifications FOUNDATION_EXPORT NSString *const AnalyticsNoficationsCategory; FOUNDATION_EXPORT NSString *const AnalyticsNoficationsTimeToDisplayContent; +/** + The analytics value for accept/decline of the identity server's terms. + */ +FOUNDATION_EXPORT NSString *const AnalyticsContactsIdentityServerAccepted; /** diff --git a/Riot/Managers/Analytics/Analytics.m b/Riot/Managers/Analytics/Analytics.m index fc7c3576c..cb7062932 100644 --- a/Riot/Managers/Analytics/Analytics.m +++ b/Riot/Managers/Analytics/Analytics.m @@ -21,6 +21,7 @@ NSString *const AnalyticsNoficationsCategory = @"notifications"; NSString *const AnalyticsNoficationsTimeToDisplayContent = @"timelineDisplay"; +NSString *const AnalyticsContactsIdentityServerAccepted = @"identityServerAccepted"; // Duration data will be visible under the Piwik category called "Performance". diff --git a/Riot/Managers/AppInfo/BuildInfo.m b/Riot/Managers/AppInfo/BuildInfo.m index b97e9fd2f..0853efe94 100644 --- a/Riot/Managers/AppInfo/BuildInfo.m +++ b/Riot/Managers/AppInfo/BuildInfo.m @@ -16,6 +16,8 @@ #import "BuildInfo.h" +#import "Riot-Swift.h" + #define MAKE_STRING(x) #x #define MAKE_NS_STRING(x) @MAKE_STRING(x) @@ -80,7 +82,7 @@ } else { - _readableBuildVersion = NSLocalizedStringFromTable(@"settings_config_no_build_info", @"Vector", nil); + _readableBuildVersion = [VectorL10n settingsConfigNoBuildInfo]; } } return _readableBuildVersion; diff --git a/Riot/Managers/BugReport/RageShakeManager.m b/Riot/Managers/BugReport/RageShakeManager.m index 10edcfb75..13bd5c985 100644 --- a/Riot/Managers/BugReport/RageShakeManager.m +++ b/Riot/Managers/BugReport/RageShakeManager.m @@ -67,10 +67,10 @@ static RageShakeManager* sharedInstance = nil; { if ([MXLogger crashLog]) { - confirmationAlert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"bug_report_prompt", @"Vector", nil) message:nil preferredStyle:UIAlertControllerStyleAlert]; + confirmationAlert = [UIAlertController alertControllerWithTitle:[VectorL10n bugReportPrompt] message:nil preferredStyle:UIAlertControllerStyleAlert]; __weak typeof(self) weakSelf = self; - [confirmationAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] + [confirmationAlert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n cancel] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -85,7 +85,7 @@ static RageShakeManager* sharedInstance = nil; }]]; - [confirmationAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] + [confirmationAlert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n ok] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -131,10 +131,10 @@ static RageShakeManager* sharedInstance = nil; { if ([responder isKindOfClass:[UIViewController class]]) { - confirmationAlert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"rage_shake_prompt", @"Vector", nil) message:nil preferredStyle:UIAlertControllerStyleAlert]; + confirmationAlert = [UIAlertController alertControllerWithTitle:[VectorL10n rageShakePrompt] message:nil preferredStyle:UIAlertControllerStyleAlert]; __weak typeof(self) weakSelf = self; - [confirmationAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] + [confirmationAlert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n ok] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -154,7 +154,7 @@ static RageShakeManager* sharedInstance = nil; }]]; - [confirmationAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"do_not_ask_again"] + [confirmationAlert addAction:[UIAlertAction actionWithTitle:[VectorL10n doNotAskAgain] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -169,7 +169,7 @@ static RageShakeManager* sharedInstance = nil; }]]; - [confirmationAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] + [confirmationAlert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n cancel] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { diff --git a/Riot/Managers/Call/CallPresenter.swift b/Riot/Managers/Call/CallPresenter.swift index 940ac98f3..c0d286ab9 100644 --- a/Riot/Managers/Call/CallPresenter.swift +++ b/Riot/Managers/Call/CallPresenter.swift @@ -165,9 +165,10 @@ class CallPresenter: NSObject { } else { createJitsiBlock() } + #else AppDelegate.theDelegate().showAlert(withTitle: nil, - message: Bundle.mxk_localizedString(forKey: "not_supported_yet")) + message: MatrixKitL10n.notSupportedYet) #endif } diff --git a/Riot/Managers/PushNotification/PushNotificationService.m b/Riot/Managers/PushNotification/PushNotificationService.m index 5edec7a00..24ab4246d 100644 --- a/Riot/Managers/PushNotification/PushNotificationService.m +++ b/Riot/Managers/PushNotification/PushNotificationService.m @@ -60,7 +60,7 @@ Matrix session observer used to detect new opened sessions. { UNTextInputNotificationAction *quickReply = [UNTextInputNotificationAction actionWithIdentifier:@"inline-reply" - title:NSLocalizedStringFromTable(@"room_message_short_placeholder", @"Vector", nil) + title:[VectorL10n roomMessageShortPlaceholder] options:UNNotificationActionOptionAuthenticationRequired ]; @@ -370,7 +370,7 @@ Matrix session observer used to detect new opened sessions. UNMutableNotificationContent *failureNotificationContent = [[UNMutableNotificationContent alloc] init]; failureNotificationContent.userInfo = content.userInfo; - failureNotificationContent.body = NSLocalizedStringFromTable(@"room_event_failed_to_send", @"Vector", nil); + failureNotificationContent.body = [VectorL10n roomEventFailedToSend]; failureNotificationContent.threadIdentifier = roomId; NSString *uuid = [[NSUUID UUID] UUIDString]; diff --git a/Riot/Managers/URLPreviews/URLPreviewData.swift b/Riot/Managers/URLPreviews/URLPreviewData.swift index 849b40d9f..856eb43f9 100644 --- a/Riot/Managers/URLPreviews/URLPreviewData.swift +++ b/Riot/Managers/URLPreviews/URLPreviewData.swift @@ -17,7 +17,7 @@ import Foundation @objcMembers -class URLPreviewData: NSObject { +class URLPreviewData: NSObject, MXKURLPreviewDataProtocol { /// The URL that's represented by the preview data. This may have been sanitized. /// Note: The original URL, can be found in the bubble components with `eventID` and `roomID`. let url: URL diff --git a/Riot/Managers/URLPreviews/URLPreviewService.swift b/Riot/Managers/URLPreviews/URLPreviewService.swift index d89728621..e731c27db 100644 --- a/Riot/Managers/URLPreviews/URLPreviewService.swift +++ b/Riot/Managers/URLPreviews/URLPreviewService.swift @@ -92,9 +92,9 @@ class URLPreviewService: NSObject { store.closePreview(for: eventId, in: roomId) } - /// Whether a preview for the given event has been closed or not. - func hasClosedPreview(from event: MXEvent) -> Bool { - store.hasClosedPreview(for: event.eventId, in: event.roomId) + /// Whether a preview for the given event should be shown or not. + func shouldShowPreview(for event: MXEvent) -> Bool { + !store.hasClosedPreview(for: event.eventId, in: event.roomId) } // MARK: - Private diff --git a/Riot/Managers/Widgets/WidgetManager.m b/Riot/Managers/Widgets/WidgetManager.m index f336cbade..416d5f4f6 100644 --- a/Riot/Managers/Widgets/WidgetManager.m +++ b/Riot/Managers/Widgets/WidgetManager.m @@ -262,7 +262,7 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain"; WidgetManagerConfig *config = [self configForUser:userId]; if (!config.hasUrls) { - MXLogDebug(@"[WidgetManager] createJitsiWidgetInRoom: Error: no Integrations Manager API URL for user %@", userId); + MXLogDebug(@"[WidgetManager] createJitsiWidgetInRoom: Error: no integration manager API URL for user %@", userId); failure(self.errorForNonConfiguredIntegrationManager); return nil; } @@ -358,7 +358,7 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain"; error = [NSError errorWithDomain:WidgetManagerErrorDomain code:WidgetManagerErrorCodeNotEnoughPower userInfo:@{ - NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"widget_no_power_to_manage", @"Vector", nil) + NSLocalizedDescriptionKey: [VectorL10n widgetNoPowerToManage] }]; } @@ -419,7 +419,7 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain"; NSError *error = [NSError errorWithDomain:WidgetManagerErrorDomain code:WidgetManagerErrorCodeCreationFailed userInfo:@{ - NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"widget_creation_failure", @"Vector", nil) + NSLocalizedDescriptionKey: [VectorL10n widgetCreationFailure] }]; self->failureBlockForWidgetCreation[hash][widgetId](error); @@ -574,7 +574,7 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain"; WidgetManagerConfig *config = [self configForUser:userId]; if (!config.hasUrls) { - MXLogDebug(@"[WidgetManager] registerForScalarToken: Error: no Integrations Manager API URL for user %@", mxSession.myUser.userId); + MXLogDebug(@"[WidgetManager] registerForScalarToken: Error: no integration manager API URL for user %@", mxSession.myUser.userId); failure(self.errorForNonConfiguredIntegrationManager); return nil; } @@ -624,7 +624,7 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain"; NSError *error = [NSError errorWithDomain:WidgetManagerErrorDomain code:WidgetManagerErrorCodeFailedToConnectToIntegrationsServer userInfo:@{ - NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"widget_integrations_server_failed_to_connect", @"Vector", nil) + NSLocalizedDescriptionKey: [VectorL10n widgetIntegrationsServerFailedToConnect] }]; failure(error); @@ -654,7 +654,7 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain"; WidgetManagerConfig *config = [self configForUser:userId]; if (!config.hasUrls) { - MXLogDebug(@"[WidgetManager] validateScalarToken: Error: no Integrations Manager API URL for user %@", mxSession.myUser.userId); + MXLogDebug(@"[WidgetManager] validateScalarToken: Error: no integration manager API URL for user %@", mxSession.myUser.userId); failure(self.errorForNonConfiguredIntegrationManager); return nil; } @@ -797,14 +797,14 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain"; { return [NSError errorWithDomain:WidgetManagerErrorDomain code:WidgetManagerErrorCodeNoIntegrationsServerConfigured - userInfo:@{NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"widget_no_integrations_server_configured", @"Vector", nil)}]; + userInfo:@{NSLocalizedDescriptionKey: [VectorL10n widgetNoIntegrationsServerConfigured]}]; } - (NSError*)errorForDisabledIntegrationManager { return [NSError errorWithDomain:WidgetManagerErrorDomain code:WidgetManagerErrorCodeDisabledIntegrationsServer - userInfo:@{NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"widget_integration_manager_disabled", @"Vector", nil)}]; + userInfo:@{NSLocalizedDescriptionKey: [VectorL10n widgetIntegrationManagerDisabled]}]; } @end diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index bce8e618d..d0b5217ff 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -666,7 +666,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni // Inform the end user why the app appears blank NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCannotConnectToHost - userInfo:@{NSLocalizedDescriptionKey : NSLocalizedStringFromTable(@"homeserver_connection_lost", @"Vector", nil)}]; + userInfo:@{NSLocalizedDescriptionKey : [VectorL10n homeserverConnectionLost]}]; [self showErrorAsAlert:error]; } @@ -686,7 +686,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni if (status == AFNetworkReachabilityStatusNotReachable) { // Prompt user - [[AppDelegate theDelegate] showErrorAsAlert:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorNotConnectedToInternet userInfo:@{NSLocalizedDescriptionKey : NSLocalizedStringFromTable(@"network_offline_prompt", @"Vector", nil)}]]; + [[AppDelegate theDelegate] showErrorAsAlert:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorNotConnectedToInternet userInfo:@{NSLocalizedDescriptionKey : [VectorL10n networkOfflinePrompt]}]]; } else { @@ -928,7 +928,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni } else { - title = [NSBundle mxk_localizedStringForKey:@"error"]; + title = [MatrixKitL10n error]; } } @@ -946,7 +946,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni [_errorNotification dismissViewControllerAnimated:NO completion:nil]; _errorNotification = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; - [_errorNotification addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] + [_errorNotification addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n ok] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -983,12 +983,12 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni } cryptoDataCorruptedAlert = [UIAlertController alertControllerWithTitle:nil - message:NSLocalizedStringFromTable(@"e2e_need_log_in_again", @"Vector", nil) + message:[VectorL10n e2eNeedLogInAgain] preferredStyle:UIAlertControllerStyleAlert]; __weak typeof(self) weakSelf = self; - [cryptoDataCorruptedAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"later"] + [cryptoDataCorruptedAlert addAction:[UIAlertAction actionWithTitle:[VectorL10n later] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -1000,7 +1000,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni }]]; - [cryptoDataCorruptedAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"settings_sign_out"] + [cryptoDataCorruptedAlert addAction:[UIAlertAction actionWithTitle:[VectorL10n settingsSignOut] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -1029,15 +1029,12 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni [wrongBackupVersionAlert dismissViewControllerAnimated:NO completion:nil]; } - wrongBackupVersionAlert = [UIAlertController - alertControllerWithTitle:NSLocalizedStringFromTable(@"e2e_key_backup_wrong_version_title", @"Vector", nil) - - message:NSLocalizedStringFromTable(@"e2e_key_backup_wrong_version", @"Vector", nil) - - preferredStyle:UIAlertControllerStyleAlert]; + wrongBackupVersionAlert = [UIAlertController alertControllerWithTitle:[VectorL10n e2eKeyBackupWrongVersionTitle] + message:[VectorL10n e2eKeyBackupWrongVersion] + preferredStyle:UIAlertControllerStyleAlert]; MXWeakify(self); - [wrongBackupVersionAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"e2e_key_backup_wrong_version_button_settings"] + [wrongBackupVersionAlert addAction:[UIAlertAction actionWithTitle:[VectorL10n e2eKeyBackupWrongVersionButtonSettings] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -1047,7 +1044,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni // TODO: Open settings }]]; - [wrongBackupVersionAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"e2e_key_backup_wrong_version_button_wasme"] + [wrongBackupVersionAlert addAction:[UIAlertAction actionWithTitle:[VectorL10n e2eKeyBackupWrongVersionButtonWasme] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -1176,7 +1173,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni return YES; } - // Manage email validation link from Identity Server v1 or v2 + // Manage email validation link from identity server v1 or v2 else if ([webURL.path isEqualToString:validateEmailSubmitTokenAPIPathV1] || [webURL.path isEqualToString:validateEmailSubmitTokenAPIPathV2]) { @@ -1419,7 +1416,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni [homeViewController stopActivityIndicator]; - NSString *errorMessage = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_does_not_exist", @"Vector", nil), roomIdOrAlias]; + NSString *errorMessage = [VectorL10n roomDoesNotExist:roomIdOrAlias]; [self showAlertWithTitle:nil message:errorMessage]; }]; @@ -1774,9 +1771,9 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni - (void)displayServerProvionningLinkBuyAlreadyLoggedInAlertWithCompletion:(void (^)(BOOL logout))completion { // Ask confirmation - self.logoutConfirmation = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"error_user_already_logged_in", @"Vector", nil) message:nil preferredStyle:UIAlertControllerStyleAlert]; + self.logoutConfirmation = [UIAlertController alertControllerWithTitle:[VectorL10n errorUserAlreadyLoggedIn] message:nil preferredStyle:UIAlertControllerStyleAlert]; - [self.logoutConfirmation addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"settings_sign_out", @"Vector", nil) + [self.logoutConfirmation addAction:[UIAlertAction actionWithTitle:[VectorL10n settingsSignOut] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -1784,7 +1781,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni completion(YES); }]]; - [self.logoutConfirmation addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] + [self.logoutConfirmation addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n cancel] style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { @@ -2097,7 +2094,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni __weak typeof(self) weakSelf = self; - NSString *message = NSLocalizedStringFromTable(@"settings_sign_out_confirmation", @"Vector", nil); + NSString *message = [VectorL10n settingsSignOutConfirmation]; // If the user has encrypted rooms, warn he will lose his e2e keys MXSession *session = self.mxSessions.firstObject; @@ -2105,15 +2102,15 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni { if (room.summary.isEncrypted) { - message = [message stringByAppendingString:[NSString stringWithFormat:@"\n\n%@", NSLocalizedStringFromTable(@"settings_sign_out_e2e_warn", @"Vector", nil)]]; + message = [message stringByAppendingString:[NSString stringWithFormat:@"\n\n%@", [VectorL10n settingsSignOutE2eWarn]]]; break; } } // Ask confirmation - self.logoutConfirmation = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"settings_sign_out", @"Vector", nil) message:message preferredStyle:UIAlertControllerStyleAlert]; + self.logoutConfirmation = [UIAlertController alertControllerWithTitle:[VectorL10n settingsSignOut] message:message preferredStyle:UIAlertControllerStyleAlert]; - [self.logoutConfirmation addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"settings_sign_out", @"Vector", nil) + [self.logoutConfirmation addAction:[UIAlertAction actionWithTitle:[VectorL10n settingsSignOut] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -2131,7 +2128,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni }]]; - [self.logoutConfirmation addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] + [self.logoutConfirmation addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n cancel] style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { @@ -2547,7 +2544,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni [_errorNotification dismissViewControllerAnimated:NO completion:nil]; _errorNotification = [UIAlertController alertControllerWithTitle:nil message:msg preferredStyle:UIAlertControllerStyleAlert]; - [_errorNotification addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"later"] + [_errorNotification addAction:[UIAlertAction actionWithTitle:[VectorL10n later] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -2559,7 +2556,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni }]]; - [_errorNotification addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] + [_errorNotification addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n ok] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -2640,7 +2637,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni message:messageText preferredStyle:UIAlertControllerStyleAlert]; - [self.mxInAppNotification addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] + [self.mxInAppNotification addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n cancel] style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { @@ -2653,7 +2650,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni }]]; - [self.mxInAppNotification addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"view", @"Vector", nil) + [self.mxInAppNotification addAction:[UIAlertAction actionWithTitle:[VectorL10n view] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -2700,7 +2697,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni { [accountPicker dismissViewControllerAnimated:NO completion:nil]; - accountPicker = [UIAlertController alertControllerWithTitle:[NSBundle mxk_localizedStringForKey:@"select_account"] message:nil preferredStyle:UIAlertControllerStyleActionSheet]; + accountPicker = [UIAlertController alertControllerWithTitle:[MatrixKitL10n selectAccount] message:nil preferredStyle:UIAlertControllerStyleActionSheet]; __weak typeof(self) weakSelf = self; for(MXKAccount *account in mxAccounts) @@ -2723,7 +2720,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni }]]; } - [accountPicker addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] + [accountPicker addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n cancel] style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { @@ -2885,7 +2882,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni void (^onFailure)(NSError *) = ^(NSError *error){ MXLogDebug(@"[AppDelegate] Create direct chat failed"); //Alert user - [self showAlertWithTitle:nil message:NSLocalizedStringFromTable(@"room_creation_dm_error", @"Vector", nil)]; + [self showAlertWithTitle:nil message:[VectorL10n roomCreationDmError]]; if (completion) { @@ -3000,24 +2997,24 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni NSString *homeServerName = mainSession.matrixRestClient.credentials.homeServerName; NSString *message = [NSString stringWithFormat:@"%@\n\n%@", - [NSString stringWithFormat:NSLocalizedStringFromTable(@"call_no_stun_server_error_message_1", @"Vector", nil), homeServerName], - [NSString stringWithFormat: NSLocalizedStringFromTable(@"call_no_stun_server_error_message_2", @"Vector", nil), stunFallbackHost]]; - - _errorNotification = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"call_no_stun_server_error_title", @"Vector", nil) + [VectorL10n callNoStunServerErrorMessage1:homeServerName], + [VectorL10n callNoStunServerErrorMessage2:stunFallbackHost]]; + + _errorNotification = [UIAlertController alertControllerWithTitle:[VectorL10n callNoStunServerErrorTitle] message:message preferredStyle:UIAlertControllerStyleAlert]; - - [_errorNotification addAction:[UIAlertAction actionWithTitle:[NSString stringWithFormat: NSLocalizedStringFromTable(@"call_no_stun_server_error_use_fallback_button", @"Vector", nil), stunFallbackHost] + + [_errorNotification addAction:[UIAlertAction actionWithTitle:[VectorL10n callNoStunServerErrorUseFallbackButton:stunFallbackHost] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - RiotSettings.shared.allowStunServerFallback = YES; + + RiotSettings.shared.allowStunServerFallback = YES; mainSession.callManager.fallbackSTUNServer = BuildSettings.stunServerFallbackUrlString; [AppDelegate theDelegate].errorNotification = nil; }]]; - [_errorNotification addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] + [_errorNotification addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n cancel] style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { @@ -3086,7 +3083,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni [self.slidingModalPresenter dismissWithAnimated:NO completion:nil]; - NSString *widgetCreatorUserId = widget.widgetEvent.sender ?: NSLocalizedStringFromTable(@"room_participants_unknown", @"Vector", nil); + NSString *widgetCreatorUserId = widget.widgetEvent.sender ?: [VectorL10n roomParticipantsUnknown]; MXSession *session = widget.mxSession; MXRoom *room = [session roomWithRoomId:widget.widgetEvent.roomId]; @@ -3109,8 +3106,8 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni NSString *widgetCreatorAvatarURL = widgetCreatorRoomMember.avatarUrl; NSArray *permissionStrings = @[ - NSLocalizedStringFromTable(@"room_widget_permission_display_name_permission", @"Vector", nil), - NSLocalizedStringFromTable(@"room_widget_permission_avatar_url_permission", @"Vector", nil) + [VectorL10n roomWidgetPermissionDisplayNamePermission], + [VectorL10n roomWidgetPermissionAvatarUrlPermission] ]; WidgetPermissionViewModel *widgetPermissionViewModel = [[WidgetPermissionViewModel alloc] initWithCreatorUserId:widgetCreatorUserId @@ -3214,15 +3211,15 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni NSString *appDisplayName = [[NSBundle mainBundle] infoDictionary][@"CFBundleDisplayName"]; - NSString *message = [NSString stringWithFormat:NSLocalizedStringFromTable(@"no_voip", @"Vector", nil), callerDisplayname, appDisplayName]; + NSString *message = [VectorL10n noVoip:callerDisplayname :appDisplayName]; - noCallSupportAlert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"no_voip_title", @"Vector", nil) + noCallSupportAlert = [UIAlertController alertControllerWithTitle:[VectorL10n noVoipTitle] message:message preferredStyle:UIAlertControllerStyleAlert]; __weak typeof(self) weakSelf = self; - [noCallSupportAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ignore"] + [noCallSupportAlert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n ignore] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -3234,7 +3231,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni }]]; - [noCallSupportAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"reject_call"] + [noCallSupportAlert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n rejectCall] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -3815,7 +3812,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni { senderInfo = senderId; } - + __block id observer; void (^removeObserver)(void) = ^() { @@ -3825,37 +3822,34 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni observer = nil; } }; - - UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"key_verification_tile_request_incoming_title", @"Vector", nil) - message:senderInfo - preferredStyle:UIAlertControllerStyleAlert]; - [alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"key_verification_tile_request_incoming_approval_accept", @"Vector", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) - { - removeObserver(); - [self presentIncomingKeyVerificationRequest:keyVerificationRequest inSession:session]; - }]]; + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:[VectorL10n keyVerificationTileRequestIncomingTitle] + message:senderInfo + preferredStyle:UIAlertControllerStyleAlert]; - [alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"key_verification_tile_request_incoming_approval_decline", @"Vector", nil) - style:UIAlertActionStyleDestructive - handler:^(UIAlertAction * action) - { - removeObserver(); - [keyVerificationRequest cancelWithCancelCode:MXTransactionCancelCode.user success:^{ - - } failure:^(NSError * _Nonnull error) { - MXLogDebug(@"[AppDelegate][KeyVerification] Fail to cancel incoming key verification request with error: %@", error); - }]; - }]]; + [alertController addAction:[UIAlertAction actionWithTitle:[VectorL10n keyVerificationTileRequestIncomingApprovalAccept] + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) { + removeObserver(); + [self presentIncomingKeyVerificationRequest:keyVerificationRequest inSession:session]; + }]]; - [alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"later", @"Vector", nil) - style:UIAlertActionStyleCancel - handler:^(UIAlertAction * action) - { - removeObserver(); - }]]; + [alertController addAction:[UIAlertAction actionWithTitle:[VectorL10n keyVerificationTileRequestIncomingApprovalDecline] + style:UIAlertActionStyleDestructive + handler:^(UIAlertAction * action) { + removeObserver(); + [keyVerificationRequest cancelWithCancelCode:MXTransactionCancelCode.user success:^{ + + } failure:^(NSError * _Nonnull error) { + MXLogDebug(@"[AppDelegate][KeyVerification] Fail to cancel incoming key verification request with error: %@", error); + }]; + }]]; + + [alertController addAction:[UIAlertAction actionWithTitle:[VectorL10n later] + style:UIAlertActionStyleCancel + handler:^(UIAlertAction * action) { + removeObserver(); + }]]; [self presentViewController:alertController animated:YES completion:nil]; self.incomingKeyVerificationRequestAlertController = alertController; @@ -3863,17 +3857,16 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni observer = [[NSNotificationCenter defaultCenter] addObserverForName:MXKeyVerificationRequestDidChangeNotification object:keyVerificationRequest queue:[NSOperationQueue mainQueue] - usingBlock:^(NSNotification * _Nonnull note) - { - if (keyVerificationRequest.state != MXKeyVerificationRequestStatePending) - { - if (self.incomingKeyVerificationRequestAlertController == alertController) - { - [self.incomingKeyVerificationRequestAlertController dismissViewControllerAnimated:NO completion:nil]; - removeObserver(); - } - } - }]; + usingBlock:^(NSNotification *note) { + if (keyVerificationRequest.state != MXKeyVerificationRequestStatePending) + { + if (self.incomingKeyVerificationRequestAlertController == alertController) + { + [self.incomingKeyVerificationRequestAlertController dismissViewControllerAnimated:NO completion:nil]; + removeObserver(); + } + } + }]; } #pragma mark - New Sign In @@ -3942,25 +3935,25 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni deviceInfo = device.deviceId; } - NSString *alertMessage = [NSString stringWithFormat:NSLocalizedStringFromTable(@"device_verification_self_verify_alert_message", @"Vector", nil), deviceInfo]; + NSString *alertMessage = [VectorL10n deviceVerificationSelfVerifyAlertMessage:deviceInfo]; - UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"device_verification_self_verify_alert_title", @"Vector", nil) + UIAlertController *alert = [UIAlertController alertControllerWithTitle:[VectorL10n deviceVerificationSelfVerifyAlertTitle] message:alertMessage preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"device_verification_self_verify_alert_validate_action", @"Vector", nil) + [alert addAction:[UIAlertAction actionWithTitle:[VectorL10n deviceVerificationSelfVerifyAlertValidateAction] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { self.userNewSignInAlertController = nil; [self presentSelfVerificationForOtherDeviceId:device.deviceId inSession:session]; }]]; - [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"later", @"Vector", nil) + [alert addAction:[UIAlertAction actionWithTitle:[VectorL10n later] style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { self.userNewSignInAlertController = nil; }]]; - + [self presentViewController:alert animated:YES completion:nil]; self.userNewSignInAlertController = alert; @@ -4053,13 +4046,13 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni MXSession *mainSession = self.mxSessions.firstObject; NSString *homeServerName = mainSession.matrixRestClient.credentials.homeServerName; - NSString *alertMessage = [NSString stringWithFormat:NSLocalizedStringFromTable(@"gdpr_consent_not_given_alert_message", @"Vector", nil), homeServerName]; + NSString *alertMessage = [VectorL10n gdprConsentNotGivenAlertMessage:homeServerName]; - UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"settings_term_conditions", @"Vector", nil) + UIAlertController *alert = [UIAlertController alertControllerWithTitle:[VectorL10n settingsTermConditions] message:alertMessage preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"gdpr_consent_not_given_alert_review_now_action", @"Vector", nil) + [alert addAction:[UIAlertAction actionWithTitle:[VectorL10n gdprConsentNotGivenAlertReviewNowAction] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -4071,7 +4064,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni } }]]; - [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"later", @"Vector", nil) + [alert addAction:[UIAlertAction actionWithTitle:[VectorL10n later] style:UIAlertActionStyleCancel handler:nil]]; @@ -4086,7 +4079,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni { GDPRConsentViewController *gdprConsentViewController = [[GDPRConsentViewController alloc] initWithURL:consentURI]; - UIBarButtonItem *closeBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:[NSBundle mxk_localizedStringForKey:@"close"] + UIBarButtonItem *closeBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:[MatrixKitL10n close] style:UIBarButtonItemStylePlain target:self action:@selector(dismissGDPRConsent)]; @@ -4286,7 +4279,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni [[UIApplication sharedApplication] vc_open:self.majorUpdateManager.learnMoreURL completionHandler:^(BOOL success) { if (!success) { - [self showAlertWithTitle:[NSBundle mxk_localizedStringForKey:@"error"] message:NSLocalizedStringFromTable(@"room_message_unable_open_link_error_message", @"Vector", nil)]; + [self showAlertWithTitle:[MatrixKitL10n error] message:[VectorL10n roomMessageUnableOpenLinkErrorMessage]]; } }]; @@ -4321,7 +4314,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni { if (dueToTooManyErrors) { - [self showAlertWithTitle:nil message:NSLocalizedStringFromTable(@"pin_protection_kick_user_alert_message", @"Vector", nil)]; + [self showAlertWithTitle:nil message:[VectorL10n pinProtectionKickUserAlertMessage]]; [self logoutWithConfirmation:NO completion:nil]; } else diff --git a/Riot/Modules/Authentication/AuthenticationViewController.m b/Riot/Modules/Authentication/AuthenticationViewController.m index ad064f196..d40090c3d 100644 --- a/Riot/Modules/Authentication/AuthenticationViewController.m +++ b/Riot/Modules/Authentication/AuthenticationViewController.m @@ -128,7 +128,7 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; [super viewDidLoad]; self.mainNavigationItem.title = nil; - self.rightBarButtonItem.title = NSLocalizedStringFromTable(@"auth_register", @"Vector", nil); + self.rightBarButtonItem.title = [VectorL10n authRegister]; self.defaultHomeServerUrl = RiotSettings.shared.homeserverUrlString; @@ -138,14 +138,14 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; [self.submitButton.layer setCornerRadius:5]; self.submitButton.clipsToBounds = YES; - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_login", @"Vector", nil) forState:UIControlStateNormal]; - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_login", @"Vector", nil) forState:UIControlStateHighlighted]; + [self.submitButton setTitle:[VectorL10n authLogin] forState:UIControlStateNormal]; + [self.submitButton setTitle:[VectorL10n authLogin] forState:UIControlStateHighlighted]; self.submitButton.enabled = YES; [self.skipButton.layer setCornerRadius:5]; self.skipButton.clipsToBounds = YES; - [self.skipButton setTitle:NSLocalizedStringFromTable(@"auth_skip", @"Vector", nil) forState:UIControlStateNormal]; - [self.skipButton setTitle:NSLocalizedStringFromTable(@"auth_skip", @"Vector", nil) forState:UIControlStateHighlighted]; + [self.skipButton setTitle:[VectorL10n authSkip] forState:UIControlStateNormal]; + [self.skipButton setTitle:[VectorL10n authSkip] forState:UIControlStateHighlighted]; self.skipButton.enabled = YES; [self.customServersTickButton setImage:[UIImage imageNamed:@"selection_untick"] forState:UIControlStateNormal]; @@ -163,16 +163,16 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; // Soft logout section self.softLogoutClearDataButton.layer.cornerRadius = 5; self.softLogoutClearDataButton.clipsToBounds = YES; - [self.softLogoutClearDataButton setTitle:NSLocalizedStringFromTable(@"auth_softlogout_clear_data_button", @"Vector", nil) forState:UIControlStateNormal]; - [self.softLogoutClearDataButton setTitle:NSLocalizedStringFromTable(@"auth_softlogout_clear_data_button", @"Vector", nil) forState:UIControlStateHighlighted]; + [self.softLogoutClearDataButton setTitle:[VectorL10n authSoftlogoutClearDataButton] forState:UIControlStateNormal]; + [self.softLogoutClearDataButton setTitle:[VectorL10n authSoftlogoutClearDataButton] forState:UIControlStateHighlighted]; self.softLogoutClearDataButton.enabled = YES; self.softLogoutClearDataContainer.hidden = YES; // The view controller dismiss itself on successful login. self.delegate = self; - self.homeServerTextField.placeholder = NSLocalizedStringFromTable(@"auth_home_server_placeholder", @"Vector", nil); - self.identityServerTextField.placeholder = NSLocalizedStringFromTable(@"auth_identity_server_placeholder", @"Vector", nil); + self.homeServerTextField.placeholder = [VectorL10n authHomeServerPlaceholder]; + self.identityServerTextField.placeholder = [VectorL10n authIdentityServerPlaceholder]; self.authenticationActivityIndicatorContainerView.layer.cornerRadius = 5; [self.authenticationActivityIndicator addObserver:self @@ -252,7 +252,7 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; self.authenticationActivityIndicatorContainerView.backgroundColor = ThemeService.shared.theme.baseColor; self.noFlowLabel.textColor = ThemeService.shared.theme.warningColor; - NSMutableAttributedString *forgotPasswordTitle = [[NSMutableAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"auth_forgot_password", @"Vector", nil)]; + NSMutableAttributedString *forgotPasswordTitle = [[NSMutableAttributedString alloc] initWithString:[VectorL10n authForgotPassword]]; [forgotPasswordTitle addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(0, forgotPasswordTitle.length)]; [forgotPasswordTitle addAttribute:NSForegroundColorAttributeName value:ThemeService.shared.theme.tintColor range:NSMakeRange(0, forgotPasswordTitle.length)]; [self.forgotPasswordButton setAttributedTitle:forgotPasswordTitle forState:UIControlStateNormal]; @@ -264,7 +264,7 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; [self updateForgotPwdButtonVisibility]; - NSAttributedString *serverOptionsTitle = [[NSAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"auth_use_server_options", @"Vector", nil) attributes:@{NSForegroundColorAttributeName : ThemeService.shared.theme.textSecondaryColor, NSFontAttributeName: [UIFont systemFontOfSize:14]}]; + NSAttributedString *serverOptionsTitle = [[NSAttributedString alloc] initWithString:[VectorL10n authUseServerOptions] attributes:@{NSForegroundColorAttributeName : ThemeService.shared.theme.textSecondaryColor, NSFontAttributeName: [UIFont systemFontOfSize:14]}]; [self.customServersTickButton setAttributedTitle:serverOptionsTitle forState:UIControlStateNormal]; [self.customServersTickButton setAttributedTitle:serverOptionsTitle forState:UIControlStateHighlighted]; @@ -407,25 +407,25 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; if (authType == MXKAuthenticationTypeLogin) { - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_login", @"Vector", nil) forState:UIControlStateNormal]; - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_login", @"Vector", nil) forState:UIControlStateHighlighted]; + [self.submitButton setTitle:[VectorL10n authLogin] forState:UIControlStateNormal]; + [self.submitButton setTitle:[VectorL10n authLogin] forState:UIControlStateHighlighted]; } else if (authType == MXKAuthenticationTypeRegister) { - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_register", @"Vector", nil) forState:UIControlStateNormal]; - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_register", @"Vector", nil) forState:UIControlStateHighlighted]; + [self.submitButton setTitle:[VectorL10n authRegister] forState:UIControlStateNormal]; + [self.submitButton setTitle:[VectorL10n authRegister] forState:UIControlStateHighlighted]; } else if (authType == MXKAuthenticationTypeForgotPassword) { if (isPasswordReseted) { - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_return_to_login", @"Vector", nil) forState:UIControlStateNormal]; - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_return_to_login", @"Vector", nil) forState:UIControlStateHighlighted]; + [self.submitButton setTitle:[VectorL10n authReturnToLogin] forState:UIControlStateNormal]; + [self.submitButton setTitle:[VectorL10n authReturnToLogin] forState:UIControlStateHighlighted]; } else { - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_send_reset_email", @"Vector", nil) forState:UIControlStateNormal]; - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_send_reset_email", @"Vector", nil) forState:UIControlStateHighlighted]; + [self.submitButton setTitle:[VectorL10n authSendResetEmail] forState:UIControlStateNormal]; + [self.submitButton setTitle:[VectorL10n authSendResetEmail] forState:UIControlStateHighlighted]; } } @@ -513,7 +513,7 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; if (!userInteractionEnabled) { // The right bar button is used to cancel the running request. - self.rightBarButtonItem.title = NSLocalizedStringFromTable(@"cancel", @"Vector", nil); + self.rightBarButtonItem.title = [VectorL10n cancel]; // Remove the potential back button. self.mainNavigationItem.leftBarButtonItem = nil; @@ -533,7 +533,7 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; && !self.softLogoutCredentials && BuildSettings.authScreenShowRegister) { - self.rightBarButtonItem.title = NSLocalizedStringFromTable(@"auth_register", @"Vector", nil); + self.rightBarButtonItem.title = [VectorL10n authRegister]; } else { @@ -544,7 +544,7 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; } else if (self.authType == MXKAuthenticationTypeRegister) { - self.rightBarButtonItem.title = NSLocalizedStringFromTable(@"auth_login", @"Vector", nil); + self.rightBarButtonItem.title = [VectorL10n authLogin]; // Restore the back button if (authInputsview) @@ -555,7 +555,7 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; else if (self.authType == MXKAuthenticationTypeForgotPassword) { // The right bar button is used to return to login. - self.rightBarButtonItem.title = NSLocalizedStringFromTable(@"cancel", @"Vector", nil); + self.rightBarButtonItem.title = [VectorL10n cancel]; } } } @@ -689,23 +689,23 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; // Customise the screen for soft logout self.customServersTickButton.hidden = YES; self.rightBarButtonItem.title = nil; - self.mainNavigationItem.title = NSLocalizedStringFromTable(@"auth_softlogout_signed_out", @"Vector", nil); + self.mainNavigationItem.title = [VectorL10n authSoftlogoutSignedOut]; [self showSoftLogoutClearDataContainer]; } - (void)showSoftLogoutClearDataContainer { - NSMutableAttributedString *message = [[NSMutableAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"auth_softlogout_clear_data", @"Vector", nil) + NSMutableAttributedString *message = [[NSMutableAttributedString alloc] initWithString:[VectorL10n authSoftlogoutClearData] attributes:@{ NSFontAttributeName: [UIFont boldSystemFontOfSize:14] }]; - + [message appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n\n"]]; - + NSString *string = [NSString stringWithFormat:@"%@\n\n%@", - NSLocalizedStringFromTable(@"auth_softlogout_clear_data_message_1", @"Vector", nil), - NSLocalizedStringFromTable(@"auth_softlogout_clear_data_message_2", @"Vector", nil)]; + [VectorL10n authSoftlogoutClearDataMessage1], + [VectorL10n authSoftlogoutClearDataMessage2]]; [message appendAttributedString:[[NSAttributedString alloc] initWithString:string attributes:@{ @@ -738,19 +738,20 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; [alert dismissViewControllerAnimated:NO completion:nil]; } - alert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"auth_softlogout_clear_data_sign_out_title", @"Vector", nil) - message:NSLocalizedStringFromTable(@"auth_softlogout_clear_data_sign_out_msg", @"Vector", nil) + alert = [UIAlertController alertControllerWithTitle:[VectorL10n authSoftlogoutClearDataSignOutTitle] + message:[VectorL10n authSoftlogoutClearDataSignOutMsg] preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"auth_softlogout_clear_data_sign_out", @"Vector", nil) style:UIAlertActionStyleDestructive + [alert addAction:[UIAlertAction actionWithTitle:[VectorL10n authSoftlogoutClearDataSignOut] + style:UIAlertActionStyleDestructive handler:^(UIAlertAction * action) { [self clearDataAfterSoftLogout]; }]]; MXWeakify(self); - [alert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] + [alert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n cancel] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -926,10 +927,10 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; { if (!self.isIdentityServerConfigured) { - UIAlertController *alert = [UIAlertController alertControllerWithTitle:[NSBundle mxk_localizedStringForKey:@"error"] - message:NSLocalizedStringFromTable(@"auth_forgot_password_error_no_configured_identity_server", @"Vector", nil) + UIAlertController *alert = [UIAlertController alertControllerWithTitle:[MatrixKitL10n error] + message:[VectorL10n authForgotPasswordErrorNoConfiguredIdentityServer] preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] style:UIAlertActionStyleDefault handler:nil]]; + [alert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n ok] style:UIAlertActionStyleDefault handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; return; @@ -951,12 +952,12 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; else if (self.authType == MXKAuthenticationTypeLogin) { self.authType = MXKAuthenticationTypeRegister; - self.rightBarButtonItem.title = NSLocalizedStringFromTable(@"auth_login", @"Vector", nil); + self.rightBarButtonItem.title = [VectorL10n authLogin]; } else { self.authType = MXKAuthenticationTypeLogin; - self.rightBarButtonItem.title = NSLocalizedStringFromTable(@"auth_register", @"Vector", nil); + self.rightBarButtonItem.title = [VectorL10n authRegister]; } } else if (sender == self.mainNavigationItem.leftBarButtonItem) @@ -1003,7 +1004,7 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; if ([mxError.errcode isEqualToString:kMXErrCodeStringUserInUse]) { MXLogDebug(@"[AuthenticationVC] User name is already use"); - [self onFailureDuringAuthRequest:[NSError errorWithDomain:MXKAuthErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey:[NSBundle mxk_localizedStringForKey:@"auth_username_in_use"]}]]; + [self onFailureDuringAuthRequest:[NSError errorWithDomain:MXKAuthErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey:[VectorL10n authUsernameInUse]}]]; } // - the server quota limits is not reached else if ([mxError.errcode isEqualToString:kMXErrCodeStringResourceLimitExceeded]) @@ -1141,9 +1142,9 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; [alert dismissViewControllerAnimated:NO completion:nil]; } - alert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"warning", @"Vector", nil) message:NSLocalizedStringFromTable(@"auth_add_email_and_phone_warning", @"Vector", nil) preferredStyle:UIAlertControllerStyleAlert]; + alert = [UIAlertController alertControllerWithTitle:[VectorL10n warning] message:[VectorL10n authAddEmailAndPhoneWarning] preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] + [alert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n ok] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -1184,15 +1185,15 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; if (thirdPartyIdentifiersHidden) { - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_register", @"Vector", nil) forState:UIControlStateNormal]; - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_register", @"Vector", nil) forState:UIControlStateHighlighted]; + [self.submitButton setTitle:[VectorL10n authRegister] forState:UIControlStateNormal]; + [self.submitButton setTitle:[VectorL10n authRegister] forState:UIControlStateHighlighted]; self.mainNavigationItem.leftBarButtonItem = nil; } else { - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_submit", @"Vector", nil) forState:UIControlStateNormal]; - [self.submitButton setTitle:NSLocalizedStringFromTable(@"auth_submit", @"Vector", nil) forState:UIControlStateHighlighted]; + [self.submitButton setTitle:[VectorL10n authSubmit] forState:UIControlStateNormal]; + [self.submitButton setTitle:[VectorL10n authSubmit] forState:UIControlStateHighlighted]; UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_icon"] style:UIBarButtonItemStylePlain target:self action:@selector(onButtonPressed:)]; self.mainNavigationItem.leftBarButtonItem = leftBarButtonItem; @@ -1566,11 +1567,11 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0; [self->alert dismissViewControllerAnimated:NO completion:nil]; } - self->alert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"auth_autodiscover_invalid_response", @"Vector", nil) + self->alert = [UIAlertController alertControllerWithTitle:[VectorL10n authAutodiscoverInvalidResponse] message:nil preferredStyle:UIAlertControllerStyleAlert]; - [self->alert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] + [self->alert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n ok] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { diff --git a/Riot/Modules/Authentication/AuthenticationViewController.xib b/Riot/Modules/Authentication/AuthenticationViewController.xib index c654446fc..4080c755d 100644 --- a/Riot/Modules/Authentication/AuthenticationViewController.xib +++ b/Riot/Modules/Authentication/AuthenticationViewController.xib @@ -294,7 +294,7 @@ - @@ -86,16 +82,6 @@ - - - - - - - - - - diff --git a/Riot/Modules/RoomKeyRequest/RoomKeyRequestViewController.m b/Riot/Modules/RoomKeyRequest/RoomKeyRequestViewController.m index 40c44964a..f6141d9cf 100644 --- a/Riot/Modules/RoomKeyRequest/RoomKeyRequestViewController.m +++ b/Riot/Modules/RoomKeyRequest/RoomKeyRequestViewController.m @@ -49,15 +49,15 @@ UIViewController *rootViewController = [AppDelegate theDelegate].window.rootViewController; if (rootViewController) { - NSString *title = NSLocalizedStringFromTable(@"e2e_room_key_request_title", @"Vector", nil); + NSString *title = [VectorL10n e2eRoomKeyRequestTitle]; NSString *message; if (wasNewDevice) { - message = [NSString stringWithFormat:NSLocalizedStringFromTable(@"e2e_room_key_request_message_new_device", @"Vector", nil), _device.displayName]; + message = [VectorL10n e2eRoomKeyRequestMessageNewDevice:_device.displayName]; } else { - message = [NSString stringWithFormat:NSLocalizedStringFromTable(@"e2e_room_key_request_message", @"Vector", nil), _device.displayName]; + message = [VectorL10n e2eRoomKeyRequestMessage:_device.displayName]; } _alertController = [UIAlertController alertControllerWithTitle:title @@ -66,7 +66,7 @@ __weak typeof(self) weakSelf = self; - [_alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"e2e_room_key_request_start_verification", @"Vector", nil) + [_alertController addAction:[UIAlertAction actionWithTitle:[VectorL10n e2eRoomKeyRequestStartVerification] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -79,7 +79,7 @@ } }]]; - [_alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"e2e_room_key_request_share_without_verifying", @"Vector", nil) + [_alertController addAction:[UIAlertAction actionWithTitle:[VectorL10n e2eRoomKeyRequestShareWithoutVerifying] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -97,7 +97,7 @@ } }]]; - [_alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"e2e_room_key_request_ignore_request", @"Vector", nil) + [_alertController addAction:[UIAlertAction actionWithTitle:[VectorL10n e2eRoomKeyRequestIgnoreRequest] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { diff --git a/Riot/Modules/Rooms/DirectoryPicker/DirectoryServerPickerViewController.m b/Riot/Modules/Rooms/DirectoryPicker/DirectoryServerPickerViewController.m index 0ac6943b4..e31c5fb43 100644 --- a/Riot/Modules/Rooms/DirectoryPicker/DirectoryServerPickerViewController.m +++ b/Riot/Modules/Rooms/DirectoryPicker/DirectoryServerPickerViewController.m @@ -89,7 +89,7 @@ { [super viewDidLoad]; - self.title = NSLocalizedStringFromTable(@"directory_server_picker_title", @"Vector", nil); + self.title = [VectorL10n directoryServerPickerTitle]; self.tableView.delegate = self; @@ -285,16 +285,16 @@ [currentAlert dismissViewControllerAnimated:NO completion:nil]; // Prompt the user to enter a homeserver - currentAlert = [UIAlertController alertControllerWithTitle:nil message:NSLocalizedStringFromTable(@"directory_server_type_homeserver", @"Vector", nil) preferredStyle:UIAlertControllerStyleAlert]; + currentAlert = [UIAlertController alertControllerWithTitle:nil message:[VectorL10n directoryServerTypeHomeserver] preferredStyle:UIAlertControllerStyleAlert]; [currentAlert addTextFieldWithConfigurationHandler:^(UITextField *textField) { textField.secureTextEntry = NO; - textField.placeholder = NSLocalizedStringFromTable(@"directory_server_placeholder", @"Vector", nil); + textField.placeholder = [VectorL10n directoryServerPlaceholder]; textField.keyboardType = UIKeyboardTypeDefault; }]; - [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] + [currentAlert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n cancel] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { @@ -306,7 +306,7 @@ }]]; - [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] + [currentAlert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n ok] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { diff --git a/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerDetailTableViewCell.m b/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerDetailTableViewCell.m index dfa59ad8e..a43ee7b39 100644 --- a/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerDetailTableViewCell.m +++ b/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerDetailTableViewCell.m @@ -35,11 +35,11 @@ if (cellData.includeAllNetworks) { - self.detailDescLabel.text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"directory_server_all_rooms", @"Vector", nil), cellData.homeserver]; + self.detailDescLabel.text = [VectorL10n directoryServerAllRooms:cellData.homeserver]; } else { - self.detailDescLabel.text = NSLocalizedStringFromTable(@"directory_server_all_native_rooms", @"Vector", nil); + self.detailDescLabel.text = [VectorL10n directoryServerAllNativeRooms]; } } diff --git a/Riot/Modules/Rooms/RoomsViewController.m b/Riot/Modules/Rooms/RoomsViewController.m index 19a37050b..a69bbd033 100644 --- a/Riot/Modules/Rooms/RoomsViewController.m +++ b/Riot/Modules/Rooms/RoomsViewController.m @@ -64,7 +64,7 @@ { [super viewWillAppear:animated]; - [AppDelegate theDelegate].masterTabBarController.navigationItem.title = NSLocalizedStringFromTable(@"title_rooms", @"Vector", nil); + [AppDelegate theDelegate].masterTabBarController.navigationItem.title = [VectorL10n titleRooms]; [AppDelegate theDelegate].masterTabBarController.tabBar.tintColor = ThemeService.shared.theme.tintColor; if ([self.dataSource isKindOfClass:RecentsDataSource.class]) @@ -128,8 +128,8 @@ - (void)updateEmptyView { [self.emptyView fillWith:[self emptyViewArtwork] - title:NSLocalizedStringFromTable(@"rooms_empty_view_title", @"Vector", nil) - informationText:NSLocalizedStringFromTable(@"rooms_empty_view_information", @"Vector", nil)]; + title:[VectorL10n roomsEmptyViewTitle] + informationText:[VectorL10n roomsEmptyViewInformation]]; } - (UIImage*)emptyViewArtwork diff --git a/Riot/Modules/ServiceTerms/Modal/ServiceTermsModalCoordinatorBridgePresenter.swift b/Riot/Modules/ServiceTerms/Modal/ServiceTermsModalCoordinatorBridgePresenter.swift index 201ea33b1..4b55a86f0 100644 --- a/Riot/Modules/ServiceTerms/Modal/ServiceTermsModalCoordinatorBridgePresenter.swift +++ b/Riot/Modules/ServiceTerms/Modal/ServiceTermsModalCoordinatorBridgePresenter.swift @@ -69,7 +69,9 @@ final class ServiceTermsModalCoordinatorBridgePresenter: NSObject { func present(from viewController: UIViewController, animated: Bool) { let serviceTermsModalCoordinator = ServiceTermsModalCoordinator(session: self.session, baseUrl: self.baseUrl, serviceType: self.serviceType, outOfContext: self.outOfContext, accessToken: accessToken) serviceTermsModalCoordinator.delegate = self - viewController.present(serviceTermsModalCoordinator.toPresentable(), animated: animated, completion: nil) + let presentable = serviceTermsModalCoordinator.toPresentable() + presentable.presentationController?.delegate = self + viewController.present(presentable, animated: animated, completion: nil) serviceTermsModalCoordinator.start() if let coordinator = self.coordinator { @@ -98,13 +100,36 @@ extension ServiceTermsModalCoordinatorBridgePresenter: ServiceTermsModalCoordina func serviceTermsModalCoordinatorDidAccept(_ coordinator: ServiceTermsModalCoordinatorType) { self.delegate?.serviceTermsModalCoordinatorBridgePresenterDelegateDidAccept(self) + + if serviceType == MXServiceTypeIdentityService { + Analytics.sharedInstance().trackValue(1, category: kMXKAnalyticsContactsCategory, name: AnalyticsContactsIdentityServerAccepted) + } } func serviceTermsModalCoordinatorDidDecline(_ coordinator: ServiceTermsModalCoordinatorType) { self.delegate?.serviceTermsModalCoordinatorBridgePresenterDelegateDidDecline(self, session: self.session) + + if serviceType == MXServiceTypeIdentityService { + Analytics.sharedInstance().trackValue(0, category: kMXKAnalyticsContactsCategory, name: AnalyticsContactsIdentityServerAccepted) + } } func serviceTermsModalCoordinatorDidCancel(_ coordinator: ServiceTermsModalCoordinatorType) { self.delegate?.serviceTermsModalCoordinatorBridgePresenterDelegateDidCancel(self) + + if serviceType == MXServiceTypeIdentityService { + Analytics.sharedInstance().trackValue(0, category: kMXKAnalyticsContactsCategory, name: AnalyticsContactsIdentityServerAccepted) + } + } +} + +// MARK: - UIAdaptivePresentationControllerDelegate +extension ServiceTermsModalCoordinatorBridgePresenter: UIAdaptivePresentationControllerDelegate { + func presentationControllerDidDismiss(_ presentationController: UIPresentationController) { + self.delegate?.serviceTermsModalCoordinatorBridgePresenterDelegateDidCancel(self) + + if serviceType == MXServiceTypeIdentityService { + Analytics.sharedInstance().trackValue(0, category: kMXKAnalyticsContactsCategory, name: AnalyticsContactsIdentityServerAccepted) + } } } diff --git a/Riot/Modules/Settings/DeactivateAccount/DeactivateAccountViewController.m b/Riot/Modules/Settings/DeactivateAccount/DeactivateAccountViewController.m index 0c93b1873..67b66479e 100644 --- a/Riot/Modules/Settings/DeactivateAccount/DeactivateAccountViewController.m +++ b/Riot/Modules/Settings/DeactivateAccount/DeactivateAccountViewController.m @@ -82,7 +82,7 @@ static CGFloat const kTextFontSize = 15.0; [super viewDidLoad]; // Do any additional setup after loading the view. - self.title = NSLocalizedStringFromTable(@"deactivate_account_title", @"Vector", nil); + self.title = [VectorL10n deactivateAccountTitle]; [self setupViews]; @@ -156,7 +156,7 @@ static CGFloat const kTextFontSize = 15.0; - (void)setupViews { // Cancel bar button - UIBarButtonItem *cancelBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedStringFromTable(@"cancel", @"Vector", nil) style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonAction:)]; + UIBarButtonItem *cancelBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:[VectorL10n cancel] style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonAction:)]; self.navigationItem.rightBarButtonItem = cancelBarButtonItem; // Deactivate button @@ -165,7 +165,7 @@ static CGFloat const kTextFontSize = 15.0; self.deactivateAcccountButton.titleLabel.minimumScaleFactor = 0.5; self.deactivateAcccountButton.titleLabel.baselineAdjustment = UIBaselineAdjustmentAlignCenters; self.deactivateAcccountButton.layer.masksToBounds = YES; - [self.deactivateAcccountButton setTitle:NSLocalizedStringFromTable(@"deactivate_account_validate_action", @"Vector", nil) forState:UIControlStateNormal]; + [self.deactivateAcccountButton setTitle:[VectorL10n deactivateAccountValidateAction] forState:UIControlStateNormal]; } - (void)updateNavigationBar @@ -183,15 +183,15 @@ static CGFloat const kTextFontSize = 15.0; { NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init]; - [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"deactivate_account_informations_part1", @"Vector", nil) attributes:self.normalStringAttributes]]; + [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:[VectorL10n deactivateAccountInformationsPart1] attributes:self.normalStringAttributes]]; - [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"deactivate_account_informations_part2_emphasize", @"Vector", nil) attributes:self.emphasizeStringAttributes]]; + [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:[VectorL10n deactivateAccountInformationsPart2Emphasize] attributes:self.emphasizeStringAttributes]]; - [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"deactivate_account_informations_part3", @"Vector", nil) attributes:self.normalStringAttributes]]; + [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:[VectorL10n deactivateAccountInformationsPart3] attributes:self.normalStringAttributes]]; - [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"deactivate_account_informations_part4_emphasize", @"Vector", nil) attributes:self.emphasizeStringAttributes]]; + [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:[VectorL10n deactivateAccountInformationsPart4Emphasize] attributes:self.emphasizeStringAttributes]]; - [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"deactivate_account_informations_part5", @"Vector", nil) attributes:self.normalStringAttributes]]; + [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:[VectorL10n deactivateAccountInformationsPart5] attributes:self.normalStringAttributes]]; [self.deactivateAccountInfosLabel setAttributedText:attributedString]; } @@ -200,11 +200,11 @@ static CGFloat const kTextFontSize = 15.0; { NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init]; - [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"deactivate_account_forget_messages_information_part1", @"Vector", nil) attributes:self.normalStringAttributes]]; + [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:[VectorL10n deactivateAccountForgetMessagesInformationPart1] attributes:self.normalStringAttributes]]; - [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"deactivate_account_forget_messages_information_part2_emphasize", @"Vector", nil) attributes:self.emphasizeStringAttributes]]; + [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:[VectorL10n deactivateAccountForgetMessagesInformationPart2Emphasize] attributes:self.emphasizeStringAttributes]]; - [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:NSLocalizedStringFromTable(@"deactivate_account_forget_messages_information_part3", @"Vector", nil) attributes:self.normalStringAttributes]]; + [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:[VectorL10n deactivateAccountForgetMessagesInformationPart3] attributes:self.normalStringAttributes]]; [self.forgetMessagesInfoLabel setAttributedText:attributedString]; } @@ -219,8 +219,8 @@ static CGFloat const kTextFontSize = 15.0; - (void)presentPasswordRequiredAlertWithSubmitHandler:(void (^)(NSString *password))submitHandler cancelHandler:(dispatch_block_t)cancelHandler { - UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"deactivate_account_password_alert_title", @"Vector", nil) - message:NSLocalizedStringFromTable(@"deactivate_account_password_alert_message", @"Vector", nil) preferredStyle:UIAlertControllerStyleAlert]; + UIAlertController *alert = [UIAlertController alertControllerWithTitle:[VectorL10n deactivateAccountPasswordAlertTitle] + message:[VectorL10n deactivateAccountPasswordAlertMessage] preferredStyle:UIAlertControllerStyleAlert]; [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) { textField.secureTextEntry = YES; @@ -228,7 +228,7 @@ static CGFloat const kTextFontSize = 15.0; textField.keyboardType = UIKeyboardTypeDefault; }]; - [alert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] + [alert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n cancel] style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { if (cancelHandler) @@ -239,7 +239,7 @@ static CGFloat const kTextFontSize = 15.0; __weak typeof(self) weakSelf = self; - [alert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"submit"] + [alert addAction:[UIAlertAction actionWithTitle:[MatrixKitL10n submit] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { UITextField *textField = alert.textFields.firstObject; diff --git a/Riot/Modules/Settings/Discovery/ThreePidDetails/SettingsDiscoveryThreePidDetailsViewController.swift b/Riot/Modules/Settings/Discovery/ThreePidDetails/SettingsDiscoveryThreePidDetailsViewController.swift index 2652e207d..44e49b07c 100644 --- a/Riot/Modules/Settings/Discovery/ThreePidDetails/SettingsDiscoveryThreePidDetailsViewController.swift +++ b/Riot/Modules/Settings/Discovery/ThreePidDetails/SettingsDiscoveryThreePidDetailsViewController.swift @@ -226,15 +226,15 @@ final class SettingsDiscoveryThreePidDetailsViewController: UIViewController { private func presentPendingEmailVerificationAlert() { - let alert = UIAlertController(title: Bundle.mxk_localizedString(forKey: "account_email_validation_title"), - message: Bundle.mxk_localizedString(forKey: "account_email_validation_message"), + let alert = UIAlertController(title: MatrixKitL10n.accountEmailValidationTitle, + message: MatrixKitL10n.accountEmailValidationMessage, preferredStyle: .alert) alert.addAction(UIAlertAction(title: VectorL10n.continue, style: .default, handler: { _ in self.viewModel.process(viewAction: .confirmEmailValidation) })) - alert.addAction(UIAlertAction(title: Bundle.mxk_localizedString(forKey: "cancel"), style: .cancel, handler: { _ in + alert.addAction(UIAlertAction(title: MatrixKitL10n.cancel, style: .cancel, handler: { _ in self.viewModel.process(viewAction: .cancelThreePidValidation) })) @@ -244,8 +244,8 @@ final class SettingsDiscoveryThreePidDetailsViewController: UIViewController { private func presentPendingMSISDNVerificationAlert() { - let alert = UIAlertController(title: Bundle.mxk_localizedString(forKey: "account_msisdn_validation_title"), - message: Bundle.mxk_localizedString(forKey: "account_msisdn_validation_message"), + let alert = UIAlertController(title: MatrixKitL10n.accountMsisdnValidationTitle, + message: MatrixKitL10n.accountMsisdnValidationMessage, preferredStyle: .alert) alert.addTextField { (textField) in @@ -260,7 +260,7 @@ final class SettingsDiscoveryThreePidDetailsViewController: UIViewController { self.viewModel.process(viewAction: .confirmMSISDNValidation(code: smsCode)) })) - alert.addAction(UIAlertAction(title: Bundle.mxk_localizedString(forKey: "cancel"), style: .cancel, handler: { _ in + alert.addAction(UIAlertAction(title: MatrixKitL10n.cancel, style: .cancel, handler: { _ in self.viewModel.process(viewAction: .cancelThreePidValidation) })) diff --git a/Riot/Modules/Settings/IdentityServer/SettingsIdentityServerViewController.storyboard b/Riot/Modules/Settings/IdentityServer/SettingsIdentityServerViewController.storyboard index b33325642..69b2e017f 100644 --- a/Riot/Modules/Settings/IdentityServer/SettingsIdentityServerViewController.storyboard +++ b/Riot/Modules/Settings/IdentityServer/SettingsIdentityServerViewController.storyboard @@ -28,7 +28,7 @@ -