diff --git a/CHANGES.rst b/CHANGES.rst index 3a59ebcf1..15f800fb6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,12 +5,14 @@ Changes to be released in next version * ๐Ÿ™Œ Improvements - * Pods: Update FlowCommoniOS, GBDeviceInfo, KeychainAccess, MatomoTracker, SwiftJWT, SwiftLint (#4120). - * Room lists: Remove shields on room avatars (#4115). + * Add `gitter.im` to list of default room directories + * MasterTabBarController: Show/Hide Home Screen tabs (#4234). + * RoomVC: Enable / Disable VoIP feature in Rooms (#4236). + * UnifiedSearchRecentsDataSource: Show/Hide public directory (#4242). + * DirectoryRecentTableViewCell: Do not use "directory_search_results_more_than" string when there is no rooms and the search is on. ๐Ÿ› Bugfix - * RoomVC: Fix timeline blink on sending. - * RoomVC: Fix not visible last bubble issue. + * PublicRoomsDirectoryDataSource: Fix search when NSFW filter is off. โš ๏ธ API Changes * @@ -24,12 +26,220 @@ Changes to be released in next version Others * +Changes in 1.3.4 (2021-04-19) +================================================= + +โœจ Features + * + +๐Ÿ™Œ Improvements + * + +๐Ÿ› Bugfix + * RoomVC: Crash in refreshTypingNotification (#4230). + +โš ๏ธ API Changes + * + +๐Ÿ—ฃ Translations + * + +๐Ÿงฑ Build + * + +Others + * + +Improvements: + + +Changes in 1.3.3 (2021-04-16) +================================================= + +โœจ Features + * + +๐Ÿ™Œ Improvements + * + +๐Ÿ› Bugfix + * + +โš ๏ธ API Changes + * + +๐Ÿ—ฃ Translations + * + +๐Ÿงฑ Build + * + +Others + * + +Improvements: + * Upgrade MatrixKit version ([v0.14.9](https://github.com/matrix-org/matrix-ios-kit/releases/tag/v0.14.9)). + +Changes in 1.3.2 (2021-04-16) +================================================= + +โœจ Features + * + +๐Ÿ™Œ Improvements + * + +๐Ÿ› Bugfix + * Self-verification: Fix compatibility with Element-Web (#4217). + * Notifications: Fix sender display name that can miss (#4222). + +โš ๏ธ API Changes + * + +๐Ÿ—ฃ Translations + * + +๐Ÿงฑ Build + * + +Others + * + +Improvements: + * Upgrade MatrixKit version ([v0.14.9](https://github.com/matrix-org/matrix-ios-kit/releases/tag/v0.14.9)). + +Changes in 1.3.1 (2021-04-14) +================================================= + +โœจ Features + * + +๐Ÿ™Œ Improvements + * + +๐Ÿ› Bugfix + * + +โš ๏ธ API Changes + * + +๐Ÿ—ฃ Translations + * + +๐Ÿงฑ Build + * + +Others + * + +Improvements: + * Upgrade MatrixKit version ([v0.14.8](https://github.com/matrix-org/matrix-ios-kit/releases/tag/v0.14.8)). + +Changes in 1.3.0 (2021-04-09) +================================================= + +โœจ Features + * Composer Update - Typing and sending a message (#4085) + * Switching composer between text mode & action mode (#4087) + * Explore typing notifications inspired by web (#4134) + +๐Ÿ™Œ Improvements + * Make the application settings more configurable (#4171) + * Possibility to lock some room creation parameters from settings (#4181) + * Enable / disable external friends invite (#4173) + * Composer update - UI enhancements (#4133) + * Increase grow/shrink animation speed in new composer (#4187) + * Limit typing notifications timeline jumps (#4176) + * Consider displaying names in typing notifications (#4175) + +๐Ÿ› Bugfix + * If you start typing while the new attachment sending mode is on, the send button appears (#4155) + * The final frames of the appearance animation of the new composer buttons are missing (#4160) + * Crash in [RoomViewController setupActions] (#4162) + * Too much vertical whitespace when replying (#4164) + * Black theme uses dark background for composer (#4192) + * Vertical layout of typing notifs can go wonky (#4159) + * Crash in [RoomViewController refreshTypingNotification] (#4161) + +โš ๏ธ API Changes + * + +๐Ÿ—ฃ Translations + * + +๐Ÿงฑ Build + * + +Others + * + +Improvements: + * Upgrade MatrixKit version ([v0.14.7](https://github.com/matrix-org/matrix-ios-kit/releases/tag/v0.14.7)). + +Changes in 1.2.8 (2021-03-26) +================================================= + +โœจ Features + * + +๐Ÿ™Œ Improvements + * + +๐Ÿ› Bugfix + * Xcodegen: Unit tests are broken (#4152). + +โš ๏ธ API Changes + * + +๐Ÿ—ฃ Translations + * + +๐Ÿงฑ Build + * + +Others + * + +Improvements: + + +Changes in 1.2.7 (2021-03-24) +================================================= + +โœจ Features + * + +๐Ÿ™Œ Improvements + * Pods: Update FlowCommoniOS, GBDeviceInfo, KeychainAccess, MatomoTracker, SwiftJWT, SwiftLint (#4120). + * Room lists: Remove shields on room avatars (#4115). + +๐Ÿ› Bugfix + * RoomVC: Fix timeline blink on sending. + * RoomVC: Fix not visible last bubble issue. + * Room directory: Fix crash (#4137). + +โš ๏ธ API Changes + * + +๐Ÿ—ฃ Translations + * + +๐Ÿงฑ Build + * + +Others + * + +Improvements: + * Upgrade MatrixKit version ([v0.14.6](https://github.com/matrix-org/matrix-ios-kit/releases/tag/v0.14.6)). + Changes in 1.2.6 (2021-03-11) ================================================= โœจ Features * Improve the status of send messages (sending, sent, received, failed) (#4014) * Retrying & deleting failed messages (#4013) + * Composer Update - Typing and sending a message (#4085) ๐Ÿ™Œ Improvements * @@ -62,7 +272,7 @@ Changes in 1.2.5 (2021-03-03) * Settings: Add option to show NSFW public rooms (off by default). ๐Ÿ› Bugfix - * + * Emoji store: Include short name when searching emojis (#4063). โš ๏ธ API Changes * diff --git a/Config/AppIdentifiers.xcconfig b/Config/AppIdentifiers.xcconfig index d290d67fe..fbb194172 100644 --- a/Config/AppIdentifiers.xcconfig +++ b/Config/AppIdentifiers.xcconfig @@ -22,8 +22,8 @@ APPLICATION_GROUP_IDENTIFIER = group.im.vector APPLICATION_SCHEME = element // Version -MARKETING_VERSION = 1.2.7 -CURRENT_PROJECT_VERSION = 1.2.7 +MARKETING_VERSION = 1.3.5 +CURRENT_PROJECT_VERSION = 1.3.5 // Team diff --git a/Config/BuildSettings.swift b/Config/BuildSettings.swift index d06d29747..de586d02d 100644 --- a/Config/BuildSettings.swift +++ b/Config/BuildSettings.swift @@ -109,6 +109,8 @@ final class BuildSettings: NSObject { // MARK: - Legal URLs + + // Note: Set empty strings to hide the related entry in application settings static let applicationCopyrightUrlString = "https://element.io/copyright" static let applicationPrivacyPolicyUrlString = "https://element.io/privacy" static let applicationTermsConditionsUrlString = "https://element.io/terms-of-service" @@ -148,7 +150,8 @@ final class BuildSettings: NSObject { static let publicRoomsAllowServerChange: Bool = true // List of homeservers for the public rooms directory static let publicRoomsDirectoryServers = [ - "matrix.org" + "matrix.org", + "gitter.im" ] @@ -193,6 +196,8 @@ final class BuildSettings: NSObject { static let allowLocalContactsAccess: Bool = true + static let allowInviteExernalUsers: Bool = true + // MARK: - Feature Specifics /// Not allowed pin codes. User won't be able to select one of the pin in the list. @@ -210,6 +215,13 @@ final class BuildSettings: NSObject { /// Indicates should the app log out the user when number of biometrics failures reaches `maxAllowedNumberOfBiometricsFailures`. Defaults to `false` static let logOutUserWhenBiometricsFailuresExceeded: Bool = false + // MARK: - Main Tabs + + static let homeScreenShowFavouritesTab: Bool = true + static let homeScreenShowPeopleTab: Bool = true + static let homeScreenShowRoomsTab: Bool = true + static let homeScreenShowCommunitiesTab: Bool = true + // MARK: - General Settings Screen static let settingsScreenShowUserFirstName: Bool = false @@ -225,10 +237,32 @@ final class BuildSettings: NSObject { static let settingsScreenAllowChangingCrashUsageDataSettings: Bool = true static let settingsScreenAllowBugReportingManually: Bool = true static let settingsScreenAllowDeactivatingAccount: Bool = true - + static let settingsScreenShowChangePassword:Bool = true + static let settingsScreenShowInviteFriends:Bool = true + static let settingsScreenShowEnableStunServerFallback: Bool = true + static let settingsSecurityScreenShowSessions:Bool = true + static let settingsSecurityScreenShowSetupBackup:Bool = true + static let settingsSecurityScreenShowRestoreBackup:Bool = true + static let settingsSecurityScreenShowDeleteBackup:Bool = true + static let settingsSecurityScreenShowCryptographyInfo:Bool = true + static let settingsSecurityScreenShowCryptographyExport:Bool = true + static let settingsSecurityScreenShowAdvancedUnverifiedDevices:Bool = true + // MARK: - Timeline settings static let roomInputToolbarCompressionMode = MXKRoomInputToolbarCompressionModePrompt + // MARK: - Room Creation Screen + + static let roomCreationScreenAllowEncryptionConfiguration: Bool = true + static let roomCreationScreenRoomIsEncrypted: Bool = true + static let roomCreationScreenAllowRoomTypeConfiguration: Bool = true + static let roomCreationScreenRoomIsPublic: Bool = false + + // MARK: - Room Screen + + static let roomScreenAllowVoIPForDirectRoom: Bool = true + static let roomScreenAllowVoIPForNonDirectRoom: Bool = true + // MARK: - Room Settings Screen static let roomSettingsScreenShowLowPriorityOption: Bool = true @@ -258,4 +292,7 @@ final class BuildSettings: NSObject { static let authScreenShowPhoneNumber = true static let authScreenShowForgotPassword = true static let authScreenShowCustomServerOptions = true + + // Mark: - Unified Search + static let unifiedSearchScreenShowPublicDirectory = true } diff --git a/Gemfile b/Gemfile index 1f57bb8b0..3ba15fb52 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,7 @@ source "https://rubygems.org" gem "xcode-install" gem "fastlane" -gem "cocoapods", '~>1.10.0' +gem "cocoapods", '~>1.10.1' 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 fcfae5852..31e7491fe 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,7 +2,7 @@ GEM remote: https://rubygems.org/ specs: CFPropertyList (3.0.2) - activesupport (5.2.4.4) + activesupport (5.2.4.5) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -31,10 +31,10 @@ GEM aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) claide (1.0.3) - cocoapods (1.10.0) + cocoapods (1.10.1) addressable (~> 2.6) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.10.0) + cocoapods-core (= 1.10.1) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 1.4.0, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -49,7 +49,7 @@ GEM nap (~> 1.0) ruby-macho (~> 1.4) xcodeproj (>= 1.19.0, < 2.0) - cocoapods-core (1.10.0) + cocoapods-core (1.10.1) activesupport (> 5.0, < 6) addressable (~> 2.6) algoliasearch (~> 1.0) @@ -72,7 +72,7 @@ GEM colored2 (3.1.2) commander-fastlane (4.4.6) highline (~> 1.7.2) - concurrent-ruby (1.1.7) + concurrent-ruby (1.1.8) declarative (0.0.20) declarative-option (0.1.0) digest-crc (0.6.1) @@ -170,7 +170,7 @@ GEM http-cookie (1.0.3) domain_name (~> 0.5) httpclient (2.8.3) - i18n (1.8.5) + i18n (1.8.9) concurrent-ruby (~> 1.0) jmespath (1.4.0) json (2.3.1) @@ -178,7 +178,7 @@ GEM memoist (0.16.2) mini_magick (4.11.0) mini_mime (1.0.2) - minitest (5.14.2) + minitest (5.14.4) molinillo (0.6.6) multi_json (1.15.0) multipart-post (2.0.0) @@ -219,7 +219,7 @@ GEM tty-cursor (~> 0.7) typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (1.2.8) + tzinfo (1.2.9) thread_safe (~> 0.1) uber (0.1.0) unf (0.1.4) @@ -245,11 +245,11 @@ PLATFORMS ruby DEPENDENCIES - cocoapods (~> 1.10.0) + cocoapods (~> 1.10.1) fastlane fastlane-plugin-versioning fastlane-plugin-xcodegen xcode-install BUNDLED WITH - 2.1.4 + 2.2.14 diff --git a/Podfile b/Podfile index b8a686acb..f711d8ec5 100644 --- a/Podfile +++ b/Podfile @@ -11,7 +11,7 @@ use_frameworks! # - `{ {kit spec hash} => {sdk spec hash}` to depend on specific pod options (:git => โ€ฆ, :podspec => โ€ฆ) for each repo. Used by Fastfile during CI # # Warning: our internal tooling depends on the name of this variable name, so be sure not to change it -$matrixKitVersion = '= 0.14.5' +$matrixKitVersion = '= 0.14.9' # $matrixKitVersion = :local # $matrixKitVersion = {'develop' => 'develop'} diff --git a/Podfile.lock b/Podfile.lock index 1353afc3f..448464a21 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -55,28 +55,28 @@ PODS: - MatomoTracker (7.4.1): - MatomoTracker/Core (= 7.4.1) - MatomoTracker/Core (7.4.1) - - MatrixKit (0.14.5): + - MatrixKit (0.14.9): - Down (~> 0.10.0) - DTCoreText (~> 1.6.25) - HPGrowingTextView (~> 1.1) - libPhoneNumber-iOS (~> 0.9.13) - - MatrixKit/Core (= 0.14.5) - - MatrixSDK (= 0.18.5) - - MatrixKit/Core (0.14.5): + - MatrixKit/Core (= 0.14.9) + - MatrixSDK (= 0.18.9) + - MatrixKit/Core (0.14.9): - Down (~> 0.10.0) - DTCoreText (~> 1.6.25) - HPGrowingTextView (~> 1.1) - libPhoneNumber-iOS (~> 0.9.13) - - MatrixSDK (= 0.18.5) - - MatrixSDK (0.18.5): - - MatrixSDK/Core (= 0.18.5) - - MatrixSDK/Core (0.18.5): + - MatrixSDK (= 0.18.9) + - MatrixSDK (0.18.9): + - MatrixSDK/Core (= 0.18.9) + - MatrixSDK/Core (0.18.9): - AFNetworking (~> 4.0.0) - GZIP (~> 1.3.0) - libbase58 (~> 0.1.4) - OLMKit (~> 3.2.2) - Realm (= 10.7.2) - - MatrixSDK/JingleCallStack (0.18.5): + - MatrixSDK/JingleCallStack (0.18.9): - JitsiMeetSDK (= 3.2.0) - MatrixSDK/Core - OLMKit (3.2.2): @@ -115,7 +115,7 @@ DEPENDENCIES: - KeychainAccess (~> 4.2.2) - KTCenterFlowLayout (~> 1.3.1) - MatomoTracker (~> 7.4.1) - - MatrixKit (= 0.14.5) + - MatrixKit (= 0.14.9) - MatrixSDK - MatrixSDK/JingleCallStack - OLMKit @@ -186,8 +186,8 @@ SPEC CHECKSUMS: LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d Logging: beeb016c9c80cf77042d62e83495816847ef108b MatomoTracker: 24a846c9d3aa76933183fe9d47fd62c9efa863fb - MatrixKit: f77c5aa1a236331665d3b1f25ed37ed8758eb23f - MatrixSDK: 013859281629b8cccd3a8af1dec48f36335c058c + MatrixKit: ee8e8d82c2d5fe24ec205d53b15dcaa87e9a913d + MatrixSDK: 74ea0905116cba4cf5709410894a95bbc007307e OLMKit: 20d1c564033a1ae7148f8f599378d4c798363905 ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d Realm: e523da9ade306c5ae87e85dc09fdef148d3e1cc1 @@ -199,6 +199,6 @@ SPEC CHECKSUMS: zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb -PODFILE CHECKSUM: 442355a7d44d6f0b26a287702404a221cffb03f5 +PODFILE CHECKSUM: 761363c2101ec4039b1b7bcc34f084465ac7f11e COCOAPODS: 1.10.1 diff --git a/Riot/Assets/Base.lproj/Main.storyboard b/Riot/Assets/Base.lproj/Main.storyboard index b4e354b0f..ff80d131e 100644 --- a/Riot/Assets/Base.lproj/Main.storyboard +++ b/Riot/Assets/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -34,14 +34,6 @@ - - - - - - - - @@ -96,7 +88,7 @@ - + @@ -320,7 +312,7 @@ - + @@ -589,11 +581,10 @@ - - + + - @@ -602,5 +593,8 @@ + + + diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/Contents.json b/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/Contents.json index 91448ccb6..3b025c1f0 100644 --- a/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/Contents.json +++ b/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/Contents.json @@ -1,23 +1,23 @@ { "images" : [ { - "idiom" : "universal", "filename" : "encryption_normal.png", + "idiom" : "universal", "scale" : "1x" }, { - "idiom" : "universal", "filename" : "encryption_normal@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "encryption_normal@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal.png b/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal.png index c628f322a..6222e3d16 100644 Binary files a/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal.png and b/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal.png differ diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal@2x.png b/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal@2x.png index 07555f27b..e1ff17913 100644 Binary files a/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal@2x.png and b/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal@3x.png b/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal@3x.png index 85e974954..ce4f7314a 100644 Binary files a/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal@3x.png and b/Riot/Assets/Images.xcassets/Encryption/encryption_normal.imageset/encryption_normal@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/Contents.json b/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/Contents.json index cfcf9df66..10f014560 100644 --- a/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/Contents.json +++ b/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/Contents.json @@ -1,23 +1,23 @@ { "images" : [ { - "idiom" : "universal", "filename" : "encryption_trusted.png", + "idiom" : "universal", "scale" : "1x" }, { - "idiom" : "universal", "filename" : "encryption_trusted@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "encryption_trusted@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted.png b/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted.png index 748d42a77..b1ad29a5c 100644 Binary files a/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted.png and b/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted.png differ diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted@2x.png b/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted@2x.png index 02488c979..361df06c0 100644 Binary files a/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted@2x.png and b/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted@3x.png b/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted@3x.png index 9154725c9..7abd021d4 100644 Binary files a/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted@3x.png and b/Riot/Assets/Images.xcassets/Encryption/encryption_trusted.imageset/encryption_trusted@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/Contents.json b/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/Contents.json index d71cc04ce..3198dc4ef 100644 --- a/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/Contents.json +++ b/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/Contents.json @@ -1,23 +1,23 @@ { "images" : [ { - "idiom" : "universal", "filename" : "encryption_warning.png", + "idiom" : "universal", "scale" : "1x" }, { - "idiom" : "universal", "filename" : "encryption_warning@2x.png", + "idiom" : "universal", "scale" : "2x" }, { - "idiom" : "universal", "filename" : "encryption_warning@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning.png b/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning.png index 099c1c2a5..ef4d2426e 100644 Binary files a/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning.png and b/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning.png differ diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning@2x.png b/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning@2x.png index 15bd69270..d99aa7fa1 100644 Binary files a/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning@2x.png and b/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning@3x.png b/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning@3x.png index 2629a149a..33b1b4397 100644 Binary files a/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning@3x.png and b/Riot/Assets/Images.xcassets/Encryption/encryption_warning.imageset/encryption_warning@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/Contents.json b/Riot/Assets/Images.xcassets/Room/Actions/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Actions/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/Contents.json new file mode 100644 index 000000000..aec39f6e4 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "action_camera.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "action_camera@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "action_camera@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/action_camera.png b/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/action_camera.png new file mode 100644 index 000000000..799e2c02a Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/action_camera.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/action_camera@2x.png b/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/action_camera@2x.png new file mode 100644 index 000000000..191b388f9 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/action_camera@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/action_camera@3x.png b/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/action_camera@3x.png new file mode 100644 index 000000000..7af3968c9 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_camera.imageset/action_camera@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/Contents.json new file mode 100644 index 000000000..63ec74393 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "action_file.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "action_file@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "action_file@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/action_file.png b/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/action_file.png new file mode 100644 index 000000000..0d944b128 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/action_file.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/action_file@2x.png b/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/action_file@2x.png new file mode 100644 index 000000000..4f4522ab7 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/action_file@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/action_file@3x.png b/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/action_file@3x.png new file mode 100644 index 000000000..13ed744fc Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_file.imageset/action_file@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/Contents.json new file mode 100644 index 000000000..7854a9423 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "action_media_library.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "action_media_library@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "action_media_library@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/action_media_library.png b/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/action_media_library.png new file mode 100644 index 000000000..0adba836c Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/action_media_library.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/action_media_library@2x.png b/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/action_media_library@2x.png new file mode 100644 index 000000000..aa6ddc4f9 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/action_media_library@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/action_media_library@3x.png b/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/action_media_library@3x.png new file mode 100644 index 000000000..2dfd074ab Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_media_library.imageset/action_media_library@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/Contents.json new file mode 100644 index 000000000..adf12f0d6 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "action_sticker.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "action_sticker@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "action_sticker@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/action_sticker.png b/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/action_sticker.png new file mode 100644 index 000000000..cb7a04d3f Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/action_sticker.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/action_sticker@2x.png b/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/action_sticker@2x.png new file mode 100644 index 000000000..13a2b7511 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/action_sticker@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/action_sticker@3x.png b/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/action_sticker@3x.png new file mode 100644 index 000000000..d000e8f4c Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Actions/action_sticker.imageset/action_sticker@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/Contents.json index 8d7bcd9ce..4e597c1e4 100644 --- a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/Contents.json +++ b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/Contents.json @@ -19,8 +19,5 @@ "info" : { "author" : "xcode", "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "template" } } diff --git a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown.png b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown.png index ac61fd1ea..4e639fb9b 100644 Binary files a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown.png and b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown@2x.png b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown@2x.png index 490d720c2..aabb2b121 100644 Binary files a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown@2x.png and b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown@3x.png b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown@3x.png index cd5dba5f1..81685ed6b 100644 Binary files a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown@3x.png and b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown.imageset/scrolldown@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/Contents.json new file mode 100644 index 000000000..6dc294359 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "scrolldown_dark.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "scrolldown_dark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "scrolldown_dark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/scrolldown_dark.png b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/scrolldown_dark.png new file mode 100644 index 000000000..740a562f4 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/scrolldown_dark.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/scrolldown_dark@2x.png b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/scrolldown_dark@2x.png new file mode 100644 index 000000000..1dfe3ab3d Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/scrolldown_dark@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/scrolldown_dark@3x.png b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/scrolldown_dark@3x.png new file mode 100644 index 000000000..14ae3aa1b Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Activities/scrolldown_dark.imageset/scrolldown_dark@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/Contents.json b/Riot/Assets/Images.xcassets/Room/Input/Contents.json index da4a164c9..73c00596a 100644 --- a/Riot/Assets/Images.xcassets/Room/Input/Contents.json +++ b/Riot/Assets/Images.xcassets/Room/Input/Contents.json @@ -1,6 +1,6 @@ { "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/Contents.json new file mode 100644 index 000000000..9c70622e2 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "input_close_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "input_close_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "input_close_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/input_close_icon.png b/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/input_close_icon.png new file mode 100644 index 000000000..b78911642 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/input_close_icon.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/input_close_icon@2x.png b/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/input_close_icon@2x.png new file mode 100644 index 000000000..d27429876 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/input_close_icon@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/input_close_icon@3x.png b/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/input_close_icon@3x.png new file mode 100644 index 000000000..6f628586d Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_close_icon.imageset/input_close_icon@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/Contents.json new file mode 100644 index 000000000..b4cbe6fdb --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "input_edit_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "input_edit_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "input_edit_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/input_edit_icon.png b/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/input_edit_icon.png new file mode 100644 index 000000000..52860737e Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/input_edit_icon.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/input_edit_icon@2x.png b/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/input_edit_icon@2x.png new file mode 100644 index 000000000..919c867c7 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/input_edit_icon@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/input_edit_icon@3x.png b/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/input_edit_icon@3x.png new file mode 100644 index 000000000..4baa61fd8 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_edit_icon.imageset/input_edit_icon@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/Contents.json new file mode 100644 index 000000000..5cbd96db1 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "input_reply_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "input_reply_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "input_reply_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/input_reply_icon.png b/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/input_reply_icon.png new file mode 100644 index 000000000..20bc5c005 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/input_reply_icon.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/input_reply_icon@2x.png b/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/input_reply_icon@2x.png new file mode 100644 index 000000000..4d45eb912 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/input_reply_icon@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/input_reply_icon@3x.png b/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/input_reply_icon@3x.png new file mode 100644 index 000000000..d9999c5e3 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_reply_icon.imageset/input_reply_icon@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/Contents.json new file mode 100644 index 000000000..390e9a858 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "input_text_background.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "input_text_background@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "input_text_background@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/input_text_background.png b/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/input_text_background.png new file mode 100644 index 000000000..45de94894 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/input_text_background.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/input_text_background@2x.png b/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/input_text_background@2x.png new file mode 100644 index 000000000..999413123 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/input_text_background@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/input_text_background@3x.png b/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/input_text_background@3x.png new file mode 100644 index 000000000..0855a9a23 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/input_text_background.imageset/input_text_background@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/Contents.json new file mode 100644 index 000000000..222e068c2 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "save_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "save_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "save_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/save_icon.png b/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/save_icon.png new file mode 100644 index 000000000..3ff5eeaee Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/save_icon.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/save_icon@2x.png b/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/save_icon@2x.png new file mode 100644 index 000000000..d900c15f5 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/save_icon@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/save_icon@3x.png b/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/save_icon@3x.png new file mode 100644 index 000000000..233f9f8e1 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/save_icon.imageset/save_icon@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/Contents.json new file mode 100644 index 000000000..82f51a5b7 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "send_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "send_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "send_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/send_icon.png b/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/send_icon.png new file mode 100644 index 000000000..02dc65a0b Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/send_icon.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/send_icon@2x.png b/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/send_icon@2x.png new file mode 100644 index 000000000..28b0183c6 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/send_icon@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/send_icon@3x.png b/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/send_icon@3x.png new file mode 100644 index 000000000..4e3719595 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/send_icon.imageset/send_icon@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/Contents.json index b3ad81cfb..776550e12 100644 --- a/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/Contents.json +++ b/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/Contents.json @@ -19,8 +19,5 @@ "info" : { "author" : "xcode", "version" : 1 - }, - "properties" : { - "template-rendering-intent" : "template" } } diff --git a/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon.png b/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon.png index 8364d79ce..3ff1aefae 100644 Binary files a/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon.png and b/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon@2x.png b/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon@2x.png index 292fa17ea..7e5d7b972 100644 Binary files a/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon@2x.png and b/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon@3x.png b/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon@3x.png index d97f3aa94..4f626f53b 100644 Binary files a/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon@3x.png and b/Riot/Assets/Images.xcassets/Room/Input/upload_icon.imageset/upload_icon@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/Contents.json new file mode 100644 index 000000000..c5bb14104 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "upload_icon_dark.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "upload_icon_dark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "upload_icon_dark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/upload_icon_dark.png b/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/upload_icon_dark.png new file mode 100644 index 000000000..cb0316cf9 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/upload_icon_dark.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/upload_icon_dark@2x.png b/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/upload_icon_dark@2x.png new file mode 100644 index 000000000..b58c78907 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/upload_icon_dark@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/upload_icon_dark@3x.png b/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/upload_icon_dark@3x.png new file mode 100644 index 000000000..b04f2a977 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/upload_icon_dark.imageset/upload_icon_dark@3x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/Contents.json b/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/Contents.json new file mode 100644 index 000000000..e4b7bd1e0 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "video_call.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "video_call@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "video_call@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/video_call.png b/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/video_call.png new file mode 100644 index 000000000..309ac3f6f Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/video_call.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/video_call@2x.png b/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/video_call@2x.png new file mode 100644 index 000000000..5e4d6597c Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/video_call@2x.png differ diff --git a/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/video_call@3x.png b/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/video_call@3x.png new file mode 100644 index 000000000..adaaf0a70 Binary files /dev/null and b/Riot/Assets/Images.xcassets/Room/Input/video_call.imageset/video_call@3x.png differ diff --git a/Riot/Assets/ar.lproj/Vector.strings b/Riot/Assets/ar.lproj/Vector.strings new file mode 100644 index 000000000..389af1cc9 --- /dev/null +++ b/Riot/Assets/ar.lproj/Vector.strings @@ -0,0 +1,131 @@ + + +"room_recents_create_empty_room" = "ุฅู†ุดุงุกู ุบูุฑููŽุฉ"; +"room_recents_start_chat_with" = "ุจูŽุฏุกู ู…ูุญุงุฏูŽุซูŽุฉ"; +"room_recents_no_conversation" = "ู„ูŽุง ุบูุฑูŽู"; +"room_recents_conversations_section" = "ุงู„ุบูุฑูŽู"; +"room_recents_people_section" = "ุงู„ุฃุดุฎูŽุงุต"; +"room_recents_favourites_section" = "ุงู„ู…ูููŽุถู‘ูŽู„ูŽุฉ"; +"room_creation_privacy" = "ุงู„ุฎูุตููˆุตููŠู‘ูŽุฉ"; +"room_creation_appearance_name" = "ุงู„ุงูุณู…"; +"room_creation_appearance" = "ุงู„ู…ูŽุธู‡ูŽุฑ"; +"room_creation_account" = "ุงู„ุญูุณุงุจ"; + +// Chat creation +"room_creation_title" = "ู…ูุญุงุฏูŽุซูŽุฉ ุฌูŽุฏููŠุฏูŽุฉ"; +"auth_softlogout_clear_data_sign_out" = "ุชูŽุณุฌููŠู„ู ุงู„ุฎูุฑููˆุฌ"; +"auth_softlogout_sign_in" = "ุชูŽุณุฌูŠู„ู ุงู„ุฏู‘ูุฎููˆู„"; +"auth_reset_password_error_is_required" = "ู„ูŽู… ูŠูŽุชูู…ู‘ ุถูŽุจุท ุฎุงุฏูู… ู‡ููˆูŠู‘ูŽุฉ: ุฃุถูู ูˆูŽุงุญูุฏู‹ุง ู„ุฅุนุงุฏูŽุฉ ุชูŽุนูŠููŠู† ูƒูŽู„ูู…ูŽุฉ ุงู„ู…ูุฑููˆุฑ ุงู„ุฎูŽุงุตู‘ูŽุฉ ุจููƒูŽ."; +"auth_reset_password_next_step_button" = "ู„ูŽู‚ูŽุฏ ุชูŽุญูŽู‚ู‘ูŽู‚ุชู ู…ูู† ุนูู†ูˆุงู†ู ุจูŽุฑูŠุฏูŠ ุงู„ุฅู„ููƒุชูุฑูˆู†ูŠู‘"; +"auth_reset_password_email_validation_message" = "ู„ูŽู‚ูŽุฏ ุชูŽู…ู‘ูŽ ุฅุฑุณูŽุงู„ ุจูŽุฑูŠุฏ ุงู„ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ุฅู„ู‰ %@. ุจูู…ูุฌูŽุฑู‘ูŽุฏู ุงูุชู‘ูุจูŽุงุน ุงู„ุฑู‘ูŽุงุจูุท ุงู„ู‘ูŽุฐููŠ ูŠูŽุญูˆููŠู‡ุŒ ุงูู†ู‚ูุฑ ุฃุฏู†ูŽุงู‡."; +"auth_reset_password_missing_password" = "ูŠูŽุฌูุจู ุฅุฏุฎูŽุงู„ ูƒูŽู„ูู…ูŽุฉ ู…ูุฑููˆุฑ ุฌูŽุฏููŠุฏูŽุฉ."; +"auth_reset_password_missing_email" = "ูŠูŽุฌูุจู ุฅุฏุฎูŽุงู„ ุนูู†ูˆุงู† ุงู„ุจูŽุฑูŠุฏ ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ุงู„ู…ูุฑุชูŽุจูุท ุจูุญูุณูŽุงุจูƒ."; +"auth_reset_password_message" = "ู„ูุฅุนุงุฏูŽุฉู ุชูŽุนูŠููŠู†ู ูƒูŽู„ูู…ูŽุฉู ุงู„ู…ูุฑููˆุฑ ุงู„ุฎุงุตู‘ูŽุฉู ุจููƒุŒ ุฃุฏุฎูู„ ุนูู†ูˆุงู† ุงู„ุจูŽุฑูŠุฏ ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ุงู„ู…ูุฑุชูŽุจูุท ุจูุญูุณูŽุงุจูƒ:"; +"auth_recaptcha_message" = "ูŠูุฑููŠุฏู ู‡ูŽุฐูŽุง ุงู„ุฎุงุฏูู… ุงู„ุฑู‘ูŽุฆูŠุณ ุงู„ุชู‘ูŽุฃูƒู‘ูุฏ ู…ูู† ุฃู†ู‘ูŽูƒูŽ ู„ูŽุณุชูŽ ุฑููˆุจููˆุชู‹ุง"; +"auth_msisdn_validation_error" = "ูŠูŽุชูŽุนูŽุฐู‘ูŽุฑู ุงู„ุชู‘ูŽุญูŽู‚ู‘ูู‚ ู…ูู† ุฑูŽู‚ู…ู ุงู„ู‡ูŽุงุชูู."; +"auth_msisdn_validation_message" = "ู„ูŽู‚ูŽุฏ ุฃุฑุณูŽู„ู†ุง ุฑูุณูŽุงู„ูŽุฉ SMS ุชูŽุญูˆููŠ ุฑูŽู…ุฒู‹ุง ู„ูู„ุชูŽูุนููŠู„. ูŠูุฑุฌูŽู‰ ุฅุฏุฎูŽุงู„ ู‡ูŽุฐูŽุง ุงู„ุฑู‘ูŽู…ุฒ ุฃูŽุฏู†ุงู‡."; +"auth_msisdn_validation_title" = "ู‚ูŽูŠุฏ ุงู„ุชู‘ูŽุญูŽู‚ู‘ูู‚"; +"auth_email_validation_message" = "ูŠูุฑุฌูŽู‰ ุงู„ุชู‘ูŽุญูŽู‚ู‘ูู‚ ู…ูู† ุงู„ุจูŽุฑูŠุฏ ุงู„ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ุงู„ุฎุงุตู‘ ุจููƒ ู„ูู…ููˆูŽุงุตูŽู„ูŽุฉ ุงู„ุชู‘ูŽุณุฌููŠู„"; +"auth_use_server_options" = "ุงูุณุชูุฎุฏุงู…ู ุฅุนุฏุงุฏูŽุงุชู ู…ูุฎูŽุตู‘ูŽุตูŽุฉู ู„ูู„ุฎูŽุงุฏูู… (ู…ูุชูŽู‚ูŽุฏู‘ูู…)"; +"auth_email_not_found" = "ููŽุดูŽู„ูŽ ุฅุฑุณูŽุงู„ู ุงู„ุจูŽุฑูŠุฏ ุงู„ุฅู„ููƒุชูุฑูˆู†ูŠู‘: ู„ูŽู… ูŠูŽุชูู…ู‘ ุงู„ุนูุซููˆุฑ ุนูŽู„ูŽู‰ ุนูู†ูˆุงู† ุงู„ุจูŽุฑูŠุฏ ุงู„ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ู‡ูŽุฐูŽุง"; +"auth_forgot_password_error_no_configured_identity_server" = "ู„ูŽู… ูŠูŽุชูู…ู‘ ุถูŽุจุท ุฎุงุฏูู… ู‡ููˆูŠู‘ูŽุฉ: ุฃุถูู ูˆูŽุงุญูุฏู‹ุง ู„ุฅุนุงุฏูŽุฉ ุชูŽุนูŠููŠู† ูƒูŽู„ูู…ูŽุฉ ุงู„ู…ูุฑููˆุฑ ุงู„ุฎูŽุงุตู‘ูŽุฉ ุจููƒูŽ."; +"auth_forgot_password" = "ู‡ูŽู„ ู†ูŽุณููŠุชูŽ ูƒูŽู„ูู…ูŽุฉ ุงู„ู…ูุฑููˆุฑุŸ"; +"auth_username_in_use" = "ุงูุณู… ู…ูุณุชูŽุฎุฏูู… ู…ูุณุชูŽุฎุฏูŽู…"; +"auth_password_dont_match" = "ูƒูŽู„ูู…ูŽุฉู ุงู„ู…ูุฑููˆุฑู ู„ูŽุง ุชูŽุชูŽุทูŽุงุจูŽู‚"; +"auth_untrusted_id_server" = "ุฎุงุฏูู…ู ุงู„ู‡ููˆูŠู‘ูŽุฉ ุบูŽูŠุฑู ู…ูŽูˆุซููˆู‚ู ุจูู‡"; +"auth_phone_is_required" = "ู„ูŽู… ูŠูŽุชูู…ู‘ ุถูŽุจุท ุฎุงุฏูู… ู‡ููˆูŠู‘ูŽุฉ ู„ูุฐูŽู„ููƒ ู„ุง ูŠูู…ูƒูู†ููƒูŽ ุฅุถุงููŽุฉ ุฑูŽู‚ู… ู‡ูŽุงุชูู ู„ุฅุนุงุฏูŽุฉ ุชูŽุนูŠููŠู† ูƒูŽู„ูู…ูŽุฉ ุงู„ู…ูุฑููˆุฑ ุงู„ุฎูŽุงุตู‘ูŽุฉ ุจููƒูŽ ูููŠ ุงู„ู…ูุณุชูŽู‚ุจูŽู„."; +"auth_email_is_required" = "ู„ูŽู… ูŠูŽุชูู…ู‘ ุถูŽุจุท ุฎุงุฏูู… ู‡ููˆูŠู‘ูŽุฉ ู„ูุฐูŽู„ููƒ ู„ุง ูŠูู…ูƒูู†ููƒูŽ ุฅุถุงููŽุฉ ุนูู†ูˆุงู† ุจูŽุฑูŠุฏ ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ู„ุฅุนุงุฏูŽุฉ ุชูŽุนูŠููŠู† ูƒูŽู„ูู…ูŽุฉ ุงู„ู…ูุฑููˆุฑ ุงู„ุฎูŽุงุตู‘ูŽุฉ ุจููƒูŽ ูููŠ ุงู„ู…ูุณุชูŽู‚ุจูŽู„."; +"auth_phone_in_use" = "ุฑูŽู‚ู… ุงู„ู‡ูŽุงุชูู ู‡ูŽุฐูŽุง ู…ูุณุชูŽุฎุฏูŽู…ูŒ ุจูุงู„ููุนู„"; +"auth_email_in_use" = "ู‡ูŽุฐูŽุง ุงู„ุจูŽุฑูŠุฏ ุงู„ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ู…ูุณุชูŽุฎุฏูŽู… ุจูุงู„ููุนู„"; +"auth_missing_email_or_phone" = "ุนูู†ูˆุงู† ุงู„ุจูŽุฑูŠุฏ ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ู…ูŽูู‚ููˆุฏ ุฃูˆ ุฑูŽู‚ู… ุงู„ู‡ูŽุงุชูู"; +"auth_missing_phone" = "ุฑูŽู‚ู… ุงู„ู‡ูŽุงุชูู ู…ูŽูู‚ููˆุฏ"; +"auth_add_email_message_2" = "ุนูŽูŠู‘ูู† ุจูŽุฑูŠุฏู‹ ุฅู„ููƒุชูุฑูˆู†ูŠู‘ู‹ ู„ูุงูุณุชูุฑุฏูŽุงุฏู ุงู„ุญูุณุงุจุŒ ูˆูŽู„ุงุญูู‚ู‹ุง ู„ูุชูŽูƒููˆู†ูŽ ู‚ุงุจูู„ุงู‹ ู„ูู„ุงููƒุชูุดุงู ุงูุฎุชููŠูŽุงุฑูŠู‘ู‹ุง ู…ูู† ู‚ูุจูŽู„ู ุงู„ุฃุดุฎุงุตู ุงู„ู‘ูŽุฐูŠู†ูŽ ูŠูŽุนุฑููููˆู†ูŽูƒ."; +"auth_missing_password" = "ู†ูุณูŠุงู†ู ูƒูŽู„ูู…ูŽุฉู ุงู„ู…ูุฑููˆุฑ"; +"auth_invalid_phone" = "ู‡ูŽุฐูŽุง ู„ุง ูŠูŽุจุฏููˆ ูƒูŽุฑูŽู‚ู… ู‡ูŽุงุชูู ุตูŽุงู„ูุญ"; +"auth_invalid_email" = "ู‡ูŽุฐูŽุง ู„ุง ูŠูŽุจุฏููˆ ูƒูŽุนูู†ูˆุงู† ุจูŽุฑูŠุฏ ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ุตูŽุงู„ูุญ"; +"auth_invalid_password" = "ูƒูŽู„ูู…ูŽุฉู ุงู„ู…ูุฑููˆุฑู ู‚ูŽุตููŠุฑูŽุฉูŒ ุฌูุฏูŽุง (ุงู„ุญูŽุฏู‘ู ุงู„ุฃุฏู†ูŽู‰ 6)"; +"auth_invalid_user_name" = "ูŠูู…ูƒูู†ู ุฃู† ุชูŽุญุชูŽูˆููŠ ุฃุณู…ุงุกู ุงู„ู…ูุณุชูŽุฎุฏูู…ูŠู† ููŽู‚ูŽุท ุนูŽู„ูŽู‰ ุฃุญุฑููุŒ ุฃุฑู‚ูŽุงู…ุŒ ู†ูู‚ูŽุงุทุŒ ุดูŽุฑูŽุทูŽุงุช ูˆูŽุดูŽุฑูŽุทูŽุงุช ุณููู„ููŠู‘ูŽุฉ"; +"auth_invalid_login_param" = "ุงูุณู…ู ู…ูุณุชูŽุฎุฏูู… ูˆูŽ/ุฃูˆ ูƒูŽู„ูู…ูŽุฉู ู…ูุฑููˆุฑ ุบูŽูŠุฑู ุตูŽุญููŠุญูŽุฉ"; +"auth_identity_server_placeholder" = "ุนูู†ูˆุงู† URL (ู…ูุซู„. https://vector.im)"; +"auth_home_server_placeholder" = "ุนูู†ูˆุงู† URL (ู…ูุซู„. https://matrix.org)"; +"auth_repeat_new_password_placeholder" = "ุฃูƒู‘ูุฏ ูƒูŽู„ูู…ูŽุฉูŽ ู…ูุฑููˆุฑููƒูŽ ุงู„ุฌูŽุฏูŠุฏูŽุฉ"; +"auth_repeat_password_placeholder" = "ุฅุนุงุฏูŽุฉู ูƒูŽู„ูู…ูŽุฉู ุงู„ู…ูุฑููˆุฑ"; +"auth_phone_placeholder" = "ุฑูŽู‚ู… ู‡ูŽุงุชูู"; +"auth_optional_phone_placeholder" = "ุฑูŽู‚ู… ู‡ูŽุงุชูู (ุงูุฎุชูŠุงุฑูŠ)"; +"auth_email_placeholder" = "ุนูู†ูˆุงู† ุจูŽุฑูŠุฏ ุฅู„ููƒุชูุฑูˆู†ูŠู‘"; +"auth_optional_email_placeholder" = "ุนูู†ูˆุงู† ุจูŽุฑูŠุฏ ุฅู„ููƒุชูุฑูˆู†ูŠู‘ (ุงูุฎุชูŠุงุฑูŠ)"; +"auth_user_name_placeholder" = "ุงูุณู… ู…ูุณุชูŽุฎุฏูู…"; +"auth_user_id_placeholder" = "ุจูŽุฑูŠุฏ ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ุฃูˆ ุงูุณู… ู…ูุณุชูŽุฎุฏูู…"; +"auth_new_password_placeholder" = "ูƒูŽู„ูู…ูŽุฉู ู…ูุฑููˆุฑู ุฌูŽุฏูŠุฏูŽุฉ"; +"auth_password_placeholder" = "ูƒูŽู„ูู…ูŽุฉู ุงู„ู…ูุฑููˆุฑ"; +"auth_return_to_login" = "ุงู„ุนูŽูˆุฏูŽุฉ ุฅู„ู‰ ุดุงุดูŽุฉ ุชูŽุณุฌูŠู„ ุงู„ุฏู‘ูุฎููˆู„"; +"auth_send_reset_email" = "ุฅุฑุณูŽุงู„ ุจูŽุฑูŠุฏ ุฅุนุงุฏุฉ ุถูŽุจุท"; +"auth_login_single_sign_on" = "ุชูŽุณุฌูŠู„ู ุงู„ุฏู‘ูุฎููˆู„"; +"auth_skip" = "ุชูŽุฎูŽุทู‘ููŠ"; +"auth_submit" = "ุงู„ุชู‘ูŽุณู„ููŠู…"; +"auth_register" = "ุงู„ุชู‘ูŽุณุฌูŠู„"; + +// Authentication +"auth_login" = "ุชูŽุณุฌูŠู„ู ุงู„ุฏู‘ูุฎููˆู„"; + +// Call Bar +"callbar_only_single_active" = "ู…ููƒุงู„ูŽู…ูŽุฉ ู†ูŽุดูุทูŽุฉ (%@)"; +"less" = "ุฃู‚ูŽู„ู‘"; +"more" = "ุงู„ู…ูŽุฒูŠุฏ"; +"switch" = "ุชูŽุจุฏููŠู„"; +"joined" = "ู…ูู†ุถูŽู…ู‘"; +"skip" = "ุชูŽุฎูŽุทู‘ููŠ"; +"close" = "ุฅุบู„ุงู‚"; +"sending" = "ูŠูŽุฌุฑูŠ ุงู„ุฅุฑุณูŽุงู„"; +"send_to" = "ุฅุฑุณูŽุงู„ ุฅู„ู‰ %@"; +"collapse" = "ุชุถูŠูŠู‚"; +"rename" = "ุฅุนุงุฏูŽุฉ ุงู„ุชู‘ูŽุณู…ูŠูŽุฉ"; +"later" = "ู„ุงูŽุญูู‚ู‹ุง"; +"active_call_details" = "ู…ููƒุงู„ูŽู…ูŽุฉ ู†ูŽุดูุทูŽุฉ (%@)"; +"active_call" = "ู…ููƒุงู„ูŽู…ูŽุฉ ู†ูŽุดูุทูŽุฉ"; +"video" = "ู…ูŽู‚ุทูŽุน ู…ูŽุฑุฆูŠ"; +"voice" = "ุตูŽูˆุช"; +"camera" = "ุงู„ูƒุงู…ูŠุฑุง"; +"preview" = "ู…ูุนุงูŠูŽู†ูŽุฉ"; +"accept" = "ู‚ูุจููˆู„"; +"decline" = "ุงู„ุฑู‘ูŽูุถ"; +"join" = "ุงู„ุงูู†ุถูู…ุงู…"; +"save" = "ุญููุธ"; +"cancel" = "ุฅู„ุบูŽุงุก"; +"off" = "ุฅุทููŽุงุก"; +"on" = "ุชูŽุดุบูŠู„"; +"retry" = "ุฅุนุงุฏูŽุฉู ุงู„ู…ูุญุงูˆูŽู„ุฉ"; +"invite" = "ุงูุฏุนู"; +"remove" = "ุฅุฒุงู„ูŽุฉ"; +"leave" = "ุงู„ู…ูุบุงุฏูŽุฑูŽุฉ"; +"start" = "ุงู„ุจูŽุฏุก"; +"create" = "ุฅู†ุดุงุก"; +"continue" = "ุงู„ุงูุณุชูู…ุฑุงุฑ"; +"back" = "ุงู„ุฑู‘ูุฌููˆุน"; +"next" = "ุงู„ุชู‘ูŽุงู„ูŠ"; + +// Actions +"view" = "ุงู„ุงูุทู‘ูู„ุงุน"; +"warning" = "ุชูŽุญุฐูŠุฑ"; +"title_groups" = "ุงู„ู…ูุฌุชูŽู…ูŽุนูŽุงุช"; +"title_rooms" = "ุงู„ุบูุฑูŽู"; +"title_people" = "ุงู„ุฃุดุฎูŽุงุต"; +"title_favourites" = "ุงู„ู…ูููŽุถู‘ูŽู„ูŽุฉ"; + +// Titles +"title_home" = "ุงู„ุฑู‘ูŽุฆูŠุณูŽุฉ"; +"store_promotional_text" = "ุชูŽุทุจููŠู‚ู ุงู„ู…ูุญุงุฏูŽุซูŽุฉู ูˆูŽุงู„ุชู‘ูŽุนุงูˆูู† ุงู„ู…ูุญูŽุงููุธ ู„ูู„ุฎูุตููˆุตููŠู‘ูŽุฉู ุนูŽู„ูŽู‰ ุดูŽุจูŽูƒูŽุฉู ู…ูŽูุชููˆุญูŽุฉ. ู„ุงูŽู…ูŽุฑูƒูŽุฒููŠู‘ูŒ ู„ููˆูŽุถุนููƒูŽ ูููŠ ุงู„ุชู‘ูŽุญูŽูƒู‘ูู…. ู„ูŽุง ุชูŽู†ู‚ููŠุจูŒ ุนูŽู†ู ุงู„ุจูŽูŠูŽุงู†ูŽุงุชุŒ ู„ูŽุง ุฃุจูˆุงุจูŽ ุฎูŽู„ูููŠู‘ูŽุฉู ูˆูŽู„ูŽุง ูˆูุตููˆู„ูŒ ู„ูุฃูŠู‘ู ุทูŽุฑูŽูู ุซูŽุงู„ูุซ."; +"store_full_description" = "Element ู‡ููˆูŽ ู†ูŽูˆุนูŒ ุฌูŽุฏูŠุฏูŒ ู…ูู† ุชูŽุทุจูŠู‚ุงุชู ุงู„ู…ูุฑุงุณูŽู„ูŽุฉ ูˆูŽุงู„ุชู‘ูŽุนูŽุงูˆูู† ุงู„ู‘ูŽุฐูŠ:\n\n1. ูŠูŽู…ู†ูŽุญููƒูŽ ุงู„ุชู‘ูŽุญูŽูƒู‘ูู… ูููŠ ู„ูู„ุญููุงุธู ุนูŽู„ูŽู‰ ุฎูุตููˆุตููŠู‘ูŽุชููƒ\n2. ูŠูุชูŠุญู ู„ูŽูƒูŽ ุงู„ุชู‘ูŽูˆุงุตูู„ู ู…ูŽุนูŽ ุฃูŠู‘ ุดูŽุฎุต ุนูŽู„ูŽู‰ ุดูŽุจูŽูƒูŽุฉู Matrix ุŒ ูˆูŽุญูŽุชู‘ูŽู‰ ุฎุงุฑูุฌูŽู‡ูŽุง ู…ูู† ุฎูู„ุงู„ ุงู„ุชู‘ูŽูƒุงู…ูู„ ู…ูŽุนูŽ ุงู„ุชู‘ูŽุทุจูŠู‚ุงุช ู…ูุซู„ Slack\n3. ูŠูŽุญู…ูŠูƒูŽ ู…ูู†ูŽ ุงู„ุฅุนู„ุงู†ุงุชุŒ ุงู„ุชู‘ูŽู†ู‚ูŠุจู ุนูŽู†ู ุงู„ุจูŽูŠุงู†ุงุชุŒ ุงู„ุฃุจูˆุงุจู ุงู„ุฎูŽู„ูููŠู‘ูŽุฉ ูˆูŽุนูŽู…ูŽู„ููŠู‘ูŽุงุชู ุงู„ุญูŽุฏุงุฆูู‚ู ุงู„ู…ูุณูŽูˆู‘ูŽุฑูŽุฉ\n4. ูŠูุคู…ูู†ููƒูŽ ู…ูู† ุฎูู„ุงูู„ ุชูŽุนู…ููŠูŽุฉู ุงู„ู†ูู‘ู‡ุงูŠูŽุฉ-ุฅู„ู‰-ุงู„ู†ูู‘ู‡ุงูŠูŽุฉุŒ ู…ูŽุนูŽ ุงู„ุชู‘ูŽูˆู‚ูŠุนู ุงู„ู…ูุชูŽุจุงุฏูŽู„ู ู„ูู„ุชูŽุญูŽู‚ู‘ูู‚ู ู…ูู†ูŽ ุงู„ุขุฎูŽุฑูŽูŠู†\n\nูŠูŽุฎุชูŽู„ููู Element ุชูŽู…ุงู…ู‹ุง ุนูŽู† ุชูŽุทุจูŠู‚ุงุชู ุงู„ู…ูุฑุงุณูŽู„ูŽุฉู ูˆูŽุงู„ุชู‘ูŽุนุงูˆูู† ุงู„ุฃูุฎุฑูŽู‰ ู„ุฃู†ู‘ูŽู‡ู ู„ุง ู…ูŽุฑูƒูŽุฒูŠ ูˆูŽู…ูŽูุชููˆุญ ุงู„ู…ูŽุตุฏูŽุฑ.\n\nูŠูุชูŠุญู ู„ูŽูƒูŽ Element ุฅู…ูƒุงู†ูŠุฉู ุงู„ุงูุณุชูุถุงููŽุฉ ุงู„ุฐู‘ุงุชูŠู‘ูŽุฉ -ุฃูˆ ุงูุฎุชูŠุงุฑู ู…ูุถูŠู- ุจูุญูŽูŠุซ ุชูŽุชูŽู…ูŽุชู‘ูŽุน ุจูุงู„ุฎูุตููˆุตููŠู‘ูŽุฉ ูˆูŽุงู„ู…ูู„ูƒูŠู‘ูŽุฉ ูˆูŽุงู„ุชู‘ูŽุญูŽูƒู‘ูู… ูููŠ ุจูŽูŠุงู†ูŽุงุชูƒ ูˆูŽู…ูุญูŽุงุฏูŽุซุงุชูƒ. ูŠูุชูŠุญู ู„ูŽูƒูŽ ุงู„ูˆูุตููˆู„ ุฅู„ู‰ ุดูŽุจูŽูƒูŽุฉ ู…ูŽูุชููˆุญูŽุฉุ› ู„ูุฐูŽู„ููƒูŽ ู„ุง ูŠูŽู‚ุชูŽุตูุฑู ุงู„ุฃู…ุฑ ุนูŽู„ูŽู‰ ุงู„ุชู‘ูŽุญุฏูุซ ุฅู„ู‰ ู…ูุณุชูŽุฎุฏูู…ูŠ Element ุงู„ุขุฎูŽุฑูŠู† ููŽู‚ูŽุท. ูƒูŽู…ุง ุงูŽู†ู‡ู ุขู…ูู†ูŒ ู„ูู„ุบุงูŠูŽุฉ.\n\nุฅู†ู‘ูŽ Element ู‚ุงุฏูุฑูŒ ุนูŽู„ูŽู‰ ุฅุชุงุญูŽุฉู ูƒูู„ู ุฐูŽู„ููƒ ู„ูุฃู†ูŽู‡ู ูŠูŽุนู…ูŽู„ู ุนูŽู„ูŽู‰ Matrix -ู…ูุนูŠุงุฑ ุงู„ุชู‘ูŽูˆุงุตูู„ ุงู„ู…ูŽูุชููˆุญ ุงู„ู„ู‘ูŽุงู…ูŽุฑูƒูŽุฒูŠ.\n\nุฅู†ู‘ูŽ Element ูŠูŽู…ู†ูŽุญููƒูŽ ุฒูู…ูŽุงู…ูŽ ุงู„ุชู‘ูŽุญูŽูƒูู… ู…ูู† ุฎูู„ุงู„ ุงู„ุณู‘ูŽู…ุงุญ ู„ูŽูƒ ุจูุงุฎุชูŠุงุฑ ู…ูŽู† ูŠูŽุณุชูŽุถูŠูู ุงู„ู…ูุญุงุฏูŽุซุงุชู ุงู„ุฎูŽุงุตู‘ูŽุฉู ุจููƒ. ู…ูู† ุชูŽุทุจูŠู‚ู Element ูŠูู…ูƒูู†ููƒูŽ ุงูุฎุชูŠุงุฑ ุงู„ุงูุณุชูุถุงููŽุฉ ุจูุทูุฑูู‚ู ู…ูุฎุชูŽู„ูููŽุฉ:\n\n1. ุงู„ุญูุตููˆู„ ุนูŽู„ูŽู‰ ุญูุณุงุจ ู…ูŽุฌุงู†ูŠู‘ ุนูŽู„ูŽู‰ ุงู„ุฎุงุฏูู… ุงู„ุนูŽุงู…ู‘ matrix.org\n2. ุงูุณุชูุถุงููŽุฉ ุญูุณุงุจูƒ ุจูู†ูŽูุณููƒ ุนูŽู† ุทูŽุฑูŠู‚ ุชูŽุดุบูŠู„ ุฎุงุฏูู… ุนูŽู„ูŽู‰ ุฃุฌู‡ูุฒูŽุชููƒูŽ ุงู„ุฎูŽุงุตู‘ูŽุฉ\n3. ุงู„ุชู‘ูŽุณุฌูŠู„ ู„ูู„ุญูุตููˆู„ู ุนูŽู„ูŽู‰ ุญูุณุงุจ ุนูŽู„ูŽู‰ ุฎุงุฏูู… ู…ูุฎุตุต ุจู…ูุฌุฑุฏ ุงู„ุงูุดุชูุฑุงูƒ ูููŠ ู…ูู†ูŽุตู‘ูŽุฉ ุงูุณุชูุถุงููŽุฉ Element Matrix Services\n\nู„ูู…ูŽุงุฐูŽุง ุชูŽุฎุชุงุฑู ElementุŸ\n\nุชูŽู…ู„ู‘ูŽูƒ ุจูŽูŠุงู†ุงุชูŽูƒ: ุฃู†ุชูŽ ู…ูŽู† ุชูู‚ุฑุฑ ุฃูŠู† ุชูŽุญุชูŽููุธ ุจุจูŠุงู†ุงุชูƒ ูˆุฑุณุงุฆู„ูƒ. ุฃู†ุช ุชู…ุชู„ูƒู‡ุง ูˆุชุชุญูƒู… ููŠู‡ุงุŒ ูˆู„ูŠุณ ุจุนุถ ุงู„ุดุฑูƒุงุช ุงู„ูƒูุจุฑู‰ ุงู„ุฅุญุชูƒุงุฑูŠุฉ ุงู„ุชูŠ ุชูู†ู‚ู‘ูุจ ุนู† ุจูŠุงู†ุงุชูƒ ุฃูˆ ุชูุชูŠุญ ุงู„ูˆุตูˆู„ ุฅู„ู‰ ุฃุทุฑุงู ุซุงู„ุซุฉ.\n\n\nุชูŽุฑุงุณูู„ ูˆูŽุชูŽุนูŽุงูˆูู† ู…ูŽูุชููˆุญ ูŠูู…ูƒูู†ููƒูŽ ู…ูุญุงุฏูŽุซูŽุฉ ุฃูŠ ุดูŽุฎุต ุขุฎูŽุฑ ุนูŽู„ูŽู‰ ุดูŽุจูŽูƒูŽุฉ MatrixุŒ ุณูŽูˆุงุกู‹ ูƒุงู†ููˆุง ูŠูŽุณุชูŽุฎุฏูู…ููˆู†ูŽ Element ุฃูˆ ุชูŽุทุจูŠู‚ู Matrix ุขุฎูŽุฑุŒ ูˆูŽุญูŽุชู‘ู‰ ุฅุฐุง ูƒุงู†ููˆุง ูŠูŽุณุชูŽุฎุฏูู…ููˆู†ูŽ ู†ูุธุงู…ูŽ ู…ูุฑุงุณู„ุฉู ู…ูุฎุชูŽู„ูู ู…ูุซู„ Slack ุฃูˆ IRC ุฃูˆ XMPP.\n\nุงู„ุฃู…ุงู†-ุงู„ุฎุงุฑูู‚: ุชูŽุนู…ูŠูŽุฉ ุญูŽู‚ูŠู‚ูŠูŽุฉ ู…ูู†ูŽ ุงู„ู†ูู‘ู‡ุงูŠูŽุฉ ุฅู„ู‰ ุงู„ู†ูู‘ู‡ุงูŠูŽุฉ (ููŽู‚ูŽุท ุฃุทุฑุงู ุงู„ู…ูุญุงุฏูŽุซูŽุฉ ู…ูŽู† ูŠูู…ูƒูู†ูŽู‡ูู… ููŽูƒู‘ ุชูŽุนู…ูŠูŽุฉ ุงู„ุฑู‘ูŽุณุงุฆูู„)ุŒ ูˆูŽุงู„ุชู‘ูŽูˆู‚ููŠุน ุงู„ู…ูุชูŽุจุงุฏูŽู„ ู„ูู„ุชุญู‚ู‚ ู…ู† ุฃุฌู‡ุฒุฉ ุงู„ู…ูุดุงุฑูƒูŠู† ููŠ ุงู„ู…ูุญุงุฏุซุฉ.\n\nุงู„ุชูˆุงุตู„ ุงู„ูƒุงู…ู„: ุงู„ู…ูุฑุงุณู„ุฉุŒ ุงู„ู…ููƒุงู„ู…ุงุช ุงู„ุตูˆุชูŠุฉ ูˆุงู„ู…ุฑุฆูŠุฉุŒ ู…ูุดุงุฑูƒุฉ ุงู„ู…ู„ูุงุชุŒ ู…ูุดุงุฑูƒุฉ ุงู„ุดุงุดุฉุŒ ู…ุฌู…ูˆุนุฉ ูƒุงู…ู„ุฉ ูˆูƒุจูŠุฑุฉ ู…ู† ุนู…ู„ูŠุงุช ุงู„ุชูƒุงู…ูู„ุŒ ุงู„ุฑูˆุจูˆุชุงุช ูˆุงู„ุฃุฏูˆุงุช. ุจู†ุงุก ุงู„ุบูุฑูุŒ ุงู„ู…ูุฌุชู…ุนุงุชุŒ ุงุจู‚ ุนู„ู‰ ุงุชุตุงู„ ูˆุฃู†ุฌุฒ ุงู„ู…ู‡ุงู….\n\nุฃูŠู† ู…ุง ูƒูู†ุช: ุงุจู‚ ุนู„ู‰ ุงุชุตุงู„ ุฃูŠู†ู…ุง ูƒู†ุช ู…ุน ุณุฌู„ ุงู„ุฑุณุงุฆู„ ุงู„ู…ุชุฒุงู…ู† ุจุงู„ูƒุงู…ู„ ุนุจุฑ ุฌู…ูŠุน ุฃุฌู‡ุฒุชูƒ ูˆููŠ ุงู„ูˆูŠุจ ุนู„ู‰ https://app.element.io."; +// String for App Store +"store_short_description" = "ู…ูุญุงุฏูŽุซูŽุฉูŒ/VoIP ุขู…ู†ุฉูŒ ู„ูŽุง ู…ูŽุฑูƒูŽุฒููŠู‘ูŽุฉ"; +"auth_missing_email" = "ุนูู†ูˆุงู† ุจูŽุฑูŠุฏ ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ู…ูŽูู‚ููˆุฏ"; +"auth_add_email_phone_message_2" = "ุนูŽูŠู‘ูู† ุจูŽุฑูŠุฏู‹ ุฅู„ููƒุชูุฑูˆู†ูŠู‘ู‹ ู„ูุงูุณุชูุฑุฏูŽุงุฏู ุงู„ุญูุณุงุจ. ู„ุงุญูู‚ู‹ุง ุงุณุชุฎุฏู… ุฑูŽู‚ู… ุงู„ู‡ูŽุงุชูู ุฃูˆ ุงู„ุจูŽุฑูŠุฏ ุงู„ุฅู„ููƒุชูุฑูˆู†ูŠู‘ ู„ูุชูŽูƒููˆู†ูŽ ู‚ุงุจูู„ุงู‹ ู„ูู„ุงููƒุชูุดุงู ุงูุฎุชููŠูŽุงุฑูŠู‘ู‹ุง ู…ูู† ู‚ูุจูŽู„ู ุงู„ุฃุดุฎุงุตู ุงู„ู‘ูŽุฐูŠู†ูŽ ูŠูŽุนุฑูููู†ูŽูƒ."; +"auth_add_phone_message_2" = "ุนูŽูŠู‘ูู† ุฑูŽู‚ู… ู‡ูŽุงุชูู ู„ูุงูุณุชูุฑุฏูŽุงุฏู ุงู„ุญูุณุงุจุŒ ูˆูŽู„ุงุญูู‚ู‹ุง ู„ูุชูŽูƒููˆู†ูŽ ู‚ุงุจูู„ุงู‹ ู„ูู„ุงููƒุชูุดุงู ุงูุฎุชููŠูŽุงุฑูŠู‘ู‹ุง ู…ูู† ู‚ูุจูŽู„ู ุงู„ุฃุดุฎุงุตู ุงู„ู‘ูŽุฐูŠู†ูŽ ูŠูŽุนุฑููููˆู†ูŽูƒ."; + +// Accessibility +"accessibility_checkbox_label" = "ู…ูุฑูŽุจูŽุนู ุงูุฎุชููŠุงุฑุงุช"; +"callbar_return" = "ุงู„ุฑู‘ูุฌูˆุน"; +"callbar_active_and_multiple_paused" = "ู…ููƒุงู„ูŽู…ูŽุฉูŒ ูˆุงุญุฏุฉูŒ ู†ูŽุดูุทุฉ (%@) ยท ุนูŽุฏูŽุฏ %@ ู…ููƒุงู„ูŽู…ูŽุฉ ู…ูุนู„ู‘ูŽู‚ุฉ"; +"callbar_only_multiple_paused" = "ุนูŽุฏูŽุฏ %@ ู…ููƒุงู„ูŽู…ูŽุฉ ู…ูุนู„ู‘ูŽู‚ุฉ"; +"callbar_active_and_single_paused" = "ู…ููƒุงู„ูŽู…ูŽุฉูŒ ูˆุงุญุฏุฉูŒ ู†ูŽุดูุทุฉ (%@) ยท ู…ููƒุงู„ูŽู…ูŽุฉูŒ ูˆุงุญุฏุฉูŒ ู…ูุนู„ู‘ูŽู‚ุฉ"; +"callbar_only_single_paused" = "ู…ููƒุงู„ูŽู…ูŽุฉ ู…ูุนู„ู‘ูŽู‚ุฉ"; diff --git a/Riot/Assets/de.lproj/Localizable.strings b/Riot/Assets/de.lproj/Localizable.strings index eeceaadd2..155ecd848 100644 --- a/Riot/Assets/de.lproj/Localizable.strings +++ b/Riot/Assets/de.lproj/Localizable.strings @@ -41,11 +41,11 @@ /* Incoming unnamed voice conference invite from a specific person */ "VOICE_CONF_FROM_USER" = "Gruppen-Anruf von %@"; /* Incoming unnamed video conference invite from a specific person */ -"VIDEO_CONF_FROM_USER" = "Video-Gruppen-Anruf von %@"; +"VIDEO_CONF_FROM_USER" = "Videogruppenanruf von %@"; /* Incoming named voice conference invite from a specific person */ "VOICE_CONF_NAMED_FROM_USER" = "Gruppen-Anruf von %@: '%@'"; /* Incoming named video conference invite from a specific person */ -"VIDEO_CONF_NAMED_FROM_USER" = "Video-Gruppen-Anruf von %@: '%@'"; +"VIDEO_CONF_NAMED_FROM_USER" = "Videogruppenanruf von %@: '%@'"; /* A single unread message in a room */ "SINGLE_UNREAD_IN_ROOM" = "Du hast eine Nachricht in %@ bekommen"; /* A single unread message */ diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index a4f929dcd..96493461a 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -8,7 +8,7 @@ "view" = "Ansehen"; "invite" = "Einladen"; // Room Details -"room_details_title" = "Raum Details"; +"room_details_title" = "Raumdetails"; "title_favourites" = "Favoriten"; "title_people" = "Personen"; "title_rooms" = "Rรคume"; @@ -151,8 +151,8 @@ "room_new_message_notification" = "%d neue Nachricht"; "room_new_messages_notification" = "%d neue Nachrichten"; "room_one_user_is_typing" = "%@ tipptโ€ฆ"; -"room_two_users_are_typing" = "%@ & %@ tippenโ€ฆ"; -"room_many_users_are_typing" = "%@, %@ & andere tippenโ€ฆ"; +"room_two_users_are_typing" = "%@ und %@ tippenโ€ฆ"; +"room_many_users_are_typing" = "%@, %@ und andere tippenโ€ฆ"; "room_message_placeholder" = "Nachricht senden (unverschlรผsselt)โ€ฆ"; "encrypted_room_message_placeholder" = "Verschlรผsselte Nachrichtโ€ฆ"; "room_message_short_placeholder" = "Sende eine Nachrichtโ€ฆ"; @@ -168,7 +168,7 @@ "room_event_action_more" = "Mehr"; "room_event_action_share" = "Teilen"; "room_event_action_permalink" = "Permalink"; -"room_event_action_view_source" = "Zeige Quellcode"; +"room_event_action_view_source" = "Zeige Quelltext"; "room_event_action_report" = "Inhalt melden"; "room_event_action_report_prompt_reason" = "Grund fรผrs Melden dieses Inhalts"; "room_event_action_report_prompt_ignore_user" = "Mรถchtest du alle Nachrichten dieses Nutzers verbergen?"; @@ -181,7 +181,7 @@ // Unknown devices "unknown_devices_alert_title" = "Raum enthรคlt unbekannte Sitzungen"; "unknown_devices_send_anyway" = "Trotzdem senden"; -"unknown_devices_call_anyway" = "Trotzdem Anrufen"; +"unknown_devices_call_anyway" = "Trotzdem anrufen"; "unknown_devices_answer_anyway" = "Trotzdem beantworten"; "unknown_devices_verify" = "Verifiziereโ€ฆ"; "unknown_devices_title" = "Unbekannte Sitzungen"; @@ -209,7 +209,7 @@ "settings_ignored_users" = "IGNORIERTE NUTZER"; "settings_contacts" = "LOKALE KONTAKTE"; "settings_advanced" = "ERWEITERT"; -"settings_other" = "ANDERES"; +"settings_other" = "WEITERES"; "settings_devices" = "SITZUNGEN"; "settings_cryptography" = "VERSCHLรœSSELUNG"; "settings_sign_out" = "Abmelden"; @@ -224,17 +224,17 @@ "settings_email_address_placeholder" = "Gib deine E-Mail-Adresse ein"; "settings_add_email_address" = "E-Mail-Adresse hinzufรผgen"; "settings_remove_phone_prompt_msg" = "Bist du sicher, dass du die Telefon-Nummer %@ entfernen mรถchtest?"; -"settings_night_mode" = "Nacht Modus"; +"settings_night_mode" = "Nachtmodus"; "settings_enable_push_notif" = "Benachrichtungen auf diesem Gerรคt"; "settings_unignore_user" = "Alle Nachrichten von %@ anzeigen?"; -"settings_contacts_phonebook_country" = "Telefonbuch-Land"; +"settings_contacts_phonebook_country" = "Land des Telefonbuches"; "settings_labs_e2e_encryption" = "Ende-zu-Ende-Verschlรผsselung"; "settings_version" = "Version %@"; "settings_olm_version" = "Olm-Version %@"; -"settings_copyright" = "Kopierrecht"; +"settings_copyright" = "Urheberrecht"; "settings_term_conditions" = "Geschรคftsbedingungen"; "settings_privacy_policy" = "Datenschutzerklรคrung"; -"settings_send_crash_report" = "Sende anonyme Absturz- & Nutzungsdaten"; +"settings_send_crash_report" = "Sende anonyme Absturz- und Nutzungsdaten"; "settings_change_password" = "Passwort รคndern"; "settings_old_password" = "altes Passwort"; "settings_new_password" = "neues Passwort"; @@ -244,21 +244,21 @@ "settings_crypto_device_key" = "\nSitzungs-Schlรผssel:\n"; "settings_crypto_export" = "Schlรผssel exportieren"; "room_details_settings" = "Einstellungen"; -"room_details_photo" = "Raum-Bild"; -"room_details_room_name" = "Raum-Name"; +"room_details_photo" = "Raumbild"; +"room_details_room_name" = "Raumname"; "room_details_topic" = "Thema"; "room_details_favourite_tag" = "Favorit"; "room_details_low_priority_tag" = "Niedrige Prioritรคt"; "room_details_access_section" = "Wer kann auf diesen Raum zugreifen?"; "room_details_access_section_invited_only" = "Nur Personen, die eingeladen wurden"; -"room_details_access_section_anyone_apart_from_guest" = "Jeder, der den Raum-Link kennt - auรŸer Gรคste"; -"room_details_access_section_anyone" = "Jeder, der den Raum-Link kennt - auch Gรคste"; +"room_details_access_section_anyone_apart_from_guest" = "Jeder, der den Raumlink kennt - auรŸer Gรคste"; +"room_details_access_section_anyone" = "Jeder, der den Raumlink kennt - auch Gรคste"; "room_details_history_section" = "Wer kann die Historie lesen?"; "room_details_history_section_anyone" = "Jeder"; "room_details_history_section_members_only" = "Nur Mitglieder (seit diese Option ausgewรคhlt ist)"; "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_prompt_title" = "Datenschutz-Warnung"; +"room_details_history_section_prompt_title" = "Datenschutzwarnung"; "room_details_addresses_section" = "Adressen"; "room_details_no_local_addresses" = "Dieser Raum hat keine lokalen Adressen"; "room_details_new_address" = "Fรผge neue Adresse hinzu"; @@ -277,13 +277,13 @@ "auth_add_phone_message" = "Fรผge eine Telefonnummer hinzu, damit dich andere Benutzer finden kรถnnen."; "auth_add_email_phone_message" = "Fรผge eine E-Mail-Adresse und/oder Telefonnummer hinzu, damit dich andere Benutzer finden kรถnnen. รœber die E-Mail-Adresse kannst du das Passwort zurรผcksetzen."; "auth_add_email_and_phone_message" = "Fรผge eine E-Mail-Adresse und eine Telefonnummer hinzu, damit dich andere Benutzer finden kรถnnen. รœber die E-Mail-Adresse kannst du das Passwort zurรผcksetzen."; -"auth_use_server_options" = "Individuelle Server Optionen"; +"auth_use_server_options" = "Individuelle Server-Optionen"; "auth_email_validation_message" = "Prรผfe dein E-Mail-Konto um mit der Registrierung fortzufahren"; -"auth_recaptcha_message" = "Dieser Homeserver will sicherstellen dass du kein Robot bist"; +"auth_recaptcha_message" = "Dieser Heimserver will sicherstellen dass du kein Roboter bist"; "auth_reset_password_message" = "E-Mail-Adresse angeben, um das Passwort zurรผckzusetzen:"; "auth_reset_password_missing_email" = "Die E-Mail-Adresse die mit dem Konto verbunden ist muss eingegeben werden."; "auth_reset_password_error_unauthorized" = "Konnte E-Mail-Adresse nicht verifizieren. Klicke den Link in der Registrierungs-E-Mail"; -"auth_reset_password_error_not_found" = "Diese E-Mail-Adresse ist nicht mit einer Matrix-ID auf diesem Homeserver verknรผpft."; +"auth_reset_password_error_not_found" = "Diese E-Mail-Adresse ist nicht mit einer Matrix-ID auf diesem Heimserver verknรผpft."; "auth_reset_password_success_message" = "Dein Passwort wurde zurรผckgesetzt.\n\nDu wurdest aus allen Sitzungen abgemeldet, diese bekommen jetzt keine Push-Benachrichtigungen mehr. Um diese wieder einzuschalten, melde dich auf den Gerรคten erneut an."; "auth_add_email_and_phone_warning" = "Registrierung mit E-Mail und Telefonnummer zugleich ist noch nicht unterstรผtzt. Nur die Telefonnummer wird berรผcksichtigt. Du kannst deine E-Mail-Adresse in deinem Profil ergรคnzen."; "room_creation_make_public_prompt_msg" = "Sicher, dass du diesen Raum รถffentlich machen willst? Jeder kann deine Nachrichten lesen und dem Raum beitreten."; @@ -298,18 +298,18 @@ "room_participants_invite_malformed_id" = "Ungรผltige ID. Sollte eine E-Mail-Adresse oder Matrix-ID wie \"@thomas:matrix.org' sein"; "room_participants_idle" = "Untรคtig"; "room_participants_ago" = "her"; -"room_participants_action_section_admin_tools" = "Admin Werkzeuge"; +"room_participants_action_section_admin_tools" = "Admin-Werkzeuge"; "room_participants_action_unban" = "Entsperren"; "room_participants_action_set_default_power_level" = "Zurรผck auf normale Berechtigung"; "room_participants_action_start_voice_call" = "Starte Sprach-Anruf"; "room_ongoing_conference_call" = "Laufender Konferenz-Anruf. Trete bei als %@ oder %@."; "room_event_action_redact" = "Entfernen"; -"room_warning_about_encryption" = "Ende-zu-Ende Verschlรผsselung ist in Beta und ist evtl. nicht zuverlรคssig.\n\nMan sollte noch nicht darauf vertrauen, dass die Daten sicher sind.\n\nGerรคte werden Nachrichten von vor dem Beitritt des Raumes nicht entschlรผsseln kรถnnen.\n\nVerschlรผsselte Nachrichten sind nicht lesbar auf Clients, die Verschlรผsselung noch nicht implementiert haben."; -"unknown_devices_alert" = "Dieser Raum enthรคlt unbekannte Sitzungen, die nicht verifiziert wurden.\nDas bedeutet, es gibt keine Garantie, dass sie dem/r angegebenen Benutzer!n gehรถren.\nWir empfehlen eine รœberprรผfung fรผr jedes Gerรคt, bevor du weitermachst. Du kannst die Nachricht auch ohne Verifizierung erneut senden."; +"room_warning_about_encryption" = "Ende-zu-Ende Verschlรผsselung ist in Beta und ist evtl. nicht zuverlรคssig.\n\nMan sollte noch nicht darauf vertrauen, dass die Daten sicher sind.\n\nGerรคte werden Nachrichten von vor dem Beitritt des Raumes nicht entschlรผsseln kรถnnen.\n\nVerschlรผsselte Nachrichten sind nicht lesbar auf Clients, die die Verschlรผsselung noch nicht implementiert haben."; +"unknown_devices_alert" = "Dieser Raum enthรคlt unbekannte Sitzungen, die nicht verifiziert wurden.\nDas bedeutet, es gibt keine Garantie, dass sie den angegebenen Benutzern gehรถrt.\nWir empfehlen eine รœberprรผfung fรผr jedes Gerรคt, bevor du weitermachst. Du kannst die Nachricht auch ohne Verifizierung erneut senden."; "room_preview_unlinked_email_warning" = "Diese Einladung wurde an %@ gesendet, welche diesem Konto nicht zugeordnet ist. Mรถglicherweise mรถchtest du dich mit einem anderen Konto anmelden oder diese E-Mail zu deinem Konto hinzufรผgen."; "room_preview_try_join_an_unknown_room" = "Du versuchst auf %@ zuzugreifen. Mรถchtest du dem Raum beitreten um teilzunehmen?"; "settings_config_identity_server" = "Identitรคtsserver ist %@"; -"settings_labs" = "Labor"; +"settings_labs" = "LABORE"; "settings_sign_out_e2e_warn" = "Du wirst die Ende-zu-Ende Schlรผssel verlieren. Du kannst dann auf diesem Gerรคt in verschlรผsselten Rรคumen keine alten Nachrichten mehr lesen."; "settings_phone_number" = "Telefon"; "settings_add_phone_number" = "Telefonnummer hinzufรผgen"; @@ -318,7 +318,7 @@ "settings_pin_rooms_with_missed_notif" = "Pinnen von Rรคumen mit verpassten Benachrichtigungen"; "settings_pin_rooms_with_unread" = "Pinnen von Rรคumen mit ungelesenen Nachrichten"; "settings_on_denied_notification" = "Benachrichtigungen verboten fรผr %@, bitte in den Gerรคte-Einstellungen erlauben"; -"settings_contacts_discover_matrix_users" = "Entdecke andere Benutzer!nnen mittels E-Mail-Adressen oder Telefonnummern"; +"settings_contacts_discover_matrix_users" = "Entdecke andere Benutzer mittels E-Mail-Adressen oder Telefonnummern"; "settings_labs_e2e_encryption_prompt_message" = "Zum Fertigstellen der Verschlรผsselung bitte neu anmelden."; "settings_third_party_notices" = "Anmerkungen von Dritten"; "settings_clear_cache" = "Cache lรถschen"; @@ -326,31 +326,31 @@ "settings_crypto_device_id" = "\nSitzungs-ID: "; "settings_crypto_blacklist_unverified_devices" = "Verschlรผssele nur zu verifizierten Sitzungen"; "room_details_people" = "Mitglieder"; -"room_details_files" = "Uploads"; +"room_details_files" = "Hochgeladenes"; "room_details_mute_notifs" = "Benachrichtigungen stummschalten"; "room_details_access_section_no_address_warning" = "Um einen Raum zu betreten, muss er eine Adresse haben"; "room_details_access_section_directory_toggle" = "Zeige alle Rรคume in diesem Verzeichnis"; "room_details_history_section_prompt_msg" = "ร„nderungen an der Leseberechtigung des Verlaufs wird nur auf zukรผnftige Nachrichten dieses Raums angewandt. Die Sichtbarkeit des existierenden Verlaufs wird nicht verรคndert."; -"room_details_addresses_invalid_address_prompt_title" = "Ungรผltiges Alias-Format"; +"room_details_addresses_invalid_address_prompt_title" = "Ungรผltiges Aliasformat"; "room_details_addresses_invalid_address_prompt_msg" = "%@ ist kein gรผltiges Format fรผr einen Alias"; -"room_details_addresses_disable_main_address_prompt_title" = "Hauptadresse Warnung"; +"room_details_addresses_disable_main_address_prompt_title" = "Hauptadressenwarnung"; "room_details_addresses_disable_main_address_prompt_msg" = "Du hast keine Hauptadresse angegeben. Die Hauptadresse fรผr diesem Raum wird zufรคllig gewรคhlt"; "room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Nur zu verifizierten Sitzungen verschlรผsseln"; "room_details_advanced_e2e_encryption_prompt_message" = "Ende-zu-Ende Verschlรผsselung ist experimentell und mรถglicherweise nicht zuverlรคssig.\n\nDu solltest noch nicht darauf vertrauen, dass die Daten sicher sind.\n\nGerรคte kรถnnen keine Nachrichten von vor dem Beitritt des Raumes entschlรผsseln.\n\nWenn die Verschlรผsselung aktiviert wurde, kann sie derzeit nicht wieder abgeschaltet werden.\n\nVerschlรผsselte Nachrichten werden nicht auf Gerรคten angezeigt, die keine Verschรผsselung unterstรผtzen."; -"room_details_fail_to_update_avatar" = "Aktualisierung des Raum-Bildes fehlgeschlagen"; +"room_details_fail_to_update_avatar" = "Aktualisierung des Raumbildes fehlgeschlagen"; "room_details_fail_to_update_room_name" = "Aktualisierung des Raumnamens fehlgeschlagen"; "room_details_fail_to_update_topic" = "Aktualisieren des Themas fehlgeschlagen"; "room_details_fail_to_update_room_guest_access" = "Aktualisierung des Gรคste-Zugangs fehlgeschlagen"; -"room_details_fail_to_update_room_join_rule" = "Aktualisierung des Beitrittsregel fehlgeschlagen"; +"room_details_fail_to_update_room_join_rule" = "Aktualisierung der Beitrittsregel fehlgeschlagen"; "room_details_fail_to_update_room_directory_visibility" = "Aktualisierung der Raumlisten-Sichtbarkeit fehlgeschlagen"; "room_details_fail_to_update_history_visibility" = "Aktualisierung der Verlaufs-Sichtbarkeit fehlgeschlagen"; "room_details_fail_to_add_room_aliases" = "Hinzufรผgen der neuen Raum-Adresse fehlgeschlagen"; "room_details_fail_to_remove_room_aliases" = "Entfernen der Raum-Adresse fehlgeschlagen"; -"room_details_fail_to_update_room_canonical_alias" = "Aktualisierung der Haupt-Adresse fehlgeschlagen"; +"room_details_fail_to_update_room_canonical_alias" = "Aktualisierung der Hauptadresse fehlgeschlagen"; "room_details_fail_to_enable_encryption" = "Aktivieren der Verschlรผsselung fรผr diesen Raum fehlgeschlagen"; "room_details_save_changes_prompt" = "Mรถchtest du die ร„nderungen speichern?"; -"room_details_set_main_address" = "Als Haupt-Adresse setzen"; -"room_details_unset_main_address" = "Als Haupt-Adresse entfernen"; +"room_details_set_main_address" = "Als Hauptadresse setzen"; +"room_details_unset_main_address" = "Als Hauptadresse entfernen"; "room_details_copy_room_id" = "Kopiere Raum-ID"; "room_details_copy_room_address" = "Kopiere Raum-Adresse"; "room_details_copy_room_url" = "Kopiere Raum-URL"; @@ -365,7 +365,7 @@ "directory_server_picker_title" = "Wรคhle ein Verzeichnis"; "directory_server_all_rooms" = "Alle Rรคume auf %@ Server"; "directory_server_all_native_rooms" = "Alle nativen Matrix-Rรคume"; -"directory_server_type_homeserver" = "Gib einen Homeserver ein, um davon รถffentliche Rรคume zu listen"; +"directory_server_type_homeserver" = "Gib einen Heimserver ein, um davon รถffentliche Rรคume zu listen"; "directory_server_placeholder" = "matrix.org"; // Others "or" = "oder"; @@ -374,18 +374,18 @@ "yesterday" = "Gestern"; "network_offline_prompt" = "Keine Verbindung zum Internet."; "public_room_section_title" = "ร–ffentliche Rรคume (at %@):"; -"bug_report_prompt" = "Die Applikation ist letztes Mal abgestรผrzt. Mรถchtest du einen Crash Report senden?"; -"rage_shake_prompt" = "Du scheinst das Gerรคt frustriert zu schรผtteln. Mรถchtest du einen Bug Report senden?"; +"bug_report_prompt" = "Die Applikation ist letztes Mal abgestรผrzt. Mรถchtest du einen Absturzbericht senden?"; +"rage_shake_prompt" = "Du scheinst das Gerรคt frustriert zu schรผtteln. Mรถchtest du einen Fehlerbericht senden?"; "camera_access_not_granted" = "%@ hat keine Berechtigung die Kamera zu nutzen, bitte berechtigen"; "large_badge_value_k_format" = "%.1fK"; // Call -"call_incoming_voice_prompt" = "Eingehender Sprach-Anruf von %@"; -"call_incoming_video_prompt" = "Eingehender Video-Anruf von %@"; +"call_incoming_voice_prompt" = "Eingehender Sprachanruf von %@"; +"call_incoming_video_prompt" = "Eingehender Videoanruf von %@"; // No VoIP support "no_voip_title" = "Eingehener Anruf"; "no_voip" = "%@ ruft dich an, aber %@ unterstรผtzt derzeit keine Anrufe.\nDu kannst diese Benachrichtung ignorieren und den Anruf von einem anderen Gerรคt annehmen oder ihn abweisen."; // Crash report -"google_analytics_use_prompt" = "Mรถchtest du helfen %@ zu verbessern, indem du anonyme Crash Reports und Daten รผber die Verwendung sendest?"; +"google_analytics_use_prompt" = "Mรถchtest du helfen %@ zu verbessern, indem du anonyme Absturzberichte und Daten รผber die Verwendung sendest?"; // Crypto "e2e_enabling_on_app_update" = "Element unterstรผtzt nun Ende-zu-Ende Verschlรผsselung. Um sie zu aktivieren musst du dich erneut anmelden.\n\nDu kannst sie nun aktivieren oder spรคter in den Einstellungen."; "e2e_need_log_in_again" = "Du musst dich erneut anmelden um Ende-zu-Ende Schlรผssel fรผr diese Sitzung zu erstellen und zum Server zu senden.\nDies ist nur einmal notwendig."; @@ -394,11 +394,11 @@ "bug_report_description" = "Beschreibe den Fehler. Was hast du gemacht? Was hast du erwartet? Was ist tatsรคchlich passiert?"; "bug_crash_report_title" = "Absturzmeldung"; "bug_crash_report_description" = "Bitte beschreibe was du vor dem Absturz gemacht hast:"; -"bug_report_logs_description" = "Um Probleme analysieren zu kรถnnen werden Log-Daten dieses Clients mit dem Bug Report gesendet. Wenn du nur den Text oben senden willst, bitte abwรคhlen:"; -"bug_report_send_logs" = "Sende Log-Daten"; +"bug_report_logs_description" = "Um Probleme analysieren zu kรถnnen werden Protokolldateien dieses Clients mit dem Fehlerbericht gesendet. Wenn du nur den Text oben senden willst, bitte abwรคhlen:"; +"bug_report_send_logs" = "Sende Protokolldateien"; "bug_report_send_screenshot" = "Sende Bildschirmfoto"; -"bug_report_progress_zipping" = "Sammele Log-Daten"; -"bug_report_progress_uploading" = "Report hochladen"; +"bug_report_progress_zipping" = "Sammele Protokolle"; +"bug_report_progress_uploading" = "Bericht hochladen"; "bug_report_send" = "Gesendet"; "collapse" = "zusammenklappen"; "auth_email_in_use" = "Diese E-Mail-Adresse wird bereits verwendet"; @@ -431,15 +431,15 @@ "sending" = "Senden"; "room_event_failed_to_send" = "Senden fehlgeschlagen"; "room_details_direct_chat" = "Direkter Chat"; -"room_details_fail_to_update_room_direct" = "Setzen der Direkt-Kennzeichnung in diesem Raum fehlgeschlagen"; +"room_details_fail_to_update_room_direct" = "Setzen der Direktkennzeichnung in diesem Raum fehlgeschlagen"; "event_formatter_widget_added" = "Widget %@ wurde von %@ hinzugefรผgt"; "event_formatter_widget_removed" = "Widget %@ wurde von %@ entfernt"; "event_formatter_jitsi_widget_added" = "VoIP-Konferenz von %@ hinzugefรผgt"; "event_formatter_jitsi_widget_removed" = "VoIP-Konferenz von %@ entfernt"; "call_incoming_voice" = "Eingehender Anrufโ€ฆ"; -"call_incoming_video" = "Eingehender Video-Anrufโ€ฆ"; +"call_incoming_video" = "Eingehender Videoanrufโ€ฆ"; // Widget Integration Manager -"widget_integration_need_to_be_able_to_invite" = "Du musst Benutzer!nnen einladen kรถnnen um das zu tun."; +"widget_integration_need_to_be_able_to_invite" = "Du musst Benutzer einladen kรถnnen um das zu tun."; "widget_integration_unable_to_create" = "Erstellen des Widgets nicht mรถglich."; "widget_integration_failed_to_send_request" = "Senden der Anfrage fehlgeschlagen."; "widget_integration_room_not_recognised" = "Dieser Raum wurde nicht erkannt."; @@ -450,8 +450,8 @@ "widget_integration_missing_user_id" = "user_id fehlt in der Anfrage."; "widget_integration_room_not_visible" = "Raum %@ ist nicht sichtbar."; // Share extension -"share_extension_auth_prompt" = "Melde dich in der Haupt-App an um Inhalte zu teilen"; -"share_extension_failed_to_encrypt" = "Senden fehlgeschlagen. Prรผfe in der Hauptapp die Verschlรผsselungseinstellungen fรผr diesen Raum"; +"share_extension_auth_prompt" = "Melde dich in der Hauptanwendung an um Inhalte zu teilen"; +"share_extension_failed_to_encrypt" = "Senden fehlgeschlagen. Prรผfe in der Hauptanwendung die Verschlรผsselungseinstellungen fรผr diesen Raum"; "settings_ui_theme_picker_message" = "\"Auto\" nutzt die \"Farben invertieren\"-Einstellung deines Gerรคts"; "search_in_progress" = "Sucheโ€ฆ"; "room_event_action_cancel_send" = "Senden abbrechen"; @@ -460,10 +460,10 @@ "settings_enable_callkit" = "Eingebettetes Anrufen"; "settings_callkit_info" = "Empfange eingehende Anrufe auf deinem Sperrbildschirm und sehe deine Element-Anrufe in der Anruf-Historie deines Systems. Wenn iCloud aktiviert ist, wird diese Anruf-Historie mit Apple geteilt."; "settings_enable_rageshake" = "Schรผttle stark um einen Fehler zu melden"; -"do_not_ask_again" = "Nicht erneut fragen"; +"do_not_ask_again" = "Nicht erneut nachfragen"; "settings_ui_theme_black" = "Schwarz"; // Room key request dialog -"e2e_room_key_request_title" = "Verschlรผsselungs-Schlรผssel-Anfrage"; +"e2e_room_key_request_title" = "Verschlรผsselungs-Schlรผsselanfrage"; "e2e_room_key_request_message" = "Deine nicht-verifizierte Sitzung '%@' fragt Verschlรผsselungs-Schlรผssel an."; "e2e_room_key_request_start_verification" = "Starte Verifikationโ€ฆ"; "e2e_room_key_request_share_without_verifying" = "Teile ohne zu verifizieren"; @@ -473,7 +473,7 @@ "group_invite_section" = "EINLADUNGEN"; "group_section" = "COMMUNITIES"; "settings_flair" = "Zeige Abzeichen, wo es erlaubt ist"; -"room_details_flair_section" = "Zeige Flair fรผr Communities"; +"room_details_flair_section" = "Zeige Abzeichen fรผr Communities"; "room_details_new_flair_placeholder" = "Fรผge neue Community-ID hinzu (z.B. +foo%@)"; "room_details_flair_invalid_id_prompt_title" = "Ungรผltiges Format"; "room_details_flair_invalid_id_prompt_msg" = "%@ ist kein valider Bezeichner fรผr eine Community"; @@ -505,35 +505,35 @@ // Group rooms "group_rooms_filter_rooms" = "Filtere Community-Rรคume"; "e2e_room_key_request_message_new_device" = "Du hast die neue Sitzung '%@' hinzugefรผgt, welche Verschlรผsselungs-Schlรผssel anfordert."; -"room_do_not_have_permission_to_post" = "Du hast keine Berechtigung in diesem Raum zu posten"; -"room_event_action_kick_prompt_reason" = "Grund fรผr den Rauswurf des/r Benutzer!n"; -"room_event_action_ban_prompt_reason" = "Grund fรผr die Verbannung des/r Benutzer!n"; +"room_do_not_have_permission_to_post" = "Du hast keine Berechtigung Nachrichten in diesem Raum zu senden"; +"room_event_action_kick_prompt_reason" = "Grund fรผr den Rauswurf des Benutzers"; +"room_event_action_ban_prompt_reason" = "Grund fรผr die Verbannung des Benutzers"; "room_action_send_photo_or_video" = "Foto oder Video senden"; -"room_action_send_sticker" = "Sticker senden"; -"settings_deactivate_account" = "DEAKTIVIERE ACCOUNT"; -"settings_deactivate_my_account" = "Deaktivere meinen Account"; -"widget_sticker_picker_no_stickerpacks_alert" = "Du hast aktuell keine Sticker-Packete aktiviert."; +"room_action_send_sticker" = "Aufkleber senden"; +"settings_deactivate_account" = "DEAKTIVIERTES KONTO"; +"settings_deactivate_my_account" = "Deaktivere meinen Konto"; +"widget_sticker_picker_no_stickerpacks_alert" = "Du hast aktuell keine Aufkleberpakete aktiviert."; "widget_sticker_picker_no_stickerpacks_alert_add_now" = "Welche hinzufรผgen?"; // GDPR "gdpr_consent_not_given_alert_message" = "Um den %@ -Heimserver weiter zu verwenden, musst du die Geschรคftsbedingungen sichten und ihnen zustimmen."; "gdpr_consent_not_given_alert_review_now_action" = "Jetzt sichten"; -"deactivate_account_title" = "Deaktiviere Account"; -"deactivate_account_informations_part1" = "Dies wird deinen Account permanent unbenutzbar machen. Du wirst dich nicht erneut anmelden kรถnnen und keiner wird dieselbe Nutzer-ID erneut registrieren. Alle Rรคume, in denen dein Account ist, werden verlassen werden und deine Account-Daten werden vom Identitรคtsserver gelรถscht werden. "; +"deactivate_account_title" = "Deaktiviere Konto"; +"deactivate_account_informations_part1" = "Dies wird deinen Konto permanent unbenutzbar machen. Du wirst dich nicht erneut anmelden kรถnnen und keiner wird in der Lage sein, dieselbe Nutzer-ID erneut zu registrieren. Alle Rรคume, in denen dein Konto ist, werden verlassen und deine Kontodaten werden vom Identitรคtsserver gelรถscht. "; "deactivate_account_informations_part2_emphasize" = "Diese Aktion ist irreversibel."; -"deactivate_account_informations_part3" = "\n\nDeinen Account deaktivieren "; +"deactivate_account_informations_part3" = "\n\nDeinen Konto deaktivieren "; "deactivate_account_informations_part4_emphasize" = "wird standardmรครŸig nicht dafรผr sorgen, dass wir alle Nachrichten lรถschen, die du gesendet hast. "; -"deactivate_account_informations_part5" = "Wenn du mรถchtest, dass wir deine Nachrichten lรถschen, wรคhle das Auswahlfeld unten aus.\n\nDie Sichtbarkeit der Nachrichten in Matrix ist wie bei E-Mails: Wenn wir deine Nachrichten lรถschen, werden sie nicht mehr mit neuen oder nicht registrierten Benutzer!nnen geteilt. Bereits registrierte Nutzer!nnen behalten den Zugriff auf ihre Kopie deiner Nachrichten."; -"deactivate_account_forget_messages_information_part1" = "Bitte vergesst alle Nachrichten, die ich gesendet habe, wenn mein Account deaktiviert wird ("; +"deactivate_account_informations_part5" = "Wenn du mรถchtest, dass wir deine Nachrichten lรถschen, wรคhle das Auswahlfeld unten aus.\n\nDie Sichtbarkeit der Nachrichten in Matrix ist wie bei E-Mails: Wenn wir deine Nachrichten lรถschen, werden sie nicht mehr mit neuen oder nicht registrierten Benutzer geteilt. Bereits registrierte Nutzer behalten den Zugriff auf ihre Kopie deiner Nachrichten."; +"deactivate_account_forget_messages_information_part1" = "Bitte alle Nachrichten vergessen, die ich gesendet habe, wenn mein Konto deaktiviert wird ("; "deactivate_account_forget_messages_information_part2_emphasize" = "Warnung"; "deactivate_account_forget_messages_information_part3" = ": Dies wird dafรผr sorgen, dass zukรผnftige Nutzer eine unvollstรคndige Konversation sehen)"; -"deactivate_account_validate_action" = "Account deaktiveren"; -"deactivate_account_password_alert_title" = "Account deaktivieren"; -"deactivate_account_password_alert_message" = "Zum Fortfahren, Password eingeben"; -"event_formatter_rerequest_keys_part1_link" = "Verschlรผsselungsschlรผssel erneut"; +"deactivate_account_validate_action" = "Konto deaktiveren"; +"deactivate_account_password_alert_title" = "Konto deaktivieren"; +"deactivate_account_password_alert_message" = "Zum Fortfahren, Passwort eingeben"; +"event_formatter_rerequest_keys_part1_link" = "Verschlรผsselungsschlรผssel neu anfordern"; "event_formatter_rerequest_keys_part2" = " von deinen anderen Sitzungen anfragen."; // Re-request confirmation dialog "rerequest_keys_alert_title" = "Anfrage gesendet"; -"rerequest_keys_alert_message" = "Bitte รถffne Element auf einem anderen Gerรคt, das die Nachricht entschlรผsseln kann, damit es die Schlรผssel an diese Sitzung senden kann."; +"rerequest_keys_alert_message" = "Bitte Element auf einem anderen Gerรคt รถffenen, das die Nachricht entschlรผsseln kann, damit es die Schlรผssel an diese Sitzung senden kann."; "room_message_reply_to_placeholder" = "Antwort senden (unverschlรผsselt)โ€ฆ"; "encrypted_room_message_reply_to_placeholder" = "Sende eine verschlรผsselte Antwortโ€ฆ"; "room_message_reply_to_short_placeholder" = "Sende eine Antwortโ€ฆ"; @@ -543,23 +543,23 @@ "room_predecessor_link" = "Tippe hier um รคltere Nachrichten zu sehen."; "settings_labs_room_members_lazy_loading" = "Raummitglieder spรคter laden"; "settings_labs_room_members_lazy_loading_error_message" = "Dein Heimserver unterstรผtzt das verzรถgerte Laden von Raummitgliedern noch nicht. Versuche es spรคter erneut."; -"room_event_action_view_decrypted_source" = "Zeige entschlรผsselten Quellcode"; +"room_event_action_view_decrypted_source" = "Zeige entschlรผsselten Quelltext"; "room_recents_server_notice_section" = "SYSTEMBENACHRICHTIGUNGEN"; "room_resource_limit_exceeded_message_contact_1" = " Bitte "; "room_resource_limit_exceeded_message_contact_2_link" = "kontaktiere deinen Dienst-Administrator"; -"room_resource_limit_exceeded_message_contact_3" = " um diesen Service weiter zu nutzen."; +"room_resource_limit_exceeded_message_contact_3" = " um diesen Dienst weiter zu nutzen."; "homeserver_connection_lost" = "Konnte keine Verbindung zum Heimserver herstellen."; -"room_resource_usage_limit_reached_message_1_default" = "Dieser Heimserver hat einen seiner Ressourcen-Limits รผberschritten, sodass "; -"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Dieser Heimserver hat sein Limit an monatlich aktiven Benutzer!nnen รผberschritten, sodass "; -"room_resource_usage_limit_reached_message_2" = "einige Benutzer!nnen werden nicht in der Lage sein, sich einzuloggen."; -"room_resource_usage_limit_reached_message_contact_3" = " um dieses Limit erhรถhen zu lassen."; +"room_resource_usage_limit_reached_message_1_default" = "Dieser Heimserver hat einer seiner Ressourcengrenzen รผberschritten, sodass "; +"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Dieser Heimserver hat seine Begrenzung an monatlich aktiven Benutzer รผberschritten, sodass "; +"room_resource_usage_limit_reached_message_2" = "einige Benutzer nicht in der Lage sein werden, sich anzumelden."; +"room_resource_usage_limit_reached_message_contact_3" = " um diese Obergrenze erhรถhen zu lassen."; "auth_accept_policies" = "Bitte Regeln dieses Heimservers ansehen und akzeptieren:"; -"settings_key_backup" = "SCHLรœSSEL SICHERHEITSKOPIE"; +"settings_key_backup" = "SCHLรœSSEL-SICHERHEITSKOPIE"; "settings_key_backup_info" = "Verschlรผsselte Nachrichten sind durch Ende-zu-Ende-Verschlรผsselung gesichert. AusschlieรŸlich du und der/die Empfรคnger besitzen die Schlรผssel, um diese Nachrichten zu lesen."; "settings_key_backup_info_checking" = "รœberprรผfeโ€ฆ"; "settings_key_backup_info_none" = "Deine Schlรผssel werden nicht von dieser Sitzung gesichert."; "settings_key_backup_info_signout_warning" = "Verbinde diese Sitzung mit der Schlรผsselsicherung, bevor du dich abmeldest, um den Verlust von Schlรผsseln zu vermeiden, die sich mรถglicherweise nur auf diesem Gerรคt befinden."; -"settings_key_backup_info_version" = "Schlรผssel Sicherheitskopie Version: %@"; +"settings_key_backup_info_version" = "Version der Schlรผsselsicherung: %@"; "settings_key_backup_info_algorithm" = "Algorithmus"; "settings_key_backup_info_valid" = "Diese Sitzung sichert deine Schlรผssel."; "settings_key_backup_info_not_valid" = "Diese Sitzung sichert nicht dein Schlรผssel, es ist jedoch eine Sicherungskopie vorhanden, von der du deine Schlรผssel wiederherstellen und die du spรคter hinzufรผgen kannst."; @@ -578,17 +578,17 @@ "settings_key_backup_delete_confirmation_prompt_title" = "Sicherheitskopie lรถschen"; "settings_key_backup_delete_confirmation_prompt_msg" = "Bist du Sicher? Damit gehen alle verschlรผsselten Mitteilungen verloren wenn deine Schlรผssel nicht anderweitig richtig gespeichert wurden."; "room_does_not_exist" = "%@ existiert nicht"; -"key_backup_setup_title" = "Schlรผssel Sicherheitskopie"; +"key_backup_setup_title" = "Sicherheitskopie des Schlรผssels"; "key_backup_setup_skip_alert_title" = "Bist du sicher?"; "key_backup_setup_skip_alert_message" = "Du kรถnntest deine verschlรผsselten Mitteilungen verlieren wenn du dich abmeldest oder dein Gerรคt verlierst."; "key_backup_setup_skip_alert_skip_action" = "รœberspringen"; "key_backup_setup_intro_title" = "Verliere niemals verschlรผsselte Nachrichten"; -"key_backup_setup_intro_info" = "Nachrichten in verschlรผsselten Rรคumen werden durch Ende-zu-Ende-Verschlรผsselung gesichert. Nur Du und der / die Empfรคnger haben die Schlรผssel zum Lesen dieser Nachrichten.\n\nSichere deine Schlรผssel sicher, um sie nicht zu verlieren."; +"key_backup_setup_intro_info" = "Nachrichten in verschlรผsselten Rรคumen werden durch Ende-zu-Ende-Verschlรผsselung gesichert. Nur Du und der/die Empfรคnger haben die Schlรผssel zum Lesen dieser Nachrichten.\n\nSichere deine Schlรผssel auf einer sicheren Art, um sie nicht zu verlieren."; "key_backup_setup_intro_setup_action_without_existing_backup" = "Beginne Schlรผsselsicherung zu nutzen"; "key_backup_setup_intro_setup_action_with_existing_backup" = "Benutze Schlรผsselsicherung"; -"key_backup_setup_passphrase_title" = "Sichere dein Backup mit einer Passphrase"; +"key_backup_setup_passphrase_title" = "Sichere deine Datensicherung mit einer Passphrase"; "key_backup_setup_passphrase_info" = "Wir speichern eine verschlรผsselte Kopie deiner Schlรผssel auf unserem Server. Schรผtze deine Sicherung mit einer Passphrase, um sie sicher zu halten.\n\nFรผr maximale Sicherheit sollte sich dies von deinem Kontopasswort unterscheiden."; -"key_backup_setup_passphrase_passphrase_title" = "Enter"; +"key_backup_setup_passphrase_passphrase_title" = "Eingeben"; "key_backup_setup_passphrase_passphrase_placeholder" = "Passphrase eingeben"; "key_backup_setup_passphrase_passphrase_valid" = "Gut!"; "key_backup_setup_passphrase_passphrase_invalid" = "Versuche ein Wort hinzuzufรผgen"; @@ -597,11 +597,11 @@ "key_backup_setup_passphrase_confirm_passphrase_valid" = "Gut!"; "key_backup_setup_passphrase_confirm_passphrase_invalid" = "Passphrasen mรผssen รผbereinstimmen"; "key_backup_setup_passphrase_set_passphrase_action" = "Setze Passphrase"; -"key_backup_setup_passphrase_setup_recovery_key_info" = "Oder sichere deine Sicherung mit einem Wiederherstellungsschlรผssel, und sichere sie an einem sicheren Ort."; +"key_backup_setup_passphrase_setup_recovery_key_info" = "Oder sichere deine Sicherung mit einem Wiederherstellungsschlรผssel, und speichere sie an einem sicheren Ort ab."; "key_backup_setup_passphrase_setup_recovery_key_action" = "(Erweitert) Mit Wiederherstellungsschlรผssel einrichten"; "key_backup_setup_success_title" = "Erfolgreich!"; // Success from passphrase -"key_backup_setup_success_from_passphrase_info" = "Deine Schlรผssel werden gesichert.\n\nDein Wiederherstellungsschlรผssel ist ein Sicherheitsnetzwerk - Du kannst damit den Zugriff auf deine verschlรผsselten Nachrichten wiederherstellen, wenn du deine Passphrase vergisst.\n\nBewahre den Wiederherstellungsschlรผssel an einem sehr sicheren Ort auf, beispielsweise einem Kennwortmanager (oder einem Tresor)."; +"key_backup_setup_success_from_passphrase_info" = "Deine Schlรผssel werden gesichert.\n\nDein Wiederherstellungsschlรผssel ist ein Sicherheitsnetzwerk - Du kannst damit den Zugriff auf deine verschlรผsselten Nachrichten wiederherstellen, wenn du deine Passphrase vergisst.\n\nBewahre den Wiederherstellungsschlรผssel an einem sehr sicheren Ort auf, beispielsweise in einer Passwortverwaltung (oder einem Tresor)."; "key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Wiederherstellungsschlรผssel speichern"; "key_backup_setup_success_from_passphrase_done_action" = "Erledigt"; // Success from recovery key @@ -609,20 +609,20 @@ "key_backup_setup_success_from_recovery_key_recovery_key_title" = "Wiederherstellungsschlรผssel"; "key_backup_setup_success_from_recovery_key_make_copy_action" = "Mache eine Kopie"; "key_backup_setup_success_from_recovery_key_made_copy_action" = "Ich fertigte eine Kopie an"; -"key_backup_recover_title" = "Sichere Nachrichten"; +"key_backup_recover_title" = "Nachrichten sichern"; "key_backup_recover_invalid_passphrase_title" = "Falsche Wiederherstellungspassphrase"; "key_backup_recover_invalid_passphrase" = "Sicherung konnte nicht mit dieser Passphrase entschlรผsselt werden: Bitte stelle sicher, dass du die richtige Wiederherstellungspassphrase eingegeben hast."; "key_backup_recover_invalid_recovery_key_title" = "Wiederherstellungsschlรผssel passt nicht"; "key_backup_recover_invalid_recovery_key" = "Sicherung konnte mit diesem Schlรผssel nicht entschlรผsselt werden: Bitte stelle sicher, dass du den richtigen Wiederherstellungsschlรผssel eingegeben hast."; "key_backup_recover_from_passphrase_info" = "Nutze deine Wiederherstellungspassphrase um deinen sicheren Chatverlauf zu entschlรผsseln"; -"key_backup_recover_from_passphrase_passphrase_title" = "Gebe"; +"key_backup_recover_from_passphrase_passphrase_title" = "Eingeben"; "key_backup_recover_from_passphrase_passphrase_placeholder" = "Passphrase eingeben"; "key_backup_recover_from_passphrase_recover_action" = "Historie entschlรผsseln"; -"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Kenne deine Wiederherstellungskennphrase nicht? Du kannst "; -"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "nutze deinen Wiederherstellungsschlรผssel"; +"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Kennst deinen Wiederherstellungskennphrase nicht? Du kannst "; +"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "deinen Wiederherstellungsschlรผssel nutzen"; "key_backup_recover_from_passphrase_lost_passphrase_action_part3" = "."; "key_backup_recover_from_recovery_key_info" = "Nutze deinen Wiederherstellungsschlรผssel um deinen sicheren Chatverlauf zu entschlรผsseln"; -"key_backup_recover_from_recovery_key_recovery_key_title" = "Gebe"; +"key_backup_recover_from_recovery_key_recovery_key_title" = "Eingeben"; "key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Gebe Wiederherstellungsschlรผssel ein"; "key_backup_recover_from_recovery_key_recover_action" = "Historie entschlรผsseln"; "key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Hast du deinen Wiederherstellungsschlรผssel verloren? Du kannst in den Einstellungen einen neuen einrichten."; @@ -650,10 +650,10 @@ "e2e_key_backup_wrong_version_button_settings" = "Einstellungen"; "e2e_key_backup_wrong_version_button_wasme" = "Das war ich"; "key_backup_setup_intro_manual_export_info" = "(Erweitert)"; -"key_backup_setup_intro_manual_export_action" = "Manueller Schlรผssel Export"; +"key_backup_setup_intro_manual_export_action" = "Manueller Schlรผssel-Export"; // String for App Store "store_short_description" = "Sicherer, dezentralisierter Chat/VoIP"; -"store_full_description" = "Element ist die neue Art von Messenger- und Kooperations-App, die:\n\n1. dir die Kontrolle gibt deine Privatsphรคre zu schรผtzen,\n2. dir die Kommunikation mit anderen Personen im Matrix-Netzwerk und darรผber hinaus Integration in Apps wie Slack ermรถglicht,\n3. dich vor Werbung, Datenerfassung, Hintertรผren und ummauerten Gรคrten schรผtzt,\n4. dich durch End-to-End-Verschlรผsselung absichert und mit Cross-Signing andere zu รผberprรผfen.\n\nElement unterscheidet sich grundlegend von anderen Messaging- und Kooperations-Diensten, da es dezentralisiert und open-source ist.\n\nMit Element kannst du dich selbst hosten oder einen Host auswรคhlen, sodass du Datenschutz, Eigentum und Kontrolle รผber deine Daten und Konversationen hast. Du erhรคltst Zugriff auf ein offenes Netzwerk und bist nicht auf Element-Nutzer beschrรคnkt. Und es ist sehr sicher.\n\nElement ist in der Lage, all dies zu tun, da es mit Matrix arbeitet - dem Standard fรผr offene, dezentrale Kommunikation.\n\nMit Element hast du die Kontrolle, indem du auswรคhlen kannst, wer deine Konversationen hostet. In der Element-App kannst du verschiedene Hosts auswรคhlen:\n\n1. Hole dir ein kostenloses Konto auf dem รถffentlichen Server von matrix.org\n2. Hoste dein Konto selbst, indem du einen Server auf deiner eigenen Hardware ausfรผhrst\n3. Melde dich fรผr ein Konto auf einem benutzerdefinierten Server an, indem du einfach die Hosting-Plattform von Element Matrix Services abonnierst\n\nWarum Element?\n\nBESITZE DEINE DATEN: Du entscheidest, wo deine Daten und Nachrichten aufbewahrt werden sollen. Du besitzt und kontrollierst sie, nicht irgendeine MEGACORP, die deine Daten verwertet oder Dritten Zugriff gewรคhrt.\n\nOPEN MESSAGING UND ZUSAMMENARBEIT: Du kannst mit allen anderen Mitgliedern des Matrix-Netzwerks chatten, unabhรคngig davon, ob sie Element oder eine andere Matrix-App verwenden, sogar selbst wenn sie ein anderes Messaging-System wie Slack, IRC oder XMPP verwenden.\n\nSUPERSICHER: Echte End-to-End-Verschlรผsselung (nur diejenigen in der Konversation kรถnnen Nachrichten entschlรผsseln) und Cross-Signing, um die Gerรคte der Konversationsteilnehmer zu รผberprรผfen.\n\nVOLLSTร„NDIGE KOMMUNIKATION: Messaging, Sprach- und Videoanrufe, Dateifreigabe, Bildschirmfreigabe und eine ganze Reihe von Integrationen, Bots und Widgets. Baue Rรคume, Gemeinschaften, bleib in Kontakt und erledige Dinge.\n\nรœBERALL, WO Du BIST: Bleibe mit dem vollstรคndig synchronisierten Nachrichtenverlauf auf all deinen Gerรคten und im Internet (unter https://element.io/app) unabhรคngig voneinander in Kontakt."; +"store_full_description" = "Element ist die neue Art von Messenger- und Kooperations-App, die:\n\n1. dir die Kontrolle gibt deine Privatsphรคre zu schรผtzen,\n2. dir die Kommunikation mit anderen Personen im Matrix-Netzwerk und darรผber hinaus Integration in Apps wie Slack ermรถglicht,\n3. dich vor Werbung, Datenerfassung, Hintertรผren und geschlossene Plattformen schรผtzt,\n4. dich durch End-to-End-Verschlรผsselung absichert und mit Quersignaturen andere รผberprรผft.\n\nElement unterscheidet sich grundlegend von anderen Messaging- und Kooperations-Diensten, da es dezentralisiert und open-source ist.\n\nMit Element kannst du dich selbst hosten oder einen Host auswรคhlen, sodass du Datenschutz, Eigentum und Kontrolle รผber deine Daten und Konversationen hast. Du erhรคltst Zugriff auf ein offenes Netzwerk und bist nicht auf Element-Nutzer beschrรคnkt. Und es ist sehr sicher.\n\nElement ist in der Lage, all dies zu tun, da es mit Matrix arbeitet - dem Standard fรผr offene, dezentrale Kommunikation.\n\nMit Element hast du die Kontrolle, indem du auswรคhlen kannst, wer deine Konversationen hostet. In der Element-App kannst du verschiedene Hosts auswรคhlen:\n\n1. Hole dir ein kostenloses Konto auf dem รถffentlichen Server von matrix.org\n2. Hoste dein Konto selbst, indem du einen Server auf deiner eigenen Hardware ausfรผhrst\n3. Melde dich fรผr ein Konto auf einem benutzerdefinierten Server an, indem du einfach die Hosting-Plattform von Element Matrix Services abonnierst\n\nWarum Element?\n\nBESITZE DEINE DATEN: Du entscheidest, wo deine Daten und Nachrichten aufbewahrt werden sollen. Du besitzt und kontrollierst sie, nicht irgendein MEGAKONZERN, die deine Daten verwertet oder Dritten Zugriff gewรคhrt.\n\nOPEN MESSAGING UND ZUSAMMENARBEIT: Du kannst mit allen anderen Mitgliedern des Matrix-Netzwerks chatten, unabhรคngig davon, ob sie Element oder eine andere Matrix-App verwenden, sogar selbst wenn sie ein anderes Messaging-System wie Slack, IRC oder XMPP verwenden.\n\nSUPERSICHER: Echte End-to-End-Verschlรผsselung (nur diejenigen in der Konversation kรถnnen Nachrichten entschlรผsseln) und Quersignierung, um die Gerรคte der Konversationsteilnehmer zu รผberprรผfen.\n\nVOLLSTร„NDIGE KOMMUNIKATION: Messaging, Sprach- und Videoanrufe, Dateifreigabe, Bildschirmfreigabe und eine ganze Reihe von Integrationen, Bots und Widgets. Baue Rรคume, Gemeinschaften, bleib in Kontakt und erledige Dinge.\n\nรœBERALL, WO DU BIST: Bleibe mit dem vollstรคndig synchronisierten Nachrichtenverlauf auf all deinen Gerรคten und im Internet (unter https://element.io/app) unabhรคngig voneinander in Kontakt."; "auth_login_single_sign_on" = "Anmelden"; "auth_autodiscover_invalid_response" = "Ungรผltige Antwort beim Entdecken des Heimservers"; "room_message_unable_open_link_error_message" = "Konnte Link nicht รถffnen."; @@ -735,16 +735,16 @@ "device_verification_emoji_headphones" = "Kopfhรถrer"; "close" = "SchlieรŸen"; "auth_softlogout_signed_out" = "Du bist abgemeldet"; -"auth_softlogout_sign_in" = "Einloggen"; -"auth_softlogout_reason" = "Deine Heimserver-Administration (%1$@) hat dich von deinem Konto %2$@ (%3$@) abgemeldet."; -"auth_softlogout_recover_encryption_keys" = "Melden dich an, um ausschlieรŸlich auf diesem Gerรคt gespeicherte Verschlรผsselungsschlรผssel wiederherzustellen. Du benรถtigst sie, um deine verschlรผsselten Nachrichten auf jedem Gerรคt zu lesen."; +"auth_softlogout_sign_in" = "Anmelden"; +"auth_softlogout_reason" = "Deine Heimserver-Administrator (%1$@) hat dich von deinem Konto %2$@ (%3$@) abgemeldet."; +"auth_softlogout_recover_encryption_keys" = "Melde dich an, um ausschlieรŸlich auf diesem Gerรคt gespeicherte Verschlรผsselungsschlรผssel wiederherzustellen. Du benรถtigst sie, um deine verschlรผsselten Nachrichten auf jedem Gerรคt zu lesen."; "auth_softlogout_clear_data" = "Persรถnliche Daten lรถschen"; "auth_softlogout_clear_data_message_1" = "Warnung: Deine persรถnlichen Daten (einschlieรŸlich Verschlรผsselungsschlรผssel) sind noch auf diesem Gerรคt gespeichert."; "auth_softlogout_clear_data_message_2" = "Deaktiviere es, wenn du dieses Gerรคt nicht mehr verwendest oder du dich mit einem anderen Konto anmelden mรถchtst."; "auth_softlogout_clear_data_button" = "Lรถsche alle Daten"; "auth_softlogout_clear_data_sign_out_title" = "Bist du sicher?"; "auth_softlogout_clear_data_sign_out_msg" = "Mรถchtest du wirklich alle derzeit auf diesem Gerรคt gespeicherten Daten lรถschen? Melde dich erneut an, um auf deine Kontodaten und Nachrichten zuzugreifen."; -"auth_softlogout_clear_data_sign_out" = "Ausloggen"; +"auth_softlogout_clear_data_sign_out" = "Abmelden"; "room_event_action_reaction_show_all" = "Zeige alles"; "room_event_action_reaction_show_less" = "Zeige weniger"; "room_event_action_reaction_history" = "Reaktionsverlauf"; @@ -754,11 +754,11 @@ "widget_no_integrations_server_configured" = "Kein Integrationsserver konfiguriert"; "widget_integrations_server_failed_to_connect" = "Verbindung zum Integrationsserver fehlgeschlagen"; "device_verification_security_advice" = "Fรผr maximale Sicherheit empfehlen wir, dies persรถnlich zu tun oder ein anderes vertrauenswรผrdiges Kommunikationsmittel zu verwenden"; -"device_verification_incoming_description_1" = "รœberprรผfe diese Sitzung, um sie als vertrauenswรผrdig zu markieren. Sitzungen von Partner!nnen zu vertrauen gibt dir zusรคtzliche Sicherheit bei der Verwendung von Ende-zu-Ende verschlรผsselten Nachrichten."; -"device_verification_incoming_description_2" = "Wenn du diese Sitzung verifizierst, wird es sie vertrauenswรผrdig und fรผr dein Gegenรผber als vertrauenswรผrdig gekennzeichnet."; +"device_verification_incoming_description_1" = "รœberprรผfe diese Sitzung, um sie als vertrauenswรผrdig zu markieren. Sitzungen von Partnern zu vertrauen gibt dir zusรคtzliche Sicherheit bei der Verwendung von Ende-zu-Ende verschlรผsselten Nachrichten."; +"device_verification_incoming_description_2" = "Wenn du diese Sitzung verifizierst, wird sie fรผr dich und fรผr dein Gegenรผber als vertrauenswรผrdig gekennzeichnet."; // MARK: Start "device_verification_start_title" = "Verifizieren durch Vergleichen eines kurzen Textes"; -"device_verification_start_wait_partner" = "Warten auf Annahme durch Partner!nโ€ฆ"; +"device_verification_start_wait_partner" = "Warten auf Annahme durch Partnerโ€ฆ"; "device_verification_start_use_legacy" = "Passiert nichts? Noch nicht alle Clients unterstรผtzen die interaktive Verifizierung. Verwende die alte Verifizierungsmethode."; "device_verification_start_use_legacy_action" = "Verwende alte Verifizierungsmethode"; // MARK: Verify @@ -777,19 +777,19 @@ "device_verification_emoji_hourglass" = "Sanduhr"; "device_verification_emoji_clock" = "Uhr"; "device_verification_emoji_pencil" = "Bleistift"; -"device_verification_emoji_lock" = "sperren"; +"device_verification_emoji_lock" = "Schloss"; "device_verification_emoji_folder" = "Ordner"; -"device_verification_emoji_pin" = "Stift"; +"device_verification_emoji_pin" = "Stecknadel"; // MARK: File upload "file_upload_error_title" = "Datei hochladen"; "file_upload_error_unsupported_file_type_message" = "Dateityp wird nicht unterstรผtzt."; // MARK: Emoji picker "emoji_picker_title" = "Reaktionen"; -"emoji_picker_people_category" = "Smileys & Menschen"; -"emoji_picker_nature_category" = "Tiere & Natur"; +"emoji_picker_people_category" = "Smileys und Menschen"; +"emoji_picker_nature_category" = "Tiere und Natur"; "emoji_picker_foods_category" = "Essen und Trinken"; "emoji_picker_activity_category" = "Aktivitรคten"; -"emoji_picker_places_category" = "Reisen & Orte"; +"emoji_picker_places_category" = "Reisen und Orte"; "emoji_picker_objects_category" = "Objekte"; "emoji_picker_symbols_category" = "Symbole"; "emoji_picker_flags_category" = "Flaggen"; @@ -811,13 +811,13 @@ "service_terms_modal_message" = "Um fortzufahren, musst du die Nutzungsbedingungen akzeptieren (%@)."; "service_terms_modal_accept_button" = "Akzeptieren"; "service_terms_modal_description_for_identity_server" = "Fรผr andere auffindbar sein"; -"service_terms_modal_description_for_integration_manager" = "Verwende Bots, Bridges, Widgets und Sticker-Pakete"; +"service_terms_modal_description_for_integration_manager" = "Bots, Brรผcken, Widgets und Aufkleberpakete verwenden"; "auth_email_is_required" = "Es ist kein Identitรคtsserver konfiguriert, sodass du keine E-Mail-Adresse hinzufรผgen kannst, um dein Kennwort in Zukunft zurรผckzusetzen."; "auth_phone_is_required" = "Es ist kein Identitรคtsserver konfiguriert, sodass du keine Telefonnummer hinzufรผgen kannst, um dein Kennwort in Zukunft zurรผckzusetzen."; "auth_reset_password_error_is_required" = "Es ist kein Identitรคtsserver konfiguriert: Fรผge einen in die Serveroptionen ein, um dein Kennwort zurรผckzusetzen."; // Errors "error_user_already_logged_in" = "Du versuchst anscheinend, eine Verbindung zu einem anderen Heimserver herzustellen. Mรถchtest du dich abmelden?"; -"contacts_address_book_no_identity_server" = "Kein Integrationsserver konfiguriert"; +"contacts_address_book_no_identity_server" = "Kein Identitรคtsserver konfiguriert"; "room_participants_remove_third_party_invite_prompt_msg" = "Mรถchtest du diese Einladung wirklich widerrufen?"; "room_accessiblity_scroll_to_bottom" = "Zum Seitenende springen"; "room_accessibility_search" = "Suchen"; @@ -830,20 +830,20 @@ "media_type_accessibility_video" = "Video"; "media_type_accessibility_location" = "Standort"; "media_type_accessibility_file" = "Datei"; -"media_type_accessibility_sticker" = "Sticker"; -"settings_identity_server_settings" = "IDENTITร„T SERVER"; +"media_type_accessibility_sticker" = "Aufkleber"; +"settings_identity_server_settings" = "IDENTITร„TSERVER"; "settings_three_pids_management_information_part1" = "Verwalte hier, mit welchen E-Mail-Adressen oder Telefonnummern du dich anmeldest, oder dein Konto wiederherstellen kannst. Kontrolliere, wer dich finden kann "; "settings_three_pids_management_information_part3" = "."; "settings_calls_stun_server_fallback_button" = "Ausweich-Anruf-Assistenz-Server zulassen"; "settings_devices_description" = "Der รถffentliche Name der Sitzung ist fรผr Personen sichtbar, mit denen du kommunizierst"; "settings_discovery_no_identity_server" = "Du verwendest derzeit keinen Identitรคtsserver. Fรผge einen hinzu, um fรผr vorhandene, dir bekannte Kontakte sichtbar zu sein."; "settings_discovery_terms_not_signed" = "Stimme den Nutzungsbedingungen des Identitรคtsservers (%@) zu, um zu erlauben per E-Mail oder Telefonnummer gefunden zu werden."; -"settings_discovery_three_pids_management_information_part1" = "Verwalte, welche E-Mail-Adressen oder Telefonnummern andere Benutzer!nnen verwenden kรถnnen, um dich zu entdecken und dich in Rรคume einzuladen. Fรผge in dieser Liste E-Mail-Adressen oder Telefonnummern hinzu oder entferne sie "; +"settings_discovery_three_pids_management_information_part1" = "Verwalte, welche E-Mail-Adressen oder Telefonnummern andere Benutzer verwenden kรถnnen, um dich zu entdecken und dich in Rรคume einzuladen. Fรผge in dieser Liste E-Mail-Adressen oder Telefonnummern hinzu oder entferne sie "; "settings_discovery_three_pids_management_information_part2" = "Nutzereinstellungen"; "settings_discovery_three_pids_management_information_part3" = "."; "settings_discovery_error_message" = "Es ist ein Fehler aufgetreten. Bitte erneut versuchen."; "settings_discovery_three_pid_details_title_email" = "E-Mail verwalten"; -"settings_discovery_three_pid_details_information_email" = "Verwalte die Einstellungen fรผr diese E-Mail-Adresse, die andere Benutzer!nnen verwenden kรถnnen, um dich zu entdecken und dich in Rรคume einzuladen. Hinzufรผgen oder Entfernen von E-Mail-Adressen in Konten."; +"settings_discovery_three_pid_details_information_email" = "Verwalte die Einstellungen fรผr diese E-Mail-Adresse, die andere Benutzer verwenden kรถnnen, um dich zu entdecken und dich in Rรคume einzuladen. Hinzufรผgen oder Entfernen von E-Mail-Adressen in Konten."; "settings_discovery_three_pid_details_title_phone_number" = "Telefonnummer verwalten"; "settings_discovery_three_pid_details_share_action" = "Teilen"; "settings_discovery_three_pid_details_revoke_action" = "Widerrufen"; @@ -874,12 +874,12 @@ "auth_add_phone_message_2" = "Richte eine Telefonnummer ein. Spรคter kannst du einrichten, dass Personen dich รผber diese finden."; "auth_add_email_phone_message_2" = "Lege eine E-Mail-Adresse fรผr die Kontowiederherstellung fest. Spรคter kann optional eine E-Mail-Adresse oder eine Telefonnummer dazu verwendet werden, um von anderen Personen gefunden zu werden."; "settings_calls_stun_server_fallback_description" = "Ausweich-Anruf-Assistenz-Server %@ zulassen, wenn dein Heimserver keinen anbietet (deine IP-Adresse wird wรคhrend eines Anrufs weitergegeben)."; -"settings_discovery_three_pid_details_information_phone_number" = "Verwalte die Einstellungen fรผr diese Telefonnummer, die andere Benutzer!nnen verwenden kรถnnen, um dich zu entdecken und dich in Rรคume einzuladen. Hinzufรผgen oder Entfernen von Telefonnummern in Konten."; +"settings_discovery_three_pid_details_information_phone_number" = "Verwalte die Einstellungen fรผr diese Telefonnummer, die andere Benutzer verwenden kรถnnen, um dich zu entdecken und dich in Rรคume einzuladen. Hinzufรผgen oder Entfernen von Telefonnummern in Konten."; "settings_identity_server_description" = "Mithilfe des oben festgelegten Identitรคtsservers kannst du vorhandene Kontakte finden und dich fรผr diese sichtbar machen."; "settings_identity_server_no_is_description" = "Du nutzt momentan keinen Identitรคtsserver. Um von bestehenden Kontakten gefunden zu werden und diese zu finden, fรผge oben einen hinzu."; "identity_server_settings_description" = "Du nutzt aktuell %@ um vorhandene Kontakte zu finden und um von dir bekannten Kontakten gefunden zu werden."; "identity_server_settings_no_is_description" = "Du nutzt momentan keinen Identitรคtsserver. Um von bestehenden Kontakten gefunden zu werden und diese zu finden, fรผge oben einen hinzu."; -"identity_server_settings_alert_no_terms" = "Der Identitรคtsserver den du ausgewรคhlt hast, hat keine Nutzungsbedingungen. Fahre nur fort, wenn du dem/r Besitzer!n des Dienstes vertraust."; +"identity_server_settings_alert_no_terms" = "Der Identitรคtsserver den du ausgewรคhlt hast, hat keine Nutzungsbedingungen. Fahre nur fort, wenn du dem Besitzer des Dienstes vertraust."; "identity_server_settings_alert_change" = "Verbindung zum Identitรคtsserver %1$@ trennen und stattdessen zu %2$@ verbinden?"; "identity_server_settings_alert_disconnect" = "Verbindung zum Identitรคtsserver %@ trennen?"; "identity_server_settings_alert_error_terms_not_accepted" = "Du musst die Nutzungsbedingungen von %@ akzeptieren, um ihn als Identitรคtsserver festzulegen."; @@ -888,12 +888,12 @@ "call_no_stun_server_error_message_2" = "Alternativ kannst du versuchen, den รถffentlichen Server unter %@ zu verwenden. Dieser wird nicht so zuverlรคssig sein, und deine IP-Adresse wird mit ihm geteilt. Du kannst dies auch in den Einstellungen konfigurieren"; "service_terms_modal_message_identity_server" = "Akzeptiere die Bedingungen des Identitรคtsservers (%@), um Kontakte zu finden."; "identity_server_settings_alert_disconnect_still_sharing_3pid" = "Du teilst noch deine persรถnlichen Daten mit dem Identitรคtsserver %@.\n\nWir empfehlen dir deine E-Mail-Adresse und Telefonnummer zu entfernen, bevor du die Verbindung zum Identitรคtsserver trennst."; -"settings_add_3pid_password_title_email" = "E-Mail Adresse hinzufรผgen"; +"settings_add_3pid_password_title_email" = "E-Mail-Adresse hinzufรผgen"; "settings_add_3pid_password_title_msidsn" = "Telefonnummer hinzufรผgen"; "settings_add_3pid_password_message" = "Um fortzufahren, bitte Passwort eingeben"; -"settings_add_3pid_invalid_password_message" = "Ungรผltiges Passwort"; -"identity_server_settings_disconnect_info" = "Eine Trennung von deinem Identitรคtsserver wรผrde bedeuten, dass du weder von anderen Nutzer!nnen gefunden werden, noch diese dich per E-Mail oder Telefonnummer einladen kรถnnen."; -"error_not_supported_on_mobile" = "Dies ist in %@ mobile nicht mรถglich."; +"settings_add_3pid_invalid_password_message" = "Ungรผltige Anmeldedaten"; +"identity_server_settings_disconnect_info" = "Eine Trennung von deinem Identitรคtsserver wรผrde bedeuten, dass du weder von anderen Nutzer gefunden werden, noch diese dich per E-Mail oder Telefonnummer einladen kรถnnen."; +"error_not_supported_on_mobile" = "Dies ist in der Mobilvariante von %@ nicht mรถglich."; "settings_integrations" = "INTEGRATIONEN"; "settings_integrations_allow_button" = "Integrationen verwalten"; "widget_menu_refresh" = "Aktualisierung"; @@ -912,18 +912,18 @@ "room_participants_security_loading" = "Ladeโ€ฆ"; "room_participants_security_information_room_not_encrypted" = "Nachrichten in diesem Raum sind nicht Ende-zu-Ende verschlรผsselt."; "settings_security" = "SICHERHEIT"; -"settings_integrations_allow_description" = "Benutze einen Integrations-Manager (%@), um Bots, Bridges, Widgets und Sticker-Packs zu verwalten.\n\nIntegrations-Manager erhalten Konfigurations-Daten und kรถnnen Widgets verรคndern, Raum-Einladungen versenden sowie Berechtigungen in deinem Namen einstellen."; +"settings_integrations_allow_description" = "Benutze einen Integrationsverwalter (%@), um Bots, Bridges, Widgets und Aufkleberpakete zu verwalten.\n\nIntegrationsverwalter erhalten Konfigurationsdaten und kรถnnen Widgets verรคndern, Raum-Einladungen versenden sowie Berechtigungen in deinem Namen einstellen."; "settings_labs_enable_cross_signing" = "Aktiviere Cross-Signing, um deinen Gesprรคchspartner anstatt dessen Gerรคt zu verifizieren (in Entwicklung)"; // Security settings "security_settings_title" = "Sicherheit"; "security_settings_crypto_sessions" = "MEINE SITZUNGEN"; "security_settings_crypto_sessions_loading" = "Lade Sitzungenโ€ฆ"; -"room_participants_security_information_room_encrypted" = "Nachrichten in diesem Raum sind Ende-zu-Ende verschlรผsselt.\n\nDeine Nachrichten sind mit digitalen Schlรผsseln gesichert, nur du und der/die Empfรคnger!n haben die einzigen Schlรผssel, um jene zu entsperren."; +"room_participants_security_information_room_encrypted" = "Nachrichten in diesem Raum sind Ende-zu-Ende verschlรผsselt.\n\nDeine Nachrichten sind mit digitalen Schlรผsseln gesichert, nur du und der Empfรคnger haben die einzigen Schlรผssel, um jene zu entsperren."; "security_settings_crypto_sessions_description" = "Vertraue Sitzungen, um Zugriff auf Ende-zu-Ende verschlรผsselte Nachrichten zu gewรคhren. Wenn du eine Sitzung nicht kennst, รคndere dein Anmeldepasswort und setze dein Nachrichtenpasswort fรผr die Nachrichtensicherung zurรผck."; "security_settings_backup" = "NACHRICHTENSICHERUNG"; "security_settings_advanced" = "ERWEITERT"; "security_settings_blacklist_unverified_devices" = "Sende niemals Nachrichten an nicht-vertrauenswรผrdige Sitzungen"; -"security_settings_blacklist_unverified_devices_description" = "Verifiziere alle Sitzungen eines/einer Benutzer!n, um sie als vertrauenswรผrdig zu markieren, und sende ihr/ihm Nachrichten."; +"security_settings_blacklist_unverified_devices_description" = "Verifiziere alle Sitzungen eines Benutzer, um sie als vertrauenswรผrdig zu markieren, und sende ihm Nachrichten."; "security_settings_export_keys_manually" = "Schlรผssel manuell exportieren"; // Manage session "manage_session_title" = "Sitzung verwalten"; @@ -942,8 +942,8 @@ "room_widget_permission_avatar_url_permission" = "Deine Avatar-URL"; "room_widget_permission_user_id_permission" = "Deine Benutzer-ID"; "room_widget_permission_theme_permission" = "Dein Thema"; -"room_widget_permission_widget_id_permission" = "Widget ID"; -"room_widget_permission_room_id_permission" = "Raum ID"; +"room_widget_permission_widget_id_permission" = "Widget-ID"; +"room_widget_permission_room_id_permission" = "Raum-ID"; // Service terms - Variant for identity server when displayed out of a context "service_terms_modal_title_identity_server" = "Kontakte entdecken"; "service_terms_modal_policy_checkbox_accessibility_hint" = "Prรผfen um zu akzeptieren %@"; @@ -960,7 +960,7 @@ "key_verification_tile_request_status_cancelled_by_me" = "Du hast abgebrochen"; "key_verification_tile_request_status_cancelled" = "%@ abgebrochen"; "key_verification_tile_request_status_accepted" = "Du hast akzeptiert"; -"key_verification_tile_request_incoming_approval_accept" = "Akzeptieren"; +"key_verification_tile_request_incoming_approval_accept" = "Annehmen"; "key_verification_tile_request_incoming_approval_decline" = "Ablehnen"; "key_verification_tile_conclusion_done_title" = "Verifiziert"; "key_verification_tile_conclusion_warning_title" = "Nicht vertrauenswรผrdige Anmeldung"; @@ -984,12 +984,12 @@ "user_verification_session_details_information_trusted_other_user_part2" = " verifiziert:"; "user_verification_session_details_information_untrusted_current_user" = "Verifiziere diese Sitzung, um sie als vertrauenswรผrdig zu markieren, und gewรคhren ihr Zugriff auf verschlรผsselte Nachrichten:"; "user_verification_session_details_information_untrusted_other_user" = " hat sich in einer neuen Sitzung angemeldet:"; -"user_verification_session_details_additional_information_untrusted_other_user" = "Bis diese/r Benutzer!n dieser Sitzung vertraut, werden an und von ihr/ihm gesendete Nachrichten mit Warnungen gekennzeichnet. Alternativ kannst du dies manuell รผberprรผfen."; +"user_verification_session_details_additional_information_untrusted_other_user" = "Bis dieser Benutzer diese Sitzung vertraut, werden an und von ihm gesendete Nachrichten mit Warnungen gekennzeichnet. Alternativ kannst du dies manuell รผberprรผfen."; "user_verification_session_details_additional_information_untrusted_current_user" = "Wenn du dich nicht zu dieser Sitzung angemeldet hast, ist dein Konto mรถglicherweise gefรคhrdet."; "user_verification_session_details_verify_action_current_user" = "Interaktiv รผberprรผfen"; "user_verification_session_details_verify_action_other_user" = "Manuell Verifizieren"; "room_participants_action_security_status_loading" = "Ladeโ€ฆ"; -"security_settings_crosssigning" = "CROSS-SIGNING"; +"security_settings_crosssigning" = "QUERSIGNIERUNG"; "security_settings_cryptography" = "VERSCHLรœSSELUNG"; "device_verification_self_verify_alert_title" = "Neue Anmeldung. Warst du das?"; "device_verification_self_verify_alert_message" = "Bestรคtige neue Anmeldung zu deinem Konto: %@"; @@ -1003,7 +1003,7 @@ "skip" = "รœberspringen"; // MARK: Clients "client_desktop_name" = "Element Desktop"; -"security_settings_crosssigning_info_not_bootstrapped" = "Cross-signing ist bisher nicht konfiguriert."; +"security_settings_crosssigning_info_not_bootstrapped" = "Quersignierung ist bisher nicht konfiguriert."; "client_web_name" = "Element Web"; "client_ios_name" = "Element iOS"; "client_android_name" = "Element Android"; @@ -1011,27 +1011,27 @@ "room_member_power_level_moderator_in" = "Moderator in %@"; "room_member_power_level_custom_in" = "Benutzerdefiniert (%@) in %@"; "room_member_power_level_short_admin" = "Admin"; -"room_member_power_level_short_moderator" = "Mod"; +"room_member_power_level_short_moderator" = "Moderator"; "room_member_power_level_short_custom" = "Benutzerdefiniert"; -"security_settings_secure_backup" = "SICHERES BACKUP"; +"security_settings_secure_backup" = "SICHERE SICHERHEITSKOPIE"; "security_settings_secure_backup_synchronise" = "Synchronisiere"; "security_settings_secure_backup_delete" = "Lรถsche"; -"security_settings_crosssigning_info_ok" = "Cross-signing ist angeschaltet."; -"security_settings_crosssigning_reset" = "Cross-signing zurรผcksetzen"; -"security_settings_coming_soon" = "Entschuldigung, diese Funktion ist noch nicht fรผr Element iOS verfรผgbar. Bitte nutze einen anderen Matrix Client, um es einzurichten. Element iOS wird es benutzen."; +"security_settings_crosssigning_info_ok" = "Quersignierung ist angeschaltet."; +"security_settings_crosssigning_reset" = "Quersignierung zurรผcksetzen"; +"security_settings_coming_soon" = "Entschuldigung, diese Funktion ist noch nicht fรผr Element iOS verfรผgbar. Bitte nutze einen anderen Matrix-Client, um es einzurichten. Element iOS wird es benutzen."; "security_settings_user_password_description" = "Bestรคtige deine Identitรคt durch Eingabe des Kontopassworts"; // AuthenticatedSessionViewControllerFactory -"authenticated_session_flow_not_supported" = "Diese App unterstรผtzt nicht diese Authentifizierungsmethode fรผr deinen Home-Server."; -"secure_key_backup_setup_intro_title" = "Sicheres Backup"; +"authenticated_session_flow_not_supported" = "Diese App unterstรผtzt nicht diese Authentifizierungsmethode fรผr deinen Heimserver."; +"secure_key_backup_setup_intro_title" = "Sichere Datensicherung"; "store_promotional_text" = "Privatsphรคre-wahrende Kollaborations-App in einem offenen Netzwerk. Dezentral, um dir die Kontrolle zu geben. Keine Datenerfassung, keine Hintertรผren und kein Zugriff durch Dritte."; "room_participants_action_security_status_complete_security" = "Vollstรคndige Sicherheit"; "external_link_confirmation_title" = "รœberprรผfe diesen Link genau"; "external_link_confirmation_message" = "Der Link %@ braucht zu lange auf der anderen Seite: %@\n\nSicher, dass du fortfahren mรถchtest?"; -"security_settings_crypto_sessions_description_2" = "Wenn du dich nicht eingeloggt hast, รคndere dein Passwort und setze das Sichere Backup zurรผck."; +"security_settings_crypto_sessions_description_2" = "Wenn du dich nicht angemeldet hast, รคndere dein Passwort und setze die Sichere Sicherheitskopie zurรผck."; "security_settings_secure_backup_description" = "Sichere deine verschlรผsselten Nachrichten und Daten, indem du die Schlรผssel auf deinem Server sicherst."; -"security_settings_crosssigning_info_exists" = "Dein Konto hat eine Cross-Signing Identitรคt, aber dieser Sitzung wird noch nicht vertraut. Vervollstรคndige die Sicherheit auf diese Sitzung."; -"security_settings_crosssigning_info_trusted" = "Cross-Signing ist aktiviert. Du kannst anderen Nutzern und deinen anderen Sitzungen basierend auf Cross-Signing vertrauen, aber du kannst in dieser Sitzung kein Cross-Signing durchfรผhren, da sie keine privaten Cross-Signing-Schlรผssel enthรคlt. Vervollstรคndige die Sicherheit dieser Sitzung."; -"security_settings_crosssigning_bootstrap" = "Cross-Signing einrichten"; +"security_settings_crosssigning_info_exists" = "Dein Konto hat eine Quersignatur-Identitรคt, aber dieser Sitzung wird noch nicht vertraut. Vervollstรคndige die Sicherheit auf diese Sitzung."; +"security_settings_crosssigning_info_trusted" = "Quersignierung ist aktiviert. Du kannst anderen Nutzern und deinen anderen Sitzungen basierend auf der Quersignatur vertrauen, aber du kannst in dieser Sitzung keine Quersignierung durchfรผhren, da sie keine privaten Quersignatur-Schlรผssel enthรคlt. Vervollstรคndige die Sicherheit dieser Sitzung."; +"security_settings_crosssigning_bootstrap" = "Quersignierung einrichten"; "security_settings_complete_security_alert_title" = "Vollstรคndige Sicherheit"; "security_settings_complete_security_alert_message" = "Du solltest zuerst die Sicherheit deiner aktuellen Sitzung vervollstรคndigen."; // Events formatter with you @@ -1039,34 +1039,34 @@ "event_formatter_widget_removed_by_you" = "Du hast das Widget entfernt: %@"; "event_formatter_jitsi_widget_added_by_you" = "Du hast eine VoIP-Konferenz hinzugefรผgt"; "event_formatter_jitsi_widget_removed_by_you" = "Du hast eine VoIP-Konferenz entfernt"; -"secure_key_backup_setup_intro_info" = "Absicherung um den Zugriffsverlust auf verschlรผsselte Nachrichten & Daten zu verhindern, indem die Schlรผssel fรผr die Entschlรผsselung auf dem Server gesichert werden."; +"secure_key_backup_setup_intro_info" = "Absicherung um den Zugriffsverlust auf verschlรผsselte Nachrichten und Daten zu verhindern, indem die Schlรผssel fรผr die Entschlรผsselung auf dem Server gesichert werden."; "secure_key_backup_setup_intro_use_security_key_title" = "Benutze einen Sicherheitsschlรผssel"; -"secure_key_backup_setup_intro_use_security_key_info" = "Generiere einen Sicherheitsschlรผssel, welcher z.B. in einem Passwortmanager oder in einem Tresor sicher aufbewahrt werden sollte."; +"secure_key_backup_setup_intro_use_security_key_info" = "Generiere einen Sicherheitsschlรผssel, welcher z.B. in einer Passwortverwaltung oder in einem Tresor sicher aufbewahrt werden sollte."; "secure_key_backup_setup_intro_use_security_passphrase_title" = "Benutze Sicherheitsphrase"; -"secure_key_backup_setup_intro_use_security_passphrase_info" = "Gib eine geheime Phrase ein, die nur du kennst, um einen Schlรผssel als Backup zu generieren."; -"secure_key_backup_setup_existing_backup_error_title" = "Ein Backup fรผr Nachrichten existiert bereits"; -"secure_key_backup_setup_existing_backup_error_info" = "Entsperre es, um es im sicheren Backup wiederzuverwenden, oder lรถsche es, um eine neue Nachrichtensicherung zu erstellen."; +"secure_key_backup_setup_intro_use_security_passphrase_info" = "Gib eine geheime Phrase ein, die nur du kennst, um einen Schlรผssel fรผr die Sicherung zu generieren."; +"secure_key_backup_setup_existing_backup_error_title" = "Eine Sicherheitskopie fรผr Nachrichten existiert bereits"; +"secure_key_backup_setup_existing_backup_error_info" = "Entsperre es, um es in der sicheren Datensicherung wiederzuverwenden, oder lรถsche es, um eine neue Nachrichtensicherung zu erstellen."; "secure_key_backup_setup_existing_backup_error_unlock_it" = "Entschlรผsseln"; "secure_key_backup_setup_cancel_alert_title" = "Sicher?"; -"secure_key_backup_setup_cancel_alert_message" = "Wenn du jetzt abbrichst und den Zugriff zu deinen Sitzungen verlierst, kannst du verschlรผsselte Nachrichten & Daten verlieren.\n\nDu kannst auch ein Backup einrichten & deine Schlรผssel in den Einstellungen verwalten."; -"secure_backup_setup_banner_title" = "Sicheres Backup"; -"secure_backup_setup_banner_subtitle" = "Absicherung gegen den Zugriffsverlust auf verschlรผsselte Nachrichten & Daten"; +"secure_key_backup_setup_cancel_alert_message" = "Wenn du jetzt abbrichst und den Zugriff zu deinen Sitzungen verlierst, kannst du verschlรผsselte Nachrichten & Daten verlieren.\n\nDu kannst auch eine Sicherung einrichten und deine Schlรผssel in den Einstellungen verwalten."; +"secure_backup_setup_banner_title" = "Sichere Datensicherung"; +"secure_backup_setup_banner_subtitle" = "Absicherung gegen den Zugriffsverlust auf verschlรผsselte Nachrichten und Daten"; // Recover from private key -"key_backup_recover_from_private_key_info" = "Backup wird wiederhergestelltโ€ฆ"; -"sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "Richte sicheres Backup ein"; +"key_backup_recover_from_private_key_info" = "Sicherung wird wiederhergestelltโ€ฆ"; +"sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "Richte sichere Datensicherung ein"; // MARK: - Device Verification "key_verification_other_session_title" = "Sitzung verifizieren"; "key_verification_new_session_title" = "Neue Sitzung verifizieren"; "key_verification_this_session_title" = "Verifiziere diese Sitzung"; -"device_verification_security_advice_emoji" = "Vergleiche die einzigartigen Emoji und stell sicher, dass sie in derselben Reihenfolge angezeigt werden."; +"device_verification_security_advice_emoji" = "Vergleiche die einzigartigen Emojis und kontrolliere, dass sie in derselben Reihenfolge angezeigt werden."; "device_verification_security_advice_number" = "Vergleiche die Zahlen und stell sicher, dass sie in derselben Reihenfolge angezeigt werden."; "key_verification_self_verify_current_session_alert_title" = "Verifiziere diese Sitzung"; "key_verification_self_verify_current_session_alert_message" = "Andere Benutzer vertrauen ihr vielleicht nicht."; "key_verification_self_verify_unverified_sessions_alert_title" = "รœberprรผfe, wo du angemeldet bist"; -"key_verification_self_verify_unverified_sessions_alert_message" = "Verifiziere alle deine Sitzungen, um sicher zu stellen, dass dein Konto & deine Nachrichten sicher sind."; +"key_verification_self_verify_unverified_sessions_alert_message" = "Verifiziere alle deine Sitzungen, um sicher zu stellen, dass dein Konto und deine Nachrichten sicher sind."; "key_verification_self_verify_unverified_sessions_alert_validate_action" = "รœberprรผfung"; "device_verification_self_verify_wait_new_sign_in_title" = "Diese Anmeldung verifizieren"; -"device_verification_self_verify_wait_additional_information" = "Dies funktioniert mit Element oder einem anderen Matrix Client, der Cross-Signing unterstรผtzt."; +"device_verification_self_verify_wait_additional_information" = "Dies funktioniert mit Element oder einem anderen Matrix-Client, der Quersignierung unterstรผtzt."; "device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Wiederherstellungsschlรผssel verwenden"; "device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Nutze eine Wiederherstellungsmethode"; "device_verification_self_verify_wait_recover_secrets_additional_information" = "Falls du keinen Zugang zu einer existierenden Sitzung hast"; @@ -1076,18 +1076,18 @@ "key_verification_verify_sas_validate_action" = "Sie passen"; "key_verification_verify_sas_additional_information" = "Fรผr ultimative Sicherheit verwende ein anderes vertrauenswรผrdiges Kommunikationsmittel oder mache es persรถnlich."; "key_verification_manually_verify_device_title" = "Verifiziere manuell mit einem Text"; -"key_verification_manually_verify_device_instruction" = "Vergleiche die folgenden Zeichen mit den Einstellungen in der Sitzung des/der anderen Nutzer!n und bestรคtige:"; +"key_verification_manually_verify_device_instruction" = "Vergleiche die folgenden Zeichen mit den Einstellungen in der Sitzung des anderen Nutzers und bestรคtige:"; "key_verification_manually_verify_device_name_title" = "Name der Sitzung"; "key_verification_manually_verify_device_id_title" = "Sitzungs-ID"; "key_verification_manually_verify_device_key_title" = "Sitzungsschlรผssel"; "key_verification_manually_verify_device_additional_information" = "Falls sie nicht รผbereinstimmen, wurde die Kommunikation vielleicht kompromittiert."; "key_verification_verified_new_session_title" = "Neue Sitzung verifiziert!"; -"key_verification_verified_other_session_information" = "Du kannst nun sichere Nachrichten in deiner anderen Sitzung lesen. Andere Benutzer/innen wissen, dass sie ihr vertrauen kรถnnen."; -"key_verification_verified_new_session_information" = "Du kannst nun sichere Nachrichten auf deinem anderen Gerรคt lesen. Andere Benutzer/innen wissen, dass sie ihr vertrauen kรถnnen."; -"key_verification_verified_this_session_information" = "Du kannst nun sichere Nachrichten auf diesem Gerรคt lesen. Andere Benutzer/innen wissen, dass sie vertrauenswรผrdig ist."; +"key_verification_verified_other_session_information" = "Du kannst nun sichere Nachrichten in deiner anderen Sitzung lesen. Andere Benutzer wissen, dass sie ihr vertrauen kรถnnen."; +"key_verification_verified_new_session_information" = "Du kannst nun sichere Nachrichten auf deinem neuen Gerรคt lesen. Andere Benutzer wissen, dass sie es vertrauen kรถnnen."; +"key_verification_verified_this_session_information" = "Du kannst nun sichere Nachrichten auf diesem Gerรคt lesen. Andere Benutzer wissen, dass sie es vertrauen kรถnnen."; "key_verification_verified_user_information" = "Nachrichten mit diesem Gegenรผber sind Ende-zu-Ende verschlรผsselt und kรถnnen nicht von Dritten gelesen werden."; "key_verification_bootstrap_not_setup_title" = "Fehler"; -"key_verification_bootstrap_not_setup_message" = "Du musst erst Cross-Signing einrichten."; +"key_verification_bootstrap_not_setup_message" = "Du musst erst die Quersignatur einrichten."; "key_verification_verify_qr_code_title" = "Verifizierung durch Scannen eines QR-Codes"; "key_verification_verify_qr_code_information" = "Scanne den Code fรผr eine gegenseitige รœberprรผfung."; "key_verification_verify_qr_code_information_other_device" = "Scanne den Code unten zur รœberprรผfung:"; @@ -1106,18 +1106,18 @@ "key_verification_scan_confirmation_scanned_user_information" = "Zeigt %@ dasselbe Schild an?"; "key_verification_scan_confirmation_scanned_device_information" = "Zeigt das andere Gerรคt das gleiche Schild an?"; "user_verification_session_details_verify_action_current_user_manually" = "รœberprรผfe manuell mit einem Text"; -"secrets_recovery_with_passphrase_title" = "Wiederherstellungs-Passphrase"; -"secrets_recovery_with_passphrase_information_default" = "Gib deine Wiederherstellungs-Passphrase ein, um auf deine verschlรผsselten Nachrichten und deine Cross-Signing-Identitรคt zuzugreifen. Mit der Cross-Signing-Identitรคt kannst du andere Sitzungen verifizieren."; +"secrets_recovery_with_passphrase_title" = "Wiederherstellungspassphrase"; +"secrets_recovery_with_passphrase_information_default" = "Gib deine Wiederherstellungspassphrase ein, um auf deine verschlรผsselten Nachrichten und deine Quersignatur-Identitรคt zuzugreifen. Mit der Quersignatur-Identitรคt kannst du andere Sitzungen verifizieren."; "secrets_recovery_with_passphrase_information_verify_device" = "Nutze deinen Wiederherstellungsphrase um dieses Gerรคt zu verifizieren."; "secrets_recovery_with_passphrase_passphrase_placeholder" = "Gib die Wiederherstellungspassphrase ein"; "secrets_recovery_with_passphrase_recover_action" = "Nutze Passphrase"; "secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Wenn du deine Wiederherstellungspassphrase nicht weiรŸt, kannst du "; -"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "nutze deinen Wiederherstellungsschlรผssel"; +"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "deinen Wiederherstellungsschlรผssel nutzen"; "secrets_recovery_with_passphrase_lost_passphrase_action_part3" = "."; "secrets_recovery_with_passphrase_invalid_passphrase_title" = "Auf sicheren Speicher kann nicht zugegriffen werden"; "secrets_recovery_with_passphrase_invalid_passphrase_message" = "Bitte stell sicher, dass du die korrekte Wiederherstellungspassphrase eingegeben hast."; "secrets_recovery_with_key_title" = "Wiederherstellungsschlรผssel"; -"secrets_recovery_with_key_information_default" = "Gib deinen Wiederherstellungs-Schlรผssel ein, um auf deine verschlรผsselten Nachrichten und deine Cross-Signing-Identitรคt zuzugreifen. Mit der Cross-Signing-Identitรคt kannst du andere Sitzungen verifizieren."; +"secrets_recovery_with_key_information_default" = "Gib deinen Wiederherstellungsschlรผssel ein, um auf deine verschlรผsselten Nachrichten und deine Quersignatur-Identitรคt zuzugreifen. Mit der Quersignatur-Identitรคt kannst du andere Sitzungen verifizieren."; "secrets_recovery_with_key_information_verify_device" = "Nutze deinen Wiederherstellungsschlรผssel um dieses Gerรคt zu verifizieren."; "secrets_recovery_with_key_recovery_key_placeholder" = "Wiederherstellungsschlรผssel eingeben"; "secrets_recovery_with_key_recover_action" = "Schlรผssel benutzen"; @@ -1130,26 +1130,26 @@ "secrets_setup_recovery_key_done_action" = "Erledigt"; "secrets_setup_recovery_key_storage_alert_title" = "Bewahre ihn sicher auf"; "key_verification_verify_qr_code_scan_other_code_success_message" = "Der QR-Code wurde erfolgreich validiert."; -"security_settings_secure_backup_setup" = "Konfiguration"; +"security_settings_secure_backup_setup" = "Einrichten"; "security_settings_crosssigning_complete_security" = "Vollstรคndige Sicherheit"; "secure_key_backup_setup_existing_backup_error_delete_it" = "Lรถsche es"; "device_verification_self_verify_alert_validate_action" = "รœberprรผfen"; "key_verification_self_verify_current_session_alert_validate_action" = "รœberprรผfen"; "key_verification_manually_verify_device_validate_action" = "รœberprรผfen"; -"secrets_recovery_with_passphrase_passphrase_title" = "Enter"; -"secrets_recovery_with_key_recovery_key_title" = "Enter"; -"secrets_setup_recovery_key_storage_alert_message" = "โœ“ Drucken ihn aus und bewahre ihn an einem sicheren Ort auf\nโœ“ Speicher ihn auf einem USB-Stick oder einem Backup-Laufwerk\nโœ“ Kopiere ihn in deinen persรถnlichen Cloud-Speicher"; +"secrets_recovery_with_passphrase_passphrase_title" = "Eingeben"; +"secrets_recovery_with_key_recovery_key_title" = "Eingeben"; +"secrets_setup_recovery_key_storage_alert_message" = "โœ“ Drucke ihn aus und bewahre ihn an einem sicheren Ort auf\nโœ“ Speichere ihn auf einem USB-Stick oder einem Sicherungslaufwerk\nโœ“ Kopiere ihn zu deinem persรถnlichen Speicher im Netz"; "secrets_setup_recovery_passphrase_title" = "Setze Sicherheitsphrase"; "secrets_setup_recovery_passphrase_information" = "Gib eine Sicherheitsphrase ein, welche nur du kennst und deine Daten auf dem Server geheim halten soll."; -"secrets_setup_recovery_passphrase_additional_information" = "Benutze dein Accountpasswort nicht mehrfach."; +"secrets_setup_recovery_passphrase_additional_information" = "Benutze dein Kontopasswort nicht mehrfach."; "secrets_setup_recovery_passphrase_validate_action" = "Fertig"; "secrets_setup_recovery_passphrase_confirm_information" = "Gib deine Sicherheitsphrase zur Bestรคtigung erneut ein."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Bestรคtigen"; "secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Passphrase bestรคtigen"; "cross_signing_setup_banner_title" = "Verschlรผsselung einrichten"; -"cross_signing_setup_banner_subtitle" = "Verifiziere deine anderen Gerรคte einfacher"; +"cross_signing_setup_banner_subtitle" = "Verifiziere deine weiteren Gerรคte bequemer"; "major_update_title" = "Riot ist jetzt Element"; -"major_update_information" = "Wir sind begeistert unsere Namensรคnderung mitteilen zu kรถnnen! Deine App ist auf dem neusten Stand und du bist mit deinem Account angemeldet."; +"major_update_information" = "Wir sind begeistert unsere Namensรคnderung mitteilen zu kรถnnen! Deine App ist auf dem neusten Stand und du bist mit deinem Konto angemeldet."; "major_update_learn_more_action" = "Mehr erfahren"; "major_update_done_action" = "Verstanden"; "pin_protection_choose_pin" = "Erstelle eine PIN fรผr mehr Sicherheit"; @@ -1163,7 +1163,7 @@ "pin_protection_mismatch_error_title" = "Die PINs stimmen nicht รผberein"; "pin_protection_mismatch_error_message" = "Bitte versuche es erneut"; "pin_protection_mismatch_too_many_times_error_message" = "Wenn du dich nicht an deine PIN erinnern kannst, drรผcke \"PIN vergessen\"."; -"pin_protection_settings_section_header_x" = "PIN & %@"; +"pin_protection_settings_section_header_x" = "PIN und %@"; "pin_protection_settings_section_footer" = "Um deine PIN zurรผckzusetzen, musst du dich erneut anmelden und eine neue erstellen."; "pin_protection_settings_enabled_forced" = "PIN aktiviert"; "pin_protection_settings_enable_pin" = "PIN aktivieren"; @@ -1194,16 +1194,16 @@ "create_room_title" = "Neuer Raum"; "create_room_section_header_name" = "Raumname"; "create_room_placeholder_name" = "Name"; -"create_room_section_header_topic" = "Raum-Thema (optional)"; +"create_room_section_header_topic" = "Raumthema (optional)"; "create_room_placeholder_topic" = "Thema"; -"create_room_section_header_encryption" = "Raum-Verschlรผsselung"; +"create_room_section_header_encryption" = "Raumverschlรผsselung"; "create_room_enable_encryption" = "Verschlรผsselung aktivieren"; "create_room_section_footer_encryption" = "Verschlรผsselung kann im Nachhinein nicht deaktiviert werden."; -"create_room_section_header_type" = "Raum-Typ"; +"create_room_section_header_type" = "Raumtyp"; "create_room_type_private" = "Privater Raum"; "create_room_type_public" = "ร–ffentlicher Raum"; "create_room_section_footer_type" = "Personen kรถnnen einen privaten Raum nur mit Einladung betreten."; -"create_room_show_in_directory" = "Zeige den Raum im Raum-Verzeichnis"; +"create_room_show_in_directory" = "Zeige den Raum im Raumverzeichnis"; "create_room_section_header_address" = "Raum-Adresse"; "create_room_placeholder_address" = "#testraum:matrix.org"; "room_info_list_room_encrypted" = "Nachrichten in diesem Raum sind Ende-zu-Ende verschlรผsselt"; @@ -1214,19 +1214,19 @@ "room_participants_filter_room_members_for_dm" = "Mitglieder filtern"; "room_participants_security_information_room_not_encrypted_for_dm" = "Die Nachrichten hier sind nicht Ende-zu-Ende verschlรผsselt."; "room_participants_leave_prompt_msg_for_dm" = "Bist du sicher, dass du die Konversation verlassen mรถchtest?"; -"room_participants_security_information_room_encrypted_for_dm" = "Nachrichten hier sind Ende-zu-Ende verschlรผsselt.\n\nDeine Nachrichten sind mit digitalen Schlรผsseln gesichert, nur du und der/die Empfรคnger!n haben die einzigen Schlรผssel, um jene zu entsperren."; +"room_participants_security_information_room_encrypted_for_dm" = "Nachrichten hier sind Ende-zu-Ende verschlรผsselt.\n\nDeine Nachrichten sind mit digitalen Schlรผsseln gesichert, nur du und der Empfรคnger haben die einzigen Schlรผssel, um jene zu entsperren."; "room_details_title_for_dm" = "Details"; "room_details_photo_for_dm" = "Bild"; "room_details_room_name_for_dm" = "Name"; "room_details_access_section_for_dm" = "Wer hat Zugriff hierauf?"; "room_details_access_section_anyone_apart_from_guest_for_dm" = "Alle, die den Link kennen (ausgenommen Gรคste)"; "room_details_access_section_anyone_for_dm" = "Alle, die den Link kennen (auch Gรคste)"; -"room_details_access_section_directory_toggle_for_dm" = "Im Raum-Verzeichnis auflisten"; +"room_details_access_section_directory_toggle_for_dm" = "Im Raumverzeichnis auflisten"; "room_details_no_local_addresses_for_dm" = "Keine lokalen Adressen vorhanden"; "room_details_advanced_room_id_for_dm" = "ID:"; "room_details_advanced_e2e_encryption_enabled_for_dm" = "Verschlรผsselung ist hier aktiviert"; "room_details_advanced_e2e_encryption_disabled_for_dm" = "Verschlรผsselung ist hier nicht aktiviert."; -"pin_protection_kick_user_alert_message" = "Zu viele Fehler. Du wurdest ausgeloggt"; +"pin_protection_kick_user_alert_message" = "Zu viele Fehler. Du wurdest abgemeldet"; // MARK: - Secrets reset @@ -1237,16 +1237,16 @@ "secrets_recovery_reset_action_part_1" = "Wiederherstellungsoptionen vergessen oder verloren? "; "less" = "Weniger"; -"secrets_reset_authentication_message" = "Gib dein Konto-Passwort ein, um zu bestรคtigen"; +"secrets_reset_authentication_message" = "Gib dein Kontopasswort ein, um zu bestรคtigen"; "secrets_reset_reset_action" = "Zurรผcksetzen"; -"secrets_reset_warning_message" = "Du wirst ohne Nachrichtenverlauf, Nachrichten, vertraute Gerรคte oder vertraute Benutzer neu-starten."; +"secrets_reset_warning_message" = "Du wirst ohne Nachrichtenverlauf, Nachrichten, vertraute Gerรคte oder vertraute Benutzer neustarten."; "secrets_reset_warning_title" = "Falls du alles zurรผcksetzt"; "secrets_reset_information" = "Tu dies nur, wenn du kein anderes Gerรคt hast, mit dem du dieses Gerรคt รผberprรผfen kannst."; // MARK: - Home "home_empty_view_title" = "Willkommen bei %@,\n%@"; -"secrets_setup_recovery_passphrase_summary_information" = "Erinnere dich an deine Sicherheitsphrase. Sie kann zum entschlรผsseln der Nachrichten & Daten verwendet werden."; +"secrets_setup_recovery_passphrase_summary_information" = "Erinnere dich an deine Sicherheitsphrase. Sie kann zum entschlรผsseln der Nachrichten und Daten verwendet werden."; "secrets_setup_recovery_passphrase_summary_title" = "Sichere deine Sicherheitsphrase"; "rooms_empty_view_title" = "Rรคume"; "people_empty_view_information" = "Sicher kommunizieren mit allen. Drรผcke + um Leute hinzuzufรผgen."; @@ -1269,9 +1269,67 @@ "social_login_button_title_sign_up" = "Registrieren mit %@"; "social_login_button_title_sign_in" = "Anmelden mit %@"; "social_login_button_title_continue" = "Weiter mit %@"; -"social_login_list_title_sign_up" = "Oder Registrieren mit"; -"social_login_list_title_sign_in" = "Oder Anmelden mit"; +"social_login_list_title_sign_up" = "Oder"; +"social_login_list_title_sign_in" = "Oder"; // Social login "social_login_list_title_continue" = "Weiter mit"; +"room_intro_cell_information_multiple_dm_sentence2" = "Nur ihr seid in diesem Gesprรคch, auรŸer ihr lรคdt jemand anderen ein."; +"room_intro_cell_information_dm_sentence2" = "Nur zwei von euch sind in diesem Gesprรคch. Keine anderer kann beitreten."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence1_part1" = "Dies ist der Beginn deiner Direktnachricht mit "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " damit Leute wissen worum es in diesem geht."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Thema hinzufรผgen"; +"room_intro_cell_information_room_with_topic_sentence2" = "Thema: %@"; +"room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_sentence1_part1" = "Dies ist der Beginn von "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Leute hinzufรผgen"; +"room_avatar_view_accessibility_hint" = "Raumavatar รคndern"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "Avatar"; +"call_transfer_error_message" = "Rufumleitung fehlgeschlagen"; +"call_transfer_error_title" = "Fehler"; +"call_transfer_contacts_all" = "Alle"; +"call_transfer_contacts_recent" = "Neulich"; +"call_transfer_dialpad" = "Wรคhltastatur"; +"call_transfer_users" = "Nutzer"; + +// MARK: - Call Transfer +"call_transfer_title" = "Umleiten"; + +// MARK: - Dial Pad +"dialpad_title" = "Wรคhltastatur"; +"call_actions_unhold" = "Fortsetzen"; +"event_formatter_call_back" = "Zurรผckrufen"; +"event_formatter_call_you_declined" = "Du lehntest diesen Anruf ab"; +"event_formatter_call_you_currently_in" = "Du bist aktuell in diesem Anruf"; +"event_formatter_call_has_ended" = "Dieser Anruf ist beendet"; +"event_formatter_call_video" = "Videoanruf"; +"event_formatter_call_voice" = "Sprachanruf"; +"settings_show_NSFW_public_rooms" = "ร–ffentliche Rรคume mit anstรถรŸigen Inhalte anzeigen"; +"room_open_dialpad" = "Wรคhltastatur"; +"room_place_voice_call" = "Sprachanruf"; +"room_unsent_messages_cancel_message" = "Bist du dir sicher alle nicht gesendete Nachrichten in diesem Raum zu lรถschen?"; +"room_unsent_messages_cancel_title" = "Lรถsche nicht gesendete Nachrichten"; +"callbar_return" = "Zurรผck"; +"callbar_only_multiple_paused" = "%@ pausierte Anrufe"; +"callbar_only_single_paused" = "Pausierter Anruf"; +"callbar_active_and_multiple_paused" = "1 aktiver Anruf (%@) ยท %@ pausierte Anrufe"; +"callbar_active_and_single_paused" = "1 aktiver Anruf (%1$s) ยท 1 pausierter Anruf"; + +// Call Bar +"callbar_only_single_active" = "Laufender Anruf (%@)"; +"room_event_action_delete_confirmation_message" = "Mรถchtest Du die nicht gesendete Nachricht wirklich lรถschen?"; +"room_event_action_delete_confirmation_title" = "Nicht gesendete Nachricht lรถschen"; +"room_details_integrations" = "Einbindungen"; +"room_details_search" = "Raum suchen"; +"room_multiple_typing_notification" = "%@ und andere"; +"room_accessibility_video_call" = "Videoanruf"; +"room_message_replying_to" = "%@ anworten"; +"room_message_editing" = "Bearbeitung"; diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 49354fd09..6b58da5c1 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -322,6 +322,8 @@ Tap the + to start adding people."; "room_message_placeholder" = "Send a message (unencrypted)โ€ฆ"; "room_message_reply_to_placeholder" = "Send a reply (unencrypted)โ€ฆ"; "room_message_unable_open_link_error_message" = "Unable to open the link."; +"room_message_editing" = "Editing"; +"room_message_replying_to" = "Replying to %@"; "room_do_not_have_permission_to_post" = "You do not have permission to post to this room"; "encrypted_room_message_placeholder" = "Send an encrypted messageโ€ฆ"; "encrypted_room_message_reply_to_placeholder" = "Send an encrypted replyโ€ฆ"; @@ -389,6 +391,7 @@ Tap the + to start adding people."; "room_accessibility_integrations" = "Integrations"; "room_accessibility_upload" = "Upload"; "room_accessibility_call" = "Call"; +"room_accessibility_video_call" = "Video Call"; "room_accessibility_hangup" = "Hang up"; "room_place_voice_call" = "Voice call"; "room_open_dialpad" = "Dial pad"; @@ -403,6 +406,8 @@ Tap the + to start adding people."; "external_link_confirmation_title" = "Double-check this link"; "external_link_confirmation_message" = "The link %@ is taking you to another site: %@\n\nAre you sure you want to continue?"; +"room_multiple_typing_notification" = "%@ and others"; + // Unknown devices "unknown_devices_alert_title" = "Room contains unknown sessions"; "unknown_devices_alert" = "This room contains unknown sessions which have not been verified.\nThis means there is no guarantee that the sessions belong to the users they claim to.\nWe recommend you go through the verification process for each session before continuing, but you can resend the message without verifying if you prefer."; @@ -660,7 +665,7 @@ Tap the + to start adding people."; "identity_server_settings_add" = "Add"; "identity_server_settings_change" = "Change"; -"identity_server_settings_disconnect_info" = "Disconnecting from your identity server will mean you wonโ€™t be discoverable by other users and be able to invite others by email or phone."; +"identity_server_settings_disconnect_info" = "Disconnecting from your identity server will mean you wonโ€™t be discoverable by other users and be able to invite others by email or phone."; "identity_server_settings_disconnect" = "Disconnect"; "identity_server_settings_alert_no_terms_title" = "Identity server has no terms of services"; @@ -684,6 +689,8 @@ Tap the + to start adding people."; "room_details_title_for_dm" = "Details"; "room_details_people" = "Members"; "room_details_files" = "Uploads"; +"room_details_search" = "Search room"; +"room_details_integrations" = "Integrations"; "room_details_settings" = "Settings"; "room_details_photo" = "Room Photo"; "room_details_photo_for_dm" = "Photo"; diff --git a/Riot/Assets/eo.lproj/Vector.strings b/Riot/Assets/eo.lproj/Vector.strings index 2a7d6d0fd..71c9a87a2 100644 --- a/Riot/Assets/eo.lproj/Vector.strings +++ b/Riot/Assets/eo.lproj/Vector.strings @@ -128,8 +128,8 @@ "room_conference_call_no_power" = "Vi bezonas permeson administri grupvokojn en ฤ‰i tiu ฤ‰ambro"; "room_ongoing_conference_call_close" = "Fermi"; "room_ongoing_conference_call" = "Daลญranta grupa voko. Aliฤi kiel %@ aลญ %@."; -"room_unsent_messages_unknown_devices_notification" = "Mesaฤoj ne sendiฤis pro ฤ‰eesto de nekonataj salutaฤตoj. ฤˆu %@ aลญ %@ nun?"; -"room_unsent_messages_notification" = "Mesaฤoj ne sendiฤis. ฤˆu %@ aลญ %@ nun?"; +"room_unsent_messages_unknown_devices_notification" = "Mesaฤoj ne sendiฤis pro ฤ‰eesto de nekonataj salutaฤตoj."; +"room_unsent_messages_notification" = "Mesaฤoj ne sendiฤis."; "room_offline_notification" = "Konekto al la servilo perdiฤis."; "room_accessiblity_scroll_to_bottom" = "Moviฤi ฤis planko"; "encrypted_room_message_placeholder" = "Sendi mesaฤon ฤ‰ifritanโ€ฆ"; @@ -305,7 +305,7 @@ "auth_untrusted_id_server" = "La identiga servilo ne estas fidata"; "auth_phone_is_required" = "Neniu identiga servilo estas agordita, do vi ne povas agordi telefonnumeron por laลญbezona rehavo de konto."; "auth_email_is_required" = "Neniu identiga servilo estas agordita, do vi ne povas agordi retpoลtadreson por laลญbezona rehavo de konto."; -"auth_phone_in_use" = "ฤˆi tiu telefonnumero jam estas uzata."; +"auth_phone_in_use" = "ฤˆi tiu telefonnumero jam estas uzata"; "auth_email_in_use" = "ฤˆi tiu retpoลtadreso jam estas uzata"; "auth_add_email_phone_message_2" = "Agordu retpoลtadreson por rehavo de konto. Uzu poste retpoลtadreson aลญ telefonon por esti laลญplaฤ‰e trovebla de personoj, kiuj vin konas."; "auth_add_phone_message_2" = "Agordu telefonon, por via (laลญplaฤ‰a) trovebleco de personoj, kiuj vin konas."; @@ -313,7 +313,7 @@ "joined" = "Aliฤita"; "device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Uzi rehavajn pasfrazon aลญ ลlosilon"; "device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Uzi rehavan ลlosilon"; -"device_verification_self_verify_wait_additional_information" = "ฤˆi tio funkcias por Element kaj aliaj klientoj kapablaj je delegaj subskriboj"; +"device_verification_self_verify_wait_additional_information" = "ฤˆi tio funkcias por Element kaj aliaj klientoj kapablaj je delegaj subskriboj."; "device_verification_self_verify_wait_information" = "Kontrolu ฤ‰i tiun saluton per unu el viaj aliaj salutaฤตoj, dononte al ฤi aliron al ฤ‰ifritaj mesaฤoj.\n\nUzu la plej freลan version de Element per viaj aliaj aparatoj:"; "device_verification_self_verify_wait_new_sign_in_title" = "Kontrolu ฤ‰i tiun saluton"; @@ -964,7 +964,7 @@ //"settings_join_leave_rooms" = "When people join or leave rooms"; //"settings_call_invitations" = "Call invitations"; -"settings_enable_callkit" = ""; +"settings_enable_callkit" = "Integraj vokoj"; "settings_ui_theme_picker_title" = "Elektu haลญton"; "settings_ui_theme_black" = "Nigra"; "settings_ui_theme_dark" = "Malluma"; @@ -1075,3 +1075,411 @@ "room_resource_limit_exceeded_message_contact_3" = " por ke vi daลญre uzu la servilon."; "room_resource_limit_exceeded_message_contact_2_link" = "kontaktu vian serviladministranton"; "room_resource_limit_exceeded_message_contact_1" = " Bonvole "; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence2" = "Sole la paro de vi ฤ‰eestas ฤ‰i tiu ฤ‰ambro, neniu alia povas eniri."; +"room_intro_cell_information_multiple_dm_sentence2" = "Sole vi ฤ‰eestas ฤ‰i tiun ฤ‰ambron, krom se oni invitas aliulon."; +"device_verification_security_advice_emoji" = "Komparu la unikajn bildosignojn, certigante, ke ili aperas samorde."; +"key_verification_user_title" = "Kontrolu ฤin"; +"key_verification_this_session_title" = "Kontrolu ฤ‰i tiun salutaฤตon"; +"key_verification_new_session_title" = "Kontrolu vian novan salutaฤตon"; + +// MARK: - Device Verification +"key_verification_other_session_title" = "Kontrolu salutaฤตon"; +"sign_out_key_backup_in_progress_alert_cancel_action" = "Mi atendos"; +"sign_out_key_backup_in_progress_alert_discard_key_backup_action" = "Mi ne volas miajn ฤ‰ifritajn mesaฤojn"; +"sign_out_key_backup_in_progress_alert_title" = "Savkopiado progresas. Se vi adiaลญos nun, vi perdos aliron al viaj ฤ‰ifritaj mesaฤoj."; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_backup_action" = "Savkopii"; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_sign_out_action" = "Adiaลญi"; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_message" = "Vi perdos aliron al viaj ฤ‰ifritaj mesaฤoj, se vi ne savkopios viajn ลlosilojn antaลญ adiaลญo."; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_title" = "Vi perdos viajn ฤ‰ifritajn mesaฤojn"; +"sign_out_non_existing_key_backup_alert_discard_key_backup_action" = "Mi ne volas miajn ฤ‰ifritajn mesaฤojn"; +"sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "Ekuzi sekuran savkopiadon"; +"sign_out_non_existing_key_backup_alert_title" = "Vi perdos aliron al viaj ฤ‰ifritaj mesaฤoj se vi nun adiaลญos"; +"sign_out_existing_key_backup_alert_sign_out_action" = "Adiaลญi"; + +// MARK: Sign out warning + +"sign_out_existing_key_backup_alert_title" = "ฤˆu vi certe volas adiaลญi?"; +"key_backup_recover_done_action" = "Finite"; + +// Success + +"key_backup_recover_success_info" = "Savkopio rehaviฤis!"; +"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "ฤˆu vi perdis vian rehavan ลlosilon? Vi povas agordi novan per la Agordoj."; +"key_backup_recover_from_recovery_key_recover_action" = "Malลlosi historion"; +"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Enigu rehavan ลlosilon"; +"key_backup_recover_from_recovery_key_recovery_key_title" = "Enigu"; + +// Recover from recovery key + +"key_backup_recover_from_recovery_key_info" = "Uzu vian rehavan ลlosilon por malลlosi vian historion de sekuraj mesaฤoj"; +"large_badge_value_k_format" = "%.1fK"; +"image_picker_action_library" = "Elekti el vidaลญdaฤตujo"; +"media_picker_library" = "Vidaลญdaฤตujo"; +"room_details_advanced_section" = "Altnivelaj"; +"room_details_banned_users_section" = "Forbaritaj uzantoj"; +"room_details_flair_invalid_id_prompt_msg" = "%@ ne estas valida identigilo por komunumo"; +"room_details_flair_invalid_id_prompt_title" = "Nevalida formo"; +"room_details_new_flair_placeholder" = "Aldoni novan identigilon de komunumo (ekz. +io%@)"; +"room_details_flair_section" = "Montri insignon por komunumoj"; +"room_details_addresses_disable_main_address_prompt_msg" = "Vi havos neniun specifitan ฤ‰efan adreson. La implicita ฤ‰efadreso por ฤ‰i tiu ฤ‰ambro elektiฤos hazarde"; +"room_details_access_section_for_dm" = "Kiu rajtas aliri ฤ‰i tion?"; +"room_details_access_section" = "Kiu rajtas aliri ฤ‰i tiun ฤ‰ambron?"; +"room_details_direct_chat" = "Rekta babilo"; +"room_details_mute_notifs" = "Silentigi sciigojn"; +"room_details_low_priority_tag" = "Malalta prioritato"; +"room_details_favourite_tag" = "Elstarigita"; +"room_details_topic" = "Temo"; +"room_details_room_name_for_dm" = "Nomo"; +"room_details_room_name" = "Nomo de ฤ‰ambro"; +"room_details_photo_for_dm" = "Bildo"; +"room_details_photo" = "Bildo de ฤ‰ambro"; +"room_details_settings" = "Agordoj"; +"room_details_files" = "Alลutoj"; +"room_details_people" = "ฤˆambranoj"; +"room_details_title_for_dm" = "Detaloj"; + + +// Room Details +"room_details_title" = "Detaloj pri ฤ‰ambro"; +"identity_server_settings_alert_error_invalid_identity_server" = "%@ ne estas valida identiga servilo."; +"identity_server_settings_alert_error_terms_not_accepted" = "Vi devas akcepti la uzokondiฤ‰ojn de %@, por uzi ฤin kiel identiga servilo."; +"identity_server_settings_alert_disconnect" = "ฤˆu malkonektu de la identiga servilo %@?"; +"identity_server_settings_alert_disconnect_title" = "Malkonektu identigan servilon"; +"identity_server_settings_alert_change" = "ฤˆu malkonektu de identiga servilo %1$@ kaj anstataลญe konektu al %@$A?"; +"identity_server_settings_alert_change_title" = "ลœanฤu identigan servilon"; +"identity_server_settings_alert_no_terms" = "Via elektita identiga servilo ne havas uzokondiฤ‰ojn. Daลญrigu nur se vi fidas la posedanton de tiu servilo."; +"identity_server_settings_alert_no_terms_title" = "Identiga servilo ne havas uzokondiฤ‰ojn"; +"identity_server_settings_disconnect" = "Malkonekti"; +"identity_server_settings_disconnect_info" = "Malkonektinte de via identiga servilo, vi ne troviฤus al aliaj uzantoj per, nek povos inviti uzantojn per, retpoลtadresoj aลญ telefonnumeroj."; +"identity_server_settings_change" = "ลœanฤi"; +"identity_server_settings_add" = "Aldoni"; +"identity_server_settings_place_holder" = "Enigu identigan servilon"; +"identity_server_settings_no_is_description" = "Vi nun ne uzas identigan servilon. Por troviฤi de kaj trovi jamajn kontaktojn, aldonu tian servilon ฤ‰i-supre."; +"identity_server_settings_description" = "Vi uzas %@ por trovi kaj troviฤi de jamaj kontaktoj, kiujn vi konas."; + +// Identity server settings +"identity_server_settings_title" = "Identiga Servilo"; + +// AuthenticatedSessionViewControllerFactory +"authenticated_session_flow_not_supported" = "ฤˆi tiu programo ne subtenas la identigan metodon de via hejmservilo."; +"manage_session_sign_out" = "Adiaลญi al ฤ‰i tiu salutaฤตo"; +"manage_session_not_trusted" = "Nefidataj"; +"manage_session_trusted" = "Fidataj de vi"; +"manage_session_name" = "Nomo de salutaฤตo"; +"manage_session_info" = "INFORMOJ DE SALUTAฤดO"; + +// Manage session +"manage_session_title" = "Administru salutaฤตon"; +"security_settings_user_password_description" = "Konfirmi vian identon per enigo de via pasvorto"; +"security_settings_coming_soon" = "Bedaลญron. ฤˆi tiu funkcio ne jam estas subtenata por Element iOS. Bonvolu uzi alian Matrix klienton por agordi ฤin. Element iOS sekvos ฤin."; +"security_settings_complete_security_alert_message" = "Vi kompletigu sekurigon je ฤ‰i tiu salutaฤตo unue."; +"security_settings_complete_security_alert_title" = "Kompletigi sekurigon"; +"security_settings_blacklist_unverified_devices_description" = "Kontroli ฤ‰iujn salutaฤตojn de uzanto, por marki ilin fidata kaj sendi mesaฤojn al ฤi."; +"security_settings_blacklist_unverified_devices" = "Neniam sendi mesaฤojn al nefidatajn salutaฤตojn"; +"security_settings_advanced" = "ALTNIVELAJ"; +"security_settings_export_keys_manually" = "Elporti ลlosilojn permane"; +"security_settings_cryptography" = "KRIPTOGRAFIO"; +"security_settings_crosssigning_complete_security" = "Kompletigi sekurigon"; +"security_settings_crosssigning_reset" = "Restarigi delegan subskribadon"; +"security_settings_crosssigning_bootstrap" = "Praลargi delegan subskribadon"; +"security_settings_crosssigning_info_ok" = "Delega subskribado estas ลaltita."; +"security_settings_crosssigning_info_trusted" = "Delega subskribado estas ลaltita. Vi povas fidi aliajn uzantojn kaj viajn salutaฤตojn per delegaj subskriboj, sed vi ne povas delege subskribi de ฤ‰i tiu salutaฤตo, ฤ‰ar mankas al ฤi ลlosiloj privataj por delegaj subskriboj."; +"security_settings_crosssigning_info_exists" = "Via konto havas identon de delega subskribado, sed ne jam estas fidata de ฤ‰i tiu salutaฤตo. Kompletigu la sekurigon de ฤ‰i tiu salutaฤตo."; +"security_settings_crosssigning_info_not_bootstrapped" = "Delega subskribado ne jam agordiฤis."; +"security_settings_crosssigning" = "DELEGAJ SUBSKRIBOJ"; +"security_settings_backup" = "SAVKOPIADO DE MESAฤœOJ"; +"security_settings_secure_backup_delete" = "Forigi"; +"security_settings_secure_backup_synchronise" = "Speguli"; +"security_settings_secure_backup_setup" = "Agordi"; +"security_settings_secure_backup_description" = "Malhelpu perdon de aliro al ฤ‰ifritaj mesaฤoj kaj datumoj per savkopiado de ฤ‰ifraj ลlosiloj al via servilo."; +"security_settings_secure_backup" = "SAVKOPIADO"; +"security_settings_crypto_sessions_description_2" = "Se vi ne konas salutaฤตojn, ลanฤu vian pasvorton kaj restarigu savkopiadon."; +"security_settings_crypto_sessions_loading" = "Enlegante salutaฤตojnโ€ฆ"; +"security_settings_crypto_sessions" = "MIAJ SALUTAฤดOJ"; + +// Security settings +"security_settings_title" = "Sekureco"; +"settings_show_NSFW_public_rooms" = "Montru publikajn ฤ‰ambrojn konsternajn"; +"settings_identity_server_no_is_description" = "Vi uzas neniun identigan servilon. Por trovi kaj troviฤi de jamaj kontaktoj, kiujn vi konas, aldonu servilon supre."; +"settings_identity_server_no_is" = "Neniu identiga servilo estas agordita"; +"settings_identity_server_description" = "Uzante la identigan servilon supre agorditan, vi povas trovi kaj troviฤi de jamaj kontaktoj, kiujn vi konas."; +"settings_discovery_three_pid_details_enter_sms_code_action" = "Enigu SMS aktivigan kodon"; +"settings_discovery_three_pid_details_cancel_email_validation_action" = "Nuligi retpoลtan kontrolon"; +"settings_discovery_three_pid_details_revoke_action" = "Senvalidigi"; +"settings_discovery_three_pid_details_share_action" = "Kunhavigi"; +"settings_discovery_three_pid_details_information_phone_number" = "Agordu ฤ‰i tiun telefonnumeron, per kiu aliaj uzantoj povas trovi kaj inviti vin al ฤ‰ambroj. Aldonu aลญ forigu telefonnumerojn ฤ‰e Kontoj."; +"settings_discovery_three_pid_details_title_phone_number" = "Agordu telefonnumeron"; +"settings_discovery_three_pid_details_information_email" = "Agordu ฤ‰i tiun retpoลtadreson, per kiu aliaj uzantoj povas trovi kaj inviti vin al ฤ‰ambroj. Aldonu aลญ forigu retpoลtadresojn ฤ‰e Kontoj."; +"settings_discovery_three_pid_details_title_email" = "Agordu retpoลtadreson"; +"settings_discovery_error_message" = "Eraris iel. Bonvolu reprovi."; +"settings_discovery_three_pids_management_information_part3" = "."; +"settings_discovery_three_pids_management_information_part2" = "Agordoj de uzanto"; +"settings_discovery_three_pids_management_information_part1" = "Agordu la retpoลtadresojn kaj telefonnumerojn per kiuj aliaj uzantoj povas trovi kaj inviti vin al ฤ‰ambroj. Aldonu aลญ forigu retpoลtadresojn aลญ telefonnumerojn de ฤ‰i tiu listo en "; +"settings_discovery_terms_not_signed" = "Konsentu la uzokondiฤ‰ojn de la identiga servilo (%@) por trovebligi vin per retpoลtadreso aลญ telefonnumero."; +"settings_discovery_no_identity_server" = "Vi nun ne uzas identigan servilon. Por trovi kaj troviฤi de jamaj kontaktoj, kiujn vi konas, aldonu servilon."; +"settings_devices_description" = "Prezenta nomo de salutaฤตo videblas al personoj kunbabilataj"; +"settings_key_backup_delete_confirmation_prompt_msg" = "ฤˆu vi certas? Vi perdos aliron al viaj ฤ‰ifritaj mesaฤoj, se vi ne savkopios viajn ลlosilojn."; +"settings_key_backup_delete_confirmation_prompt_title" = "Forigi savkopion"; +"settings_key_backup_button_connect" = "Konekti ฤ‰i tiu salutaฤตo savkopionte"; +"settings_key_backup_button_delete" = "Forigi savkopion"; +"settings_key_backup_button_restore" = "Rehavigi per savkopio"; +"settings_key_backup_button_create" = "Komenci savkopiojn"; +"settings_key_backup_info_trust_signature_invalid_device_unverified" = "Savkopio havas nevalidan subskribon de %@"; +"settings_key_backup_info_trust_signature_invalid_device_verified" = "Savkopio havas nevalidan subskribon de %@"; +"settings_key_backup_info_trust_signature_valid_device_unverified" = "Savkopio havas subskribon de %@"; +"settings_key_backup_info_trust_signature_valid_device_verified" = "Savkopio havas validan subskribon de %@"; +"settings_key_backup_info_trust_signature_valid" = "Savkopio havas validan subskribon de ฤ‰i salutaฤตo"; +"settings_key_backup_info_trust_signature_unknown" = "Savkopio havas subskribon de salutaฤตo kun la identigilo: %@"; +"settings_key_backup_info_progress_done" = "ฤˆiuj ลlosiloj estas savkopiitaj"; +"settings_key_backup_info_progress" = "Savkopiante %@ ลlosilojnโ€ฆ"; +"settings_key_backup_info_not_valid" = "ฤˆi tiu salutaฤตo ne savkopias viajn ลlosilojn, sed vi havas restantan kopion kiun vi povas alreveni kaj uzi ekde nun."; +"settings_key_backup_info_valid" = "ฤˆi tiu salutaฤตo savkopias viajn ลlosilojn."; +"settings_key_backup_info_algorithm" = "Algoritmo: %@"; +"settings_key_backup_info_version" = "Savkopia Versio: %@"; +"settings_key_backup_info_signout_warning" = "Konektu ฤ‰i tiun salutaฤตon savkopie antaลญ ol vi adiaลญas, por eviti la perdiฤon de ลlosiloj nurlokaj."; +"settings_key_backup_info_none" = "Viaj ลlosiloj estas nesavkopiataj por ฤ‰i tiu salutaฤตo."; +"settings_key_backup_info_checking" = "Kontrolanteโ€ฆ"; +"settings_key_backup_info" = "Mesaฤoj en ฤ‰ifritaj ฤ‰ambroj estas sekurigitaj per tutvoja ฤ‰ifrado. Nur vi kaj la adresato(j) havas la ลlosilojn por malฤ‰ifri tiujn ฤ‰i mesaฤojn."; +"settings_deactivate_my_account" = "Malลalti mian konton"; +"settings_crypto_blacklist_unverified_devices" = "ฤˆifri nur al kontrolitaj salutaฤตoj"; +"settings_crypto_export" = "Elporti ลlosilojn"; +"settings_crypto_device_key" = "\nลœlosilo de salutaฤตo:\n"; +"settings_crypto_device_id" = "\nIdentigilo de salutaฤตo: "; +"settings_crypto_device_name" = "Nomo de salutaฤตo: "; +"settings_add_3pid_invalid_password_message" = "Nevalida pasvorto"; +"settings_add_3pid_password_message" = "Por daลญrigi, bonvolu enigi vian pasvorton"; +"settings_add_3pid_password_title_msidsn" = "Aldoni telefonnumeron"; +"settings_add_3pid_password_title_email" = "Aldoni retpoลtadreson"; +"settings_password_updated" = "Via pasvorto ฤisdatiฤis"; +"settings_fail_to_update_password" = "Eraris ฤisdatigante pasvorton"; +"settings_confirm_password" = "Konfirmu pasvorton"; +"settings_global_settings_info" = "ฤˆieaj sciigoj uzeblas per via retkliento %@"; +"settings_fail_to_update_profile" = "Eraris ฤisdatigante profilon"; +"room_open_dialpad" = "Ciferilo"; +"room_place_voice_call" = "Voฤ‰voko"; +"room_event_action_delete_confirmation_message" = "ฤˆu vi certas, ke vi volas forigi ฤ‰i tiun nesenditan mesaฤon?"; +"room_event_action_delete_confirmation_title" = "Forigi nesenditan mesaฤon"; +"room_ongoing_conference_call_with_close" = "Daลญranta grupa voko. Aliฤi kiel %@ aลญ %@. %@."; +"room_unsent_messages_cancel_message" = "ฤˆu vi certas, ke vi volas forigi ฤ‰iujn nesenditajn mesaฤojn en ฤ‰i tiu ฤ‰ambro?"; +"room_unsent_messages_cancel_title" = "Forigi nesenditajn mesaฤojn"; +"room_member_power_level_short_moderator" = "Reg"; +"room_participants_security_loading" = "Enleganteโ€ฆ"; +"room_participants_action_security_status_loading" = "Enleganteโ€ฆ"; +"room_participants_filter_room_members_for_dm" = "Filtri ฤ‰ambranojn"; +"room_participants_add_participant" = "Aldoni partoprenanton"; +"contacts_user_directory_offline_section" = "KATALOGO DE UZANTOJ (nefunkcia)"; +"contacts_address_book_permission_denied" = "Vi ne permesis al Element aliri viajn lokajn kontaktojn"; +"rooms_empty_view_information" = "ฤˆambroj taลญgas por ajna grupbabilo, privata aลญ publika. Premu la + por trovi ekzistantaj ฤ‰ambroj, aลญ fari novajn."; +"rooms_empty_view_title" = "ฤˆambroj"; +"people_empty_view_information" = "Sekure babili kun iu ajn.Premu la + por inviti personojn."; +"people_empty_view_title" = "Homoj"; +"social_login_button_title_sign_up" = "Registriฤi per %@"; +"social_login_button_title_sign_in" = "Saluti per %@"; +"social_login_button_title_continue" = "Saluti per %@"; +"social_login_list_title_sign_up" = "Aลญ registriฤi per"; +"social_login_list_title_sign_in" = "Aลญ saluti per"; + +// Social login + +"social_login_list_title_continue" = "Saluti per"; +"callbar_return" = "Reveni"; +"callbar_only_multiple_paused" = "%@ paลญzigitaj vokoj"; +"callbar_only_single_paused" = "Paลญzigita voko"; +"callbar_active_and_multiple_paused" = "1 aktiva voko (%@) ยท %@ paลญzigitaj vokoj"; +"callbar_active_and_single_paused" = "1 aktiva voko (%@) ยท 1 paลญzigita voko"; + +// Call Bar +"callbar_only_single_active" = "Aktiva voko (%@)"; +"less" = "Malpli"; +"more" = "Pli"; +"switch" = "Baskuli"; +"store_promotional_text" = "Privatecgardanta babila kaj kunlabora programo, uzanta malferman reton. ฤœi estas malcentra, do vi estas la stiranto. Neniu datumamasanto nek kaลenirejo."; +"room_intro_cell_information_room_with_topic_sentence2" = "Temo: %@"; +"room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_sentence1_part1" = "ฤˆi tio estas la komenco de "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Aldoni personojn"; +"room_avatar_view_accessibility_hint" = "ลœanฤi bildon de ฤ‰ambro"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "bildo de ฤ‰ambro"; +"invite_friends_share_text" = "Saluton! Parolu kun mi per %@: %@"; + +// MARK: - Invite friends + +"invite_friends_action" = "Inviti amikojn al %@"; +"favourites_empty_view_information" = "Vi povas elstarigi kelkmaniere โ€“ plej rapide estas simple premi kaj teni. Tuลetu la stelon por aperigi la elstarigaton ฤ‰i tie."; + +// MARK: - Favourites + +"favourites_empty_view_title" = "Elstarigitaj ฤ‰ambroj kaj personoj"; +"home_empty_view_information" = "La ฤ‰ionhava sekura babililo por skipoj, amikoj, kaj organizaฤตoj. Tuลetu la ฤ‰i-suban butonon + por aldoni personojn kaj ฤ‰ambrojn."; + +// MARK: - Home + +"home_empty_view_title" = "bonvenu al %@,\n%@"; +"call_transfer_error_title" = "Eraro"; +"call_transfer_contacts_all" = "ฤˆiuj"; +"call_transfer_contacts_recent" = "Freลdataj"; +"call_transfer_users" = "Uzantoj"; +"pin_protection_settings_change_pin" = "ลœanฤi personan identigan numeron"; +"pin_protection_confirm_pin_to_change" = "Konfirmu personan identigan numeron por ฤin ลanฤi"; +"key_verification_bootstrap_not_setup_message" = "Vi devas praลargi delegan subskribadon unue."; +"error_not_supported_on_mobile" = "Vi ne povas tion fari per %@ je portebla aparato."; + +// Unverified sessions + +"key_verification_self_verify_unverified_sessions_alert_title" = "Kontrolu, kie vi salutis"; +"device_verification_incoming_description_1" = "Kontrolu ฤ‰i tiun salutaฤตon por marki ฤin fidata. Fidi salutaฤตojn de kunuloj helpos vin resti pli trankvila kiam vi sendas tutvoje ฤ‰ifritajn mesaฤojn."; + +// Mark: Incoming +"device_verification_incoming_title" = "Envena kontrolpeto"; +"device_verification_error_cannot_load_device" = "Ne povas enlegi informojn pri salutaฤตo."; +"device_verification_cancelled_by_me" = "La kontrolo nuliฤis. Kialo: %@"; +"device_verification_cancelled" = "La aliulo nuligis la kontrolon."; +"device_verification_security_advice_number" = "Komparu la numerojn, certigante, ke ili aperas samorde."; +"key_backup_recover_from_passphrase_lost_passphrase_action_part3" = "."; +"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "uzi vian rehavan ลlosilon"; +"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "ฤˆu vi ne konas vian rehavan pasfrazon? Vi povas "; +"key_backup_recover_from_passphrase_recover_action" = "Malลlosi historion"; +"key_backup_recover_from_passphrase_passphrase_placeholder" = "Enigu pasfrazon"; +"key_backup_recover_from_passphrase_passphrase_title" = "Enigu"; + +// Recover from passphrase + +"key_backup_recover_from_passphrase_info" = "Uzu vian rehavan pasfrazon por malลlosi vian historion de sekuraj mesaฤoj"; + +// Recover from private key +"key_backup_recover_from_private_key_info" = "Rehavante savkopionโ€ฆ"; +"key_backup_recover_invalid_recovery_key" = "Ne povis malฤ‰ifri savkopion per tiu ฤ‰i ลlosilo: bonvolu kontroli, ke vi enigis la ฤustan rehavan ลlosilon."; +"key_backup_recover_invalid_recovery_key_title" = "Malakordo de rehava ลlosilo"; +"key_backup_recover_invalid_passphrase" = "Ne povis malฤ‰ifri savkopion per ฤ‰i tiu pasfrazo: bonvolu kontroli, ฤ‰u vi ฤuste enigis la rehavan pasfrazon."; +"key_backup_recover_invalid_passphrase_title" = "Malฤusta rehava pasfrazo"; + +// MARK: Key backup recover + +"key_backup_recover_title" = "Sekuraj mesaฤoj"; +"key_backup_setup_success_from_recovery_key_made_copy_action" = "Mi faris kopion"; +"key_backup_setup_success_from_recovery_key_make_copy_action" = "Fari kopion"; +"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Rehava ลlosilo"; + +// Success from recovery key +"key_backup_setup_success_from_recovery_key_info" = "Viaj ลlosiloj estas savkopiataj.\n\nFaru kopion de tiu ฤ‰i rehava ลlosilo kaj bone ฤin sekurigu."; +"key_backup_setup_success_from_passphrase_done_action" = "Finite"; +"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Konservi rehavan ลlosilon"; + +// Success from passphrase +"key_backup_setup_success_from_passphrase_info" = "Viaj ลlosiloj estas savkopiataj.\n\nVia rehava ลlosilo estas formo de asekuro โ€“ vi povas ฤin uzi por rehavi aliron al viaj ฤ‰ifritaj mesaฤoj, se vi forgesos vian pasfrazon.\n\nTenu vian rehavan ลlosilon en loko tre sekura, kiel ekzemple administrilo de pasvortoj (aลญ sekurkesto)."; + +// Success + +"key_backup_setup_success_title" = "Sukceso!"; +"key_backup_setup_passphrase_setup_recovery_key_action" = "(Altnivele) Agordi per rehava ลlosilo"; +"key_backup_setup_passphrase_setup_recovery_key_info" = "Aลญ sekurigu vian savkopion per rehava ลlosilo, konservante ฤin en sekura loko."; +"key_backup_setup_passphrase_set_passphrase_action" = "Agordi pasfrazon"; +"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Pasfrazoj ne akordas"; +"key_backup_setup_passphrase_confirm_passphrase_valid" = "Bonege!"; +"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Konfirmu pasfrazon"; +"key_backup_setup_passphrase_confirm_passphrase_title" = "Konfirmi"; +"key_backup_setup_passphrase_passphrase_invalid" = "Provu aldoni vorton"; +"key_backup_setup_passphrase_passphrase_title" = "Enigi"; + +// Passphrase + +"key_backup_setup_passphrase_title" = "Sekurigu vian savkopion per pasfrazo"; +"key_backup_setup_intro_manual_export_info" = "(Altnivele)"; +"key_backup_setup_intro_setup_connect_action_with_existing_backup" = "Konektu ฤ‰i tiun aparaton al savkopio de ลlosiloj"; +"key_backup_setup_intro_setup_action_without_existing_backup" = "Ekuzu savkopiadon de ลlosiloj"; + + +// MARK: Key backup setup + +"key_backup_setup_title" = "Savkopiado de ลlosiloj"; + +// MARK: Secure backup setup + +// Intro + +"secure_key_backup_setup_intro_title" = "Sekura savkopiado"; +"room_widget_permission_information_title" = "Uzado povas havigi datumojn al %@:\n"; +"room_widget_permission_webview_information_title" = "Uzado povas meti kuketojn kaj havigi datumojn al %@:\n"; +"bug_report_background_mode" = "Daลญrigi fone"; +"e2e_key_backup_wrong_version" = "Nova savkopio de ลlosiloj de sekuraj mesaฤoj troviฤis.\n\nSe vi ne faris ฤin, agordu novan pasfrazon per la Agordoj."; + +// Key backup wrong version +"e2e_key_backup_wrong_version_title" = "Nova savkopio de ลlosiloj"; +"call_actions_unhold" = "Daลญrigi"; +"photo_library_access_not_granted" = "%@ ne havas permeson aliri la fotujon; bonvolu ลanฤi agordojn de privateco"; +"event_formatter_call_back" = "Revoki"; +"event_formatter_call_you_declined" = "Vi rifuzis ฤ‰i tiun vokon"; +"event_formatter_call_you_currently_in" = "Vi nun partoprenas ฤ‰i tiun vokon"; +"event_formatter_call_has_ended" = "ฤˆi tiu voko finiฤis"; +"event_formatter_call_video" = "Vidvoko"; +"event_formatter_call_voice" = "Voฤ‰voko"; + +// Media picker +"media_picker_title" = "Vidaลญdaฤตoj"; +"room_details_set_main_address" = "Agordi kiel ฤ‰efadreson"; +"room_details_save_changes_prompt" = "ฤˆu vi volas konservi ลanฤojn?"; +"room_details_fail_to_enable_encryption" = "Malsukcesis ลalti ฤ‰ifradon en ฤ‰i tiu ฤ‰ambro"; +"room_details_fail_to_update_room_direct" = "Malsukcesis ฤisdatigi la rektan markon de ฤ‰i tiu ฤ‰ambro"; +"room_details_fail_to_update_room_communities" = "Malsukcesis ฤisdatigi la ritalajn komunumojn"; +"room_details_fail_to_update_room_canonical_alias" = "Malsukcesis ฤisdatigi la ฤ‰efadreson"; +"room_details_fail_to_remove_room_aliases" = "Malsukcesis forigi la adresojn de ฤ‰ambro"; +"room_details_fail_to_add_room_aliases" = "Malsukcesis aldoni novajn adresojn de ฤ‰ambro"; +"room_details_fail_to_update_history_visibility" = "Malsukcesis ฤisdatigi videblecon de la historio"; +"room_details_fail_to_update_room_directory_visibility" = "Malsukcesis ฤisdatigi videblecon en la katalogo de ฤ‰ambroj"; +"room_details_fail_to_update_room_join_rule" = "Malsukcesis ฤisdatigi la regulon pri aliฤoj"; +"room_details_fail_to_update_room_guest_access" = "Malsukcesis ฤisdatigi aliron de gastoj al la ฤ‰ambro"; +"room_details_fail_to_update_topic" = "Malsukcesis ฤisdatigi la temon"; +"room_details_fail_to_update_room_name" = "Malsukcesis ฤisdatigi la nomon de ฤ‰ambro"; +"room_details_fail_to_update_avatar" = "Malsukcesis ฤisdatigi la bildon de ฤ‰ambro"; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "ฤˆifri nur por kontrolitaj salutaฤตoj"; +"room_details_advanced_e2e_encryption_disabled_for_dm" = "ฤˆifrado ne estas ลaltita ฤ‰i tie."; +"room_details_advanced_e2e_encryption_disabled" = "ฤˆifrado ne estas ลaltita en ฤ‰i tiu ฤ‰ambro."; +"room_details_advanced_e2e_encryption_enabled_for_dm" = "ฤˆifrado estas ลaltita ฤ‰i tie"; +"room_details_advanced_e2e_encryption_enabled" = "ฤˆifrado estas ลaltita en ฤ‰i tiu ฤ‰ambro"; +"room_details_advanced_enable_e2e_encryption" = "ลœalti ฤ‰ifradon (averto: ne eblas malลalti!)"; +"room_details_advanced_room_id_for_dm" = "Identigilo:"; +"room_details_advanced_room_id" = "Identigilo de ฤ‰ambro:"; +"identity_server_settings_alert_disconnect_still_sharing_3pid" = "Vi ankoraลญ kunhavigas personajn informojn per la identiga servilo %@.\n\nNi rekomendas, ke vi forigu viajn retpoลtadresojn kaj telefonnumerojn de la identiga servilo, antaลญ malkonekto."; +"identity_server_settings_alert_disconnect_still_sharing_3pid_button" = "Malkonekti malgraลญe"; +"identity_server_settings_alert_disconnect_button" = "Malkonekti"; +"room_details_addresses_disable_main_address_prompt_title" = "Averto je la ฤ‰efadreso"; +"room_details_addresses_invalid_address_prompt_msg" = "%@ ne estas valida formo por kromnomo"; +"room_details_addresses_invalid_address_prompt_title" = "Nevalido formo de kromnomo"; +"room_details_new_address_placeholder" = "Aldoni novan adreson (ekz. #io%@)"; +"room_details_new_address" = "Aldoni novan adreson"; +"room_details_no_local_addresses_for_dm" = "ฤˆi tio ne havas lokajn adresojn"; +"room_details_no_local_addresses" = "ฤˆi tiu ฤ‰ambro ne havas lokajn adresojn"; +"room_details_addresses_section" = "Adresoj"; +"room_details_history_section_prompt_msg" = "ลœanฤoj al legebleco de historio nur aplikiฤos al venontaj mesaฤoj en ฤ‰i tiu ฤ‰ambro. La videbleco de jama historio restos senลanฤe."; +"room_details_history_section_prompt_title" = "Averto de privateco"; +"room_details_history_section_members_only_since_joined" = "Nur ฤ‰ambranoj (ekde sia aliฤo)"; +"room_details_history_section_members_only_since_invited" = "Nur ฤ‰ambranoj (ekde sia invitiฤo)"; +"room_details_history_section_members_only" = "Nur ฤ‰ambranoj (ekde ฤ‰i tiu elekto)"; +"room_details_history_section_anyone" = "ฤˆiu ajn"; +"room_details_history_section" = "Kiu rajtas legi historion?"; +"room_details_access_section_directory_toggle_for_dm" = "Listigi en katalogo de ฤ‰ambroj"; +"room_details_access_section_directory_toggle" = "Listigi ฤ‰i tiun ฤ‰ambron en la katalogo de ฤ‰ambroj"; +"room_details_access_section_no_address_warning" = "Por ligi al ฤ‰ambro, ฤi bezonas adreson"; +"room_details_access_section_anyone_for_dm" = "ฤˆiu, kiu konas la ligilon, inkluzive gastojn"; +"room_details_access_section_anyone" = "ฤˆiu, kiu konas la ligilon de la ฤ‰ambro, inkluzive gastojn"; +"room_details_access_section_anyone_apart_from_guest_for_dm" = "ฤˆiu, kiu konas la ligilon, krom gastoj"; +"room_details_access_section_anyone_apart_from_guest" = "ฤˆiu, kiu konas la ligilon de la ฤ‰ambro, krom gastoj"; +"room_details_access_section_invited_only" = "Nur personoj, kiuj invitiฤis"; +"store_full_description" = "Element estas nova speco de mesaฤilo kaj kunlabora aplikaฤตo, kiu:\n\n1. Stirigas vin por konservi vian privatecon\n2. Lasas vin komuniki kun ฤ‰iu en la reto de Matrix, kaj eฤ‰ ekstere, per kuniฤo kun aliaj aplikaฤตoj, kiel ekzemple Slack\n3. Protektas vin de reklamoj, datumkolektado, kaลenirejoj, kaj muritaj ฤardenoj\n4. Sekurigas vin per tutvoja ฤ‰ifrado, kun delegaj subskriboj por kontroli aliulojn\n\nElement tute malsamas de aliaj mesaฤiloj kaj kunlaboriloj, ฤ‰ar ฤi estas federa kaj malfermitkoda.\n\nElement lasas vin gastigi vin mem โ€“ aลญ elekti alian gastiganton โ€“ por ke vi havu privatecon, regon kaj kontrolon de viaj datumoj kaj interparoloj. ฤœi donas al vi aliron al malfermita reto, por ke via komunikado ne limiฤu al nur aliaj uzantoj de Element. Kaj ฤi estas tre sekura.\n\nElement povas fari ฤ‰i ฤ‰ion, ฤ‰ar ฤi funkcias per Matrix โ€“ publika normo por malfermita, sencentra komunikado. \n\n\nElement lasas vi elekti, kiu gastigos viajn interparolojn. Per la aplikaฤตo Element, vi povas elekti diversajn specojn de gastigado:\n\n1. Akiri senpagan konton ฤ‰e la publika servilo matrix.org\n2. Memgastiฤi per via propra servilo ฤ‰e via propra aparato\n3. Registriฤi ฤ‰e propra servilo per simpla pagaliฤo al la gastiga platformo ยซElement Matrix Servicesยป\n\nKial Element?\n\nPOSEDU VIAJN DATUMOJN: Vi decidu, kie vi tenu viajn datumojn kaj mesaฤojn. Vi posedas kaj regas ilin, ne iu granda komerca firmao, kiu kolektas viajn datumojn aลญ donas aliron al aliuloj.\n\nMALFERMAJ MESAฤœADO KAJ KUNLABORADO: Vi povas babili kun ฤ‰iu alia en la reto de Matrix, ฤ‰u ฤi uzas Elementon aลญ alian aplikaฤตon de Matrix, kaj eฤ‰ se ฤi uzas tute alian mesaฤilon, kiel ekzemple Slack, IRC, aลญ XMPP.\n\nTRE SEKURA: Vera tutvoja ฤ‰ifrado (nur la interparolantoj povas malฤ‰ifri siajn mesaฤojn), kaj delegaj subskriboj por kontroli la aparatojn de partoprenantoj.\n\nSENMANKA KOMUNIKADO: Mesaฤoj, voฤ‰vokoj kaj vidvokoj, havigado de dosieroj, ekrano, kaj multaj diversaj kunigoj, robotoj kaj fenestraฤตoj. Kreu ฤ‰ambrojn, komunumojn, komuniku kaj kunlaboru.\n\nฤˆIE KUN VI: Tenu vin ฤisdata per historio de mesaฤoj plene spegulita trans ฤ‰iuj viaj aparatoj, kaj sur la reto per https://app.element.io."; +"directory_server_all_native_rooms" = "ฤˆiuj ฤ‰ambroj, propraj al Matrix"; +"call_transfer_error_message" = "Malsukcesis transdono de voko"; + +// MARK: - Call Transfer +"call_transfer_title" = "Transdono"; +"room_intro_cell_information_dm_sentence1_part1" = "ฤˆi tie komencas historio de viaj rektaj mesaฤoj kun "; +"call_transfer_dialpad" = "Ciferplato"; + +// MARK: - Dial Pad +"dialpad_title" = "Ciferplato"; diff --git a/Riot/Assets/es.lproj/InfoPlist.strings b/Riot/Assets/es.lproj/InfoPlist.strings index d1bc05247..0a79c4758 100644 --- a/Riot/Assets/es.lproj/InfoPlist.strings +++ b/Riot/Assets/es.lproj/InfoPlist.strings @@ -2,4 +2,6 @@ "NSCameraUsageDescription" = "La cรกmara se utiliza para tomar fotos y vรญdeos, realizar llamadas de vรญdeo."; "NSPhotoLibraryUsageDescription" = "La biblioteca de fotos se utiliza para enviar fotos y vรญdeos."; "NSMicrophoneUsageDescription" = "El micrรณfono se utiliza para tomar vรญdeos, realizar llamadas."; -"NSContactsUsageDescription" = "Para mostrarte cuรกles de tus contactos ya utilizan Element o Matrix, podemos enviar las direcciones de correo electrรณnico y nรบmeros telefรณnicos de tu agenda de contactos a tu Servidor de Identidad de Matrix. New Vector no almacena estos datos ni los utiliza para ningรบn otro propรณsito. Para obtener mรกs informaciรณn, por favor consulta la pรกgina de polรญtica de privacidad en los ajustes de la aplicaciรณn."; +"NSContactsUsageDescription" = "Para mostrarte cuรกles de tus contactos ya utilizan Matrix, Element puede enviar las direcciones de correo electrรณnico y nรบmeros telefรณnicos de tu agenda de contactos a tu Servidor de Identidad de Matrix. En los casos que se puede, tu informaciรณn personal se cifra antes de ser enviada - por favor consulta la polรญtica de privacidad de tu Servidor de Identidad."; +"NSFaceIDUsageDescription" = "Face ID se usa para acceder a tu aplicaciรณn."; +"NSCalendarsUsageDescription" = "Mostrar tus reuniones en la aplicaciรณn."; diff --git a/Riot/Assets/et.lproj/Vector.strings b/Riot/Assets/et.lproj/Vector.strings index 522656a5a..01e5535cd 100644 --- a/Riot/Assets/et.lproj/Vector.strings +++ b/Riot/Assets/et.lproj/Vector.strings @@ -536,7 +536,7 @@ "settings_add_3pid_password_title_email" = "Lisa e-posti aadress"; "settings_add_3pid_password_title_msidsn" = "Lisa telefoninumber"; "settings_add_3pid_password_message" = "Jรคtkamiseks palun sisesta oma salasรตna"; -"settings_add_3pid_invalid_password_message" = "Vigane kasutajanimi"; +"settings_add_3pid_invalid_password_message" = "Vigane kasutajanimi vรตi salasรตna"; "settings_crypto_device_name" = "Sessiooni nimi: "; "settings_crypto_device_id" = "\nSessiooni tunnus: "; "settings_crypto_device_key" = "\nSessiooni vรตti:\n"; @@ -559,7 +559,7 @@ "identity_server_settings_place_holder" = "Sisesta isikutuvastusserver"; "identity_server_settings_add" = "Lisa"; "identity_server_settings_change" = "Muuda"; -"identity_server_settings_disconnect_info" = "Isikutuvastusserveri kasutamise lรตpetamine tรคhendab, et sa ei ole leitav teiste kasutajate poolt ega sulle ei saa telefoninumbri vรตi e-posti aadressi alusel kutset saata. Kรผll aga saab kutset saata Matrix'i kasutajatunnuse alusel."; +"identity_server_settings_disconnect_info" = "Isikutuvastusserveri kasutamise lรตpetamine tรคhendab, et sa ei ole leitav nende kasutajate poolt, kes tahavad sulle telefoninumbri vรตi e-posti aadressi alusel kutset saata. Kรผll aga saab alati kutset saata Matrix'i kasutajatunnuse alusel."; "room_details_history_section_prompt_msg" = "Kui muudad seda, kes saavad selle jututoa ajalugu lugeda, siis kehtib see vaid tulevaste sรตnumite kohta. Senise ajaloo nรคhtavus sellega ei muutu."; // Read Receipts "read_receipts_list" = "Lugemisteatiste loend"; @@ -1229,9 +1229,67 @@ "social_login_button_title_sign_up" = "Loo konto kasutades %@ teenust"; "social_login_button_title_sign_in" = "Logi sisse kasutades %@ teenust"; "social_login_button_title_continue" = "Jรคtka kasutades %@ teenust"; -"social_login_list_title_sign_up" = "Vรตi registreeru kasutajaks kasutades"; -"social_login_list_title_sign_in" = "Vรตi logi sisse kasutades"; +"social_login_list_title_sign_up" = "Vรตi"; +"social_login_list_title_sign_in" = "Vรตi"; // Social login "social_login_list_title_continue" = "Jรคtka kasutades"; +"settings_show_NSFW_public_rooms" = "Nรคita avalikke jututubasid, kus on ebasobilikku sisu"; +"room_intro_cell_information_room_sentence1_part3" = "jututuba. "; +"room_intro_cell_information_room_sentence1_part1" = "Siit maalt algab "; +"room_intro_cell_information_multiple_dm_sentence2" = "Seni kuni keegi teist kolmandaid osapooli liituma ei kutsu, olete siin vestluses vaid teie omavahel."; +"room_intro_cell_information_dm_sentence2" = "Vestlete vaid teie omavahel ning keegi teine ei saa liituda."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence1_part1" = "See on otsesรตnumite algus selle kasutajaga "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " selleks et kรตik teaks, millega siin jututoas tegeletakse."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Lisa jututoa teema"; +"room_intro_cell_information_room_with_topic_sentence2" = "Teema: %@"; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Lisa inimesi"; +"room_avatar_view_accessibility_hint" = "Muuda jututoa tunnuspilti ehk avatari"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "tunnuspilt"; +"call_transfer_error_message" = "Kรตne suunamine ei รตnnestunud"; +"call_transfer_error_title" = "Viga"; +"call_transfer_contacts_all" = "Kรตik"; +"call_transfer_contacts_recent" = "Hiljutised"; +"call_transfer_dialpad" = "Numbriklahvistik"; +"call_transfer_users" = "Kasutajad"; + +// MARK: - Call Transfer +"call_transfer_title" = "Suuna kรตne edasi"; + +// MARK: - Dial Pad +"dialpad_title" = "Numbriklahvistik"; +"call_actions_unhold" = "Jรคtka"; +"event_formatter_call_back" = "Helista tagasi"; +"event_formatter_call_you_declined" = "Sina keeldusid sellest kรตnest"; +"event_formatter_call_you_currently_in" = "Sul on parasjagu see kรตne pooleli"; +"event_formatter_call_has_ended" = "See kรตne on lรตppenud"; +"event_formatter_call_video" = "Videokรตne"; +"event_formatter_call_voice" = "Hรครคlkรตne"; +"room_open_dialpad" = "Numbriklahvistik"; +"room_place_voice_call" = "Hรครคlkรตne"; +"room_event_action_delete_confirmation_message" = "Kas sa kindlasti soovid selle saatmata sรตnumi kustutada?"; +"room_event_action_delete_confirmation_title" = "Kustuta saatmata sรตnum"; +"room_unsent_messages_cancel_message" = "Kas sa kindlasti soovid sellest jututoast kustutada kรตik saatmata sรตnumid?"; +"room_unsent_messages_cancel_title" = "Kustuta saatmata sรตnumid"; +"callbar_return" = "Pรถรถrdu tagasi"; +"callbar_only_multiple_paused" = "%@ ootel kรตnet"; +"callbar_only_single_paused" = "Pooleli kรตne"; +"callbar_active_and_multiple_paused" = "Kรคsil on รผks kรตne (%@) ยท %@ kรตnet on ootel"; +"callbar_active_and_single_paused" = "Kรคsil on รผks kรตne (%@) ยท รผks kรตne on ootel"; + +// Call Bar +"callbar_only_single_active" = "Kรตne on kรคsil (%@)"; +"room_details_integrations" = "Lรตiminguid"; +"room_details_search" = "Otsi jututoast"; +"room_multiple_typing_notification" = "%@ ja muud kasutajad"; +"room_accessibility_video_call" = "Videokรตne"; +"room_message_replying_to" = "Vastan sรตnumile %@"; +"room_message_editing" = "Muudan sรตnumit"; diff --git a/Riot/Assets/fa.lproj/Vector.strings b/Riot/Assets/fa.lproj/Vector.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/fa.lproj/Vector.strings @@ -0,0 +1 @@ + diff --git a/Riot/Assets/fr.lproj/Vector.strings b/Riot/Assets/fr.lproj/Vector.strings index c53844af1..97118828c 100644 --- a/Riot/Assets/fr.lproj/Vector.strings +++ b/Riot/Assets/fr.lproj/Vector.strings @@ -6,7 +6,7 @@ "title_groups" = "Communautรฉs"; "warning" = "Attention"; // Actions -"view" = "Voir"; +"view" = "Afficher"; "next" = "Suivant"; "back" = "Retour"; "continue" = "Continuer"; @@ -25,7 +25,7 @@ "accept" = "Accepter"; "preview" = "Aperรงu"; "camera" = "Appareil photo"; -"voice" = "Voix"; +"voice" = "Audio"; "video" = "Vidรฉo"; "active_call" = "Appel en cours"; "active_call_details" = "Appel en cours (%@)"; @@ -33,25 +33,25 @@ "rename" = "Renommer"; // Authentication "auth_login" = "Se connecter"; -"auth_register" = "S'inscrire"; +"auth_register" = "Sโ€™inscrire"; "auth_submit" = "Valider"; "auth_skip" = "Ignorer"; "auth_send_reset_email" = "Envoyer un e-mail de rรฉinitialisation"; -"auth_return_to_login" = "Retour ร  l'รฉcran de connexion"; -"auth_user_id_placeholder" = "E-mail ou nom d'utilisateur"; +"auth_return_to_login" = "Retour ร  lโ€™รฉcran de connexion"; +"auth_user_id_placeholder" = "E-mail ou nom dโ€™utilisateur"; "auth_password_placeholder" = "Mot de passe"; "auth_new_password_placeholder" = "Nouveau mot de passe"; -"auth_user_name_placeholder" = "Nom d'utilisateur"; +"auth_user_name_placeholder" = "Nom dโ€™utilisateur"; "auth_optional_email_placeholder" = "Adresse e-mail (facultatif)"; "auth_email_placeholder" = "Adresse e-mail"; "auth_optional_phone_placeholder" = "Numรฉro de tรฉlรฉphone (facultatif)"; "auth_phone_placeholder" = "Numรฉro de tรฉlรฉphone"; "auth_repeat_password_placeholder" = "Rรฉpรฉter le mot de passe"; "auth_repeat_new_password_placeholder" = "Confirmer le nouveau mot de passe"; -"auth_invalid_login_param" = "Nom d'utilisateur et/ou mot de passe incorrect"; -"auth_invalid_user_name" = "Les noms d'utilisateur ne peuvent contenir que des lettres, des chiffres, des points, des traits d'union ou des tirets bas"; +"auth_invalid_login_param" = "Nom dโ€™utilisateur et/ou mot de passe incorrect"; +"auth_invalid_user_name" = "Les noms dโ€™utilisateur ne peuvent contenir que des lettres, des chiffres, des points, des traits dโ€™union ou des tirets bas"; "auth_invalid_password" = "Mot de passe trop court (min 6)"; -"auth_invalid_email" = "L'adresse e-mail ne semble pas valide"; +"auth_invalid_email" = "Lโ€™adresse e-mail ne semble pas valide"; "auth_invalid_phone" = "Le numรฉro de tรฉlรฉphone ne semble pas valide"; "auth_missing_password" = "Mot de passe manquant"; "auth_add_email_message" = "Ajouter une adresse e-mail au compte pour que les utilisateurs puissent vous retrouver et pour rรฉinitialiser votre mot de passe."; @@ -62,23 +62,23 @@ "auth_missing_phone" = "Numรฉro de tรฉlรฉphone manquant"; "auth_missing_email_or_phone" = "Adresse e-mail ou numรฉro de tรฉlรฉphone manquant"; "auth_password_dont_match" = "Les mots de passe ne correspondent pas"; -"auth_username_in_use" = "L'identifiant est dรฉjร  utilisรฉ"; -"auth_forgot_password" = "Mot de passe oubliรฉ ?"; +"auth_username_in_use" = "Lโ€™identifiant est dรฉjร  utilisรฉ"; +"auth_forgot_password" = "Mot de passe oubliรฉย ?"; "auth_use_server_options" = "Utiliser un serveur personnalisรฉ (avancรฉ)"; -"auth_email_validation_message" = "Merci de vรฉrifier vos e-mails pour continuer l'inscription"; +"auth_email_validation_message" = "Merci de vรฉrifier vos e-mails pour continuer lโ€™inscription"; "auth_msisdn_validation_title" = "Vรฉrification en attente"; -"auth_msisdn_validation_message" = "Nous vous avons envoyรฉ un SMS avec un code d'activation. Merci de le recopier ci-dessous."; +"auth_msisdn_validation_message" = "Nous vous avons envoyรฉ un SMS avec un code dโ€™activation. Merci de le recopier ci-dessous."; "auth_msisdn_validation_error" = "Impossible de vรฉrifier votre numรฉro de tรฉlรฉphone."; "auth_recaptcha_message" = "Ce serveur dโ€™accueil voudrait sโ€™assurer que vous nโ€™รชtes pas un robot"; -"auth_reset_password_message" = "Pour rรฉinitialiser votre mot de passe, saisissez l'adresse e-mail liรฉe ร  votre compte :"; -"auth_reset_password_missing_email" = "Vous devez saisir l'adresse e-mail liรฉe ร  votre compte."; +"auth_reset_password_message" = "Pour rรฉinitialiser votre mot de passe, saisissez lโ€™adresse e-mail liรฉe ร  votre compteย :"; +"auth_reset_password_missing_email" = "Vous devez saisir lโ€™adresse e-mail liรฉe ร  votre compte."; "auth_reset_password_missing_password" = "Vous devez spรฉcifier un nouveau mot de passe."; -"auth_reset_password_email_validation_message" = "Un e-mail a รฉtรฉ envoyรฉ ร  %@. Cliquez d'abord sur le lien dans l'e-mail, puis ci-dessous."; -"auth_reset_password_next_step_button" = "J'ai vรฉrifiรฉ mon adresse e-mail"; -"auth_reset_password_error_unauthorized" = "Impossible de vรฉrifier l'adresse e-mail : assurez-vous de cliquer sur le lien dans l'e-mail"; +"auth_reset_password_email_validation_message" = "Un e-mail a รฉtรฉ envoyรฉ ร  %@. Cliquez dโ€™abord sur le lien dans lโ€™e-mail, puis ci-dessous."; +"auth_reset_password_next_step_button" = "Jโ€™ai vรฉrifiรฉ mon adresse e-mail"; +"auth_reset_password_error_unauthorized" = "Impossible de vรฉrifier lโ€™adresse e-mailย : assurez-vous de cliquer sur le lien dans lโ€™e-mail"; "auth_reset_password_error_not_found" = "Votre adresse e-mail ne semble pas associรฉe ร  un identifiant Matrix sur ce serveur dโ€™accueil."; "auth_reset_password_success_message" = "Votre mot de passe a รฉtรฉ rรฉinitialisรฉ.\n\nVous avez รฉtรฉ dรฉconnectรฉ de toutes vos sessions et ne recevrez plus de notifications. Pour rรฉactiver les notifications, reconnectez-vous sur chaque appareil."; -"auth_add_email_and_phone_warning" = "L'inscription avec un e-mail et un numรฉro de tรฉlรฉphone ร  la fois n'est pas supportรฉ tant que l'API n'existe pas. Seul votre numรฉro de tรฉlรฉphone sera pris en compte. Vous pourrez ajouter l'adresse e-mail dans vos options de profil."; +"auth_add_email_and_phone_warning" = "Lโ€™inscription avec un e-mail et un numรฉro de tรฉlรฉphone ร  la fois nโ€™est pas prise en charge tant que lโ€™API n'existe pas. Seul votre numรฉro de tรฉlรฉphone sera pris en compte. Vous pourrez ajouter lโ€™adresse e-mail dans vos options de profil."; // Chat creation "room_creation_title" = "Nouvelle discussion"; "room_creation_account" = "Compte"; @@ -89,8 +89,8 @@ "room_creation_private_room" = "Cette discussion est privรฉe"; "room_creation_public_room" = "Cette discussion est publique"; "room_creation_make_public" = "Rendre publique"; -"room_creation_make_public_prompt_title" = "Voulez-vous rendre cette discussion publique ?"; -"room_creation_make_public_prompt_msg" = "Voulez-vous vraiment rendre cette discussion publique ? Tout le monde pourra lire vos messages et rejoindre la discussion."; +"room_creation_make_public_prompt_title" = "Voulez-vous rendre cette discussion publiqueย ?"; +"room_creation_make_public_prompt_msg" = "Voulez-vous vraiment rendre cette discussion publiqueย ? Tout le monde pourra lire vos messages et rejoindre le salon."; "room_creation_keep_private" = "Garder privรฉe"; "room_creation_make_private" = "Rendre privรฉe"; "room_creation_wait_for_creation" = "Un salon est dรฉjร  en cours de crรฉation. Veuillez patienter."; @@ -140,7 +140,7 @@ "contacts_address_book_matrix_users_toggle" = "Utilisateurs Matrix uniquement"; "contacts_address_book_no_contact" = "Aucun contact local"; "contacts_address_book_permission_required" = "Permissions requises pour accรฉder aux contacts locaux"; -"contacts_address_book_permission_denied" = "Vous n'avez pas autorisรฉ Element ร  accรฉder ร  vos contacts locaux"; +"contacts_address_book_permission_denied" = "Vous nโ€™avez pas autorisรฉ Element ร  accรฉder ร  vos contacts locaux"; "contacts_user_directory_section" = "Rร‰PERTOIRE UTILISATEURS"; "contacts_user_directory_offline_section" = "Rร‰PERTOIRE UTILISATEURS (hors-ligne)"; // Chat participants @@ -149,25 +149,25 @@ "room_participants_one_participant" = "1 membre"; "room_participants_multi_participants" = "%d membres"; "room_participants_leave_prompt_title" = "Quitter le salon"; -"room_participants_leave_prompt_msg" = "Voulez-vous vraiment quitter le salon ?"; +"room_participants_leave_prompt_msg" = "Voulez-vous vraiment quitter le salonย ?"; "room_participants_remove_prompt_title" = "Confirmation"; -"room_participants_remove_prompt_msg" = "Voulez-vous vraiment exclure %@ de ce salon ?"; +"room_participants_remove_prompt_msg" = "Voulez-vous vraiment exclure %@ de ce salonย ?"; "room_participants_invite_prompt_title" = "Confirmation"; -"room_participants_invite_prompt_msg" = "Voulez-vous vraiment inviter %@ dans ce salon ?"; +"room_participants_invite_prompt_msg" = "Voulez-vous vraiment inviter %@ dans ce salonย ?"; "room_participants_filter_room_members" = "Filtrer les membres du salon"; "room_participants_invite_another_user" = "Rechercher/inviter par identifiant, nom ou e-mail"; -"room_participants_invite_malformed_id_title" = "Erreur lors de l'invitation"; +"room_participants_invite_malformed_id_title" = "Erreur lors de lโ€™invitation"; "room_participants_remove_third_party_invite_msg" = "Supprimer une invitation de tiers n'est pas prise en charge tant que l'API n'existe pas"; -"room_participants_invite_malformed_id" = "Identifiant au mauvais format. Une adresse e-mail ou un identifiant Matrix au format \"@utilisateur:domaine\" est attendu"; +"room_participants_invite_malformed_id" = "Identifiant au mauvais format. Une adresse e-mail ou un identifiant Matrix au format ยซย @utilisateur:domaineย ยป est attendu"; "room_participants_invited_section" = "INVITร‰S"; "room_participants_online" = "En ligne"; "room_participants_offline" = "Hors ligne"; "room_participants_unknown" = "Inconnu"; "room_participants_idle" = "Inactif"; "room_participants_now" = "maintenant"; -"room_participants_ago" = "d'inactivitรฉ"; -"room_participants_action_section_admin_tools" = "Outils d'administration"; -"room_participants_action_section_direct_chats" = "Discussions directes"; +"room_participants_ago" = "dโ€™inactivitรฉ"; +"room_participants_action_section_admin_tools" = "Outils dโ€™administration"; +"room_participants_action_section_direct_chats" = "Conversations privรฉes"; "room_participants_action_section_devices" = "Sessions"; "room_participants_action_section_other" = "Options"; "room_participants_action_invite" = "Inviter"; @@ -181,7 +181,7 @@ "room_participants_action_set_moderator" = "Nommer modรฉrateur"; "room_participants_action_set_admin" = "Nommer administrateur"; "room_participants_action_start_new_chat" = "Commencer une nouvelle discussion"; -"room_participants_action_start_voice_call" = "Commencer un appel vocal"; +"room_participants_action_start_voice_call" = "Commencer un appel audio"; "room_participants_action_start_video_call" = "Commencer un appel vidรฉo"; "room_participants_action_mention" = "Mentionner"; // Chat @@ -190,7 +190,7 @@ "room_new_messages_notification" = "%d nouveaux messages"; "room_one_user_is_typing" = "%@ รฉcritโ€ฆ"; "room_two_users_are_typing" = "%@ et %@ รฉcriventโ€ฆ"; -"room_many_users_are_typing" = "%@, %@ et d'autres รฉcriventโ€ฆ"; +"room_many_users_are_typing" = "%@, %@ et dโ€™autres รฉcriventโ€ฆ"; "room_message_placeholder" = "Envoyer un message (non chiffrรฉ)โ€ฆ"; "encrypted_room_message_placeholder" = "Envoyer un message chiffrรฉโ€ฆ"; "room_message_short_placeholder" = "Envoyer un messageโ€ฆ"; @@ -211,14 +211,14 @@ "room_event_action_view_source" = "Voir la source"; "room_event_action_report" = "Signaler le contenu"; "room_event_action_report_prompt_reason" = "Raison pour le signalement du contenu"; -"room_event_action_report_prompt_ignore_user" = "Voulez-vous masquer tous les messages de cet utilisateur ?"; +"room_event_action_report_prompt_ignore_user" = "Voulez-vous masquer tous les messages de cet utilisateurย ?"; "room_event_action_save" = "Enregistrer"; "room_event_action_resend" = "Renvoyer"; "room_event_action_delete" = "Supprimer"; -"room_event_action_cancel_send" = "Annuler l'envoi"; +"room_event_action_cancel_send" = "Annuler lโ€™envoi"; "room_event_action_cancel_download" = "Annuler le tรฉlรฉchargement"; "room_event_action_view_encryption" = "Informations sur le chiffrement"; -"room_warning_about_encryption" = "Le chiffrement de bout en bout est en version bรชta et peut ne pas รชtre fiable.\n\nIl ne doit pas รชtre considรฉrรฉ comme fiable pour sรฉcuriser des donnรฉes.\n\nLes appareils ne pourront pas encore dรฉchiffrer l'historique de messages d'avant leur arrivรฉe sur le salon.\n\nLes messages chiffrรฉs ne seront pas visibles sur les clients qui n'ont pas encore implรฉmentรฉ le chiffrement."; +"room_warning_about_encryption" = "Le chiffrement de bout en bout est en version bรชta et peut ne pas รชtre fiable.\n\nIl ne doit pas รชtre considรฉrรฉ comme fiable pour sรฉcuriser des donnรฉes.\n\nLes appareils ne pourront pas encore dรฉchiffrer lโ€™historique de messages dโ€™avant leur arrivรฉe sur le salon.\n\nLes messages chiffrรฉs ne seront pas visibles sur les clients qui nโ€™ont pas encore implรฉmentรฉ le chiffrement."; // Unknown devices "unknown_devices_alert_title" = "Le salon contient des sessions inconnues"; "unknown_devices_alert" = "Ce salon contient des sessions inconnues qui nโ€™ont pas รฉtรฉ vรฉrifiรฉes.\nCela signifie quโ€™il nโ€™y a aucune garantie que les sessions appartiennent aux utilisateurs quโ€™elles prรฉtendent.\nNous vous recommandons dโ€™effectuer le processus de vรฉrification pour chaque session avant de continuer, mais vous pouvez renvoyer le message sans vรฉrifier si vous prรฉfรฉrez."; @@ -235,10 +235,10 @@ "room_title_members" = "%@ membres"; "room_title_one_member" = "1 membre"; // Room Preview -"room_preview_invitation_format" = "Vous avez รฉtรฉ invitรฉ(e) ร  rejoindre ce salon par %@"; +"room_preview_invitation_format" = "Vous avez รฉtรฉ invitรฉ ร  rejoindre ce salon par %@"; "room_preview_subtitle" = "Ceci est un aperรงu du salon. Les interactions avec le salon sont dรฉsactivรฉes."; -"room_preview_unlinked_email_warning" = "Cette invitation a รฉtรฉ envoyรฉe ร  %@, qui n'est pas associรฉ ร  ce compte. Vous pouvez vous identifier avec un compte diffรฉrent ou ajouter cette adresse e-mail ร  votre compte."; -"room_preview_try_join_an_unknown_room" = "Vous essayez d'accรฉder ร  %@. Voulez-vous rejoindre la discussion afin d'y participer ?"; +"room_preview_unlinked_email_warning" = "Cette invitation a รฉtรฉ envoyรฉe ร  %@, qui nโ€™est pas associรฉ ร  ce compte. Vous pouvez vous identifier avec un compte diffรฉrent ou ajouter cette adresse e-mail ร  votre compte."; +"room_preview_try_join_an_unknown_room" = "Vous essayez d'accรฉder ร  %@. Voulez-vous rejoindre la discussion afin dโ€™y participerย ?"; "room_preview_try_join_an_unknown_room_default" = "un salon"; // Settings "settings_title" = "Paramรจtres"; @@ -247,7 +247,7 @@ "settings_mark_all_as_read" = "Marquer tous les messages comme lus"; "settings_report_bug" = "Signaler une erreur"; "settings_config_home_server" = "Le serveur dโ€™accueil est %@"; -"settings_config_identity_server" = "Le serveur d'identitรฉ est %@"; +"settings_config_identity_server" = "Le serveur dโ€™identitรฉ est %@"; "settings_config_user_id" = "Identifiรฉ en tant que %@"; "settings_user_settings" = "PRร‰Fร‰RENCES UTILISATEUR"; "settings_notifications_settings" = "PRร‰Fร‰RENCES DE NOTIFICATIONS"; @@ -255,19 +255,19 @@ "settings_contacts" = "CONTACTS LOCAUX"; "settings_advanced" = "AVANCร‰"; "settings_other" = "AUTRES"; -"settings_labs" = "LABORATOIRE"; +"settings_labs" = "EXPร‰RIMENTAL"; "settings_devices" = "SESSIONS"; "settings_cryptography" = "CHIFFREMENT"; "settings_sign_out" = "Se dรฉconnecter"; -"settings_sign_out_confirmation" = "รŠtes-vous sรปr(e) ?"; +"settings_sign_out_confirmation" = "รŠtes-vous sรปrย ?"; "settings_sign_out_e2e_warn" = "Vous perdrez vos clรฉs de chiffrement de bout en bout. Cela signifie que vous ne pourrez plus lire les anciens messages des salons chiffrรฉs depuis cet appareil."; "settings_profile_picture" = "Image de profil"; -"settings_display_name" = "Nom d'affichage"; +"settings_display_name" = "Nom dโ€™affichage"; "settings_first_name" = "Prรฉnom"; "settings_surname" = "Nom"; "settings_remove_prompt_title" = "Confirmation"; -"settings_remove_email_prompt_msg" = "Voulez-vous vraiment supprimer l'adresse e-mail %@ ?"; -"settings_remove_phone_prompt_msg" = "Voulez-vous vraiment supprimer le numรฉro de tรฉlรฉphone %@ ?"; +"settings_remove_email_prompt_msg" = "Voulez-vous vraiment supprimer lโ€™adresse e-mail %@ย ?"; +"settings_remove_phone_prompt_msg" = "Voulez-vous vraiment supprimer le numรฉro de tรฉlรฉphone %@ย ?"; "settings_email_address" = "E-mail"; "settings_email_address_placeholder" = "Saisir votre adresse e-mail"; "settings_add_email_address" = "Ajouter une adresse e-mail"; @@ -280,19 +280,19 @@ "settings_pin_rooms_with_missed_notif" = "ร‰pingler les salons avec des notifications non lues"; "settings_pin_rooms_with_unread" = "ร‰pingler les salons avec des messages non lus"; "settings_on_denied_notification" = "Les notifications sont refusรฉes pour %@, merci de les autoriser dans les paramรจtres de votre appareil"; -"settings_unignore_user" = "Afficher tous les messages de %@ ?"; +"settings_unignore_user" = "Afficher tous les messages de %@ย ?"; "settings_contacts_discover_matrix_users" = "Utiliser un e-mail ou un numรฉro de tรฉlรฉphone pour retrouver des utilisateurs"; "settings_contacts_phonebook_country" = "Pays pour le rรฉpertoire tรฉlรฉphonique"; "settings_labs_e2e_encryption" = "Chiffrement de bout en bout"; "settings_labs_e2e_encryption_prompt_message" = "Pour terminer la configuration du chiffrement, vous devez vous reconnecter."; "settings_version" = "Version %@"; "settings_olm_version" = "Version de olm %@"; -"settings_copyright" = "Droits d'auteur"; +"settings_copyright" = "Droits dโ€™auteur"; "settings_term_conditions" = "Termes et conditions"; "settings_privacy_policy" = "Politique de confidentialitรฉ"; "settings_third_party_notices" = "Licences tierces"; -"settings_send_crash_report" = "Envoyer des rapports d'erreur anonymes et des statistiques d'utilisation"; -"settings_enable_rageshake" = "Secouer l'appareil pour signaler un bug"; +"settings_send_crash_report" = "Envoyer des rapports dโ€™anomalies anonymes et des statistiques dโ€™utilisation"; +"settings_enable_rageshake" = "Secouer lโ€™appareil pour signaler un bug"; "settings_clear_cache" = "Vider le cache"; "settings_change_password" = "Changer de mot de passe"; "settings_old_password" = "ancien mot de passe"; @@ -317,52 +317,52 @@ "room_details_low_priority_tag" = "Prioritรฉ basse"; "room_details_mute_notifs" = "Dรฉsactiver les notifications"; "room_details_direct_chat" = "Discussion directe"; -"room_details_access_section" = "Qui peut accรฉder ร  ce salon ?"; +"room_details_access_section" = "Qui peut accรฉder ร  ce salonย ?"; "room_details_access_section_invited_only" = "Seules les personnes qui ont รฉtรฉ invitรฉes"; "room_details_access_section_anyone_apart_from_guest" = "Tous ceux qui connaissent le lien du salon, ร  part les visiteurs"; -"room_details_access_section_anyone" = "Tous ceux qui connaissent le lien du salon, y compris les visiteurs"; +"room_details_access_section_anyone" = "Toute personne ayant le lien du salon, y compris les visiteurs"; "room_details_access_section_no_address_warning" = "Pour rรฉcupรฉrer le lien vers un salon, celui-ci doit avoir une adresse"; -"room_details_access_section_directory_toggle" = "Lister ce salon dans le rรฉpertoire des salons"; -"room_details_history_section" = "Qui peut lire l'historique ?"; -"room_details_history_section_anyone" = "N'importe qui"; -"room_details_history_section_members_only" = "Uniquement les membres (ร  partir de l'activation de cette option)"; +"room_details_access_section_directory_toggle" = "Publier ce salon dans le rรฉpertoire des salons"; +"room_details_history_section" = "Qui peut lire lโ€™historiqueย ?"; +"room_details_history_section_anyone" = "Nโ€™importe qui"; +"room_details_history_section_members_only" = "Uniquement les membres (ร  partir de lโ€™activation de cette option)"; "room_details_history_section_members_only_since_invited" = "Uniquement les membres (depuis leur invitation)"; -"room_details_history_section_members_only_since_joined" = "Uniquement les membres (depuis qu'ils sont arrivรฉs)"; +"room_details_history_section_members_only_since_joined" = "Uniquement les membres (depuis leur arrivรฉe)"; "room_details_history_section_prompt_title" = "Alerte de confidentialitรฉ"; -"room_details_history_section_prompt_msg" = "Les changements d'accรจs ร  l'historique ne s'appliqueront qu'aux futurs messages du salon. La visibilitรฉ de l'historique existant demeurera inchangรฉe."; +"room_details_history_section_prompt_msg" = "Les changements dโ€™accรจs ร  lโ€™historique ne sโ€™appliqueront quโ€™aux futurs messages du salon. La visibilitรฉ de lโ€™historique existant demeurera inchangรฉe."; "room_details_addresses_section" = "Adresses"; -"room_details_no_local_addresses" = "Ce salon n'a pas d'adresse locale"; +"room_details_no_local_addresses" = "Ce salon nโ€™a pas dโ€™adresse locale"; "room_details_new_address" = "Ajouter une adresse"; "room_details_new_address_placeholder" = "Ajouter une adresse (par ex. #foo%@)"; -"room_details_addresses_invalid_address_prompt_title" = "Format d'alias non valide"; -"room_details_addresses_invalid_address_prompt_msg" = "%@ n'est pas un format valide pour un alias"; -"room_details_addresses_disable_main_address_prompt_title" = "Alerte sur l'adresse principale"; -"room_details_addresses_disable_main_address_prompt_msg" = "Vous n'aurez aucune adresse principale spรฉcifiรฉe. L'adresse principale par dรฉfaut de ce salon sera choisie alรฉatoirement"; +"room_details_addresses_invalid_address_prompt_title" = "Format dโ€™alias non valide"; +"room_details_addresses_invalid_address_prompt_msg" = "%@ nโ€™est pas un format valide pour un alias"; +"room_details_addresses_disable_main_address_prompt_title" = "Alerte sur lโ€™adresse principale"; +"room_details_addresses_disable_main_address_prompt_msg" = "Vous nโ€™aurez aucune adresse principale explicitement dรฉfinie. Lโ€™adresse principale par dรฉfaut de ce salon sera choisie alรฉatoirement"; "room_details_banned_users_section" = "Utilisateurs bannis"; "room_details_advanced_section" = "Avancรฉ"; -"room_details_advanced_room_id" = "Identifiant du salon :"; -"room_details_advanced_enable_e2e_encryption" = "Activer le chiffrement (attention : ne peut pas รชtre dรฉsactivรฉ !)"; +"room_details_advanced_room_id" = "Identifiant du salonย :"; +"room_details_advanced_enable_e2e_encryption" = "Activer le chiffrement (attentionย : ne peut pas รชtre dรฉsactivรฉย !)"; "room_details_advanced_e2e_encryption_enabled" = "Le chiffrement est activรฉ sur ce salon"; "room_details_advanced_e2e_encryption_disabled" = "Le chiffrement est dรฉsactivรฉ sur ce salon."; "room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Chiffrer uniquement vers les sessions vรฉrifiรฉes"; "room_details_advanced_e2e_encryption_prompt_message" = "Le chiffrement de bout en bout est en version bรชta et peut ne pas รชtre fiable.\n\nIl ne doit pas รชtre considรฉrรฉ comme fiable pour sรฉcuriser des donnรฉes.\n\nLes appareils ne pourront pas encore dรฉchiffrer l'historique de messages d'avant leur arrivรฉe sur le salon.\n\nUne fois le chiffrement activรฉ pour un salon, il ne peut plus รชtre dรฉsactivรฉ (pour l'instant).\n\nLes messages chiffrรฉs ne seront pas visibles sur les clients qui n'ont pas encore implรฉmentรฉ le chiffrement."; -"room_details_fail_to_update_avatar" = "ร‰chec de mise ร  jour de l'image du salon"; +"room_details_fail_to_update_avatar" = "ร‰chec de mise ร  jour de lโ€™image du salon"; "room_details_fail_to_update_room_name" = "ร‰chec de mise ร  jour du nom du salon"; "room_details_fail_to_update_topic" = "ร‰chec de mise ร  jour du sujet"; -"room_details_fail_to_update_room_guest_access" = "ร‰chec de mise ร  jour de l'accรจs au salon pour les visiteurs"; +"room_details_fail_to_update_room_guest_access" = "ร‰chec de mise ร  jour de lโ€™accรจs au salon pour les visiteurs"; "room_details_fail_to_update_room_join_rule" = "ร‰chec de mise ร  jour des rรจgles pour rejoindre le salon"; "room_details_fail_to_update_room_directory_visibility" = "ร‰chec de mise ร  jour de la visibilitรฉ du salon dans le rรฉpertoire"; -"room_details_fail_to_update_history_visibility" = "ร‰chec de mise ร  jour de la visibilitรฉ de l'historique"; -"room_details_fail_to_add_room_aliases" = "ร‰chec de l'ajout des nouvelles adresses du salon"; +"room_details_fail_to_update_history_visibility" = "ร‰chec de mise ร  jour de la visibilitรฉ de lโ€™historique"; +"room_details_fail_to_add_room_aliases" = "ร‰chec de lโ€™ajout des nouvelles adresses du salon"; "room_details_fail_to_remove_room_aliases" = "ร‰chec de la suppression des adresses du salon"; -"room_details_fail_to_update_room_canonical_alias" = "ร‰chec de la mise ร  jour de l'adresse principale"; -"room_details_fail_to_update_room_direct" = "ร‰chec de mise ร  jour de l'รฉtiquette de discussion directe"; -"room_details_fail_to_enable_encryption" = "ร‰chec de l'activation du chiffrement de ce salon"; +"room_details_fail_to_update_room_canonical_alias" = "ร‰chec de la mise ร  jour de lโ€™adresse principale"; +"room_details_fail_to_update_room_direct" = "ร‰chec de mise ร  jour de lโ€™รฉtiquette de conversation privรฉe"; +"room_details_fail_to_enable_encryption" = "ร‰chec de lโ€™activation du chiffrement de ce salon"; "room_details_save_changes_prompt" = "Voulez-vous enregistrer les modificationsย ?"; "room_details_set_main_address" = "Dรฉfinir comme adresse principale"; "room_details_unset_main_address" = "Dรฉsactiver comme adresse principale"; -"room_details_copy_room_id" = "Copier l'identifiant du salon"; -"room_details_copy_room_address" = "Copier l'adresse du salon"; +"room_details_copy_room_id" = "Copier lโ€™identifiant du salon"; +"room_details_copy_room_address" = "Copier lโ€™adresse du salon"; "room_details_copy_room_url" = "Copier le lien du salon"; // Group Details "group_details_title" = "Dรฉtails de la communautรฉ"; @@ -385,14 +385,14 @@ "group_participants_invite_prompt_msg" = "Voulez-vous vraiment inviter %@ dans ce groupeย ?"; "group_participants_filter_members" = "Filtrer les membres de la communautรฉ"; "group_participants_invite_another_user" = "Rechercher/inviter par identifiant ou nom"; -"group_participants_invite_malformed_id_title" = "Erreur lors de l'invitation"; -"group_participants_invite_malformed_id" = "Identifiant au mauvais format. Un identifiant Matrix au format \"@utilisateur:domaine\" est attendu"; +"group_participants_invite_malformed_id_title" = "Erreur lors de lโ€™invitation"; +"group_participants_invite_malformed_id" = "Identifiant au mauvais format. Un identifiant Matrix au format ยซย @utilisateur:domaineย ยป est attendu"; "group_participants_invited_section" = "INVITร‰S"; // Group rooms "group_rooms_filter_rooms" = "Filtrer les salons de la communautรฉ"; // Read Receipts "read_receipts_list" = "Liste des accusรฉs de lecture"; -"receipt_status_read" = "Lu : "; +"receipt_status_read" = "Luย : "; // Media picker "media_picker_library" = "Mรฉdiathรจque"; "media_picker_select" = "Sรฉlectionner"; @@ -401,54 +401,54 @@ "directory_server_picker_title" = "Sรฉlectionner un rรฉpertoire"; "directory_server_all_rooms" = "Tous les salons sur le serveur %@"; "directory_server_all_native_rooms" = "Tous les salons Matrix natifs"; -"directory_server_type_homeserver" = "Saisir un serveur d'accueil pour lister ses salons publics"; +"directory_server_type_homeserver" = "Saisir un serveur dโ€™accueil pour lister ses salons publics"; "directory_server_placeholder" = "matrix.org"; // Others "or" = "ou"; "you" = "Vous"; -"today" = "Aujourd'hui"; +"today" = "Aujourdโ€™hui"; "yesterday" = "Hier"; "network_offline_prompt" = "La connexion Internet semble รชtre hors-ligne."; -"public_room_section_title" = "Salons publics (sur %@) :"; -"bug_report_prompt" = "L'application s'est terminรฉe brusquement la derniรจre fois. Voulez-vous envoyer un rapport d'erreur ?"; -"rage_shake_prompt" = "Vous semblez secouer le tรฉlรฉphone avec frustration. Souhaitez-vous soumettre un rapport d'erreur ?"; +"public_room_section_title" = "Salons publics (sur %@)ย :"; +"bug_report_prompt" = "Lโ€™application sโ€™est arrรชtรฉe brusquement la derniรจre fois. Voulez-vous envoyer un rapport dโ€™anomalieย ?"; +"rage_shake_prompt" = "Vous semblez secouer le tรฉlรฉphone avec frustration. Souhaitez-vous soumettre un rapport dโ€™anomalieย ?"; "do_not_ask_again" = "Ne plus demander"; -"camera_access_not_granted" = "%@ n'a pas la permission pour utiliser l'appareil photo, veuillez modifier les options de vie privรฉe"; +"camera_access_not_granted" = "%@ nโ€™a pas la permission pour utiliser lโ€™appareil photo, veuillez modifier les options de confidentialitรฉ"; "large_badge_value_k_format" = "%.1fK"; // Call -"call_incoming_voice_prompt" = "Appel vocal entrant de %@"; +"call_incoming_voice_prompt" = "Appel audio entrant de %@"; "call_incoming_video_prompt" = "Appel vidรฉo entrant de %@"; // No VoIP support "no_voip_title" = "Appel entrant"; -"no_voip" = "%@ vous appelle mais %@ ne supporte pas encore les appels.\nVous pouvez ignorer cette notification et rรฉpondre ร  l'appel depuis un autre appareil, ou bien le rejeter."; +"no_voip" = "%@ vous appelle mais %@ ne prend pas encore en charge les appels.\nVous pouvez ignorer cette notification et rรฉpondre ร  lโ€™appel depuis un autre appareil, ou bien le rejeter."; // Crash report -"google_analytics_use_prompt" = "Souhaitez-vous aider ร  amรฉliorer %@ en envoyant automatiquement des rapports d'erreur et des statistiques d'utilisation ?"; +"google_analytics_use_prompt" = "Souhaitez-vous aider ร  amรฉliorer %@ en envoyant automatiquement des rapports dโ€™anomalie et des statistiques dโ€™utilisationย ?"; // Crypto -"e2e_enabling_on_app_update" = "Element prend dรฉsormais en charge le chiffrement de bout en bout, mais vous devez vous reconnecter pour l'activer.\n\nVous pouvez le faire maintenant ou plus tard ร  partir des paramรจtres de l'application."; +"e2e_enabling_on_app_update" = "Element prend dรฉsormais en charge le chiffrement de bout en bout, mais vous devez vous reconnecter pour lโ€™activer.\n\nVous pouvez le faire maintenant ou plus tard ร  partir des paramรจtres de lโ€™application."; "e2e_need_log_in_again" = "Vous devez vous reconnecter pour gรฉnรฉrer les clรฉs de chiffrement de bout en bout pour cette session et envoyer la clรฉ publique vers votre serveur dโ€™accueil.\nCeci ne se produira quโ€™une fois. Veuillez nous excuser pour ce dรฉsagrรฉment."; // Bug report -"bug_report_title" = "Rapport d'erreur"; -"bug_report_description" = "Veuillez dรฉcrire l'erreur. Qu'avez-vous fait ? Quel รฉtait le comportement attendu ? Que s'est-il rรฉellement passรฉ ?"; -"bug_crash_report_title" = "Rapport d'erreur"; -"bug_crash_report_description" = "Merci de dรฉcrire ce que vous faisiez avant l'arrรชt de l'application :"; -"bug_report_logs_description" = "Afin de diagnostiquer les problรจmes, les journaux de ce client seront envoyรฉs avec le rapport d'erreur. Si vous prรฉfรฉrez envoyer uniquement le texte ci-dessus, veuillez dรฉcocher la case :"; +"bug_report_title" = "Rapport dโ€™anomalie"; +"bug_report_description" = "Veuillez dรฉcrire lโ€™anomalie. Quโ€™avez-vous faitย ? Quel รฉtait le comportement attenduย ? Que sโ€™est-il rรฉellement passรฉย ?"; +"bug_crash_report_title" = "Rapport dโ€™arrรชt brutal"; +"bug_crash_report_description" = "Merci de dรฉcrire ce que vous faisiez avant lโ€™arrรชt de lโ€™applicationย :"; +"bug_report_logs_description" = "Afin de diagnostiquer les problรจmes, les journaux de ce client seront envoyรฉs avec le rapport dโ€™anomalie. Si vous prรฉfรฉrez envoyer uniquement le texte ci-dessus, veuillez dรฉcocher la caseย :"; "bug_report_send_logs" = "Envoyer les journaux"; -"bug_report_send_screenshot" = "Envoyer une capture d'รฉcran"; +"bug_report_send_screenshot" = "Envoyer une capture dโ€™รฉcran"; "bug_report_progress_zipping" = "Collecte des journaux"; "bug_report_progress_uploading" = "Envoi du rapport"; "bug_report_send" = "Envoyer"; "auth_email_in_use" = "Cette adresse e-mail est dรฉjร  utilisรฉe"; "auth_phone_in_use" = "Ce numรฉro de tรฉlรฉphone est dรฉjร  utilisรฉ"; -"auth_email_not_found" = "ร‰chec de l'envoi de l'e-mail : Cette adresse e-mail n'a pas pu รชtre trouvรฉe"; +"auth_email_not_found" = "ร‰chec de lโ€™envoi de lโ€™e-mailย : cette adresse e-mail nโ€™a pas pu รชtre trouvรฉe"; "settings_ui_language" = "Langue"; "settings_ui_theme" = "Thรจme"; "settings_ui_theme_auto" = "Auto"; "settings_ui_theme_light" = "Clair"; "settings_ui_theme_dark" = "Sombre"; -"settings_ui_theme_picker_title" = "Selectionnez un thรจme"; -"settings_ui_theme_picker_message" = "\"Auto\" utilise le paramรจtre \"Inverser les couleurs\" de votre appareil"; +"settings_ui_theme_picker_title" = "Sรฉlectionnez un thรจme"; +"settings_ui_theme_picker_message" = "ยซย Autoย ยป utilise le paramรจtre ยซย Inverser les couleursย ยป de votre appareil"; "collapse" = "rรฉduire"; -"auth_untrusted_id_server" = "Le serveur d'identitรฉ n'est pas fiable"; +"auth_untrusted_id_server" = "Le serveur d'identitรฉ nโ€™est pas fiable"; "settings_user_interface" = "INTERFACE UTILISATEUR"; // Events formatter "event_formatter_member_updates" = "%tu modifications dans les membres"; @@ -467,17 +467,17 @@ "sending" = "Envoi"; "call_incoming_voice" = "Appel entrantโ€ฆ"; "call_incoming_video" = "Appel vidรฉo entrantโ€ฆ"; -"widget_integration_must_be_in_room" = "Vous n'รชtes pas dans ce salon."; +"widget_integration_must_be_in_room" = "Vous nโ€™รชtes pas dans ce salon."; "widget_integration_no_permission_in_room" = "Vous nโ€™avez pas la permission de faire cela dans ce salon."; -"widget_integration_room_not_visible" = "Le salon %@ n'est pas visible."; +"widget_integration_room_not_visible" = "Le salon %@ nโ€™est pas visible."; "auth_share_extension_prompt" = "Se connecter dans l'application principale pour partager du contenu"; -"room_event_failed_to_send" = "ร‰chec de l'envoi"; -"event_formatter_jitsi_widget_added" = "Tรฉlรฉconfรฉrence en Voix sur IP ajoutรฉe par %@"; -"event_formatter_jitsi_widget_removed" = "Tรฉlรฉconfรฉrence en Voix sur IP supprimรฉe par %@"; +"room_event_failed_to_send" = "ร‰chec de lโ€™envoi"; +"event_formatter_jitsi_widget_added" = "Tรฉlรฉconfรฉrence en VoIP ajoutรฉe par %@"; +"event_formatter_jitsi_widget_removed" = "Tรฉlรฉconfรฉrence en VoIP supprimรฉe par %@"; // Widget Integration Manager "widget_integration_need_to_be_able_to_invite" = "Vous devez รชtre capable dโ€™inviter des utilisateurs pour faire รงa."; "widget_integration_unable_to_create" = "Impossible de crรฉer le widget."; -"widget_integration_failed_to_send_request" = "ร‰chec de l'envoi de la requรชte."; +"widget_integration_failed_to_send_request" = "ร‰chec de lโ€™envoi de la requรชte."; "widget_integration_room_not_recognised" = "Ce salon n'est pas reconnu."; "widget_integration_positive_power_level" = "Le rang doit รชtre un entier positif."; "widget_integration_missing_room_id" = "Absence du room_id dans la requรชte."; @@ -485,12 +485,12 @@ "settings_calls_settings" = "APPELS"; "settings_show_decrypted_content" = "Afficher les messages chiffrรฉs en clair"; "settings_enable_callkit" = "Appels intรฉgrรฉs"; -"settings_callkit_info" = "Recevez les appels entrants sur votre รฉcran de verrouillage. Voir vos appels Element dans l'historique des appels du systรจme. Si iCloud est activรฉ, cet historique d'appels sera partagรฉ avec Apple."; -"event_formatter_widget_added" = "Widget %@ ajoutรฉe par %@"; -"event_formatter_widget_removed" = "Widget %@ supprimรฉe par %@"; +"settings_callkit_info" = "Recevez les appels entrants sur votre รฉcran de verrouillage. Retrouvez vos appels Element dans lโ€™historique des appels du systรจme. Si iCloud est activรฉ, cet historique dโ€™appels sera partagรฉ avec Apple."; +"event_formatter_widget_added" = "Widget %@ ajoutรฉ par %@"; +"event_formatter_widget_removed" = "Widget %@ supprimรฉ par %@"; // Share extension -"share_extension_auth_prompt" = "Connectez-vous dans l'application pour partager du contenu"; -"share_extension_failed_to_encrypt" = "ร‰chec d'envoi. Vรฉrifiez les paramรจtres de chiffrement de ce salon dans l'application"; +"share_extension_auth_prompt" = "Connectez-vous dans lโ€™application pour partager du contenu"; +"share_extension_failed_to_encrypt" = "ร‰chec de lโ€™envoi. Vรฉrifiez les paramรจtres de chiffrement de ce salon dans lโ€™application"; "settings_ui_theme_black" = "Noir"; // Room key request dialog "e2e_room_key_request_title" = "Demande de clรฉs de chiffrement"; @@ -503,27 +503,27 @@ "room_details_flair_section" = "Afficher le badge pour des communautรฉs"; "room_details_new_flair_placeholder" = "Ajouter un nouvel identifiant de communautรฉ (par ex. +foo%@)"; "room_details_flair_invalid_id_prompt_title" = "Format invalide"; -"room_details_flair_invalid_id_prompt_msg" = "%@ n'est pas un identifiant valide pour une communautรฉ"; +"room_details_flair_invalid_id_prompt_msg" = "%@ nโ€™est pas un identifiant valide pour une communautรฉ"; "room_details_fail_to_update_room_communities" = "ร‰chec de la mise ร  jour des communautรฉs liรฉes"; "room_do_not_have_permission_to_post" = "Vous nโ€™avez pas la permission dโ€™envoyer des messages dans ce salon"; -"room_event_action_kick_prompt_reason" = "Motif de l'expulsion de l'utilisateur"; -"room_event_action_ban_prompt_reason" = "Raison du bannissement de l'utilisateur"; +"room_event_action_kick_prompt_reason" = "Motif de lโ€™expulsion de lโ€™utilisateur"; +"room_event_action_ban_prompt_reason" = "Raison du bannissement de lโ€™utilisateur"; // GDPR "gdpr_consent_not_given_alert_message" = "Pour continuer ร  utiliser le serveur d'accueil %@, vous devez lire et accepter les conditions gรฉnรฉrales."; "gdpr_consent_not_given_alert_review_now_action" = "Voir maintenant"; "room_action_send_photo_or_video" = "Envoyer une photo ou une vidรฉo"; -"room_action_send_sticker" = "Envoyer un sticker"; +"room_action_send_sticker" = "Envoyer un autocollant"; "settings_deactivate_account" = "Dร‰SACTIVER LE COMPTE"; "settings_deactivate_my_account" = "Dรฉsactiver mon compte"; -"widget_sticker_picker_no_stickerpacks_alert" = "Vous n'avez aucun pack de stickers activรฉ."; +"widget_sticker_picker_no_stickerpacks_alert" = "Vous nโ€™avez aucun jeu dโ€™autocollants activรฉ."; "widget_sticker_picker_no_stickerpacks_alert_add_now" = "En ajouter maintenantย ?"; "deactivate_account_title" = "Dรฉsactiver le compte"; -"deactivate_account_informations_part1" = "Votre compte sera inutilisable de faรงon permanente. Vous ne pourrez plus vous connecter et personne ne pourra se rรฉenregistrer avec le mรชme identifiant d'utilisateur. Votre compte quittera tous les salons auxquels il participe, et tous les dรฉtails du compte seront supprimรฉs du serveur d'identitรฉ. "; +"deactivate_account_informations_part1" = "Votre compte sera inutilisable de faรงon permanente. Vous ne pourrez plus vous connecter et personne ne pourra se rรฉenregistrer avec le mรชme identifiant dโ€™utilisateur. Votre compte quittera tous les salons auxquels il participe, et toutes les informations du compte seront supprimรฉs du serveur dโ€™identitรฉ. "; "deactivate_account_informations_part2_emphasize" = "Cette action est irrรฉversible."; "deactivate_account_informations_part3" = "\n\nLa dรฉsactivation de votre compte "; "deactivate_account_informations_part4_emphasize" = "ne nous fait pas oublier les messages que vous avez envoyรฉs par dรฉfaut. "; "deactivate_account_informations_part5" = "Si vous souhaitez que nous oubliions vos messages, cochez la case ci-dessous\n\nLa visibilitรฉ des messages dans Matrix est similaire ร  celle des e-mails. Notre oubli des messages signifie que les messages que vous avez envoyรฉs ne seront pas partagรฉs avec les nouveaux utilisateurs ou les utilisateurs non enregistrรฉs, mais les utilisateurs qui ont dรฉjร  accรจs ร  ces messages auront toujours accรจs ร  leur copie."; -"deactivate_account_forget_messages_information_part1" = "Veuillez oublier tous les messages que j'ai envoyรฉ quand mon compte sera dรฉsactivรฉ ("; +"deactivate_account_forget_messages_information_part1" = "Veuillez oublier tous les messages que jโ€™ai envoyรฉs quand mon compte sera dรฉsactivรฉ ("; "deactivate_account_forget_messages_information_part2_emphasize" = "Avertissement"; "deactivate_account_forget_messages_information_part3" = ": les futurs utilisateurs auront alors une vue incomplรจte des conversations)"; "deactivate_account_validate_action" = "Dรฉsactiver le compte"; @@ -537,28 +537,28 @@ "room_message_reply_to_placeholder" = "Envoyer une rรฉponse (non chiffrรฉe)โ€ฆ"; "encrypted_room_message_reply_to_placeholder" = "Envoyer une rรฉponse chiffrรฉeโ€ฆ"; "room_message_reply_to_short_placeholder" = "Envoyer une rรฉponseโ€ฆ"; -"room_replacement_information" = "Ce salon a รฉtรฉ remplacรฉ et n'est plus actif."; +"room_replacement_information" = "Ce salon a รฉtรฉ remplacรฉ et nโ€™est plus actif."; "room_replacement_link" = "La conversation continue ici."; -"room_predecessor_information" = "Ce salon est la suite d'une autre conversation."; -"room_predecessor_link" = "Appuyer ici pour voir les vieux messages."; +"room_predecessor_information" = "Ce salon est la suite dโ€™une autre conversation."; +"room_predecessor_link" = "Appuyer ici pour voir les anciens messages."; "settings_labs_room_members_lazy_loading" = "Chargement diffรฉrรฉ des participants des salons"; "settings_labs_room_members_lazy_loading_error_message" = "Votre serveur d'accueil ne prend pas en charge le chargement diffรฉrรฉ des participants des salons. Rรฉessayez plus tard."; "room_event_action_view_decrypted_source" = "Voir la source dรฉchiffrรฉe"; "room_recents_server_notice_section" = "ALERTES SYSTรˆME"; "room_resource_limit_exceeded_message_contact_1" = " Veuillez "; -"room_resource_limit_exceeded_message_contact_2_link" = "contacter l'administrateur de votre service"; -"room_resource_limit_exceeded_message_contact_3" = " pour continuer ร  l'utiliser."; -"homeserver_connection_lost" = "Connexion impossible au serveur d'accueil."; -"room_resource_usage_limit_reached_message_1_default" = "Ce serveur d'accueil a dรฉpassรฉ une de ses limites de ressources donc "; -"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Ce serveur d'accueil a atteint sa limite mensuelle d'utilisateurs actifs donc "; +"room_resource_limit_exceeded_message_contact_2_link" = "contacter lโ€™administrateur de votre service"; +"room_resource_limit_exceeded_message_contact_3" = " pour continuer ร  lโ€™utiliser."; +"homeserver_connection_lost" = "Connexion impossible au serveur dโ€™accueil."; +"room_resource_usage_limit_reached_message_1_default" = "Ce serveur dโ€™accueil a dรฉpassรฉ une de ses limites de ressources donc "; +"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Ce serveur dโ€™accueil a atteint sa limite mensuelle dโ€™utilisateurs actifs donc "; "room_resource_usage_limit_reached_message_2" = "quelques utilisateurs ne pourront pas se connecter."; "room_resource_usage_limit_reached_message_contact_3" = " pour augmenter cette limite."; -"auth_accept_policies" = "Veuillez lire et accepter les politiques de ce serveur d'accueilย :"; +"auth_accept_policies" = "Veuillez lire et accepter les politiques de ce serveur dโ€™accueilย :"; "settings_key_backup" = "SAUVEGARDE DE CLร‰S"; "settings_key_backup_info_checking" = "Vรฉrificationโ€ฆ"; "settings_key_backup_info_none" = "Vos clรฉs ne sont pas sauvegardรฉes depuis cette session."; -"settings_key_backup_info_version" = "Version de sauvegarde de clรฉ : %@"; -"settings_key_backup_info_algorithm" = "Algorithme : %@"; +"settings_key_backup_info_version" = "Version de sauvegarde de clรฉย : %@"; +"settings_key_backup_info_algorithm" = "Algorithmeย : %@"; "settings_key_backup_info_valid" = "Cette session sauvegarde vos clรฉs."; "settings_key_backup_info_not_valid" = "Cette session ne sauvegarde pas vos clรฉs, mais vous avez une sauvegarde existante que vous pouvez restaurer et joindre."; "settings_key_backup_info_progress" = "Sauvegarde de %@ clรฉsโ€ฆ"; @@ -576,26 +576,26 @@ "settings_key_backup_button_delete" = "Supprimer la sauvegarde"; "settings_key_backup_button_verify" = "Vรฉrifier"; "settings_key_backup_delete_confirmation_prompt_title" = "Supprimer la sauvegarde"; -"settings_key_backup_delete_confirmation_prompt_msg" = "En รชtes-vous sรปr(e)ย ? Vous perdrez vos messages chiffrรฉs si vos clรฉs ne sont pas sauvegardรฉes correctement."; -"room_does_not_exist" = "%@ n'existe pas"; +"settings_key_backup_delete_confirmation_prompt_msg" = "En รชtes-vous sรปrย ? Vous perdrez vos messages chiffrรฉs si vos clรฉs ne sont pas sauvegardรฉes correctement."; +"room_does_not_exist" = "%@ nโ€™existe pas"; "key_backup_setup_title" = "Sauvegarde de clรฉs"; "key_backup_setup_skip_action" = "Passer"; -"key_backup_setup_skip_alert_title" = "En รชtes-vous certain(e) ?"; +"key_backup_setup_skip_alert_title" = "En รชtes-vous sรปrย ?"; "key_backup_setup_skip_alert_message" = "Vous pourriez perdre vos messages sรฉcurisรฉs si vous vous dรฉconnectez ou si vous perdez votre appareil."; "key_backup_setup_skip_alert_skip_action" = "Passer"; "key_backup_setup_intro_title" = "Ne perdez jamais vos messages chiffrรฉs"; "key_backup_setup_intro_info" = "Les messages des salons chiffrรฉs sont sรฉcurisรฉs avec un chiffrement de bout en bout. Seuls vous et le(s) destinataire(s) avez les clรฉs pour lire ces messages.\n\nSauvegardez vos clรฉs de faรงon sรฉcurisรฉe pour รฉviter de les perdre."; "key_backup_setup_intro_setup_action" = "Configurer"; -"key_backup_setup_passphrase_info" = "Nous conserverons une copie chiffrรฉe de vos clรฉs sur notre serveur. Protรฉgez votre sauvegarde avec une phrase de passe pour qu'elle soit sรฉcurisรฉe.\n\nPour une sรฉcuritรฉ maximale, elle devrait รชtre diffรฉrente du mot de passe de votre compte."; +"key_backup_setup_passphrase_info" = "Nous conserverons une copie chiffrรฉe de vos clรฉs sur notre serveur. Protรฉgez votre sauvegarde avec une phrase secrรจte pour quโ€™elle soit en sรฉcuritรฉ.\n\nPour une sรฉcuritรฉ maximale, elle devrait รชtre diffรฉrente du mot de passe de votre compte."; "key_backup_setup_passphrase_passphrase_title" = "Saisir"; -"key_backup_setup_passphrase_passphrase_placeholder" = "Saisir la phrase de passe"; -"key_backup_setup_passphrase_passphrase_valid" = "Super !"; -"key_backup_setup_passphrase_passphrase_invalid" = "Essayez d'ajouter un mot"; +"key_backup_setup_passphrase_passphrase_placeholder" = "Saisir la phrase secrรจte"; +"key_backup_setup_passphrase_passphrase_valid" = "Superย !"; +"key_backup_setup_passphrase_passphrase_invalid" = "Essayez dโ€™ajouter un mot"; "key_backup_setup_passphrase_confirm_passphrase_title" = "Confirmer"; -"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Confirmer la phrase de passe"; -"key_backup_setup_passphrase_confirm_passphrase_valid" = "Super !"; -"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Les phrases de passe ne correspondent pas"; -"key_backup_setup_passphrase_set_passphrase_action" = "Dรฉfinir la phrase de passe"; +"key_backup_setup_passphrase_confirm_passphrase_placeholder" = "Confirmer la phrase secrรจte"; +"key_backup_setup_passphrase_confirm_passphrase_valid" = "Superย !"; +"key_backup_setup_passphrase_confirm_passphrase_invalid" = "Les phrases secrรจtes ne correspondent pas"; +"key_backup_setup_passphrase_set_passphrase_action" = "Dรฉfinir la phrase secrรจte"; "key_backup_setup_recovery_key_info" = "Faites une copie de cette clรฉ de rรฉcupรฉration et conservez-la en lieu sรปr.\n\nPar mesure de prรฉcaution, vous pouvez l'utiliser pour restaurer votre historique de messages chiffrรฉs si vous oubliez votre phrase de passe de rรฉcupรฉration."; "key_backup_setup_recovery_key_recovery_key_title" = "Clรฉ de rรฉcupรฉration"; "key_backup_setup_recovery_key_make_copy_action" = "En faire une copie"; @@ -603,20 +603,20 @@ "key_backup_recover_title" = "Messages sรฉcurisรฉs"; "key_backup_recover_empty_backup_title" = "Sauvegarde vide"; "key_backup_recover_empty_backup_message" = "Il n'y a aucune clรฉ ร  restaurer"; -"key_backup_recover_from_passphrase_info" = "Utilisez votre phrase de passe de rรฉcupรฉration pour dรฉverrouiller votre historique de messages sรฉcurisรฉs"; +"key_backup_recover_from_passphrase_info" = "Utilisez votre phrase secrรจte de rรฉcupรฉration pour dรฉverrouiller votre historique de messages sรฉcurisรฉs"; "key_backup_recover_from_passphrase_passphrase_title" = "Saisir"; -"key_backup_recover_from_passphrase_passphrase_placeholder" = "Saisir la phrase de passe"; -"key_backup_recover_from_passphrase_recover_action" = "Dรฉverrouiller l'historique"; -"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Vous ne connaissez pas votre phrase de passe de rรฉcupรฉration ? Vous pouvez "; +"key_backup_recover_from_passphrase_passphrase_placeholder" = "Saisir la phrase secrรจte"; +"key_backup_recover_from_passphrase_recover_action" = "Dรฉverrouiller lโ€™historique"; +"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Vous ne connaissez pas votre phrase secrรจte de rรฉcupรฉrationย ? Vous pouvez "; "key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "utiliser votre clรฉ de rรฉcupรฉration"; "key_backup_recover_from_passphrase_lost_passphrase_action_part3" = "."; -"key_backup_recover_from_recovery_key_info" = "Utiliser votre clรฉ de rรฉcupรฉration pour dรฉverrouiller l'historique de vos messages sรฉcurisรฉs"; +"key_backup_recover_from_recovery_key_info" = "Utiliser votre clรฉ de rรฉcupรฉration pour dรฉverrouiller lโ€™historique de vos messages sรฉcurisรฉs"; "key_backup_recover_from_recovery_key_recovery_key_title" = "Saisir"; "key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Saisir la clรฉ de rรฉcupรฉration"; -"key_backup_recover_from_recovery_key_recover_action" = "Dรฉverrouiller l'historique"; -"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Vous avez perdu votre clรฉ de rรฉcupรฉration ? Vous pouvez en configurer une autre dans les rรฉglages."; -"key_backup_recover_success_info" = "Sauvegarde restaurรฉe !"; -"key_backup_recover_done_action" = "Effectuรฉ"; +"key_backup_recover_from_recovery_key_recover_action" = "Dรฉverrouiller lโ€™historique"; +"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Vous avez perdu votre clรฉ de rรฉcupรฉrationย ? Vous pouvez en configurer une autre dans les rรฉglages."; +"key_backup_recover_success_info" = "Sauvegarde restaurรฉeย !"; +"key_backup_recover_done_action" = "Terminรฉ"; "key_backup_setup_banner_title_part1" = "Configurer la rรฉcupรฉration de messages sรฉcurisรฉe"; "key_backup_setup_banner_title_part2" = " pour ne jamais perdre vos messages chiffrรฉs"; "key_backup_recover_banner_title_part1" = "Lancer la rรฉcupรฉration de messages sรฉcurisรฉe"; @@ -626,54 +626,54 @@ "settings_key_backup_button_use" = "Utiliser la sauvegarde de clรฉs"; "key_backup_setup_intro_setup_action_without_existing_backup" = "Commencer ร  utiliser la sauvegarde de clรฉs"; "key_backup_setup_intro_setup_action_with_existing_backup" = "Utiliser la sauvegarde de clรฉs"; -"key_backup_setup_passphrase_title" = "Protรฉgez votre sauvegarde avec une phrase de passe"; +"key_backup_setup_passphrase_title" = "Protรฉgez votre sauvegarde avec une phrase secrรจte"; "key_backup_setup_passphrase_setup_recovery_key_info" = "Sinon, protรฉgez votre sauvegarde avec une clรฉ de rรฉcupรฉration, en la conservant dans un endroit sรปr."; "key_backup_setup_passphrase_setup_recovery_key_action" = "(Avancรฉ) Configurer avec la clรฉ de rรฉcupรฉration"; "key_backup_setup_success_title" = "Terminรฉย !"; // Success from passphrase -"key_backup_setup_success_from_passphrase_info" = "Vos clรฉs sont en cours de sauvegarde.\n\nVotre clรฉ de rรฉcupรฉration est une mesure de prรฉcaution. Vous pouvez l'utiliser pour restaurer l'accรจs ร  vos messages chiffrรฉs si vous oubliez votre phrase de passe.\n\nConservez votre clรฉ de rรฉcupรฉration dans un lieu trรจs sรปr, comme un gestionnaire de mots de passe (ou un coffre-fort)."; +"key_backup_setup_success_from_passphrase_info" = "Vos clรฉs sont en cours de sauvegarde.\n\nVotre clรฉ de rรฉcupรฉration est une mesure de prรฉcaution. Vous pouvez lโ€™utiliser pour restaurer l'accรจs ร  vos messages chiffrรฉs si vous oubliez votre phrase de passe.\n\nConservez votre clรฉ de rรฉcupรฉration dans un lieu trรจs sรปr, comme un gestionnaire de mots de passe (ou un coffre-fort)."; "key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Sauvegarder la clรฉ de rรฉcupรฉration"; "key_backup_setup_success_from_passphrase_done_action" = "Terminรฉ"; // Success from recovery key "key_backup_setup_success_from_recovery_key_info" = "Vos clรฉs sont en cours de sauvegarde.\n\nFaites une copie de cette clรฉ de rรฉcupรฉration et conservez-la en lieu sรปr."; "key_backup_setup_success_from_recovery_key_recovery_key_title" = "Clรฉ de rรฉcupรฉration"; "key_backup_setup_success_from_recovery_key_make_copy_action" = "En faire une copie"; -"key_backup_setup_success_from_recovery_key_made_copy_action" = "J'ai fait une copie"; -"key_backup_recover_invalid_passphrase_title" = "Phrase de passe de rรฉcupรฉration incorrecte"; -"key_backup_recover_invalid_passphrase" = "La sauvegarde n'a pas pu รชtre dรฉchiffrรฉe avec cette phrase de passeย : vรฉrifiez que vous avez saisi la bonne phrase de passe de rรฉcupรฉration."; +"key_backup_setup_success_from_recovery_key_made_copy_action" = "Jโ€™en ai fait une copie"; +"key_backup_recover_invalid_passphrase_title" = "Phrase secrรจte de rรฉcupรฉration incorrecte"; +"key_backup_recover_invalid_passphrase" = "La sauvegarde nโ€™a pas pu รชtre dรฉchiffrรฉe avec cette phrase secrรจteย : vรฉrifiez que vous avez saisi la bonne phrase secrรจte de rรฉcupรฉration."; "key_backup_recover_invalid_recovery_key_title" = "La clรฉ de rรฉcupรฉration ne correspond pas"; -"key_backup_recover_invalid_recovery_key" = "La sauvegarde n'a pas pu รชtre dรฉchiffrรฉe avec cette clรฉย : vรฉrifiez que vous avez saisi la bonne clรฉ de rรฉcupรฉration."; +"key_backup_recover_invalid_recovery_key" = "La sauvegarde nโ€™a pas pu รชtre dรฉchiffrรฉe avec cette clรฉย : vรฉrifiez que vous avez saisi la bonne clรฉ de rรฉcupรฉration."; "key_backup_setup_banner_title" = "Ne perdez jamais vos messages chiffrรฉs"; "key_backup_setup_banner_subtitle" = "Commencez ร  utiliser la sauvegarde de clรฉs"; "key_backup_recover_banner_title" = "Ne perdez jamais vos messages chiffrรฉs"; "key_backup_recover_banner_subtitle" = "Utilisez la sauvegarde de clรฉs"; "sign_out_existing_key_backup_alert_title" = "Voulez-vous vraiment vous dรฉconnecterย ?"; "sign_out_existing_key_backup_alert_sign_out_action" = "Se dรฉconnecter"; -"sign_out_non_existing_key_backup_alert_title" = "Vous n'aurez plus accรจs ร  vos messages chiffrรฉs si vous vous dรฉconnectez maintenant"; +"sign_out_non_existing_key_backup_alert_title" = "Vous nโ€™aurez plus accรจs ร  vos messages chiffrรฉs si vous vous dรฉconnectez maintenant"; "sign_out_non_existing_key_backup_alert_setup_key_backup_action" = "Commencer ร  utiliser la sauvegarde de clรฉs"; "sign_out_non_existing_key_backup_alert_discard_key_backup_action" = "Je ne veux pas de mes messages chiffrรฉs"; "sign_out_non_existing_key_backup_sign_out_confirmation_alert_title" = "Vous perdrez vos messages chiffrรฉs"; -"sign_out_non_existing_key_backup_sign_out_confirmation_alert_message" = "Vous n'aurez plus accรจs ร  vos messages chiffrรฉs sauf si vous sauvegardez vos clรฉs avant de vous dรฉconnecter."; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_message" = "Vous nโ€™aurez plus accรจs ร  vos messages chiffrรฉs sauf si vous sauvegardez vos clรฉs avant de vous dรฉconnecter."; "sign_out_non_existing_key_backup_sign_out_confirmation_alert_sign_out_action" = "Se dรฉconnecter"; "sign_out_non_existing_key_backup_sign_out_confirmation_alert_backup_action" = "Sauvegarde"; -"sign_out_key_backup_in_progress_alert_title" = "Sauvegarde de clรฉs en cours. Si vous vous dรฉconnectez maintenant vous n'aurez plus accรจs ร  vos messages chiffrรฉs."; +"sign_out_key_backup_in_progress_alert_title" = "Sauvegarde de clรฉs en cours. Si vous vous dรฉconnectez maintenant vous nโ€™aurez plus accรจs ร  vos messages chiffrรฉs."; "sign_out_key_backup_in_progress_alert_discard_key_backup_action" = "Je ne veux plus de mes messages chiffrรฉs"; "sign_out_key_backup_in_progress_alert_cancel_action" = "Je vais patienter"; // Key backup wrong version "e2e_key_backup_wrong_version_title" = "Nouvelle sauvegarde de clรฉs"; -"e2e_key_backup_wrong_version" = "Une nouvelle sauvegarde de clรฉs de messages sรฉcurisรฉs a รฉtรฉ dรฉtectรฉe.\n\nSi cela ne vient pas de vous, dรฉfinissez une nouvelle phrase de passe dans les paramรจtres."; +"e2e_key_backup_wrong_version" = "Une nouvelle sauvegarde de clรฉs de messages sรฉcurisรฉs a รฉtรฉ dรฉtectรฉe.\n\nSi cela ne vient pas de vous, dรฉfinissez une nouvelle phrase secrรจte dans les paramรจtres."; "e2e_key_backup_wrong_version_button_settings" = "Paramรจtres"; "e2e_key_backup_wrong_version_button_wasme" = "ร‡a vient de moi"; "key_backup_setup_intro_manual_export_info" = "(Avancรฉ)"; "key_backup_setup_intro_manual_export_action" = "Exporter les clรฉs manuellement"; // String for App Store "store_short_description" = "Discussions et appels sรฉcurisรฉs et dรฉcentralisรฉs"; -"store_full_description" = "Element est un nouveau type d'application de chat et de collaboration qui permet de :\n\n1. Vous place en control afin de vous permettre de prรฉserver votre vie privรฉe \n2. Vous permet de communiquer avec n'importe qui du rรฉseau Matrix, et mรชme plus en intรฉgrants des implications tel que Slack \n3. Vous protรจge des pubs, du datamining , des porte dรฉrobรฉes et des walled gardens\n4. Vous sรฉcurise ร  travers une inscription de bout en bout, avec des co-enregistrement pour vรฉrifier les autres\n\nElement est totalement differents des autres applications de chat et de collaboration puisqu'il est dรฉcentralisรฉ et open source.\n\nElement vous place en control en vous laissant choisir qui sont les hรดtes de vos conversations. Depuis l'application Element, vous pouvez รชtre un hรดte de diffรฉrentes faรงons: \n\n1. Obtenez un compte gratuitement sur les serveurs publics de matrix.org\n2. Host votre compte ร  l'aide de votre propre serveur et matรฉrielle\n3. Inscrivez vous pour un compte sur un serveur customisรฉ simplement en vous abonnant a la plateforme hรดte de Services Matrix Element\n\nPourquoi choisir Element ?\n\nโ€ข COMMUNICATION COMPLรˆTE : Construisez des salons autours de vos รฉquipes, de vos amis, de votre communautรฉ comme vous le souhaitez ! Discutez, partagez des fichiers, ajoutez des widgets et passez des appels audio et vidรฉo gratuitement.\n\nโ€ข INTร‰GRATIONS PUISSANTES : Utilisez Element avec les outils que vous connaissez dรฉjร . Avec Element vous pouvez mรชme discuter avec les utilisateurs et les groupes qui utilisent d'autres applications de discussion.\n\nโ€ข PRIVร‰ ET Sร‰CURISร‰ : Gardez vos conversations secrรจtes. Un chiffrement de bout en bout de pointe vous garanti que vos communications privรฉes restent privรฉes.\n\nโ€ข OUVERT, PAS FERMร‰ : Open source, et construit autour de Matrix. Restez en possession de vos donnรฉes en hรฉbergeant votre propre serveur, ou choisissez celui auquel vous faites confiance.\n\nโ€ข PARTOUT Oร™ VOUS รŠTES : Restez en contact oรน que vous soyez avec la synchronisation complรจte de l'historique de vos messages entre vos diffรฉrents appareils et en ligne sur https://app.element.io."; -"auth_login_single_sign_on" = "Se connecter avec l'authentification unique"; +"store_full_description" = "Element est un nouveau type dโ€™application de messagerie et de collaboration quiย :\n\n1. Vous permet de prรฉserver votre vie privรฉe \n2. Vous permet de communiquer avec nโ€™importe qui sur le rรฉseau Matrix, et mรชme plus en intรฉgrant des applications telles que Slack \n3. Vous protรจge des pubs, du de lโ€™extraction de vos donnรฉes, des porte dรฉrobรฉes et des silos\n4. Vous protรจge avec le chiffrement de bout en bout et la signature croisรฉe pour vรฉrifier lโ€™identitรฉ des autres\n\nElement est totalement diffรฉrent des autres applications de messagerie et de collaboration puisquโ€™il est dรฉcentralisรฉ et open source.\n\nElement vous permet de vous auto-hรฉberger, ou de choisir un serveur, pour vous permettre de garder la main sur votre confidentialitรฉ, vos donnรฉes et vous conversations. Il vous permet dโ€™accรฉder ร  un rรฉseau ouvert, de sorte ร  ce que vous ne soyez pas limitรฉ aux discussions avec les autres utilisateurs dโ€™Element exclusivement. Il est trรจs sรฉcurisรฉ.\n\nElement sโ€™appuie sur Matrix - la norme pour les communications ouvertes et dรฉcentralisรฉes.\n\nElement vous permet de choisir qui hรฉberge vos conversations. Depuis lโ€™application Element, vous pouvez choisir votre fournisseur de plusieurs maniรจresย :\n\n1. Inscrivez vous gratuitement sur les serveurs publics de matrix.org\n2. Hรฉbergez votre compte sur votre propre serveur\n3. Obtenez un serveur personnalisรฉ en vous abonnant a la plateforme dโ€™hรฉbergement Element Matrix Services\n\nPourquoi choisir Elementย ?\n\nVOS DONNร‰ES VOUS APPARTIENNENTย : vous dรฉcidez oรน stocker vos donnรฉes et messages. Ils vous appartiennent et vous les maรฎtrisez. Aucune multinationale ne viendra extraire vos donnรฉes pour les envoyer au plus offrant.\n\nMESSAGERIE ET COLLABORATION OUVERTESย : vous pouvez discuter avec tout le rรฉseau Matrix, quโ€™ils utilisent Element ou une autre application Matrix, mรชme sโ€™ils utilisent une autre plateforme de messagerie telle que Slack, IRC ou XMPP.\n\nULTRA Sร‰CURISร‰ย : chiffrement de bout en bout (seuls les membres dโ€™une conversation peuvent dรฉchiffrer les messages), et signature croisรฉe pour vรฉrifier les appareils de vos interlocuteurs.\n\nTOUTES VOS COMMUNICATIONSย : messagerie, appels audio et vidรฉo, partage de fichier, partage dโ€™รฉcran et un grand nombre dโ€™intรฉgrations, robots et widgets. Participez ร  des salons, des communautรฉs, restez en contact et faites avancer vos projets.\n\nPARTOUT AVEC VOUSย : votre historique reste synchronisรฉ entre tous vos appareils et sur le web sur https://element.io/app."; +"auth_login_single_sign_on" = "Se connecter avec lโ€™authentification unique"; "room_message_unable_open_link_error_message" = "Impossible dโ€™ouvrir le lien."; "auth_autodiscover_invalid_response" = "Rรฉponse de dรฉcouverte du serveur dโ€™accueil non valide"; "room_event_action_reply" = "Rรฉpondre"; -"room_event_action_edit" = "ร‰diter"; +"room_event_action_edit" = "Modifier"; "room_event_action_reaction_agree" = "Dโ€™accord %@"; "room_event_action_reaction_disagree" = "Pas dโ€™accord %@"; "room_event_action_reaction_like" = "Jโ€™aime %@"; @@ -691,7 +691,7 @@ "device_verification_error_cannot_load_device" = "Impossible de charger les informations de la session."; // Mark: Incoming "device_verification_incoming_title" = "Demande de vรฉrification entrante"; -"device_verification_incoming_description_1" = "Vรฉrifiez cette session pour quโ€™elle soit marquรฉe comme fiable. Faire confiance aux sessions de vos partenaires vous permet dโ€™รชtre sereins quand vous utilisez des messages chiffrรฉs de bout en bout."; +"device_verification_incoming_description_1" = "Vรฉrifiez cette session pour quโ€™elle soit marquรฉe comme fiable. Faire confiance aux sessions de vos partenaires vous permet dโ€™รชtre tranquilles quand vous utilisez des messages chiffrรฉs de bout en bout."; "device_verification_incoming_description_2" = "En vรฉrifiant cette session, elle sera marquรฉe comme fiable, et votre session sera aussi marquรฉe comme fiable pour votre partenaire."; // MARK: Start "device_verification_start_title" = "Vรฉrifier en comparant une chaรฎne de caractรจres courte"; @@ -773,7 +773,7 @@ "device_verification_emoji_headphones" = "ร‰couteurs"; "device_verification_emoji_folder" = "Dossier"; "device_verification_emoji_pin" = "ร‰pingle"; -"event_formatter_message_edited_mention" = "(รฉditรฉ)"; +"event_formatter_message_edited_mention" = "(modifiรฉ)"; // Widget "widget_no_integrations_server_configured" = "Aucun serveur dโ€™intรฉgrations nโ€™est configurรฉ"; "widget_integrations_server_failed_to_connect" = "ร‰chec de connexion au serveur dโ€™intรฉgrations"; @@ -781,25 +781,25 @@ "room_event_action_reaction_show_all" = "Tout afficher"; "room_event_action_reaction_show_less" = "Rรฉduire"; "close" = "Fermer"; -"room_message_edits_history_title" = "ร‰ditions de message"; +"room_message_edits_history_title" = "Modifications du message"; "room_action_send_file" = "Envoyer un fichier"; // MARK: File upload "file_upload_error_title" = "Envoi de fichier"; "file_upload_error_unsupported_file_type_message" = "Type de fichier non pris en charge."; -"auth_softlogout_signed_out" = "Vous รชtes dรฉconnectรฉ(e)"; +"auth_softlogout_signed_out" = "Vous รชtes dรฉconnectรฉ"; "auth_softlogout_sign_in" = "Se connecter"; "auth_softlogout_reason" = "Lโ€™administrateur de votre serveur dโ€™accueil (%1$@) vous a dรฉconnectรฉ de votre compte %2$@ (%3$@)."; "auth_softlogout_recover_encryption_keys" = "Connectez-vous pour rรฉcupรฉrer les clรฉs de chiffrement stockรฉes uniquement sur cet appareil. Vous en avez besoin pour lire tous les messages sรฉcurisรฉs sur nโ€™importe quel appareil."; "auth_softlogout_clear_data" = "Effacer les donnรฉes personnelles"; -"auth_softlogout_clear_data_message_1" = "Attentionย : Vos donnรฉes personnelles (y compris vos clรฉs de chiffrement) sont toujours stockรฉes sur cet appareil."; +"auth_softlogout_clear_data_message_1" = "Attentionย : vos donnรฉes personnelles (y compris vos clรฉs de chiffrement) sont toujours stockรฉes sur cet appareil."; "auth_softlogout_clear_data_message_2" = "Effacez-les si vous nโ€™utilisez plus cet appareil ou si vous voulez vous connecter avec un autre compte."; "auth_softlogout_clear_data_button" = "Effacer toutes les donnรฉes"; -"auth_softlogout_clear_data_sign_out_title" = "En รชtes-vous sรปr(e)ย ?"; +"auth_softlogout_clear_data_sign_out_title" = "En รชtes-vous sรปrย ?"; "auth_softlogout_clear_data_sign_out_msg" = "Voulez vous vraiment supprimer toutes les donnรฉes stockรฉes actuellement sur cet appareilย ? Reconnectez-vous pour accรฉder aux donnรฉes et messages de votre compte."; "auth_softlogout_clear_data_sign_out" = "Se dรฉconnecter"; // MARK: Emoji picker "emoji_picker_title" = "Rรฉactions"; -"emoji_picker_people_category" = "ร‰moticรดnes et personnes"; +"emoji_picker_people_category" = "ร‰mojis et personnes"; "emoji_picker_nature_category" = "Animaux et nature"; "emoji_picker_foods_category" = "Nourriture et boisson"; "emoji_picker_activity_category" = "Activitรฉs"; @@ -817,8 +817,8 @@ "image_picker_action_camera" = "Prendre une photo"; "image_picker_action_library" = "Choisir dans la mรฉdiathรจque"; "camera_unavailable" = "Lโ€™appareil photo nโ€™est pas disponible sur votre appareil"; -"photo_library_access_not_granted" = "%@ nโ€™a pas la permission pour accรฉder ร  la mรฉdiathรจque, veuillez modifier les options de vie privรฉe"; -"auth_forgot_password_error_no_configured_identity_server" = "Aucun serveur dโ€™identitรฉ nโ€™est configurรฉ : ajoutez-en un pour rรฉinitialiser votre mot de passe."; +"photo_library_access_not_granted" = "%@ nโ€™a pas la permission pour accรฉder ร  la mรฉdiathรจque, veuillez modifier les options de confidentialitรฉ"; +"auth_forgot_password_error_no_configured_identity_server" = "Aucun serveur dโ€™identitรฉ nโ€™est configurรฉย : ajoutez-en un pour rรฉinitialiser votre mot de passe."; "room_creation_error_invite_user_by_email_without_identity_server" = "Aucun serveur dโ€™identitรฉ nโ€™est configurรฉ donc vous ne pouvez pas ajouter de participant avec un e-mail."; "room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Aucun serveur dโ€™identitรฉ nโ€™est configurรฉ donc vous ne pouvez pas commencer de discussion avec un contact en utilisant un e-mail."; // Service terms @@ -826,8 +826,8 @@ "service_terms_modal_message" = "Pour continuer vous devez accepter les conditions de ce service (%@)."; "service_terms_modal_accept_button" = "Accepter"; "service_terms_modal_description_for_identity_server" = "Se rendre dรฉcouvrable pour les autres"; -"service_terms_modal_description_for_integration_manager" = "Utiliser des robots, des passerelles, des widgets et des packs de stickers"; -"room_participants_remove_third_party_invite_prompt_msg" = "Voulez-vous vraiment retirer cette invitation ?"; +"service_terms_modal_description_for_integration_manager" = "Utiliser des robots, des passerelles, des widgets et des jeux dโ€™autocollants"; +"room_participants_remove_third_party_invite_prompt_msg" = "Voulez-vous vraiment retirer cette invitationย ?"; // Errors "error_user_already_logged_in" = "On dirait que vous essayez de vous connecter ร  un autre serveur dโ€™accueil. Voulez-vous vous dรฉconnecterย ?"; "room_accessiblity_scroll_to_bottom" = "Dรฉfiler vers le bas"; @@ -841,14 +841,14 @@ "media_type_accessibility_video" = "Vidรฉo"; "media_type_accessibility_location" = "Emplacement"; "media_type_accessibility_file" = "Fichier"; -"media_type_accessibility_sticker" = "Sticker"; +"media_type_accessibility_sticker" = "Autocollant"; // Widget Picker "widget_picker_title" = "Intรฉgrations"; "auth_add_email_message_2" = "Dรฉfinissez une adresse e-mail pour la rรฉcupรฉration de compte, et pour รชtre รฉventuellement dรฉcouvrable par les personnes qui vous connaissent."; "auth_add_phone_message_2" = "Dรฉfinissez un numรฉro de tรฉlรฉphone pour รชtre รฉventuellement dรฉcouvrable par les personnes qui vous connaissent."; "auth_add_email_phone_message_2" = "Dรฉfinissez une adresse e-mail pour la rรฉcupรฉration de compte. Vous pouvez ensuite utiliser votre e-mail ou votre numรฉro de tรฉlรฉphone pour รชtre dรฉcouvrable par les personnes qui vous connaissent."; -"auth_email_is_required" = "Aucun serveur dโ€™identitรฉ nโ€™est configurรฉ donc vous ne pouvez pas ajouter dโ€™adresse e-mail pour pouvoir rรฉinitialiser votre mot de passe dans le futur."; -"auth_phone_is_required" = "Aucun serveur dโ€™identitรฉ nโ€™est configurรฉ donc vous ne pouvez pas ajouter de numรฉro de tรฉlรฉphone pour pouvoir rรฉinitialiser votre mot de passe dans le futur."; +"auth_email_is_required" = "Aucun serveur dโ€™identitรฉ nโ€™est configurรฉ donc vous ne pouvez pas ajouter dโ€™adresse e-mail pour pouvoir rรฉinitialiser votre mot de passe ultรฉrieurement."; +"auth_phone_is_required" = "Aucun serveur dโ€™identitรฉ nโ€™est configurรฉ donc vous ne pouvez pas ajouter de numรฉro de tรฉlรฉphone pour pouvoir rรฉinitialiser votre mot de passe ultรฉrieurement."; "auth_reset_password_error_is_required" = "Aucun serveur dโ€™identitรฉ nโ€™est configurรฉย : ajoutez-en un dans les options du serveur pour rรฉinitialiser votre mot de passe."; "contacts_address_book_no_identity_server" = "Aucun serveur dโ€™identitรฉ nโ€™est configurรฉ"; "settings_discovery_settings" = "Dร‰COUVERTE"; @@ -911,7 +911,7 @@ "settings_add_3pid_password_title_email" = "Ajouter une adresse e-mail"; "settings_add_3pid_password_title_msidsn" = "Ajouter un numรฉro de tรฉlรฉphone"; "settings_add_3pid_password_message" = "Pour continuer, saisissez votre mot de passe"; -"settings_add_3pid_invalid_password_message" = "Mot de passe non valide"; +"settings_add_3pid_invalid_password_message" = "Informations dโ€™authentification invalides"; "error_not_supported_on_mobile" = "Vous ne pouvez pas faire cela depuis %@ mobile."; "widget_menu_refresh" = "Actualiser"; "widget_menu_open_outside" = "Ouvrir dans le navigateur"; @@ -919,7 +919,7 @@ "widget_menu_remove" = "Supprimer pour tout le monde"; "settings_integrations" = "INTร‰GRATIONS"; "settings_integrations_allow_button" = "Gรฉrer les intรฉgrations"; -"settings_integrations_allow_description" = "Utilisez un gestionnaire dโ€™intรฉgrations (%@) pour gรฉrer les bots, les passerelles, les widgets et les packs de stickers.\n\nLes gestionnaires dโ€™intรฉgration reรงoivent des donnรฉes de configuration et peuvent modifier les widgets, envoyer des invitations de salon et dรฉfinir des rangs ร  votre place."; +"settings_integrations_allow_description" = "Utilisez un gestionnaire dโ€™intรฉgrations (%@) pour gรฉrer les robots, les passerelles, les widgets et les jeux dโ€™autocollants.\n\nLes gestionnaires dโ€™intรฉgration reรงoivent des donnรฉes de configuration et peuvent modifier les widgets, envoyer des invitations de salon et dรฉfinir des rangs ร  votre place."; "widget_integration_manager_disabled" = "Vous devez activer le gestionnaire dโ€™intรฉgrations dans les paramรจtres"; "widget_room_permission_title" = "Charger le widget"; "widget_room_permission_creator_info_title" = "Ce widget a รฉtรฉ ajoutรฉ parย :"; @@ -929,7 +929,7 @@ "room_widget_permission_creator_info_title" = "Ce widget a รฉtรฉ ajoutรฉ parย :"; "room_widget_permission_webview_information_title" = "Son utilisation peut entraรฎner lโ€™utilisation de cookies et le partage de donnรฉes avec %@ย :\n"; "room_widget_permission_information_title" = "Son utilisation peut entraรฎner le partage de donnรฉes avec %@ย :\n"; -"room_widget_permission_display_name_permission" = "Votre nom affichรฉ"; +"room_widget_permission_display_name_permission" = "Votre nom dโ€™affichage"; "room_widget_permission_avatar_url_permission" = "Lโ€™URL de votre avatar"; "room_widget_permission_user_id_permission" = "Votre identifiant dโ€™utilisateur"; "room_widget_permission_theme_permission" = "Votre thรจme"; @@ -985,10 +985,10 @@ "key_verification_verified_user_description_1" = "Vous avez vรฉrifiรฉ cet utilisateur."; "key_verification_verified_user_description_2" = "Les messages avec cet utilisateur dans ce salon sont chiffrรฉs de bout en bout et ne peuvent รชtre lus par des tiers."; "user_verification_start_verify_action" = "Commencer la vรฉrification"; -"user_verification_start_information_part1" = "Pour une meilleur sรฉcuritรฉ, vรฉrifiez "; +"user_verification_start_information_part1" = "Pour plus de sรฉcuritรฉ, vรฉrifiez "; "user_verification_start_information_part2" = " en comparant un code ร  usage unique sur vos deux appareils."; "user_verification_start_waiting_partner" = "Nous attendons %@โ€ฆ"; -"user_verification_start_additional_information" = "Pour une meilleure sรฉcuritรฉ, faites cela en personne ou utilisez un autre moyen de communication."; +"user_verification_start_additional_information" = "Pour plus de sรฉcuritรฉ, faites cela en personne ou utilisez un autre moyen de communication."; "user_verification_sessions_list_user_trust_level_trusted_title" = "Fiable"; "user_verification_sessions_list_user_trust_level_warning_title" = "Attention"; "user_verification_sessions_list_user_trust_level_unknown_title" = "Inconnu"; @@ -1027,7 +1027,7 @@ "device_verification_self_verify_start_information" = "Utilisez cette session pour vรฉrifier la nouvelle, ce qui lui permettra dโ€™accรฉder aux messages chiffrรฉs."; "device_verification_self_verify_start_waiting" = "En attenteโ€ฆ"; "skip" = "Passer"; -"device_verification_self_verify_wait_title" = "Complรฉter la sรฉcuritรฉ"; +"device_verification_self_verify_wait_title" = "Amรฉliorer la sรฉcuritรฉ"; "device_verification_self_verify_wait_information" = "Vรฉrifiez cette session depuis une de vos autres sessions, ce qui lui permettra dโ€™avoir accรจs aux messages chiffrรฉs.\n\nUtilisez la derniรจre version de Element sur vos autres appareilsย :"; "device_verification_self_verify_wait_waiting" = "En attenteโ€ฆ"; "room_member_power_level_admin_in" = "Administrateur dans %@"; @@ -1046,16 +1046,16 @@ "key_verification_scan_confirmation_scanned_title" = "On y est presqueย !"; "key_verification_scan_confirmation_scanned_user_information" = "Est-ce que %@ affiche le mรชme bouclierย ?"; "key_verification_scan_confirmation_scanned_device_information" = "Est-ce que lโ€™autre appareil affiche le mรชme bouclierย ?"; -"room_participants_action_security_status_complete_security" = "Complรฉter la sรฉcuritรฉ"; +"room_participants_action_security_status_complete_security" = "Amรฉliorer la sรฉcuritรฉ"; "security_settings_crosssigning_info_not_bootstrapped" = "La signature croisรฉe nโ€™est pas encore configurรฉe."; -"security_settings_crosssigning_info_exists" = "Votre compte a une identitรฉ de signature croisรฉe, mais cette session ne lui fait pas encore confiance. Complรฉtez la sรฉcuritรฉ de cette session."; -"security_settings_crosssigning_info_trusted" = "La signature croisรฉe est activรฉe. Vous pouvez faire confiance ร  dโ€™autres utilisateurs et ร  vos autres sessions selon la signature croisรฉe mais vous ne pouvez pas effectuer des signatures croisรฉes depuis cette session car elle nโ€™a pas de clรฉs privรฉes de signature croisรฉe. Complรฉtez la sรฉcuritรฉ de cette session."; +"security_settings_crosssigning_info_exists" = "Votre compte a une identitรฉ de signature croisรฉe, mais cette session ne lui fait pas encore confiance. Amรฉliorez la sรฉcuritรฉ de cette session."; +"security_settings_crosssigning_info_trusted" = "La signature croisรฉe est activรฉe. Vous pouvez faire confiance ร  dโ€™autres utilisateurs et ร  vos autres sessions selon la signature croisรฉe mais vous ne pouvez pas effectuer des signatures croisรฉes depuis cette session car elle nโ€™a pas de clรฉs privรฉes de signature croisรฉe. Amรฉliorez la sรฉcuritรฉ de cette session."; "security_settings_crosssigning_info_ok" = "La signature croisรฉe est activรฉe."; "security_settings_crosssigning_bootstrap" = "Configurer la signature croisรฉe"; "security_settings_crosssigning_reset" = "Rรฉinitialiser la signature croisรฉe"; "security_settings_crosssigning_complete_security" = "Complรฉter la sรฉcuritรฉ"; -"security_settings_complete_security_alert_title" = "Complรฉter la sรฉcuritรฉ"; -"security_settings_complete_security_alert_message" = "Vous devriez dโ€™abord complรฉter la sรฉcuritรฉ de votre session actuelle."; +"security_settings_complete_security_alert_title" = "Amรฉliorer la sรฉcuritรฉ"; +"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 Element iOS. Utilisez un autre client Matrix pour le configurer. Element iOS lโ€™utilisera."; // MARK: Clients "client_desktop_name" = "Element pour ordinateur"; @@ -1063,7 +1063,7 @@ "client_ios_name" = "Element iOS"; "client_android_name" = "Element Android"; "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" = "ou un autre client Matrix qui prend 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"; @@ -1079,7 +1079,7 @@ "key_verification_verified_other_session_information" = "Vous pouvez ร  prรฉsent lire les messages sรฉcurisรฉs sur votre autre session, et les autres utilisateurs sauront quโ€™ils peuvent lui faire confiance."; "key_verification_verified_new_session_information" = "Vous pouvez ร  prรฉsent lire les messages sรฉcurisรฉs sur votre nouvel appareil et les autres utilisateurs sauront quโ€™ils peuvent lui faire confiance."; "key_verification_verified_this_session_information" = "Vous pouvez ร  prรฉsent lire les messages sรฉcurisรฉs sur cet appareil et les autres utilisateurs sauront quโ€™ils peuvent lui faire confiance."; -"key_verification_verified_user_information" = "Les messages avec cet utilisateurs sont chiffrรฉs de bout en bout et ne peuvent รชtre lus par des tiers."; +"key_verification_verified_user_information" = "Les messages avec cet utilisateur sont chiffrรฉs de bout en bout et ne peuvent รชtre lus par des tiers."; "key_verification_verify_qr_code_emoji_information" = "Vรฉrifier en comparant des รฉmojis uniques."; "key_verification_verify_qr_code_start_emoji_action" = "Vรฉrifier par รฉmojis"; "device_verification_self_verify_alert_validate_action" = "Vรฉrifier"; @@ -1125,8 +1125,8 @@ "secure_key_backup_setup_intro_use_security_key_title" = "Utiliser une clรฉ de sรฉcuritรฉ"; "secure_key_backup_setup_intro_use_security_key_info" = "Gรฉnรฉrer une clรฉ de sรฉcuritรฉ ร  stocker dans un endroit sรปr comme un gestionnaire de mots de passe ou un coffre."; "secure_key_backup_setup_intro_use_security_passphrase_title" = "Utiliser une phrase secrรจte de sรฉcuritรฉ"; -"secure_key_backup_setup_intro_use_security_passphrase_info" = "Saisissez une phrase secrรจte que vous รชtes seulยทe ร  connaรฎtre et gรฉnรฉrez une clรฉ pour la sauvegarde."; -"secure_key_backup_setup_cancel_alert_title" = "En รชtes-vous sรปrยทeย ?"; +"secure_key_backup_setup_intro_use_security_passphrase_info" = "Saisissez une phrase secrรจte que vous รชtes seul ร  connaรฎtre et gรฉnรฉrez une clรฉ pour la sauvegarde."; +"secure_key_backup_setup_cancel_alert_title" = "En รชtes-vous sรปrย ?"; "secure_key_backup_setup_cancel_alert_message" = "Si vous annulez maintenant, vous pourriez perdre les messages et donnรฉes chiffrรฉs si vous perdez lโ€™accรจs ร  vos connexions.\n\nVous pouvez รฉgalement configurer la sauvegarde sรฉcurisรฉe et gรฉrer vos clรฉs dans les paramรจtres."; "secrets_setup_recovery_key_title" = "Enregistrer votre clรฉ de sรฉcuritรฉ"; "secrets_setup_recovery_key_information" = "Stockez votre clรฉ de rรฉcupรฉration dans un endroit sรปr. Elle peut รชtre utilisรฉe pour dรฉverrouiller vos messages et donnรฉes chiffrรฉs."; @@ -1136,7 +1136,7 @@ "secrets_setup_recovery_key_storage_alert_title" = "Conservez-la en lieu sรปr"; "secrets_setup_recovery_key_storage_alert_message" = "โœ“ Imprimez-la et stockez-la dans un endroit sรปr\nโœ“ Sauvegardez-la sur une clรฉ USB ou un disque de sauvegarde\nโœ“ Copiez-la sur votre stockage personnel dans le cloud"; "secrets_setup_recovery_passphrase_title" = "Dรฉfinir une phrase de sรฉcuritรฉ"; -"secrets_setup_recovery_passphrase_information" = "Saisissez une phrase de sรฉcuritรฉ que vous seulยทe connaissez, utilisรฉe pour sรฉcuriser les secrets sur votre serveur."; +"secrets_setup_recovery_passphrase_information" = "Saisissez une phrase de sรฉcuritรฉ que vous seul connaissez, utilisรฉe pour sรฉcuriser les secrets sur votre serveur."; "secrets_setup_recovery_passphrase_additional_information" = "Nโ€™utilisez pas le mot de passe de votre compte."; "secrets_setup_recovery_passphrase_validate_action" = "Terminรฉ"; "secrets_setup_recovery_passphrase_confirm_information" = "Saisissez ร  nouveau votre phrase de sรฉcuritรฉ pour la confirmer."; @@ -1165,3 +1165,208 @@ "event_formatter_widget_removed_by_you" = "Vous avez supprimรฉ le widgetย : %@"; "event_formatter_jitsi_widget_added_by_you" = "Vous avez ajoutรฉ une confรฉrence en VoIP"; "event_formatter_jitsi_widget_removed_by_you" = "Vous avez supprimรฉ une confรฉrence en VoIP"; +"favourites_empty_view_information" = "Vous pouvez marquer comme favoris de plusieurs maniรจres. La plus rapide est simplement dโ€™appuyer et maintenir. Appuyez sur lโ€™รฉtoile et ils apparaรฎtront automatiquement."; +"room_event_action_delete_confirmation_message" = "รŠtes-vous sรปr de vouloir supprimer ce message non envoyรฉย ?"; +"room_unsent_messages_cancel_message" = "รŠtes-vous sรปr de vouloir supprimer tous les messages non envoyรฉs dans ce salonย ?"; +"room_participants_leave_prompt_msg_for_dm" = "รŠtes-vous sรปr de vouloir partirย ?"; + +// MARK: - PIN Protection + +"pin_protection_choose_pin_welcome_after_login" = "Bon retour parmi nous."; +"room_intro_cell_information_multiple_dm_sentence2" = "Vous nโ€™รชtes que tous les deux dans cette conversation, ร  moins que lโ€™un de vous invite quelquโ€™un ร  vous rejoindre."; +"room_intro_cell_information_dm_sentence2" = "Vous รชtes les deux seuls membres de cette conversation, personne dโ€™autre ne peut vous rejoindre."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence1_part1" = "Ceci est le dรฉbut de votre conversation privรฉe avec "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " pour permettre aux gens de connaรฎtre le sujet de ce salon."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Ajouter un sujet"; +"room_intro_cell_information_room_with_topic_sentence2" = "Sujetย : %@"; +"room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_sentence1_part1" = "Ceci est le dรฉbut de "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Ajouter des personnes"; +"room_avatar_view_accessibility_hint" = "Changer lโ€™avatar du salon"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "avatar"; +"invite_friends_share_text" = "Hรฉ, venez me parler sur %@ย : %@"; + +// MARK: - Invite friends + +"invite_friends_action" = "Inviter des amis dans %@"; + +// MARK: - Favourites + +"favourites_empty_view_title" = "Salons et personnes favoris"; +"home_empty_view_information" = "Lโ€™application tout-en-un de messagerie pour les รฉquipes, amis et organisations. Appuyez sur le bouton ยซย +ย ยป ci-dessous pour ajouter des personnes et des salons."; + +// MARK: - Home + +"home_empty_view_title" = "Bienvenue dans %@,\n%@"; +"call_transfer_error_message" = "ร‰chec du transfert de lโ€™appel"; +"call_transfer_error_title" = "Erreur"; +"call_transfer_contacts_all" = "Tous"; +"call_transfer_contacts_recent" = "Rรฉcent"; +"call_transfer_dialpad" = "Pavรฉ de numรฉrotation"; +"call_transfer_users" = "Utilisateurs"; + +// MARK: - Call Transfer +"call_transfer_title" = "Transfรฉrer"; + +// MARK: - Dial Pad +"dialpad_title" = "Pavรฉ de numรฉrotation"; +"room_info_list_section_other" = "Autres"; +"room_info_list_several_members" = "%@ membres"; + +// MARK: - Room Info + +"room_info_list_one_member" = "1 membre"; +"create_room_placeholder_address" = "#salondetest:matrix.org"; +"create_room_section_header_address" = "Adresse du salon"; +"create_room_show_in_directory" = "Publier le salon dans le rรฉpertoire"; +"create_room_section_footer_type" = "Les personnes ne rejoignent un salon privรฉ que sur invitation."; +"create_room_type_public" = "Salon public"; +"create_room_type_private" = "Salon privรฉ"; +"create_room_section_header_type" = "Type de salon"; +"create_room_section_footer_encryption" = "Le chiffrement ne peut pas รชtre dรฉsactivรฉ ensuite."; +"create_room_enable_encryption" = "Activer le chiffrement"; +"create_room_section_header_encryption" = "Chiffrement du salon"; +"create_room_placeholder_topic" = "Sujet"; +"create_room_section_header_topic" = "Sujet du salon (facultatif)"; +"create_room_placeholder_name" = "Nom"; +"create_room_section_header_name" = "Nom du salon"; + +// MARK: - Create Room + +"create_room_title" = "Nouveau salon"; +"searchable_directory_search_placeholder" = "Nom ou identifiant"; +"searchable_directory_x_network" = "Rรฉseau %@"; + +// MARK: - Searchable Directory View Controller + +"searchable_directory_create_new_room" = "Crรฉer un nouveau salon"; +"biometrics_cant_unlocked_alert_message_retry" = "Rรฉessayez"; +"biometrics_cant_unlocked_alert_message_login" = "Rรฉ-authentifiez vous"; +"biometrics_cant_unlocked_alert_message_x" = "Pour dรฉverrouiller, utilisez %@ ou rรฉ-authentifiez vous et rรฉactivez %@"; +"biometrics_cant_unlocked_alert_title" = "Impossible de dรฉverrouiller lโ€™application"; +"biometrics_usage_reason" = "Authentifiez vous pour accรฉder ร  votre application"; +"biometrics_desetup_disable_button_title_x" = "Dรฉsactiver %@"; +"biometrics_desetup_title_x" = "Dรฉsactiver %@"; +"biometrics_setup_subtitle" = "Ne perdez pas de temps"; +"biometrics_setup_enable_button_title_x" = "Activer %@"; +"biometrics_setup_title_x" = "Activer %@"; +"biometrics_settings_enable_x" = "Activer %@"; +"biometrics_mode_face_id" = "Face ID"; + +// MARK: - Biometrics Protection + +"biometrics_mode_touch_id" = "Touch ID"; +"pin_protection_kick_user_alert_message" = "Trop de tentatives, vous avez รฉtรฉ dรฉconnectรฉ"; +"pin_protection_explanatory" = "Mettre en place un code PIN vous permet de protรฉger vos donnรฉes telles que vos messages et contacts de sorte ร  ce que vous soyez le seul ร  pouvoir y accรฉder en saisissant votre code PIN au dรฉmarrage de lโ€™application."; +"pin_protection_not_allowed_pin" = "Pour des raisons de sรฉcuritรฉ, ce code PIN nโ€™est pas disponible. Essayez un autre code PIN"; +"pin_protection_settings_change_pin" = "Changer le code PIN"; +"pin_protection_settings_enable_pin" = "Activer le code PIN"; +"pin_protection_settings_enabled_forced" = "Code PIN activรฉ"; +"pin_protection_settings_section_footer" = "Pour rรฉinitialiser votre code PIN, vous devez vous rรฉ-authentifier et en crรฉer un nouveau."; +"pin_protection_settings_section_header_x" = "PIN & %@"; +"pin_protection_mismatch_too_many_times_error_message" = "Si vous avez oubliรฉ votre code PIN, appuyez sur le bouton ยซย PIN oubliรฉย ยป."; +"pin_protection_mismatch_error_message" = "Essayez ร  nouveau"; +"pin_protection_mismatch_error_title" = "Les codes PIN ne correspondent pas"; +"pin_protection_reset_alert_action_reset" = "Rรฉinitialiser"; +"pin_protection_reset_alert_message" = "Pour rรฉinitialiser votre code PIN, vous devez vous rรฉ-authentifier et en crรฉer un nouveau"; +"pin_protection_reset_alert_title" = "Rรฉinitialiser le code PIN"; +"pin_protection_forgot_pin" = "Code PIN oubliรฉ"; +"pin_protection_enter_pin" = "Saisissez votre code PIN"; +"pin_protection_confirm_pin_to_change" = "Confirmez votre code PIN pour le changer"; +"pin_protection_confirm_pin_to_disable" = "Confirmez votre code PIN pour le dรฉsactiver"; +"pin_protection_confirm_pin" = "Confirmez votre code PIN"; +"pin_protection_choose_pin" = "Crรฉer un code PIN pour amรฉliorer la sรฉcuritรฉ"; +"pin_protection_choose_pin_welcome_after_register" = "Bienvenue."; +"major_update_done_action" = "Compris"; +"major_update_learn_more_action" = "En savoir plus"; +"major_update_information" = "Nous sommes ravis dโ€™annoncer que nous avons changรฉ de nomย ! Votre application est ร  jour, et vous รชtes connectรฉ sur votre compte."; + +// MARK: - Major update + +"major_update_title" = "Riot est dรฉsormais Element"; +"secrets_reset_authentication_message" = "Saisir votre mot de passe de compte pour confirmer"; +"secrets_reset_reset_action" = "Rรฉinitialiser"; +"secrets_reset_warning_message" = "Vous allez reprendre sans historique, sans message, appareil ou utilisateur de confiance."; +"secrets_reset_warning_title" = "Si vous rรฉinitialisez tout"; +"secrets_reset_information" = "Ne faites ceci que si vous nโ€™avez aucun appareil qui peut vรฉrifier celui-ci."; + +// MARK: - Secrets reset + +"secrets_reset_title" = "Tout rรฉinitialiser"; +"device_verification_self_verify_wait_recover_secrets_checking_availability" = "Contrรดle des autres fonctionnalitรฉs de vรฉrificationโ€ฆ"; +"event_formatter_call_you_currently_in" = "Vous รชtes actuellement dans cet appel"; +"rooms_empty_view_information" = "Les salons sont utiles pour toute conversation de groupe, privรฉe ou publique. Appuyez sur ยซย +ย ยป pour trouver des salons existants, ou en crรฉer de nouveaux."; +"rooms_empty_view_title" = "Salons"; +"people_empty_view_information" = "Communiquez de maniรจre sรฉcurisรฉe avec nโ€™importe qui. Appuyez sur ยซย +ย ยป pour commencer ร  ajouter des personnes."; +"social_login_button_title_sign_up" = "Sโ€™inscrire avec %@"; +"social_login_button_title_sign_in" = "Se connecter avec %@"; +"secrets_setup_recovery_passphrase_summary_information" = "Mรฉmorisez votre phrase de sรฉcuritรฉ. Elle peut รชtre utilisรฉe pour dรฉverrouiller vos messages et donnรฉes chiffrรฉs."; +"secrets_setup_recovery_passphrase_summary_title" = "Enregistrer votre phrase de sรฉcuritรฉ"; +"secrets_recovery_reset_action_part_2" = "Tout rรฉinitialiser"; + +// MARK: - Secrets recovery + +"secrets_recovery_reset_action_part_1" = "ร€ cours dโ€™options de rรฉcupรฉrationย ? "; +"bug_report_background_mode" = "Poursuivre en arriรจre-plan"; +"call_actions_unhold" = "Reprendre"; +"event_formatter_call_back" = "Rappeler"; +"event_formatter_call_you_declined" = "Vous avez refusรฉ cet appel"; +"event_formatter_call_has_ended" = "Lโ€™appel est terminรฉ"; +"event_formatter_call_video" = "Appel vidรฉo"; +"event_formatter_call_voice" = "Appel audio"; +"room_details_advanced_e2e_encryption_disabled_for_dm" = "Le chiffrement nโ€™est pas activรฉ ici."; +"room_details_advanced_e2e_encryption_enabled_for_dm" = "Le chiffrement est activรฉ ici"; +"room_details_advanced_room_id_for_dm" = "Identifiantย :"; +"room_details_no_local_addresses_for_dm" = "Ce salon nโ€™a pas dโ€™adresse locale"; +"room_details_access_section_directory_toggle_for_dm" = "Publier le salon dans le rรฉpertoire"; +"room_details_access_section_anyone_for_dm" = "Toute personne ayant le lien, y compris les invitรฉs"; +"room_details_access_section_anyone_apart_from_guest_for_dm" = "Toute personne ayant le lien, ร  lโ€™exception des invitรฉs"; +"room_details_access_section_for_dm" = "Qui peut accรฉder ร  ceciย ?"; +"room_details_room_name_for_dm" = "Nom"; +"room_details_photo_for_dm" = "Photo"; +"room_details_title_for_dm" = "Dรฉtails"; +"settings_show_NSFW_public_rooms" = "Afficher les salons publics au contenu choquant"; +"external_link_confirmation_message" = "Le lien %@ vous emmรจne vers un autre siteย : %@\n\nรŠtes vous sรปr de vouloir poursuivreย ?"; +"external_link_confirmation_title" = "Inspectez ce lien"; +"room_open_dialpad" = "Pavรฉ de numรฉrotation"; +"room_place_voice_call" = "Appel audio"; +"room_event_action_delete_confirmation_title" = "Supprimer les messages non envoyรฉs"; +"room_unsent_messages_cancel_title" = "Supprimer les messages non envoyรฉs"; +"room_participants_security_information_room_encrypted_for_dm" = "Ces messages sont chiffrรฉs de bout en bout.\n\nVos messages sont chiffrรฉs, et seuls vous et le destinataire disposez des clรฉs uniques pour les dรฉchiffrer."; +"room_participants_security_information_room_not_encrypted_for_dm" = "Ces messages ne sont pas chiffrรฉs de bout en bout."; +"room_participants_filter_room_members_for_dm" = "Filtrer les membres"; +"room_participants_leave_prompt_title_for_dm" = "Partir"; +"people_empty_view_title" = "Personnes"; +"social_login_button_title_continue" = "Poursuivre avec %@"; +"social_login_list_title_sign_up" = "Ou"; +"social_login_list_title_sign_in" = "Ou"; + +// Social login + +"social_login_list_title_continue" = "Poursuivre avec"; +"callbar_return" = "Retour"; +"callbar_only_multiple_paused" = "%@ appels en attente"; +"callbar_only_single_paused" = "Appel en attente"; +"callbar_active_and_multiple_paused" = "1 appel en cours (%@) ยท %@ appels en attente"; +"callbar_active_and_single_paused" = "1 appel en cours (%@) ยท 1 appel en attente"; + +// Call Bar +"callbar_only_single_active" = "Appel en cours (%@)"; +"less" = "Moins"; +"more" = "Plus"; +"switch" = "Basculer"; +"joined" = "Arrivรฉ"; +"store_promotional_text" = "Application de messagerie et collaboration respectueuse de la vie privรฉe, sur un rรฉseau ouvert. Dรฉcentralisรฉe pour vous donner le contrรดle. Pas dโ€™extraction de vos donnรฉes, pas de porte dรฉrobรฉe, pas dโ€™accรจs rรฉservรฉ ร  des tiers."; +"room_details_search" = "Rechercher dans le salon"; +"room_details_integrations" = "Intรฉgrations"; +"room_multiple_typing_notification" = "%@ et dโ€™autres"; +"room_accessibility_video_call" = "Appel vidรฉo"; +"room_message_replying_to" = "Rรฉponse ร  %@"; +"room_message_editing" = "Modification"; diff --git a/Riot/Assets/hu.lproj/Vector.strings b/Riot/Assets/hu.lproj/Vector.strings index cb403d9af..a44ee794f 100644 --- a/Riot/Assets/hu.lproj/Vector.strings +++ b/Riot/Assets/hu.lproj/Vector.strings @@ -1292,9 +1292,61 @@ "social_login_button_title_sign_up" = "Fiรณkkรฉszรญtรฉs ezzel: %@"; "social_login_button_title_sign_in" = "Bejelentkezรฉs ezzel: %@"; "social_login_button_title_continue" = "Folytatรกs ezzel: %@"; -"social_login_list_title_sign_up" = "Vagy fiรณkkรฉszรญtรฉs ezzel:"; -"social_login_list_title_sign_in" = "Vagy bejelentkezรฉs ezzel:"; +"social_login_list_title_sign_up" = "Vagy"; +"social_login_list_title_sign_in" = "Vagy"; // Social login "social_login_list_title_continue" = "Folytatรกs ezzel:"; +"settings_show_NSFW_public_rooms" = "Nyilvรกnos kifogรกsolhatรณ tartalmakat tartalmazรณ szobรกk megjelenรญtรฉse"; +"room_intro_cell_information_multiple_dm_sentence2" = "Csak รถnรถk vannak ebben a beszรฉlgetรฉsben, hacsak nem hรญvnak meg mรกst."; +"room_intro_cell_information_dm_sentence2" = "Csak ketten vannak ebben a beszรฉlgetรฉsben, senki mรกs nem tud csatlakozni hozzรก."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence1_part1" = "Ez a kรถzvetlen beszรฉlgetรฉs kezdete vele: "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " hogy a tรถbbiek tudjรกk, mirล‘l van szรณ ebben a szobรกban."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Tรฉma megadรกsa"; +"room_intro_cell_information_room_with_topic_sentence2" = "Tรฉma: %@"; +"room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_sentence1_part1" = "Ez a kezdete ennek: "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Felhasznรกlรณk meghรญvรกsa"; +"room_avatar_view_accessibility_hint" = "Szoba profilkรฉp megvรกltoztatรกsa"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "profilkรฉp"; +"call_transfer_error_message" = "Hรญvรกs รกtadรกs nem sikerรผlt"; +"call_transfer_error_title" = "Hiba"; +"call_transfer_contacts_all" = "Mind"; +"call_transfer_contacts_recent" = "Legutรณbbi"; +"call_transfer_dialpad" = "Tรกrcsรกzรณ szรกmlap"; +"call_transfer_users" = "Felhasznรกlรณk"; + +// MARK: - Call Transfer +"call_transfer_title" = "รtadรกs"; + +// MARK: - Dial Pad +"dialpad_title" = "Tรกrcsรกzรณ szรกmlap"; +"call_actions_unhold" = "Folytatรกs"; +"event_formatter_call_back" = "Visszahรญvรกs"; +"event_formatter_call_you_declined" = "Elutasรญtotta ezt a hรญvรกst"; +"event_formatter_call_you_currently_in" = "Jelenleg ebben a hรญvรกsban van"; +"event_formatter_call_has_ended" = "Hรญvรกs befejezล‘dรถtt"; +"event_formatter_call_video" = "Videรณhรญvรกs"; +"event_formatter_call_voice" = "Hang hรญvรกs"; +"room_open_dialpad" = "Tรกrcsรกzรณ szรกmlap"; +"room_place_voice_call" = "Hang hรญvรกs"; +"room_event_action_delete_confirmation_message" = "Biztosan el szeretnรฉ tรกvolรญtani ezt az elkรผldetlen รผzenetet?"; +"room_event_action_delete_confirmation_title" = "Elkรผldetlen รผzenet tรถrlรฉse"; +"room_unsent_messages_cancel_message" = "Biztos, hogy tรถrli az รถsszes el nem kรผldรถtt รผzenetet a szobรกban?"; +"room_unsent_messages_cancel_title" = "El nem kรผldรถtt รผzenetek tรถrlรฉse"; +"callbar_return" = "Visszatรฉrรฉs"; +"callbar_only_multiple_paused" = "%@ hรญvรกs tartรกsban"; +"callbar_only_single_paused" = "Hรญvรกs tartรกsban"; +"callbar_active_and_multiple_paused" = "1 aktรญv hรญvรกs (%@) ยท %@ hรญvรกs tartรกsban"; +"callbar_active_and_single_paused" = "1 aktรญv hรญvรกs (%@) ยท 1 hรญvรกs tartรกsban"; + +// Call Bar +"callbar_only_single_active" = "Aktรญv hรญvรกs (%@)"; diff --git a/Riot/Assets/it.lproj/Vector.strings b/Riot/Assets/it.lproj/Vector.strings index aa6b12724..37edfa354 100644 --- a/Riot/Assets/it.lproj/Vector.strings +++ b/Riot/Assets/it.lproj/Vector.strings @@ -886,7 +886,7 @@ "settings_add_3pid_password_title_email" = "Aggiungi indirizzo email"; "settings_add_3pid_password_title_msidsn" = "Aggiungi numero di telefono"; "settings_add_3pid_password_message" = "Per continuare, inserisci la tua password"; -"settings_add_3pid_invalid_password_message" = "Password non valida"; +"settings_add_3pid_invalid_password_message" = "Credenziali non valide"; "error_not_supported_on_mobile" = "Non puoi farlo da %@ mobile."; "widget_menu_refresh" = "Ricarica"; "widget_menu_open_outside" = "Apri nel browser"; @@ -1263,9 +1263,67 @@ "social_login_button_title_sign_up" = "Registrati con %@"; "social_login_button_title_sign_in" = "Accedi con %@"; "social_login_button_title_continue" = "Continua con %@"; -"social_login_list_title_sign_up" = "O registrati con"; -"social_login_list_title_sign_in" = "O accedi con"; +"social_login_list_title_sign_up" = "O"; +"social_login_list_title_sign_in" = "O"; // Social login "social_login_list_title_continue" = "Continua con"; +"room_intro_cell_information_multiple_dm_sentence2" = "Ci sei solo tu in questa conversazione, a meno che uno di voi non inviti qualcuno."; +"room_intro_cell_information_dm_sentence2" = "Solo voi due siete in questa conversazione, nessun altro puรฒ unirsi."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence1_part1" = "Questo รจ l'inizio dei tuoi messaggi diretti con "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " per far sapere alle persone di cosa parla questa stanza."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Aggiungi un argomento"; +"room_intro_cell_information_room_with_topic_sentence2" = "Argomento: %@"; +"room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_sentence1_part1" = "Questo รจ l'inizio di "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Aggiungi persone"; +"room_avatar_view_accessibility_hint" = "Cambia avatar stanza"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "avatar"; +"call_transfer_error_message" = "Trasferimento chiamata fallito"; +"call_transfer_error_title" = "Errore"; +"call_transfer_contacts_all" = "Tutti"; +"call_transfer_contacts_recent" = "Recenti"; +"call_transfer_dialpad" = "Tastierino numerico"; +"call_transfer_users" = "Utenti"; + +// MARK: - Call Transfer +"call_transfer_title" = "Trasferisci"; + +// MARK: - Dial Pad +"dialpad_title" = "Tastierino numerico"; +"call_actions_unhold" = "Riprendi"; +"event_formatter_call_back" = "Richiama"; +"event_formatter_call_you_declined" = "Hai rifiutato questa chiamata"; +"event_formatter_call_you_currently_in" = "Sei attualmente in questa chiamata"; +"event_formatter_call_has_ended" = "Questa chiamata รจ terminata"; +"event_formatter_call_video" = "Videochiamata"; +"event_formatter_call_voice" = "Telefonata"; +"settings_show_NSFW_public_rooms" = "Mostra stanze pubbliche per adulti"; +"room_open_dialpad" = "Tastierino numerico"; +"room_place_voice_call" = "Telefonata"; +"room_event_action_delete_confirmation_message" = "Vuoi veramente eliminare questo messaggio non inviato?"; +"room_event_action_delete_confirmation_title" = "Elimina messaggio non inviato"; +"room_unsent_messages_cancel_title" = "Elimina messaggi non inviati"; +"room_unsent_messages_cancel_message" = "Vuoi veramente eliminare tutti i messaggi non inviati in questa stanza?"; +"callbar_return" = "Torna"; +"callbar_only_multiple_paused" = "%@ chiamate in pausa"; +"callbar_only_single_paused" = "Chiamata in pausa"; +"callbar_active_and_multiple_paused" = "1 chiamata attiva (%@) ยท %@ chiamate in pausa"; +"callbar_active_and_single_paused" = "1 chiamata attiva (%@) ยท 1 chiamata in pausa"; + +// Call Bar +"callbar_only_single_active" = "Chiamata attiva (%@)"; +"room_details_integrations" = "Integrazioni"; +"room_details_search" = "Cerca stanza"; +"room_multiple_typing_notification" = "%@ e altri"; +"room_accessibility_video_call" = "Videochiamata"; +"room_message_editing" = "Modifica"; +"room_message_replying_to" = "Risposta a %@"; diff --git a/Riot/Assets/ja.lproj/Vector.strings b/Riot/Assets/ja.lproj/Vector.strings index 7c9dd284b..a3d3a68e7 100644 --- a/Riot/Assets/ja.lproj/Vector.strings +++ b/Riot/Assets/ja.lproj/Vector.strings @@ -246,7 +246,7 @@ // Room Preview "room_preview_invitation_format" = "ใ‚ใชใŸใฏ %@ ใ•ใ‚“ใซๅ‘ผใฐใ‚Œใฆใ“ใฎ้ƒจๅฑ‹ใธๅ‚ๅŠ ใ—ใพใ—ใŸ"; "room_preview_subtitle" = "ใ“ใ‚Œใฏ้ƒจๅฑ‹ใฎไธ‹่ฆ‹ใงใ™ใ€‚็™บ่จ€ใŒใ‚ใฃใฆใ‚‚้ƒจๅฑ‹ใฏๆ›ดๆ–ฐใ•ใ‚Œใพใ›ใ‚“ใ€‚"; -"room_preview_unlinked_email_warning" = "ใ“ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซ้–ข้€ฃไป˜ใ‘ใ‚‰ใ‚Œใฆใ„ใชใ„ %@ ๅฎ›ใซๆ‹›ๅพ…ใŒ้€ไฟกใ•ใ‚Œใพใ—ใŸใ€‚ๅˆฅใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใงใƒญใ‚ฐใ‚คใƒณใ™ใ‚‹ใ‹ใ€ใ“ใฎ้›ปๅญใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚’ใ“ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซ่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚"; +"room_preview_unlinked_email_warning" = "ใ“ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซ้–ข้€ฃไป˜ใ‘ใ‚‰ใ‚Œใฆใ„ใชใ„ %@ ๅฎ›ใซๆ‹›ๅพ…ใŒ้€ไฟกใ•ใ‚Œใพใ—ใŸใ€‚ๅˆฅใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใงใƒญใ‚ฐใ‚คใƒณใ™ใ‚‹ใ‹ใ€ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚’ใ“ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซ่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚"; "room_preview_try_join_an_unknown_room" = "ใ‚ใชใŸใฏ %@ ใธๆŽฅ็ถšใ—ใ‚ˆใ†ใจใ—ใฆใ„ใพใ™ใ€‚ใ“ใฎไผš่ญฐใซๅ‚ๅŠ ใ—ใพใ™ใ‹๏ผŸ"; "room_preview_try_join_an_unknown_room_default" = "้ƒจๅฑ‹"; // Settings @@ -291,7 +291,7 @@ "settings_global_settings_info" = "ใ‚ใชใŸใฎ %@ webใ‚ฏใƒฉใ‚คใ‚ขใƒณใƒˆไธŠใงใ€ๅ…จไฝ“ใฎ้€š็Ÿฅ่จญๅฎšใŒๅฏ่ƒฝใงใ™"; "settings_pin_rooms_with_missed_notif" = "้€š็ŸฅใฎๅฑŠใ‹ใชใ‹ใฃใŸ้ƒจๅฑ‹ใ‚’ใƒ”ใƒณๆญขใ‚ใ™ใ‚‹"; "settings_on_denied_notification" = "%@ใง้€š็Ÿฅใ•ใ‚Œใชใ„ใ‚ˆใ†ใซ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ™ใ€‚ใ‚ใชใŸใฎ็ซฏๆœซ่จญๅฎšใง่จฑๅฏใ—ใฆใใ ใ•ใ„"; -"settings_callkit_info" = "็”ป้ขใŒใƒญใƒƒใ‚ฏใ•ใ‚Œใฆใ„ใ‚‹ใจใใซ็€ไฟกใŒใ‚ใ‚Šใพใ—ใŸใ€‚Elementใฎ็€ไฟกใฏใ‚ทใ‚นใƒ†ใƒ ใฎ้€š่ฉฑๅฑฅๆญดใง็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚ iCloudใŒๆœ‰ๅŠนใซใชใฃใฆใ„ใ‚‹ๅ ดๅˆใ€ใ“ใฎ้€š่ฉฑๅฑฅๆญดใฏAppleใจๅ…ฑๆœ‰ใ•ใ‚Œใพใ™ใ€‚"; +"settings_callkit_info" = "็”ป้ขใŒใƒญใƒƒใ‚ฏใ•ใ‚Œใฆใ„ใ‚‹ใจใใซ็€ไฟกใŒใ‚ใ‚Šใพใ—ใŸใ€‚Elementใฎ็€ไฟกใฏใ‚ทใ‚นใƒ†ใƒ ใฎ้€š่ฉฑๅฑฅๆญดใง็ขบ่ชใงใใพใ™ใ€‚ iCloudใŒๆœ‰ๅŠนใซใชใฃใฆใ„ใ‚‹ๅ ดๅˆใ€ใ“ใฎ้€š่ฉฑๅฑฅๆญดใฏAppleใจๅ…ฑๆœ‰ใ•ใ‚Œใพใ™ใ€‚"; "settings_ui_language" = "่จ€่ชž"; "settings_ui_theme" = "ๅค–่ฆณ"; "settings_ui_theme_auto" = "่‡ชๅ‹•"; @@ -322,14 +322,14 @@ "settings_fail_to_update_password" = "ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฎๆ›ดๆ–ฐใซๅคฑๆ•—ใ—ใพใ—ใŸ"; "settings_password_updated" = "ใ‚ใชใŸใฎใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฏๆ›ดๆ–ฐใ•ใ‚Œใพใ—ใŸ"; "settings_crypto_device_name" = "ใ‚ปใƒƒใ‚ทใƒงใƒณๅ: "; -"settings_crypto_device_id" = "\n่ฃ…็ฝฎๅ›บๆœ‰ID: "; +"settings_crypto_device_id" = "\nใ‚ปใƒƒใ‚ทใƒงใƒณID: "; "settings_crypto_device_key" = "\n็ซฏๆœซ้ต: "; "settings_crypto_export" = "ๆš—ๅท้ตใ‚’ๅค–้ƒจใธไฟๅญ˜"; -"settings_crypto_blacklist_unverified_devices" = "่ช่จผใ•ใ‚ŒใŸ็ซฏๆœซใฎใฟใงๆš—ๅทๅŒ–"; +"settings_crypto_blacklist_unverified_devices" = "ๆคœ่จผใ•ใ‚ŒใŸใ‚ปใƒƒใ‚ทใƒงใƒณใฎใฟใงๆš—ๅทๅŒ–"; // Room Details "room_details_title" = "้ƒจๅฑ‹ใฎ่ฉณ็ดฐ"; "room_details_people" = "ๅ‚ๅŠ ่€…"; -"room_details_files" = "ๆทปไป˜ใƒ•ใ‚กใ‚คใƒซ"; +"room_details_files" = "ใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰"; "room_details_settings" = "่จญๅฎš"; "room_details_photo" = "้ƒจๅฑ‹ใฎ็”ปๅƒใ‚ขใ‚คใ‚ณใƒณ"; "room_details_room_name" = "้ƒจๅฑ‹ๅ"; @@ -365,7 +365,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" = "้ƒจๅฑ‹ใฎ่ชฌๆ˜Žใฎๆ›ดๆ–ฐใซๅคฑๆ•—ใ—ใพใ—ใŸ"; @@ -424,8 +424,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 @@ -434,8 +434,8 @@ // Crash report "google_analytics_use_prompt" = "ๅŒฟๅใฎ่ชคๅ‹•ไฝœๅ ฑๅ‘Šใจไฝฟ็”จ็Šถๆณใƒ‡ใƒผใ‚ฟใ‚’่‡ชๅ‹•็š„ใซๅ ฑๅ‘Šใ—ใฆ%@ใฎๆ”นๅ–„ใซๅฝน็ซ‹ใฆใพใ™ใ‹๏ผŸ"; // Crypto -"e2e_enabling_on_app_update" = "Elementใฏend-to-endๆš—ๅทๅŒ–ใ‚’ใ‚ตใƒใƒผใƒˆใ™ใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใŒใ€ๅ†ๅบฆๆœ‰ๅŠนใซใ™ใ‚‹ใซใฏใƒญใ‚ฐใ‚คใƒณใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚\n\nใ‚ขใƒ—ใƒชใฎ่จญๅฎšใ‹ใ‚‰ๅ†ใƒญใ‚ฐใ‚คใƒณใงใใพใ™ใ€‚ไปŠใ™ใใ€ใพใŸใฏๅพŒใ‹ใ‚‰ใงใ‚‚ๆง‹ใ„ใพใ›ใ‚“ใ€‚"; -"e2e_need_log_in_again" = "ใ“ใฎ็ซฏๆœซใฎใ‚จใƒณใƒ‰ใƒ„ใƒผใ‚จใƒณใƒ‰ๆš—ๅท้ตใ‚’็”Ÿๆˆใ—ใ€ๆŽฅ็ถšๅ…ˆใ‚ตใƒผใƒใซๅ…ฌ้–‹้ตใ‚’้€ไฟกใ™ใ‚‹ใซใฏใ€ๅ†ๅบฆใƒญใ‚ฐใ‚คใƒณใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚\nไธ€ๅบฆๅ›ž็ทšใ‚’ๅˆ‡ๆ–ญใ—ใพใ™ใ€‚ใ”ไธไพฟใŠใ‹ใ‘ใ—ใฆใ™ใฟใพใ›ใ‚“ใ€‚"; +"e2e_enabling_on_app_update" = "Elementใฏใ‚จใƒณใƒ‰ใƒ„ใƒผใ‚จใƒณใƒ‰ๆš—ๅทๅŒ–ใ‚’ใ‚ตใƒใƒผใƒˆใ™ใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใŒใ€ๆœ‰ๅŠนใซใ™ใ‚‹ใซใฏๅ†ใณใƒญใ‚ฐใ‚คใƒณใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚\n\nใ‚ขใƒ—ใƒชใฎ่จญๅฎšใ‹ใ‚‰ๅ†ใƒญใ‚ฐใ‚คใƒณใงใใพใ™ใ€‚ไปŠใ™ใใ€ใพใŸใฏๅพŒใ‹ใ‚‰ใงใ‚‚ๆง‹ใ„ใพใ›ใ‚“ใ€‚"; +"e2e_need_log_in_again" = "ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใฎใ‚จใƒณใƒ‰ใƒ„ใƒผใ‚จใƒณใƒ‰ๆš—ๅทๅŒ–ใ‚ญใƒผใ‚’็”Ÿๆˆใ—ใ€ๅ…ฌ้–‹ใ‚ญใƒผใ‚’ใƒ›ใƒผใƒ ใ‚ตใƒผใƒใƒผใซ้€ไฟกใ™ใ‚‹ใซใฏใ€ๅ†ๅบฆใƒญใ‚ฐใ‚คใƒณใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚\nใ“ใ‚Œใฏไธ€ๅบฆใ ใ‘ใงใ™ใ€‚ ใ”ไธไพฟใŠใ‹ใ‘ใ—ใฆใ™ใฟใพใ›ใ‚“ใ€‚"; // Bug report "bug_report_title" = "ไธๅ…ทๅˆๅ ฑๅ‘Š"; "bug_report_description" = "่ชคๅ‹•ไฝœใฎๅ†…ๅฎนใจ็Šถๆณใฎ่ชฌๆ˜Žใ‚’ใŠ้ก˜ใ„่‡ดใ—ใพใ™ใ€‚ใ‚ใชใŸใฏไฝ•ใ‚’ใ—ใพใ—ใŸใ‹๏ผŸไฝ•ใŒ่ตทใ“ใ‚‹ใจๆ€ใ„ใพใ™ใ‹๏ผŸๅฎŸ้š›ไฝ•ใŒ่ตทใ“ใฃใŸใฎใงใ™ใ‹๏ผŸ"; @@ -526,7 +526,7 @@ // Group rooms "group_rooms_filter_rooms" = "ใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใƒซใƒผใƒ ใ‚’ใƒ•ใ‚ฃใƒซใ‚ฟใƒชใƒณใ‚ฐ"; "event_formatter_rerequest_keys_part1_link" = "ๆš—ๅท้ตใฎๅ†่ฆๆฑ‚"; -"event_formatter_rerequest_keys_part2" = " ใ‚ใชใŸใฎไป–ใฎ็ซฏๆœซใ‹ใ‚‰ใ€‚"; +"event_formatter_rerequest_keys_part2" = " ใ‚ใชใŸใฎไป–ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใ‹ใ‚‰ใ€‚"; "homeserver_connection_lost" = "ใƒ›ใƒผใƒ ใ‚ตใƒผใƒใƒผใซๆŽฅ็ถšใงใใพใ›ใ‚“ใงใ—ใŸใ€‚"; "widget_sticker_picker_no_stickerpacks_alert" = "็พๅœจใ€ใ‚นใƒ†ใƒƒใ‚ซใƒผใƒ‘ใƒƒใ‚ฏใ‚’ๆœ‰ๅŠนใซใ—ใฆใ„ใพใ›ใ‚“ใ€‚"; "widget_sticker_picker_no_stickerpacks_alert_add_now" = "ไปŠใ™ใ่ฟฝๅŠ ใ—ใพใ™ใ‹๏ผŸ"; @@ -593,3 +593,436 @@ "create_room_title" = "ๆ–ฐใ—ใ„้ƒจๅฑ‹"; "create_room_enable_encryption" = "ๆš—ๅทๅŒ–ใ‚’ๆœ‰ๅŠนใซใ™ใ‚‹"; "room_details_room_name_for_dm" = "ๅๅ‰"; +"room_participants_security_information_room_encrypted_for_dm" = "ใ“ใ“ใง้€ๅ—ไฟกใ•ใ‚Œใ‚‹ใƒกใƒƒใ‚ปใƒผใ‚ธใฏใ‚จใƒณใƒ‰ใƒ„ใƒผใ‚จใƒณใƒ‰ๆš—ๅทๅŒ–ใ•ใ‚Œใพใ™ใ€‚\n\nใƒกใƒƒใ‚ปใƒผใ‚ธใฏๅฎ‰ๅ…จใซไฟ่ญทใ•ใ‚ŒใฆใŠใ‚Šใ€ใ‚ใชใŸใจๅฎ›ๅ…ˆใฎใฟใŒใƒกใƒƒใ‚ปใƒผใ‚ธใฎ้–ฒ่ฆงใซๅฟ…่ฆใช้ตใ‚’ๆ‰€ๆŒใ—ใพใ™ใ€‚"; +"room_participants_security_information_room_not_encrypted_for_dm" = "ใ“ใ“ใง้€ๅ—ไฟกใ•ใ‚Œใ‚‹ใƒกใƒƒใ‚ปใƒผใ‚ธใฏใ‚จใƒณใƒ‰ใƒ„ใƒผใ‚จใƒณใƒ‰ๆš—ๅทๅŒ–ใ•ใ‚Œใพใ›ใ‚“ใ€‚"; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "ๅ‚ๅŠ ่€…ใ‚’่ฟฝๅŠ "; +"room_participants_security_information_room_encrypted" = "ใ“ใฎ้ƒจๅฑ‹ใง้€ๅ—ไฟกใ•ใ‚Œใ‚‹ใƒกใƒƒใ‚ปใƒผใ‚ธใฏใ‚จใƒณใƒ‰ใƒ„ใƒผใ‚จใƒณใƒ‰ๆš—ๅทๅŒ–ใ•ใ‚Œใพใ™ใ€‚\n\nใƒกใƒƒใ‚ปใƒผใ‚ธใฏๅฎ‰ๅ…จใซไฟ่ญทใ•ใ‚ŒใฆใŠใ‚Šใ€ใ“ใฎ้ƒจๅฑ‹ใฎๅ‚ๅŠ ่€…ใฎใฟใŒใƒกใƒƒใ‚ปใƒผใ‚ธใฎ้–ฒ่ฆงใซๅฟ…่ฆใช้ตใ‚’ๆ‰€ๆŒใ—ใพใ™ใ€‚"; +"room_participants_security_information_room_not_encrypted" = "ใ“ใฎ้ƒจๅฑ‹ใง้€ๅ—ไฟกใ•ใ‚Œใ‚‹ใƒกใƒƒใ‚ปใƒผใ‚ธใฏใ‚จใƒณใƒ‰ใƒ„ใƒผใ‚จใƒณใƒ‰ๆš—ๅทๅŒ–ใ•ใ‚Œใพใ›ใ‚“ใ€‚"; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"callbar_active_and_single_paused" = "ใฒใจใคใฎใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ใช้€š่ฉฑ (%@) ยท ใฒใจใคใฎไธ€ๆ™‚ๅœๆญขใ•ใ‚ŒใŸ้€š่ฉฑ"; + +// Call Bar +"callbar_only_single_active" = "ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ใช้€š่ฉฑ(%@)"; +"settings_add_3pid_password_title_msidsn" = "้›ป่ฉฑ็•ชๅทใฎ่ฟฝๅŠ ใ™ใ‚‹"; +"device_verification_emoji_scissors" = "ใƒใ‚ตใƒŸ"; +"device_verification_emoji_paperclip" = "ใƒšใƒผใƒ‘ใƒผใ‚ฏใƒชใƒƒใƒ—"; +"device_verification_emoji_pencil" = "้‰›็ญ†"; +"device_verification_emoji_book" = "ๆœฌ"; +"device_verification_emoji_light bulb" = "้›ป็ƒ"; +"device_verification_emoji_gift" = "ใ‚ฎใƒ•ใƒˆ"; +"device_verification_emoji_clock" = "ๆ™‚่จˆ"; +"device_verification_emoji_hourglass" = "ใ‚นใƒๆ™‚่จˆ"; +"device_verification_emoji_umbrella" = "้›จ"; +"device_verification_emoji_thumbs up" = "่ฆชๆŒ‡ใ‚’็ซ‹ใฆใ‚‹"; +"device_verification_emoji_spanner" = "ใ‚นใƒ‘ใƒŠ"; +"device_verification_emoji_santa" = "ใ‚ตใƒณใ‚ฟ"; +"device_verification_emoji_glasses" = "ใƒกใ‚ฌใƒ"; +"device_verification_emoji_hat" = "ใƒใƒƒใƒˆ"; +"device_verification_emoji_robot" = "ใƒญใƒœใƒƒใƒˆ"; +"device_verification_emoji_smiley" = "็ฌ‘้ก”"; +"device_verification_emoji_heart" = "ใƒใƒผใƒˆ"; +"device_verification_emoji_cake" = "ใ‚ฑใƒผใ‚ญ"; +"device_verification_emoji_pizza" = "ใƒ”ใ‚ถ"; + +// Room widget permissions +"room_widget_permission_title" = "ใ‚ฆใ‚ฃใ‚ธใ‚งใƒƒใƒˆใ‚’่ชญใฟ่พผใ‚€"; +"widget_picker_manage_integrations" = "ใ‚คใƒณใƒ†ใ‚ฐใƒฌใƒผใ‚ทใƒงใƒณใ‚’็ฎก็†ใ™ใ‚‹โ€ฆ"; + +// Widget Picker +"widget_picker_title" = "ใ‚คใƒณใƒ†ใ‚ฐใƒฌใƒผใ‚ทใƒงใƒณใƒžใƒใƒผใ‚ธใƒฃใƒผ"; +"widget_integration_manager_disabled" = "่จญๅฎšใงใ‚คใƒณใƒ†ใ‚ฐใƒฌใƒผใ‚ทใƒงใƒณใƒžใƒใƒผใ‚ธใƒฃใƒผใ‚’ๆœ‰ๅŠนใซใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™"; +"widget_menu_remove" = "ใ™ในใฆๅ–ใ‚Š้™คใ"; +"widget_menu_revoke_permission" = "ใ‚ขใ‚ฏใ‚ปใ‚นใ‚’ๅ–ใ‚Šๆถˆใ™"; +"widget_menu_open_outside" = "ใƒ–ใƒฉใ‚ฆใ‚ถใ‚’้–‹ใ"; +"widget_menu_refresh" = "ใƒชใƒ•ใƒฌใƒƒใ‚ทใƒฅ"; +"widget_integrations_server_failed_to_connect" = "ใ‚คใƒณใƒ†ใ‚ฐใƒฌใƒผใ‚ทใƒงใƒณใ‚ตใƒผใƒใƒผใธใฎ่ชฌใ‚’ๅฅใŒๅคฑๆ•—ใ—ใพใ—ใŸ"; + +// Widget +"widget_no_integrations_server_configured" = "ใ‚คใƒณใƒ†ใ‚ฐใƒฌใƒผใ‚ทใƒงใƒณใ‚ตใƒผใƒใƒผใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"; +"bug_report_background_mode" = "ใƒใƒƒใ‚ฏใ‚ฐใƒฉใ‚ฆใƒณใƒ‰ใง็ถ™็ถšใ™ใ‚‹"; +"e2e_key_backup_wrong_version_button_wasme" = "ใ“ใ‚Œใฏใ‚ใŸใ—ใงใ™"; +"e2e_key_backup_wrong_version_button_settings" = "่จญๅฎš"; +"e2e_key_backup_wrong_version" = "ๆ–ฐใ—ใ„ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚ญใƒผใฎใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใŒๆคœๅ‡บใ•ใ‚Œใพใ—ใŸใ€‚\n\nใ“ใ‚ŒใŒใ‚ใชใŸใซใ‚ˆใ‚‹ใ‚‚ใฎใงใฐใ„ๅ ดๅˆใฏใ€่จญๅฎšใ‹ใ‚‰ๆ–ฐใ—ใ„ใƒ‘ใ‚นใƒ•ใƒฌใƒผใ‚บใ‚’่จญๅฎšใ—ใฆใใ ใ•ใ„ใ€‚"; + +// Key backup wrong version +"e2e_key_backup_wrong_version_title" = "ๆ–ฐใ—ใ„ใ‚ญใƒผใฎใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—"; +"call_no_stun_server_error_use_fallback_button" = "%@ใ‚’ไฝฟใฃใฆใฟใฆใใ ใ•ใ„"; +"call_actions_unhold" = "ใ‚„ใ‚Š็›ดใ™"; +"call_no_stun_server_error_message_2" = "ไปฃใ‚ใ‚Šใซใ€%@ใฎใƒ‘ใƒ–ใƒชใƒƒใ‚ฏใ‚ตใƒผใƒใƒผใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใ‚‚ใงใใพใ™ใŒใ€ใ“ใ‚Œใฏไฟก้ ผๆ€งใŒไฝŽใใ‚ใชใŸใฎIPใ‚ขใƒ‰ใƒฌใ‚นใŒใใฎใ‚ตใƒผใƒใƒผใจๅ…ฑๆœ‰ใ•ใ‚Œใฆใ—ใพใ„ใพใ™ใ€‚ใ“ใ‚Œใฏใ€่จญๅฎšใ‹ใ‚‰็ฎก็†ใ™ใ‚‹ใ“ใจใŒใงใใพใ™"; +"call_no_stun_server_error_message_1" = "้€š่ฉฑใ‚’็ขบๅฎŸใซๆฉŸ่ƒฝใ•ใ›ใ‚‹ใŸใ‚ใซใฏใ€ใƒ›ใƒผใƒ ใ‚ตใƒผใƒใƒผ%@ใฎ็ฎก็†่€…ใซTURNใ‚ตใƒผใƒใƒผใฎ่จญๅฎšใ‚’ไพ้ ผใ—ใฆใใ ใ•ใ„ใ€‚"; +"call_no_stun_server_error_title" = "ใ‚ตใƒผใƒใƒผใฎ่จญๅฎšใŒ้–“้•ใฃใฆใ„ใ‚‹ใŸใ‚้€š่ฉฑใซๅคฑๆ•—ใ—ใพใ—ใŸ"; +"room_does_not_exist" = "%@ใฏๅญ˜ๅœจใ—ใพใ›ใ‚“"; +"photo_library_access_not_granted" = "%@ใฏใƒ•ใ‚ฉใƒˆใƒฉใ‚คใƒ–ใƒฉใƒชใซใ‚ขใ‚ฏใ‚ปใ‚นใ™ใ‚‹ๆจฉ้™ใŒใ‚ใ‚Šใพใ›ใ‚“"; +"camera_unavailable" = "ใŠไฝฟใ„ใฎ็ซฏๆœซใงใฏใ‚ซใƒกใƒฉใ‚’ๅˆฉ็”จใงใใพใ›ใ‚“"; +"event_formatter_widget_removed_by_you" = "ใ‚ฆใ‚ฃใ‚ธใ‚งใƒƒใƒˆใ‚’ๅ‰Š้™คใ—ใพใ—ใŸ: %@"; +"event_formatter_jitsi_widget_removed_by_you" = "VoIPใ‚ซใƒณใƒ•ใ‚กใƒฌใƒณใ‚นใ‚’ๅ‰Š้™คใ—ใพใ—ใŸ"; +"event_formatter_jitsi_widget_added_by_you" = "VoIPใ‚ซใƒณใƒ•ใ‚กใƒฌใƒณใ‚นใ‚’่ฟฝๅŠ ใ—ใพใ—ใŸ"; + +// Events formatter with you +"event_formatter_widget_added_by_you" = "ใ‚ฆใ‚ฃใ‚ธใ‚งใƒƒใƒˆใ‚’่ฟฝๅŠ ใ—ใพใ—ใŸ: %@"; +"event_formatter_call_back" = "ใ‹ใ‘็›ดใ™"; +"event_formatter_call_you_declined" = "้€š่ฉฑใ‚’ๆ‹’ๅฆใ—ใพใ—ใŸ"; +"event_formatter_call_you_currently_in" = "้€š่ฉฑไธญใงใ™"; +"event_formatter_call_has_ended" = "้€š่ฉฑใฏๆœ‰ๅŠนใงใ™"; +"event_formatter_call_video" = "ใƒ“ใƒ‡ใ‚ช้€š่ฉฑ"; +"event_formatter_call_voice" = "้Ÿณๅฃฐ้€š่ฉฑ"; +"event_formatter_message_edited_mention" = "๏ผˆ็ทจ้›†ๆธˆใฟ๏ผ‰"; +"image_picker_action_library" = "ใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’้ธใถ"; + +// Image picker +"image_picker_action_camera" = "ๅ†™็œŸใ‚’ๆ’ฎใ‚‹"; + +// Media picker +"media_picker_title" = "ใƒกใƒ‡ใ‚ฃใ‚ขใƒฉใ‚คใƒ–ใƒฉใƒช"; +"room_details_advanced_e2e_encryption_disabled_for_dm" = "ใ“ใ“ใฏๆš—ๅทๅŒ–ใŒๆœ‰ๅŠนใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚"; +"room_details_advanced_e2e_encryption_enabled_for_dm" = "ใ“ใ“ใฏๆš—ๅทๅŒ–ใŒๆœ‰ๅŠนใงใ™"; +"room_details_advanced_room_id_for_dm" = "ID:"; +"room_details_no_local_addresses_for_dm" = "ใ“ใ“ใซใฏใƒญใƒผใ‚ซใƒซใ‚ขใƒ‰ใƒฌใ‚นใŒใ‚ใ‚Šใพใ›ใ‚“"; +"room_details_access_section_directory_toggle_for_dm" = "ใƒซใƒผใƒ ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใซๆŽฒ่ผ‰ใ™ใ‚‹"; +"room_details_access_section_anyone_apart_from_guest_for_dm" = "ใ‚ฒใ‚นใƒˆไปฅๅค–ใฎใƒชใƒณใ‚ฏใ‚’็Ÿฅใฃใฆใ„ใ‚‹ไบบ"; +"room_details_access_section_anyone_for_dm" = "ใ‚ฒใ‚นใƒˆใ‚’ๅซใ‚ใ€ใƒชใƒณใ‚ฏใ‚’็Ÿฅใฃใฆใ„ใ‚‹ไบบใชใ‚‰่ชฐใงใ‚‚"; +"room_details_access_section_for_dm" = "่ชฐใŒใ‚ขใ‚ฏใ‚ปใ‚นใงใใ‚‹ใฎใ‹๏ผŸ"; +"room_details_photo_for_dm" = "ๅ†™็œŸ"; +"room_details_integrations" = "ใ‚คใƒณใƒ†ใ‚ฐใƒฌใƒผใ‚ทใƒงใƒณ"; +"room_details_search" = "้ƒจๅฑ‹๏ผˆใƒซใƒผใƒ ๏ผ‰ใ‚’ๆŽขใ™"; +"room_details_title_for_dm" = "่ฉณ็ดฐ"; +"identity_server_settings_alert_error_invalid_identity_server" = "%@ใฏๆœ‰ๅŠนใชIDใ‚ตใƒผใƒใƒผใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚"; +"identity_server_settings_alert_error_terms_not_accepted" = "IDใ‚ตใƒผใƒใƒผใจใ—ใฆ่จญๅฎšใ™ใ‚‹ใซใฏ%@ใฎๆกไปถใ‚’ๅ—ใ‘ๅ…ฅใ‚Œใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚"; +"identity_server_settings_alert_disconnect_still_sharing_3pid_button" = "ใจใซใ‹ใๅˆ‡ๆ–ญใ™ใ‚‹"; +"identity_server_settings_alert_disconnect_still_sharing_3pid" = "ใ‚ใชใŸใฏใพใ IDใ‚ตใƒผใƒใƒผ%@ใงๅ€‹ไบบใƒ‡ใƒผใ‚ฟใ‚’ๅ…ฑๆœ‰ใ—ใฆใ„ใพใ™ใ€‚\n\nๅˆ‡ๆ–ญใ™ใ‚‹ๅ‰ใซใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใจ้›ป่ฉฑ็•ชๅทใ‚’IDใ‚ตใƒผใƒใƒผใ‹ใ‚‰ๅ‰Š้™คใ™ใ‚‹ใ“ใจใ‚’ใŠๅ‹งใ‚ใ—ใพใ™ใ€‚"; +"identity_server_settings_alert_disconnect_button" = "ๆŽฅ็ถšใ‚’่งฃ้™ค"; +"identity_server_settings_alert_disconnect" = "IDใ‚ตใƒผใƒใƒผ%@ใ‚’ๆŽฅ็ถš่งฃ้™คใ—ใพใ™ใ‹๏ผŸ"; +"identity_server_settings_alert_disconnect_title" = "IDใ‚ตใƒผใƒใƒผใ‚’ๆŽฅ็ถš่งฃ้™ค"; +"identity_server_settings_alert_change" = "IDใ‚ตใƒผใƒใƒผ%1$@ใ‚’ๅˆ‡ๆ–ญใ—ใ€ไปฃใ‚ใ‚Šใซ %2$@ใซๆŽฅ็ถšใ—ใพใ™ใ‹๏ผŸ"; +"identity_server_settings_alert_change_title" = "IDใ‚ตใƒผใƒใƒผใ‚’ๅค‰ๆ›ดใ™ใ‚‹"; +"identity_server_settings_alert_no_terms" = "้ธๆŠžใ—ใŸIDใ‚ตใƒผใƒใƒผใซใฏๅˆฉ็”จ่ฆ็ด„ใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใใฎใ‚ตใƒผใƒใƒผใฎๆ‰€ๆœ‰่€…ใ‚’ไฟก้ ผใงใใ‚‹ๅ ดๅˆใซใฎใฟ็ถš่กŒใ—ใฆใใ ใ•ใ„ใ€‚"; +"identity_server_settings_alert_no_terms_title" = "IDใ‚ตใƒผใƒใƒผใซใฏๅˆฉ็”จ่ฆ็ด„ใŒใ‚ใ‚Šใพใ›ใ‚“"; +"identity_server_settings_disconnect" = "ๆŽฅ็ถšใ‚’่งฃ้™ค"; +"identity_server_settings_disconnect_info" = "IDใ‚ตใƒผใƒใƒผใจใฎๆŽฅ็ถšใ‚’่งฃ้™คใ™ใ‚‹ใจใ€ไป–ใฎใƒฆใƒผใ‚ถใƒผใ‹ใ‚‰็™บ่ฆ‹ใ•ใ‚Œใชใใชใ‚Šใ€ใƒกใƒผใƒซใ‚„้›ป่ฉฑใงไป–ใฎใƒฆใƒผใ‚ถใƒผใ‚’ๆ‹›ๅพ…ใ™ใ‚‹ใ“ใจใŒใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚"; +"identity_server_settings_change" = "ๅค‰ๆ›ดใ™ใ‚‹"; +"identity_server_settings_add" = "่ฟฝๅŠ ใ™ใ‚‹"; +"identity_server_settings_place_holder" = "IDใ‚ตใƒผใƒใƒผใ‚’ๅ…ฅๅŠ›ใ™ใ‚‹"; +"identity_server_settings_no_is_description" = "็พๅœจใ€ID ใ‚ตใƒผใƒใƒผใ‚’ไฝฟ็”จใ—ใฆใ„ใพใ›ใ‚“ใ€‚็Ÿฅใ‚Šๅˆใ„ใ‚’็™บ่ฆ‹ใ—ใŸใ‚Šใ€็™บ่ฆ‹ใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใซใฏใ€ไธŠ่จ˜ใซ่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„ใ€‚"; +"identity_server_settings_description" = "ใ‚ใชใŸใฏ%@ใ‚’ไฝฟใฃใฆใ€ใ‚ใชใŸใฎ็Ÿฅใ‚Šๅˆใ„ใ‚’็™บ่ฆ‹ใ—ใ€ใพใŸๅ‘ใ“ใ†ใ‹ใ‚‰็™บ่ฆ‹ใงใใ‚‹ใ‚ˆใ†ใซใ—ใฆใ„ใพใ™ใ€‚"; +"security_settings_complete_security_alert_title" = "ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚’ๅฎŒไบ†ใ—ใพใ™"; +"security_settings_crosssigning_complete_security" = "ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใƒผใ‚’ๅฎŒไบ†ใ™ใ‚‹"; +"security_settings_crosssigning_bootstrap" = "็‹ฌ็ซ‹ใ—ใŸใ‚ฏใƒญใ‚น็ฝฒๅ"; +"settings_devices_description" = "ใ‚ปใƒƒใ‚ทใƒงใƒณใฎใƒ‘ใƒ–ใƒชใƒƒใ‚ฏใƒใƒผใƒ ใฏใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณใ‚’ใจใ‚‹็›ธๆ‰‹ใซ่กจ็คบใ•ใ‚Œใพใ™"; +"settings_key_backup_delete_confirmation_prompt_title" = "ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใฎๅ‰Š้™ค"; +"settings_key_backup_info_valid" = "ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใฏ้ตใฎใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ‚’ใ•ใ‚Œใฆใ„ใพใ™ใ€‚"; +"settings_key_backup_info_algorithm" = "ใ‚ขใƒซใ‚ดใƒชใ‚บใƒ : %@"; +"settings_key_backup_info_version" = "ใ‚ญใƒผใฎใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใƒใƒผใ‚ธใƒงใƒณ: %@"; +"settings_key_backup_info_none" = "ใ‚ใชใŸใฎใ‚ญใƒผใฏใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใ‹ใ‚‰ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ•ใ‚Œใฆใ„ใพใ›ใ‚“ใ€‚"; +"settings_key_backup_info_checking" = "็ขบ่ชไธญโ€ฆ"; +"settings_add_3pid_password_message" = "็ถšใ‘ใ‚‹ใซใฏใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„"; +"settings_add_3pid_invalid_password_message" = "็„กๅŠนใช่ช่จผๆƒ…ๅ ฑ"; +"settings_add_3pid_password_title_email" = "ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚’่ฟฝๅŠ ใ™ใ‚‹"; +"settings_integrations_allow_description" = "ใ‚คใƒณใƒ†ใ‚ฐใƒฌใƒผใ‚ทใƒงใƒณใƒžใƒใƒผใ‚ธใƒฃใƒผ๏ผˆ%@๏ผ‰ใ‚’ไฝฟ็”จใ—ใฆใ€ใƒœใƒƒใƒˆใ€ใƒ–ใƒชใƒƒใ‚ธใ€ใ‚ฆใ‚ฃใ‚ธใ‚งใƒƒใƒˆใ€ใ‚นใƒ†ใƒƒใ‚ซใƒผใƒ‘ใƒƒใ‚ฏใ‚’็ฎก็†ใ—ใพใ™ใ€‚\n\n่จญๅฎšใƒ‡ใƒผใ‚ฟใ‚’ๅ—ใ‘ๅ–ใ‚Šใ€ใŠๅฎขๆง˜ใซไปฃใ‚ใฃใฆใ‚ฆใ‚ฃใ‚ธใ‚งใƒƒใƒˆใฎๅค‰ๆ›ดใ€ใƒซใƒผใƒ ๆ‹›ๅพ…ใฎ้€ไฟกใ€ๆจฉ้™ใฎ่จญๅฎšใ‚’่กŒใ†ใ“ใจใŒใงใใพใ™ใ€‚"; +"settings_integrations_allow_button" = "ใƒžใƒใƒผใ‚ธใ‚คใƒณใƒ†ใ‚ฐใƒฌใƒผใ‚ทใƒงใƒณ"; +"settings_calls_stun_server_fallback_button" = "ใƒ•ใ‚ฉใƒผใƒซใƒใƒƒใ‚ฏใ‚ณใƒผใƒซใ‚ขใ‚ทใ‚นใƒˆใ‚ตใƒผใƒใ‚’่จฑๅฏใ™ใ‚‹"; +"settings_key_backup" = "ใ‚ญใƒผใฎใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—"; +"settings_integrations" = "ใ‚คใƒณใƒ†ใ‚ฐใƒฌใƒผใ‚ทใƒงใƒณ"; +"settings_discovery_settings" = "ใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชใƒผ"; +"room_multiple_typing_notification" = "%@ใจใใฎไป–ใฎใƒฆใƒผใ‚ถใƒผใŒๅ…ฅๅŠ›ไธญใงใ™"; +"external_link_confirmation_message" = "ใƒชใƒณใ‚ฏ%@ใฏๅˆฅใฎใ‚ตใ‚คใƒˆใซ็งปๅ‹•ใ—ใพใ™: %@\n\nๆœฌๅฝ“ใซ็ถšใ‘ใพใ™ใ‹๏ผŸ"; +"room_event_action_delete_confirmation_title" = "ๆœช้€ไฟกใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅ‰Š้™ค"; +"room_unsent_messages_cancel_message" = "ใ“ใฎ้ƒจๅฑ‹ใซใ‚ใ‚‹ๆœช้€ไฟกใฎใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ใ™ในใฆๅ‰Š้™คใ—ใฆใ‚‚ใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹๏ผŸ"; +"room_unsent_messages_cancel_title" = "ๆœช้€ไฟกใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅ‰Š้™ค"; +"room_message_replying_to" = "%@ใซ่ฟ”ไฟกไธญ"; +"room_message_editing" = "็ทจ้›†ไธญ"; +"room_accessiblity_scroll_to_bottom" = "ใ„ใกใฐใ‚“ไธ‹ใพใงใ‚นใ‚ฏใƒญใƒผใƒซ"; +"room_member_power_level_short_custom" = "ใ‚ซใ‚นใ‚ฟใƒ "; +"room_member_power_level_short_moderator" = "ใƒขใƒ‡ใƒฌใƒผใ‚ฟใƒผ"; +"room_member_power_level_custom_in" = "ใ‚ซใ‚นใ‚ฟใƒ  (%@) in %@"; +"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" = "่ญฆๅ‘Š"; +"room_participants_action_security_status_complete_security" = "ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใƒผใ‚’ๅฎŒไบ†ใ™ใ‚‹"; +"room_participants_action_security_status_verify" = "ๆคœ่จผ"; +"room_participants_action_security_status_verified" = "ๆคœ่จผๆธˆใฟ"; +"room_participants_action_section_security" = "ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ"; +"room_participants_start_new_chat_error_using_user_email_without_identity_server" = "IDใ‚ตใƒผใƒใƒผใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใชใ„ใŸใ‚ใ€ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚’ไฝฟใฃใฆ้€ฃ็ตกๅ…ˆใจใƒใƒฃใƒƒใƒˆใ‚’้–‹ๅง‹ใ™ใ‚‹ใ“ใจใŒใงใใพใ›ใ‚“ใ€‚"; +"room_participants_filter_room_members_for_dm" = "ใƒกใƒณใƒใƒผใ‚’ใƒ•ใ‚ฃใƒซใ‚ฟใƒผ"; +"room_participants_remove_third_party_invite_prompt_msg" = "ๆ‹›ๅพ…ใ‚’ๅ–ใ‚Šๆถˆใ—ใฆใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹๏ผŸ"; +"room_participants_leave_prompt_msg_for_dm" = "้€€ๅ‡บใ—ใฆใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹๏ผŸ"; +"room_participants_leave_prompt_title_for_dm" = "้€€ๅ‡บใ™ใ‚‹"; +"contacts_address_book_no_identity_server" = "IDใ‚ตใƒผใƒใƒผใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"; +"rooms_empty_view_information" = "ใƒซใƒผใƒ ใฏใƒ—ใƒฉใ‚คใƒ™ใƒผใƒˆใงใ‚‚ใƒ‘ใƒ–ใƒชใƒƒใ‚ฏใงใ‚‚ใ€ใ‚ใ‚‰ใ‚†ใ‚‹ใ‚ฐใƒซใƒผใƒ—ใƒใƒฃใƒƒใƒˆใซๆœ€้ฉใงใ™ใ€‚+ใ‚’ใ‚ฟใƒƒใƒ—ใ™ใ‚‹ใจๆ—ขใซใ‚ใ‚‹้ƒจๅฑ‹ใ‚’ๆŽขใ—ใŸใ‚Šใ€ๆ–ฐใ—ใ„้ƒจๅฑ‹ใ‚’ไฝœใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚"; +"rooms_empty_view_title" = "ใƒซใƒผใƒ "; +"people_empty_view_information" = "่ชฐใจใงใ‚‚ๅฎ‰ๅ…จใซใƒใƒฃใƒƒใƒˆใงใใพใ™ใ€‚๏ผ‹ใ‚’ใ‚ฟใƒƒใƒ—ใ™ใ‚‹ใจไผš่ฉฑ็›ธๆ‰‹ใ‚’่ฟฝๅŠ ใงใใพใ™ใ€‚"; +"people_empty_view_title" = "ไบบใ€…"; +"room_creation_error_invite_user_by_email_without_identity_server" = "IDใ‚ตใƒผใƒใƒผใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใชใ„ใŸใ‚ใ€ใƒกใƒผใƒซใงๅ‚ๅŠ ่€…ใ‚’่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใŒใงใใพใ›ใ‚“ใ€‚"; + +// Errors +"error_user_already_logged_in" = "ไป–ใฎใƒ›ใƒผใƒ ใ‚ตใƒผใƒใƒผใซๆŽฅ็ถšใ—ใ‚ˆใ†ใจใ—ใฆใ„ใ‚‹ใ‚ˆใ†ใงใ™ใญใ€‚ใ‚ตใ‚คใƒณใ‚ขใ‚ฆใƒˆใ—ใพใ™ใ‹๏ผŸ"; +"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" = "็ถšใใฏใ“ใกใ‚‰"; +"auth_softlogout_clear_data_sign_out_msg" = "ใ“ใฎใƒ‡ใƒใ‚คใ‚นใซ็พๅœจไฟๅญ˜ใ•ใ‚Œใฆใ„ใ‚‹ใ™ในใฆใฎใƒ‡ใƒผใ‚ฟใ‚’ๆถˆๅŽปใ—ใฆใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹๏ผŸๅ†ใณใ‚ตใ‚คใƒณใ‚คใƒณใ™ใ‚‹ใจใ‚ขใ‚ซใ‚ฆใƒณใƒˆใƒ‡ใƒผใ‚ฟใ‚„ใƒกใƒƒใ‚ปใƒผใ‚ธใซใ‚ขใ‚ฏใ‚ปใ‚นใงใใพใ™ใ€‚"; +"auth_softlogout_clear_data_sign_out_title" = "ๆœฌๅฝ“ใซใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹๏ผŸ"; +"auth_softlogout_clear_data_button" = "ใ™ในใฆใฎใƒ‡ใƒผใ‚ฟใ‚’ใ‚ฏใƒชใ‚ขใ™ใ‚‹"; +"auth_softlogout_clear_data_message_2" = "ใ“ใฎใƒ‡ใƒใ‚คใ‚นใฎไฝฟ็”จใ‚’็ต‚ไบ†ใ™ใ‚‹ๅ ดๅˆใ‚„ใ€ๅˆฅใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซใ‚ตใ‚คใƒณใ‚คใƒณใ—ใŸใ„ๅ ดๅˆใฏใ€ใ‚ฏใƒชใ‚ขใ—ใฆใใ ใ•ใ„ใ€‚"; +"auth_softlogout_clear_data_message_1" = "่ญฆๅ‘Š: ๅ€‹ไบบใƒ‡ใƒผใ‚ฟ๏ผˆๆš—ๅทๅŒ–ใ‚ญใƒผใ‚’ๅซใ‚€๏ผ‰ใŒใ“ใฎใƒ‡ใƒใ‚คใ‚นใซใพใ ไฟๅญ˜ใ•ใ‚Œใฆใ„ใพใ™ใ€‚"; +"callbar_return" = "ใ‹ใ‘็›ดใ™"; +"callbar_active_and_multiple_paused" = "1ใคใฎใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ใช้€š่ฉฑ(%@) ยท %@ ้€š่ฉฑใฎไธ€ๆ™‚ๅœๆญข"; +"callbar_only_multiple_paused" = "%@ ้€š่ฉฑใฎไธ€ๆ™‚ๅœๆญข"; +"callbar_only_single_paused" = "้€š่ฉฑใฎไธ€ๆ™‚ๅœๆญข"; +"store_promotional_text" = "ใ‚ชใƒผใƒ—ใƒณใƒใƒƒใƒˆใƒฏใƒผใ‚ฏไธŠใงใƒ—ใƒฉใ‚คใƒใ‚ทใƒผใ‚’ไฟ่ญทใ—ใŸใƒใƒฃใƒƒใƒˆใ‚ขใƒ—ใƒชใ€‚ใ‚ใชใŸ่‡ช่บซใงใ‚ณใƒณใƒˆใƒญใƒผใƒซใงใใ‚‹ใ‚ˆใ†ใซ้žไธญๅคฎ้›†ๆจฉๅŒ–๏ผˆๅˆ†ๆ•ฃๅŒ–๏ผ‰ใ•ใ‚Œใฆใ„ใพใ™ใ€‚ใƒ‡ใƒผใ‚ฟใƒžใ‚คใƒ‹ใƒณใ‚ฐใ€ใƒใƒƒใ‚ฏใƒ‰ใ‚ขใ€ใ‚ตใƒผใƒ‰ใƒ‘ใƒผใƒ†ใ‚ฃใซใ‚ˆใ‚‹ใ‚ขใ‚ฏใ‚ปใ‚นใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚"; +"auth_softlogout_clear_data" = "ๅ€‹ไบบใƒ‡ใƒผใ‚ฟใ‚’ใ‚ฏใƒชใ‚ขใ™ใ‚‹"; +"auth_softlogout_recover_encryption_keys" = "ใ‚ตใ‚คใƒณใ‚คใƒณใ—ใฆใ€ใ“ใฎใƒ‡ใƒใ‚คใ‚นใซใฎใฟไฟๅญ˜ใ•ใ‚Œใฆใ„ใ‚‹ๆš—ๅทๅŒ–ใ‚ญใƒผใ‚’ๅพฉๅ…ƒใ—ใพใ™ใ€‚ใฉใฎใƒ‡ใƒใ‚คใ‚นใงใ‚‚ใ€ใ‚ใชใŸใฎใ‚ปใ‚ญใƒฅใ‚ขใชใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ใ™ในใฆ่ชญใ‚€ใŸใ‚ใซๅฟ…่ฆใงใ™ใ€‚"; +"auth_softlogout_reason" = "ใƒ›ใƒผใƒ ใ‚ตใƒผใƒใƒผ(%1$@)ใฎ็ฎก็†่€…ใŒ%2$@(%3$@)ใ‹ใ‚‰ใ‚ตใ‚คใƒณใ‚ขใ‚ฆใƒˆใ•ใ›ใพใ—ใŸใ€‚"; +"auth_softlogout_sign_in" = "ใ‚ตใ‚คใƒณใ‚คใƒณ"; +"auth_softlogout_signed_out" = "ใ‚ตใ‚คใƒณใ‚ขใ‚ฆใƒˆใ—ใพใ—ใŸ"; +"auth_autodiscover_invalid_response" = "็„กๅŠนใชใƒ›ใƒผใƒ ใ‚ตใƒผใƒใƒผ็™บ่ฆ‹ใƒฌใ‚นใƒใƒณใ‚น"; +"auth_accept_policies" = "ใ“ใฎใƒ›ใƒผใƒ ใ‚ตใƒผใƒใƒผใฎใƒใƒชใ‚ทใƒผใ‚’็ขบ่ชใ—ใฆๅŒๆ„ใ—ใฆใใ ใ•ใ„:"; +"auth_reset_password_error_is_required" = "IDใ‚ตใƒผใƒใƒผใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“: ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’ใƒชใ‚ปใƒƒใƒˆใ™ใ‚‹ใŸใ‚ใซใ‚ตใƒผใƒใƒผใ‚ชใƒ—ใ‚ทใƒงใƒณใซ่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„ใ€‚"; +"auth_forgot_password_error_no_configured_identity_server" = "IDใ‚ตใƒผใƒใƒผใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“: ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’ใƒชใ‚ปใƒƒใƒˆใ™ใ‚‹ใŸใ‚ใซIDใ‚ตใƒผใƒใƒผใ‚’่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„ใ€‚"; +"auth_phone_is_required" = "IDใ‚ตใƒผใƒใƒผใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใชใ„ใฎใงใ€ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’ใƒชใ‚ปใƒƒใƒˆใ™ใ‚‹ใŸใ‚ใซ้›ป่ฉฑ็•ชๅทใ‚’่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“ใ€‚"; +"auth_email_is_required" = "IDใ‚ตใƒผใƒใƒผใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใชใ„ใฎใงใ€ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’ใƒชใ‚ปใƒƒใƒˆใ™ใ‚‹ใŸใ‚ใซใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚’่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“ใ€‚"; +"auth_add_email_phone_message_2" = "ใ‚ขใ‚ซใ‚ฆใƒณใƒˆๅ›žๅพฉใฎใŸใ‚ใซใƒกใƒผใƒซใ‚’่จญๅฎšใ—ใพใ™ใ€‚ใ“ใ‚Œใ‚’่กŒใ†ใจใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚„้›ป่ฉฑ็•ชๅทใ‚’ไฝฟใฃใฆใ€ใ‚ใชใŸใฎใ“ใจใ‚’็Ÿฅใฃใฆใ„ใ‚‹ไบบใŒ็™บ่ฆ‹ใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚"; +"auth_add_phone_message_2" = "้›ป่ฉฑ็•ชๅทใ‚’่จญๅฎšใ—ใ€ใ‚ชใƒ—ใ‚ทใƒงใƒณใจใ—ใฆ่‡ชๅˆ†ใ‚’็Ÿฅใฃใฆใ„ใ‚‹ไบบใŒ็™บ่ฆ‹ใงใใ‚‹ใ‚ˆใ†ใซใ—ใพใ™ใ€‚"; +"auth_add_email_message_2" = "ใ‚ขใ‚ซใ‚ฆใƒณใƒˆๅ›žๅพฉใฎใŸใ‚ใซใƒกใƒผใƒซใ‚’่จญๅฎšใ—ใ€ใ‚ชใƒ—ใ‚ทใƒงใƒณใจใ—ใฆ่‡ชๅˆ†ใฎใ“ใจใ‚’็Ÿฅใฃใฆใ„ใ‚‹ไบบใŒ็™บ่ฆ‹ใงใใ‚‹ใ‚ˆใ†ใซใ—ใพใ™ใ€‚"; +"less" = "ใŸใŸใ‚€"; +"more" = "ใ‚‚ใฃใจ"; +"switch" = "ๅˆ‡ใ‚Šๆ›ฟใˆ"; +"joined" = "ๅ‚ๅŠ ๆธˆใฟ"; +"skip" = "ใ‚นใ‚ญใƒƒใƒ—"; + +// Identity server settings +"identity_server_settings_title" = "IDใ‚ตใƒผใƒใƒผ"; + +// AuthenticatedSessionViewControllerFactory +"authenticated_session_flow_not_supported" = "ใ“ใฎใ‚ขใƒ—ใƒชใฏใ€ใƒ›ใƒผใƒ ใ‚ตใƒผใƒใƒผใฎ่ช่จผๆฉŸๆง‹ใ‚’ใ‚ตใƒใƒผใƒˆใ—ใฆใ„ใพใ›ใ‚“ใ€‚"; +"manage_session_sign_out" = "ใ‚ปใƒƒใ‚ทใƒงใƒณใ‹ใ‚‰ใ‚ตใ‚คใƒณใ‚ขใ‚ฆใƒˆ"; +"manage_session_not_trusted" = "ไฟก้ ผใงใใชใ„"; +"manage_session_trusted" = "ไฟก้ ผๆธˆใฟ"; +"manage_session_name" = "ใ‚ปใƒƒใ‚ทใƒงใƒณๅ"; +"manage_session_info" = "ใ‚ปใƒƒใ‚ทใƒงใƒณใฎๆƒ…ๅ ฑ"; + +// Manage session +"manage_session_title" = "ใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’็ฎก็†"; +"security_settings_user_password_description" = "ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆๆœฌไบบ็ขบ่ชใ‚’่กŒใ†"; +"security_settings_coming_soon" = "็”ณใ—่จณใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใ“ใฎใ‚ขใ‚ฏใ‚ทใƒงใƒณใฏElement iOSใงใฏใพใ ๅˆฉ็”จใงใใพใ›ใ‚“ใ€‚ไป–ใฎMatrixใ‚ฏใƒฉใ‚คใ‚ขใƒณใƒˆใ‚’ไฝฟใฃใฆ่จญๅฎšใ—ใฆใใ ใ•ใ„ใ€‚ๅฐ†ๆฅ็š„ใซใฏElement iOSใงใ‚‚ๅฎŸ่ฃ…ใ•ใ‚Œใ‚‹ไบˆๅฎšใงใ™ใ€‚"; +"security_settings_complete_security_alert_message" = "็พๅœจใฎใ‚ปใƒƒใ‚ทใƒงใƒณใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚’ๅฎŒไบ†ใ•ใ›ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚"; +"security_settings_blacklist_unverified_devices_description" = "ใ™ในใฆใฎใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’ๆคœ่จผใ—ใฆใ€ไฟก้ ผใงใใ‚‹ใ‚‚ใฎใจใ—ใฆใƒžใƒผใ‚ฏใ—ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’้€ไฟกใ—ใพใ™ใ€‚"; +"security_settings_blacklist_unverified_devices" = "ไฟก้ ผใ—ใฆใ„ใชใ„ใ‚ปใƒƒใ‚ทใƒงใƒณใซใฏใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’้€ไฟกใ—ใชใ„"; +"security_settings_advanced" = "ไธŠ็ดš่€…ๅ‘ใ‘"; +"security_settings_export_keys_manually" = "ๆ‰‹ๅ‹•ใงใ‚ญใƒผใ‚’ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใ™ใ‚‹"; +"security_settings_cryptography" = "ๆš—ๅทๆŠ€่ก“"; +"security_settings_crosssigning_reset" = "ใ‚ฏใƒญใ‚น็ฝฒๅใ‚’ใƒชใ‚ปใƒƒใƒˆ"; +"security_settings_crosssigning_info_ok" = "ใ‚ฏใƒญใ‚น็ฝฒๅใŒๆœ‰ๅŠนใงใ™ใ€‚"; +"security_settings_crosssigning_info_trusted" = "ใ‚ฏใƒญใ‚น็ฝฒๅใŒๆœ‰ๅŠนใซใชใฃใฆใ„ใพใ™ใ€‚ใ‚ฏใƒญใ‚น็ฝฒๅใซๅŸบใฅใ„ใฆไป–ใฎใƒฆใƒผใ‚ถใƒผใ‚„่‡ชๅˆ†ใฎไป–ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’ไฟก้ ผใ™ใ‚‹ใ“ใจใฏใงใใพใ™ใŒใ€ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใซใฏใ‚ฏใƒญใ‚น็ฝฒๅ็”จใฎ็ง˜ๅฏ†้ตใŒใชใ„ใŸใ‚ใ€ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใ‹ใ‚‰ใ‚ฏใƒญใ‚น็ฝฒๅใ‚’่กŒใ†ใ“ใจใฏใงใใพใ›ใ‚“ใ€‚ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚’ๅฎŒไบ†ใ—ใฆใใ ใ•ใ„ใ€‚"; +"security_settings_crosssigning_info_exists" = "ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซใฏใ‚ฏใƒญใ‚น็ฝฒๅIDใŒใ‚ใ‚Šใพใ™ใŒใ€ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใฏใพใ ไฟก้ ผใ•ใ‚Œใฆใ„ใพใ›ใ‚“ใ€‚ ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚’ๅฎŒไบ†ใ—ใฆใใ ใ•ใ„ใ€‚"; +"security_settings_crosssigning_info_not_bootstrapped" = "ใ‚ฏใƒญใ‚น็ฝฒๅใŒใพใ ่กŒใ‚ใ‚Œใฆใ„ใพใ›ใ‚“ใ€‚"; +"security_settings_crosssigning" = "ใ‚ฏใƒญใ‚น็ฝฒๅ"; +"security_settings_backup" = "ใƒกใƒƒใ‚ปใƒผใ‚ธใฎใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—"; +"security_settings_secure_backup_delete" = "ๅ‰Š้™ค"; +"security_settings_secure_backup_synchronise" = "ๅŒๆœŸ"; +"security_settings_secure_backup_setup" = "ใ‚ปใƒƒใƒˆใ‚ขใƒƒใƒ—"; +"security_settings_secure_backup_description" = "ๆš—ๅทๅŒ–ใ‚ญใƒผใ‚’ใ‚ตใƒผใƒใƒผใซใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ™ใ‚‹ใ“ใจใซใ‚ˆใ‚Šใ€ๆš—ๅทๅŒ–ใ•ใ‚ŒใŸใƒกใƒƒใ‚ปใƒผใ‚ธใจใƒ‡ใƒผใ‚ฟใธใฎใ‚ขใ‚ฏใ‚ปใ‚นใŒๅคฑใ‚ใ‚Œใ‚‹ใฎใ‚’้˜ฒใŽใพใ™ใ€‚"; +"security_settings_secure_backup" = "ๅฎ‰ๅ…จใชใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—"; +"security_settings_crypto_sessions_description_2" = "ใƒญใ‚ฐใ‚คใƒณใŒ่ช่ญ˜ใ•ใ‚Œใชใ„ๅ ดๅˆใฏใ€ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’ๅค‰ๆ›ดใ—ใฆใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ‚’ใƒชใ‚ปใƒƒใƒˆใ—ใฆใใ ใ•ใ„ใ€‚"; +"security_settings_crypto_sessions_loading" = "ใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’่ชญใฟ่พผใฟไธญโ€ฆ"; +"security_settings_crypto_sessions" = "ใ‚ปใƒƒใ‚ทใƒงใƒณ"; + +// Security settings +"security_settings_title" = "ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ"; +"settings_show_NSFW_public_rooms" = "NSFWใƒ‘ใƒ–ใƒชใƒƒใ‚ฏใƒซใƒผใƒ ใ‚’่กจ็คบใ™ใ‚‹"; +"settings_identity_server_no_is_description" = "็พๅœจใ€ID ใ‚ตใƒผใƒใƒผใ‚’ไฝฟ็”จใ—ใฆใ„ใพใ›ใ‚“ใ€‚็Ÿฅใ‚Šๅˆใ„ใ‚’็™บ่ฆ‹ใ—ใŸใ‚Š็™บ่ฆ‹ใ•ใ‚Œใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใซใฏ1ใค้€ฃ็ตกๅ…ˆใ‚’่ฟฝๅŠ ใ—ใพใ™ใ€‚"; +"settings_identity_server_no_is" = "IDใ‚ตใƒผใƒใƒผใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ›ใ‚“"; +"settings_identity_server_description" = "ไธŠ่จ˜ใง่จญๅฎšใ—ใŸIDใ‚ตใƒผใƒใƒผใ‚’ไฝฟใฃใฆใ€่‡ชๅˆ†ใฎ็Ÿฅใ‚Šๅˆใ„ใ‚’็™บ่ฆ‹ใ—ใŸใ‚Šใ€็™บ่ฆ‹ใ•ใ‚ŒใŸใ‚Šใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚"; +"settings_discovery_three_pid_details_enter_sms_code_action" = "SMSใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ™ใƒผใ‚ทใƒงใƒณใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ™ใ‚‹"; +"settings_discovery_three_pid_details_cancel_email_validation_action" = "ใƒกใƒผใƒซใฎๆคœ่จผใ‚’ใ‚ญใƒฃใƒณใ‚ปใƒซ"; +"settings_discovery_three_pid_details_revoke_action" = "ๅ–ใ‚Šๆถˆใ—"; +"settings_discovery_three_pid_details_share_action" = "ๅ…ฑๆœ‰"; +"settings_discovery_three_pid_details_title_email" = "ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚’็ฎก็†ใ™ใ‚‹"; +"settings_discovery_three_pid_details_title_phone_number" = "้›ป่ฉฑ็•ชๅทใ‚’็ฎก็†ใ™ใ‚‹"; +"settings_discovery_three_pid_details_information_phone_number" = "ไป–ใฎใƒฆใƒผใ‚ถใƒผใŒใ‚ใชใŸใ‚’็™บ่ฆ‹ใ—ใŸใ‚Šใ€ใƒซใƒผใƒ ใซๆ‹›ๅพ…ใ™ใ‚‹้š›ใซไฝฟ็”จใงใใ‚‹้›ป่ฉฑ็•ชๅทใฎ่จญๅฎšใ‚’็ฎก็†ใ—ใพใ™ใ€‚ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใธ้›ป่ฉฑ็•ชๅทใฎ่ฟฝๅŠ ใ‚„ๅ‰Š้™คใŒใงใใพใ™ใ€‚"; +"settings_discovery_three_pid_details_information_email" = "ไป–ใฎใƒฆใƒผใ‚ถใƒผใŒใ‚ใชใŸใ‚’็™บ่ฆ‹ใ—ใŸใ‚Šใ€ใƒซใƒผใƒ ใซๆ‹›ๅพ…ใ™ใ‚‹้š›ใซไฝฟ็”จใงใใ‚‹ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใฎ่จญๅฎšใ‚’็ฎก็†ใ—ใพใ™ใ€‚ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใธใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใฎ่ฟฝๅŠ ใ‚„ๅ‰Š้™คใŒใงใใพใ™ใ€‚"; +"settings_discovery_error_message" = "ใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸใ€‚ๅ†่ฉฆ่กŒใ—ใฆใใ ใ•ใ„ใ€‚"; +"settings_discovery_three_pids_management_information_part3" = "ใ€‚"; +"settings_discovery_three_pids_management_information_part2" = "ใƒฆใƒผใ‚ถใƒผ่จญๅฎš"; +"settings_discovery_three_pids_management_information_part1" = "ไป–ใฎใƒฆใƒผใ‚ถใƒผใŒใ‚ใชใŸใ‚’็™บ่ฆ‹ใ—ใŸใ‚Šใ€้ƒจๅฑ‹ใซๆ‹›ๅพ…ใ™ใ‚‹้š›ใซไฝฟ็”จใ™ใ‚‹ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚„้›ป่ฉฑ็•ชๅทใ‚’็ฎก็†ใงใใพใ™ใ€‚ใ“ใฎใƒชใ‚นใƒˆใซใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚„้›ป่ฉฑ็•ชๅทใ‚’่ฟฝๅŠ ใ—ใŸใ‚Šใ€ๅ‰Š้™คใ—ใŸใ‚Šใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ "; +"settings_discovery_terms_not_signed" = "ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚„้›ป่ฉฑ็•ชๅทใง่‡ชๅˆ†ใ‚’็™บ่ฆ‹ใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใซใฏใ€IDใ‚ตใƒผใƒใƒผ๏ผˆ%@๏ผ‰ใฎๅˆฉ็”จ่ฆ็ด„ใซๅŒๆ„ใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚"; +"settings_discovery_no_identity_server" = "็พๅœจใ€IDใ‚ตใƒผใƒใƒผใ‚’ไฝฟ็”จใ—ใฆใ„ใพใ›ใ‚“ใ€‚็Ÿฅใ‚Šๅˆใ„ใŒใ‚ใชใŸใ‚’็™บ่ฆ‹ใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใซใฏใ€IDใ‚ตใƒผใƒใƒผใ‚’่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„ใ€‚"; +"settings_key_backup_delete_confirmation_prompt_msg" = "ใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹๏ผŸ้ตใŒ้ฉๅˆ‡ใซใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ•ใ‚Œใฆใ„ใชใ„ใจใ€ๆš—ๅทๅŒ–ใ•ใ‚ŒใŸใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅคฑใ†ใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚"; +"settings_key_backup_button_connect" = "ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’ใ‚ญใƒผใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใซๆŽฅ็ถšใ™ใ‚‹"; +"settings_key_backup_button_delete" = "ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใฎๆถˆๅŽป"; +"settings_key_backup_button_restore" = "ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ‹ใ‚‰ใฎๅพฉๆ—ง"; +"settings_key_backup_button_create" = "ใ‚ญใƒผใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ‚’ใ™ใ‚‹"; +"settings_key_backup_info_trust_signature_invalid_device_unverified" = "ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใซใฏ%@ใ‹ใ‚‰ใฎ็„กๅŠนใช็ฝฒๅใŒใ‚ใ‚Šใพใ™"; +"settings_key_backup_info_trust_signature_invalid_device_verified" = "ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใซใฏ%@ใ‹ใ‚‰ใฎ็„กๅŠนใช็ฝฒๅใŒใ‚ใ‚Šใพใ™"; +"settings_key_backup_info_trust_signature_valid_device_unverified" = "ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใซใฏ%@ใ‹ใ‚‰ใฎ็ฝฒๅใŒใ‚ใ‚Šใพใ™"; +"settings_key_backup_info_trust_signature_valid_device_verified" = "ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใซใฏ%@ใซใ‚ˆใ‚‹ๆœ‰ๅŠนใช็ฝฒๅใŒใ‚ใ‚Šใพใ™"; +"settings_key_backup_info_trust_signature_valid" = "ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใซใฏใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใฎๆœ‰ๅŠนใช็ฝฒๅใŒใ‚ใ‚Šใพใ™"; +"settings_key_backup_info_trust_signature_unknown" = "ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใซใฏID: %@ใซใ‚ˆใ‚‹ใ‚ปใƒƒใ‚ทใƒงใƒณใฎ็ฝฒๅใŒใ‚ใ‚Šใพใ™"; +"settings_key_backup_info_progress_done" = "ใ‚ญใƒผใฎใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใŒๅฎŒไบ†ใ—ใพใ—ใŸ"; +"settings_key_backup_info_progress" = "%@ใฎใ‚ญใƒผใ‚’ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ—ใฆใ„ใพใ™โ€ฆ"; +"settings_key_backup_info_not_valid" = "ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใงใฏใ‚ญใƒผใ‚’ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ—ใฆใ„ใพใ›ใ‚“ใŒใ€ๅพฉๅ…ƒใ—ใฆไปŠๅพŒ่ฟฝๅŠ ใงใใ‚‹ๆ—ขๅญ˜ใฎใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใŒใ‚ใ‚Šใพใ™ใ€‚"; +"settings_key_backup_info_signout_warning" = "ใ“ใฎใƒ‡ใƒใ‚คใ‚นใซใฎใฟๅญ˜ๅœจใ™ใ‚‹ใ‚ญใƒผใฎๆถˆๅคฑใ‚’้˜ฒใใŸใ‚ใซใ€ใ‚ตใ‚คใƒณใ‚ขใ‚ฆใƒˆใ™ใ‚‹ๅ‰ใซใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’ใ‚ญใƒผใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใซๆŽฅ็ถšใ—ใฆใใ ใ•ใ„ใ€‚"; +"settings_key_backup_info" = "ๆš—ๅทๅŒ–ใ•ใ‚ŒใŸใƒกใƒƒใ‚ปใƒผใ‚ธใฏใ‚จใƒณใƒ‰ใƒ„ใƒผใ‚จใƒณใƒ‰ใงๆš—ๅทๅŒ–ใ•ใ‚Œใฆใ„ใพใ™ใ€‚้€ไฟก่€…ใจๅ—ไฟก่€…ใ ใ‘ใŒใ“ใฎใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’่ชญใ‚€ใŸใ‚ใฎ้ตใ‚’ๆŒใฃใฆใ„ใพใ™ใ€‚"; +"settings_labs_message_reaction" = "็ตตๆ–‡ๅญ—ใงใƒกใƒƒใ‚ปใƒผใ‚ธใซๅๅฟœใ™ใ‚‹"; +"settings_calls_stun_server_fallback_description" = "ใƒ›ใƒผใƒ ใ‚ตใƒผใƒใƒผใŒใƒ•ใ‚ฉใƒผใƒซใƒใƒƒใ‚ฏใ‚ณใƒผใƒซใ‚ขใ‚ทใ‚นใƒˆใ‚ตใƒผใƒใƒผใ‚’ๆไพ›ใ—ใฆใ„ใชใ„ๅ ดๅˆใฏ๏ผ…@ใ‚’่จฑๅฏใ—ใพใ™๏ผˆIPใ‚ขใƒ‰ใƒฌใ‚นใฏ้€š่ฉฑไธญใซๅ…ฑๆœ‰ใ•ใ‚Œใพใ™๏ผ‰ใ€‚"; +"settings_security" = "ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใƒผ"; +"settings_three_pids_management_information_part3" = "ใ€‚"; +"settings_three_pids_management_information_part2" = "ใƒ‡ใ‚ฃใ‚นใ‚ซใƒใƒชใƒผ"; +"store_full_description" = "ElementใฏใพใฃใŸใๆ–ฐใ—ใ„ใ‚ฟใ‚คใƒ—ใฎใƒกใƒƒใ‚ปใƒณใ‚ธใƒฃใƒผใ‚ขใƒ—ใƒชใงใ™ใ€‚\n\n1. ใ‚ใชใŸ่‡ช่บซใŒใƒ—ใƒฉใ‚คใƒใ‚ทใƒผใ‚’ใ‚ณใƒณใƒˆใƒญใƒผใƒซใ™ใ‚‹ใ“ใจใ‚’ๅฏ่ƒฝใซใ—ใพใ™ใ€‚\n2. Matrixใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใซใ„ใ‚‹่ชฐใจใงใ‚‚้€šไฟกใงใใ‚‹ใ“ใจใฏใ‚‚ใกใ‚ใ‚“ใ€Slackใชใฉใฎใ‚ขใƒ—ใƒชใจใฎ้€ฃๆบใซใ‚ˆใฃใฆไป–ใฎใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใจใ‚‚้€šไฟกใŒใงใใพใ™ใ€‚\n3. ๅบƒๅ‘Šใ€ใƒ‡ใƒผใ‚ฟๅŽ้›†ใ€ใƒใƒƒใ‚ฏใƒ‰ใ‚ขใ€ใƒฆใƒผใ‚ถใƒผใฎๅ›ฒใ„่พผใฟใ‹ใ‚‰้€ƒใ‚Œใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚\n4. ใ‚จใƒณใƒ‰ใƒ„ใƒผใ‚จใƒณใƒ‰ๆš—ๅทๅŒ–ใจใ‚ฏใƒญใ‚น็ฝฒๅใซใ‚ˆใฃใฆใ‚ใชใŸใ‚’ไฟ่ญทใ—ใพใ™ใ€‚\n\nElementใฏ้žไธญๅคฎ้›†ๆจฉๅž‹ใงใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นใงใ‚ใ‚‹ใŸใ‚ใ€ไป–ใฎใƒกใƒƒใ‚ปใƒณใ‚ธใƒฃใƒผใ‚ขใƒ—ใƒชใจใฏๅฎŒๅ…จใซ็•ฐใชใฃใฆใ„ใพใ™ใ€‚\n\nElementใฏใ‚ใชใŸ่‡ช่บซใงใ‚ตใƒผใƒใƒผใ‚’ใƒ›ใ‚นใƒˆใ™ใ‚‹ใ“ใจใ‚‚ใ€ใ‚ตใƒผใƒใƒผใ‚’้ธใถใ“ใจใ‚‚ใงใใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใฃใฆใ‚ใชใŸใฎใƒ‡ใƒผใ‚ฟใจไผš่ฉฑใซ้–ขใ™ใ‚‹ใƒ—ใƒฉใ‚คใƒใ‚ทใƒผใ‚„ๆ‰€ๆœ‰ๆจฉใฏใ‚ใชใŸ่‡ช่บซใง็ฎก็†ใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ใ•ใ‚‰ใซใ€ใ‚ใชใŸใฏไป–ใฎElementใƒฆใƒผใ‚ถใƒผใจ่ฉฑใ›ใ‚‹ใ ใ‘ใงใชใใ‚ชใƒผใƒ—ใƒณใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใธใฎใ‚ขใ‚ฏใ‚ปใ‚นใ‚‚ๅฏ่ƒฝใงใ™ใ€‚ใจใฆใ‚‚ใ‚ปใ‚ญใƒฅใ‚ขใงใ™ใ€‚\n\nElementใฏใ€ใ‚ชใƒผใƒ—ใƒณใชๅˆ†ๆ•ฃๅž‹้€šไฟกใฎๆจ™ๆบ–่ฆๆ ผใงใ‚ใ‚‹Matrixใงๅ‹•ไฝœใ™ใ‚‹ใŸใ‚ใ€ใ“ใ‚Œใ‚‰ใ™ในใฆใ‚’ๅฎŸ็พใ™ใ‚‹ใ“ใจใŒใงใใฆใ„ใพใ™ใ€‚\n\nElementใงใฏใ‚ใชใŸใฎไผš่ฉฑใ‚’ใฉใฎใ‚ตใƒผใƒใƒผใงใƒ›ใ‚นใƒˆใ™ใ‚‹ใ‹ๆฑบใ‚ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ใ‚ขใƒ—ใƒชใงใฏใ€ใ•ใพใ–ใพใชๆ–นๆณ•ใง้ธๆŠžใงใใพใ™ใ€‚\n\n1. matrix.orgใฎๅ…ฌ้–‹ใ‚ตใƒผใƒใƒผใง็„กๆ–™ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚\n2. ใ‚ใชใŸ่‡ช่บซใฎใƒใƒผใƒ‰ใ‚ฆใ‚งใ‚ขใงใ‚ตใƒผใƒใƒผใ‚’ๅ‹•ใ‹ใ—ใ€ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’็ฎก็†ใ—ใพใ™ใ€‚\n3. Element Matrix Servicesใฎใƒ›ใ‚นใƒ†ใ‚ฃใƒณใ‚ฐใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ใซ็™ป้Œฒใ™ใ‚‹ใ“ใจใงใ€ใ‚ซใ‚นใ‚ฟใƒ ใ‚ตใƒผใƒใƒผไธŠใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ๅ–ๅพ—ใงใใพใ™ใ€‚\n\nใชใœElementใ‚’้ธใถในใใชใฎใ‹๏ผŸ\n\nใƒ‡ใƒผใ‚ฟใฎๆ‰€ๆœ‰ๆจฉ: ่‡ชๅˆ†ใงใƒ‡ใƒผใ‚ฟใ‚„ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ไฟ็ฎกใ™ใ‚‹ๅ ดๆ‰€ใ‚’ๆฑบใ‚ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ใ‚ใชใŸใŒๆ‰€ๆœ‰ๆจฉใ‚’ๆŒใฃใฆใ‚ณใƒณใƒˆใƒญใƒผใƒซใ™ใ‚‹ใ“ใจใงใ€็ฌฌไธ‰่€…ใซใ‚ใชใŸใฎใƒ‡ใƒผใ‚ฟใ‚’ๆธกใ—ใŸใ‚Šใ€ใƒ“ใƒƒใ‚ฐใƒ‡ใƒผใ‚ฟใ‚’ๅŽ้›†ใ™ใ‚‹ๅทจๅคงใƒ†ใƒƒใ‚ฏไผๆฅญใซไพๅญ˜ใ™ใ‚‹ๅฟ…่ฆใŒใชใใชใ‚Šใพใ™ใ€‚\n\n้–‹ใ‹ใ‚ŒใŸใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใจๅ…ฑๅŒไฝœๆฅญ: Matrixใƒใƒƒใƒˆใƒฏใƒผใ‚ฏๅ†…ใฎไป–ใฎ่ชฐใจใงใ‚‚ใ€ใ‚ใ‚‹ใ„ใฏElementใ‚„ไป–ใฎMatrixใ‚ขใƒ—ใƒชใ‚’ไฝฟใฃใฆใ„ใ‚‹ใ‹ใฉใ†ใ‹ใซ้–ขใ‚ใ‚‰ใšใ€ใพใŸSlackใ€IRCใ€XMPPใฎใ‚ˆใ†ใชไป–ใฎใƒกใƒƒใ‚ปใƒผใ‚ธใƒณใ‚ฐใ‚ทใ‚นใƒ†ใƒ ใ‚’ไฝฟใฃใฆใ„ใ‚‹ใ‹ใฉใ†ใ‹ใซ้–ขใ‚ใ‚‰ใšใ€ใƒใƒฃใƒƒใƒˆใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚\n\nใฏใ‚‹ใ‹ใซๅฎ‰ๅ…จ: ๆœฌ็‰ฉใฎใ‚จใƒณใƒ‰ใƒ„ใƒผใ‚จใƒณใƒ‰ๆš—ๅทๅŒ–๏ผˆไผš่ฉฑใซๅ‚ๅŠ ใ—ใฆใ„ใ‚‹่€…ใฎใฟใŒใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’่ชญใ‚ใ‚‹๏ผ‰ใจไผš่ฉฑๅ‚ๅŠ ่€…ใฎ็œŸๆญฃๆ€งใ‚’็ขบ่ชใ™ใ‚‹ใŸใ‚ใ‚ฏใƒญใ‚น็ฝฒๅใซใ‚ˆใฃใฆใ€‚\n\nๅฎŒๅ…จใชใ‚‹ใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณใฎ่จชใ‚Œ: ใƒ†ใ‚ญใ‚นใƒˆใ€้Ÿณๅฃฐ้€š่ฉฑใ€ใƒ“ใƒ‡ใ‚ช้€š่ฉฑใ€ใƒ•ใ‚กใ‚คใƒซๅ…ฑๆœ‰ใ€็”ป้ขๅ…ฑๆœ‰ใ€้€ฃๆบๆฉŸ่ƒฝใ€ใƒœใƒƒใƒˆใ€ใ‚ฆใ‚ฃใ‚ธใ‚งใƒƒใƒˆใชใฉใฎใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณใซๅฟ…่ฆใชๆฉŸ่ƒฝใฎๅ…จใฆใŒๅฎŸ่ฃ…ใ•ใ‚Œใฆใ„ใพใ™ใ€‚ใƒซใƒผใƒ ใ‚„ใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใ‚’็ซ‹ใกไธŠใ’ใฆ้€ฃ็ตกใ‚’ๅ–ใ‚Šๅˆใ„ใ€็‰ฉไบ‹ใ‚’ใ‚นใƒ ใƒผใ‚บใซๆˆใ—้‚ใ’ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚\n\nใ„ใคใงใ‚‚ใฉใ“ใงใ‚‚๏ผ: ใ™ในใฆใฎใƒ‡ใƒใ‚คใ‚นใจใ‚ฆใ‚งใƒ–๏ผˆhttps://app.element.io๏ผ‰ใงใƒกใƒƒใ‚ปใƒผใ‚ธใฎๅฑฅๆญดใŒๅฎŒๅ…จใซๅŒๆœŸใ•ใ‚Œใ‚‹ใŸใ‚ใ€ใฉใ“ใซใ„ใฆใ‚‚้€ฃ็ตกใ‚’ๅ–ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚"; +"user_verification_session_details_additional_information_untrusted_other_user" = "ใƒฆใƒผใ‚ถใƒผใŒใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’ไฟก้ ผใ™ใ‚‹ใพใงใฏใ€ใ‚ปใƒƒใ‚ทใƒงใƒณใจใฎ้–“ใง้€ๅ—ไฟกใ•ใ‚Œใ‚‹ใƒกใƒƒใ‚ปใƒผใ‚ธใซใฏ่ญฆๅ‘ŠใŒ่กจ็คบใ•ใ‚Œใพใ™ใ€‚ใพใŸใ€ๆ‰‹ๅ‹•ใงๆคœ่จผใ™ใ‚‹ใ“ใจใ‚‚ใงใใพใ™ใ€‚"; +"user_verification_session_details_information_untrusted_other_user" = " ๆ–ฐใ—ใ„ใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’ไฝฟใฃใฆใ‚ตใ‚คใƒณใ‚คใƒณใ—ใพใ—ใŸ:"; +"user_verification_session_details_information_untrusted_current_user" = "ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใ‚’ๆคœ่จผใ™ใ‚‹ใ“ใจใงใ€ไฟก้ ผใงใใ‚‹ใ‚‚ใฎใจใ—ใฆใƒžใƒผใ‚ฏใ—ใ€ๆš—ๅทๅŒ–ใ•ใ‚ŒใŸใƒกใƒƒใ‚ปใƒผใ‚ธใธใฎใ‚ขใ‚ฏใ‚ปใ‚นใ‚’่จฑๅฏใ—ใพใ™ใ€‚"; +"user_verification_session_details_information_trusted_other_user_part2" = " ๆคœ่จผๆธˆใฟ:"; +"user_verification_session_details_information_trusted_other_user_part1" = "ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใฏๅฎ‰ๅ…จใชใ‚‚ใฎใจใ—ใฆไฟก้ ผใ•ใ‚Œใฆใ„ใพใ™ใ€‚ใชใœใชใ‚‰ "; +"user_verification_session_details_information_trusted_current_user" = "ใ“ใฎใ‚ปใƒƒใ‚ทใƒงใƒณใฏใ€ๆคœ่จผใ•ใ‚ŒใŸใŸใ‚ๅฎ‰ๅ…จใชใ‚‚ใฎใจใ—ใฆไฟก้ ผใ•ใ‚Œใฆใ„ใพใ™ใ€‚"; +"user_verification_session_details_untrusted_title" = "ไฟก้ ผใงใใชใ„"; + +// Session details + +"user_verification_session_details_trusted_title" = "ไฟก้ ผๆธˆใฟ"; +"user_verification_sessions_list_session_untrusted" = "ไฟก้ ผใงใใชใ„"; +"user_verification_sessions_list_session_trusted" = "ไฟก้ ผๆธˆใฟ"; +"user_verification_sessions_list_table_title" = "ใ‚ปใƒƒใ‚ทใƒงใƒณไธ€่ฆง"; +"user_verification_sessions_list_information" = "ใ“ใฎ้ƒจๅฑ‹ใซใ„ใ‚‹ใ“ใฎใƒฆใƒผใ‚ถใƒผใจใฎใƒกใƒƒใ‚ปใƒผใ‚ธใฏใ‚จใƒณใƒ‰ใƒ„ใƒผใ‚จใƒณใƒ‰ใงๆš—ๅทๅŒ–ใ•ใ‚ŒใฆใŠใ‚Š็ฌฌไธ‰่€…ใŒ่ชญใฟๅ–ใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“ใ€‚"; +"user_verification_sessions_list_user_trust_level_unknown_title" = "ๆœช็Ÿฅ"; +"user_verification_sessions_list_user_trust_level_warning_title" = "่ญฆๅ‘Š"; + +// Sessions list + +"user_verification_sessions_list_user_trust_level_trusted_title" = "ไฟก้ ผๆธˆใฟ"; +"user_verification_start_additional_information" = "ๅฎ‰ๅฟƒใ—ใฆใ”ๅˆฉ็”จใ„ใŸใ ใใŸใ‚ใซใ€็›ดๆŽฅใŠไผšใ„ใ™ใ‚‹ใ‹ใ€ๅˆฅใฎๆ–นๆณ•ใงใ”้€ฃ็ตกใใ ใ•ใ„ใ€‚"; +"user_verification_start_waiting_partner" = "%@ใ‚’ๅพ…ใฃใฆใ„ใพใ™โ€ฆ"; +"user_verification_start_information_part2" = " ไธกๆ–นใฎใƒ‡ใƒใ‚คใ‚นใงใƒฏใƒณใ‚ฟใ‚คใƒ ใ‚ณใƒผใƒ‰ใ‚’็ขบ่ชใ—ใพใ™ใ€‚"; +"user_verification_start_information_part1" = "ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚’้ซ˜ใ‚ใ‚‹ใŸใ‚ใซ "; + +// MARK: - User verification + +// Start + +"user_verification_start_verify_action" = "ๆคœ่จผใ‚’้–‹ๅง‹ใ™ใ‚‹"; +"key_verification_scan_confirmation_scanned_device_information" = "ใ‚‚ใ†ไธ€ๆ–นใฎใƒ‡ใƒใ‚คใ‚นใซใ‚‚ๅŒใ˜ใ‚ทใƒผใƒซใƒ‰ใŒ่กจ็คบใ•ใ‚Œใฆใ„ใพใ™ใ‹๏ผŸ"; +"key_verification_scan_confirmation_scanned_user_information" = "%@ใฏๅŒใ˜ใ‚ทใƒผใƒซใƒ‰ใ‚’่กจ็คบใ—ใฆใ„ใพใ™ใ‹๏ผŸ"; + +// Scanned +"key_verification_scan_confirmation_scanned_title" = "ใพใ‚‚ใชใใงใ™๏ผ"; +"key_verification_scan_confirmation_scanning_device_waiting_other" = "ไป–ใฎใƒ‡ใƒใ‚คใ‚นใ‚’ๅพ…ใฃใฆใ„ใพใ™โ€ฆ"; + +// MARK: Scan confirmation + +// Scanning +"key_verification_scan_confirmation_scanning_title" = "ใ‚‚ใ†ๅฐ‘ใ—ใงใ™ใ€‚็ขบ่ชใ‚’ๅพ…ใฃใฆใ„ใพใ™โ€ฆ"; +"key_verification_scan_confirmation_scanning_user_waiting_other" = "%@ใ‚’ๅพ…ใฃใฆใ„ใพใ™โ€ฆ"; +"key_verification_verify_qr_code_scan_other_code_success_message" = "QRใ‚ณใƒผใƒ‰ใฎ่ช่จผใซๆˆๅŠŸใ—ใพใ—ใŸใ€‚"; +"key_verification_verify_qr_code_scan_other_code_success_title" = "ใ‚ณใƒผใƒ‰ใŒๆœ‰ๅŠนใซใชใ‚Šใพใ—ใŸ๏ผ"; +"key_verification_verify_qr_code_other_scan_my_code_title" = "็›ธๆ‰‹ใŒQRใ‚ณใƒผใƒ‰ใ‚’่ชญใฟๅ–ใฃใฆใใ‚Œใพใ—ใŸใ‹๏ผŸ"; +"key_verification_verify_qr_code_start_emoji_action" = "็ตตๆ–‡ๅญ—ใซใ‚ˆใ‚‹ๆคœ่จผ"; +"key_verification_verify_qr_code_cannot_scan_action" = "ใ‚นใ‚ญใƒฃใƒณใงใใพใ›ใ‚“ใ‹๏ผŸ"; +"key_verification_verify_qr_code_scan_code_action" = "ใ‚ณใƒผใƒ‰ใ‚’่ชญใฟๅ–ใ‚‹"; +"key_verification_verify_qr_code_emoji_information" = "ใƒฆใƒ‹ใƒผใ‚ฏใช็ตตๆ–‡ๅญ—ใ‚’ๆฏ”่ผƒใ—ใฆๆคœ่จผใ—ใพใ™ใ€‚"; +"key_verification_verify_qr_code_information_other_device" = "ไปฅไธ‹ใฎใ‚ณใƒผใƒ‰ใ‚’ใ‚นใ‚ญใƒฃใƒณใ—ใฆ็ขบ่ชใ—ใฆใใ ใ•ใ„:"; +"key_verification_verify_qr_code_information" = "ใ‚ณใƒผใƒ‰ใ‚’ใ‚นใ‚ญใƒฃใƒณใ—ใฆใ€ใŠไบ’ใ„ใ‚’ใ—ใฃใ‹ใ‚Šใจ็ขบ่ชใ—ใพใ™ใ€‚"; + +// MARK: QR code + +"key_verification_verify_qr_code_title" = "ใ‚นใ‚ญใƒฃใƒณใ—ใฆ็ขบ่ชใ™ใ‚‹"; + +// Incoming key verification request + +"key_verification_incoming_request_incoming_alert_message" = "%@ใฏๆคœ่จผใ‚’ๆฑ‚ใ‚ใฆใ„ใพใ™"; +"key_verification_tile_conclusion_warning_title" = "ไฟก้ ผใ•ใ‚Œใฆใ„ใชใ„ใ‚ตใ‚คใƒณใ‚คใƒณ"; +"key_verification_tile_conclusion_done_title" = "ๆคœ่จผๆธˆใฟ"; +"key_verification_tile_request_incoming_approval_decline" = "ๅดไธ‹"; +"key_verification_tile_request_incoming_approval_accept" = "ๆ‰ฟ่ช"; +"key_verification_tile_request_status_accepted" = "ใ‚ใชใŸใฏๆ‰ฟ่ชใ—ใพใ—ใŸ"; +"key_verification_tile_request_status_cancelled" = "%@ใฏใ‚ญใƒฃใƒณใ‚ปใƒซใ—ใพใ—ใŸ"; +"key_verification_tile_request_status_cancelled_by_me" = "ใ‚ใชใŸใฏใ‚ญใƒฃใƒณใ‚ปใƒซใ—ใพใ—ใŸ"; +"key_verification_tile_request_status_expired" = "ๆœŸ้™ๅˆ‡ใ‚Œ"; +"key_verification_tile_request_status_waiting" = "ใŠๅพ…ใกใใ ใ•ใ„โ€ฆ"; +"key_verification_tile_request_status_data_loading" = "ๆ—ฅๆ™‚ใ‚’่ชญใฟ่พผใฟโ€ฆ"; +"key_verification_tile_request_outgoing_title" = "ๆคœ่จผใฎ้€ไฟก"; + +// Tiles + +"key_verification_tile_request_incoming_title" = "ๆคœ่จผใƒชใ‚ฏใ‚จใ‚นใƒˆ"; +"key_verification_bootstrap_not_setup_message" = "ใพใšใฏใ‚ฏใƒญใ‚น็ฝฒๅใ‚’่กŒใ†ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚"; + +// MARK: - Key Verification + +"key_verification_bootstrap_not_setup_title" = "ใ‚จใƒฉใƒผ"; +"error_not_supported_on_mobile" = "%@ใƒขใƒใ‚คใƒซใ‹ใ‚‰ใฏใงใใพใ›ใ‚“ใ€‚"; + + +// Generic errors +"error_invite_3pid_with_no_identity_server" = "ใƒกใƒผใƒซใงๆ‹›ๅพ…ใ™ใ‚‹ใŸใ‚ใซ่จญๅฎšใ‹ใ‚‰IDใ‚ตใƒผใƒใƒผใ‚’่ฟฝๅŠ ใ—ใพใ™ใ€‚"; + +// MARK: Reaction history +"reaction_history_title" = "ใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใฎๅฑฅๆญด"; +"emoji_picker_places_category" = "ๆ—…ใจๅ ดๆ‰€"; +"emoji_picker_flags_category" = "ๅ›ฝๆ——"; +"emoji_picker_symbols_category" = "ใ‚ทใƒณใƒœใƒซ"; +"emoji_picker_objects_category" = "ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆ"; +"emoji_picker_foods_category" = "้ฃŸใน็‰ฉใจ้ฃฒใฟ็‰ฉ"; +"emoji_picker_nature_category" = "ๅ‹•็‰ฉใจ่‡ช็„ถ"; +"emoji_picker_people_category" = "็ฌ‘้ก”ใจใฟใ‚“ใช"; + +// MARK: Emoji picker +"emoji_picker_title" = "ใƒ”ใƒƒใ‚ซใƒผ"; + +// MARK: File upload +"file_upload_error_title" = "ใƒ•ใ‚กใ‚คใƒซใฎใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ‚จใƒฉใƒผ"; +"file_upload_error_unsupported_file_type_message" = "ใƒ•ใ‚กใ‚คใƒซใฎใ‚ฟใ‚คใƒ—ใŒใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“ใ€‚"; +"device_verification_emoji_pin" = "ใƒ”ใƒณ"; +"device_verification_emoji_folder" = "ใƒ•ใ‚ฉใƒซใƒ€ใƒผ"; +"device_verification_emoji_headphones" = "ใƒ˜ใƒƒใƒ‰ใƒ•ใ‚ฉใƒณ"; +"device_verification_emoji_anchor" = "ใ‚ขใƒณใ‚ซใƒผ"; +"device_verification_emoji_bell" = "ใƒ™ใƒซ"; +"device_verification_emoji_trumpet" = "ใƒˆใƒฉใƒณใƒšใƒƒใƒˆ"; +"device_verification_emoji_guitar" = "ใ‚ฎใ‚ฟใƒผ"; +"device_verification_emoji_ball" = "ใƒœใƒผใƒซ"; +"device_verification_emoji_trophy" = "ใƒˆใƒญใƒ•ใ‚ฃใƒผ"; +"device_verification_emoji_rocket" = "ใƒญใ‚ฑใƒƒใƒˆ"; +"device_verification_emoji_aeroplane" = "้ฃ›่กŒๆฉŸ"; +"device_verification_emoji_bicycle" = "่‡ช่ปข่ปŠ"; +"device_verification_emoji_train" = "้›ป่ปŠ"; +"device_verification_emoji_flag" = "ใƒ•ใƒฉใ‚ฐ"; +"device_verification_emoji_telephone" = "ใƒ†ใƒฌใƒ•ใ‚ฉใƒณ"; +"device_verification_emoji_hammer" = "ใƒใƒณใƒžใƒผ"; +"device_verification_emoji_key" = "้ต"; +"device_verification_emoji_lock" = "้Œ "; +"settings_three_pids_management_information_part1" = "ใƒญใ‚ฐใ‚คใƒณใ‚„ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎๅ›žๅพฉใซไฝฟ็”จใงใใ‚‹ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚„้›ป่ฉฑ็•ชๅทใ‚’ใ“ใ“ใง็ฎก็†ใ—ใพใ™ใ€‚่ชฐใŒใ‚ใชใŸใฎใ“ใจใ‚’็™บ่ฆ‹ใงใใ‚‹ใ‹ใ‚’็ฎก็†ใ™ใ‚‹ "; +"settings_identity_server_settings" = "IDใ‚ตใƒผใƒใƒผ"; +"external_link_confirmation_title" = "ใ“ใฎใƒชใƒณใ‚ฏใ‚’ๅ†็ขบ่ชใ—ใฆใใ ใ•ใ„"; +"media_type_accessibility_sticker" = "ใ‚นใƒ†ใ‚ฃใƒƒใ‚ซใƒผ"; +"media_type_accessibility_file" = "ใƒ•ใ‚กใ‚คใƒซ"; +"media_type_accessibility_location" = "ๅ ดๆ‰€"; +"media_type_accessibility_video" = "ๅ‹•็”ป"; +"media_type_accessibility_audio" = "้Ÿณๅฃฐ"; +"media_type_accessibility_image" = "็”ปๅƒ"; +"room_open_dialpad" = "ใƒ€ใ‚คใƒคใƒซใƒ‘ใƒƒใƒ‰"; +"room_place_voice_call" = "ใƒ“ใƒ‡ใ‚ช้€š่ฉฑ"; +"room_accessibility_hangup" = "้€š่ฉฑใ‚’ๅˆ‡ใ‚‹"; +"room_event_action_delete_confirmation_message" = "ใ“ใฎๆœช้€ไฟกใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅ‰Š้™คใ—ใฆใ‚‚ใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹๏ผŸ"; +"room_accessibility_video_call" = "ใƒ“ใƒ‡ใ‚ช้€š่ฉฑ"; +"room_accessibility_call" = "้€š่ฉฑ"; +"room_accessibility_integrations" = "็ตฑๅˆ"; +"room_accessibility_search" = "ๆคœ็ดข"; +"room_accessibility_upload" = "ใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰"; +"room_message_edits_history_title" = "ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’็ทจ้›†"; +"room_action_reply" = "่ฟ”ไฟก"; +"room_action_send_file" = "ใƒ•ใ‚กใ‚คใƒซใ‚’้€ใ‚‹"; +"room_action_camera" = "ๅ†™็œŸใ‚„ใƒ“ใƒ‡ใ‚ชใฎๆ’ฎๅฝฑ"; +"room_event_action_reaction_history" = "ๅๅฟœใฎๅฑฅๆญด"; +"room_event_action_reaction_show_less" = "ใ™ในใฆ้–‰ใ˜ใ‚‹"; +"room_event_action_reaction_show_all" = "ใ™ในใฆใ‚’่ฆ‹ใ‚‹"; +"room_event_action_edit" = "็ทจ้›†"; +"room_event_action_reply" = "่ฟ”ไฟก"; diff --git a/Riot/Assets/lt.lproj/Vector.strings b/Riot/Assets/lt.lproj/Vector.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/lt.lproj/Vector.strings @@ -0,0 +1 @@ + diff --git a/Riot/Assets/nb-NO.lproj/Vector.strings b/Riot/Assets/nb-NO.lproj/Vector.strings index be44defbb..eb35c73c6 100644 --- a/Riot/Assets/nb-NO.lproj/Vector.strings +++ b/Riot/Assets/nb-NO.lproj/Vector.strings @@ -206,7 +206,7 @@ "identity_server_settings_alert_change_title" = "Bytt ut identitetstjener"; "identity_server_settings_alert_disconnect_button" = "Koble fra"; "room_details_people" = "Medlemmer"; -"room_details_files" = "Filer"; +"room_details_files" = "Filopplastinger"; "room_details_settings" = "Instillinger"; "room_details_room_name" = "Rommets navn"; "room_details_topic" = "Emne"; @@ -308,7 +308,7 @@ "sign_out_non_existing_key_backup_sign_out_confirmation_alert_sign_out_action" = "Logg av"; // MARK: - Device Verification "device_verification_title" = "Verifiser รธkten"; -"device_verification_self_verify_alert_title" = "Ny innlogging"; +"device_verification_self_verify_alert_title" = "Ny innlogging. Var dette deg?"; "device_verification_self_verify_alert_cancel_action" = "Det var ikke meg"; "device_verification_self_verify_start_verify_action" = "Begynn verifisering"; "device_verification_self_verify_start_waiting" = "Venter โ€ฆ"; @@ -400,7 +400,7 @@ "user_verification_session_details_verify_action_current_user" = "Bekreft"; // String for App Store "store_short_description" = "Sikker desentralisert chat/IP-telefoni"; -"store_full_description" = "Kommuniser. Pรฅ din mรฅte.\n\nEn chatte-app som er fleksibel og fullstendig under din kontroll. Riot lar deg kommunisere slik du vil. Laget for [matrix] - standarden for รฅpen, desentralisert kommunikasjon.\n\nSkaff deg en gratis matrix.org-konto og din egen server pรฅ https://modular.im, eller bruk en annen Matrix-server.\n\nHvorfor velge Riot.im?\n\nKOMPLETT KOMMUNIKASJON: Bygg et eget rom til laget ditt, vennene dine, samfunnet ditt - akkurat pรฅ den mรฅten du รธnsker! Chat, del filer, legg til widgeter og foreta tale- og videosamtaler - alt sammen helt gratis.\n\nKRAFTIGE INTEGRASJONER: Bruk Riot.im med verktรธyene du kjenner og elsker. Med Riot.im kan du til og med chatte med brukere og grupper pรฅ andre chatte-apper.\n\nPRIVAT OG SIKKER: Hold samtalene hemmelige. Topp moderne ende-til-ende-kryptering sikrer at privat kommunikasjon forblir privat.\n\nร…PEN, IKKE LUKKET: ร…pen kildekode, og bygd pรฅ Matrix. Ei dine egne data ved รฅ vรฆre vert for din egen server, eller velg en server du stoler pรฅ.\n\nUansett hvor du er: Hold kontakten hvor enn du er med synkronisert meldingshistorikk pรฅ alle enhetene dine, samt pรฅ nettet pรฅ https://riot.im."; +"store_full_description" = "Element er en ny type melding og samhandlings app som:\n\n1. Setter deg i fรธrersetet for รฅ kontrollere personlig informasjon\n2. Lar deg kommunisere med alle brukere i Matrix-nettverket, i tillegg til brukere i tilknyttede nettverk slik som Slack\n3. Beskytter deg fra annonser, datainnhenting, bakdรธrer og lukkede nettverk. \n4. Beskytter deg gjennom at kommunikasjonen er ende-til-ende-kryptert, og at motparten er verifisert. \n\nElement er veldig annerledes enn andre melding og samhandlingsapper ved at det er en desentralisert lรธsning og laget som รฅpen kildekode.\n\nElement lar deg sette opp en egen tjener eller velge en offentlig tjener - slik at du kan beskytte tilgang og eierskap til dine data og samtaler. Det gir deg tilgang tiI et รฅpent nettverk slik at du ikke er begrenset til รฅ kommunisere kun med Element brukere. Og det er veldig sikkert.\n\nElement gjรธr dette mulig ved at det opererer i Matrix - standarden for รฅpen og desentralisert kommunikasjon. \n\nElement setter deg selv i fรธrersetet ved รฅ la deg bestemme hvor dine samtaler skal befinne seg. Fra Element appen kan du velge forskjellige opsjoner/verter:\n\n1. Fรฅ en gratis konto pรฅ den offentlige matrix.org tjeneren. \n2. Sett opp en egen tjener for din konto pรฅ egne maskiner\n3. Registrer deg og opprett en egen tjener og konto pรฅ Element Matrix Services platformen.\n\nHvorfor velge Element?\n\nEI DINE EGNE DATA: Du bestemmer hvor dine data og meldinger oppbevares. Du eier og kontrollerer det, ikke et stort MEGACORP som samler dine data og tilbyr de til tredjeparter.\n\nร…PEN KOMMUNIKASJON OG SAMHANDLING: Du kan melde med hvem som helst i Matrix nettverket; uavhengig om de bruker Element eller en annen Matrix app, og uavhengig av om de bruker andre meldingssystemer slik som Slack, IRC eller XMPP.\n\nSUPER-SIKKER: Sann ende-til-ende-kryptering (kun de i som deltar i samtalen kan dekryptere meldinger), and kryss-signering for รฅ sikre at alle enheter i samtalen er verifisert. \n\nKOMPLETT KOMMUNIKASJONSLร˜SNING: Meldinger, tale og videosamtaler, fildeling, skjermdeling og en hele rekke integrasjoner, bots og widgets. Bygg rom og samfunn, hold kontakt, og fรฅ ting gjort.\n\nOVERALT DU ER: Hold deg oppdatert uansett hvor du er, og med en fullt synkronisert meldingshistorikk, pรฅ tvers av alle enhetene dine og pรฅ web, hos https://element.io/app."; "title_favourites" = "Favoritter"; "on" = "Pรฅ"; "skip" = "Hopp over"; @@ -411,7 +411,7 @@ "client_web_name" = "Riot Web"; "client_ios_name" = "Element iOS"; "client_android_name" = "Element Android"; -"auth_login_single_sign_on" = "Logg inn med รฉn innlogging"; +"auth_login_single_sign_on" = "Logg inn"; "auth_invalid_login_param" = "Feil brukernavn og/eller passord"; "auth_invalid_user_name" = "Brukernavn kan bare inneholde bokstaver, tall, punktum, bindestrek og understrek"; "auth_invalid_password" = "Passordet er for kort (minimum 6 tegn)"; @@ -648,8 +648,8 @@ "room_conference_call_no_power" = "Du trenger tillatelse for รฅ administrere konferansesamtaler i dette rommet"; "room_ongoing_conference_call_with_close" = "Pรฅgรฅende konferansesamtale. Bli med som %@ eller %@. %@ det."; "room_ongoing_conference_call" = "Pรฅgรฅende konferansesamtale. Bli med som %@ eller %@."; -"room_unsent_messages_unknown_devices_notification" = "Meldingen ble ikke sendt pรฅ grunn av ukjente รธkter. %@ eller %@ nรฅ?"; -"room_unsent_messages_notification" = "Meldinger ikke sendt. %@ eller %@ nรฅ?"; +"room_unsent_messages_unknown_devices_notification" = "Meldingen ble ikke sendt pรฅ grunn av ukjente รธkter."; +"room_unsent_messages_notification" = "Meldinger ikke sendt."; "room_offline_notification" = "Tilkoblingen til serveren har gรฅtt tapt."; "encrypted_room_message_reply_to_placeholder" = "Send et kryptert svarโ€ฆ"; "encrypted_room_message_placeholder" = "Send en kryptert meldingโ€ฆ"; @@ -726,7 +726,7 @@ "auth_autodiscover_invalid_response" = "Ugyldig svar pรฅ hjemmeserver"; "auth_accept_policies" = "Vennligst gjennomgรฅ og godta retningslinjene til denne hjemmeserveren:"; "auth_add_email_and_phone_warning" = "Registrering med e-post og telefonnummer pรฅ en gang stรธttes ikke ennรฅ fรธr api eksisterer. Bare telefonnummeret blir tatt i betraktning. Du kan legge til e-postmeldingen din i profilen din i innstillingene."; -"auth_reset_password_success_message" = "Passordet ditt har blitt tilbakestilt.\n\nDu er logget ut av alle รธkter og vil ikke lenger motta push-varsler. For รฅ aktivere varsler pรฅ nytt, logg pรฅ pรฅ nytt pรฅ hver enhet."; +"auth_reset_password_success_message" = "Passordet ditt har blitt tilbakestilt.\n\nDu er logget ut av alle รธkter og vil ikke lenger motta push-varsler. For รฅ aktivere varsler pรฅ nytt, logg inn pรฅ nytt pรฅ hver enhet."; "auth_reset_password_error_is_required" = "Ingen identitetsserver er konfigurert: legg til en i serveralternativene for รฅ tilbakestille passordet ditt."; "auth_reset_password_error_not_found" = "E-postadressen din ser ikke ut til รฅ vรฆre tilknyttet en Matrix-ID pรฅ denne hjemmeserveren."; "auth_reset_password_error_unauthorized" = "Kunne ikke bekrefte e-postadressen: sรธrg for at du har klikket pรฅ lenken i e-posten"; @@ -745,3 +745,43 @@ "auth_email_is_required" = "Ingen identitetsserver er konfigurert, sรฅ du kan ikke legge til en e-postadresse for รฅ tilbakestille passordet ditt i fremtiden."; "active_call_details" = "Aktiv samtale (%@)"; "active_call" = "Aktiv samtale"; + +// MARK: - Invite friends + +"invite_friends_action" = "Inviter venner til %@"; +"home_empty_view_information" = "Alt-i-ett sikker chat-app for team, venner og organisasjoner. Tapp pรฅ + knappen under for รฅ legge til personer og rom."; + +// MARK: - Home + +"home_empty_view_title" = "Velkommen til %@,\n%@"; +"room_member_power_level_admin_in" = "Admin i %@"; +"room_participants_action_section_direct_chats" = "Direktesamtaler"; +"contacts_user_directory_offline_section" = "Brukerliste (frakoblet)"; +"contacts_user_directory_section" = "Brukerliste"; +"directory_searching_title" = "Sรธker i katalogโ€ฆ"; +"directory_search_results_more_than" = ">%tu resultater funnet for %@"; +"directory_search_results_title" = "Utforsk listeresultater"; +"directory_cell_description" = "%tu rom"; + +// Directory +"directory_cell_title" = "Utforsk liste"; + +// Room recents +"room_recents_directory_section" = "Romliste"; +"social_login_button_title_sign_up" = "Registrer deg med %@"; +"social_login_button_title_sign_in" = "Logg inn med %@"; +"social_login_button_title_continue" = "Fortsett med %@"; +"social_login_list_title_sign_up" = "Eller"; +"social_login_list_title_sign_in" = "Eller"; + +// Social login + +"social_login_list_title_continue" = "Fortsett med"; +"callbar_return" = "Returner"; +"callbar_only_multiple_paused" = "%@ pausede samtaler"; +"callbar_only_single_paused" = "Pauset samtale"; +"callbar_active_and_multiple_paused" = "1 aktiv samtale (%@) ยท %@ pausede samtaler"; +"callbar_active_and_single_paused" = "1 aktiv samtale (%@) ยท 1 pauset samtale"; + +// Call Bar +"callbar_only_single_active" = "Aktiv samtale (%@)"; diff --git a/Riot/Assets/nl.lproj/Vector.strings b/Riot/Assets/nl.lproj/Vector.strings index d193952d4..22b8683cc 100644 --- a/Riot/Assets/nl.lproj/Vector.strings +++ b/Riot/Assets/nl.lproj/Vector.strings @@ -320,7 +320,7 @@ "settings_password_updated" = "Uw wachtwoord is bijgewerkt"; "settings_crypto_device_name" = "Apparaatnaam: "; "settings_crypto_device_id" = "\nApparaats-ID: "; -"settings_crypto_device_key" = "\nApparaatssleutel: "; +"settings_crypto_device_key" = "\nApparaatssleutel:\n"; "settings_crypto_export" = "Sleutels exporteren"; "settings_crypto_blacklist_unverified_devices" = "Alleen naar geverifieerde apparaten versleutelen"; // Room Details @@ -566,7 +566,7 @@ "room_message_reply_to_short_placeholder" = "Stuur een antwoordโ€ฆ"; // String for App Store "store_short_description" = "Veilig en gedecentraliseerd chatten en bellen"; -"store_full_description" = "Communiceer op uw manier.\n\nEen chat-app, onder uw controle en heel flexibel. Element laat u communiceren zoals u dat wilt. Gemaakt voor [matrix] - de standaard voor open, gedecentraliseerde communicatie.\n\nMaak een gratis account aan op matrix.org, verkrijg uw eigen server op https://ems.element.io, of gebruik een andere Matrix-server.\n\nWaarom zou ik voor Element kiezen?\n\nโ€ข VOLLEDIGE COMMUNICATIE: maak gesprekken aan rond uw teams, uw vrienden, uw gemeenschap - hoe u maar wilt! Chat, deel bestanden, voeg widgets toe en maak stem- en video-oproepen - allemaal volledig gratis.\n\nโ€ข KRACHTIGE INTEGRATIE: gebruik Element met de hulpmiddelen waarmee u vertrouwd bent. Met Element kunt u zelfs chatten met gebruikers en groepen op andere chat-apps.\n\nโ€ข PRIVร‰ EN VEILIG: houd uw gesprekken geheim. Eind-tot-eind-versleuteling van de bovenste plank zorgt ervoor dat uw privรฉcommunicatie ook privรฉ blijft.\n\nโ€ข OPEN, NIET GESLOTEN: vrije software, gebouwd op Matrix. Wees baas over uw eigen gegevens door uw eigen server te gebruiken, of te kiezen voor een andere server die u vertrouwt.\n\nโ€ข WAAR U OOK BENT: houd contact waar u ook bent met volledig gesynchroniseerde berichtgeschiedenis op al uw apparaten, en online op https://app.element.io."; +"store_full_description" = "Element is een nieuw type messenger en samenwerkings app die:\n\n1. U de controle geeft om uw privacy te behouden\n2. U laat communiceren met iedereen in het Matrix-netwerk, en zelfs daarbuiten door integratie met apps zoals Slack\n3. Beschermt u tegen reclame, datamining, achterdeurtjes en ommuurde netwerken\n4. Beveiligt u door eind-tot-eind versleuteling, met kruislings ondertekenen om anderen te verifiรซren\n\nElement is compleet anders dan andere messengers en samenwerkings-apps, omdat het gedecentraliseerd en open source is.\n\nMet Element kunt u zelf hosten - of een host kiezen - zodat u privacy, eigendom en controle heeft over uw gegevens en gesprekken. Het geeft u toegang tot een open netwerk; u zit dus niet vast aan het praten met alleen andere Element-gebruikers. En het is zeer veilig.\n\nElement is hiertoe in staat omdat het werkt op basis van Matrix - de standaard voor open, gedecentraliseerde communicatie. \n\nElement geeft u de controle door u te laten kiezen wie uw gesprekken host. Vanuit de Element app kunt u kiezen om op verschillende manieren te hosten:\n\n1. Neem een gratis account op de publieke server matrix.org\n2. Host het zelf, uw account door draait op uw eigen server\n3. Laat ons het hosten, meld u aan voor een account op een aangepaste server bij het Element Matrix Services hosting platform\n\nWaarom kiest u voor Element?\n\nEIGENAAR VAN UW GEGEVENS: U bepaalt waar uw gegevens en berichten worden bewaard. U bent de eigenaar en heeft de controle, niet een of andere MEGACORP die uw gegevens mijnt of toegang geeft aan derden.\n\nOPEN MESSAGING EN SAMENWERKING: U kunt met iedereen in het Matrix-netwerk chatten, of ze nu Element of een andere Matrix-app gebruiken, en zelfs als ze een ander messaging-systeem gebruiken zoals Slack, IRC of XMPP.\n\nSUPER-VEILIG: Echte eind-tot-eind versleuteling (alleen degenen in de conversatie kunnen berichten ontsleutelen), en kruislings ondertekenen om de apparaten van gespreksdeelnemers te verifiรซren.\n\nCOMPLETE COMMUNICATIE: Berichten, spraak- en videogesprekken, bestandsdeling, schermdeling en een heleboel integraties, bots en widgets. Bouw gesprekken, gemeenschappen, blijf in contact en krijg het gedaan.\n\nOVERAL WAAR U BENT: Blijf in contact waar u ook bent met volledig gesynchroniseerde berichtgeschiedenis op al uw apparaten en op het web op https://element.io/app."; "auth_login_single_sign_on" = "Aanmelden met enkele aanmelding"; "auth_accept_policies" = "Gelieve het beleid van deze thuisserver te lezen en aanvaarden:"; "auth_autodiscover_invalid_response" = "Ongeldig thuisserverontdekkingsantwoord"; @@ -866,3 +866,593 @@ "auth_email_is_required" = "Er is geen identiteitsserver geconfigureerd, dus u kunt geen e-mailadres toevoegen om uw wachtwoord in de toekomst opnieuw in te stellen."; "auth_phone_is_required" = "Er is geen identiteitsserver geconfigureerd, dus u kunt geen telefoonnummer toevoegen om uw wachtwoord in de toekomst opnieuw in te stellen."; "auth_reset_password_error_is_required" = "Geen identiteitsserver ingesteld: voeg er รฉรฉn toe bij server opties om uw wachtwoord te wijzigen."; + +// MARK: - Secrets set up + +// Recovery Key + +"secrets_setup_recovery_key_title" = "Sla uw veiligheidssleutel op"; +"secure_key_backup_setup_intro_use_security_key_info" = "Genereer een veiligheidssleutel, die op een veilige plek opgeslagen kan worden zoals een wachtwoordmanager."; +"secure_key_backup_setup_intro_use_security_key_title" = "Gebruik een veiligheidssleutel"; +"secrets_setup_recovery_passphrase_summary_information" = "Onthoud uw veiligheidswachtwoord. Het kan gebruikt worden voor het ontgrendelen van uw versleutelde berichten en data."; +"secrets_setup_recovery_passphrase_summary_title" = "Sla uw veiligheidswachtwoord op"; +"secrets_setup_recovery_passphrase_confirm_information" = "Voer uw veiligheidswachtwoord opnieuw in om het te bevestigen."; +"secrets_setup_recovery_passphrase_information" = "Voer een veiligheidswachtwoord in die alleen u kent om uw gegevens te beveiligen op uw server."; + +// Recovery passphrase + +"secrets_setup_recovery_passphrase_title" = "Veiligheidswachtwoord instellen"; +"secure_key_backup_setup_intro_use_security_passphrase_info" = "Voer een veiligheidswachtwoord in die alleen u weet, en genereer een veiligheidssleutel voor uw back-up."; +"secure_key_backup_setup_intro_use_security_passphrase_title" = "Gebruik een veiligheidswachtwoord"; +"secrets_setup_recovery_key_storage_alert_message" = "โœ“ Print het en bewaar het op een veilige plek\nโœ“ Sla het op een USB-sleutel of back-upschijf op\nโœ“ Kopieer het naar uw persoonlijke cloud opslag"; +"room_intro_cell_information_multiple_dm_sentence2" = "Alleen u bent in dit gesprek, tenzij u iemand uitnodigd voor dit gesprek."; +"room_intro_cell_information_dm_sentence2" = "Alleen u twee zijn in dit gesprek, niemand anders kan deelnemen."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence1_part1" = "Dit is het begin van uw directe gesprek met "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " om personen te laten weten waar dit gesprek over gaat."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Voeg een onderwerp toe"; +"room_intro_cell_information_room_with_topic_sentence2" = "Onderwerp: %@"; +"room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_sentence1_part1" = "Dit is het begin van "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Personen toevoegen"; +"room_avatar_view_accessibility_hint" = "Gespreksfoto wijzigen"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "profielfoto"; +"invite_friends_share_text" = "Hoi, start een gesprek met me op %@: %@"; + +// MARK: - Invite friends + +"invite_friends_action" = "Vrienden tot %@ uitnodigen"; +"favourites_empty_view_information" = "U kunt op een paar manieren favorieten maken - de snelste is om een gesprek ingedrukt te houden. Tik op de ster en ze verschijnen hier automatisch om veilig te bewaren."; + +// MARK: - Favourites + +"favourites_empty_view_title" = "Favoriete gesprekken en personen"; +"home_empty_view_information" = "De alles-in-รฉรฉn veilige chat app voor teams, vrienden en organisaties. Klik op de onderstaande + knop om gesprekken te starten met personen en groepen."; + +// MARK: - Home + +"home_empty_view_title" = "Welkom bij %@,\n%@"; +"call_transfer_error_message" = "Oproepdoorschakelen mislukt"; +"call_transfer_error_title" = "Fout"; +"call_transfer_contacts_all" = "Alles"; +"call_transfer_contacts_recent" = "Recent"; +"call_transfer_dialpad" = "Kiestoetsen"; +"call_transfer_users" = "Gebruikers"; + +// MARK: - Call Transfer +"call_transfer_title" = "Doorschakelen"; + +// MARK: - Dial Pad +"dialpad_title" = "Kiestoetsen"; +"room_info_list_section_other" = "Overige"; + +// MARK: - Room Info + +"room_info_list_one_member" = "1 persoon"; +"room_info_list_several_members" = "%@ personen"; +"create_room_placeholder_address" = "#testroom:matrix.org"; +"create_room_section_header_address" = "Adres"; +"create_room_show_in_directory" = "Gesprek weergeven in de catalogus"; +"create_room_section_footer_type" = "Mensen kunnen alleen met een uitnodiging deelnemen aan een privรฉgesprek."; +"create_room_type_public" = "Openbaar gesprek"; +"create_room_type_private" = "Privรฉgesprek"; +"create_room_section_header_type" = "Type gesprek"; +"create_room_section_footer_encryption" = "Versleuteling kan achteraf niet worden uitgeschakeld."; +"create_room_enable_encryption" = "Versleuteling inschakelen"; +"create_room_section_header_encryption" = "Gespreksversleuteling"; +"create_room_placeholder_topic" = "Onderwerp"; +"create_room_section_header_topic" = "Onderwerp (optioneel)"; +"create_room_placeholder_name" = "Naam"; +"create_room_section_header_name" = "Naam"; + +// MARK: - Create Room + +"create_room_title" = "Nieuw Gesprek"; +"searchable_directory_search_placeholder" = "Naam of ID"; +"searchable_directory_x_network" = "%@-netwerk"; + +// MARK: - Searchable Directory View Controller + +"searchable_directory_create_new_room" = "Maak een nieuw gesprek"; +"biometrics_cant_unlocked_alert_message_retry" = "Opnieuw proberen"; +"biometrics_cant_unlocked_alert_message_login" = "Log opnieuw in"; +"biometrics_cant_unlocked_alert_message_x" = "Gebruik %@ om te ontgrendelen of log opnieuw in en schakel %@ opnieuw in"; +"biometrics_cant_unlocked_alert_title" = "Kan uw app niet ontgrendelen"; +"biometrics_usage_reason" = "Authenticatie is nodig om toegang te krijgen tot uw app"; +"biometrics_desetup_disable_button_title_x" = "%@ uitschakelen"; +"biometrics_desetup_title_x" = "%@ uitschakelen"; +"biometrics_setup_subtitle" = "Bespaar uzelf tijd"; +"biometrics_setup_enable_button_title_x" = "%@ inschakelen"; +"biometrics_setup_title_x" = "%@ inschakelen"; +"biometrics_settings_enable_x" = "%@ inschakelen"; +"biometrics_mode_face_id" = "Face ID"; + +// MARK: - Biometrics Protection + +"biometrics_mode_touch_id" = "Touch ID"; +"pin_protection_kick_user_alert_message" = "Te veel fouten, u bent uitgelogd"; +"pin_protection_explanatory" = "Met een PIN beschermt u uw data zoals uw berichten en contacten. Zo heeft alleen u toegang na het invoeren van uw PIN bij het opstarten van de app."; +"pin_protection_not_allowed_pin" = "Om beveiligingsredenen is deze PIN niet beschikbaar. Probeer een andere PIN"; +"pin_protection_settings_change_pin" = "PIN wijzigen"; +"pin_protection_settings_enable_pin" = "PIN inschakelen"; +"pin_protection_settings_enabled_forced" = "PIN ingeschakeld"; +"pin_protection_settings_section_footer" = "Om uw PIN opnieuw in te stellen moet u straks opnieuw inloggen en een nieuwe PIN aanmaken."; +"pin_protection_settings_section_header_x" = "PIN en %@"; +"pin_protection_mismatch_too_many_times_error_message" = "Als u uw PIN bent vergeten, klik op de PIN vergeten-knop."; +"pin_protection_mismatch_error_message" = "Probeer het opnieuw"; +"pin_protection_mismatch_error_title" = "PIN's zijn niet hetzelfde"; +"pin_protection_reset_alert_action_reset" = "Opnieuw instellen"; +"pin_protection_reset_alert_message" = "Om uw PIN opnieuw in te stellen moet u strak opnieuw inloggen en een nieuwe PIN aanmaken"; +"pin_protection_reset_alert_title" = "PIN opnieuw instellen"; +"pin_protection_forgot_pin" = "PIN vergeten"; +"pin_protection_enter_pin" = "Voor uw PIN in"; +"pin_protection_confirm_pin_to_change" = "Bevestig uw PIN om uw PIN te wijzigen"; +"pin_protection_confirm_pin_to_disable" = "Bevestig uw PIN om uw PIN uit te schakelen"; +"pin_protection_confirm_pin" = "Bevestig uw PIN"; +"pin_protection_choose_pin" = "Maak een PIN voor uw veiligheid"; +"pin_protection_choose_pin_welcome_after_register" = "Welkom."; + +// MARK: - PIN Protection + +"pin_protection_choose_pin_welcome_after_login" = "Welkom terug."; +"major_update_done_action" = "Ik snap het"; +"major_update_learn_more_action" = "Leer meer"; +"major_update_information" = "We zijn enthousiast om onze nieuwe naam aan te kondigen! Uw app is up-to-date en u bent ingelogd op uw account."; + +// MARK: - Major update + +"major_update_title" = "Riot is nu Element"; +"cross_signing_setup_banner_subtitle" = "Verifieer uw andere apparaat gemakkelijker"; + +// MARK: - Cross-signing + +// Banner + +"cross_signing_setup_banner_title" = "Versleuteling instellen"; +"secrets_reset_authentication_message" = "Geef het wachtwoord van uw account om te bevestigen"; +"secrets_reset_reset_action" = "Opnieuw instellen"; +"secrets_reset_warning_message" = "U zult opnieuw starten zonder geschiedenis, berichten, vertrouwde apparaten en vertrouwde gebruikers."; +"secrets_reset_warning_title" = "Als u alles terugzet"; +"secrets_reset_information" = "Doe dit alleen, wanneer u geen ander apparaat heeft om dit apparaat mee te verifiรซren."; + +// MARK: - Secrets reset + +"secrets_reset_title" = "Alles terugzetten"; +"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Wachtwoord bevestigen"; +"secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Bevestigen"; +"secrets_setup_recovery_passphrase_validate_action" = "Klaar"; +"secrets_setup_recovery_passphrase_additional_information" = "Gebruik niet het wachtwoord van uw account."; +"secrets_setup_recovery_key_storage_alert_title" = "Bewaar hem op een veilige plaats"; +"secrets_setup_recovery_key_done_action" = "Klaar"; +"secrets_setup_recovery_key_export_action" = "Opslaan"; +"secrets_setup_recovery_key_loading" = "Ladenโ€ฆ"; +"secrets_setup_recovery_key_information" = "Bewaar uw Herstelsleutel op een veilige plek. Het kan gebruikt worden voor het ontgrendelen van uw versleutelde berichten en data."; +"secrets_recovery_with_key_invalid_recovery_key_message" = "Verifieer dat u de juiste herstelsleutel heeft ingevoerd."; +"secrets_recovery_with_key_invalid_recovery_key_title" = "Geen toegang tot geheime opslag"; +"secrets_recovery_with_key_recover_action" = "Gebruik sleutel"; +"secrets_recovery_with_key_recovery_key_placeholder" = "Voer de herstelsleutel in"; +"secrets_recovery_with_key_recovery_key_title" = "Invoeren"; +"secrets_recovery_with_key_information_verify_device" = "Gebruik uw herstelsleutel om dit apparaat te verifiรซren."; +"secrets_recovery_with_key_information_default" = "Ontvang toegang tot uw versleutelde berichtengeschiedenis en uw kruislings ondertekenen ID voor het verifiรซren van andere sessie door het invoeren van uw Herstelsleutel."; + +// Recover with key + +"secrets_recovery_with_key_title" = "Herstelsleutel"; +"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Verifieer dat u het juiste Herstelwachtwoord heeft ingevoerd."; +"secrets_recovery_with_passphrase_invalid_passphrase_title" = "Geen toegang tot geheime opslag"; +"secrets_recovery_with_passphrase_lost_passphrase_action_part3" = "."; +"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "uw Herstelsleutel gebruiken"; +"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Herstelwachtwoord vergeten? Dan kunt u "; +"secrets_recovery_with_passphrase_recover_action" = "Gebruik Wachtwoord"; +"secrets_recovery_with_passphrase_passphrase_placeholder" = "Voer uw Herstelwachtwoord in"; +"secrets_recovery_with_passphrase_passphrase_title" = "Invoeren"; +"secrets_recovery_with_passphrase_information_verify_device" = "Gebruik uw Herstelwachtwoord om dit apparaat te verifiรซren."; +"secrets_recovery_with_passphrase_information_default" = "Ontvang toegang tot uw versleutelde berichtengeschiedenis en uw kruislings ondertekenen ID voor het verifiรซren van andere sessies door het invoeren van uw Herstelwachtwoord."; + +// Recover with passphrase + +"secrets_recovery_with_passphrase_title" = "Herstelwachtwoord"; +"secrets_recovery_reset_action_part_2" = "Alles terugzetten"; + +// MARK: - Secrets recovery + +"secrets_recovery_reset_action_part_1" = "Alle herstelopties vergeten of verloren? "; +"user_verification_session_details_verify_action_other_user" = "Handmatig verifiรซren"; +"user_verification_session_details_verify_action_current_user_manually" = "Handmatig middels een tekst"; +"user_verification_session_details_verify_action_current_user" = "Interactief Verifiรซren"; +"user_verification_session_details_additional_information_untrusted_current_user" = "Als u zich niet heeft aangemeld bij deze sessie, is uw account wellicht geschonden."; +"user_verification_session_details_additional_information_untrusted_other_user" = "Totdat deze persoon de sessie vertrouwd zijn berichten gelabeld met een waarschuwing. Een alternatief is handmatig verifiรซren."; +"user_verification_session_details_information_untrusted_other_user" = " heeft zich in een nieuwe sessie aangemeld:"; +"user_verification_session_details_information_untrusted_current_user" = "Verifieer deze sessie om het als vertrouwd te markeren en het toegang te geven tot versleutelde berichten:"; +"user_verification_session_details_information_trusted_other_user_part2" = " verifieer het:"; +"user_verification_session_details_information_trusted_other_user_part1" = "Deze sessie is vertrouwd voor veilige communicatie omdat "; +"user_verification_session_details_information_trusted_current_user" = "Deze sessie is vertrouwd voor veilige communicatie omdat u het heeft geverifieerd:"; +"user_verification_session_details_untrusted_title" = "Niet vertrouwd"; + +// Session details + +"user_verification_session_details_trusted_title" = "Vertrouwd"; +"user_verification_sessions_list_session_untrusted" = "Niet vertrouwd"; +"user_verification_sessions_list_session_trusted" = "Vertrouwd"; +"user_verification_sessions_list_table_title" = "Sessies"; +"user_verification_sessions_list_information" = "Berichten met deze gebruiker zijn eind-tot-eind versleuteld en kunnen niet door derde partijen gelezen worden."; +"user_verification_sessions_list_user_trust_level_unknown_title" = "Onbekend"; +"user_verification_sessions_list_user_trust_level_warning_title" = "Waarschuwing"; + +// Sessions list + +"user_verification_sessions_list_user_trust_level_trusted_title" = "Vertrouwd"; +"user_verification_start_additional_information" = "Doe dit voor de zekerheid onder vier ogen, of gebruik een andere manier om te communiceren."; +"user_verification_start_waiting_partner" = "Wachten op %@โ€ฆ"; +"user_verification_start_information_part2" = " door een eenmalige code op beide apparaten te controleren."; +"user_verification_start_information_part1" = "Voor extra veiligheid, verifieer "; + +// MARK: - User verification + +// Start + +"user_verification_start_verify_action" = "Verificatie starten"; +"key_verification_scan_confirmation_scanned_device_information" = "Toont het andere apparaat hetzelfde schild?"; +"key_verification_scan_confirmation_scanned_user_information" = "Toont %@ hetzelfde schild?"; + +// Scanned +"key_verification_scan_confirmation_scanned_title" = "Bijna klaar!"; +"key_verification_scan_confirmation_scanning_device_waiting_other" = "Wachten op het andere apparaatโ€ฆ"; +"key_verification_scan_confirmation_scanning_user_waiting_other" = "Wachten op %@โ€ฆ"; + +// MARK: Scan confirmation + +// Scanning +"key_verification_scan_confirmation_scanning_title" = "Bijna klaar! Wachten op bevestigingโ€ฆ"; +"key_verification_verify_qr_code_scan_other_code_success_message" = "De QR-code is gevalideerd."; +"key_verification_verify_qr_code_scan_other_code_success_title" = "Code gevalideerd!"; +"key_verification_verify_qr_code_other_scan_my_code_title" = "Heeft de andere gebruiker de QR-code gescand?"; +"key_verification_verify_qr_code_start_emoji_action" = "Verifiรซren met emoji"; +"key_verification_verify_qr_code_cannot_scan_action" = "Scannen niet mogelijk?"; +"key_verification_verify_qr_code_scan_code_action" = "Scan hun code"; +"key_verification_verify_qr_code_emoji_information" = "Verifieer door unieke emoji te vergelijken."; +"key_verification_verify_qr_code_information_other_device" = "Scan de code hieronder om te verifiรซren:"; +"key_verification_verify_qr_code_information" = "Scan de code om elkaar veilig te verifiรซren."; + +// MARK: QR code + +"key_verification_verify_qr_code_title" = "Verifiรซren met scan"; + +// Incoming key verification request + +"key_verification_incoming_request_incoming_alert_message" = "%@ wil verifiรซren"; +"key_verification_tile_conclusion_warning_title" = "Niet-vertrouwde aanmelding"; +"key_verification_tile_conclusion_done_title" = "Geverifieerd"; +"key_verification_tile_request_incoming_approval_decline" = "Weigeren"; +"key_verification_tile_request_incoming_approval_accept" = "Aanvaarden"; +"key_verification_tile_request_status_accepted" = "U heeft aanvaard"; +"key_verification_tile_request_status_cancelled" = "%@ heeft geannuleerd"; +"key_verification_tile_request_status_cancelled_by_me" = "U heeft geannuleerd"; +"key_verification_tile_request_status_expired" = "Verlopen"; +"key_verification_tile_request_status_waiting" = "Wachtenโ€ฆ"; +"key_verification_tile_request_status_data_loading" = "Gegevens ladenโ€ฆ"; +"key_verification_tile_request_outgoing_title" = "Verificatie verstuurd"; + +// Tiles + +"key_verification_tile_request_incoming_title" = "Verificatieverzoek"; +"key_verification_bootstrap_not_setup_message" = "U moet kruislings ondertekenen eerst instellen."; + +// MARK: - Key Verification + +"key_verification_bootstrap_not_setup_title" = "Fout"; +"error_not_supported_on_mobile" = "U kunt dit niet doen vanaf de mobiele %@."; + + +// Generic errors +"error_invite_3pid_with_no_identity_server" = "Voeg een identiteitsserver toe in uw instellingen, om per e-mail uit te kunnen nodigen."; + +// User + +"key_verification_verified_user_information" = "Berichten met deze gebruikers zijn eind-tot-eind versleuteld en kunnen niet door derde partijen gelezen worden."; +"key_verification_verified_this_session_information" = "U kunt nu veilig uw berichten op dit apparaat lezen. Andere gebruikers weten dat zij u kunnen vertrouwen."; +"key_verification_verified_new_session_information" = "U kunt nu veilig uw berichten op uw andere apparaat lezen. Andere gebruikers weten dat zij u kunnen vertrouwen."; +"key_verification_verified_other_session_information" = "U kunt nu veilig uw berichten in uw andere sessie lezen. Andere gebruikers weten dat zij u kunnen vertrouwen."; +"key_verification_verified_new_session_title" = "Nieuwe sessie geverifieerd!"; +"key_verification_manually_verify_device_validate_action" = "Verifiรซren"; +"key_verification_manually_verify_device_additional_information" = "Als deze niet overeenkomen, dan wordt deze sessie mogelijk door iemand anders onderschept."; +"key_verification_manually_verify_device_key_title" = "Sessiesleutel"; +"key_verification_manually_verify_device_id_title" = "Sessie-ID"; +"key_verification_manually_verify_device_name_title" = "Sessienaam"; +"key_verification_manually_verify_device_instruction" = "Om te verifiรซren dat deze sessie vertrouwd kan worden, contacteert u de eigenaar via een andere methode (bv. persoonlijk of via een telefoontje) en vraagt u hem/haar of de sleutel die hij/zij ziet in zijn/haar Gebruikersinstellingen van deze sessie overeenkomt met de sleutel hieronder:"; + +// MARK: Manually Verify Device + +"key_verification_manually_verify_device_title" = "Handmatig middels een tekst"; +"key_verification_verify_sas_additional_information" = "Gebruik voor de ultieme veiligheid een ander vertrouwd communicatiemiddel of doe dit persoonlijk."; +"key_verification_verify_sas_validate_action" = "Ze komen overeen"; +"key_verification_verify_sas_cancel_action" = "Ze komen niet overeen"; +"key_verification_verify_sas_title_number" = "Vergelijk nummers"; + +// MARK: Verify + +"key_verification_verify_sas_title_emoji" = "Vergelijk de emoji's"; +"device_verification_self_verify_wait_recover_secrets_checking_availability" = "Controleren op andere verificatie mogelijkheden..."; +"device_verification_self_verify_wait_recover_secrets_additional_information" = "Wanneer u geen toegang meer heeft tot een bestaande sessie"; +"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Uw Herstelwachtwoord of -sleutel gebruiken"; +"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Herstelsleutel gebruiken"; +"device_verification_self_verify_wait_additional_information" = "Dit werkt met Element en andere Matrix-apps die kruislings ondertekenen ondersteunen."; +"device_verification_self_verify_wait_information" = "Verifieer deze sessie vanaf een van uw andere sessies, om toegang te krijgen tot de versleutelde berichten.\n\nGebruik de laatste versie van Element op uw andere apparaten:"; +"device_verification_self_verify_wait_new_sign_in_title" = "Verifieer deze login"; + +// MARK: Self verification wait + +"device_verification_self_verify_wait_title" = "Beveiliging afronden"; +"key_verification_self_verify_unverified_sessions_alert_validate_action" = "Nakijken"; +"key_verification_self_verify_unverified_sessions_alert_message" = "Controleer al uw sessies om zeker te zijn dat uw account & berichten veilig zijn."; + +// Unverified sessions + +"key_verification_self_verify_unverified_sessions_alert_title" = "Kijk na waar u aangemeld bent"; +"key_verification_self_verify_current_session_alert_validate_action" = "Verifiรซren"; +"key_verification_self_verify_current_session_alert_message" = "Mogelijk wantrouwen anderen het."; + +// Current session + +"key_verification_self_verify_current_session_alert_title" = "Deze sessie verifiรซren"; +"device_verification_self_verify_start_waiting" = "Wachtenโ€ฆ"; +"device_verification_self_verify_start_information" = "Gebruik deze sessie om uw nieuwe sessie te verifiรซren, waardoor deze laatste toegang verkrijgt tot versleutelde berichten."; +"device_verification_self_verify_start_verify_action" = "Verificatie starten"; +"device_verification_self_verify_alert_validate_action" = "Verifiรซren"; +"device_verification_self_verify_alert_message" = "Verifieer de nieuwe aanmelding op uw account: %@"; + +// MARK: Self verification start + +// New login +"device_verification_self_verify_alert_title" = "Nieuwe aanmelding - was u dat?"; +"device_verification_security_advice_number" = "Vergelijk de cijfers en stel vast dat deze in dezelfde volgorde worden weergeven."; +"device_verification_security_advice_emoji" = "Vergelijk de emoji's en stel vast dat deze in dezelfde volgorde worden weergeven."; +"key_verification_user_title" = "Verifieer hen"; +"key_verification_this_session_title" = "Deze sessie verifiรซren"; +"key_verification_new_session_title" = "Verifieer uw nieuwe sessie"; + +// MARK: - Device Verification +"key_verification_other_session_title" = "Sessie verifiรซren"; +"sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "Gebruik uw Veilige Back-up"; + +// Recover from private key +"key_backup_recover_from_private_key_info" = "Back-up wordt hersteldโ€ฆ"; +"secure_backup_setup_banner_subtitle" = "Bescherm uzelf tegen toegangsverlies van uw versleutelde berichten en data"; + +// Banner + +"secure_backup_setup_banner_title" = "Veilige Back-up"; +"secure_key_backup_setup_cancel_alert_message" = "Wanneer u nu afbreekt en de toegang tot uw sessies verliest, kunt u de versleutelde berichten en data kwijtraken.\n\nU kunt ook een back-up instellen en uw sleutels beheren in de Instellingen."; + + +// Cancel + +"secure_key_backup_setup_cancel_alert_title" = "Weet u het zeker?"; +"secure_key_backup_setup_existing_backup_error_delete_it" = "Verwijder het"; +"secure_key_backup_setup_existing_backup_error_unlock_it" = "Ontsleutelen"; +"secure_key_backup_setup_existing_backup_error_info" = "Ontgrendel het om de Veilige Back-up te gebruiken of verwijder het om een nieuwe berichten back-up te beginnen in de Veilige Back-up."; +"secure_key_backup_setup_existing_backup_error_title" = "Er bestaat al een back-up voor berichten"; +"secure_key_backup_setup_intro_info" = "Bescherm uzelf tegen het verliezen van uw versleutelde berichten en data door uw versleutelingssleutels te back-uppen op onze server."; + +// MARK: Secure backup setup + +// Intro + +"secure_key_backup_setup_intro_title" = "Veilige Back-up"; +"service_terms_modal_policy_checkbox_accessibility_hint" = "Aanvinken om te aanvaarden %@"; +"service_terms_modal_message_identity_server" = "Aanvaard de gebruikersvoorwaarden van de identiteitsserver (%@), om contacten te vinden."; + +// Service terms - Variant for identity server when displayed out of a context +"service_terms_modal_title_identity_server" = "Contacten ontdekken"; +"service_terms_modal_description_for_identity_server_2" = "Wees vindbaar via telefoonnummer of e-mailadres"; +"service_terms_modal_description_for_identity_server_1" = "Vind anderen via telefoonnummer of e-mailadres"; +"service_terms_modal_decline_button" = "Weigeren"; +"room_widget_permission_room_id_permission" = "Gespreks-ID"; +"room_widget_permission_widget_id_permission" = "Widget-ID"; +"room_widget_permission_theme_permission" = "Uw thema"; +"room_widget_permission_user_id_permission" = "Uw gebruikers-ID"; +"room_widget_permission_avatar_url_permission" = "Uw profielfoto-URL"; +"room_widget_permission_display_name_permission" = "Uw weergavenaam"; +"room_widget_permission_information_title" = "Dit gebruiken kan gegevens delen met %@:\n"; +"room_widget_permission_webview_information_title" = "Dit gebruiken kan cookies toevoegen en gegevens delen met %@:\n"; +"room_widget_permission_creator_info_title" = "Deze widget is toegevoegd door:"; + +// Room widget permissions +"room_widget_permission_title" = "Widget laden"; +"widget_picker_manage_integrations" = "Beheer integratiesโ€ฆ"; +"widget_integration_manager_disabled" = "U moet een integratebeheerder inschakelen in uw instellingen"; +"widget_menu_remove" = "Verwijderen voor iedereen"; +"widget_menu_revoke_permission" = "Toegang intrekken voor mij"; +"widget_menu_open_outside" = "Openen in browser"; +"widget_menu_refresh" = "Herladen"; +"bug_report_background_mode" = "Op de achtergrond doorgaan"; +"call_actions_unhold" = "Hervatten"; +"call_no_stun_server_error_use_fallback_button" = "Probeer %@ te gebruiken"; +"call_no_stun_server_error_message_2" = "U kunt ook de publieke server op %@ gebruiken, maar dit zal minder betrouwbaar zijn, en zal uw IP-adres met die server delen. U kunt dit ook beheren in de Instellingen"; +"call_no_stun_server_error_message_1" = "Vraag uw thuisserverbeheerder %@ een TURN-server te configureren teneinde oproepen betrouwbaar te doen werken."; +"call_no_stun_server_error_title" = "Oproep mislukt door verkeerd geconfigureerde server"; +"event_formatter_jitsi_widget_removed_by_you" = "U heeft een VoIP-vergadering verwijderd"; +"event_formatter_jitsi_widget_added_by_you" = "U heeft een VoIP-vergadering toegevoegd"; +"event_formatter_widget_removed_by_you" = "U heeft deze widget verwijderd: %@"; + +// Events formatter with you +"event_formatter_widget_added_by_you" = "U heeft deze widget toegevoegd: %@"; +"event_formatter_call_back" = "Terugbellen"; +"event_formatter_call_you_declined" = "U heeft de oproep afgewezen"; +"event_formatter_call_you_currently_in" = "U bent momenteel in deze oproep"; +"event_formatter_call_has_ended" = "Deze oproep is beรซindigd"; +"event_formatter_call_video" = "Video-oproep"; +"event_formatter_call_voice" = "Audio-oproep"; +"room_details_advanced_e2e_encryption_disabled_for_dm" = "Versleuteling is hier niet ingeschakeld."; +"room_details_advanced_e2e_encryption_enabled_for_dm" = "Versleuteling is hier ingeschakeld"; +"room_details_advanced_room_id_for_dm" = "ID:"; +"room_details_no_local_addresses_for_dm" = "Dit heeft geen lokaaladres"; +"room_details_access_section_directory_toggle_for_dm" = "Weergeven in publieke groepsgesprekkencatalogus"; +"room_details_access_section_anyone_for_dm" = "Iedereen die de koppeling kent, inclusief gasten"; +"room_details_access_section_anyone_apart_from_guest_for_dm" = "Iedereen die de koppeling kent, behalve gasten"; +"room_details_access_section_for_dm" = "Wie mag toegang hebben?"; +"room_details_room_name_for_dm" = "Naam"; +"room_details_photo_for_dm" = "Foto"; +"room_details_title_for_dm" = "Details"; +"identity_server_settings_alert_error_invalid_identity_server" = "%@ is geen geldige identiteitsserver."; +"identity_server_settings_alert_error_terms_not_accepted" = "U moet de voorwaarden van %@ aanvaarden om deze als identiteitsserver in te stellen."; +"identity_server_settings_alert_disconnect_still_sharing_3pid_button" = "Verbinding toch verbreken"; +"identity_server_settings_alert_disconnect_still_sharing_3pid" = "U deelt nog persoonlijke gegevens op de identiteitsserver %@.\n\nVoordat u de verbinding verbreekt wordt het u aangeraden uw e-mailadressen en telefoonnummers van de identiteitsserver te verwijderen."; +"identity_server_settings_alert_disconnect_button" = "Verbinding verbreken"; +"identity_server_settings_alert_disconnect" = "Wilt u de verbinding met de identiteitsserver %@ verbreken?"; +"identity_server_settings_alert_disconnect_title" = "Verbinding met identiteitsserver verbreken"; +"identity_server_settings_alert_change" = "Verbinding met identiteitsserver %1$@ verbreken en in plaats daarvan verbinden met %2$@?"; +"identity_server_settings_alert_change_title" = "Identiteitsserver wisselen"; +"identity_server_settings_alert_no_terms" = "De door u gekozen identiteitsserver heeft geen dienstvoorwaarden. Ga alleen door, wanneer u de eigenaar van de server vertrouwd."; +"identity_server_settings_alert_no_terms_title" = "De identiteitsserver heeft geen dienstvoorwaarden"; +"identity_server_settings_disconnect" = "Verbinding verbreken"; +"identity_server_settings_disconnect_info" = "De verbinding met uw identiteitsserver verbreken zal ertoe leiden dat u niet door andere mensen gevonden zal kunnen worden, en dat u anderen niet via e-mail of telefoon zal kunnen uitnodigen."; +"identity_server_settings_change" = "Wijzigen"; +"identity_server_settings_add" = "Toevoegen"; +"identity_server_settings_place_holder" = "Voer een identiteitsserver in"; +"identity_server_settings_no_is_description" = "U gebruikt momenteel geen identiteitsserver. Voeg er hierboven รฉรฉn toe om bekenden te kunnen vinden en voor hen vindbaar te zijn."; +"identity_server_settings_description" = "U gebruikt momenteel %@ om gevonden te kunnen worden en bestaande contacten te ontdekken."; + +// Identity server settings +"identity_server_settings_title" = "Identiteitsserver"; + +// AuthenticatedSessionViewControllerFactory +"authenticated_session_flow_not_supported" = "Deze app ondersteunt de verificatiemethode op uw homeserver niet."; +"manage_session_sign_out" = "Deze sessie afmelden"; +"manage_session_not_trusted" = "Niet vertrouwd"; +"manage_session_trusted" = "Door u vertrouwd"; +"manage_session_name" = "Sessienaam"; +"manage_session_info" = "SESSIE INFO"; + +// Manage session +"manage_session_title" = "Beheer sessie"; +"security_settings_user_password_description" = "Bevestig uw identiteit door uw accountwachtwoord in te voeren"; +"security_settings_coming_soon" = "Sorry. Deze actie is nog niet beschikbaar in Element iOS. Gebruik een andere Matrix-app om het in te stellen. Element iOS zal het dan wel gebruiken."; +"security_settings_complete_security_alert_message" = "U moet de beveiliging van uw huidige sessie nog afronden."; +"security_settings_complete_security_alert_title" = "Beveiliging afronden"; +"security_settings_blacklist_unverified_devices_description" = "Verifieer alle sessies van een gebruiker om deze als vertrouwd te markeren en berichten naar te zenden."; +"security_settings_blacklist_unverified_devices" = "Verzend nooit berichten naar niet-vertrouwde sessies"; +"security_settings_advanced" = "GEAVANCEERD"; +"security_settings_export_keys_manually" = "Exporteer sleutels handmatig"; +"security_settings_cryptography" = "CRYPTOGRAFIE"; +"security_settings_crosssigning_complete_security" = "Beveiliging afronden"; +"security_settings_crosssigning_reset" = "Kruislings ondertekenen resetten"; +"security_settings_crosssigning_bootstrap" = "Kruislings ondertekenen instellen"; +"security_settings_crosssigning_info_ok" = "Kruislings ondertekenen is ingeschakeld."; +"security_settings_crosssigning_info_trusted" = "Kruislings ondertekenen is ingeschakeld. U kunt andere personen en sessies verifiรซren met kruislings ondertekenen, maar u kunt dit nog niet vanaf deze sessie doordat de versleutelingssleutel ontbreekt. Rond de beveiliging van deze sessie af."; +"security_settings_crosssigning_info_exists" = "Uw account heeft een kruislings ondertekenen ID, maar is nog niet geverifieerd door deze sessie. Rond de beveiliging van deze sessie af."; +"security_settings_crosssigning_info_not_bootstrapped" = "Kruislings ondertekenen is nog niet ingesteld."; +"security_settings_crosssigning" = "KRUISLINGS ONDERTEKENEN"; +"security_settings_backup" = "BERICHTENBACK-UP"; +"security_settings_secure_backup_delete" = "Verwijderen"; +"security_settings_secure_backup_synchronise" = "Synchroniseren"; +"security_settings_secure_backup_setup" = "Instellen"; +"security_settings_secure_backup_description" = "Een waarborg voor toegang tot uw versleutelde berichten & data door de versleutelingssleutels op te slaan op uw server."; +"security_settings_secure_backup" = "VEILIGE BACK-UP"; +"security_settings_crypto_sessions_description_2" = "Als u deze inlog niet herkent, verander uw wachtwoord en reset uw Veilige Back-up."; +"security_settings_crypto_sessions_loading" = "Sessies ladenโ€ฆ"; +"security_settings_crypto_sessions" = "MIJN SESSIES"; + +// Security settings +"security_settings_title" = "Beveiliging"; +"settings_show_NSFW_public_rooms" = "NSFW openbare gesprekken weergeven"; +"settings_identity_server_no_is_description" = "U gebruikt momenteel geen identiteitsserver. Voeg er hierboven รฉรฉn toe om bekenden te kunnen vinden en voor hen vindbaar te zijn."; +"settings_identity_server_no_is" = "Geen identiteitsserver geconfigureerd"; +"settings_identity_server_description" = "Met de hierboven ingestelde identiteitsserver kan u uw contacten vinden en bent u vindbaar voor uw contacten."; +"settings_discovery_three_pid_details_enter_sms_code_action" = "SMS-activeringscode invoeren"; +"settings_discovery_three_pid_details_cancel_email_validation_action" = "E-mailbevestiging afbreken"; +"settings_discovery_three_pid_details_revoke_action" = "Intrekken"; +"settings_discovery_three_pid_details_share_action" = "Delen"; +"settings_discovery_three_pid_details_information_phone_number" = "Beheer de voorkeuren voor dit telefoonnummer, dat andere gebruikers kunnen gebruiken om u te vinden en u uit te nodigen tot gesprekken. Telefoonnummers toevoegen of verwijderen in Accounts."; +"settings_discovery_three_pid_details_title_phone_number" = "Beheer telefoonnummer"; +"settings_discovery_three_pid_details_information_email" = "Beheer de voorkeuren voor dit e-mailadres, dat andere gebruikers kunnen gebruiken om u te vinden en u uit te nodigen tot gesprekken. E-mailadressen toevoegen of verwijderen in Accounts."; +"settings_discovery_three_pid_details_title_email" = "E-mail beheren"; +"settings_discovery_error_message" = "Er is een fout opgetreden. Probeer het opnieuw."; +"settings_discovery_three_pids_management_information_part3" = "."; +"settings_discovery_three_pids_management_information_part2" = "Gebruikersinstellingen"; +"settings_discovery_three_pids_management_information_part1" = "Beheer e-mailadressen en telefoonnummers die andere gebruikers kunnen gebruiken om u te vinden en u uit te nodigen voor een gesprekken. E-mailadressen of telefoonnummers toevoegen of verwijderen van deze lijst kan in "; +"settings_discovery_terms_not_signed" = "Aanvaard de gebruikersvoorwaarden van de identiteitsserver (%@) om vindbaar te zijn op e-mailadres of telefoonnummer."; +"settings_discovery_no_identity_server" = "U gebruikt momenteel geen identiteitsserver. Om door de u bekende contacten vindbaar te zijn, voeg er een toe."; +"settings_devices_description" = "De publieke naam van een sessie is zichtbaar voor de personen waarmee u communiceert"; +"settings_add_3pid_invalid_password_message" = "Ongeldig wachtwoord"; +"settings_add_3pid_password_message" = "Geef uw wachtwoord om verder te gaan"; +"settings_add_3pid_password_title_msidsn" = "Telefoonnummer toevoegen"; +"settings_add_3pid_password_title_email" = "E-mailadres toevoegen"; +"settings_integrations_allow_description" = "Gebruik een integratiebeheerder om bots, bruggen, widgets en stickerpakketten te beheren.\n\nIntegratiebeheerders ontvangen configuratiedata en kunnen widgets aanpassen, gespreksuitnodigingen versturen en bestuursniveaus instellen namens u."; +"settings_integrations_allow_button" = "Beheer integraties"; +"settings_calls_stun_server_fallback_description" = "Sta de terugvalserver voor oproepbijstand %@ toe wanneer uw homeserver er geen aanbiedt (uw IP-adres wordt gedeeld gedurende een oproep)."; +"settings_calls_stun_server_fallback_button" = "Terugvalserver voor oproepen toestaan"; +"settings_security" = "BEVEILIGING"; +"settings_three_pids_management_information_part3" = "."; +"settings_three_pids_management_information_part2" = "Ontdekken"; +"settings_three_pids_management_information_part1" = "Beheer hier de e-mailadressen en telefoonnummers die u kunt gebruiken om zich aan te melden, of om uw account te herstellen. Controleer wie u vinden kan in "; +"settings_integrations" = "INTEGRATIES"; +"settings_identity_server_settings" = "IDENTITEITSSERVER"; +"settings_discovery_settings" = "ONTDEKKEN"; +"external_link_confirmation_message" = "Deze koppeling %@ brengt u naar een andere website: %@\n\nWeet u zeker dat u door wilt gaan?"; +"external_link_confirmation_title" = "Controleer deze koppeling"; +"room_open_dialpad" = "Kiestoetsen"; +"room_place_voice_call" = "Audio-oproep"; +"room_event_action_delete_confirmation_message" = "Weet u zeker dat u alle niet verzonden berichten wilt verwijderen?"; +"room_event_action_delete_confirmation_title" = "Niet verzonden berichten verwijderen"; +"room_unsent_messages_cancel_message" = "Weet u zeker dat u alle niet verzonden berichten in dit gesprek wilt verwijderen?"; +"room_unsent_messages_cancel_title" = "Niet verzonden berichten verwijderen"; +"room_member_power_level_short_custom" = "Aangepast"; +"room_member_power_level_short_moderator" = "Mod"; +"room_member_power_level_short_admin" = "Beheerder"; +"room_member_power_level_custom_in" = "Aangepast (%@) in %@"; +"room_member_power_level_moderator_in" = "Moderator in %@"; +"room_member_power_level_admin_in" = "Beheerder in %@"; +"room_participants_security_information_room_encrypted_for_dm" = "Berichten zijn hier eind-tot-eind versleuteld.\n\nUw berichten zijn met een digitale sleutel beveiligd, alleen u en de ontvanger hebben de unieke sleutels om deze berichten te ontgrendelen."; +"room_participants_security_information_room_encrypted" = "Berichten in dit gesprek zijn eind-tot-eind versleuteld.\n\nUw berichten zijn met een digitale sleutel beveiligd, alleen u en de ontvanger hebben de unieke sleutels om deze berichten te ontgrendelen."; +"room_participants_security_information_room_not_encrypted_for_dm" = "Berichten zijn hier niet eind-tot-eind versleuteld."; +"room_participants_security_information_room_not_encrypted" = "Berichten in dit gesprek zijn niet eind-tot-eind versleuteld."; +"room_participants_security_loading" = "Ladenโ€ฆ"; +"room_participants_action_security_status_loading" = "Ladenโ€ฆ"; +"room_participants_action_security_status_warning" = "Waarschuwing"; +"room_participants_action_security_status_complete_security" = "Complete beveiliging"; +"room_participants_action_security_status_verify" = "Verifiรซren"; +"room_participants_action_security_status_verified" = "Geverifieerd"; +"room_participants_action_section_security" = "Beveiliging"; +"room_participants_filter_room_members_for_dm" = "Deelnemers filteren"; +"room_participants_leave_prompt_msg_for_dm" = "Weet u zeker dat u het gesprek wilt verlaten?"; +"room_participants_leave_prompt_title_for_dm" = "Verlaten"; +"contacts_address_book_no_identity_server" = "Geen identiteitsserver geconfigureerd"; +"rooms_empty_view_information" = "Groepsgesprekken zijn geschikt voor alle gesprekken, privรฉ of publiek. Klik op de + om de bestaande groepen te verkennen of maak een nieuwe."; +"rooms_empty_view_title" = "Gesprekken"; +"people_empty_view_information" = "Veilig communiceren met iedereen. Druk op + om personen toe te voegen."; +"people_empty_view_title" = "Personen"; +"social_login_button_title_sign_up" = "Registreren met %@"; +"social_login_button_title_sign_in" = "Aanmelden met %@"; +"social_login_button_title_continue" = "Doorgaan met %@"; +"social_login_list_title_sign_up" = "Of"; +"social_login_list_title_sign_in" = "Of"; + +// Social login + +"social_login_list_title_continue" = "Doorgaan met"; +"callbar_return" = "Terug"; +"callbar_only_multiple_paused" = "%@ oproepen in de wacht"; +"callbar_only_single_paused" = "Oproep in de wacht"; +"callbar_active_and_multiple_paused" = "1 oproep actief (%@) ยท %@ oproepen in de wacht"; +"callbar_active_and_single_paused" = "1 oproep actief (%@) ยท 1 oproep in de wacht"; + +// Call Bar +"callbar_only_single_active" = "Oproep actief (%@)"; +"less" = "Minder"; +"more" = "Meer"; +"switch" = "Wissel"; +"joined" = "Toegetreden"; +"store_promotional_text" = "Privacy-beschermende chat- en samenwerkingsapp, op een open netwerk. Gedecentraliseerd, zodat u de controle hebt. Geen datamining, geen achterdeurtjes en geen toegang voor derden."; +"room_details_integrations" = "Integraties"; +"room_details_search" = "Zoek in gesprek"; +"room_multiple_typing_notification" = "%@ en anderen"; +"room_accessibility_video_call" = "Video-oproep"; +"room_message_replying_to" = "Antwoord aan %@"; +"room_message_editing" = "Bewerken"; diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index a2582a618..b94a62387 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -210,8 +210,8 @@ "room_message_short_placeholder" = "Digite uma mensagemโ€ฆ"; "room_message_reply_to_short_placeholder" = "Digite sua respostaโ€ฆ"; "room_offline_notification" = "A conectividade com o servidor foi perdida."; -"room_unsent_messages_notification" = "Mensagens nรฃo enviadas. %@ ou %@ agora?"; -"room_unsent_messages_unknown_devices_notification" = "Mensagem nรฃo enviada devido ร  presenรงa de sessรตes desconhecidas. %@ ou %@ agora?"; +"room_unsent_messages_notification" = "Falha ao enviar mensagens."; +"room_unsent_messages_unknown_devices_notification" = "Mensagem nรฃo enviada devido ร  presenรงa de sessรตes desconhecidas."; "room_ongoing_conference_call" = "Chamada em grupo em andamento. Junte-se como %@ ou %@."; "room_ongoing_conference_call_with_close" = "Chamada em grupo em andamento. Junte-se como %@ ou %@. %@ isto."; "room_ongoing_conference_call_close" = "Fechar"; @@ -861,7 +861,7 @@ "settings_labs_message_reaction" = "Adicionar reaรงรตes em mensagens"; "settings_add_3pid_password_title_msidsn" = "Adicionar nรบmero de telefone"; "settings_add_3pid_password_message" = "Para continuar, por favor, digite sua senha"; -"settings_add_3pid_invalid_password_message" = "Senha invรกlida"; +"settings_add_3pid_invalid_password_message" = "Credenciais invรกlidas"; "settings_key_backup_button_connect" = "Autorize esta sessรฃo a fazer o backup de chaves"; "settings_discovery_no_identity_server" = "No momento, vocรช nรฃo estรก usando um servidor de identidade. Para descobrir e ser descoberto pelos contatos existentes, adicione um abaixo."; "settings_discovery_error_message" = "Um erro ocorreu. Por favor, tente novamente mais tarde."; @@ -1260,9 +1260,61 @@ "social_login_button_title_sign_up" = "Registrar-se com %@"; "social_login_button_title_sign_in" = "Entrar com %@"; "social_login_button_title_continue" = "Continuar com %@"; -"social_login_list_title_sign_up" = "Ou registrar-se com"; -"social_login_list_title_sign_in" = "Ou entrar com"; +"social_login_list_title_sign_up" = "Ou"; +"social_login_list_title_sign_in" = "Ou"; // Social login "social_login_list_title_continue" = "Continuar com"; +"room_avatar_view_accessibility_hint" = "Alterar a imagem da sala"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "imagem"; +"call_transfer_contacts_all" = "Todos"; +"call_transfer_contacts_recent" = "Recente"; +"call_transfer_users" = "Pessoas"; +"event_formatter_call_has_ended" = "Essa chamada foi encerrada"; +"room_intro_cell_information_multiple_dm_sentence2" = "Somente vocรชs estรฃo nesta conversa, ao menos atรฉ que convidem alguรฉm para participar."; +"room_intro_cell_information_dm_sentence2" = "Apenas vocรชs dois/duas estรฃo nesta conversa, ninguรฉm mais pode entrar."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence1_part1" = "Este รฉ o inรญcio de sua conversa com "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " para que as pessoas saibam do que se trata essa sala."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Adicionar uma descriรงรฃo"; +"room_intro_cell_information_room_with_topic_sentence2" = "Descriรงรฃo: %@"; +"room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_sentence1_part1" = "Este รฉ o comeรงo de "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Adicionar pessoas"; +"call_transfer_error_message" = "Falha ao transferir a chamada"; +"call_transfer_error_title" = "Erro"; +"call_transfer_dialpad" = "Teclado de discagem"; + +// MARK: - Call Transfer +"call_transfer_title" = "Transferir"; + +// MARK: - Dial Pad +"dialpad_title" = "Teclado de discagem"; +"call_actions_unhold" = "Retomar"; +"event_formatter_call_back" = "Ligar de volta"; +"event_formatter_call_you_declined" = "Vocรช recusou esta chamada"; +"event_formatter_call_you_currently_in" = "Vocรช estรก nesta chamada"; +"event_formatter_call_video" = "Chamada de vรญdeo"; +"event_formatter_call_voice" = "Chamada de voz"; +"settings_show_NSFW_public_rooms" = "Exibir salas pรบblicas com conteรบdo sensรญvel"; +"room_open_dialpad" = "Teclado de discagem"; +"room_place_voice_call" = "Chamada de voz"; +"room_event_action_delete_confirmation_message" = "Tem certeza de que deseja excluir esta mensagem nรฃo enviada?"; +"room_event_action_delete_confirmation_title" = "Excluir mensagem nรฃo enviada"; +"room_unsent_messages_cancel_message" = "Tem certeza de que deseja excluir todas as mensagens nรฃo enviadas nesta sala?"; +"room_unsent_messages_cancel_title" = "Excluir mensagens nรฃo enviadas"; +"callbar_return" = "Retornar"; +"callbar_only_multiple_paused" = "%@ chamadas pausadas"; +"callbar_only_single_paused" = "Chamada pausada"; +"callbar_active_and_multiple_paused" = "1 chamada em andamento (%@) ยท %@ chamadas pausadas"; +"callbar_active_and_single_paused" = "1 chamada em andamento (%@) ยท 1 chamada pausada"; + +// Call Bar +"callbar_only_single_active" = "Chamada em andamento (%@)"; diff --git a/Riot/Assets/ru.lproj/Vector.strings b/Riot/Assets/ru.lproj/Vector.strings index b9f7a1582..4b717f3f8 100644 --- a/Riot/Assets/ru.lproj/Vector.strings +++ b/Riot/Assets/ru.lproj/Vector.strings @@ -874,7 +874,7 @@ "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_invalid_password_message" = "ะะตะดะตะนัั‚ะฒะธั‚ะตะปัŒะฝั‹ะต ะดะฐะฝะฝั‹ะต"; "settings_discovery_three_pid_details_title_phone_number" = "ะฃะฟั€ะฐะฒะปะตะฝะธะต ะฝะพะผะตั€ะฐ ั‚ะตะปะตั„ะพะฝะฐ"; "settings_identity_server_no_is" = "ะกะตั€ะฒะตั€ ะธะดะตะฝั‚ะธั„ะธะบะฐั†ะธะธ ะฝะต ะฝะฐัั‚ั€ะพะตะฝ"; "identity_server_settings_disconnect" = "ะ ะฐะทัŠะตะดะธะฝะธั‚ัŒ"; @@ -1278,5 +1278,63 @@ "social_login_list_title_continue" = "ะŸั€ะพะดะพะปะถะธั‚ัŒ ั"; "social_login_button_title_continue" = "ะŸั€ะพะดะพะปะถะธั‚ัŒ ั %@"; -"social_login_list_title_sign_up" = "ะ˜ะปะธ ะทะฐั€ะตะณะธัั‚ั€ะธั€ัƒะนั‚ะตััŒ ั‡ะตั€ะตะท"; -"social_login_list_title_sign_in" = "ะ˜ะปะธ ะฒะพะนะดะธั‚ะต ั‡ะตั€ะตะท"; +"social_login_list_title_sign_up" = "ะ˜ะปะธ"; +"social_login_list_title_sign_in" = "ะ˜ะปะธ"; +"room_intro_cell_information_multiple_dm_sentence2" = "ะขะพะปัŒะบะพ ะฒั‹ ะฝะฐั…ะพะดะธั‚ะตััŒ ะฒ ัั‚ะพะผ ั€ะฐะทะณะพะฒะพั€ะต, ะตัะปะธ ั‚ะพะปัŒะบะพ ะบั‚ะพ-ั‚ะพ ะธะท ะฒะฐั ะฝะต ะฟั€ะธะณะปะฐัะธั‚ ะบะพะณะพ-ั‚ะพ ะฟั€ะธัะพะตะดะธะฝะธั‚ัŒัั."; +"room_intro_cell_information_dm_sentence2" = "ะขะพะปัŒะบะพ ะดะฒะพะต ะธะท ะฒะฐั ะฒ ัั‚ะพะผ ั€ะฐะทะณะพะฒะพั€ะต, ะฝะธะบั‚ะพ ะดั€ัƒะณะพะน ะฝะต ะผะพะถะตั‚ ะฟั€ะธัะพะตะดะธะฝะธั‚ัŒัั."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence1_part1" = "ะญั‚ะพ ะฝะฐั‡ะฐะปะพ ะฒะฐัˆะธั… ะปะธั‡ะฝั‹ั… ัะพะพะฑั‰ะตะฝะธะน ั "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " ั‡ั‚ะพะฑั‹ ะปัŽะดะธ ะทะฝะฐะปะธ, ะพ ั‡ั‘ะผ ัั‚ะฐ ะบะพะผะฝะฐั‚ะฐ."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "ะ”ะพะฑะฐะฒัŒั‚ะต ั‚ะตะผัƒ"; +"room_intro_cell_information_room_with_topic_sentence2" = "ะขะตะผะฐ: %@"; +"room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_sentence1_part1" = "ะญั‚ะพ ะฝะฐั‡ะฐะปะพ "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "ะ”ะพะฑะฐะฒะธั‚ัŒ ะปัŽะดะตะน"; +"room_avatar_view_accessibility_hint" = "ะ˜ะทะผะตะฝะธั‚ัŒ ะฐะฒะฐั‚ะฐั€ ะบะพะผะฝะฐั‚ั‹"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "ะฐะฒะฐั‚ะฐั€"; +"call_transfer_error_message" = "ะŸะตั€ะตะดะฐั‡ะฐ ะฒั‹ะทะพะฒะฐ ะฝะต ัƒะดะฐะปะฐััŒ"; +"call_transfer_error_title" = "ะžัˆะธะฑะบะฐ"; +"call_transfer_contacts_all" = "ะ’ัะต"; +"call_transfer_contacts_recent" = "ะะตะดะฐะฒะฝะธะต"; +"call_transfer_dialpad" = "ะŸะฐะฝะตะปัŒ ะฝะฐะฑะพั€ะฐ ะฝะพะผะตั€ะฐ"; +"call_transfer_users" = "ะŸะพะปัŒะทะพะฒะฐั‚ะตะปะธ"; + +// MARK: - Call Transfer +"call_transfer_title" = "ะŸะตั€ะตะฒะพะด"; + +// MARK: - Dial Pad +"dialpad_title" = "ะŸะฐะฝะตะปัŒ ะฝะฐะฑะพั€ะฐ ะฝะพะผะตั€ะฐ"; +"callbar_return" = "ะ’ะตั€ะฝัƒั‚ัŒัั"; +"call_actions_unhold" = "ะ’ะพะทะพะฑะฝะพะฒะธั‚ัŒ"; +"event_formatter_call_back" = "ะŸะตั€ะตะทะฒะพะฝะธั‚ัŒ"; +"event_formatter_call_you_declined" = "ะ’ั‹ ะพั‚ะบะปะพะฝะธะปะธ ัั‚ะพั‚ ะฒั‹ะทะพะฒ"; +"event_formatter_call_you_currently_in" = "ะ’ั‹ ะฒ ัั‚ะพะผ ะฒั‹ะทะพะฒะต"; +"event_formatter_call_has_ended" = "ะญั‚ะพั‚ ะฒั‹ะทะพะฒ ะทะฐะบะพะฝั‡ะธะปัั"; +"event_formatter_call_video" = "ะ’ะธะดะตะพ ะฒั‹ะทะพะฒ"; +"event_formatter_call_voice" = "ะ“ะพะปะพัะพะฒะพะน ะฒั‹ะทะพะฒ"; +"settings_show_NSFW_public_rooms" = "ะŸะพะบะฐะทะฐั‚ัŒ ะฟัƒะฑะปะธั‡ะฝั‹ะต ะบะพะผะฝะฐั‚ั‹ ั ั‡ัƒะฒัั‚ะฒะธั‚ะตะปัŒะฝั‹ะผ ะบะพะฝั‚ะตะฝั‚ะพะผ"; +"room_open_dialpad" = "ะŸะฐะฝะตะปัŒ ะฝะฐะฑะพั€ะฐ ะฝะพะผะตั€ะฐ"; +"room_place_voice_call" = "ะ“ะพะปะพัะพะฒะพะน ะฒั‹ะทะพะฒ"; +"room_event_action_delete_confirmation_message" = "ะ’ั‹ ัƒะฒะตั€ะตะฝั‹, ั‡ั‚ะพ ั…ะพั‚ะธั‚ะต ัƒะดะฐะปะธั‚ัŒ ัั‚ะพ ะฝะตะพั‚ะฟั€ะฐะฒะปะตะฝะฝะพะต ัะพะพะฑั‰ะตะฝะธะต?"; +"room_event_action_delete_confirmation_title" = "ะฃะดะฐะปะธั‚ัŒ ะฝะตะพั‚ะฟั€ะฐะฒะปะตะฝะฝะพะต ัะพะพะฑั‰ะตะฝะธะต"; +"room_unsent_messages_cancel_message" = "ะ’ั‹ ัƒะฒะตั€ะตะฝั‹, ั‡ั‚ะพ ั…ะพั‚ะธั‚ะต ัƒะดะฐะปะธั‚ัŒ ะฒัะต ะฝะตะพั‚ะฟั€ะฐะฒะปะตะฝะฝั‹ะต ัะพะพะฑั‰ะตะฝะธั ะฒ ัั‚ะพะน ะบะพะผะฝะฐั‚ะต?"; +"room_unsent_messages_cancel_title" = "ะฃะดะฐะปะธั‚ัŒ ะฝะตะพั‚ะฟั€ะฐะฒะปะตะฝะฝั‹ะต ัะพะพะฑั‰ะตะฝะธั"; +"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" = "ะะบั‚ะธะฒะฝั‹ะน ะฒั‹ะทะพะฒ (%@)"; +"room_details_integrations" = "ะ˜ะฝั‚ะตะณั€ะฐั†ะธะธ"; +"room_details_search" = "ะ˜ัะบะฐั‚ัŒ ะบะพะผะฝะฐั‚ัƒ"; +"room_multiple_typing_notification" = "%@ ะธ ะดั€ัƒะณะธะต"; +"room_accessibility_video_call" = "ะ’ะธะดะตะพ ะฒั‹ะทะพะฒ"; +"room_message_replying_to" = "ะ’ ะพั‚ะฒะตั‚ %@"; +"room_message_editing" = "ะ ะตะดะฐะบั‚ะธั€ะพะฒะฐะฝะธะต"; diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index e6057953a..b9ed2ebf3 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -476,7 +476,7 @@ "room_participants_remove_third_party_invite_msg" = "Heqja e ftesave nga palรซ tรซ treta nuk mbulohet ende, derisa tรซ kihet API"; "room_participants_invite_malformed_id" = "ID e keqformuar. Duhet tรซ jetรซ njรซ adresรซ email ose ID Matrix, si '@localpart:domain'"; "room_participants_action_ban" = "Dรซboje nga kjo dhomรซ"; -"room_unsent_messages_unknown_devices_notification" = "Mesazhi sโ€™u dรซrgua, pรซr shkak tรซ pranisรซ sรซ sesioneve tรซ panjohur. %@ ose %@ tani?"; +"room_unsent_messages_unknown_devices_notification" = "Mesazhi sโ€™u dรซrgua, pรซr shkak tรซ pranisรซ sรซ sesioneve tรซ panjohur."; "room_ongoing_conference_call" = "Thirrje konference qรซ po zhvillohet. Merrni pjesรซ si %@ ose %@."; "room_ongoing_conference_call_with_close" = "Thirrje konference qรซ po zhvillohet. Merrni pjesรซ si %@ ose %@. %@."; "room_conference_call_no_power" = "Ju duhen leje pรซr tรซ administruar thirrje konferencรซ nรซ kรซtรซ dhomรซ"; @@ -853,7 +853,7 @@ "settings_add_3pid_password_title_email" = "Shtoni adresรซ email"; "settings_add_3pid_password_title_msidsn" = "Shtoni numรซr telefoni"; "settings_add_3pid_password_message" = "Qรซ tรซ vazhdohet, ju lutemi, jepni fjalรซkalimin tuaj"; -"settings_add_3pid_invalid_password_message" = "Fjalรซkalim i pavlefshรซm"; +"settings_add_3pid_invalid_password_message" = "Kredenciale tรซ pavlefshme"; "settings_devices_description" = "Emri publik i njรซ sesioni รซshtรซ i dukshรซm pรซr persona me tรซ cilรซt komunikoni"; "settings_discovery_no_identity_server" = "Sโ€™po pรซrdorni ndonjรซ shรซrbyes identitetesh. Qรซ tรซ jeni i zbulueshรซm nga kontakte ekzistuese qรซ njihni, shtoni njรซ tรซ tillรซ."; "settings_discovery_terms_not_signed" = "Pajtohuni me Kushtet e Shรซrbimit tรซ Shรซrbyesit tรซ Identiteteve qรซ tโ€™i lejoni vetes tรซ jeni i zbulueshรซm pรซrmes adrese email ose numri telefoni."; @@ -1266,3 +1266,81 @@ "rooms_empty_view_title" = "Dhoma"; "people_empty_view_information" = "Fjalosuni nรซ mรซnyrรซ tรซ sigurt me kรซdo. Prekni + qรซ tรซ filloni tรซ shtoni persona."; "people_empty_view_title" = "Njerรซz"; +"room_intro_cell_information_multiple_dm_sentence2" = "Nรซ kรซtรซ bisedรซ jeni vetรซm ju, veรง nรซse cilido prej jush fton dikรซ tjetรซr tรซ vijรซ."; +"room_intro_cell_information_dm_sentence2" = "Nรซ kรซtรซ bisedรซ gjenden vetรซm ju tรซ dy, sโ€™mund tรซ vijรซ tjetรซrkush."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence1_part1" = "Ky รซshtรซ fillimi i mesazhit tuaj tรซ drejtpรซrdrejtรซ me "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " qรซ tโ€™u bรซni me dije njerรซzve se pรซr รงfarรซ รซshtรซ kjo dhomรซ."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Shtoni njรซ temรซ"; +"room_intro_cell_information_room_with_topic_sentence2" = "Temรซ: %@"; +"room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_sentence1_part1" = "Ky รซshtรซ fillimi i "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Shtoni persona"; +"room_avatar_view_accessibility_hint" = "Ndryshoni avatar dhome"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "avatar"; +"invite_friends_share_text" = "Hej, bisedoni me mua nรซ %@: %@"; + +// MARK: - Invite friends + +"invite_friends_action" = "Ftoni shokรซ te %@"; +"call_transfer_error_message" = "Sโ€™u arrit tรซ shpรซrngulej thirrje"; +"call_transfer_error_title" = "Gabim"; +"call_transfer_contacts_all" = "Krejt"; +"call_transfer_contacts_recent" = "Sรซ fundi"; +"call_transfer_dialpad" = "Numรซrator"; +"call_transfer_users" = "Pรซrdorues"; + +// MARK: - Call Transfer +"call_transfer_title" = "Shpรซrngule"; + +// MARK: - Dial Pad +"dialpad_title" = "Numรซrator"; +"pin_protection_settings_change_pin" = "Ndryshoni PIN-in"; +"pin_protection_confirm_pin_to_change" = "Ripohoni PIN-in qรซ tรซ ndryshohet PIN"; +"secrets_recovery_with_key_recovery_key_title" = "Jepeni"; +"secrets_recovery_with_passphrase_passphrase_title" = "Jepeni"; +"bug_report_background_mode" = "Vazhdo nรซ prapaskenรซ"; +"call_actions_unhold" = "Rimerre"; +"event_formatter_call_back" = "Ktheji thirrjen"; +"event_formatter_call_you_declined" = "Hodhรซt poshtรซ kรซtรซ thirrje"; +"event_formatter_call_you_currently_in" = "Gjendeni nรซ kรซtรซ thirrje"; +"event_formatter_call_has_ended" = "Kjo thirrje ka pรซrfunduar"; +"event_formatter_call_video" = "Thirrje video"; +"event_formatter_call_voice" = "Thirrje audio"; +"security_settings_crosssigning_reset" = "Rikthe te parazgjedhjet cross-signing"; +"security_settings_crosssigning" = "CROSS-SIGNING"; +"settings_show_NSFW_public_rooms" = "Shfaq dhoma publike NSFW"; +"room_open_dialpad" = "Numรซrator"; +"room_place_voice_call" = "Thirrje audio"; +"room_event_action_delete_confirmation_message" = "Jeni i sigurt se doni tรซ fshihet ky mesazh i padรซrguar?"; +"room_event_action_delete_confirmation_title" = "Fshi mesazh tรซ padรซrguar"; +"room_unsent_messages_cancel_message" = "Jeni i sigurt se doni tรซ fshihen krejt mesazhet e padรซrguar nรซ kรซtรซ dhomรซ?"; +"room_unsent_messages_cancel_title" = "Fshi mesazhet e padรซrguar"; +"social_login_button_title_sign_up" = "Regjistrohuni me %@"; +"social_login_button_title_sign_in" = "Hyni me %@"; +"social_login_button_title_continue" = "Vazhdo me %@"; +"social_login_list_title_sign_up" = "Ose"; +"social_login_list_title_sign_in" = "Ose"; + +// Social login + +"social_login_list_title_continue" = "Vazhdoni me"; +"callbar_return" = "Rimerre"; +"callbar_only_multiple_paused" = "%@ thirrje tรซ ndalura"; +"callbar_only_single_paused" = "Thirrje e ndalur"; +"callbar_active_and_multiple_paused" = "1 thirrje aktive (%@) ยท %@ thirrje tรซ ndalura"; +"callbar_active_and_single_paused" = "1 thirrje aktive (%@) ยท 1 thirrje e ndalur"; + +// Call Bar +"callbar_only_single_active" = "Thirrje aktive (%@)"; +"room_details_integrations" = "Integrime"; +"room_multiple_typing_notification" = "%@ dhe tรซ tjerรซ"; +"room_accessibility_video_call" = "Thirrje Video"; +"room_message_replying_to" = "Nรซ pรซrgjigje tรซ %@"; +"room_message_editing" = "Pรซrpunim"; diff --git a/Riot/Assets/sv.lproj/Vector.strings b/Riot/Assets/sv.lproj/Vector.strings index 5da224c27..c90ad4d0c 100644 --- a/Riot/Assets/sv.lproj/Vector.strings +++ b/Riot/Assets/sv.lproj/Vector.strings @@ -340,7 +340,7 @@ "settings_add_3pid_password_title_email" = "Lรคgg till e-postadress"; "settings_add_3pid_password_title_msidsn" = "Lรคgg till telefonnummer"; "settings_add_3pid_password_message" = "Fรถr att fortsรคtta, ange ditt lรถsenord"; -"settings_add_3pid_invalid_password_message" = "Ogiltigt lรถsenord"; +"settings_add_3pid_invalid_password_message" = "Ogiltiga uppgifter"; "settings_crypto_export" = "Exportera nycklar"; "settings_crypto_blacklist_unverified_devices" = "Kryptera endast till verifierade sessioner"; "settings_deactivate_my_account" = "Inaktivera mitt konto"; @@ -438,7 +438,7 @@ "room_participants_security_information_room_encrypted" = "Meddelanden i det hรคr rummet รคr totalstrรคckskrypterade.\n\nDina meddelanden รคr sรคkrade med lรฅs och bara du och mottagaren har de unika nycklarna fรถr att lรฅsa upp dem."; "room_accessiblity_scroll_to_bottom" = "Scrolla till botten"; "room_do_not_have_permission_to_post" = "Du har inte behรถrighet att posta till det hรคr rummet"; -"room_unsent_messages_notification" = "Meddelanden skickades inte. %@ eller %@ nu?"; +"room_unsent_messages_notification" = "Meddelanden misslyckades att skickas."; "room_conference_call_no_power" = "Du behรถver behรถrighet fรถr att hantera gruppsamtal i det hรคr rummet"; "room_prompt_resend" = "Skicka alla igen"; "room_accessibility_call" = "Ring"; @@ -641,7 +641,7 @@ "group_section" = "GEMENSKAPER"; "directory_search_fail" = "Misslyckades att hรคmta data"; "room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Ingen identitetsserver รคr konfigurerad sรฅ du kan inte starta en chatt med en kontakt med en e-postadress."; -"room_unsent_messages_unknown_devices_notification" = "Meddelandet skickades inte eftersom okรคnda sessioner var nรคrvarande. %@ eller %@ nu?"; +"room_unsent_messages_unknown_devices_notification" = "Meddelandet misslyckades att skickas eftersom okรคnda sessioner var nรคrvarande."; "room_resend_unsent_messages" = "Skicka oskickade meddelanden igen"; "room_warning_about_encryption" = "Totalstrรคckskryptering รคr i beta, och kanske inte รคr pรฅlitligt.\n\nDu bรถr inte รคnnu lita pรฅ att den sรคkrar data.\n\nEnheter kommer inte att kunna avkryptera historik frรฅn innan de gick med i rummet.\n\nKrypterade meddelanden kommer inte vara synliga pรฅ klienter som inte รคnnu stรถder kryptering."; "room_resource_limit_exceeded_message_contact_1" = " Vรคnligen "; @@ -1228,9 +1228,67 @@ "social_login_button_title_sign_up" = "Skapa konto med %@"; "social_login_button_title_sign_in" = "Logga in med %@"; "social_login_button_title_continue" = "Fortsรคtt med %@"; -"social_login_list_title_sign_up" = "Eller registrera med"; -"social_login_list_title_sign_in" = "Eller logga in med"; +"social_login_list_title_sign_up" = "Eller"; +"social_login_list_title_sign_in" = "Eller"; // Social login "social_login_list_title_continue" = "Fortsรคtt med"; +"room_intro_cell_information_multiple_dm_sentence2" = "Bara ni รคr i den hรคr konversationen, om inte nรฅn av er bjuder in nรฅn att gรฅ med."; +"room_intro_cell_information_dm_sentence2" = "Bara ni tvรฅ รคr i den hรคr konversationen, ingen annan kan gรฅ med."; +"room_intro_cell_information_dm_sentence1_part3" = ". "; +"room_intro_cell_information_dm_sentence1_part1" = "Det hรคr รคr bรถrjan pรฅ ditt direktmeddelande med "; +"room_intro_cell_information_room_without_topic_sentence2_part2" = " fรถr att lรฅta folk veta vad rummet handlar om."; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Lรคgg till ett รคmne"; +"room_intro_cell_information_room_with_topic_sentence2" = "ร„mne: %@"; +"room_intro_cell_information_room_sentence1_part3" = ". "; +"room_intro_cell_information_room_sentence1_part1" = "Detta รคr bรถrjan pรฅ "; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "Lรคgg till personer"; +"room_avatar_view_accessibility_hint" = "Byt rumsavatar"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "avatar"; +"call_transfer_error_message" = "Samtalsรถverfรถring misslyckades"; +"call_transfer_error_title" = "Fel"; +"call_transfer_contacts_all" = "Alla"; +"call_transfer_contacts_recent" = "Nyliga"; +"call_transfer_dialpad" = "Knappsats"; +"call_transfer_users" = "Anvรคndare"; + +// MARK: - Call Transfer +"call_transfer_title" = "ร–verfรถr"; + +// MARK: - Dial Pad +"dialpad_title" = "Knappsats"; +"call_actions_unhold" = "ร…teruppta"; +"event_formatter_call_back" = "Ring tillbaka"; +"event_formatter_call_you_declined" = "Du avslog det hรคr samtalet"; +"event_formatter_call_you_currently_in" = "Du รคr fรถr nรคrvarande i det hรคr samtalet"; +"event_formatter_call_has_ended" = "Det hรคr samtalet har avslutats"; +"event_formatter_call_video" = "Videosamtal"; +"event_formatter_call_voice" = "Rรถstsamtal"; +"settings_show_NSFW_public_rooms" = "Visa NSFW offentliga rum"; +"room_open_dialpad" = "Knappsats"; +"room_place_voice_call" = "Rรถstsamtal"; +"room_event_action_delete_confirmation_message" = "ร„r du sรคker pรฅ att du vill radera det hรคr oskickade meddelandet?"; +"room_event_action_delete_confirmation_title" = "Radera oskickat meddelande"; +"room_unsent_messages_cancel_message" = "ร„r du sรคker pรฅ att du vill radera alla oskickade meddelanden i det hรคr rummet?"; +"room_unsent_messages_cancel_title" = "Radera oskickade meddelanden"; +"callbar_return" = "ร…tergรฅ"; +"callbar_only_multiple_paused" = "%@ pausade samtal"; +"callbar_only_single_paused" = "Pausat samtal"; +"callbar_active_and_multiple_paused" = "1 aktivt samtal (%@) ยท %@ pausade samtal"; +"callbar_active_and_single_paused" = "1 aktivt samtal (%@) ยท 1 pausat samtal"; + +// Call Bar +"callbar_only_single_active" = "Aktivt samtal (%@)"; +"room_accessibility_video_call" = "Videosamtal"; +"room_message_editing" = "Redigerar"; +"room_message_replying_to" = "Svarar pรฅ %@"; +"room_multiple_typing_notification" = "%@ och andra"; +"room_details_search" = "Sรถk i rum"; +"room_details_integrations" = "Integrationer"; diff --git a/Riot/Assets/th.lproj/Localizable.strings b/Riot/Assets/th.lproj/Localizable.strings index be13fd1e3..46994a59a 100644 --- a/Riot/Assets/th.lproj/Localizable.strings +++ b/Riot/Assets/th.lproj/Localizable.strings @@ -1,7 +1,7 @@ /* Message title for a specific person in a named room */ "MSG_FROM_USER_IN_ROOM_TITLE" = "%@ เนƒเธ™ %@"; /* New message from a specific person, not referencing a room */ -"MSG_FROM_USER" = "%@ เธชเนˆเธ‡เธ‚เน‰เธญเธ„เธงเธฒเธก"; +"MSG_FROM_USER" = "%@ เน„เธ”เน‰เธชเนˆเธ‡เธ‚เน‰เธญเธ„เธงเธฒเธก"; /* A single unread message in a room */ "SINGLE_UNREAD_IN_ROOM" = "เธ„เธธเธ“เน„เธ”เน‰เธฃเธฑเธšเธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธ™ %@"; /* A single unread message */ @@ -14,3 +14,85 @@ "MESSAGE_IN_X" = "เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธ™ %@"; /* Multiple unread messages in a room */ "UNREAD_IN_ROOM" = "%@ เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธซเธกเนˆเนƒเธ™ %@"; + +/* New action message from a specific person in a named room. */ +"IMAGE_FROM_USER_IN_ROOM" = "%@ เน„เธ”เน‰เธชเนˆเธ‡เธฃเธนเธ›เธ เธฒเธž %@ เนƒเธ™ %@"; + +/** Image Messages **/ + +/* New action message from a specific person, not referencing a room. */ +"IMAGE_FROM_USER" = "%@ เน„เธ”เน‰เธชเนˆเธ‡เธฃเธนเธ›เธ เธฒเธž %@"; + +/* Incoming named video conference invite from a specific person */ +"VIDEO_CONF_NAMED_FROM_USER" = "เธเธฒเธฃเน‚เธ—เธฃเธเธฅเธธเนˆเธกเธงเธดเธ”เธตเน‚เธญเธˆเธฒเธ %@: '%@'"; + +/* Incoming unnamed video conference invite from a specific person */ +"VIDEO_CONF_FROM_USER" = "เธเธฒเธฃเน‚เธ—เธฃเธเธฅเธธเนˆเธกเธงเธดเธ”เธตเน‚เธญเธˆเธฒเธ %@"; + +/** Key verification **/ + +"KEY_VERIFICATION_REQUEST_FROM_USER" = "%@ เธ•เน‰เธญเธ‡เธเธฒเธฃเธ•เธฃเธงเธˆเธชเธญเธš"; + +/* Incoming named voice conference invite from a specific person */ +"VOICE_CONF_NAMED_FROM_USER" = "เธเธฒเธฃเน‚เธ—เธฃเธเธฅเธธเนˆเธกเธˆเธฒเธ %@: '%@'"; + +/* Incoming unnamed voice conference invite from a specific person */ +"VOICE_CONF_FROM_USER" = "เธเธฒเธฃเน‚เธ—เธฃเธเธฅเธธเนˆเธกเธˆเธฒเธ %@"; + +/* Incoming one-to-one video call */ +"VIDEO_CALL_FROM_USER" = "เธเธฒเธฃเน‚เธ—เธฃเธงเธดเธ”เธตเน‚เธญเธˆเธฒเธ %@"; + +/** Calls **/ + +/* Incoming one-to-one voice call */ +"VOICE_CALL_FROM_USER" = "เธเธฒเธฃเน‚เธ—เธฃเธˆเธฒเธ %@"; + +/* A user has invited you to a named room */ +"USER_INVITE_TO_NAMED_ROOM" = "%@ เน„เธ”เน‰เน€เธŠเธดเธเธ„เธธเธ“เน„เธ›เธขเธฑเธ‡ %@"; + +/* A user has invited you to an (unamed) group chat */ +"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ เน„เธ”เน‰เน€เธŠเธดเธเธ„เธธเธ“เน„เธ›เธขเธฑเธ‡เนเธŠเธ—เธเธฅเธธเนˆเธก"; + +/** Invites **/ + +/* A user has invited you to a chat */ +"USER_INVITE_TO_CHAT" = "%@ เน„เธ”เน‰เน€เธŠเธดเธเธ„เธธเธ“เน„เธ›เธขเธฑเธ‡เนเธŠเธ—"; + +/* Look, stuff's happened, alright? Just open the app. */ +"MSGS_IN_TWO_PLUS_ROOMS" = "%@ เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธซเธกเนˆเนƒเธ™ %@, %@ เนเธฅเธฐเธญเธทเนˆเธ™ เน†"; + +/* Multiple messages in two rooms */ +"MSGS_IN_TWO_ROOMS" = "%@ เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธซเธกเนˆเนƒเธ™ %@ เนเธฅเธฐ %@"; + +/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */ +"MSGS_FROM_TWO_PLUS_USERS" = "%@ เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธซเธกเนˆเธˆเธฒเธ %@, %@ เนเธฅเธฐเธญเธทเนˆเธ™ เน†"; + +/* Multiple unread messages from three people */ +"MSGS_FROM_THREE_USERS" = "%@ เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธซเธกเนˆเธˆเธฒเธ %@, %@ เนเธฅเธฐ %@"; + +/* Multiple unread messages from two people */ +"MSGS_FROM_TWO_USERS" = "%@ เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธซเธกเนˆเธˆเธฒเธ %@ เนเธฅเธฐ %@"; + +/* Multiple unread messages from a specific person, not referencing a room */ +"MSGS_FROM_USER" = "%@ เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธซเธกเนˆเนƒเธ™ %@"; + +/* New action message from a specific person in a named room. */ +"ACTION_FROM_USER_IN_ROOM" = "%@: * %@ %@"; + +/* New action message from a specific person, not referencing a room. */ +"ACTION_FROM_USER" = "* %@ %@"; +"MESSAGE_PROTECTED" = "เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธซเธกเนˆ"; + +/* Sticker from a specific person, not referencing a room. */ +"STICKER_FROM_USER" = "%@ เน„เธ”เน‰เธชเนˆเธ‡เธชเธ•เธดเนŠเธเน€เธเธญเธฃเนŒ"; + +/* New message from a specific person in a named room. Content included. */ +"MSG_FROM_USER_IN_ROOM_WITH_CONTENT" = "%@ เนƒเธ™ %@: %@"; + +/** Single, unencrypted messages (where we can include the content */ + +/* New message from a specific person, not referencing a room. Content included. */ +"MSG_FROM_USER_WITH_CONTENT" = "%@: %@"; + +/* New message from a specific person in a named room */ +"MSG_FROM_USER_IN_ROOM" = "%@ เน„เธ”เน‰เน‚เธžเธชเธ•เนŒเนƒเธ™ %@"; diff --git a/Riot/Assets/th.lproj/Vector.strings b/Riot/Assets/th.lproj/Vector.strings index 5da8f3e91..11b90cf2d 100644 --- a/Riot/Assets/th.lproj/Vector.strings +++ b/Riot/Assets/th.lproj/Vector.strings @@ -1,2 +1,128 @@ // String for App Store "store_short_description" = "เนเธŠเธ—/VoIP เนเธšเธšเธเธฃเธฐเธˆเธฒเธขเธจเธนเธ™เธขเนŒเธ—เธตเนˆเธ›เธฅเธญเธ”เธ เธฑเธข"; +"group_section" = "เธŠเธธเธกเธŠเธ™"; +"auth_softlogout_clear_data_sign_out_title" = "เธ„เธธเธ“เนเธ™เนˆเนƒเธˆเธซเธฃเธทเธญเน„เธกเนˆ?"; +"collapse" = "เธขเธธเธš"; +"room_participants_action_remove" = "เน€เธญเธฒเธญเธญเธเธˆเธฒเธเธซเน‰เธญเธ‡เธ™เธตเน‰"; +"room_participants_action_leave" = "เธญเธญเธเธˆเธฒเธเธซเน‰เธญเธ‡เธ™เธตเน‰"; +"room_participants_action_invite" = "เน€เธŠเธดเธ"; +"room_participants_action_section_security" = "เธ„เธงเธฒเธกเธ›เธฅเธญเธ”เธ เธฑเธข"; +"room_participants_action_section_other" = "เธ•เธฑเธงเน€เธฅเธทเธญเธ"; +"room_participants_offline" = "เธญเธญเธŸเน„เธฅเธ™เนŒ"; +"room_participants_online" = "เธญเธญเธ™เน„เธฅเธ™เนŒ"; +"room_participants_leave_prompt_title_for_dm" = "เธญเธญเธ"; +"room_participants_leave_prompt_title" = "เธญเธญเธเธˆเธฒเธเธซเน‰เธญเธ‡"; +"search_no_result" = "เน„เธกเนˆเธกเธตเธœเธฅเธฅเธฑเธžเธ˜เนŒ"; + +// Directory +"directory_cell_title" = "เน€เธฃเธตเธขเธเธ”เธนเน„เธ”เน€เธฃเธเธ—เธญเธฃเธต"; +"search_in_progress" = "เธเธณเธฅเธฑเธ‡เธ„เน‰เธ™เธซเธฒโ€ฆ"; +"search_default_placeholder" = "เธ„เน‰เธ™เธซเธฒ"; +"search_files" = "เน„เธŸเธฅเนŒ"; +"search_people" = "เธœเธนเน‰เธ„เธ™"; +"search_messages" = "เธ‚เน‰เธญเธ„เธงเธฒเธก"; + +// Search +"search_rooms" = "เธซเน‰เธญเธ‡"; +"rooms_empty_view_title" = "เธซเน‰เธญเธ‡"; +"people_empty_view_title" = "เธœเธนเน‰เธ„เธ™"; +"people_no_conversation" = "เน„เธกเนˆเธกเธตเธเธฒเธฃเธชเธ™เธ—เธ™เธฒ"; +"people_conversation_section" = "เธเธฒเธฃเธชเธ™เธ—เธ™เธฒ"; +"room_recents_join_room_title" = "เน€เธ‚เน‰เธฒเธฃเนˆเธงเธกเธซเน‰เธญเธ‡"; +"room_recents_join_room" = "เน€เธ‚เน‰เธฒเธฃเนˆเธงเธกเธซเน‰เธญเธ‡"; +"room_recents_create_empty_room" = "เธชเธฃเน‰เธฒเธ‡เธซเน‰เธญเธ‡"; +"room_recents_start_chat_with" = "เน€เธฃเธดเนˆเธกเนเธŠเธ—"; +"room_recents_no_conversation" = "เน„เธกเนˆเธกเธตเธซเน‰เธญเธ‡"; + +// Room recents +"room_recents_directory_section" = "เน„เธ”เน€เธฃเธเธ—เธญเธฃเธตเธซเน‰เธญเธ‡"; +"room_recents_conversations_section" = "เธซเน‰เธญเธ‡"; +"room_recents_people_section" = "เธœเธนเน‰เธ„เธ™"; +"room_recents_favourites_section" = "เธฃเธฒเธขเธเธฒเธฃเน‚เธ›เธฃเธ”"; +"room_recents_directory_section_network" = "เน€เธ„เธฃเธทเธญเธ‚เนˆเธฒเธข"; +"auth_softlogout_sign_in" = "เธฅเธ‡เธŠเธทเนˆเธญเน€เธ‚เน‰เธฒ"; +"room_creation_privacy" = "เธ„เธงเธฒเธกเน€เธ›เน‡เธ™เธชเนˆเธงเธ™เธ•เธฑเธง"; +"room_creation_appearance_name" = "เธŠเธทเนˆเธญ"; +"room_creation_appearance" = "เธฅเธฑเธเธฉเธ“เธฐเธ—เธตเนˆเธ›เธฃเธฒเธเธ"; +"room_creation_account" = "เธšเธฑเธเธŠเธต"; + +// Chat creation +"room_creation_title" = "เนเธŠเธ—เนƒเธซเธกเนˆ"; +"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" = "เธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ•เนˆเธญเธ”เน‰เธงเธข"; +"auth_softlogout_clear_data_sign_out" = "เธฅเธ‡เธŠเธทเนˆเธญเธญเธญเธ"; +"auth_softlogout_clear_data_button" = "เธฅเน‰เธฒเธ‡เธ‚เน‰เธญเธกเธนเธฅเธ—เธฑเน‰เธ‡เธซเธกเธ”"; +"auth_forgot_password" = "เธฅเธทเธกเธฃเธซเธฑเธชเธœเนˆเธฒเธ™?"; +"auth_identity_server_placeholder" = "URL (เน€เธŠเนˆเธ™ https://vector.im)"; +"auth_home_server_placeholder" = "URL (เน€เธŠเนˆเธ™ https://matrix.org)"; +"auth_repeat_new_password_placeholder" = "เธขเธทเธ™เธขเธฑเธ™เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เนƒเธซเธกเนˆเธ‚เธญเธ‡เธ„เธธเธ“"; +"accept" = "เธขเธญเธกเธฃเธฑเธš"; +"decline" = "เธ›เธเธดเน€เธชเธ˜"; +"auth_phone_placeholder" = "เธซเธกเธฒเธขเน€เธฅเธ‚เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒ"; +"auth_email_placeholder" = "เธ—เธตเนˆเธญเธขเธนเนˆเธญเธตเน€เธกเธฅ"; +"auth_user_name_placeholder" = "เธŠเธทเนˆเธญเธœเธนเน‰เนƒเธŠเน‰"; +"auth_new_password_placeholder" = "เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เนƒเธซเธกเนˆ"; +"auth_password_placeholder" = "เธฃเธซเธฑเธชเธœเนˆเธฒเธ™"; +"auth_user_id_placeholder" = "เธญเธตเน€เธกเธฅเธซเธฃเธทเธญเธŠเธทเนˆเธญเธœเธนเน‰เนƒเธŠเน‰"; +"auth_login_single_sign_on" = "เธฅเธ‡เธŠเธทเนˆเธญเน€เธ‚เน‰เธฒ"; +"auth_skip" = "เธ‚เน‰เธฒเธก"; +"auth_submit" = "เธชเนˆเธ‡"; +"auth_register" = "เธฅเธ‡เธ—เธฐเน€เธšเธตเธขเธ™"; + +// Authentication +"auth_login" = "เน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธš"; +"skip" = "เธ‚เน‰เธฒเธก"; +"close" = "เธ›เธดเธ”"; +"later" = "เธ เธฒเธขเธซเธฅเธฑเธ‡"; +"rename" = "เน€เธ›เธฅเธตเนˆเธขเธ™เธŠเธทเนˆเธญ"; +"video" = "เธงเธดเธ”เธตเน‚เธญ"; +"voice" = "เน€เธชเธตเธขเธ‡"; +"camera" = "เธเธฅเน‰เธญเธ‡"; +"leave" = "เธญเธญเธ"; +"join" = "เน€เธ‚เน‰เธฒเธฃเนˆเธงเธก"; +"save" = "เธšเธฑเธ™เธ—เธถเธ"; +"cancel" = "เธขเธเน€เธฅเธดเธ"; +"off" = "เธ›เธดเธ”"; +"on" = "เน€เธ›เธดเธ”"; +"invite" = "เน€เธŠเธดเธ"; +"remove" = "เน€เธญเธฒเธญเธญเธ"; +"start" = "เน€เธฃเธดเนˆเธก"; +"create" = "เธชเธฃเน‰เธฒเธ‡"; +"continue" = "เธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ•เนˆเธญ"; +"back" = "เธขเน‰เธญเธ™เธเธฅเธฑเธš"; +"next" = "เธ–เธฑเธ”เน„เธ›"; + +// Actions +"view" = "เธ”เธน"; +"warning" = "เธ„เธณเน€เธ•เธทเธญเธ™"; +"title_groups" = "เธŠเธธเธกเธŠเธ™"; +"title_rooms" = "เธซเน‰เธญเธ‡"; +"title_people" = "เธœเธนเน‰เธ„เธ™"; +"title_favourites" = "เธฃเธฒเธขเธเธฒเธฃเน‚เธ›เธฃเธ”"; + +// Titles +"title_home" = "เธซเธ™เน‰เธฒเนเธฃเธ"; +"directory_searching_title" = "เธเธณเธฅเธฑเธ‡เธ„เน‰เธ™เธซเธฒเน„เธ”เน€เธฃเธเธ—เธญเธฃเธตโ€ฆ"; +"room_member_power_level_short_moderator" = "เธœเธนเน‰เธ„เธงเธšเธ„เธธเธก"; +"room_many_users_are_typing" = "%@, %@ เนเธฅเธฐเธญเธทเนˆเธ™ เน† เธเธณเธฅเธฑเธ‡เธžเธดเธกเธžเนŒโ€ฆ"; +"room_participants_action_unban" = "เน€เธฅเธดเธเธซเน‰เธฒเธก"; +"room_member_power_level_short_custom" = "เธเธณเธซเธ™เธ”เน€เธญเธ‡"; +"room_event_action_resend" = "เธชเนˆเธ‡เนƒเธซเธกเนˆ"; +"room_participants_action_unignore" = "เนเธชเธ”เธ‡เธ‚เน‰เธญเธ„เธงเธฒเธกเธ—เธฑเน‰เธ‡เธซเธกเธ”เธˆเธฒเธเธœเธนเน‰เนƒเธŠเน‰เธ™เธตเน‰"; +"room_message_unable_open_link_error_message" = "เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เน€เธ›เธดเธ”เธฅเธดเธ‡เธเนŒ"; +"room_event_action_delete" = "เธฅเธš"; +"room_one_user_is_typing" = "%@ เธเธณเธฅเธฑเธ‡เธžเธดเธกเธžเนŒโ€ฆ"; +"room_participants_action_section_admin_tools" = "เน€เธ„เธฃเธทเนˆเธญเธ‡เธกเธทเธญเธœเธนเน‰เธ”เธนเนเธฅ"; +"room_event_action_save" = "เธšเธฑเธ™เธ—เธถเธ"; +"room_two_users_are_typing" = "%@ เนเธฅเธฐ %@ เธเธณเธฅเธฑเธ‡เธžเธดเธกเธžเนŒโ€ฆ"; +"room_member_power_level_short_admin" = "เธœเธนเน‰เธ”เธนเนเธฅ"; +"room_new_messages_notification" = "%d เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธซเธกเนˆ"; +"room_new_message_notification" = "%d เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธซเธกเนˆ"; +"room_participants_action_ignore" = "เธ‹เนˆเธญเธ™เธ‚เน‰เธญเธ„เธงเธฒเธกเธ—เธฑเน‰เธ‡เธซเธกเธ”เธˆเธฒเธเธœเธนเน‰เนƒเธŠเน‰เธ™เธตเน‰"; diff --git a/Riot/Assets/uk.lproj/Vector.strings b/Riot/Assets/uk.lproj/Vector.strings index 56ac63b7b..a2942949a 100644 --- a/Riot/Assets/uk.lproj/Vector.strings +++ b/Riot/Assets/uk.lproj/Vector.strings @@ -37,7 +37,7 @@ // Authentication "auth_login" = "ะฃะฒั–ะนั‚ะธ"; "auth_register" = "ะ—ะฐั€ะตั”ัั‚ั€ัƒะฒะฐั‚ะธัั"; -"auth_submit" = "ะ’ั–ะดะฟั€ะฐะฒะธั‚ะธ"; +"auth_submit" = "ะะฐะดั–ัะปะฐั‚ะธ"; "auth_skip" = "ะŸั€ะพะฟัƒัั‚ะธั‚ะธ"; "auth_send_reset_email" = "ะะฐะดั–ัะปะฐั‚ะธ ะปะธัั‚ ะดะปั ะฒั–ะดะฝะพะฒะปะตะฝะฝั"; "auth_return_to_login" = "ะŸะพะฒะตั€ะฝัƒั‚ะธัั ะฝะฐ ะตะบั€ะฐะฝ ะฒั…ะพะดัƒ"; @@ -161,15 +161,15 @@ "people_conversation_section" = "ะ‘ะะ›ะะงะšะ˜"; "people_no_conversation" = "ะะตะผะฐ ะฑะฐะปะฐั‡ะพะบ"; "room_participants_leave_prompt_msg_for_dm" = "ะ’ะธ ะฒะฟะตะฒะฝะตะฝะฝั–, ั‰ะพ ะฑะฐะถะฐั”ั‚ะต ะทะฐะปะธัˆะธั‚ะธ?"; -"room_participants_leave_prompt_title_for_dm" = "ะ—ะฐะปะธัˆะธั‚ะธ"; +"room_participants_leave_prompt_title_for_dm" = "ะ’ะธะนั‚ะธ"; "client_android_name" = "Element Android"; "store_promotional_text" = "ะ”ะพะดะฐั‚ะพะบ ะดะปั ั‡ะฐั‚ัƒ ั‚ะฐ ััƒะผั–ัะฝะพั— ั€ะพะฑะพั‚ะธ, ั‰ะพ ะทะฑะตั€ั–ะณะฐั” ะบะพะฝั„ั–ะดะตะฝั†ั–ะนะฝั–ัั‚ัŒ ัƒ ะฒั–ะดะบั€ะธั‚ั–ะน ะผะตั€ะตะถั–. ะ”ะตั†ะตะฝั‚ั€ะฐะปั–ะทะพะฒะฐะฝะธะน, ั‰ะพะฑ ะฝะฐะดะฐั‚ะธ ะฒะฐะผ ะบะพะฝั‚ั€ะพะปัŒ ะฝะฐะด ะดะฐะฝะธะผะธ. ะ‘ะตะท ะพะฑั€ะพะฑะบะธ ะดะฐะฝะธั…, ะฑะตะท ะฑะตะบะดะพั€ั–ะฒ, ะฑะตะท ะดะพัั‚ัƒะฟัƒ ะดะปั ั‚ั€ะตั‚ั–ั… ัั‚ะพั€ั–ะฝ."; "settings_three_pids_management_information_part3" = "."; -"settings_three_pids_management_information_part1" = "ะšะตั€ัƒะฒะฐะฝะฝั ะฐะดั€ะตัะฐะผะธ ะตะปะตะบั‚ั€ะพะฝะฝะพั— ะฟะพัˆั‚ะธ ั‡ะธ ะฝะพะผะตั€ะฐะผะธ ั‚ะตะปะตั„ะพะฝั–ะฒ, ัะบั– ะฒะธ ะผะพะถะตั‚ะต ะฒะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธ ะดะปั ะฒั…ะพะดัƒ ะฐะฑะพ ะฒั–ะดะฝะพะฒะปะตะฝะฝั ะฐะบะฐัƒะฝั‚ัƒ. ะšะพะฝั‚ั€ะพะปัŽะนั‚ะต ั…ั‚ะพ ั– ัะบ ะผะพะถะต ะฒะฐั ะทะฝะฐะนั‚ะธ "; +"settings_three_pids_management_information_part1" = "ะšะตั€ัƒะนั‚ะต ะทะฒั–ะดัะธ ะฐะดั€ะตัะฐะผะธ ะต-ะฟะพัˆั‚ะธ ั‡ะธ ะฝะพะผะตั€ะฐะผะธ ั‚ะตะปะตั„ะพะฝั–ะฒ, ัะบั– ะผะพะถะฝะฐ ะทะฐัั‚ะพัะพะฒัƒะฒะฐั‚ะธ ะดะปั ะฒั…ะพะดัƒ ะฐะฑะพ ะฒั–ะดะฝะพะฒะปะตะฝะฝั ะพะฑะปั–ะบะพะฒะพะณะพ ะทะฐะฟะธััƒ. ะšะพะฝั‚ั€ะพะปัŽะนั‚ะต ั…ั‚ะพ ั– ัะบ ะผะพะถะต ะฒะฐั ะทะฝะฐะนั‚ะธ "; "contacts_address_book_no_identity_server" = "ะกะตั€ะฒะตั€ ั–ะดะตะฝั‚ะธั„ั–ะบะฐั†ั–ั— ะฝะต ะฝะฐะปะฐัˆั‚ะพะฒะฐะฝะธะน"; "auth_autodiscover_invalid_response" = "ะะตะฟั€ะฐะฒะธะปัŒะฝะฐ ะฒั–ะดะฟะพะฒั–ะดัŒ ะฒะธัะฒะปะตะฝะฝั ะดะพะผะฐัˆะฝัŒะพะณะพ ัะตั€ะฒะตั€ะฐ"; "settings_key_backup" = "ะ ะ•ะ—ะ•ะ ะ’ะะ ะšะžะŸะ†ะฏ ะšะ›ะฎะงะ†ะ’"; -"settings_deactivate_account" = "ะ”ะ•ะะšะขะ˜ะ’ะฃะ’ะะขะ˜ ะะšะะฃะะข"; +"settings_deactivate_account" = "ะ”ะ•ะะšะขะ˜ะ’ะฃะ’ะะขะ˜ ะžะ‘ะ›ะ†ะšะžะ’ะ˜ะ™ ะ—ะะŸะ˜ะก"; "group_section" = "ะกะŸะ†ะ›ะฌะะžะขะ˜"; // Groups tab @@ -268,8 +268,8 @@ "people_empty_view_title" = "ะ›ัŽะดะธ"; "social_login_button_title_sign_up" = "ะŸั€ะธั”ะดะฝะฐั‚ะธัั ั‡ะตั€ะตะท %@"; "social_login_button_title_sign_in" = "ะฃะฒั–ะนั‚ะธ ั‡ะตั€ะตะท %@"; -"social_login_list_title_sign_up" = "ะะฑะพ ะทะฐั€ะตั”ัั‚ั€ัƒะฒะฐั‚ะธัั ั‡ะตั€ะตะท"; -"social_login_list_title_sign_in" = "ะะฑะพ ัƒะฒั–ะนั‚ะธ ั‡ะตั€ะตะท"; +"social_login_list_title_sign_up" = "ะะฑะพ"; +"social_login_list_title_sign_in" = "ะะฑะพ"; "settings_discovery_three_pid_details_revoke_action" = "ะ’ั–ะดะบะปะธะบะฐั‚ะธ"; "settings_discovery_three_pid_details_share_action" = "ะŸะพะดั–ะปะธั‚ะธัั"; "room_event_action_share" = "ะŸะพะดั–ะปะธั‚ะธัั"; @@ -282,3 +282,46 @@ "room_event_action_more" = "ะ‘ั–ะปัŒัˆะต"; "more" = "ะ‘ั–ะปัŒัˆะต"; "joined" = "ะ”ะพะปัƒั‡ะฐั”ั‚ัŒัั"; +"secrets_setup_recovery_key_export_action" = "ะ—ะฑะตั€ะตะณั‚ะธ"; +"room_event_action_save" = "ะ—ะฑะตั€ะตะณั‚ะธ"; +"room_event_action_delete" = "ะ’ะธะดะฐะปะธั‚ะธ"; +"security_settings_secure_backup_delete" = "ะ’ะธะดะฐะปะธั‚ะธ"; +"security_settings_secure_backup_synchronise" = "ะกะธะฝั…ั€ะพะฝั–ะทัƒะฒะฐั‚ะธ"; +"security_settings_secure_backup_setup" = "ะะฐะปะฐัˆั‚ัƒะฒะฐั‚ะธ"; +"people_empty_view_information" = "ะ‘ะตะทะฟะตั‡ะฝะพ ัะฟั–ะปะบัƒะนั‚ะตัั ะท ะฑัƒะดัŒ-ะบะธะผ. ะขะพั€ะบะฝั–ั‚ัŒัั +, ั‰ะพะฑ ะดะพะดะฐั‚ะธ ัะฟั–ะฒั€ะพะทะผะพะฒะฝะธะบั–ะฒ."; +"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" = "ะะบั‚ะธะฒะฝะธะน ะฒะธะบะปะธะบ (%@)"; +"switch" = "ะŸะตั€ะตะผะบะฝัƒั‚ะธ"; +"room_event_action_resend" = "ะŸะพะฒั‚ะพั€ะฝะพ ะฝะฐะดั–ัะปะฐั‚ะธ"; +"room_event_action_redact" = "ะ’ะธะปัƒั‡ะธั‚ะธ"; +"room_event_action_quote" = "ะฆะธั‚ัƒะฒะฐั‚ะธ"; +"room_event_action_copy" = "ะšะพะฟั–ัŽะฒะฐั‚ะธ"; +"bug_report_send" = "ะะฐะดั–ัะปะฐั‚ะธ"; +"room_details_topic" = "ะขะตะผะฐ"; +"room_details_room_name_for_dm" = "ะะฐะทะฒะฐ"; +"create_room_placeholder_topic" = "ะขะตะผะฐ"; +"create_room_section_header_topic" = "ะขะตะผะฐ ะบั–ะผะฝะฐั‚ะธ (ะฝะตะพะฑะพะฒ'ัะทะบะพะฒะพ)"; +"create_room_placeholder_name" = "ะะฐะทะฒะฐ"; +"create_room_section_header_name" = "ะะฐะทะฒะฐ ะบั–ะผะฝะฐั‚ะธ"; + +// MARK: - Create Room + +"create_room_title" = "ะะพะฒะฐ ะบั–ะผะฝะฐั‚ะฐ"; +"searchable_directory_search_placeholder" = "ะ†ะผ'ั ะฐะฑะพ ID"; +"searchable_directory_x_network" = "%@ ะผะตั€ะตะถะฐ"; + +// MARK: - Searchable Directory View Controller + +"searchable_directory_create_new_room" = "ะกั‚ะฒะพั€ะธั‚ะธ ะฝะพะฒัƒ ะบั–ะผะฝะฐั‚ัƒ"; +"biometrics_cant_unlocked_alert_message_retry" = "ะŸะพะฒั‚ะพั€ะธั‚ะธ"; +"key_backup_setup_skip_alert_skip_action" = "ะŸั€ะพะฟัƒัั‚ะธั‚ะธ"; +"room_participants_action_remove" = "ะ’ะธะปัƒั‡ะธั‚ะธ ะท ั†ั–ั”ั— ะบั–ะผะฝะฐั‚ะธ"; +"room_participants_action_leave" = "ะ’ะธะนั‚ะธ ะท ั†ั–ั”ั— ะบั–ะผะฝะฐั‚ะธ"; +"room_participants_action_invite" = "ะ—ะฐะฟั€ะพัะธั‚ะธ"; +"room_ongoing_conference_call_close" = "ะ—ะฐะบั€ะธั‚ะธ"; diff --git a/Riot/Assets/zh_Hans.lproj/InfoPlist.strings b/Riot/Assets/zh_Hans.lproj/InfoPlist.strings index 4e2b4662c..b548711be 100644 --- a/Riot/Assets/zh_Hans.lproj/InfoPlist.strings +++ b/Riot/Assets/zh_Hans.lproj/InfoPlist.strings @@ -2,5 +2,6 @@ "NSCameraUsageDescription" = "ๆ‘„ๅƒๅคดๆƒ้™็”จไบŽๆ‹ๆ‘„็…ง็‰‡ใ€ๅฝ•ๅˆถ่ง†้ข‘ๆˆ–่ฟ›่กŒ่ง†้ข‘่Šๅคฉใ€‚"; "NSPhotoLibraryUsageDescription" = "็…ง็‰‡ๅบ“่ฎฟ้—ฎๆƒ้™็”จไบŽๅ‘้€ๅ›พ็‰‡ไธŽ่ง†้ข‘ใ€‚"; "NSMicrophoneUsageDescription" = "้บฆๅ…‹้ฃŽๆƒ้™็”จไบŽๅฝ•ๅˆถ่ง†้ข‘ๆˆ–่ฟ›่กŒ้€š่ฏใ€‚"; -"NSContactsUsageDescription" = "ไธบไบ†ๅ‘็Žฐๅทฒๅœจไฝฟ็”จMatrix็š„่”็ณปไบบ๏ผŒElementๅฏไปฅๆŠŠไฝ ๅœฐๅ€็ฐฟ้‡Œ็š„้‚ฎ็ฎฑๅœฐๅ€ๅ’Œ็”ต่ฏๅท็ ๅ‘้€ๅˆฐไฝ ๆ‰€้€‰ๆ‹ฉ็š„Matrix่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จใ€‚ๅฆ‚ๆžœๆ”ฏๆŒ็š„่ฏ๏ผŒไธชไบบๆ•ฐๆฎๅœจๅ‘้€ๅ‰ไผš่ขซๅ“ˆๅธŒๅค„็†โ€“่ฏทๆฃ€ๆŸฅไฝ ็š„่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ็š„้š็งๆกๆฌพไปฅ่Žทๅ–่ฏฆ็ป†ไฟกๆฏใ€‚"; +"NSContactsUsageDescription" = "ไธบไบ†ๅ‘็Žฐๅทฒๅœจไฝฟ็”จ Matrix ็š„่”็ณปไบบ๏ผŒElement ๅฏไปฅๆŠŠไฝ ๅœฐๅ€็ฐฟ้‡Œ็š„้‚ฎ็ฎฑๅœฐๅ€ๅ’Œ็”ต่ฏๅท็ ๅ‘้€ๅˆฐไฝ ๆ‰€้€‰ๆ‹ฉ็š„ Matrix ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จใ€‚ๅฆ‚ๆžœๆ”ฏๆŒ็š„่ฏ๏ผŒไธชไบบๆ•ฐๆฎๅœจๅ‘้€ๅ‰ไผš่ขซๅ“ˆๅธŒๅค„็†โ€”โ€”่ฏทๆฃ€ๆŸฅไฝ ็š„่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ็š„้š็งๆ”ฟ็ญ–ไปฅ่Žทๅ–่ฏฆ็ป†ไฟกๆฏใ€‚"; "NSCalendarsUsageDescription" = "ๅœจๆญคๅบ”็”จไธญๆŸฅ็œ‹ไฝ ่ฎกๅˆ’็š„ไผš่ฎฎใ€‚"; +"NSFaceIDUsageDescription" = "Face ID ๆƒ้™็”จไบŽ่ฎฟ้—ฎๆ‚จ็š„ๅบ”็”จใ€‚"; diff --git a/Riot/Assets/zh_Hans.lproj/Localizable.strings b/Riot/Assets/zh_Hans.lproj/Localizable.strings index aea281b69..7ff0fb738 100644 --- a/Riot/Assets/zh_Hans.lproj/Localizable.strings +++ b/Riot/Assets/zh_Hans.lproj/Localizable.strings @@ -1,5 +1,5 @@ /* New message from a specific person, not referencing a room */ -"MSG_FROM_USER" = "%@ๅ‘้€ไบ†ไธ€ๆกๆถˆๆฏ"; +"MSG_FROM_USER" = "%@ ๅ‘้€ไบ†ไธ€ๆกๆถˆๆฏ"; /* New message from a specific person in a named room */ "MSG_FROM_USER_IN_ROOM" = "%@ ๅœจ %@ ๅ‘้€ไบ†ๆถˆๆฏ"; /* New message from a specific person, not referencing a room. Content included. */ @@ -27,11 +27,11 @@ /* Multiple unread messages from three people */ "MSGS_FROM_THREE_USERS" = "%@ ๆกๆœช่ฏปๆถˆๆฏ (ๆฅ่‡ช %@ใ€%@ ๅ’Œ %@)"; /* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */ -"MSGS_FROM_TWO_PLUS_USERS" = "%@ ๆกๆœช่ฏปๆถˆๆฏ (ๆฅ่‡ช %@ใ€%@ ๅŠๆ›ดๅคš)"; +"MSGS_FROM_TWO_PLUS_USERS" = "%@ ๆกๆœช่ฏปๆถˆๆฏ (ๆฅ่‡ช %@ใ€%@ ไธŽๅ…ถไป–)"; /* Multiple messages in two rooms */ "MSGS_IN_TWO_ROOMS" = "%@ ๆกๆœช่ฏปๆถˆๆฏ (ๆฅ่‡ช่Šๅคฉๅฎค %@ ๅ’Œ %@)"; /* Look, stuff's happened, alright? Just open the app. */ -"MSGS_IN_TWO_PLUS_ROOMS" = "%@ ๆกๆœช่ฏปๆถˆๆฏ (ๆฅ่‡ช่Šๅคฉๅฎค %@ใ€%@ ๅ’Œๆ›ดๅคš)"; +"MSGS_IN_TWO_PLUS_ROOMS" = "%@ ๆกๆœช่ฏปๆถˆๆฏ (ๆฅ่‡ช %@ใ€%@ ไธŽๅ…ถไป–)"; /* A user has invited you to a chat */ "USER_INVITE_TO_CHAT" = "%@ ้‚€่ฏทๆ‚จๅŠ ๅ…ฅ็ง่Š"; /* A user has invited you to an (unamed) group chat */ @@ -54,4 +54,16 @@ "MSG_FROM_USER_IN_ROOM_TITLE" = "%@๏ผˆๆฅ่‡ช %@๏ผ‰"; /* Sticker from a specific person, not referencing a room. */ "STICKER_FROM_USER" = "%@ๅ‘้€ไบ†ไธ€ๅผ ่ดดๅ›พ"; -"KEY_VERIFICATION_REQUEST_FROM_USER" = "%@ๆƒณ่ฆ้ชŒ่ฏ"; +"KEY_VERIFICATION_REQUEST_FROM_USER" = "%@ ๆƒณ่ฆ้ชŒ่ฏ"; +"MESSAGE_PROTECTED" = "ๆœช่ฏปๆถˆๆฏ"; + +/* New message indicator on a room */ +"MESSAGE_IN_X" = "%@ ไธญ็š„ๆถˆๆฏ"; + +/* New message indicator from a DM */ +"MESSAGE_FROM_X" = "ๆฅ่‡ช %@ ็š„ๆถˆๆฏ"; + +/** Notification messages **/ + +/* New message indicator on unknown room */ +"MESSAGE" = "ๆถˆๆฏ"; diff --git a/Riot/Assets/zh_Hans.lproj/Vector.strings b/Riot/Assets/zh_Hans.lproj/Vector.strings index 46cf235d1..858143d2f 100644 --- a/Riot/Assets/zh_Hans.lproj/Vector.strings +++ b/Riot/Assets/zh_Hans.lproj/Vector.strings @@ -11,7 +11,7 @@ "continue" = "็ปง็ปญ"; "create" = "ๆ–ฐๅปบ"; "start" = "ๅผ€ๅง‹"; -"leave" = "้€€ๅ‡บ"; +"leave" = "็ฆปๅผ€"; "remove" = "็งป้™ค"; "invite" = "้‚€่ฏท"; "retry" = "้‡่ฏ•"; @@ -27,7 +27,7 @@ "voice" = "่ฏญ้Ÿณ"; "video" = "่ง†้ข‘"; "active_call" = "ๅฝ“ๅ‰้€š่ฏ"; -"active_call_details" = "ๅฝ“ๅ‰้€š่ฏ (%@)"; +"active_call_details" = "ๅฝ“ๅ‰้€š่ฏ๏ผˆ%@๏ผ‰"; "later" = "็จๅŽๅ†่ฏด"; "rename" = "้‡ๅ‘ฝๅ"; // Authentication @@ -47,7 +47,7 @@ "auth_phone_placeholder" = "ๆ‰‹ๆœบๅท็ "; "auth_repeat_password_placeholder" = "้‡ๅคๅฏ†็ "; "auth_repeat_new_password_placeholder" = "็กฎ่ฎคๆ‚จ็š„ๆ–ฐๅฏ†็ "; -"auth_invalid_login_param" = "ๆ— ๆ•ˆ็š„็”จๆˆทๅๅ’Œ/ๆˆ–ๅฏ†็ "; +"auth_invalid_login_param" = "็”จๆˆทๅๅ’Œ/ๆˆ–ๅฏ†็ ๆ— ๆ•ˆ"; "auth_invalid_user_name" = "็”จๆˆทๅๅช่ƒฝๅŒ…ๅซๅญ—ๆฏใ€ๆ•ฐๅญ—ใ€็Ÿญๆจช๏ผˆ-๏ผ‰ไธŽไธ‹ๅˆ’็บฟ๏ผˆ_๏ผ‰"; "auth_invalid_password" = "ๅฏ†็ ๅคช็Ÿญ๏ผˆ่‡ณๅฐ‘ 6 ไธชๅญ—็ฌฆ๏ผ‰"; "auth_invalid_email" = "่ฟ™ไธๅƒๆ˜ฏไธ€ไธชๆœ‰ๆ•ˆ็š„้‚ฎ็ฎฑๅœฐๅ€"; @@ -142,8 +142,8 @@ "room_participants_add_participant" = "ๆทปๅŠ ๅ‚ๅŠ ่€…"; "room_participants_one_participant" = "1 ไธชๅ‚ๅŠ ่€…"; "room_participants_multi_participants" = "%d ไธชๅ‚ๅŠ ่€…"; -"room_participants_leave_prompt_title" = "้€€ๅ‡บ่Šๅคฉๅฎค"; -"room_participants_leave_prompt_msg" = "ๆ‚จ็กฎๅฎš่ฆ้€€ๅ‡บๆญค่Šๅคฉๅฎคๅ—๏ผŸ"; +"room_participants_leave_prompt_title" = "็ฆปๅผ€่Šๅคฉๅฎค"; +"room_participants_leave_prompt_msg" = "ๆ‚จ็กฎๅฎš่ฆ็ฆปๅผ€ๆญค่Šๅคฉๅฎคๅ—๏ผŸ"; "room_participants_remove_prompt_title" = "็กฎ่ฎค"; "room_participants_remove_prompt_msg" = "ๆ‚จ็กฎๅฎš่ฆๅฐ† %@ ไปŽๆญค่Šๅคฉๅฎค้‡Œ็งป้™ค๏ผŸ"; "room_participants_remove_third_party_invite_msg" = "ๅœจ API ๅฎž็Žฐไน‹ๅ‰่ฟ˜ไธๆ”ฏๆŒ็งป้™ค็ฌฌไธ‰ๆ–น้‚€่ฏท"; @@ -165,18 +165,18 @@ "room_participants_action_section_devices" = "ไผš่ฏ"; "room_participants_action_section_other" = "้€‰้กน"; "room_participants_action_invite" = "้‚€่ฏท"; -"room_participants_action_leave" = "้€€ๅ‡บๆญค่Šๅคฉๅฎค"; +"room_participants_action_leave" = "็ฆปๅผ€ๆญค่Šๅคฉๅฎค"; "room_participants_action_remove" = "ไปŽๆญค่Šๅคฉๅฎค็งป้™ค"; "room_participants_action_ban" = "ไปŽๆญค่Šๅคฉๅฎคๅฐ็ฆ"; "room_participants_action_unban" = "่งฃๅฐ"; "room_participants_action_ignore" = "้š่—ๆญค็”จๆˆท็š„ๆ‰€ๆœ‰ไฟกๆฏ"; "room_participants_action_unignore" = "ๆ˜พ็คบๆญค็”จๆˆท็š„ๆ‰€ๆœ‰ไฟกๆฏ"; "room_participants_action_set_default_power_level" = "้‡็ฝฎๅˆฐๆญฃๅธธ็”จๆˆท"; -"room_participants_action_set_moderator" = "ไฝฟๅ…ถๆˆไธบไธปๆŒไบบ"; +"room_participants_action_set_moderator" = "ไฝฟๅ…ถๆˆไธบๅ็ฎกๅ‘˜"; "room_participants_action_set_admin" = "ไฝฟๅ…ถๆˆไธบ็ฎก็†ๅ‘˜"; "room_participants_action_start_new_chat" = "ๅ‘่ตทๆ–ฐ็š„่Šๅคฉ"; -"room_participants_action_start_voice_call" = "ๅผ€ๅง‹่ฏญ้Ÿณ้€š่ฏ"; -"room_participants_action_start_video_call" = "ๅผ€ๅง‹่ง†้ข‘้€š่ฏ"; +"room_participants_action_start_voice_call" = "ๅ‘่ตท่ฏญ้Ÿณ้€š่ฏ"; +"room_participants_action_start_video_call" = "ๅ‘่ตท่ง†้ข‘้€š่ฏ"; "room_participants_action_mention" = "ๆๅŠ"; // Chat "room_jump_to_first_unread" = "่ทณๅˆฐ็ฌฌไธ€ๆกๆœช่ฏปไฟกๆฏ"; @@ -185,7 +185,7 @@ "room_one_user_is_typing" = "%@ ๆญฃๅœจ่พ“ๅ…ฅโ€ฆ"; "room_two_users_are_typing" = "%@ ๅ’Œ %@ ๆญฃๅœจ่พ“ๅ…ฅโ€ฆ"; "room_many_users_are_typing" = "%@ใ€%@ ๅ’Œ %@ ๆญฃๅœจ่พ“ๅ…ฅโ€ฆ"; -"room_message_placeholder" = "ๅ‘้€ๆถˆๆฏ๏ผˆ้žๅŠ ๅฏ†๏ผ‰โ€ฆ"; +"room_message_placeholder" = "ๅ‘้€ๆถˆๆฏ๏ผˆๆœชๅŠ ๅฏ†๏ผ‰โ€ฆ"; "encrypted_room_message_placeholder" = "ๅ‘้€ๅŠ ๅฏ†ๆถˆๆฏโ€ฆ"; "room_message_short_placeholder" = "ๅ‘้€ๆถˆๆฏโ€ฆ"; "room_offline_notification" = "ๅˆฐๆœๅŠกๅ™จ็š„่ฟžๆŽฅๅทฒ็ปไธขๅคฑใ€‚"; @@ -252,7 +252,7 @@ "settings_labs" = "ๅฎž้ชŒๅฎค"; "settings_devices" = "ไผš่ฏ"; "settings_cryptography" = "ๅŠ ๅฏ†"; -"settings_sign_out" = "้€€ๅ‡บ"; +"settings_sign_out" = "็ฆปๅผ€"; "settings_sign_out_confirmation" = "ไฝ ็กฎๅฎš๏ผŸ"; "settings_sign_out_e2e_warn" = "ๆ‚จๅฐ†ไธขๅคฑๆ‰€ๆœ‰็ซฏๅฏน็ซฏๅŠ ๅฏ†ๅฏ†้’ฅใ€‚่ฟ™ๆ„ๅ‘ณ็€ๅœจๆญค่ฎพๅค‡ไธŠๆ‚จๅฐ†ๅ†ไนŸๆ— ๆณ•้˜…่ฏปๅทฒๅŠ ๅฏ†่Šๅคฉๅฎค้‡Œ็š„ๆ—งๆถˆๆฏใ€‚"; "settings_profile_picture" = "ๆกฃๆกˆๅ›พ็‰‡"; @@ -326,7 +326,7 @@ "room_details_history_section_prompt_msg" = "ๆ”นๆˆ่ฐ้ƒฝๅฏไปฅ้˜…่ฏปๅŽ†ๅฒๅชไผšๅบ”็”จไบŽๆญค่Šๅคฉๅฎคๆœชๆฅ็š„ๆถˆๆฏใ€‚ๅทฒ็ปๅญ˜ๅœจ็š„ๅŽ†ๅฒๆถˆๆฏ็š„ๅฏ่งๆ€งๅฐ†ไธไผšๆ”นๅ˜ใ€‚"; "room_details_new_address" = "ๆทปๅŠ ๆ–ฐๅœฐๅ€"; "room_details_new_address_placeholder" = "ๆทปๅŠ ๆ–ฐๅœฐๅ€๏ผˆไพ‹ๅฆ‚ #foo%@๏ผ‰"; -"room_details_addresses_invalid_address_prompt_title" = "ๆ— ๆ•ˆ็š„ๅˆซๅๆ ผๅผ"; +"room_details_addresses_invalid_address_prompt_title" = "ๅˆซๅๆ ผๅผๆ— ๆ•ˆ"; "room_details_addresses_invalid_address_prompt_msg" = "%@ ไธๆ˜ฏไธ€ไธชๆœ‰ๆ•ˆ็š„ๅˆซๅๆ ผๅผ"; "room_details_addresses_disable_main_address_prompt_title" = "ไธปๅœฐๅ€่ญฆๅ‘Š"; "room_details_addresses_disable_main_address_prompt_msg" = "ๆ‚จๆฒกๆœ‰ๆŒ‡ๅฎšไธปๅœฐๅ€ใ€‚ๆญค่Šๅคฉๅฎค็š„้ป˜่ฎคไธปๅœฐๅ€ไผš้šๆœบ้€‰ๅ–"; @@ -413,7 +413,7 @@ // Events formatter "event_formatter_member_updates" = "%tu ็š„ๆˆๅ‘˜่บซไปฝๅ˜ๅŒ–"; "auth_home_server_placeholder" = "URL๏ผˆไพ‹ๅฆ‚ https://matrix.org๏ผ‰"; -"auth_identity_server_placeholder" = "็ฝ‘ๅ€๏ผˆไพ‹ๅฆ‚ https://vector.im๏ผ‰"; +"auth_identity_server_placeholder" = "URL๏ผˆไพ‹ๅฆ‚ https://vector.im๏ผ‰"; "contacts_user_directory_section" = "็”จๆˆท็›ฎๅฝ•"; "contacts_user_directory_offline_section" = "็”จๆˆท็›ฎๅฝ•๏ผˆ็ฆป็บฟ๏ผ‰"; "room_ongoing_conference_call_with_close" = "ๆ”ถๅˆฐไผš่ฎฎ้€š่ฏใ€‚ไปฅ %@ ๆˆ– %@.%@ ๅŠ ๅ…ฅใ€‚"; @@ -454,8 +454,8 @@ "group_home_multi_rooms_format" = "%tu ไธช่Šๅคฉๅฎค"; // Group participants "group_participants_add_participant" = "ๆทปๅŠ ๆˆๅ‘˜"; -"group_participants_leave_prompt_title" = "้€€ๅ‡บ็พค็ป„"; -"group_participants_leave_prompt_msg" = "ไฝ ็กฎๅฎš่ฆ้€€ๅ‡บๆญค็พค็ป„ๅ—๏ผŸ"; +"group_participants_leave_prompt_title" = "็ฆปๅผ€็พค็ป„"; +"group_participants_leave_prompt_msg" = "ไฝ ็กฎๅฎš่ฆ็ฆปๅผ€ๆญค็พค็ป„ๅ—๏ผŸ"; "group_participants_remove_prompt_title" = "้€‰้กน"; "group_participants_remove_prompt_msg" = "ไฝ ็กฎๅฎš่ฆไปŽๆญค็พค็ป„ไธญ็งป้™ค %@ ๅ—๏ผŸ"; "group_participants_invite_prompt_title" = "้€‰้กน"; @@ -466,18 +466,18 @@ "group_participants_invited_section" = "ๅทฒ้‚€่ฏท"; // Group rooms "group_rooms_filter_rooms" = "่ฟ‡ๆปค็คพๅŒบ่Šๅคฉๅฎค"; -"event_formatter_widget_added" = "ๅฐ้ƒจไปถ %@ ๅทฒ่ขซ %@ ๆทปๅŠ "; -"event_formatter_widget_removed" = "ๅฐ้ƒจไปถ %@ ๅทฒ่ขซ %@ ็งป้™ค"; +"event_formatter_widget_added" = "ๆŒ‚ไปถ %@ ๅทฒ่ขซ %@ ๆทปๅŠ "; +"event_formatter_widget_removed" = "ๆŒ‚ไปถ %@ ๅทฒ่ขซ %@ ็งป้™ค"; "do_not_ask_again" = "ไธๅ†่ฏข้—ฎ"; "call_already_displayed" = "ๆญฃๅœจ้€š่ฏใ€‚"; // Widget Integration Manager "widget_integration_need_to_be_able_to_invite" = "ไฝ ้œ€่ฆๆœ‰้‚€่ฏท็”จๆˆท็š„ๆƒ้™ๆ‰่ƒฝ่ฟ›่กŒๆญคๆ“ไฝœใ€‚"; -"widget_integration_unable_to_create" = "ๆ— ๆณ•ๅˆ›ๅปบๅฐ้ƒจไปถใ€‚"; +"widget_integration_unable_to_create" = "ๆ— ๆณ•ๅˆ›ๅปบๆŒ‚ไปถใ€‚"; "widget_integration_failed_to_send_request" = "ๅ‘้€่ฏทๆฑ‚ๅคฑ่ดฅใ€‚"; "widget_integration_room_not_recognised" = "ๆ— ๆณ•่ฏ†ๅˆซๆญคๆˆฟ้—ดใ€‚"; "widget_integration_positive_power_level" = "ๆƒ้™็บงๅˆซๅฟ…้กปๆ˜ฏๆ•ดๆ•ฐใ€‚"; "widget_integration_must_be_in_room" = "ๆ‚จไธๅœจๆญค่Šๅคฉๅฎคไธญใ€‚"; -"e2e_room_key_request_start_verification" = "ๅผ€ๅง‹้ชŒ่ฏโ€ฆโ€ฆ"; +"e2e_room_key_request_start_verification" = "ๅผ€ๅง‹้ชŒ่ฏโ€ฆ"; "e2e_room_key_request_share_without_verifying" = "ๅœจไธ้ชŒ่ฏ็š„ๆƒ…ๅ†ตไธ‹ๅˆ†ไบซ"; "e2e_room_key_request_ignore_request" = "ๅฟฝ็•ฅ่ฏทๆฑ‚"; "room_event_action_kick_prompt_reason" = "็งป้™คๆญค็”จๆˆท็š„ๅŽŸๅ› "; @@ -489,8 +489,8 @@ "group_invitation_format" = "%@ ้‚€่ฏทๆ‚จๅŠ ๅ…ฅๆญค็คพๅŒบ"; "group_participants_invite_malformed_id" = "ID ๆ ผๅผ้”™่ฏฏใ€‚ไธ€ไธช Matrix ID ็œ‹่ตทๆฅๅบ”่ฏฅๅƒๆ˜ฏ โ€œ@localpart:domainโ€"; // Widget -"widget_no_power_to_manage" = "ไฝ ้œ€่ฆ็›ธๅ…ณๆƒ้™ไปฅ็ฎก็†ๆญค่Šๅคฉๅฎค็š„ๅฐ้ƒจไปถ"; -"widget_creation_failure" = "ๅฐ้ƒจไปถๅˆ›ๅปบๅคฑ่ดฅ"; +"widget_no_power_to_manage" = "ไฝ ้œ€่ฆ็›ธๅ…ณๆƒ้™ไปฅ็ฎก็†ๆญค่Šๅคฉๅฎค็š„ๆŒ‚ไปถ"; +"widget_creation_failure" = "ๆŒ‚ไปถๅˆ›ๅปบๅคฑ่ดฅ"; // Room key request dialog "e2e_room_key_request_title" = "ๅฏ†้’ฅๅ…ฑไบซ่ฏทๆฑ‚"; "room_recents_server_notice_section" = "็ณป็ปŸ่ญฆๅ‘Š"; @@ -527,20 +527,20 @@ "room_resource_usage_limit_reached_message_contact_3" = " ไปฅๆ้ซ˜้™ๅˆถใ€‚"; // String for App Store "store_short_description" = "ๅฎ‰ๅ…จใ€ๅŽปไธญๅฟƒๅŒ–็š„่ŠๅคฉๅŠ VoIP ๅบ”็”จ"; -"store_full_description" = "ๆฒŸ้€š๏ผŒ็”ฑไฝ ๆŽŒๆŽงใ€‚\n\nไธ€ไธช่Šๅคฉๅบ”็”จ๏ผŒ็”ฑไฝ ๆŽŒๆŽงไธ”ๅฎŒๅ…จ็ตๆดปใ€‚Element ่ฎฉไฝ ไปฅไฝ ็š„ๆ–นๅผๆฒŸ้€šใ€‚ไธบ [matrix] - ๅผ€ๆ”พใ€ๅŽปไธญๅฟƒๅŒ–็š„ๆฒŸ้€š่€Œๆ‰“้€ ใ€‚\n\n่Žทๅ–ไธ€ไธชๅ…่ดน็š„ matrix.org ่ดฆๅท๏ผŒๅœจ https://ems.element.io ่Žทๅ–ไธ€ไธชไฝ ่‡ชๅทฑ็š„ๆœๅŠกๅ™จ๏ผŒๆˆ–่€…ไฝฟ็”จๅ…ถไป– Matrix ๆœๅŠกๅ™จใ€‚\n\nไธบไป€ไนˆ้€‰ๆ‹ฉ Element?\n\nๅฎŒๆ•ด็š„ๆฒŸ้€š๏ผšๅ›ด็ป•ไฝ ็š„ๅ›ข้˜Ÿใ€ไฝ ็š„ๆœ‹ๅ‹ใ€ไฝ ็š„็คพๅŒบๅˆ›ๅปบ่Šๅคฉๅฎค - ้šไฝ ๅ–œๆฌข๏ผ่Šๅคฉใ€ๅˆ†ไบซๆ–‡ไปถใ€ๆทปๅŠ ๆ’ไปถๅ’Œ่ฏญ้Ÿณ่ง†้ข‘้€š่ฏ - ๅ…จ้ƒจๅ…่ดนใ€‚\n\nๅผบๅคง็š„้›†ๆˆๅบฆ๏ผš้€š่ฟ‡ไฝ ไบ†่งฃๅ’Œๅ–œๆฌข็š„ๅทฅๅ…ทๆฅไฝฟ็”จ Element ใ€‚ไฝ ็”š่‡ณๅฏไปฅๅœจ Element ไธŠไธŽๅ…ถไป–่Šๅคฉๅบ”็”จ็š„็”จๆˆทๅ’Œ็พค็ป„่Šๅคฉใ€‚\n\n้š็งๅ’Œๅฎ‰ๅ…จ๏ผšไฟๅฎˆไฝ ๅฏน่ฏ็š„็ง˜ๅฏ†ใ€‚ๆœ€ๅ…ˆ่ฟ›็š„็ซฏๅˆฐ็ซฏๅŠ ๅฏ†ๆŠ€ๆœฏๅฏ็กฎไฟ็งๅฏ†้€šไฟกไฟๆŒ็งๅฏ†ๆ€งใ€‚\n\nๅผ€ๆ”พ๏ผŒ่€Œ้žๅฐ้—ญ๏ผšๅผ€ๆบ๏ผŒๅŸบไบŽ Matrixใ€‚้€š่ฟ‡่‡ชๅทฑๅผ€่ฎพ็š„ๆœๅŠกๅ™จๆฅๆ‹ฅๆœ‰ไฝ ่‡ชๅทฑ็š„ๆ•ฐๆฎ๏ผŒๆˆ–่€…้€‰ๆ‹ฉไฝ ไฟก่ต–็š„ๆœๅŠกๅ™จใ€‚\n\n้šๅค„ๅฏๅŠ๏ผšๅœจไฝ ๆ‰€ๆœ‰็š„่ฎพๅค‡ๅ’Œ็บฟไธŠ้กต้ข https://app.element.io ไธŠ้€š่ฟ‡ๅฎŒๆ•ด็š„ๅŽ†ๅฒไฟกๆฏๅŒๆญฅ่ฎฉไฝ ้šๅค„ๅฏๅŠใ€‚"; +"store_full_description" = "Element ๆ˜ฏไธ€็งๆ–ฐๅž‹็š„้€š่ฎฏไธŽๅไฝœๅบ”็”จ๏ผš\n\n1. ไฝฟๆ‚จๅฏไปฅๆŽŒๆŽงๆ‚จ็š„้š็ง\n2. ไฝฟๆ‚จไธŽ Matrix ็ฝ‘็ปœไธญ็š„ไปปไฝ•ไบบไบคๆต๏ผŒ็”š่‡ณๅฏไปฅ้€š่ฟ‡้›†ๆˆๅŠŸ่ƒฝไธŽๅฆ‚ Slack ไน‹็ฑป็š„ๅ…ถไป–ๅบ”็”จ้€š่ฎฏ\n3. ไฟๆŠคๆ‚จๅ…ๅ—ๅนฟๅ‘Š๏ผŒๅคงๆ•ฐๆฎๆŒ–ๆŽ˜ๅ’Œๅฐ้—ญๆœๅŠก็š„ไพตๅฎณ\n4. ้€š่ฟ‡็ซฏๅˆฐ็ซฏๅŠ ๅฏ†ไฟ่ฏๅฎ‰ๅ…จ๏ผŒ้€š่ฟ‡ไบคๅ‰็ญพๅ้ชŒ่ฏๅ…ถไป–ไบบ\n\nElement ไธŽๅ…ถไป–้€š่ฎฏไธŽๅไฝœๅบ”็”จๅฎŒๅ…จไธๅŒ๏ผŒๅ› ไธบๅฎƒๆ˜ฏๅŽปไธญๅฟƒๅŒ–ไธ”ๅผ€ๆบ็š„ใ€‚\n\nElement ๅ…่ฎธๆ‚จ่‡ชๆ‰˜็ฎกโ€”โ€”ๆˆ–่€…้€‰ๆ‹ฉๆ‰˜็ฎกๅ•†โ€”โ€”ๅ› ๆญค๏ผŒๆ‚จ่ƒฝๆ‹ฅๆœ‰ๆ•ฐๆฎๅ’Œไผš่ฏ็š„้š็งๆƒ๏ผŒๆ‰€ๆœ‰ๆƒๅ’ŒๆŽงๅˆถๆƒใ€‚ๅฎƒๅ…่ฎธๆ‚จ่ฎฟ้—ฎๅผ€ๆ”พ็ฝ‘็ปœ๏ผ›ๅ› ๆญค๏ผŒๆ‚จๅฏไปฅไธŽ Element ็”จๆˆทไปฅๅค–็š„ไบบไบคๆตใ€‚ๅนถไธ”ๅฎƒ้žๅธธๅฎ‰ๅ…จใ€‚\n\nElement ไน‹ๆ‰€ไปฅๅฏไปฅๅšๅˆฐ่ฟ™ไบ›๏ผŒๆ˜ฏๅ› ไธบๅฎƒๅœจ Matrix ไธŠ่ฟ่กŒโ€”โ€”ๅผ€ๆ”พ๏ผŒๅŽปไธญๅฟƒๅŒ–้€š่ฎฏ็š„ๆ ‡ๅ‡†ใ€‚\n\n้€š่ฟ‡่ฎฉๆ‚จ้€‰ๆ‹ฉ็”ฑ่ฐๆฅๆ‰˜็ฎกๆ‚จ็š„ไผš่ฏ๏ผŒElement ่ฎฉๆ‚จๆŽŒๆŽงไธ€ๅˆ‡ใ€‚ๅœจ Element ๅบ”็”จไธญ๏ผŒๆ‚จๅฏไปฅ้€‰ๆ‹ฉไธๅŒ็š„ๆ‰˜็ฎกๆ–นๅผ๏ผš\n\n1. ๅœจ็”ฑ Matrix ๅผ€ๅ‘่€…ๆ‰˜็ฎก็š„ matrix.org ๅ…ฌๅ…ฑๆœๅŠกๅ™จไธŠ่Žทๅ–ๅ…่ดนๅธๆˆท๏ผŒๆˆ–ไปŽๅฟ—ๆ„ฟ่€…ๆ‰˜็ฎก็š„ไธŠๅƒไธชๅ…ฌๅ…ฑๆœๅŠกๅ™จไธญ้€‰ๆ‹ฉ\n2. ๅœจๆ‚จ่‡ชๅทฑ็š„็กฌไปถไธŠ่ฟ่กŒๆœๅŠกๅ™จ๏ผŒ่‡ชๆ‰˜็ฎกๆ‚จ็š„ไผš่ฏ\n3. ้€š่ฟ‡่ฎข้˜… Element Matrix Services ๆ‰˜็ฎกๅนณๅฐ๏ผŒ็ฎ€ๅ•ๅœฐๅœจ่‡ชๅฎšไน‰ๆœๅŠกๅ™จไธŠๆณจๅ†Œ่ดฆๆˆท\n\nไธบไป€ไนˆ้€‰ๆ‹ฉ Element๏ผŸ\n\nๆŽŒๆŽงๆ‚จ็š„ๆ•ฐๆฎ๏ผšๆ‚จๆฅๅ†ณๅฎšๅญ˜ๆ”พๆ‚จ็š„ๆ•ฐๆฎๅ’Œๆถˆๆฏ็š„ไฝ็ฝฎใ€‚ๆ‹ฅๆœ‰ๅนถๆŽงๅˆถๅฎƒ็š„ๆ˜ฏๆ‚จ๏ผŒ่€Œไธๆ˜ฏๆŒ–ๆŽ˜ๆ‚จ็š„ๆ•ฐๆฎๆˆ–ไธŽ็ฌฌไธ‰ๆ–นๅˆ†ไบซ็š„ๅทจๅž‹ไผไธšใ€‚\n\nๅผ€ๆ”พ้€š่ฎฏไธŽๅไฝœ๏ผšๆ‚จๅฏไปฅไธŽ Matrix ็ฝ‘็ปœไธญ็š„ไปปไฝ•ไบบ่Šๅคฉ๏ผŒไธ่ฎบไป–ไปฌไฝฟ็”จ Element ่ฟ˜ๆ˜ฏๅ…ถไป– Matrix ๅบ”็”จ๏ผŒ็”š่‡ณ/ๅณไฝฟไป–ไปฌๅœจไฝฟ็”จไธๅŒ็š„้€š่ฎฏ็ณป็ปŸ๏ผŒไพ‹ๅฆ‚ Slack๏ผŒIRC ๆˆ– XMPPใ€‚\n\n่ถ…็บงๅฎ‰ๅ…จ๏ผšๆ”ฏๆŒ็œŸๆญฃ็š„็ซฏๅˆฐ็ซฏๅŠ ๅฏ†๏ผˆไป…ๆœ‰ไผš่ฏไธญ็š„ไบบๅฏไปฅ่งฃๅฏ†ๆถˆๆฏ๏ผ‰๏ผŒ่ฟ˜ๆœ‰่ƒฝๅคŸ้ชŒ่ฏไผš่ฏๅ‚ไธŽๆ–น็š„่ฎพๅค‡็š„ไบคๅ‰็ญพๅใ€‚\n\nๅฎŒๅ–„็š„้€š่ฎฏๆ–นๅผ๏ผšๆถˆๆฏ๏ผŒ่ฏญ้Ÿณๅ’Œ่ง†้ข‘้€š่ฏ๏ผŒๆ–‡ไปถๅ…ฑไบซ๏ผŒๅฑๅน•ๅ…ฑไบซๅ’Œๅคง้‡้›†ๆˆๅŠŸ่ƒฝ๏ผŒๆœบๅ™จไบบๅ’ŒๆŒ‚ไปถใ€‚ๅปบ็ซ‹ๆˆฟ้—ดไธŽ็คพๅŒบ๏ผŒไฟๆŒ่”็ณปๅนถๅฎŒๆˆๅทฅไฝœใ€‚\n\n้šๆ—ถ้šๅœฐ๏ผšๆถˆๆฏๅŽ†ๅฒๅฏๅœจๆ‚จ็š„ๅ…จ้ƒจ่ฎพๅค‡ๅ’Œ https://app.element.io ็ฝ‘้กต็ซฏไน‹้—ดๅฎŒๅ…จๅŒๆญฅ๏ผŒๆ— ่ฎบๆ‚จๅœจๅ“ช้‡Œ๏ผŒ้ƒฝๅฏไปฅไฟๆŒ่”็ณปใ€‚"; "auth_accept_policies" = "่ฏทๆŸฅ็œ‹ๅนถๆŽฅๅ—ๆญคไธป้กตๆœๅŠกๅ™จ็š„ๆœๅŠกๆกๆฌพ๏ผš"; "room_replacement_information" = "่ฟ™ไธช่Šๅคฉๅฎคๅทฒ่ขซๆ›ฟๆข๏ผŒไธๅ†ๆœ‰ๆ•ˆใ€‚"; "settings_flair" = "ๅœจๅ…่ฎธ็š„ๅœฐๆ–นๆ˜พ็คบไธชๆ€งๅพฝ็ซ "; "settings_key_backup" = "ๅฏ†้’ฅๅค‡ไปฝ"; "settings_key_backup_info" = "ๆถˆๆฏๅทฒ่ขซ็ซฏๅฏน็ซฏๅฎ‰ๅ…จๅŠ ๅฏ†ใ€‚ๅชๆœ‰ๆ‚จๅ’ŒๆŒๆœ‰ๅฏ†้’ฅ็š„ๆŽฅๆ”ถๆ–นๅฏไปฅ้˜…่ฏป่ฟ™ไบ›ๆถˆๆฏใ€‚"; -"settings_key_backup_info_checking" = "ๆฃ€ๆŸฅไธญโ€ฆโ€ฆ"; +"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_progress" = "ๆญฃๅœจๅค‡ไปฝ %@ ไธชๅฏ†้’ฅโ€ฆ"; "settings_key_backup_info_progress_done" = "ๆ‰€ๆœ‰ๅฏ†้’ฅ้ƒฝๅทฒๅค‡ไปฝ"; "settings_key_backup_info_trust_signature_unknown" = "ๅค‡ไปฝๅ…ทๆœ‰ไธ€ไธช ID๏ผš%@ ็š„ไผš่ฏ็š„็ญพๅ"; "settings_key_backup_info_trust_signature_valid" = "ๅค‡ไปฝๅ…ทๆœ‰ๆญคไผš่ฏ็š„ไธ€ไธชๆœ‰ๆ•ˆ็ญพๅ"; @@ -558,8 +558,8 @@ "room_details_fail_to_update_room_direct" = "ๆญค่Šๅคฉๅฎค็š„็›ดๆŽฅๆ ‡่ฎฐๆ›ดๆ–ฐๅคฑ่ดฅ"; "event_formatter_jitsi_widget_removed" = "VoIP ไผš่ฎฎๅทฒ่ขซ %@ ็งป้™ค"; "room_does_not_exist" = "%@ ่Šๅคฉๅฎคไธๅญ˜ๅœจ"; -"call_incoming_voice" = "ๆฅ็”ตโ€ฆโ€ฆ"; -"call_incoming_video" = "่ง†้ข‘้€š่ฏๆฅ็”ตโ€ฆโ€ฆ"; +"call_incoming_voice" = "ๆ”ถๅˆฐๆฅ็”ตโ€ฆ"; +"call_incoming_video" = "ๆ”ถๅˆฐ่ง†้ข‘้€š่ฏโ€ฆ"; // Key backup wrong version "e2e_key_backup_wrong_version_title" = "ๆ–ฐๅปบๅฏ†้’ฅๅค‡ไปฝ"; "e2e_key_backup_wrong_version" = "ไธ€ไธชๆ–ฐ็š„ๅฎ‰ๅ…จๆถˆๆฏๅฏ†้’ฅๅค‡ไปฝๅทฒ่ขซๅˆ ้™คใ€‚\n\nๅฆ‚ๆžœ่ฟ™ไธๆ˜ฏๆ‚จ็š„ๆ“ไฝœ๏ผŒ่ฏทๅœจ่ฎพ็ฝฎไธญ่ฎพๅฎšไธ€ไธชๆ–ฐ็š„ๅฏ†็ ใ€‚"; @@ -591,7 +591,7 @@ "rerequest_keys_alert_message" = "่ฏทๅœจๅฆไธ€ๅฐๅฏไปฅ่งฃๅฏ†ๆถˆๆฏ็š„่ฎพๅค‡ไธŠๅฏๅŠจElement๏ผŒ่ฟ™ๆ ทๅฎƒๅฐฑๅฏไปฅๅฐ†ๅฏ†้’ฅๅ‘้€ๅˆฐๆญคไผš่ฏใ€‚"; "key_backup_setup_title" = "ๅฏ†้’ฅๅค‡ไปฝ"; "key_backup_setup_skip_alert_title" = "ๆ‚จ็กฎๅฎšๅ—๏ผŸ"; -"key_backup_setup_skip_alert_message" = "ๅฆ‚ๆžœๆ‚จ้€€ๅ‡บๆˆ–ไธขๅคฑ่ฎพๅค‡๏ผŒๅฏ่ƒฝไผšไธขๅคฑๅฎ‰ๅ…จๆถˆๆฏใ€‚"; +"key_backup_setup_skip_alert_message" = "ๅฆ‚ๆžœๆ‚จ็™ปๅ‡บๆˆ–ไธขๅคฑ่ฎพๅค‡๏ผŒๅฏ่ƒฝไผšไธขๅคฑๅฎ‰ๅ…จๆถˆๆฏใ€‚"; "key_backup_setup_skip_alert_skip_action" = "่ทณ่ฟ‡"; "key_backup_setup_intro_title" = "ๆฐธไธไธขๅคฑๅŠ ๅฏ†ๆถˆๆฏ"; "key_backup_setup_intro_info" = "ๅŠ ๅฏ†่Šๅคฉๅฎคไธญ็š„ๆถˆๆฏไฝฟ็”จ็ซฏๅˆฐ็ซฏๅŠ ๅฏ†่ฟ›่กŒไฟๆŠคใ€‚ ๅชๆœ‰ๆ‚จๅ’Œๆ‹ฅๆœ‰ๅฏ†้’ฅ็š„ๆ”ถไปถไบบๆ‰่ƒฝ้˜…่ฏป่ฟ™ไบ›ๆถˆๆฏใ€‚\n\nๅฎ‰ๅ…จๅค‡ไปฝๅฏ†้’ฅไปฅ้ฟๅ…ไธขๅคฑๅฏ†้’ฅใ€‚"; @@ -659,7 +659,7 @@ "sign_out_key_backup_in_progress_alert_cancel_action" = "็ญ‰ๅพ…"; "auth_login_single_sign_on" = "ไฝฟ็”จๅ•็‚น็™ปๅฝ•ๆ–นๅผ็™ปๅ…ฅ"; "room_message_unable_open_link_error_message" = "ๆ— ๆณ•ๆ‰“ๅผ€้“พๆŽฅใ€‚"; -"auth_autodiscover_invalid_response" = "ๆ— ๆ•ˆ็š„ไธปๆœๅŠกๅ™จๆŽขๆต‹ๅ“ๅบ”"; +"auth_autodiscover_invalid_response" = "ไธปๆœๅŠกๅ™จๆŽขๆต‹ๅ“ๅบ”ๆ— ๆ•ˆ"; "close" = "ๅ…ณ้—ญ"; // Accessibility "accessibility_checkbox_label" = "ๅคš้€‰ๆก†"; @@ -670,7 +670,7 @@ "auth_phone_is_required" = "ๆœช่ฎพ็ฝฎ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ๏ผŒๆ‰€ไปฅไฝ ไธ่ƒฝๆทปๅŠ ็”ต่ฏๅท็ ๆฅ้‡่ฎพไฝ ็š„ๅฏ†็ ใ€‚"; "auth_forgot_password_error_no_configured_identity_server" = "ๆœช่ฎพ็ฝฎ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ๏ผšๆทปๅŠ ๆœๅŠกๅ™จไปฅ้‡่ฎพไฝ ็š„ๅฏ†็ ใ€‚"; "auth_reset_password_error_is_required" = "ๆœช่ฎพ็ฝฎ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ๏ผšๅœจๆœๅŠกๅ™จ้€‰้กนไธญๆทปๅŠ ไปฅไพฟ้‡่ฎพไฝ ็š„ๅฏ†็ ใ€‚"; -"auth_softlogout_signed_out" = "ไฝ ๅทฒ็ป็™ปๅ‡บ"; +"auth_softlogout_signed_out" = "ไฝ ๅทฒ็™ปๅ‡บ"; "auth_softlogout_sign_in" = "็™ปๅฝ•"; "auth_softlogout_reason" = "ไฝ ็š„ไธปๆœๅŠกๅ™จ๏ผˆ%1$@๏ผ‰็ฎก็†ๅ‘˜ๅทฒๅฐ†ไฝ ็š„่ดฆๅท%2$@๏ผˆ%3$@๏ผ‰็™ปๅ‡บใ€‚"; "auth_softlogout_recover_encryption_keys" = "็™ปๅฝ•ไปฅๆขๅคๅ•็‹ฌไฟๅญ˜ๅœจๆญค่ฎพๅค‡ไธŠ็š„ๅŠ ๅฏ†ๅฏ†้’ฅใ€‚ไฝ ้œ€่ฆๅฎƒไปฌๆ‰่ƒฝ้˜…่ฏปไปปไฝ•่ฎพๅค‡ไธŠ็š„ๅฎ‰ๅ…จๆถˆๆฏใ€‚"; @@ -682,7 +682,7 @@ "auth_softlogout_clear_data_sign_out_msg" = "ไฝ ็กฎๅฎšๅธŒๆœ›ๆธ…็ฉบๆ‰€ๆœ‰ๅฝ“ๅ‰ไฟๅญ˜ๅœจๆญค่ฎพๅค‡ไธŠๆ•ฐๆฎๅ—๏ผŸๅ†ๆฌก็™ปๅฝ•ๅฏไปฅ่Žทๅ–ไฝ ็š„่ดฆๅทๆ•ฐๆฎๅ’Œๆถˆๆฏใ€‚"; "auth_softlogout_clear_data_sign_out" = "็™ปๅ‡บ"; // Errors -"error_user_already_logged_in" = "็œ‹ไธŠๅŽปไฝ ่ฏ•ๅ›พ่ฟžๆŽฅๅฆไธ€ไธชไธปๆœๅŠกๅ™จใ€‚ไฝ ๆƒณ่ฆ็™ปๅ‡บๅ—๏ผŸ"; +"error_user_already_logged_in" = "ๆ‚จไผผไนŽๆญฃๅœจๅฐ่ฏ•่ฟžๆŽฅๅฆไธ€ไธชไธปๆœๅŠกๅ™จใ€‚ๆ‚จๆƒณ่ฆ็™ปๅ‡บๅ—๏ผŸ"; "room_creation_error_invite_user_by_email_without_identity_server" = "ๆœช่ฎพ็ฝฎ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ๏ผŒๆ‰€ไปฅไฝ ไธ่ƒฝ็”จ้‚ฎ็ฎฑๆทปๅŠ ๅ‚ไธŽ่€…ใ€‚"; "contacts_address_book_no_identity_server" = "ๆœช่ฎพ็ฝฎ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ"; "room_participants_remove_third_party_invite_prompt_msg" = "ไฝ ็กฎๅฎšๆƒณๆ’คๅ›ž่ฟ™ไธช้‚€่ฏทๅ—๏ผŸ"; @@ -691,9 +691,9 @@ "room_participants_action_security_status_verified" = "ๅทฒ้ชŒ่ฏ"; "room_participants_action_security_status_verify" = "้ชŒ่ฏ"; "room_participants_action_security_status_warning" = "่ญฆๅ‘Š"; -"room_participants_security_loading" = "่ฝฝๅ…ฅไธญโ€ฆโ€ฆ"; -"room_participants_security_information_room_not_encrypted" = "ๆœฌ่Šๅคฉๅฎคไธญ็š„ๆถˆๆฏไธๆ˜ฏ็ซฏๅˆฐ็ซฏๅŠ ๅฏ†็š„ใ€‚"; -"room_participants_security_information_room_encrypted" = "ๆœฌ่Šๅคฉๅฎคไธญ็š„ๆถˆๆฏๆ˜ฏ็ซฏๅˆฐ็ซฏๅŠ ๅฏ†็š„ใ€‚\n\nไฝ ็š„ๆถˆๆฏ่ขซๅŠ ้”ไฟๆŠค๏ผŒๅนถไธ”ๅชๆœ‰ไฝ ๅ’Œๆ”ถไฟกไบบๆœ‰ๅ”ฏไธ€็š„่งฃๅฏ†ๅฏ†้’ฅใ€‚"; +"room_participants_security_loading" = "ๆญฃๅœจ่ฝฝๅ…ฅโ€ฆ"; +"room_participants_security_information_room_not_encrypted" = "ๆญค่Šๅคฉๅฎคไธญ็š„ๆถˆๆฏๆœช็ป็ซฏๅฏน็ซฏๅŠ ๅฏ†ใ€‚"; +"room_participants_security_information_room_encrypted" = "ๆœฌ่Šๅคฉๅฎคไธญ็š„ๆถˆๆฏๅทฒ่ขซ็ซฏๅฏน็ซฏๅŠ ๅฏ†ใ€‚\n\nๆ‚จ็š„ๆถˆๆฏๅ—ๅŠ ๅฏ†ไฟๆŠค๏ผŒๅนถไธ”ๅชๆœ‰ๆ‚จๅ’ŒๆถˆๆฏๆŽฅๆ”ถ่€…ๆ‹ฅๆœ‰ๅ”ฏไธ€่งฃๅฏ†ๅฏ†้’ฅใ€‚"; "room_accessiblity_scroll_to_bottom" = "ๆปšๅŠจๅˆฐๅบ•้ƒจ"; "room_event_action_reply" = "ๅ›žๅค"; "room_event_action_edit" = "็ผ–่พ‘"; @@ -731,7 +731,7 @@ "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_invalid_password_message" = "้ชŒ่ฏไฟกๆฏๆ— ๆ•ˆ"; "settings_key_backup_button_connect" = "ๅ…ณ่”ๆญคไผš่ฏๅˆฐๅฏ†้’ฅๅค‡ไปฝ"; "settings_devices_description" = "ไผš่ฏ็š„ๅ…ฌๅผ€ๅๅญ—ไผšๅฏนไฝ ่”็ปœ็š„ไบบๅฏ่ง"; "settings_discovery_no_identity_server" = "ไฝ ็Žฐๅœจๆฒกๆœ‰ๅœจ็”จ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จใ€‚ๆƒณ่ฆ่ขซไฝ ่ฎค่ฏ†็š„็Žฐๆœ‰่”็ณปไบบๅ‘็Žฐ๏ผŒ่ฏทๆทปๅŠ ใ€‚"; @@ -754,7 +754,7 @@ // Security settings "security_settings_title" = "ๅฎ‰ๅ…จ"; "security_settings_crypto_sessions" = "ๆˆ‘็š„ไผš่ฏ"; -"security_settings_crypto_sessions_loading" = "่ฝฝๅ…ฅไผš่ฏไธญโ€ฆโ€ฆ"; +"security_settings_crypto_sessions_loading" = "ๆญฃๅœจ่ฝฝๅ…ฅไผš่ฏโ€ฆ"; "security_settings_crypto_sessions_description" = "ไฟกไปปไผš่ฏไปฅ็ป™ไธŽ่Žทๅพ—็ซฏๅˆฐ็ซฏๅŠ ๅฏ†็š„ๆถˆๆฏ็š„ๆƒ้™ใ€‚ๅฆ‚ๆžœไฝ ๆฒกๆœ‰่ฎคๅ‡บๆŸไธชไผš่ฏ๏ผŒ่ฏทๆ›ดๆ”นไฝ ็š„็™ปๅฝ•ๅฏ†็ ๅนถไธ”้‡่ฎพไฝ ็”จไบŽๆถˆๆฏๅค‡็š„ๆถˆๆฏๅฏ†็ ใ€‚"; "security_settings_backup" = "ๆถˆๆฏๅค‡ไปฝ"; "security_settings_advanced" = "้ซ˜็บง"; @@ -775,14 +775,14 @@ "identity_server_settings_place_holder" = "่พ“ๅ…ฅ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ"; "identity_server_settings_add" = "ๆทปๅŠ "; "identity_server_settings_change" = "ๆ›ดๆ”น"; -"identity_server_settings_disconnect_info" = "ไปŽไฝ ็š„่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จๆ–ญๅผ€่ฟžๆŽฅๆ„ๅ‘ณ็€ไฝ ไธไผš่ขซๅ…ถไป–็”จๆˆทๆ‰€ๅ‘็Žฐๅนถไธ”ไธไผš่ขซๅ…ถไป–ไบบ้€š่ฟ‡้‚ฎ็ฎฑๆˆ–่€…็”ต่ฏ้‚€่ฏทใ€‚"; +"identity_server_settings_disconnect_info" = "ไปŽไฝ ็š„่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จๆ–ญๅผ€่ฟžๆŽฅๆ„ๅ‘ณ็€ไฝ ๆ— ๆณ•่ขซๅ…ถไป–็”จๆˆทๆ‰€ๅ‘็Žฐ๏ผŒๅนถไธ”ไธไผš่ขซๅ…ถไป–ไบบ้€š่ฟ‡้‚ฎ็ฎฑๆˆ–่€…็”ต่ฏ้‚€่ฏทใ€‚"; "identity_server_settings_disconnect" = "ๆ–ญๅผ€่ฟžๆŽฅ"; "identity_server_settings_alert_no_terms_title" = "่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จๆฒกๆœ‰ๆœๅŠกๆกๆฌพ"; "identity_server_settings_alert_no_terms" = "ไฝ ๆ‰€้€‰ๆ‹ฉ็š„่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จๅนถๆฒกๆœ‰ไปปไฝ•ๆœๅŠกๆกๆฌพใ€‚่ฏทไป…ๅฝ“ไฝ ไฟกไปปๆญคๆœๅŠกๅ™จๆ‰€ๆœ‰ไบบๆ—ถๅ†็ปง็ปญใ€‚"; "identity_server_settings_alert_change_title" = "ๆ›ดๆ”น่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ"; -"identity_server_settings_alert_change" = "ๆ–ญๅผ€่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ%1$@็š„่ฟžๆŽฅ๏ผŒ่€Œ่ฟžๆŽฅๅˆฐ%2$@๏ผŸ"; +"identity_server_settings_alert_change" = "ๆ–ญๅผ€ไธŽ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ %1$@ ็š„่ฟžๆŽฅ๏ผŒ่ฝฌ่€Œ่ฟžๆŽฅๅˆฐ %2$@๏ผŸ"; "identity_server_settings_alert_disconnect_title" = "ๆ–ญๅผ€่ฟžๆŽฅ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ"; -"identity_server_settings_alert_disconnect" = "ๆ–ญๅผ€ๅˆฐ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ%@็š„่ฟžๆŽฅ๏ผŸ"; +"identity_server_settings_alert_disconnect" = "ๆ–ญๅผ€ๅˆฐ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ %@ ็š„่ฟžๆŽฅ๏ผŸ"; "identity_server_settings_alert_disconnect_button" = "ๆ–ญๅผ€่ฟžๆŽฅ"; "identity_server_settings_alert_disconnect_still_sharing_3pid" = "ไฝ ไปๅœจ่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จ%@ๅˆ†ไบซไฝ ็š„ไธชไบบๆ•ฐๆฎใ€‚\n\nๆˆ‘ไปฌๅปบ่ฎฎไฝ ๅœจๆ–ญๅผ€่ฟžๆŽฅๅ‰ไปŽๆญค่บซไปฝ่ฎค่ฏๆœๅŠกๅ™จๅˆ ้™คไฝ ็š„้‚ฎ็ฎฑๅœฐๅ€ๅ’Œ็”ต่ฏๅท็ ใ€‚"; "identity_server_settings_alert_disconnect_still_sharing_3pid_button" = "ไป็„ถๆ–ญๅผ€่ฟžๆŽฅ"; @@ -810,7 +810,7 @@ "widget_integration_manager_disabled" = "ไฝ ้œ€่ฆๅœจ่ฎพ็ฝฎไธญๆ‰“ๅผ€โ€œ้›†ๆˆ็ฎก็†ๅ™จโ€"; // Widget Picker "widget_picker_title" = "้›†ๆˆ"; -"widget_picker_manage_integrations" = "็ฎก็†้›†ๆˆโ€ฆโ€ฆ"; +"widget_picker_manage_integrations" = "็ฎก็†้›†ๆˆโ€ฆ"; // Room widget permissions "room_widget_permission_title" = "่ฝฝๅ…ฅๅฐๆ’ไปถ"; "room_widget_permission_creator_info_title" = "่ฟ™ไธชๅฐๆ’ไปถ็š„ๆทปๅŠ ่€…ๆ˜ฏ๏ผš"; @@ -849,13 +849,13 @@ "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" = "ไฝฟ็”จ่€ๅผ้ชŒ่ฏ"; "device_verification_verify_title_emoji" = "้€š่ฟ‡็กฎ่ฎคไปฅไธ‹emoji่กจๆƒ…ๅ‡บ็ŽฐๅœจๅŒไผด็š„ๅฑๅน•ไธŠๆฅ้ชŒ่ฏๆญคไผš่ฏ"; "device_verification_verify_title_number" = "้€š่ฟ‡็กฎ่ฎคไปฅไธ‹ๆ•ฐๅญ—ๅ‡บ็ŽฐๅœจๅŒไผด็š„ๅฑๅน•ไธŠๆฅ้ชŒ่ฏๆญคไผš่ฏ"; -"device_verification_verify_wait_partner" = "็ญ‰ๅพ…ๅŒไผด็กฎ่ฎคโ€ฆโ€ฆ"; +"device_verification_verify_wait_partner" = "ๆญฃๅœจ็ญ‰ๅพ…ๅŒไผด็กฎ่ฎคโ€ฆ"; "key_verification_verify_user_title_emoji" = "้€š่ฟ‡็กฎ่ฎคไปฅไธ‹ๅ”ฏไธ€็š„emoji่กจๆƒ…๏ผŒไปฅๅŒๆ ท้กบๅบ๏ผŒๅ‡บ็ŽฐๅœจๅŒไผด็š„ๅฑๅน•ไธŠๆฅ้ชŒ่ฏๆญค็”จๆˆทใ€‚"; "key_verification_verify_user_title_number" = "้€š่ฟ‡็กฎ่ฎคไปฅไธ‹ๆ•ฐๅญ—๏ผŒไปฅๅŒๆ ท้กบๅบ๏ผŒๅ‡บ็ŽฐๅœจๅŒไผด็š„ๅฑๅน•ไธŠๆฅ้ชŒ่ฏๆญค็”จๆˆทใ€‚"; "device_verification_verified_title" = "ๅทฒ้ชŒ่ฏ๏ผ"; @@ -949,8 +949,8 @@ "error_not_supported_on_mobile" = "ไฝ ไธ่ƒฝไปŽ็งปๅŠจ็‰ˆ%@ไธญ่ฟ›่กŒๆญคๆ“ไฝœใ€‚"; "key_verification_tile_request_incoming_title" = "้ชŒ่ฏ่ฏทๆฑ‚"; "key_verification_tile_request_outgoing_title" = "้ชŒ่ฏๅทฒๅ‘้€"; -"key_verification_tile_request_status_data_loading" = "ๆ•ฐๆฎ่ฝฝๅ…ฅไธญโ€ฆโ€ฆ"; -"key_verification_tile_request_status_waiting" = "็ญ‰ๅพ…ไธญโ€ฆโ€ฆ"; +"key_verification_tile_request_status_data_loading" = "ๆญฃๅœจ่ฝฝๅ…ฅๆ•ฐๆฎโ€ฆ"; +"key_verification_tile_request_status_waiting" = "ๆญฃๅœจ็ญ‰ๅพ…โ€ฆ"; "key_verification_tile_request_status_expired" = "ๅทฒ่ฟ‡ๆœŸ"; "key_verification_tile_request_status_cancelled_by_me" = "ๆ‚จๅทฒๅ–ๆถˆ"; "key_verification_tile_request_status_cancelled" = "%@ๅทฒๅ–ๆถˆ"; @@ -963,7 +963,7 @@ "user_verification_start_verify_action" = "ๅผ€ๅง‹้ชŒ่ฏ"; "user_verification_start_information_part1" = "ไธบไบ†้ขๅค–็š„ๅฎ‰ๅ…จๆ€ง๏ผŒ่ฏท้ชŒ่ฏ๏ผš "; "user_verification_start_information_part2" = " ๆฃ€ๆŸฅๅœจไฝ ็š„ไธคไธช่ฎพๅค‡ไธŠ็š„ไธ€ๆฌกๆ€งไปฃ็ ใ€‚"; -"user_verification_start_waiting_partner" = "็ญ‰ๅพ…%@โ€ฆโ€ฆ"; +"user_verification_start_waiting_partner" = "ๆญฃๅœจ็ญ‰ๅพ… %@โ€ฆ"; "user_verification_start_additional_information" = "ไธบไบ†ๅฎ‰ๅ…จ๏ผŒ่ฏทๅฝ“้ขๆˆ–่€…ไฝฟ็”จๅ…ถไป–้€šไฟกๆ–นๅผ่ฟ›่กŒๆญคๆ“ไฝœใ€‚"; "user_verification_sessions_list_user_trust_level_trusted_title" = "ๅทฒไฟกไปป"; "user_verification_sessions_list_user_trust_level_warning_title" = "่ญฆๅ‘Š"; @@ -989,16 +989,16 @@ "client_ios_name" = "Element iOS็‰ˆ"; "client_android_name" = "Element ๅฎ‰ๅ“็‰ˆ"; "room_participants_action_security_status_complete_security" = "ๅฎŒๆ•ดๅฎ‰ๅ…จๆ€ง"; -"room_participants_action_security_status_loading" = "ๅŠ ่ฝฝไธญโ€ฆโ€ฆ"; -"room_member_power_level_admin_in" = "ๅœจ %@ ็š„็ฎก็†ๅ‘˜"; -"room_member_power_level_moderator_in" = "ๅœจ %@ ็š„ไธปๆŒไบบ"; -"room_member_power_level_short_admin" = "็ฎก็†ๅ‘˜"; -"room_member_power_level_short_moderator" = "ไธปๆŒไบบ"; +"room_participants_action_security_status_loading" = "ๆญฃๅœจๅŠ ่ฝฝโ€ฆ"; +"room_member_power_level_admin_in" = "็ฎก็†ๅ‘˜๏ผˆ%@๏ผ‰"; +"room_member_power_level_moderator_in" = "ๅ็ฎกๅ‘˜๏ผˆ%@๏ผ‰"; +"room_member_power_level_short_admin" = "็ฎก็†"; +"room_member_power_level_short_moderator" = "ๅ็ฎก"; "security_settings_crosssigning" = "ไบคๅ‰็ญพๅ"; "security_settings_crosssigning_info_not_bootstrapped" = "ไบคๅ‰็ญพๅ่ฟ˜ๆฒกๆœ‰่ขซ่ฎพ็ฝฎใ€‚"; "security_settings_crosssigning_info_exists" = "ๆ‚จ็š„ๅธๆˆทๆœ‰ไธ€ไธชไบคๅ‰็ญพๅ่บซไปฝ๏ผŒไฝ†ๆ˜ฏ่ฟ˜ๆฒกๆœ‰่ขซ่ฟ™ไธชไผš่ฏไฟกไปปใ€‚ๅฎŒๅ…จๅฎ‰ๅ…จ็š„ไผš่ฏใ€‚"; "skip" = "่ทณ่ฟ‡"; -"room_member_power_level_custom_in" = "่‡ชๅฎšไน‰(%@) ๅˆฐ%@"; +"room_member_power_level_custom_in" = "่‡ชๅฎšไน‰๏ผˆ%@๏ผ‰๏ผˆ%@๏ผ‰"; "room_member_power_level_short_custom" = "่‡ชๅฎšไน‰"; "security_settings_crosssigning_info_trusted" = "ๅทฒๅฏ็”จไบคๅ‰็ญพๅใ€‚ๆ‚จๅฏไปฅๅŸบไบŽไบคๅ‰็ญพๅไฟกไปปๅ…ถไป–็”จๆˆทๅ’Œๅ…ถไป–ไผš่ฏ๏ผŒไฝ†ไธ่ƒฝไปŽๆญคไผš่ฏไบคๅ‰็ญพๅ๏ผŒๅ› ไธบๅฎƒๆฒกๆœ‰ไบคๅ‰็ญพๅ็ง้’ฅใ€‚ๆญคไผš่ฏๅฎŒๅ…จๅฎ‰ๅ…จใ€‚"; "security_settings_crosssigning_info_ok" = "ไบคๅ‰็ญพๅ่ฟ˜ๆฒกๆœ‰่ขซ่ฎพ็ฝฎใ€‚"; @@ -1008,7 +1008,7 @@ "security_settings_cryptography" = "ๅŠ ๅฏ†"; "security_settings_complete_security_alert_title" = "็ปๅฏนๅฎ‰ๅ…จ"; "security_settings_complete_security_alert_message" = "ๆ‚จๅบ”่ฏฅๅ…ˆๅฎŒๆˆๅฝ“ๅ‰ไผš่ฏ็š„ๅฎ‰ๅ…จ้˜ฒๆŠคใ€‚"; -"security_settings_coming_soon" = "ๅฏนไธ่ตทใ€‚่ฟ™ไธชๆ“ไฝœๅœจElement iOS็‰ˆๆœฌไธŠ่ฟ˜ไธๅฏ็”จใ€‚่ฏทไฝฟ็”จๅฆไธ€ไธชMatrixๅฎขๆˆท็ซฏๆฅ่ฎพ็ฝฎๅฎƒใ€‚Elment iOSไผšไฝฟ็”จๅฎƒใ€‚"; +"security_settings_coming_soon" = "ๅฏนไธ่ตทใ€‚่ฟ™ไธชๆ“ไฝœๅœจ Element iOS ็‰ˆๆœฌไธŠ่ฟ˜ไธๅฏ็”จใ€‚่ฏทไฝฟ็”จๅฆไธ€ไธช Matrix ๅฎขๆˆท็ซฏๆฅ่ฎพ็ฝฎๅฎƒใ€‚Elment iOS ไผšๆฒฟ็”จๅ…ถไป–ๅฎขๆˆท็ซฏ็š„่ฎพ็ฝฎใ€‚"; // Recover from private key "key_backup_recover_from_private_key_info" = "ๅค‡ไปฝๆขๅคไธญโ€ฆ"; // MARK: - Device Verification @@ -1023,7 +1023,7 @@ "device_verification_self_verify_alert_validate_action" = "้ชŒ่ฏ"; "device_verification_self_verify_start_verify_action" = "ๅผ€ๅง‹้ชŒ่ฏ"; "device_verification_self_verify_start_information" = "ไฝฟ็”จๆญคไผš่ฏ้ชŒ่ฏๆ‚จ็š„ๆ–ฐไผš่ฏ๏ผŒๅนถๆŽˆไบˆๅ…ถ่ฎฟ้—ฎๅŠ ๅฏ†ไฟกๆฏ็š„ๆƒ้™ใ€‚"; -"device_verification_self_verify_start_waiting" = "็ญ‰ๅพ…ไธญโ€ฆโ€ฆ"; +"device_verification_self_verify_start_waiting" = "ๆญฃๅœจ็ญ‰ๅพ…โ€ฆ"; "key_verification_self_verify_current_session_alert_title" = "้ชŒ่ฏๆญคไผš่ฏ"; "key_verification_self_verify_current_session_alert_message" = "ๅ…ถไป–็”จๆˆทๅฏ่ƒฝไธไฟกไปปๅฎƒใ€‚"; "key_verification_self_verify_current_session_alert_validate_action" = "้ชŒ่ฏ"; @@ -1104,12 +1104,145 @@ "switch" = "ๅผ€ๅ…ณ"; "joined" = "ๅทฒๅŠ ๅ…ฅ"; "store_promotional_text" = "ๅœจๅผ€ๆ”พ็ฝ‘็ปœไธŠไฟๆŠค้š็ง็š„่Šๅคฉๅ’Œๅไฝœๅบ”็”จ็จ‹ๅบใ€‚ๅˆ†ๆ•ฃๆƒๅŠ›่ฎฉไฝ ๆŽŒๆŽงไธ€ๅˆ‡ใ€‚ๆฒกๆœ‰ๆ•ฐๆฎๆŒ–ๆŽ˜๏ผŒๆฒกๆœ‰ๅŽ้—จ๏ผŒไนŸๆฒกๆœ‰็ฌฌไธ‰ๆ–น่ฎฟ้—ฎใ€‚"; -"social_login_button_title_sign_up" = "ไปฅ %@ ๆ–นๅผ็™ปๅฝ•"; -"social_login_button_title_sign_in" = "ไปฅ %@ ๆ–นๅผ็™ปๅฝ•"; -"social_login_button_title_continue" = "็ปง็ปญ %@ ไปฅๅ…ถไป–ๆ–นๅผ็™ปๅฝ•"; -"social_login_list_title_sign_in" = "ๅˆฉ็”จ็คพไบคๅช’ไฝ“็™ปๅฝ•"; -"social_login_list_title_sign_up" = "ๅˆฉ็”จ็คพไบคๅช’ไฝ“ๆณจๅ†Œ"; +"social_login_button_title_sign_up" = "ไฝฟ็”จ %@ ๆณจๅ†Œ"; +"social_login_button_title_sign_in" = "ไฝฟ็”จ %@ ็™ปๅฝ•"; +"social_login_button_title_continue" = "ไฝฟ็”จ %@ ็ปง็ปญ"; +"social_login_list_title_sign_in" = "ๆˆ–"; +"social_login_list_title_sign_up" = "ๆˆ–"; // Social login "social_login_list_title_continue" = "ไปฅๅ…ถไป–ๆ–นๅผ็™ปๅฝ•"; +"security_settings_secure_backup_delete" = "ๅˆ ้™ค"; +"security_settings_secure_backup_synchronise" = "ๅŒๆญฅ"; +"security_settings_secure_backup_setup" = "่ฎพ็ฝฎ"; +"security_settings_secure_backup_description" = "้€š่ฟ‡ๅœจๆ‚จ็š„ๆœๅŠกๅ™จไธŠๅค‡ไปฝๅŠ ๅฏ†ๅฏ†้’ฅ๏ผŒ้˜ฒๆญขๅคฑๅŽปๅฏนๅŠ ๅฏ†ไฟกๆฏๅ’Œๆ•ฐๆฎ็š„่ฎฟ้—ฎใ€‚"; +"security_settings_crypto_sessions_description_2" = "ๅฆ‚ๆžœๆ‚จๆœชๆ›พๅ‘่ตท็™ปๅฝ•๏ผŒ่ฏทๆ›ดๆ”นๅฏ†็ ๅนถ้‡็ฝฎๅฎ‰ๅ…จๅค‡ไปฝใ€‚"; +"settings_show_NSFW_public_rooms" = "ๆ˜พ็คบ NSFW ๅ…ฌๅ…ฑ่Šๅคฉๅฎค"; +"external_link_confirmation_message" = "ๆญค้“พๆŽฅ %@ ไผšๅฐ†ๆ‚จๅธฆ่‡ณๅฆไธ€ไธช็ฝ‘็ซ™๏ผš%@\n\nๆ˜ฏๅฆๅ‰ๅพ€๏ผŸ"; +"external_link_confirmation_title" = "ๅŒๅ‡ปๆญค้“พๆŽฅ"; +"room_open_dialpad" = "ๆ‹จๅท้”ฎ็›˜"; +"room_place_voice_call" = "่ฏญ้Ÿณ้€š่ฏ"; +"room_event_action_delete_confirmation_message" = "ๆ‚จ็กฎๅฎš่ฆๅˆ ้™ค่ฟ™ๆกๆœชๅ‘้€็š„ๆถˆๆฏๅ—๏ผŸ"; +"room_event_action_delete_confirmation_title" = "ๅˆ ้™คๆœชๅ‘้€็š„ๆถˆๆฏ"; +"room_unsent_messages_cancel_message" = "ๆ‚จ็กฎๅฎš่ฆๅˆ ้™คๆญค่Šๅคฉๅฎคไธญๆ‰€ๆœ‰ๆœชๅ‘้€็š„ๆถˆๆฏๅ—๏ผŸ"; +"room_unsent_messages_cancel_title" = "ๅˆ ้™คๆœชๅ‘้€็š„ๆถˆๆฏ"; +"room_participants_security_information_room_encrypted_for_dm" = "่ฟ™้‡Œ็š„ๆถˆๆฏๅทฒ่ขซ็ซฏๅฏน็ซฏๅŠ ๅฏ†ใ€‚\n\nๆ‚จ็š„ๆถˆๆฏๅ—ๅŠ ๅฏ†ไฟๆŠค๏ผŒๅนถไธ”ๅชๆœ‰ๆ‚จๅ’ŒๆถˆๆฏๆŽฅๆ”ถ่€…ๆ‹ฅๆœ‰ๅ”ฏไธ€่งฃๅฏ†ๅฏ†้’ฅใ€‚"; +"room_participants_security_information_room_not_encrypted_for_dm" = "ๆญคๅค„็š„ๆถˆๆฏๆœช็ป็ซฏๅฏน็ซฏๅŠ ๅฏ†ใ€‚"; +"room_participants_filter_room_members_for_dm" = "็ญ›้€‰ๆˆๅ‘˜"; +"room_participants_leave_prompt_msg_for_dm" = "ๆ‚จ็กฎๅฎš่ฆ็ฆปๅผ€ๅ—๏ผŸ"; +"room_participants_leave_prompt_title_for_dm" = "็ฆปๅผ€"; +"callbar_active_and_multiple_paused" = "1 ไธช่ฟ›่กŒไธญ้€š่ฏ๏ผˆ%@๏ผ‰ยท %@ ไธชๅทฒๆš‚ๅœ้€š่ฏ"; +"callbar_active_and_single_paused" = "1 ไธช่ฟ›่กŒไธญ้€š่ฏ๏ผˆ%@๏ผ‰ยท 1 ไธชๅทฒๆš‚ๅœ้€š่ฏ"; + +// Call Bar +"callbar_only_single_active" = "่ฟ›่กŒไธญ้€š่ฏ๏ผˆ%@๏ผ‰"; +"callbar_only_multiple_paused" = "%@ ไธชๅทฒๆš‚ๅœ้€š่ฏ"; +"callbar_only_single_paused" = "ๅทฒๆš‚ๅœ้€š่ฏ"; +"callbar_return" = "่ฟ”ๅ›ž"; +"room_intro_cell_information_room_sentence1_part3" = "ใ€‚ "; +"room_intro_cell_information_dm_sentence1_part3" = "ใ€‚ "; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "ๆทปๅŠ ่ฏ้ข˜"; +"room_intro_cell_information_room_with_topic_sentence2" = "่ฏ้ข˜๏ผš%@"; + +// Mark: - Room creation introduction cell + +"room_intro_cell_add_participants_action" = "ๆทปๅŠ ไบบๅ‘˜"; +"room_avatar_view_accessibility_hint" = "ไฟฎๆ”น่Šๅคฉๅฎคๅคดๅƒ"; + +// Mark: - Room avatar view + +"room_avatar_view_accessibility_label" = "ๅคดๅƒ"; + +// MARK: - Invite friends + +"invite_friends_action" = "้‚€่ฏทๅฅฝๅ‹่‡ณ %@"; + +// MARK: - Favourites + +"favourites_empty_view_title" = "ๆ”ถ่—่ŠๅคฉๅฎคไธŽๅฏน่ฏ"; + +// MARK: - Home + +"home_empty_view_title" = "ๆฌข่ฟŽไฝฟ็”จ %@๏ผŒ\n%@"; +"call_transfer_error_message" = "ๅ‘ผๅซ่ฝฌ็งปๅคฑ่ดฅ"; +"call_transfer_error_title" = "้”™่ฏฏ"; +"call_transfer_contacts_all" = "ๅ…จ้ƒจ"; +"call_transfer_contacts_recent" = "ๆœ€่ฟ‘"; +"call_transfer_dialpad" = "ๆ‹จๅท้”ฎ็›˜"; +"call_transfer_users" = "็”จๆˆท"; + +// MARK: - Call Transfer +"call_transfer_title" = "่ฝฌ็งป"; + +// MARK: - Dial Pad +"dialpad_title" = "ๆ‹จๅท้”ฎ็›˜"; +"room_info_list_section_other" = "ๅ…ถไป–"; +"create_room_section_footer_encryption" = "ๅŠ ๅฏ†ไธ€็ปๅฏ็”จ๏ผŒไพฟๆ— ๆณ•็ฆ็”จใ€‚"; +"create_room_placeholder_address" = "#testroom:matrix.org"; +"create_room_section_header_address" = "่Šๅคฉๅฎคๅœฐๅ€"; +"create_room_section_header_type" = "่Šๅคฉๅฎค็ฑปๅž‹"; +"create_room_enable_encryption" = "ๅฏ็”จๅŠ ๅฏ†"; +"create_room_section_header_encryption" = "่ŠๅคฉๅฎคๅŠ ๅฏ†"; +"create_room_placeholder_topic" = "่ฏ้ข˜"; +"create_room_section_header_topic" = "่Šๅคฉๅฎค่ฏ้ข˜๏ผˆๅฏ้€‰๏ผ‰"; +"create_room_placeholder_name" = "ๅ็งฐ"; +"create_room_section_header_name" = "่Šๅคฉๅฎคๅ็งฐ"; + +// MARK: - Create Room + +"create_room_title" = "ๆ–ฐ่Šๅคฉๅฎค"; +"searchable_directory_search_placeholder" = "ๅ็งฐๆˆ– ID"; +"searchable_directory_x_network" = "%@ ็ฝ‘็ปœ"; + +// MARK: - Searchable Directory View Controller + +"searchable_directory_create_new_room" = "ๅˆ›ๅปบๆ–ฐ่Šๅคฉๅฎค"; +"biometrics_cant_unlocked_alert_message_retry" = "้‡่ฏ•"; +"biometrics_desetup_disable_button_title_x" = "็ฆ็”จ %@"; +"biometrics_desetup_title_x" = "็ฆ็”จ %@"; +"biometrics_setup_enable_button_title_x" = "ๅฏ็”จ %@"; +"biometrics_setup_title_x" = "ๅฏ็”จ %@"; +"biometrics_settings_enable_x" = "ๅฏ็”จ %@"; +"biometrics_mode_face_id" = "Face ID"; + +// MARK: - Biometrics Protection + +"biometrics_mode_touch_id" = "Touch ID"; +"pin_protection_mismatch_error_message" = "่ฏทๅ†่ฏ•ไธ€ๆฌก"; +"pin_protection_reset_alert_action_reset" = "้‡็ฝฎ"; +"pin_protection_choose_pin_welcome_after_register" = "ๆฌข่ฟŽใ€‚"; + +// MARK: - PIN Protection + +"pin_protection_choose_pin_welcome_after_login" = "ๆฌข่ฟŽๅ›žๆฅใ€‚"; +"major_update_learn_more_action" = "ไบ†่งฃๆ›ดๅคš"; + +// MARK: - Major update + +"major_update_title" = "Riot ็Žฐๅทฒๆˆไธบ Element"; +"secrets_reset_reset_action" = "้‡็ฝฎ"; +"secrets_setup_recovery_passphrase_summary_title" = "ไฟๅญ˜ๆ‚จ็š„ๅฎ‰ๅ…จๅฏ†่ฏญ"; +"secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "็กฎ่ฎคๅฎ‰ๅ…จๅฏ†่ฏญ"; +"secrets_setup_recovery_passphrase_confirm_passphrase_title" = "็กฎ่ฎค"; +"secrets_setup_recovery_passphrase_additional_information" = "ไธ่ฆไฝฟ็”จไฝ ็š„่ดฆๅทๅฏ†็ ใ€‚"; +"secrets_setup_recovery_passphrase_validate_action" = "ๅฎŒๆˆ"; + +// Recovery passphrase + +"secrets_setup_recovery_passphrase_title" = "่ฎพ็ฝฎๅฎ‰ๅ…จๅฏ†่ฏญ"; +"secrets_setup_recovery_key_done_action" = "ๅฎŒๆˆ"; +"secrets_setup_recovery_key_export_action" = "ไฟๅญ˜"; +"secrets_setup_recovery_key_loading" = "ๆญฃๅœจๅŠ ่ฝฝโ€ฆ"; + +// MARK: - Secrets set up + +// Recovery Key + +"secrets_setup_recovery_key_title" = "ไฟๅญ˜ๆ‚จ็š„ๅฎ‰ๅ…จๅฏ†้’ฅ"; +"room_info_list_several_members" = "%@ ไฝๆˆๅ‘˜"; + +// MARK: - Room Info + +"room_info_list_one_member" = "1 ไฝๆˆๅ‘˜"; +"security_settings_secure_backup" = "ๅฎ‰ๅ…จๅค‡ไปฝ"; diff --git a/Riot/Generated/Images.swift b/Riot/Generated/Images.swift index 5793e9185..7f973231f 100644 --- a/Riot/Generated/Images.swift +++ b/Riot/Generated/Images.swift @@ -98,10 +98,15 @@ internal enum Asset { internal static let peopleEmptyScreenArtwork = ImageAsset(name: "people_empty_screen_artwork") internal static let peopleEmptyScreenArtworkDark = ImageAsset(name: "people_empty_screen_artwork_dark") internal static let peopleFloatingAction = ImageAsset(name: "people_floating_action") + internal static let actionCamera = ImageAsset(name: "action_camera") + internal static let actionFile = ImageAsset(name: "action_file") + internal static let actionMediaLibrary = ImageAsset(name: "action_media_library") + internal static let actionSticker = ImageAsset(name: "action_sticker") internal static let error = ImageAsset(name: "error") internal static let errorMessageTick = ImageAsset(name: "error_message_tick") internal static let roomActivitiesRetry = ImageAsset(name: "room_activities_retry") internal static let scrolldown = ImageAsset(name: "scrolldown") + internal static let scrolldownDark = ImageAsset(name: "scrolldown_dark") internal static let sendingMessageTick = ImageAsset(name: "sending_message_tick") internal static let sentMessageTick = ImageAsset(name: "sent_message_tick") internal static let typing = ImageAsset(name: "typing") @@ -111,7 +116,15 @@ internal enum Asset { internal static let roomContextMenuMore = ImageAsset(name: "room_context_menu_more") internal static let roomContextMenuReply = ImageAsset(name: "room_context_menu_reply") internal static let roomContextMenuRetry = ImageAsset(name: "room_context_menu_retry") + internal static let inputCloseIcon = ImageAsset(name: "input_close_icon") + internal static let inputEditIcon = ImageAsset(name: "input_edit_icon") + internal static let inputReplyIcon = ImageAsset(name: "input_reply_icon") + internal static let inputTextBackground = ImageAsset(name: "input_text_background") + internal static let saveIcon = ImageAsset(name: "save_icon") + internal static let sendIcon = ImageAsset(name: "send_icon") internal static let uploadIcon = ImageAsset(name: "upload_icon") + internal static let uploadIconDark = ImageAsset(name: "upload_icon_dark") + internal static let videoCall = ImageAsset(name: "video_call") internal static let voiceCallHangonIcon = ImageAsset(name: "voice_call_hangon_icon") internal static let voiceCallHangupIcon = ImageAsset(name: "voice_call_hangup_icon") internal static let addMemberFloatingAction = ImageAsset(name: "add_member_floating_action") diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 218303eaf..ab9947434 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -1514,7 +1514,7 @@ internal enum VectorL10n { internal static var identityServerSettingsDisconnect: String { return VectorL10n.tr("Vector", "identity_server_settings_disconnect") } - /// Disconnecting from your identity server will mean you wonโ€™t be discoverable by other users and be able to invite others by email or phone. + /// Disconnecting from your identity server will mean you wonโ€™t be discoverable by other users and be able to invite others by email or phone. internal static var identityServerSettingsDisconnectInfo: String { return VectorL10n.tr("Vector", "identity_server_settings_disconnect_info") } @@ -2294,6 +2294,10 @@ internal enum VectorL10n { internal static var roomAccessibilityUpload: String { return VectorL10n.tr("Vector", "room_accessibility_upload") } + /// Video Call + internal static var roomAccessibilityVideoCall: String { + return VectorL10n.tr("Vector", "room_accessibility_video_call") + } /// Scroll to bottom internal static var roomAccessiblityScrollToBottom: String { return VectorL10n.tr("Vector", "room_accessiblity_scroll_to_bottom") @@ -2614,6 +2618,10 @@ internal enum VectorL10n { internal static var roomDetailsHistorySectionPromptTitle: String { return VectorL10n.tr("Vector", "room_details_history_section_prompt_title") } + /// Integrations + internal static var roomDetailsIntegrations: String { + return VectorL10n.tr("Vector", "room_details_integrations") + } /// Low priority internal static var roomDetailsLowPriorityTag: String { return VectorL10n.tr("Vector", "room_details_low_priority_tag") @@ -2666,6 +2674,10 @@ internal enum VectorL10n { internal static var roomDetailsSaveChangesPrompt: String { return VectorL10n.tr("Vector", "room_details_save_changes_prompt") } + /// Search room + internal static var roomDetailsSearch: String { + return VectorL10n.tr("Vector", "room_details_search") + } /// Set as Main Address internal static var roomDetailsSetMainAddress: String { return VectorL10n.tr("Vector", "room_details_set_main_address") @@ -2894,6 +2906,10 @@ internal enum VectorL10n { internal static var roomMemberPowerLevelShortModerator: String { return VectorL10n.tr("Vector", "room_member_power_level_short_moderator") } + /// Editing + internal static var roomMessageEditing: String { + return VectorL10n.tr("Vector", "room_message_editing") + } /// Message edits internal static var roomMessageEditsHistoryTitle: String { return VectorL10n.tr("Vector", "room_message_edits_history_title") @@ -2910,6 +2926,10 @@ internal enum VectorL10n { internal static var roomMessageReplyToShortPlaceholder: String { return VectorL10n.tr("Vector", "room_message_reply_to_short_placeholder") } + /// Replying to %@ + internal static func roomMessageReplyingTo(_ p1: String) -> String { + return VectorL10n.tr("Vector", "room_message_replying_to", p1) + } /// Send a messageโ€ฆ internal static var roomMessageShortPlaceholder: String { return VectorL10n.tr("Vector", "room_message_short_placeholder") @@ -2918,6 +2938,10 @@ internal enum VectorL10n { internal static var roomMessageUnableOpenLinkErrorMessage: String { return VectorL10n.tr("Vector", "room_message_unable_open_link_error_message") } + /// %@ and others + internal static func roomMultipleTypingNotification(_ p1: String) -> String { + return VectorL10n.tr("Vector", "room_multiple_typing_notification", p1) + } /// %d new message internal static func roomNewMessageNotification(_ p1: Int) -> String { return VectorL10n.tr("Vector", "room_new_message_notification", p1) diff --git a/Riot/Managers/Settings/RiotSettings.swift b/Riot/Managers/Settings/RiotSettings.swift index 5627d7369..390a9301b 100644 --- a/Riot/Managers/Settings/RiotSettings.swift +++ b/Riot/Managers/Settings/RiotSettings.swift @@ -37,6 +37,28 @@ final class RiotSettings: NSObject { static let hideReviewSessionsAlert = "hideReviewSessionsAlert" static let matrixApps = "matrixApps" static let showNSFWPublicRooms = "showNSFWPublicRooms" + static let settingsScreenShowChangePassword = "settingsScreenShowChangePassword" + static let settingsScreenShowInviteFriends = "settingsScreenShowInviteFriends" + static let settingsScreenShowEnableStunServerFallback = "settingsScreenShowEnableStunServerFallback" + static let settingsSecurityScreenShowSessions = "settingsSecurityScreenShowSessions" + static let settingsSecurityScreenShowSetupBackup = "settingsSecurityScreenShowSetupBackup" + static let settingsSecurityScreenShowRestoreBackup = "settingsSecurityScreenShowRestoreBackup" + static let settingsSecurityScreenShowDeleteBackup = "settingsSecurityScreenShowDeleteBackup" + static let settingsSecurityScreenShowCryptographyInfo = "settingsSecurityScreenShowCryptographyInfo" + static let settingsSecurityScreenShowCryptographyExport = "settingsSecurityScreenShowCryptographyExport" + static let settingsSecurityScreenShowAdvancedUnverifiedDevices = "settingsSecurityScreenShowAdvancedBlacklistUnverifiedDevices" + static let roomCreationScreenAllowEncryptionConfiguration = "roomCreationScreenAllowEncryptionConfiguration" + static let roomCreationScreenRoomIsEncrypted = "roomCreationScreenRoomIsEncrypted" + static let roomCreationScreenAllowRoomTypeConfiguration = "roomCreationScreenAllowRoomTypeConfiguration" + static let roomCreationScreenRoomIsPublic = "roomCreationScreenRoomIsPublic" + static let allowInviteExernalUsers = "allowInviteExernalUsers" + static let homeScreenShowFavouritesTab = "homeScreenShowFavouritesTab" + static let homeScreenShowPeopleTab = "homeScreenShowPeopleTab" + static let homeScreenShowRoomsTab = "homeScreenShowRoomsTab" + static let homeScreenShowCommunitiesTab = "homeScreenShowCommunitiesTab" + static let roomScreenAllowVoIPForDirectRoom = "roomScreenAllowVoIPForDirectRoom" + static let roomScreenAllowVoIPForNonDirectRoom = "roomScreenAllowVoIPForNonDirectRoom" + static let unifiedSearchScreenShowPublicDirectory = "unifiedSearchScreenShowPublicDirectory" } static let shared = RiotSettings() @@ -51,6 +73,20 @@ final class RiotSettings: NSObject { // MARK: - Public + func reset() { + defaults.removeObject(forKey: UserDefaultsKeys.settingsScreenShowChangePassword) + defaults.removeObject(forKey: UserDefaultsKeys.settingsScreenShowInviteFriends) + defaults.removeObject(forKey: UserDefaultsKeys.settingsScreenShowEnableStunServerFallback) + defaults.removeObject(forKey: UserDefaultsKeys.settingsSecurityScreenShowSessions) + defaults.removeObject(forKey: UserDefaultsKeys.settingsSecurityScreenShowSetupBackup) + defaults.removeObject(forKey: UserDefaultsKeys.settingsSecurityScreenShowRestoreBackup) + defaults.removeObject(forKey: UserDefaultsKeys.settingsSecurityScreenShowDeleteBackup) + defaults.removeObject(forKey: UserDefaultsKeys.settingsSecurityScreenShowCryptographyInfo) + defaults.removeObject(forKey: UserDefaultsKeys.settingsSecurityScreenShowCryptographyExport) + defaults.removeObject(forKey: UserDefaultsKeys.settingsSecurityScreenShowAdvancedUnverifiedDevices) + defaults.removeObject(forKey: UserDefaultsKeys.allowInviteExernalUsers) + } + // MARK: Servers var homeserverUrlString: String { @@ -212,4 +248,243 @@ final class RiotSettings: NSObject { defaults.set(newValue, forKey: UserDefaultsKeys.matrixApps) } } + + // MARK: - Room Screen + + var roomScreenAllowVoIPForDirectRoom: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.roomScreenAllowVoIPForDirectRoom) != nil else { + return BuildSettings.roomScreenAllowVoIPForDirectRoom + } + return defaults.bool(forKey: UserDefaultsKeys.roomScreenAllowVoIPForDirectRoom) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.roomScreenAllowVoIPForDirectRoom) + } + } + var roomScreenAllowVoIPForNonDirectRoom: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.roomScreenAllowVoIPForNonDirectRoom) != nil else { + return BuildSettings.roomScreenAllowVoIPForNonDirectRoom + } + return defaults.bool(forKey: UserDefaultsKeys.roomScreenAllowVoIPForNonDirectRoom) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.roomScreenAllowVoIPForNonDirectRoom) + } + } + + // MARK: - Room Creation Screen + + var roomCreationScreenAllowEncryptionConfiguration: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.roomCreationScreenAllowEncryptionConfiguration) != nil else { + return BuildSettings.roomCreationScreenAllowEncryptionConfiguration + } + return defaults.bool(forKey: UserDefaultsKeys.roomCreationScreenAllowEncryptionConfiguration) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.roomCreationScreenAllowEncryptionConfiguration) + } + } + var roomCreationScreenRoomIsEncrypted: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.roomCreationScreenRoomIsEncrypted) != nil else { + return BuildSettings.roomCreationScreenRoomIsEncrypted + } + return defaults.bool(forKey: UserDefaultsKeys.roomCreationScreenRoomIsEncrypted) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.roomCreationScreenRoomIsEncrypted) + } + } + var roomCreationScreenAllowRoomTypeConfiguration: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.roomCreationScreenAllowRoomTypeConfiguration) != nil else { + return BuildSettings.roomCreationScreenAllowRoomTypeConfiguration + } + return defaults.bool(forKey: UserDefaultsKeys.roomCreationScreenAllowRoomTypeConfiguration) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.roomCreationScreenAllowRoomTypeConfiguration) + } + } + var roomCreationScreenRoomIsPublic: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.roomCreationScreenRoomIsPublic) != nil else { + return BuildSettings.roomCreationScreenRoomIsPublic + } + return defaults.bool(forKey: UserDefaultsKeys.roomCreationScreenRoomIsPublic) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.roomCreationScreenRoomIsPublic) + } + } + + // MARK: Features + + var allowInviteExernalUsers: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.allowInviteExernalUsers) != nil else { + return BuildSettings.allowInviteExernalUsers + } + return defaults.bool(forKey: UserDefaultsKeys.allowInviteExernalUsers) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.allowInviteExernalUsers) + } + } + + // MARK: - Main Tabs + + var homeScreenShowFavouritesTab: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.homeScreenShowFavouritesTab) != nil else { + return BuildSettings.homeScreenShowFavouritesTab + } + return defaults.bool(forKey: UserDefaultsKeys.homeScreenShowFavouritesTab) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.homeScreenShowFavouritesTab) + } + } + var homeScreenShowPeopleTab: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.homeScreenShowPeopleTab) != nil else { + return BuildSettings.homeScreenShowPeopleTab + } + return defaults.bool(forKey: UserDefaultsKeys.homeScreenShowPeopleTab) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.homeScreenShowPeopleTab) + } + } + var homeScreenShowRoomsTab: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.homeScreenShowRoomsTab) != nil else { + return BuildSettings.homeScreenShowRoomsTab + } + return defaults.bool(forKey: UserDefaultsKeys.homeScreenShowRoomsTab) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.homeScreenShowRoomsTab) + } + } + var homeScreenShowCommunitiesTab: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.homeScreenShowCommunitiesTab) != nil else { + return BuildSettings.homeScreenShowCommunitiesTab + } + return defaults.bool(forKey: UserDefaultsKeys.homeScreenShowCommunitiesTab) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.homeScreenShowCommunitiesTab) + } + } + + // MARK: General Settings + + var settingsScreenShowChangePassword: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.settingsScreenShowChangePassword) != nil else { + return BuildSettings.settingsScreenShowChangePassword + } + return defaults.bool(forKey: UserDefaultsKeys.settingsScreenShowChangePassword) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.settingsScreenShowChangePassword) + } + } + var settingsScreenShowInviteFriends: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.settingsScreenShowInviteFriends) != nil else { + return BuildSettings.settingsScreenShowInviteFriends + } + return defaults.bool(forKey: UserDefaultsKeys.settingsScreenShowInviteFriends) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.settingsScreenShowInviteFriends) + } + } + var settingsScreenShowEnableStunServerFallback: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.settingsScreenShowInviteFriends) != nil else { + return BuildSettings.settingsScreenShowEnableStunServerFallback + } + return defaults.bool(forKey: UserDefaultsKeys.settingsScreenShowEnableStunServerFallback) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.settingsScreenShowEnableStunServerFallback) + } + } + var settingsSecurityScreenShowSessions: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.settingsSecurityScreenShowSessions) != nil else { + return BuildSettings.settingsSecurityScreenShowSessions + } + return defaults.bool(forKey: UserDefaultsKeys.settingsSecurityScreenShowSessions) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.settingsSecurityScreenShowSessions) + } + } + var settingsSecurityScreenShowSetupBackup: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.settingsSecurityScreenShowSetupBackup) != nil else { + return BuildSettings.settingsSecurityScreenShowSetupBackup + } + return defaults.bool(forKey: UserDefaultsKeys.settingsSecurityScreenShowSetupBackup) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.settingsSecurityScreenShowSetupBackup) + } + } + var settingsSecurityScreenShowRestoreBackup: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.settingsSecurityScreenShowRestoreBackup) != nil else { + return BuildSettings.settingsSecurityScreenShowRestoreBackup + } + return defaults.bool(forKey: UserDefaultsKeys.settingsSecurityScreenShowRestoreBackup) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.settingsSecurityScreenShowRestoreBackup) + } + } + var settingsSecurityScreenShowDeleteBackup: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.settingsSecurityScreenShowDeleteBackup) != nil else { + return BuildSettings.settingsSecurityScreenShowDeleteBackup + } + return defaults.bool(forKey: UserDefaultsKeys.settingsSecurityScreenShowDeleteBackup) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.settingsSecurityScreenShowDeleteBackup) + } + } + var settingsSecurityScreenShowCryptographyInfo: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.settingsSecurityScreenShowCryptographyInfo) != nil else { + return BuildSettings.settingsSecurityScreenShowCryptographyInfo + } + return defaults.bool(forKey: UserDefaultsKeys.settingsSecurityScreenShowCryptographyInfo) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.settingsSecurityScreenShowCryptographyInfo) + } + } + var settingsSecurityScreenShowCryptographyExport: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.settingsSecurityScreenShowCryptographyExport) != nil else { + return BuildSettings.settingsSecurityScreenShowCryptographyExport + } + return defaults.bool(forKey: UserDefaultsKeys.settingsSecurityScreenShowCryptographyExport) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.settingsSecurityScreenShowCryptographyExport) + } + } + var settingsSecurityScreenShowAdvancedUnverifiedDevices: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.settingsSecurityScreenShowAdvancedUnverifiedDevices) != nil else { + return BuildSettings.settingsSecurityScreenShowAdvancedUnverifiedDevices + } + return defaults.bool(forKey: UserDefaultsKeys.settingsSecurityScreenShowAdvancedUnverifiedDevices) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.settingsSecurityScreenShowAdvancedUnverifiedDevices) + } + } + + // Mark: - Unified Search + + var unifiedSearchScreenShowPublicDirectory: Bool { + get { + guard defaults.object(forKey: UserDefaultsKeys.unifiedSearchScreenShowPublicDirectory) != nil else { + return BuildSettings.unifiedSearchScreenShowPublicDirectory + } + return defaults.bool(forKey: UserDefaultsKeys.unifiedSearchScreenShowPublicDirectory) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.unifiedSearchScreenShowPublicDirectory) + } + } + } diff --git a/Riot/Managers/Theme/Theme.swift b/Riot/Managers/Theme/Theme.swift index 4fcb9ca5c..54815e497 100644 --- a/Riot/Managers/Theme/Theme.swift +++ b/Riot/Managers/Theme/Theme.swift @@ -70,6 +70,7 @@ import UIKit // MARK: - Appearance and style + var roomInputTextBorder: UIColor { get } /// Status bar style to use var statusBarStyle: UIStatusBarStyle { get } diff --git a/Riot/Managers/Theme/Themes/DarkTheme.swift b/Riot/Managers/Theme/Themes/DarkTheme.swift index c2da703ae..d3752abf4 100644 --- a/Riot/Managers/Theme/Themes/DarkTheme.swift +++ b/Riot/Managers/Theme/Themes/DarkTheme.swift @@ -52,6 +52,8 @@ class DarkTheme: NSObject, Theme { var noticeSecondaryColor: UIColor = UIColor(rgb: 0x61708B) var warningColor: UIColor = UIColor(rgb: 0xFF4B55) + + var roomInputTextBorder: UIColor = UIColor(rgb: 0x8D97A5).withAlphaComponent(0.2) var avatarColors: [UIColor] = [ UIColor(rgb: 0x03B381), diff --git a/Riot/Managers/Theme/Themes/DefaultTheme.swift b/Riot/Managers/Theme/Themes/DefaultTheme.swift index e2fea3979..eb0ed522e 100644 --- a/Riot/Managers/Theme/Themes/DefaultTheme.swift +++ b/Riot/Managers/Theme/Themes/DefaultTheme.swift @@ -52,8 +52,8 @@ class DefaultTheme: NSObject, Theme { var noticeSecondaryColor: UIColor = UIColor(rgb: 0x61708B) var warningColor: UIColor = UIColor(rgb: 0xFF4B55) - - var messageTickColor: UIColor = UIColor(rgb: 0xC1C6CD) + + var roomInputTextBorder: UIColor = UIColor(rgb: 0xE3E8F0) var avatarColors: [UIColor] = [ UIColor(rgb: 0x03B381), diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index 4c4ff28f3..ef261c069 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -2136,6 +2136,10 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni [self logoutSendingRequestServer:YES completion:^(BOOL isLoggedOut) { if (completion) { + if (isLoggedOut) + { + [RiotSettings.shared reset]; + } completion (YES); } }]; @@ -2270,21 +2274,29 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni if (mainSession.crypto.crossSigning) { - NSLog(@"[AppDelegate] handleAppState: crossSigning.state: %@", @(mainSession.crypto.crossSigning.state)); - - switch (mainSession.crypto.crossSigning.state) - { - case MXCrossSigningStateCrossSigningExists: - NSLog(@"[AppDelegate] handleAppState: presentVerifyCurrentSessionAlertIfNeededWithSession"); - [_masterTabBarController presentVerifyCurrentSessionAlertIfNeededWithSession:mainSession]; - break; - case MXCrossSigningStateCanCrossSign: - NSLog(@"[AppDelegate] handleAppState: presentReviewUnverifiedSessionsAlertIfNeededWithSession"); - [_masterTabBarController presentReviewUnverifiedSessionsAlertIfNeededWithSession:mainSession]; - break; - default: - break; - } + // Get the up-to-date cross-signing state + MXWeakify(self); + [mainSession.crypto.crossSigning refreshStateWithSuccess:^(BOOL stateUpdated) { + MXStrongifyAndReturnIfNil(self); + + NSLog(@"[AppDelegate] handleAppState: crossSigning.state: %@", @(mainSession.crypto.crossSigning.state)); + + switch (mainSession.crypto.crossSigning.state) + { + case MXCrossSigningStateCrossSigningExists: + NSLog(@"[AppDelegate] handleAppState: presentVerifyCurrentSessionAlertIfNeededWithSession"); + [self.masterTabBarController presentVerifyCurrentSessionAlertIfNeededWithSession:mainSession]; + break; + case MXCrossSigningStateCanCrossSign: + NSLog(@"[AppDelegate] handleAppState: presentReviewUnverifiedSessionsAlertIfNeededWithSession"); + [self.masterTabBarController presentReviewUnverifiedSessionsAlertIfNeededWithSession:mainSession]; + break; + default: + break; + } + } failure:^(NSError * _Nonnull error) { + NSLog(@"[AppDelegate] handleAppState: crossSigning.state: %@. Error: %@", @(mainSession.crypto.crossSigning.state), error); + }]; } // TODO: We should wait that cross-signing screens are done before going further but it seems fine. Those screens @@ -3930,6 +3942,18 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni [self.incomingKeyVerificationRequestAlertController dismissViewControllerAnimated:NO completion:nil]; } + if (self.userNewSignInAlertController + && [session.myUserId isEqualToString:senderId]) + { + // If it is a self verification for my device, we can discard the new signin alert. + // Note: It will not work well with several devices to verify at the same time. + NSLog(@"[AppDelegate] presentNewKeyVerificationRequest: Remove the alert for new sign in detected"); + [self.userNewSignInAlertController dismissViewControllerAnimated:NO completion:^{ + self.userNewSignInAlertController = nil; + [self presentNewKeyVerificationRequestAlertForSession:session senderName:senderName senderId:senderId request:keyVerificationRequest]; + }]; + } + NSString *senderInfo; if (senderName) @@ -3951,7 +3975,6 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni } }; - UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"key_verification_tile_request_incoming_title", @"Vector", nil) message:senderInfo preferredStyle:UIAlertControllerStyleAlert]; diff --git a/Riot/Modules/BadgeLabel/BadgeLabel.swift b/Riot/Modules/BadgeLabel/BadgeLabel.swift index f52409871..f61f4dd6a 100644 --- a/Riot/Modules/BadgeLabel/BadgeLabel.swift +++ b/Riot/Modules/BadgeLabel/BadgeLabel.swift @@ -40,7 +40,7 @@ class BadgeLabel: UILabel { } } - @IBInspectable var padding: CGSize = CGSize(width: 10, height: 2) { + @IBInspectable var padding: CGSize = CGSize(width: 10, height: 3) { didSet { invalidateIntrinsicContentSize() } diff --git a/Riot/Modules/Contacts/DataSources/ContactsDataSource.m b/Riot/Modules/Contacts/DataSources/ContactsDataSource.m index 72d2e4616..dea3437ff 100644 --- a/Riot/Modules/Contacts/DataSources/ContactsDataSource.m +++ b/Riot/Modules/Contacts/DataSources/ContactsDataSource.m @@ -499,7 +499,7 @@ if (section == searchInputSection) { - count = 1; + count = RiotSettings.shared.allowInviteExernalUsers ? 1 : 0; } else if (section == filteredLocalContactsSection && !(shrinkedSectionsBitMask & CONTACTSDATASOURCE_LOCALCONTACTS_BITWISE)) { diff --git a/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewController.swift b/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewController.swift index 7ec1cf9e8..d177dcd52 100644 --- a/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewController.swift +++ b/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewController.swift @@ -113,39 +113,51 @@ final class EnterNewRoomDetailsViewController: UIViewController { rows: [row_2_0], footer: nil) - let row_3_0 = Row(type: .withSwitch(isOn: viewModel.roomCreationParameters.isEncrypted, onValueChanged: { (theSwitch) in - self.viewModel.roomCreationParameters.isEncrypted = theSwitch.isOn - }), text: VectorL10n.createRoomEnableEncryption, accessoryType: .none) { - // no-op - } - let section3 = Section(header: VectorL10n.createRoomSectionHeaderEncryption, - rows: [row_3_0], - footer: VectorL10n.createRoomSectionFooterEncryption) - - let row_4_0 = Row(type: .default, text: VectorL10n.createRoomTypePrivate, accessoryType: viewModel.roomCreationParameters.isPublic ? .none : .checkmark) { - self.viewModel.roomCreationParameters.isPublic = false - self.updateSections() - } - let row_4_1 = Row(type: .default, text: VectorL10n.createRoomTypePublic, accessoryType: viewModel.roomCreationParameters.isPublic ? .checkmark : .none) { - self.viewModel.roomCreationParameters.isPublic = true - self.updateSections() - // scroll bottom to show user new fields - DispatchQueue.main.async { - self.mainTableView.scrollToRow(at: IndexPath(row: 0, section: 6), at: .bottom, animated: true) + var section3: Section? + if RiotSettings.shared.roomCreationScreenAllowEncryptionConfiguration { + let row_3_0 = Row(type: .withSwitch(isOn: viewModel.roomCreationParameters.isEncrypted, onValueChanged: { (theSwitch) in + self.viewModel.roomCreationParameters.isEncrypted = theSwitch.isOn + }), text: VectorL10n.createRoomEnableEncryption, accessoryType: .none) { + // no-op } + section3 = Section(header: VectorL10n.createRoomSectionHeaderEncryption, + rows: [row_3_0], + footer: VectorL10n.createRoomSectionFooterEncryption) + } + + var section4: Section? + if RiotSettings.shared.roomCreationScreenAllowRoomTypeConfiguration { + let row_4_0 = Row(type: .default, text: VectorL10n.createRoomTypePrivate, accessoryType: viewModel.roomCreationParameters.isPublic ? .none : .checkmark) { + self.viewModel.roomCreationParameters.isPublic = false + self.updateSections() + } + let row_4_1 = Row(type: .default, text: VectorL10n.createRoomTypePublic, accessoryType: viewModel.roomCreationParameters.isPublic ? .checkmark : .none) { + self.viewModel.roomCreationParameters.isPublic = true + self.updateSections() + // scroll bottom to show user new fields + DispatchQueue.main.async { + self.mainTableView.scrollToRow(at: IndexPath(row: 0, section: 6), at: .bottom, animated: true) + } + } + section4 = Section(header: VectorL10n.createRoomSectionHeaderType, + rows: [row_4_0, row_4_1], + footer: VectorL10n.createRoomSectionFooterType) } - let section4 = Section(header: VectorL10n.createRoomSectionHeaderType, - rows: [row_4_0, row_4_1], - footer: VectorL10n.createRoomSectionFooterType) var tmpSections: [Section] = [ section0, section1, - section2, - section3, - section4 + section2 ] + if let section3 = section3 { + tmpSections.append(section3) + } + + if let section4 = section4 { + tmpSections.append(section4) + } + if viewModel.roomCreationParameters.isPublic { let row_5_0 = Row(type: .withSwitch(isOn: viewModel.roomCreationParameters.showInDirectory, onValueChanged: { (theSwitch) in self.viewModel.roomCreationParameters.showInDirectory = theSwitch.isOn diff --git a/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModel.swift b/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModel.swift index 37ed2bed9..a9a48bdde 100644 --- a/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModel.swift +++ b/Riot/Modules/CreateRoom/EnterNewRoomDetails/EnterNewRoomDetailsViewModel.swift @@ -39,7 +39,8 @@ final class EnterNewRoomDetailsViewModel: EnterNewRoomDetailsViewModelType { init(session: MXSession) { self.session = session - roomCreationParameters.isEncrypted = session.vc_isE2EByDefaultEnabledByHSAdmin() + roomCreationParameters.isEncrypted = session.vc_isE2EByDefaultEnabledByHSAdmin() && RiotSettings.shared.roomCreationScreenRoomIsEncrypted + roomCreationParameters.isPublic = RiotSettings.shared.roomCreationScreenRoomIsPublic } deinit { diff --git a/Riot/Modules/DotsView/DotsView.swift b/Riot/Modules/DotsView/DotsView.swift new file mode 100644 index 000000000..adcf3ef49 --- /dev/null +++ b/Riot/Modules/DotsView/DotsView.swift @@ -0,0 +1,146 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +@IBDesignable +@objcMembers +class DotsView: UIView { + // MARK: - Public properties + + @IBInspectable var highlightedDotColor: UIColor = .darkGray + + @IBInspectable var dotColor: UIColor = .lightGray + + @IBInspectable var dotMaxWidth: CGFloat = 10 { + didSet { + self.sizeToFit() + } + } + + @IBInspectable var dotMinWidth: CGFloat = 8 { + didSet { + self.sizeToFit() + } + } + + @IBInspectable var numberOfDots: UInt = 3 { + didSet { + createDotViews() + } + } + + @IBInspectable var interSpaceMargin: CGFloat = 7 { + didSet { + self.sizeToFit() + } + } + + // MARK: - Private members + + private var dotLayers: Array = Array() + private var highlightedDotIndex: UInt = 0 { + didSet { + updateDotViews() + } + } + private let updateInterval: TimeInterval = 0.4 + private var lastUpdateDate: Date = Date() + private var animating: Bool = false { + didSet { + let displayLink = CADisplayLink(target: self, selector: #selector(fireTimer)) + displayLink.add(to: .current, forMode: .default) + } + } + + // MARK: - Lifecycle + + required init?(coder: NSCoder) { + super.init(coder: coder) + createDotViews() + } + + override init(frame: CGRect) { + super.init(frame: frame) + createDotViews() + } + + override func layoutSubviews() { + super.layoutSubviews() + + updateDotViews() + } + + override var intrinsicContentSize: CGSize { + return CGSize(width: dotMaxWidth + (CGFloat(numberOfDots) - 1) * (dotMinWidth + interSpaceMargin), height: dotMaxWidth) + } + + override func didMoveToSuperview() { + animating = superview != nil + } + + // MARK: - Interface Builder + + override func prepareForInterfaceBuilder() { + super.prepareForInterfaceBuilder() + createDotViews() + } + + // MARK: - Private methods + + private func createDotViews() { + while dotLayers.count > numberOfDots { + dotLayers.popLast()?.removeFromSuperlayer() + } + + while dotLayers.count < numberOfDots { + let dotLayer = CALayer() + dotLayer.masksToBounds = true + layer.addSublayer(dotLayer) + dotLayers.append(dotLayer) + } + + if highlightedDotIndex >= dotLayers.count { + highlightedDotIndex = 0 + updateDotViews() + } + } + + private func updateDotViews() { + CATransaction.begin() + CATransaction.setAnimationDuration(1) + var x: CGFloat = 0 + for (index, dotLayer) in dotLayers.enumerated() { + if index == highlightedDotIndex { + dotLayer.frame = CGRect(x: x, y: (bounds.height - dotMaxWidth) / 2, width: dotMaxWidth, height: dotMaxWidth) + dotLayer.backgroundColor = dotColor.cgColor + } else { + dotLayer.frame = CGRect(x: x, y: (bounds.height - dotMinWidth) / 2, width: dotMinWidth, height: dotMinWidth) + dotLayer.backgroundColor = index == ((highlightedDotIndex + 1) % numberOfDots) ? highlightedDotColor.cgColor : dotColor.cgColor + } + dotLayer.cornerRadius = dotLayer.bounds.height / 2 + x = dotLayer.frame.maxX + interSpaceMargin + } + lastUpdateDate = Date() + CATransaction.commit() + } + + @objc private func fireTimer() { + if Date().timeIntervalSince(lastUpdateDate) >= updateInterval { + self.highlightedDotIndex = (self.highlightedDotIndex + 1) % self.numberOfDots + } + } +} diff --git a/Riot/Modules/GlobalSearch/DataSources/UnifiedSearchRecentsDataSource.m b/Riot/Modules/GlobalSearch/DataSources/UnifiedSearchRecentsDataSource.m index df95e8ff8..1a4605ba6 100644 --- a/Riot/Modules/GlobalSearch/DataSources/UnifiedSearchRecentsDataSource.m +++ b/Riot/Modules/GlobalSearch/DataSources/UnifiedSearchRecentsDataSource.m @@ -22,6 +22,7 @@ #import "DirectoryRecentTableViewCell.h" #import "MXRoom+Riot.h" +#import "Riot-Swift.h" @interface UnifiedSearchRecentsDataSource() { @@ -85,7 +86,10 @@ } // The public rooms directory cell is then visible whatever the search activity. - self.directorySection = sectionsOffset++; + if (RiotSettings.shared.unifiedSearchScreenShowPublicDirectory) + { + self.directorySection = sectionsOffset++; + } if (_hideRecents) { diff --git a/Riot/Modules/GlobalSearch/Views/DirectoryRecentTableViewCell.m b/Riot/Modules/GlobalSearch/Views/DirectoryRecentTableViewCell.m index 0ebf282f1..63cdbfbce 100644 --- a/Riot/Modules/GlobalSearch/Views/DirectoryRecentTableViewCell.m +++ b/Riot/Modules/GlobalSearch/Views/DirectoryRecentTableViewCell.m @@ -54,7 +54,7 @@ self.titleLabel.text = NSLocalizedStringFromTable(@"directory_search_results_title", @"Vector", nil); // Do we need to display like ">20 results found" or "18 results found"? - NSString *descriptionLabel = publicRoomsDirectoryDataSource.moreThanRoomsCount ? NSLocalizedStringFromTable(@"directory_search_results_more_than", @"Vector", nil) : NSLocalizedStringFromTable(@"directory_search_results", @"Vector", nil); + NSString *descriptionLabel = (publicRoomsDirectoryDataSource.moreThanRoomsCount && publicRoomsDirectoryDataSource.roomsCount > 0) ? NSLocalizedStringFromTable(@"directory_search_results_more_than", @"Vector", nil) : NSLocalizedStringFromTable(@"directory_search_results", @"Vector", nil); self.descriptionLabel.text = [NSString stringWithFormat:descriptionLabel, publicRoomsDirectoryDataSource.roomsCount, diff --git a/Riot/Modules/KeyVerification/Device/SelfVerifyWait/KeyVerificationSelfVerifyWaitViewModel.swift b/Riot/Modules/KeyVerification/Device/SelfVerifyWait/KeyVerificationSelfVerifyWaitViewModel.swift index badcf9dcf..6da9e3ccf 100644 --- a/Riot/Modules/KeyVerification/Device/SelfVerifyWait/KeyVerificationSelfVerifyWaitViewModel.swift +++ b/Riot/Modules/KeyVerification/Device/SelfVerifyWait/KeyVerificationSelfVerifyWaitViewModel.swift @@ -91,6 +91,21 @@ final class KeyVerificationSelfVerifyWaitViewModel: KeyVerificationSelfVerifyWai } else { // be sure that session has completed its first sync if session.state >= MXSessionStateRunning { + + // Always send request instead of waiting for an incoming one as per recent EW changes + print("[KeyVerificationSelfVerifyWaitViewModel] loadData: Send a verification request to all devices instead of waiting") + + let keyVerificationService = KeyVerificationService() + self.verificationManager.requestVerificationByToDevice(withUserId: self.session.myUserId, deviceIds: nil, methods: keyVerificationService.supportedKeyVerificationMethods(), success: { [weak self] (keyVerificationRequest) in + guard let self = self else { + return + } + + self.keyVerificationRequest = keyVerificationRequest + + }, failure: { [weak self] error in + self?.update(viewState: .error(error)) + }) continueLoadData() } else { // show loader diff --git a/Riot/Modules/PublicRoomList/DataSources/PublicRoomsDirectoryDataSource.m b/Riot/Modules/PublicRoomList/DataSources/PublicRoomsDirectoryDataSource.m index ff77c5cb0..03fb2f94c 100644 --- a/Riot/Modules/PublicRoomList/DataSources/PublicRoomsDirectoryDataSource.m +++ b/Riot/Modules/PublicRoomList/DataSources/PublicRoomsDirectoryDataSource.m @@ -261,7 +261,7 @@ static NSString *const kNSFWKeyword = @"nsfw"; [self->rooms addObjectsFromArray:publicRooms]; self->nextBatch = publicRoomsResponse.nextBatch; - if (!self->_searchPattern || !self.showNSFWRooms) + if (!self->_searchPattern) { // When there is no search, we can use totalRoomCountEstimate returned by the server self->_roomsCount = publicRoomsResponse.totalRoomCountEstimate; diff --git a/Riot/Modules/Room/DataSources/RoomDataSource.h b/Riot/Modules/Room/DataSources/RoomDataSource.h index f28f91fac..725171572 100644 --- a/Riot/Modules/Room/DataSources/RoomDataSource.h +++ b/Riot/Modules/Room/DataSources/RoomDataSource.h @@ -21,6 +21,8 @@ #import "MXRoomSummary+Riot.h" +#import "TypingUserInfo.h" + @protocol RoomDataSourceDelegate; /** @@ -48,6 +50,11 @@ */ @property(nonatomic, readonly) RoomEncryptionTrustLevel encryptionTrustLevel; +/** + List of members who are typing in the room. + */ +@property(nonatomic, nullable) NSArray *currentTypingUsers; + /** Check if there is an active jitsi widget in the room and return it. @@ -93,6 +100,8 @@ success:(void(^)(void))success failure:(void(^)(NSError*))failure; +- (void)resetTypingNotification; + @end @protocol RoomDataSourceDelegate diff --git a/Riot/Modules/Room/DataSources/RoomDataSource.m b/Riot/Modules/Room/DataSources/RoomDataSource.m index 8975281c8..5edf5ba24 100644 --- a/Riot/Modules/Room/DataSources/RoomDataSource.m +++ b/Riot/Modules/Room/DataSources/RoomDataSource.m @@ -27,6 +27,7 @@ #import "MXRoom+Riot.h" +const CGFloat kTypingCellHeight = 24; @interface RoomDataSource() { @@ -53,6 +54,8 @@ @property (nonatomic) BOOL showRoomCreationCell; +@property (nonatomic) NSInteger typingCellIndex; + @end @implementation RoomDataSource @@ -185,6 +188,16 @@ [self setNeedsUpdateAdditionalContentHeightForCellData:cellData]; } +- (CGFloat)cellHeightAtIndex:(NSInteger)index withMaximumWidth:(CGFloat)maxWidth +{ + if (index == self.typingCellIndex) + { + return kTypingCellHeight; + } + + return [super cellHeightAtIndex:index withMaximumWidth:maxWidth]; +} + - (void)setNeedsUpdateAdditionalContentHeightForCellData:(id)cellData { RoomBubbleCellData *roomBubbleCellData; @@ -261,16 +274,40 @@ [self updateStatusInfo]; } - // we may have changed the number of bubbles in this block, consider that change - return bubbles.count; + if (!self.currentTypingUsers) + { + self.typingCellIndex = -1; + + // we may have changed the number of bubbles in this block, consider that change + return bubbles.count; + } + + self.typingCellIndex = bubbles.count; + return bubbles.count + 1; } - // leave it as is, if coming as 0 from super - return count; + if (!self.currentTypingUsers) + { + self.typingCellIndex = -1; + + // leave it as is, if coming as 0 from super + return count; + } + + self.typingCellIndex = count; + return count + 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + if (indexPath.row == self.typingCellIndex) + { + RoomTypingBubbleCell *cell = [tableView dequeueReusableCellWithIdentifier:RoomTypingBubbleCell.defaultReuseIdentifier forIndexPath:indexPath]; + [cell updateWithTheme:ThemeService.shared.theme]; + [cell updateTypingUsers:_currentTypingUsers mediaManager:self.mxSession.mediaManager]; + return cell; + } + // Do cell data customization that needs to be done before [MXKRoomBubbleTableViewCell render] RoomBubbleCellData *roomBubbleCellData = [self cellDataAtIndex:indexPath.row]; @@ -915,6 +952,10 @@ }]; } +- (void)resetTypingNotification { + self.currentTypingUsers = nil; +} + #pragma - Accessibility - (void)setupAccessibilityForCell:(MXKRoomBubbleTableViewCell *)cell withCellData:(RoomBubbleCellData*)cellData diff --git a/Riot/Modules/Room/DataSources/TypingUserInfo.h b/Riot/Modules/Room/DataSources/TypingUserInfo.h new file mode 100644 index 000000000..54914dc6e --- /dev/null +++ b/Riot/Modules/Room/DataSources/TypingUserInfo.h @@ -0,0 +1,34 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TypingUserInfo : NSObject + +@property (nonatomic, strong) NSString *userId; +@property (nonatomic, strong, nullable) NSString *displayName; +@property (nonatomic, strong, nullable) NSString *avatarUrl; + +- (instancetype) initWithMember:(MXRoomMember*)member; + +- (instancetype) initWithUserId:(NSString*)userId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Riot/Modules/Room/DataSources/TypingUserInfo.m b/Riot/Modules/Room/DataSources/TypingUserInfo.m new file mode 100644 index 000000000..fa59cde01 --- /dev/null +++ b/Riot/Modules/Room/DataSources/TypingUserInfo.m @@ -0,0 +1,46 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "TypingUserInfo.h" + +@implementation TypingUserInfo + +- (instancetype) initWithMember:(MXRoomMember*)member +{ + self = [self initWithUserId:member.userId]; + + if (self) + { + self.displayName = member.displayname; + self.avatarUrl = member.avatarUrl; + } + + return self; +} + +- (instancetype) initWithUserId:(NSString*)userId +{ + self = [super init]; + + if (self) + { + self.userId = userId; + } + + return self; +} + +@end diff --git a/Riot/Modules/Room/EmojiPicker/Data/Store/EmojiStore.swift b/Riot/Modules/Room/EmojiPicker/Data/Store/EmojiStore.swift index be52d9c1d..26377417f 100644 --- a/Riot/Modules/Room/EmojiPicker/Data/Store/EmojiStore.swift +++ b/Riot/Modules/Room/EmojiPicker/Data/Store/EmojiStore.swift @@ -43,6 +43,10 @@ final class EmojiStore { // Do not use `String.localizedCaseInsensitiveContains` here as EmojiItem data is not localized for the moment + if emojiItem.shortName.vc_caseInsensitiveContains(searchText) { + return true + } + if emojiItem.name.vc_caseInsensitiveContains(searchText) { return true } diff --git a/Riot/Modules/Room/RoomInfo/RoomInfoCoordinator.swift b/Riot/Modules/Room/RoomInfo/RoomInfoCoordinator.swift index 3d9b179dc..f1efb7577 100644 --- a/Riot/Modules/Room/RoomInfo/RoomInfoCoordinator.swift +++ b/Riot/Modules/Room/RoomInfo/RoomInfoCoordinator.swift @@ -86,8 +86,13 @@ final class RoomInfoCoordinator: NSObject, RoomInfoCoordinatorType { // MARK: - Setup - init(parameters: RoomInfoCoordinatorParameters) { - self.navigationRouter = NavigationRouter(navigationController: RiotNavigationController()) + init(parameters: RoomInfoCoordinatorParameters, navigationRouter: NavigationRouterType? = nil) { + if let navigationRouter = navigationRouter { + self.navigationRouter = navigationRouter + } else { + self.navigationRouter = NavigationRouter(navigationController: RiotNavigationController()) + } + self.session = parameters.session self.room = parameters.room self.initialSection = parameters.initialSection @@ -102,8 +107,12 @@ final class RoomInfoCoordinator: NSObject, RoomInfoCoordinatorType { self.add(childCoordinator: rootCoordinator) - self.navigationRouter.setRootModule(rootCoordinator) - + if self.navigationRouter.modules.isEmpty == false { + self.navigationRouter.push(rootCoordinator.toPresentable(), animated: true, popCompletion: nil) + } else { + self.navigationRouter.setRootModule(rootCoordinator) + } + switch initialSection { case .addParticipants: self.showRoomDetails(with: .members, animated: false) @@ -129,13 +138,29 @@ final class RoomInfoCoordinator: NSObject, RoomInfoCoordinatorType { } private func showRoomDetails(with target: RoomInfoListTarget, animated: Bool) { - segmentedViewController.selectedIndex = target.tabIndex - - if case .settings(let roomSettingsField) = target { - roomSettingsViewController?.selectedRoomSettingsField = roomSettingsField + switch target { + case .integrations: + if let modularVC = IntegrationManagerViewController(for: session, inRoom: room.roomId, screen: kIntegrationManagerMainScreen, widgetId: nil) { + navigationRouter.present(modularVC, animated: true) + } + case .search: + MXKRoomDataSourceManager.sharedManager(forMatrixSession: session)?.roomDataSource(forRoom: self.room.roomId, create: false, onComplete: { (roomDataSource) in + guard let dataSource = roomDataSource else { return } + let storyboard = UIStoryboard(name: "Main", bundle: nil) + if let search = storyboard.instantiateViewController(withIdentifier: "RoomSearch") as? RoomSearchViewController { + search.roomDataSource = dataSource + self.navigationRouter.push(search, animated: animated, popCompletion: nil) + } + }) + default: + segmentedViewController.selectedIndex = target.tabIndex + + if case .settings(let roomSettingsField) = target { + roomSettingsViewController?.selectedRoomSettingsField = roomSettingsField + } + + navigationRouter.push(segmentedViewController, animated: animated, popCompletion: nil) } - - navigationRouter.push(segmentedViewController, animated: animated, popCompletion: nil) } } diff --git a/Riot/Modules/Room/RoomInfo/RoomInfoCoordinatorBridgePresenter.swift b/Riot/Modules/Room/RoomInfo/RoomInfoCoordinatorBridgePresenter.swift index 3503eb783..5348b9ab1 100644 --- a/Riot/Modules/Room/RoomInfo/RoomInfoCoordinatorBridgePresenter.swift +++ b/Riot/Modules/Room/RoomInfo/RoomInfoCoordinatorBridgePresenter.swift @@ -63,6 +63,16 @@ final class RoomInfoCoordinatorBridgePresenter: NSObject { self.coordinator = roomInfoCoordinator } + func push(from navigationController: UINavigationController, animated: Bool) { + let navigationRouter = NavigationRouter(navigationController: navigationController) + + let roomInfoCoordinator = RoomInfoCoordinator(parameters: self.coordinatorParameters, navigationRouter: navigationRouter) + roomInfoCoordinator.delegate = self + roomInfoCoordinator.start() + + self.coordinator = roomInfoCoordinator + } + func dismiss(animated: Bool, completion: (() -> Void)?) { guard let coordinator = self.coordinator else { return diff --git a/Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewAction.swift b/Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewAction.swift index 6d50c1551..945d2844a 100644 --- a/Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewAction.swift +++ b/Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewAction.swift @@ -18,11 +18,13 @@ import Foundation -enum RoomInfoListTarget { +enum RoomInfoListTarget: Equatable { case settings(_ field: RoomSettingsViewControllerField = RoomSettingsViewControllerFieldNone) case members case uploads - + case integrations + case search + var tabIndex: UInt { let tabIndex: UInt @@ -33,6 +35,10 @@ enum RoomInfoListTarget { tabIndex = 1 case .settings: tabIndex = 2 + case .integrations: + tabIndex = 3 + case .search: + tabIndex = 4 } return tabIndex diff --git a/Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewController.swift b/Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewController.swift index 0ce7f656d..67a75586a 100644 --- a/Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewController.swift +++ b/Riot/Modules/Room/RoomInfo/RoomInfoList/RoomInfoListViewController.swift @@ -157,11 +157,19 @@ final class RoomInfoListViewController: UIViewController { let rowUploads = Row(type: .default, icon: Asset.Images.scrollup.image, text: VectorL10n.roomDetailsFiles, accessoryType: .disclosureIndicator) { self.viewModel.process(viewAction: .navigate(target: .uploads)) } + let rowSearch = Row(type: .default, icon: Asset.Images.searchIcon.image, text: VectorL10n.roomDetailsSearch, accessoryType: .disclosureIndicator) { + self.viewModel.process(viewAction: .navigate(target: .search)) + } + let rowIntegrations = Row(type: .default, icon: Asset.Images.integrationsIcon.image, text: VectorL10n.roomDetailsIntegrations, accessoryType: .disclosureIndicator) { + self.viewModel.process(viewAction: .navigate(target: .integrations)) + } let sectionSettings = Section(header: VectorL10n.roomInfoListSectionOther, rows: [rowSettings, + rowIntegrations, rowMembers, - rowUploads], + rowUploads, + rowSearch], footer: nil) let leaveTitle = viewData.basicInfoViewData.isDirect ? @@ -205,7 +213,9 @@ final class RoomInfoListViewController: UIViewController { } private func setupViews() { - self.navigationItem.rightBarButtonItem = MXKBarButtonItem(customView: closeButton) + if navigationController?.viewControllers.count ?? 0 <= 1 { + self.navigationItem.rightBarButtonItem = MXKBarButtonItem(customView: closeButton) + } self.title = "" diff --git a/Riot/Modules/Room/RoomViewController.h b/Riot/Modules/Room/RoomViewController.h index 4e9864bfd..50e86e70b 100644 --- a/Riot/Modules/Room/RoomViewController.h +++ b/Riot/Modules/Room/RoomViewController.h @@ -27,6 +27,8 @@ #import "UIViewController+RiotSearch.h" +@class BadgeLabel; + /** Notification string used to indicate call tile tapped in a room. Notification object will be the `RoomBubbleCellData` object. */ @@ -46,6 +48,9 @@ extern NSNotificationName const RoomCallTileTappedNotification; @property (weak, nonatomic) IBOutlet UILabel *jumpToLastUnreadLabel; @property (weak, nonatomic) IBOutlet UIButton *resetReadMarkerButton; @property (weak, nonatomic) IBOutlet UIView *jumpToLastUnreadBannerSeparatorView; +@property (weak, nonatomic) IBOutlet UIView *inputBackgroundView; +@property (weak, nonatomic) IBOutlet UIButton *scrollToBottomButton; +@property (weak, nonatomic) IBOutlet BadgeLabel *scrollToBottomBadgeLabel; /** Preview data for a room invitation received by email, or a link to a room. @@ -72,5 +77,7 @@ extern NSNotificationName const RoomCallTileTappedNotification; */ - (IBAction)onButtonPressed:(id)sender; +- (IBAction)scrollToBottomAction:(id)sender; + @end diff --git a/Riot/Modules/Room/RoomViewController.m b/Riot/Modules/Room/RoomViewController.m index df28f443a..10eabeb65 100644 --- a/Riot/Modules/Room/RoomViewController.m +++ b/Riot/Modules/Room/RoomViewController.m @@ -124,9 +124,12 @@ #import "SettingsViewController.h" #import "SecurityViewController.h" +#import "TypingUserInfo.h" + #import "Riot-Swift.h" NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNotification"; +const NSTimeInterval kResizeComposerAnimationDuration = .05; @interface RoomViewController () *rightBarButtonItems; // Observe kThemeServiceDidChangeThemeNotification to handle user interface theme change. id kThemeServiceDidChangeThemeNotificationObserver; @@ -231,6 +229,8 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo @property (nonatomic, strong) RoomCreationModalCoordinatorBridgePresenter *roomCreationModalCoordinatorBridgePresenter; @property (nonatomic, strong) RoomInfoCoordinatorBridgePresenter *roomInfoCoordinatorBridgePresenter; @property (nonatomic, strong) CustomSizedPresentationController *customSizedPresentationController; +@property (nonatomic, getter=isActivitiesViewExpanded) BOOL activitiesViewExpanded; +@property (nonatomic, getter=isScrollToBottomHidden) BOOL scrollToBottomHidden; @end @@ -289,13 +289,15 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { [super finalizeInit]; + self.resizeComposerAnimationDuration = kResizeComposerAnimationDuration; + // Setup `MXKViewControllerHandling` properties self.enableBarTintColorStatusChange = NO; self.rageShakeManager = [RageShakeManager sharedManager]; formattedBodyParser = [FormattedBodyParser new]; _showMissedDiscussionsBadge = YES; - + _scrollToBottomHidden = YES; // Listen to the event sent state changes [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(eventDidChangeSentState:) name:kMXEventDidChangeSentStateNotification object:nil]; @@ -371,7 +373,9 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo // call cells [self.bubblesTableView registerClass:RoomDirectCallStatusBubbleCell.class forCellReuseIdentifier:RoomDirectCallStatusBubbleCell.defaultReuseIdentifier]; - [self.bubblesTableView registerClass:RoomCreationIntroCell.class forCellReuseIdentifier:RoomCreationIntroCell.defaultReuseIdentifier]; + [self.bubblesTableView registerClass:RoomCreationIntroCell.class forCellReuseIdentifier:RoomCreationIntroCell.defaultReuseIdentifier]; + + [self.bubblesTableView registerNib:RoomTypingBubbleCell.nib forCellReuseIdentifier:RoomTypingBubbleCell.defaultReuseIdentifier]; [self vc_removeBackTitle]; @@ -388,13 +392,6 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo // Custom the event details view [self setEventDetailsViewClass:EventDetailsView.class]; - // Update navigation bar items - for (UIBarButtonItem *barButtonItem in self.navigationItem.rightBarButtonItems) - { - barButtonItem.target = self; - barButtonItem.action = @selector(onButtonPressed:); - } - // Prepare missed dicussion badge (if any) self.showMissedDiscussionsBadge = _showMissedDiscussionsBadge; @@ -420,6 +417,8 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo }]; [self userInterfaceThemeDidChange]; + + [self setupActions]; } - (void)userInterfaceThemeDidChange @@ -436,7 +435,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { [ThemeService.shared.theme applyStyleOnNavigationBar:mainNavigationController.navigationBar]; } - + // Keep navigation bar transparent in some cases if (!self.previewHeaderContainer.hidden) { @@ -456,10 +455,6 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo self.previewHeaderContainer.backgroundColor = ThemeService.shared.theme.headerBackgroundColor; - missedDiscussionsBadgeLabel.textColor = ThemeService.shared.theme.baseTextPrimaryColor; - missedDiscussionsBadgeLabel.font = [UIFont boldSystemFontOfSize:14]; - missedDiscussionsBadgeLabel.backgroundColor = [UIColor clearColor]; - // Check the table view style to select its bg color. self.bubblesTableView.backgroundColor = ((self.bubblesTableView.style == UITableViewStylePlain) ? ThemeService.shared.theme.backgroundColor : ThemeService.shared.theme.headerBackgroundColor); self.bubblesTableView.separatorColor = ThemeService.shared.theme.lineBreakColor; @@ -469,7 +464,28 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { [self.bubblesTableView reloadData]; } + + self.scrollToBottomButton.layer.shadowColor = [UIColor blackColor].CGColor; + self.scrollToBottomButton.layer.shadowOpacity = 0.2; + self.scrollToBottomButton.layer.shadowRadius = 6; + self.scrollToBottomButton.layer.shadowOffset = CGSizeMake(0, 4); + self.inputBackgroundView.backgroundColor = [ThemeService.shared.theme.backgroundColor colorWithAlphaComponent:0.98]; + + if ([ThemeService.shared.themeId isEqualToString:@"light"]) + { + [self.scrollToBottomButton setImage:[UIImage imageNamed:@"scrolldown"] forState:UIControlStateNormal]; + } + else if ([ThemeService.shared.themeId isEqualToString:@"dark"] || [ThemeService.shared.themeId isEqualToString:@"black"]) + { + [self.scrollToBottomButton setImage:[UIImage imageNamed:@"scrolldown_dark"] forState:UIControlStateNormal]; + } + else if (@available(iOS 12.0, *) && ThemeService.shared.theme.userInterfaceStyle == UIUserInterfaceStyleDark) { + [self.scrollToBottomButton setImage:[UIImage imageNamed:@"scrolldown_dark"] forState:UIControlStateNormal]; + } + + self.scrollToBottomBadgeLabel.badgeColor = ThemeService.shared.theme.tintColor; + [self setNeedsStatusBarAppearanceUpdate]; } @@ -487,7 +503,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - + // Screen tracking [[Analytics sharedInstance] trackScreen:@"ChatRoom"]; @@ -500,6 +516,12 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [self refreshRoomInputToolbar]; } + // Reset typing notification in order to remove the allocated space + if ([self.roomDataSource isKindOfClass:RoomDataSource.class]) + { + [((RoomDataSource*)self.roomDataSource) resetTypingNotification]; + } + [self listenTypingNotifications]; [self listenCallNotifications]; [self listenWidgetNotifications]; @@ -558,7 +580,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [self removeWidgetNotificationsListeners]; [self removeTombstoneEventNotificationsListener]; [self removeMXSessionStateChangeNotificationsListener]; - + // Re-enable the read marker display, and disable its update. self.roomDataSource.showReadMarker = YES; self.updateRoomReadMarker = NO; @@ -589,9 +611,9 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo // Observe missed notifications mxRoomSummaryDidChangeObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXRoomSummaryDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) { - + MXRoomSummary *roomSummary = notif.object; - + if ([roomSummary.roomId isEqualToString:self.roomDataSource.roomId]) { [self refreshMissedDiscussionsCount:NO]; @@ -622,7 +644,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [[NSNotificationCenter defaultCenter] removeObserver:mxRoomSummaryDidChangeObserver]; mxRoomSummaryDidChangeObserver = nil; } - + if (mxEventDidDecryptNotificationObserver) { [[NSNotificationCenter defaultCenter] removeObserver:mxEventDidDecryptNotificationObserver]; @@ -659,7 +681,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo eventDetailsView = nil; } } - + // Check whether the preview header is visible if (previewHeader) { @@ -679,13 +701,13 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [previewHeader layoutIfNeeded]; } } - + self.edgesForExtendedLayout = UIRectEdgeAll; - + // Adjust the top constraint of the bubbles table CGRect frame = previewHeader.bottomBorderView.frame; self.previewHeaderContainerHeightConstraint.constant = frame.origin.y + frame.size.height; - + self.bubblesTableViewTopConstraint.constant = self.previewHeaderContainerHeightConstraint.constant - self.bubblesTableView.mxk_adjustedContentInset.top; self.jumpToLastUnreadBannerContainerTopConstraint.constant = self.previewHeaderContainerHeightConstraint.constant; } @@ -694,7 +716,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo // In non expanded header mode, the navigation bar is opaque // The table view must not display behind it self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight; - + self.jumpToLastUnreadBannerContainerTopConstraint.constant = self.bubblesTableView.mxk_adjustedContentInset.top; // no expanded } @@ -703,6 +725,19 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id )coordinator { + if ([self.titleView isKindOfClass:RoomTitleView.class]) + { + RoomTitleView *roomTitleView = (RoomTitleView*)self.titleView; + if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) + { + [roomTitleView updateLayoutForOrientation:UIInterfaceOrientationPortrait]; + } + else + { + [roomTitleView updateLayoutForOrientation:UIInterfaceOrientationLandscapeLeft]; + } + } + // Hide the expanded header or the preview in case of iPad and iPhone 6 plus. // On these devices, the display mode of the splitviewcontroller may change during screen rotation. // It may correspond to an overlay mode in portrait and a side-by-side mode in landscape. @@ -772,25 +807,25 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (BOOL)accessibilityScroll:(UIAccessibilityScrollDirection)direction { BOOL canScroll = YES; - + // Scroll by one page CGFloat tableViewHeight = self.bubblesTableView.frame.size.height; - + CGPoint offset = self.bubblesTableView.contentOffset; switch (direction) { case UIAccessibilityScrollDirectionUp: offset.y -= tableViewHeight; break; - + case UIAccessibilityScrollDirectionDown: offset.y += tableViewHeight; break; - + default: break; } - + if (offset.y < 0 && ![self.roomDataSource.timeline canPaginate:MXTimelineDirectionBackwards]) { // Can't paginate more. Let's stick on the first item @@ -810,9 +845,9 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { // Disable VoiceOver while scrolling self.bubblesTableView.accessibilityElementsHidden = YES; - + [self setBubbleTableViewContentOffset:offset animated:NO]; - + NSEnumerator *cells; if (direction == UIAccessibilityScrollDirectionUp) { @@ -823,13 +858,13 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo cells = self.bubblesTableView.visibleCells.reverseObjectEnumerator; } UIView *cell = [self firstCellWithAccessibilityDataInCells:cells]; - + self.bubblesTableView.accessibilityElementsHidden = NO; - + // Force VoiceOver to focus on a visible item UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, cell); } - + // If we cannot scroll, let VoiceOver indicates the border return canScroll; } @@ -837,7 +872,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (UIView*)firstCellWithAccessibilityDataInCells:(NSEnumerator*)cells { UIView *view; - + for (UITableViewCell *cell in cells) { if (![cell isKindOfClass:[RoomEmptyBubbleCell class]]) @@ -846,7 +881,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo break; } } - + return view; } @@ -894,7 +929,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo if (self.roomDataSource) { [self listenToServerNotices]; - + self.eventsAcknowledgementEnabled = YES; // Set room title view @@ -1000,7 +1035,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo Class roomInputToolbarViewClass = RoomInputToolbarView.class; BOOL shouldDismissContextualMenu = NO; - + // Check the user has enough power to post message if (self.roomDataSource.roomState) { @@ -1022,7 +1057,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo shouldDismissContextualMenu = YES; } } - + // Do not show toolbar in case of preview if (self.isRoomPreview) { @@ -1047,7 +1082,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (CGFloat)inputToolbarHeight { CGFloat height = 0; - + if ([self.inputToolbarView isKindOfClass:RoomInputToolbarView.class]) { height = ((RoomInputToolbarView*)self.inputToolbarView).mainToolbarHeightConstraint.constant; @@ -1056,7 +1091,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { height = ((DisabledRoomInputToolbarView*)self.inputToolbarView).mainToolbarMinHeightConstraint.constant; } - + return height; } @@ -1069,6 +1104,11 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo } [super setRoomActivitiesViewClass:roomActivitiesViewClass]; + + if (!self.isActivitiesViewExpanded) + { + self.roomActivitiesContainerHeightConstraint.constant = 0; + } } - (BOOL)isIRCStyleCommand:(NSString*)string @@ -1119,7 +1159,9 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)setKeyboardHeight:(CGFloat)keyboardHeight { [super setKeyboardHeight:keyboardHeight]; - + + self.inputToolbarView.maxHeight = round(([UIScreen mainScreen].bounds.size.height - keyboardHeight) * 0.7); + // Make the activity indicator follow the keyboard // At runtime, this creates a smooth animation CGPoint activityIndicatorCenter = self.activityIndicator.center; @@ -1176,9 +1218,9 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo // Let the datasource send it and manage the local echo [self.roomDataSource sendTextMessage:msgTxt success:nil failure:^(NSError *error) { - // Just log the error. The message will be displayed in red in the room history - NSLog(@"[MXKRoomViewController] sendTextMessage failed."); - }]; + // Just log the error. The message will be displayed in red in the room history + NSLog(@"[MXKRoomViewController] sendTextMessage failed."); + }]; } if (customizedRoomDataSource.selectedEventId) @@ -1189,19 +1231,30 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)setRoomTitleViewClass:(Class)roomTitleViewClass { - [super setRoomTitleViewClass:roomTitleViewClass]; + // Sanity check: accept only MXKRoomTitleView classes or sub-classes + NSParameterAssert([roomTitleViewClass isSubclassOfClass:MXKRoomTitleView.class]); + + MXKRoomTitleView *titleView = [roomTitleViewClass roomTitleView]; + [self setValue:titleView forKey:@"titleView"]; + titleView.delegate = self; + titleView.mxRoom = self.roomDataSource.room; + self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:titleView]; + + if ([titleView isKindOfClass:RoomTitleView.class]) + { + RoomTitleView *roomTitleView = (RoomTitleView*)self.titleView; + missedDiscussionsBadgeLabel = roomTitleView.missedDiscussionsBadgeLabel; + missedDiscussionsDotView = roomTitleView.dotView; + [roomTitleView updateLayoutForOrientation:[UIApplication sharedApplication].statusBarOrientation]; + } + + [self updateViewControllerAppearanceOnRoomDataSourceState]; [self updateTitleViewEncryptionDecoration]; } - (void)destroy { - rightBarButtonItems = nil; - for (UIBarButtonItem *barButtonItem in self.navigationItem.rightBarButtonItems) - { - barButtonItem.enabled = NO; - } - if (currentAlert) { [currentAlert dismissViewControllerAnimated:NO completion:nil]; @@ -1247,7 +1300,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [self removeTombstoneEventNotificationsListener]; [self removeMXSessionStateChangeNotificationsListener]; [self removeServerNoticesListener]; - + if (previewHeader) { // Here [destroy] is called before [viewWillDisappear:] @@ -1262,8 +1315,6 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo roomPreviewData = nil; - missedDiscussionsBarButtonCustomView = nil; - missedDiscussionsBadgeLabelBgView = nil; missedDiscussionsBadgeLabel = nil; [[NSNotificationCenter defaultCenter] removeObserver:self name:kMXEventDidChangeSentStateNotification object:nil]; @@ -1272,60 +1323,47 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [super destroy]; } -#pragma mark - +#pragma mark - Properties + +-(void)setActivitiesViewExpanded:(BOOL)activitiesViewExpanded +{ + if (_activitiesViewExpanded != activitiesViewExpanded) + { + _activitiesViewExpanded = activitiesViewExpanded; + + self.roomActivitiesContainerHeightConstraint.constant = activitiesViewExpanded ? 53 : 0; + [super roomInputToolbarView:self.inputToolbarView heightDidChanged:[self inputToolbarHeight] completion:nil]; + } +} - (void)setShowMissedDiscussionsBadge:(BOOL)showMissedDiscussionsBadge { - _showMissedDiscussionsBadge = showMissedDiscussionsBadge; + missedDiscussionsBadgeLabel.hidden = !showMissedDiscussionsBadge; + missedDiscussionsDotView.hidden = !showMissedDiscussionsBadge; +} + +- (void)setScrollToBottomHidden:(BOOL)scrollToBottomHidden +{ + if (_scrollToBottomHidden != scrollToBottomHidden) + { + _scrollToBottomHidden = scrollToBottomHidden; + } - if (_showMissedDiscussionsBadge && !missedDiscussionsBarButtonCustomView) + if (!_scrollToBottomHidden && [self.roomDataSource isKindOfClass:RoomDataSource.class]) { - // Prepare missed dicussion badge - missedDiscussionsBarButtonCustomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 21)]; - missedDiscussionsBarButtonCustomView.backgroundColor = [UIColor clearColor]; - missedDiscussionsBarButtonCustomView.clipsToBounds = NO; - - NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:missedDiscussionsBarButtonCustomView - attribute:NSLayoutAttributeHeight - relatedBy:NSLayoutRelationEqual - toItem:nil - attribute:NSLayoutAttributeNotAnAttribute - multiplier:1.0 - constant:21]; - - missedDiscussionsBadgeLabelBgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 21, 21)]; - [missedDiscussionsBadgeLabelBgView.layer setCornerRadius:10]; - - [missedDiscussionsBarButtonCustomView addSubview:missedDiscussionsBadgeLabelBgView]; - missedDiscussionsBarButtonCustomView.accessibilityIdentifier = @"RoomVCMissedDiscussionsBarButton"; - - missedDiscussionsBadgeLabel = [[UILabel alloc]initWithFrame:CGRectMake(2, 2, 17, 17)]; - missedDiscussionsBadgeLabel.translatesAutoresizingMaskIntoConstraints = NO; - [missedDiscussionsBadgeLabelBgView addSubview:missedDiscussionsBadgeLabel]; - - NSLayoutConstraint *centerXConstraint = [NSLayoutConstraint constraintWithItem:missedDiscussionsBadgeLabel - attribute:NSLayoutAttributeCenterX - relatedBy:NSLayoutRelationEqual - toItem:missedDiscussionsBadgeLabelBgView - attribute:NSLayoutAttributeCenterX - multiplier:1.0 - constant:0]; - NSLayoutConstraint *centerYConstraint = [NSLayoutConstraint constraintWithItem:missedDiscussionsBadgeLabel - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:missedDiscussionsBadgeLabelBgView - attribute:NSLayoutAttributeCenterY - multiplier:1.0 - constant:0]; - - [NSLayoutConstraint activateConstraints:@[heightConstraint, centerXConstraint, centerYConstraint]]; - } - else - { - missedDiscussionsBarButtonCustomView = nil; - missedDiscussionsBadgeLabelBgView = nil; - missedDiscussionsBadgeLabel = nil; + RoomDataSource *roomDataSource = (RoomDataSource *) self.roomDataSource; + if (roomDataSource.currentTypingUsers && !roomDataSource.currentTypingUsers.count) + { + [roomDataSource resetTypingNotification]; + NSInteger count = [self.bubblesTableView numberOfRowsInSection:0]; + [self.bubblesTableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:count - 1 inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; + } } + + [UIView animateWithDuration:.2 animations:^{ + self.scrollToBottomBadgeLabel.alpha = (scrollToBottomHidden || !self.scrollToBottomBadgeLabel.text) ? 0 : 1; + self.scrollToBottomButton.alpha = scrollToBottomHidden ? 0 : 1; + }]; } #pragma mark - Internals @@ -1360,20 +1398,27 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo return self.roomDataSource.room.summary.isEncrypted && self.mainSession.crypto != nil; } +- (BOOL)supportCallOption +{ + BOOL callOptionAllowed = (self.roomDataSource.room.isDirect && RiotSettings.shared.roomScreenAllowVoIPForDirectRoom) || (!self.roomDataSource.room.isDirect && RiotSettings.shared.roomScreenAllowVoIPForNonDirectRoom); + return callOptionAllowed && BuildSettings.allowVoIPUsage && self.roomDataSource.mxSession.callManager && self.roomDataSource.room.summary.membersCount.joined >= 2; +} + +- (BOOL)isCallActive +{ + MXCall *callInRoom = [self.roomDataSource.mxSession.callManager callInRoom:self.roomDataSource.roomId]; + + return (callInRoom && callInRoom.state != MXCallStateEnded) + || [[AppDelegate theDelegate].jitsiViewController.widget.roomId isEqualToString:self.roomDataSource.roomId]; +} + - (void)refreshRoomTitle { - if (rightBarButtonItems && !self.navigationItem.rightBarButtonItems) - { - // Restore by default the search bar button. - self.navigationItem.rightBarButtonItems = rightBarButtonItems; - } + NSMutableArray *rightBarButtonItems = nil; // Set the right room title view if (self.isRoomPreview) { - // Do not show the right buttons - self.navigationItem.rightBarButtonItems = nil; - [self showPreviewHeader:YES]; } else if (self.roomDataSource) @@ -1382,107 +1427,73 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo if (self.roomDataSource.isLive) { - // Enable the right buttons (Search and Integrations) - for (UIBarButtonItem *barButtonItem in self.navigationItem.rightBarButtonItems) + rightBarButtonItems = [NSMutableArray new]; + + UIEdgeInsets itemInsets = UIEdgeInsetsMake(0, -5, 0, 5); + if (self.supportCallOption) { - barButtonItem.enabled = YES; - } - - if (self.navigationItem.rightBarButtonItems.count == 2) - { - BOOL matrixAppsEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"matrixApps"]; - if (!matrixAppsEnabled) - { - // If the setting is disabled, do not show the icon - self.navigationItem.rightBarButtonItems = @[self.navigationItem.rightBarButtonItem]; - } - else if ([self widgetsCount:NO]) - { - // Show there are widgets by changing the "apps" icon color - // Show it in red only for room widgets, not user's widgets - // TODO: Design must be reviewed - UIImage *icon = self.navigationItem.rightBarButtonItems[1].image; - icon = [MXKTools paintImage:icon withColor:ThemeService.shared.theme.warningColor]; - icon = [icon imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; - - self.navigationItem.rightBarButtonItems[1].image = icon; - self.navigationItem.rightBarButtonItems[1].accessibilityLabel = NSLocalizedStringFromTable(@"room_accessibility_integrations", @"Vector", nil); - } - else - { - // Reset original icon - self.navigationItem.rightBarButtonItems[1].image = [UIImage imageNamed:@"integrations_icon"]; - self.navigationItem.rightBarButtonItems[1].accessibilityLabel = NSLocalizedStringFromTable(@"room_accessibility_integrations", @"Vector", nil); - } + UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"voice_call_hangon_icon"] style:UIBarButtonItemStylePlain target:self action:@selector(onVoiceCallPressed:)]; + item.accessibilityLabel = NSLocalizedStringFromTable(@"room_accessibility_call", @"Vector", nil); + item.imageInsets = UIEdgeInsetsMake(0, -5, 0, 5); + [rightBarButtonItems addObject:item]; - self.navigationItem.rightBarButtonItems.firstObject.accessibilityLabel = NSLocalizedStringFromTable(@"room_accessibility_search", @"Vector", nil); + item = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"video_call"] style:UIBarButtonItemStylePlain target:self action:@selector(onVideoCallPressed:)]; + item.imageInsets = UIEdgeInsetsMake(0, 10, 0, -10); + item.accessibilityLabel = NSLocalizedStringFromTable(@"room_accessibility_video_call", @"Vector", nil); + [rightBarButtonItems addObject:item]; + itemInsets = UIEdgeInsetsMake(0, 20, 0, -20); } - + + if ([self widgetsCount:NO]) + { + UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"integrations_icon"] style:UIBarButtonItemStylePlain target:self action:@selector(onIntegrationsPressed:)]; + item.imageInsets = itemInsets; + item.accessibilityLabel = NSLocalizedStringFromTable(@"room_accessibility_integrations", @"Vector", nil); + [rightBarButtonItems addObject:item]; + } + // Do not change title view class here if the expanded header is visible. [self setRoomTitleViewClass:RoomTitleView.class]; ((RoomTitleView*)self.titleView).tapGestureDelegate = self; } - else + + MXKImageView *userPictureView = ((RoomTitleView*)self.titleView).pictureView; + + // Set user picture in input toolbar + if (userPictureView) { - // Remove the search button temporarily - rightBarButtonItems = self.navigationItem.rightBarButtonItems; - self.navigationItem.rightBarButtonItems = nil; - - [self setRoomTitleViewClass:SimpleRoomTitleView.class]; - self.titleView.editable = NO; + [self.roomDataSource.room.summary setRoomAvatarImageIn:userPictureView]; } + + [self refreshMissedDiscussionsCount:YES]; } - else - { - self.navigationItem.rightBarButtonItem.enabled = NO; - } + + self.navigationItem.rightBarButtonItems = rightBarButtonItems; } - (void)refreshRoomInputToolbar { MXKImageView *userPictureView; - + // Check whether the input toolbar is ready before updating it. if (self.inputToolbarView && [self.inputToolbarView isKindOfClass:RoomInputToolbarView.class]) { RoomInputToolbarView *roomInputToolbarView = (RoomInputToolbarView*)self.inputToolbarView; - // Check whether the call option is supported - roomInputToolbarView.supportCallOption = BuildSettings.allowVoIPUsage && self.roomDataSource.mxSession.callManager && self.roomDataSource.room.summary.membersCount.joined >= 2; - - // Get user picture view in input toolbar - userPictureView = roomInputToolbarView.pictureView; - - // Show the hangup button if there is an active call or an active jitsi - // conference call in the current room - MXCall *callInRoom = [self.roomDataSource.mxSession.callManager callInRoom:self.roomDataSource.roomId]; - if ((callInRoom && callInRoom.state != MXCallStateEnded) - || [[AppDelegate theDelegate].jitsiViewController.widget.roomId isEqualToString:self.roomDataSource.roomId]) - { - roomInputToolbarView.activeCall = YES; - } - else - { - roomInputToolbarView.activeCall = NO; - - // Hide the call button if there is an active call in another room - roomInputToolbarView.supportCallOption &= ([[AppDelegate theDelegate] callStatusBarWindow] == nil); - } - // Update encryption decoration if needed [self updateEncryptionDecorationForRoomInputToolbar:roomInputToolbarView]; } else if (self.inputToolbarView && [self.inputToolbarView isKindOfClass:DisabledRoomInputToolbarView.class]) { DisabledRoomInputToolbarView *roomInputToolbarView = (DisabledRoomInputToolbarView*)self.inputToolbarView; - + // Get user picture view in input toolbar userPictureView = roomInputToolbarView.pictureView; - + // For the moment, there is only one reason to use `DisabledRoomInputToolbarView` [roomInputToolbarView setDisabledReason:NSLocalizedStringFromTable(@"room_do_not_have_permission_to_post", @"Vector", nil)]; } - + // Set user picture in input toolbar if (userPictureView) { @@ -1502,11 +1513,28 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo } } -- (void)setInputToolBarSendMode:(RoomInputToolbarViewSendMode)sendMode +- (void)setInputToolBarSendMode:(RoomInputToolbarViewSendMode)sendMode forEventWithId:(NSString *)eventId { if (self.inputToolbarView && [self.inputToolbarView isKindOfClass:[RoomInputToolbarView class]]) { RoomInputToolbarView *roomInputToolbarView = (RoomInputToolbarView*)self.inputToolbarView; + if (eventId) + { + MXEvent *event = [self.roomDataSource eventWithEventId:eventId]; + MXRoomMember * roomMember = [self.roomDataSource.roomState.members memberWithUserId:event.sender]; + if (roomMember.displayname.length) + { + roomInputToolbarView.eventSenderDisplayName = roomMember.displayname; + } + else + { + roomInputToolbarView.eventSenderDisplayName = event.sender; + } + } + else + { + roomInputToolbarView.eventSenderDisplayName = nil; + } roomInputToolbarView.sendMode = sendMode; } } @@ -1519,7 +1547,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo RoomInputToolbarView *roomInputToolbarView = (RoomInputToolbarView*)self.inputToolbarView; sendMode = roomInputToolbarView.sendMode; } - + return sendMode; } @@ -1581,7 +1609,6 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)updateEncryptionDecorationForRoomInputToolbar:(RoomInputToolbarView*)roomInputToolbarView { roomInputToolbarView.isEncryptionEnabled = self.isEncryptionEnabled; - roomInputToolbarView.encryptedRoomIcon.image = self.roomEncryptionBadgeImage; } - (void)handleLongPressFromCell:(id)cell withTappedEvent:(MXEvent*)event @@ -1612,7 +1639,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo CameraPresenter *cameraPresenter = [CameraPresenter new]; cameraPresenter.delegate = self; [cameraPresenter presentCameraFrom:self with:@[MXKUTI.image, MXKUTI.movie] animated:YES]; - + self.cameraPresenter = cameraPresenter; } @@ -1634,7 +1661,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { sourceView = self.inputToolbarView; } - + [mediaPickerPresenter presentFrom:self sourceView:sourceView sourceRect:sourceView.bounds animated:YES]; self.mediaPickerPresenter = mediaPickerPresenter; @@ -1694,7 +1721,123 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo self.roomInfoCoordinatorBridgePresenter = [[RoomInfoCoordinatorBridgePresenter alloc] initWithParameters:parameters]; self.roomInfoCoordinatorBridgePresenter.delegate = self; - [self.roomInfoCoordinatorBridgePresenter presentFrom:self animated:YES]; + [self.roomInfoCoordinatorBridgePresenter pushFrom:self.navigationController animated:YES]; +} + +- (void)setupActions { + if (![self.inputToolbarView isKindOfClass:RoomInputToolbarView.class]) { + return; + } + + RoomInputToolbarView *roomInputView = ((RoomInputToolbarView *) self.inputToolbarView); + MXWeakify(self); + roomInputView.actionsBar.actionItems = @[ + [[RoomActionItem alloc] initWithImage:[UIImage imageNamed:@"action_camera"] andAction:^{ + MXStrongifyAndReturnIfNil(self); + if ([self.inputToolbarView isKindOfClass:RoomInputToolbarView.class]) { + ((RoomInputToolbarView *) self.inputToolbarView).actionMenuOpened = NO; + } + [self showCameraControllerAnimated:YES]; + }], + [[RoomActionItem alloc] initWithImage:[UIImage imageNamed:@"action_media_library"] andAction:^{ + MXStrongifyAndReturnIfNil(self); + if ([self.inputToolbarView isKindOfClass:RoomInputToolbarView.class]) { + ((RoomInputToolbarView *) self.inputToolbarView).actionMenuOpened = NO; + } + [self showMediaPickerAnimated:YES]; + }], + [[RoomActionItem alloc] initWithImage:[UIImage imageNamed:@"action_sticker"] andAction:^{ + MXStrongifyAndReturnIfNil(self); + if ([self.inputToolbarView isKindOfClass:RoomInputToolbarView.class]) { + ((RoomInputToolbarView *) self.inputToolbarView).actionMenuOpened = NO; + } + [self roomInputToolbarViewPresentStickerPicker]; + }], + [[RoomActionItem alloc] initWithImage:[UIImage imageNamed:@"action_file"] andAction:^{ + MXStrongifyAndReturnIfNil(self); + if ([self.inputToolbarView isKindOfClass:RoomInputToolbarView.class]) { + ((RoomInputToolbarView *) self.inputToolbarView).actionMenuOpened = NO; + } + [self roomInputToolbarViewDidTapFileUpload]; + }], + ]; +} + +- (void)roomInputToolbarViewPresentStickerPicker +{ + // Search for the sticker picker widget in the user account + Widget *widget = [[WidgetManager sharedManager] userWidgets:self.roomDataSource.mxSession ofTypes:@[kWidgetTypeStickerPicker]].firstObject; + + if (widget) + { + // Display the widget + [widget widgetUrl:^(NSString * _Nonnull widgetUrl) { + + StickerPickerViewController *stickerPickerVC = [[StickerPickerViewController alloc] initWithUrl:widgetUrl forWidget:widget]; + + stickerPickerVC.roomDataSource = self.roomDataSource; + + [self.navigationController pushViewController:stickerPickerVC animated:YES]; + } failure:^(NSError * _Nonnull error) { + + NSLog(@"[RoomVC] Cannot display widget %@", widget); + [[AppDelegate theDelegate] showErrorAsAlert:error]; + }]; + } + else + { + // The Sticker picker widget is not installed yet. Propose the user to install it + MXWeakify(self); + + [currentAlert dismissViewControllerAnimated:NO completion:nil]; + + NSString *alertMessage = [NSString stringWithFormat:@"%@\n%@", + NSLocalizedStringFromTable(@"widget_sticker_picker_no_stickerpacks_alert", @"Vector", nil), + NSLocalizedStringFromTable(@"widget_sticker_picker_no_stickerpacks_alert_add_now", @"Vector", nil) + ]; + + currentAlert = [UIAlertController alertControllerWithTitle:nil message:alertMessage preferredStyle:UIAlertControllerStyleAlert]; + + [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"no"] + style:UIAlertActionStyleCancel + handler:^(UIAlertAction * action) + { + MXStrongifyAndReturnIfNil(self); + self->currentAlert = nil; + + }]]; + + [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"yes"] + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) + { + MXStrongifyAndReturnIfNil(self); + self->currentAlert = nil; + + // Show the sticker picker settings screen + IntegrationManagerViewController *modularVC = [[IntegrationManagerViewController alloc] + initForMXSession:self.roomDataSource.mxSession + inRoom:self.roomDataSource.roomId + screen:[IntegrationManagerViewController screenForWidget:kWidgetTypeStickerPicker] + widgetId:nil]; + + [self presentViewController:modularVC animated:NO completion:nil]; + }]]; + + [currentAlert mxk_setAccessibilityIdentifier:@"RoomVCStickerPickerAlert"]; + [self presentViewController:currentAlert animated:YES completion:nil]; + } +} + +- (void)roomInputToolbarViewDidTapFileUpload +{ + MXKDocumentPickerPresenter *documentPickerPresenter = [MXKDocumentPickerPresenter new]; + documentPickerPresenter.delegate = self; + + NSArray *allowedUTIs = @[MXKUTI.data]; + [documentPickerPresenter presentDocumentPickerWith:allowedUTIs from:self animated:YES completion:nil]; + + self.documentPickerPresenter = documentPickerPresenter; } #pragma mark - Dialpad @@ -1806,7 +1949,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo } self.previewHeaderContainer.hidden = NO; - + // Finalize preview header display according to the screen orientation [self refreshPreviewHeader:UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])]; } @@ -1829,8 +1972,6 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo // Remove details icon RoomTitleView *roomTitleView = (RoomTitleView*)self.titleView; - [roomTitleView.roomDetailsIconImageView removeFromSuperview]; - roomTitleView.roomDetailsIconImageView = nil; // Remove the shadow image used to hide the bottom border of the navigation bar when the preview header is displayed [mainNavigationController.navigationBar setShadowImage:nil]; @@ -1838,19 +1979,19 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseIn animations:^{ - - self.bubblesTableViewTopConstraint.constant = 0; - self.jumpToLastUnreadBannerContainerTopConstraint.constant = self.bubblesTableView.mxk_adjustedContentInset.top; - - // Force to render the view - [self forceLayoutRefresh]; - - } + + self.bubblesTableViewTopConstraint.constant = 0; + self.jumpToLastUnreadBannerContainerTopConstraint.constant = self.bubblesTableView.mxk_adjustedContentInset.top; + + // Force to render the view + [self forceLayoutRefresh]; + + } completion:^(BOOL finished){ - }]; + }]; } } - + // Consider the main navigation controller if the current view controller is embedded inside a split view controller. UINavigationController *mainNavigationController = self.navigationController; if (self.splitViewController.isCollapsed && self.splitViewController.viewControllers.count) @@ -1878,8 +2019,6 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo // Remove details icon RoomTitleView *roomTitleView = (RoomTitleView*)self.titleView; - [roomTitleView.roomDetailsIconImageView removeFromSuperview]; - roomTitleView.roomDetailsIconImageView = nil; // Set preview data to provide the room name roomTitleView.roomPreviewData = roomPreviewData; @@ -1888,17 +2027,17 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { previewHeader.mainHeaderContainer.hidden = NO; previewHeader.mainHeaderBackgroundHeightConstraint.constant = previewHeader.mainHeaderContainer.frame.size.height; - + if ([previewHeader isKindOfClass:PreviewRoomTitleView.class]) { // In case of preview, update the header height so that we can // display as much as possible the room topic in this header. // Note: the header height is handled by the previewHeader.mainHeaderBackgroundHeightConstraint. PreviewRoomTitleView *previewRoomTitleView = (PreviewRoomTitleView *)previewHeader; - + // Compute the height required to display all the room topic CGSize sizeThatFitsTextView = [previewRoomTitleView.roomTopic sizeThatFits:CGSizeMake(previewRoomTitleView.roomTopic.frame.size.width, MAXFLOAT)]; - + // Increase the preview header height according to the room topic height // but limit it in order to let room for room messages at the screen bottom. // This free space depends on the device. @@ -1907,13 +2046,13 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo // apply a factor to give more priority to the display of more messages. CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height; CGFloat maxRoomTopicHeight = 50 + (screenHeight - 568) / 3; - + CGFloat additionalHeight = MIN(maxRoomTopicHeight, sizeThatFitsTextView.height) - - previewRoomTitleView.roomTopic.frame.size.height; - + - previewRoomTitleView.roomTopic.frame.size.height; + previewHeader.mainHeaderBackgroundHeightConstraint.constant += additionalHeight; } - + [self setRoomTitleViewClass:RoomAvatarTitleView.class]; // Note the avatar title view does not define tap gesture. @@ -1959,18 +2098,18 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseIn animations:^{ - - self.bubblesTableViewTopConstraint.constant = self.previewHeaderContainerHeightConstraint.constant - self.bubblesTableView.mxk_adjustedContentInset.top; - self.jumpToLastUnreadBannerContainerTopConstraint.constant = self.previewHeaderContainerHeightConstraint.constant; - - previewHeader.roomAvatar.alpha = 1; - - // Force to render the view - [self forceLayoutRefresh]; - - } + + self.bubblesTableViewTopConstraint.constant = self.previewHeaderContainerHeightConstraint.constant - self.bubblesTableView.mxk_adjustedContentInset.top; + self.jumpToLastUnreadBannerContainerTopConstraint.constant = self.previewHeaderContainerHeightConstraint.constant; + + previewHeader.roomAvatar.alpha = 1; + + // Force to render the view + [self forceLayoutRefresh]; + + } completion:^(BOOL finished){ - }]; + }]; } } @@ -2291,7 +2430,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo RoomDataSource *roomDataSource = (RoomDataSource*)self.roomDataSource; [roomDataSource acceptVerificationRequestForEventId:eventId success:^{ - + } failure:^(NSError *error) { [[AppDelegate theDelegate] showErrorAsAlert:error]; }]; @@ -2391,7 +2530,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo MXEvent *callInviteEvent = userInfo[kMXKRoomBubbleCellEventKey]; MXCallInviteEventContent *eventContent = [MXCallInviteEventContent modelFromJSON:callInviteEvent.content]; - [self roomInputToolbarView:self.inputToolbarView placeCallWithVideo2:eventContent.isVideoCall]; + [self placeCallWithVideo2:eventContent.isVideoCall]; } else if ([actionIdentifier isEqualToString:RoomCreationIntroCell.tapOnAvatarView]) { @@ -2439,33 +2578,33 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"retry", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - - [self cancelEventSelection]; - - // Let the datasource resend. It will manage local echo, etc. - [self.roomDataSource resendEventWithEventId:selectedEvent.eventId success:nil failure:nil]; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + + [self cancelEventSelection]; + + // Let the datasource resend. It will manage local echo, etc. + [self.roomDataSource resendEventWithEventId:selectedEvent.eventId success:nil failure:nil]; + } + + }]]; [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_delete", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - - [self cancelEventSelection]; - - [self.roomDataSource removeEventWithEventId:selectedEvent.eventId]; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + + [self cancelEventSelection]; + + [self.roomDataSource removeEventWithEventId:selectedEvent.eventId]; + } + + }]]; } // Add actions for text message @@ -2483,7 +2622,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo selectedComponent = nil; } - + // Check status of the selected event if (selectedEvent.sentState == MXEventSentStatePreparing || selectedEvent.sentState == MXEventSentStateEncrypting || @@ -2493,41 +2632,41 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - if (weakSelf) - { - typeof(self) self = weakSelf; - - self->currentAlert = nil; - - // Cancel and remove the outgoing message - [self.roomDataSource.room cancelSendingOperation:selectedEvent.eventId]; - [self.roomDataSource removeEventWithEventId:selectedEvent.eventId]; - - [self cancelEventSelection]; - } - - }]]; + if (weakSelf) + { + typeof(self) self = weakSelf; + + self->currentAlert = nil; + + // Cancel and remove the outgoing message + [self.roomDataSource.room cancelSendingOperation:selectedEvent.eventId]; + [self.roomDataSource removeEventWithEventId:selectedEvent.eventId]; + + [self cancelEventSelection]; + } + + }]]; } - + [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_quote", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - - [self cancelEventSelection]; - - // Quote the message a la Markdown into the input toolbar composer - self.inputToolbarView.textMessage = [NSString stringWithFormat:@"%@\n>%@\n\n", self.inputToolbarView.textMessage, selectedComponent.textMessage]; - - // And display the keyboard - [self.inputToolbarView becomeFirstResponder]; - } - - }]]; - + + if (weakSelf) + { + typeof(self) self = weakSelf; + + [self cancelEventSelection]; + + // Quote the message a la Markdown into the input toolbar composer + self.inputToolbarView.textMessage = [NSString stringWithFormat:@"%@\n>%@\n\n", self.inputToolbarView.textMessage, selectedComponent.textMessage]; + + // And display the keyboard + [self.inputToolbarView becomeFirstResponder]; + } + + }]]; + if (BuildSettings.messageDetailsAllowShare) { [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_share", @"Vector", nil) @@ -2597,7 +2736,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo }]]; } } - + // Check status of the selected event if (selectedEvent.sentState == MXEventSentStatePreparing || selectedEvent.sentState == MXEventSentStateEncrypting || @@ -2611,37 +2750,37 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_cancel_send", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - // Get again the loader - MXMediaLoader *loader = [MXMediaManager existingUploaderWithId:uploadId]; - if (loader) - { - [loader cancel]; - } - // Hide the progress animation - roomBubbleTableViewCell.progressView.hidden = YES; - - if (weakSelf) - { - typeof(self) self = weakSelf; - - self->currentAlert = nil; - - // Remove the outgoing message and its related cached file. - [[NSFileManager defaultManager] removeItemAtPath:roomBubbleTableViewCell.bubbleData.attachment.cacheFilePath error:nil]; - [[NSFileManager defaultManager] removeItemAtPath:roomBubbleTableViewCell.bubbleData.attachment.thumbnailCachePath error:nil]; - - // Cancel and remove the outgoing message - [self.roomDataSource.room cancelSendingOperation:selectedEvent.eventId]; - [self.roomDataSource removeEventWithEventId:selectedEvent.eventId]; - - [self cancelEventSelection]; - } - - }]]; + + // Get again the loader + MXMediaLoader *loader = [MXMediaManager existingUploaderWithId:uploadId]; + if (loader) + { + [loader cancel]; + } + // Hide the progress animation + roomBubbleTableViewCell.progressView.hidden = YES; + + if (weakSelf) + { + typeof(self) self = weakSelf; + + self->currentAlert = nil; + + // Remove the outgoing message and its related cached file. + [[NSFileManager defaultManager] removeItemAtPath:roomBubbleTableViewCell.bubbleData.attachment.cacheFilePath error:nil]; + [[NSFileManager defaultManager] removeItemAtPath:roomBubbleTableViewCell.bubbleData.attachment.thumbnailCachePath error:nil]; + + // Cancel and remove the outgoing message + [self.roomDataSource.room cancelSendingOperation:selectedEvent.eventId]; + [self.roomDataSource removeEventWithEventId:selectedEvent.eventId]; + + [self cancelEventSelection]; + } + + }]]; } } - + if (attachment.type != MXKAttachmentTypeSticker) { if (BuildSettings.messageDetailsAllowShare) @@ -2698,24 +2837,24 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_cancel_download", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - - [self cancelEventSelection]; - - // Get again the loader - MXMediaLoader *loader = [MXMediaManager existingDownloaderWithIdentifier:downloadId]; - if (loader) - { - [loader cancel]; - } - // Hide the progress animation - roomBubbleTableViewCell.progressView.hidden = YES; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + + [self cancelEventSelection]; + + // Get again the loader + MXMediaLoader *loader = [MXMediaManager existingDownloaderWithIdentifier:downloadId]; + if (loader) + { + [loader cancel]; + } + // Hide the progress animation + roomBubbleTableViewCell.progressView.hidden = YES; + } + + }]]; } } @@ -2726,35 +2865,35 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_redact", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - - [self cancelEventSelection]; - - [self startActivityIndicator]; - - [self.roomDataSource.room redactEvent:selectedEvent.eventId reason:nil success:^{ - - __strong __typeof(weakSelf)self = weakSelf; - [self stopActivityIndicator]; - - } failure:^(NSError *error) { - - __strong __typeof(weakSelf)self = weakSelf; - [self stopActivityIndicator]; - - NSLog(@"[RoomVC] Redact event (%@) failed", selectedEvent.eventId); - //Alert user - [[AppDelegate theDelegate] showErrorAsAlert:error]; - - }]; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + + [self cancelEventSelection]; + + [self startActivityIndicator]; + + [self.roomDataSource.room redactEvent:selectedEvent.eventId reason:nil success:^{ + + __strong __typeof(weakSelf)self = weakSelf; + [self stopActivityIndicator]; + + } failure:^(NSError *error) { + + __strong __typeof(weakSelf)self = weakSelf; + [self stopActivityIndicator]; + + NSLog(@"[RoomVC] Redact event (%@) failed", selectedEvent.eventId); + //Alert user + [[AppDelegate theDelegate] showErrorAsAlert:error]; + + }]; + } + + }]]; } - + if (BuildSettings.messageDetailsAllowPermalink) { [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_permalink", @"Vector", nil) @@ -2789,12 +2928,12 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_reaction_history", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - [self cancelEventSelection]; - - // Show reaction history - [self showReactionHistoryForEventId:selectedEvent.eventId animated:YES]; - }]]; + + [self cancelEventSelection]; + + // Show reaction history + [self showReactionHistoryForEventId:selectedEvent.eventId animated:YES]; + }]]; } if (BuildSettings.messageDetailsAllowViewSource) @@ -2814,8 +2953,8 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo } }]]; - - + + // Add "View Decrypted Source" for e2ee event we can decrypt if (selectedEvent.isEncrypted && selectedEvent.clearEvent) { @@ -2946,37 +3085,37 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo }]]; } - + if (self.roomDataSource.room.summary.isEncrypted) { [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_view_encryption", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - [self cancelEventSelection]; - - // Display encryption details - [self showEncryptionInformation:selectedEvent]; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + [self cancelEventSelection]; + + // Display encryption details + [self showEncryptionInformation:selectedEvent]; + } + + }]]; } } [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"cancel", @"Vector", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - [self hideContextualMenuAnimated:YES]; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + [self hideContextualMenuAnimated:YES]; + } + + }]]; // Do not display empty action sheet if (currentAlert.actions.count > 1) @@ -3083,7 +3222,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { NSString *eventId = arguments[1]; MXEvent *event = [self.roomDataSource eventWithEventId:eventId]; - + if (event) { [self reRequestKeysAndShowExplanationAlert:event]; @@ -3160,7 +3299,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo shouldDoAction = NO; break; } - } + } } break; case UITextItemInteractionPresentActions: @@ -3200,7 +3339,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)selectEventWithId:(NSString*)eventId inputToolBarSendMode:(RoomInputToolbarViewSendMode)inputToolBarSendMode showTimestamp:(BOOL)showTimestamp { - [self setInputToolBarSendMode:inputToolBarSendMode]; + [self setInputToolBarSendMode:inputToolBarSendMode forEventWithId:eventId]; customizedRoomDataSource.showBubbleDateTimeOnSelection = showTimestamp; customizedRoomDataSource.selectedEventId = eventId; @@ -3211,7 +3350,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)cancelEventSelection { - [self setInputToolBarSendMode:RoomInputToolbarViewSendModeSend]; + [self setInputToolBarSendMode:RoomInputToolbarViewSendModeSend forEventWithId:nil]; if (currentAlert) { @@ -3325,100 +3464,14 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } -#pragma mark - RoomInputToolbarViewDelegate +#pragma mark - VoIP -- (void)roomInputToolbarViewPresentStickerPicker:(MXKRoomInputToolbarView*)toolbarView -{ - // Search for the sticker picker widget in the user account - Widget *widget = [[WidgetManager sharedManager] userWidgets:self.roomDataSource.mxSession ofTypes:@[kWidgetTypeStickerPicker]].firstObject; - - if (widget) - { - // Display the widget - [widget widgetUrl:^(NSString * _Nonnull widgetUrl) { - - StickerPickerViewController *stickerPickerVC = [[StickerPickerViewController alloc] initWithUrl:widgetUrl forWidget:widget]; - - stickerPickerVC.roomDataSource = self.roomDataSource; - - [self.navigationController pushViewController:stickerPickerVC animated:YES]; - } failure:^(NSError * _Nonnull error) { - - NSLog(@"[RoomVC] Cannot display widget %@", widget); - [[AppDelegate theDelegate] showErrorAsAlert:error]; - }]; - } - else - { - // The Sticker picker widget is not installed yet. Propose the user to install it - __weak typeof(self) weakSelf = self; - - [currentAlert dismissViewControllerAnimated:NO completion:nil]; - - NSString *alertMessage = [NSString stringWithFormat:@"%@\n%@", - NSLocalizedStringFromTable(@"widget_sticker_picker_no_stickerpacks_alert", @"Vector", nil), - NSLocalizedStringFromTable(@"widget_sticker_picker_no_stickerpacks_alert_add_now", @"Vector", nil) - ]; - - currentAlert = [UIAlertController alertControllerWithTitle:nil message:alertMessage preferredStyle:UIAlertControllerStyleAlert]; - - [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"no"] - style:UIAlertActionStyleCancel - handler:^(UIAlertAction * action) - { - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - } - - }]]; - - [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"yes"] - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) - { - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - - // Show the sticker picker settings screen - IntegrationManagerViewController *modularVC = [[IntegrationManagerViewController alloc] - initForMXSession:self.roomDataSource.mxSession - inRoom:self.roomDataSource.roomId - screen:[IntegrationManagerViewController screenForWidget:kWidgetTypeStickerPicker] - widgetId:nil]; - - [self presentViewController:modularVC animated:NO completion:nil]; - } - }]]; - - [currentAlert mxk_setAccessibilityIdentifier:@"RoomVCStickerPickerAlert"]; - [self presentViewController:currentAlert animated:YES completion:nil]; - } -} - -#pragma mark - MXKRoomInputToolbarViewDelegate - -- (void)roomInputToolbarView:(MXKRoomInputToolbarView*)toolbarView isTyping:(BOOL)typing -{ - [super roomInputToolbarView:toolbarView isTyping:typing]; - - // Cancel potential selected event (to leave edition mode) - NSString *selectedEventId = customizedRoomDataSource.selectedEventId; - if (typing && selectedEventId && ![self.roomDataSource canReplyToEventWithId:selectedEventId]) - { - [self cancelEventSelection]; - } -} - -- (void)roomInputToolbarView:(MXKRoomInputToolbarView*)toolbarView placeCallWithVideo:(BOOL)video +- (void)placeCallWithVideo:(BOOL)video { __weak __typeof(self) weakSelf = self; - + NSString *appDisplayName = [[NSBundle mainBundle] infoDictionary][@"CFBundleDisplayName"]; - + // Check app permissions first [MXKTools checkAccessForCall:video manualChangeMessageForAudio:[NSString stringWithFormat:[NSBundle mxk_localizedStringForKey:@"microphone_access_not_granted_for_call"], appDisplayName] @@ -3433,15 +3486,15 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { if (video) { - [self roomInputToolbarView:toolbarView placeCallWithVideo2:video]; + [self placeCallWithVideo2:video]; } else if (self.mainSession.callManager.supportsPSTN) { - [self showVoiceCallActionSheetWith:toolbarView]; + [self showVoiceCallActionSheet]; } else { - [self roomInputToolbarView:toolbarView placeCallWithVideo2:NO]; + [self placeCallWithVideo2:NO]; } } else @@ -3452,149 +3505,145 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo }]; } -- (void)showVoiceCallActionSheetWith:(MXKRoomInputToolbarView *)toolbarView +- (void)showVoiceCallActionSheet { // Ask the user the kind of the call: voice or dialpad? currentAlert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; - + __weak typeof(self) weakSelf = self; [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_place_voice_call", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - - [self roomInputToolbarView:toolbarView placeCallWithVideo2:NO]; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + self->currentAlert = nil; + + [self placeCallWithVideo2:NO]; + } + + }]]; [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_open_dialpad", @"Vector", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - - [self openDialpad]; - } - - }]]; + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) { + + if (weakSelf) + { + typeof(self) self = weakSelf; + self->currentAlert = nil; + + [self openDialpad]; + } + + }]]; [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] - style:UIAlertActionStyleCancel - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - } - - }]]; + style:UIAlertActionStyleCancel + handler:^(UIAlertAction * action) { + + if (weakSelf) + { + typeof(self) self = weakSelf; + self->currentAlert = nil; + } + + }]]; - if ([toolbarView isKindOfClass:[RoomInputToolbarView class]]) - { - RoomInputToolbarView *toolbar = (RoomInputToolbarView *)toolbarView; - [currentAlert popoverPresentationController].sourceView = toolbar.voiceCallButton; - [currentAlert popoverPresentationController].sourceRect = toolbar.voiceCallButton.bounds; - } + [currentAlert popoverPresentationController].barButtonItem = self.navigationItem.rightBarButtonItems.firstObject; + [currentAlert popoverPresentationController].permittedArrowDirections = UIPopoverArrowDirectionUp; [self presentViewController:currentAlert animated:YES completion:nil]; } -- (void)roomInputToolbarView:(MXKRoomInputToolbarView*)toolbarView placeCallWithVideo2:(BOOL)video +- (void)placeCallWithVideo2:(BOOL)video { - __weak __typeof(self) weakSelf = self; - + __weak __typeof(self) weakSelf = self; + // If there is already a jitsi widget, join it Widget *jitsiWidget = [customizedRoomDataSource jitsiWidget]; if (jitsiWidget) { [[AppDelegate theDelegate] displayJitsiViewControllerWithWidget:jitsiWidget andVideo:video]; } - + // If enabled, create the conf using jitsi widget and open it directly else if (RiotSettings.shared.createConferenceCallsWithJitsi && self.roomDataSource.room.summary.membersCount.joined > 2) { [self startActivityIndicator]; - + [[WidgetManager sharedManager] createJitsiWidgetInRoom:self.roomDataSource.room withVideo:video success:^(Widget *jitsiWidget) { - if (weakSelf) - { - typeof(self) self = weakSelf; - [self stopActivityIndicator]; - - [[AppDelegate theDelegate] displayJitsiViewControllerWithWidget:jitsiWidget andVideo:video]; - } - } + if (weakSelf) + { + typeof(self) self = weakSelf; + [self stopActivityIndicator]; + + [[AppDelegate theDelegate] displayJitsiViewControllerWithWidget:jitsiWidget andVideo:video]; + } + } failure:^(NSError *error) { - if (weakSelf) - { - typeof(self) self = weakSelf; - [self stopActivityIndicator]; - - [self showJitsiErrorAsAlert:error]; - } - }]; + if (weakSelf) + { + typeof(self) self = weakSelf; + [self stopActivityIndicator]; + + [self showJitsiErrorAsAlert:error]; + } + }]; } // Classic conference call is not supported in encrypted rooms else if (self.roomDataSource.room.summary.isEncrypted && self.roomDataSource.room.summary.membersCount.joined > 2) { [currentAlert dismissViewControllerAnimated:NO completion:nil]; - + currentAlert = [UIAlertController alertControllerWithTitle:[NSBundle mxk_localizedStringForKey:@"room_no_conference_call_in_encrypted_rooms"] message:nil preferredStyle:UIAlertControllerStyleAlert]; - + [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - } - - }]]; - + if (weakSelf) + { + typeof(self) self = weakSelf; + self->currentAlert = nil; + } + + }]]; + [currentAlert mxk_setAccessibilityIdentifier:@"RoomVCCallAlert"]; [self presentViewController:currentAlert animated:YES completion:nil]; } - + // In case of conference call, check that the user has enough power level else if (self.roomDataSource.room.summary.membersCount.joined > 2 && ![MXCallManager canPlaceConferenceCallInRoom:self.roomDataSource.room roomState:self.roomDataSource.roomState]) { [currentAlert dismissViewControllerAnimated:NO completion:nil]; - + currentAlert = [UIAlertController alertControllerWithTitle:[NSBundle mxk_localizedStringForKey:@"room_no_power_to_create_conference_call"] message:nil preferredStyle:UIAlertControllerStyleAlert]; - + [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - } - }]]; - + if (weakSelf) + { + typeof(self) self = weakSelf; + self->currentAlert = nil; + } + }]]; + [currentAlert mxk_setAccessibilityIdentifier:@"RoomVCCallAlert"]; [self presentViewController:currentAlert animated:YES completion:nil]; } - + // Classic 1:1 or group call can be done else { @@ -3602,7 +3651,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo } } -- (void)roomInputToolbarViewHangupCall:(MXKRoomInputToolbarView *)toolbarView +- (void)hangupCall { MXCall *callInRoom = [self.roomDataSource.mxSession.callManager callInRoom:self.roomDataSource.roomId]; if (callInRoom) @@ -3613,11 +3662,25 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { [[AppDelegate theDelegate].jitsiViewController hangup]; } - + [self refreshActivitiesViewDisplay]; [self refreshRoomInputToolbar]; } +#pragma mark - MXKRoomInputToolbarViewDelegate + +- (void)roomInputToolbarView:(MXKRoomInputToolbarView*)toolbarView isTyping:(BOOL)typing +{ + [super roomInputToolbarView:toolbarView isTyping:typing]; + + // Cancel potential selected event (to leave edition mode) + NSString *selectedEventId = customizedRoomDataSource.selectedEventId; + if (typing && selectedEventId && ![self.roomDataSource canReplyToEventWithId:selectedEventId]) + { + [self cancelEventSelection]; + } +} + - (void)roomInputToolbarView:(MXKRoomInputToolbarView*)toolbarView heightDidChanged:(CGFloat)height completion:(void (^)(BOOL finished))completion { if (self.roomInputToolbarContainerHeightConstraint.constant != height) @@ -3640,32 +3703,16 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo if (!toolbarView.placeholder) { // Restore the placeholder if any - toolbarView.placeholder = savedInputToolbarPlaceholder.length ? savedInputToolbarPlaceholder : nil; + toolbarView.placeholder = self->savedInputToolbarPlaceholder.length ? self->savedInputToolbarPlaceholder : nil; } - savedInputToolbarPlaceholder = nil; + self->savedInputToolbarPlaceholder = nil; }]; } } -- (void)roomInputToolbarViewDidTapFileUpload:(MXKRoomInputToolbarView *)toolbarView +- (void)roomInputToolbarViewDidTapCancel:(MXKRoomInputToolbarView*)toolbarView { - MXKDocumentPickerPresenter *documentPickerPresenter = [MXKDocumentPickerPresenter new]; - documentPickerPresenter.delegate = self; - - NSArray *allowedUTIs = @[MXKUTI.data]; - [documentPickerPresenter presentDocumentPickerWith:allowedUTIs from:self animated:YES completion:nil]; - - self.documentPickerPresenter = documentPickerPresenter; -} - -- (void)roomInputToolbarViewDidTapCamera:(MXKRoomInputToolbarView*)toolbarView -{ - [self showCameraControllerAnimated:YES]; -} - -- (void)roomInputToolbarViewDidTapMediaLibrary:(MXKRoomInputToolbarView*)toolbarView -{ - [self showMediaPickerAnimated:YES]; + [self cancelEventSelection]; } #pragma mark - RoomParticipantsViewControllerDelegate @@ -3689,50 +3736,54 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo #pragma mark - Action +- (IBAction)onVoiceCallPressed:(id)sender +{ + if (self.isCallActive) + { + [self hangupCall]; + } + else + { + [self placeCallWithVideo:NO]; + } +} + +- (IBAction)onVideoCallPressed:(id)sender +{ + [self placeCallWithVideo:YES]; +} + +- (IBAction)onIntegrationsPressed:(id)sender +{ + WidgetPickerViewController *widgetPicker = [[WidgetPickerViewController alloc] initForMXSession:self.roomDataSource.mxSession + inRoom:self.roomDataSource.roomId]; + + [widgetPicker showInViewController:self]; +} + +- (void)scrollToBottomAction:(id)sender +{ + [self goBackToLive]; +} + - (IBAction)onButtonPressed:(id)sender { - // Search button - if (sender == self.navigationItem.rightBarButtonItem) - { - [self performSegueWithIdentifier:@"showRoomSearch" sender:self]; - } - // Matrix Apps button - else if (self.navigationItem.rightBarButtonItems.count == 2 && sender == self.navigationItem.rightBarButtonItems[1]) - { - if ([self widgetsCount:NO]) - { - WidgetPickerViewController *widgetPicker = [[WidgetPickerViewController alloc] initForMXSession:self.roomDataSource.mxSession - inRoom:self.roomDataSource.roomId]; - - [widgetPicker showInViewController:self]; - } - else - { - // No widgets -> Directly show the integration manager - IntegrationManagerViewController *modularVC = [[IntegrationManagerViewController alloc] initForMXSession:self.roomDataSource.mxSession - inRoom:self.roomDataSource.roomId - screen:kIntegrationManagerMainScreen - widgetId:nil]; - - [self presentViewController:modularVC animated:NO completion:nil]; - } - } - else if (sender == self.jumpToLastUnreadButton) + if (sender == self.jumpToLastUnreadButton) { // Dismiss potential keyboard. [self dismissKeyboard]; - + // Jump to the last unread event by using a temporary room data source initialized with the last unread event id. MXWeakify(self); [RoomDataSource loadRoomDataSourceWithRoomId:self.roomDataSource.roomId initialEventId:self.roomDataSource.room.accountData.readMarkerEventId andMatrixSession:self.mainSession onComplete:^(id roomDataSource) { MXStrongifyAndReturnIfNil(self); - + [roomDataSource finalizeInitialization]; - + // Center the bubbles table content on the bottom of the read marker event in order to display correctly the read marker view. self.centerBubblesTableViewContentOnTheInitialEventBottom = YES; [self displayRoom:roomDataSource]; - + // Give the data source ownership to the room view controller. self.hasRoomDataSourceOwnership = YES; }]; @@ -3928,12 +3979,12 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo MXWeakify(self); [RoomDataSource loadRoomDataSourceWithRoomId:self.roomDataSource.roomId initialEventId:eventId andMatrixSession:self.mainSession onComplete:^(id roomDataSource) { MXStrongifyAndReturnIfNil(self); - + [roomDataSource finalizeInitialization]; ((RoomDataSource*)roomDataSource).markTimelineInitialEvent = YES; - + [self displayRoom:roomDataSource]; - + self.hasRoomDataSourceOwnership = YES; }]; } @@ -4007,7 +4058,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo MXWeakify(self); [self.roomDataSource.room liveTimeline:^(MXEventTimeline *liveTimeline) { MXStrongifyAndReturnIfNil(self); - + [liveTimeline removeListener:self->typingNotifListener]; self->typingNotifListener = nil; }]; @@ -4025,7 +4076,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo MXWeakify(self); self->typingNotifListener = [self.roomDataSource.room listenToEventsOfTypes:@[kMXEventTypeStringTypingNotification] onEvent:^(MXEvent *event, MXTimelineDirection direction, MXRoomState *roomState) { MXStrongifyAndReturnIfNil(self); - + // Handle only live events if (direction == MXTimelineDirectionForwards) { @@ -4037,7 +4088,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { [typingUsers removeObjectAtIndex:index]; } - + // Ignore this notification if both arrays are empty if (self->currentTypingUsers.count || typingUsers.count) { @@ -4046,7 +4097,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo } } }]; - + // Retrieve the current typing users list NSMutableArray *typingUsers = [NSMutableArray arrayWithArray:self.roomDataSource.room.typingUsers]; // Remove typing info for the current user @@ -4062,52 +4113,53 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)refreshTypingNotification { - if ([self.activitiesView isKindOfClass:RoomActivitiesView.class]) - { - // Prepare here typing notification - NSString* text = nil; - NSUInteger count = currentTypingUsers.count; - - // get the room member names - NSMutableArray *names = [[NSMutableArray alloc] init]; - - // keeps the only the first two users - for(int i = 0; i < MIN(count, 2); i++) + RoomDataSource *roomDataSource = (RoomDataSource *) self.roomDataSource; + BOOL needsUpdate = currentTypingUsers.count != roomDataSource.currentTypingUsers.count; + + NSMutableArray *typingUsers = [NSMutableArray new]; + for (NSUInteger i = 0 ; i < currentTypingUsers.count ; i++) { + NSString *userId = currentTypingUsers[i]; + MXRoomMember* member = [self.roomDataSource.roomState.members memberWithUserId:userId]; + TypingUserInfo *userInfo; + if (member) { - NSString* name = currentTypingUsers[i]; - - MXRoomMember* member = [self.roomDataSource.roomState.members memberWithUserId:name]; - - if (member && member.displayname.length) - { - name = member.displayname; - } - - // sanity check - if (name) - { - [names addObject:name]; - } - } - - if (0 == names.count) - { - // something to do ? - } - else if (1 == names.count) - { - text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_one_user_is_typing", @"Vector", nil), names[0]]; - } - else if (2 == names.count) - { - text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_two_users_are_typing", @"Vector", nil), names[0], names[1]]; + userInfo = [[TypingUserInfo alloc] initWithMember: member]; } else { - text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_many_users_are_typing", @"Vector", nil), names[0], names[1]]; + userInfo = [[TypingUserInfo alloc] initWithUserId: userId]; + } + [typingUsers addObject:userInfo]; + needsUpdate = needsUpdate || userInfo.userId != ((MXRoomMember *) roomDataSource.currentTypingUsers[i]).userId; + } + + if (needsUpdate) + { +// BOOL needsReload = roomDataSource.currentTypingUsers == nil; + // Quick fix for https://github.com/vector-im/element-ios/issues/4230 + BOOL needsReload = YES; + roomDataSource.currentTypingUsers = typingUsers; + if (needsReload) + { + [self.bubblesTableView reloadData]; + } + else + { + NSInteger count = [self.bubblesTableView numberOfRowsInSection:0]; + NSIndexPath *lastIndexPath = [NSIndexPath indexPathForRow:count - 1 inSection:0]; + [self.bubblesTableView reloadRowsAtIndexPaths:@[lastIndexPath] withRowAnimation:UITableViewRowAnimationFade]; } - [((RoomActivitiesView*) self.activitiesView) displayTypingNotification:text]; + if (self.isScrollToBottomHidden + && !self.bubblesTableView.isDragging + && !self.bubblesTableView.isDecelerating) + { + NSInteger count = [self.bubblesTableView numberOfRowsInSection:0]; + if (count) + { + [self scrollBubblesTableViewToBottomAnimated:YES]; + } + } } } @@ -4202,7 +4254,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)listenWidgetNotifications { kMXKWidgetManagerDidUpdateWidgetObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kWidgetManagerDidUpdateWidgetNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) { - + Widget *widget = notif.object; if (widget.mxSession == self.roomDataSource.mxSession && [widget.roomId isEqualToString:customizedRoomDataSource.roomId]) @@ -4224,10 +4276,10 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo error = [NSError errorWithDomain:error.domain code:error.code userInfo:@{ - NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"room_conference_call_no_power", @"Vector", nil) - }]; + NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"room_conference_call_no_power", @"Vector", nil) + }]; } - + // Alert user [[AppDelegate theDelegate] showErrorAsAlert:error]; } @@ -4241,7 +4293,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { widgetsCount += [[WidgetManager sharedManager] userWidgets:self.roomDataSource.room.mxSession].count; } - + return widgetsCount; } @@ -4252,38 +4304,41 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo if ([self.activitiesView isKindOfClass:RoomActivitiesView.class]) { RoomActivitiesView *roomActivitiesView = (RoomActivitiesView*)self.activitiesView; - + // Reset gesture recognizers while (roomActivitiesView.gestureRecognizers.count) { [roomActivitiesView removeGestureRecognizer:roomActivitiesView.gestureRecognizers[0]]; } - + Widget *jitsiWidget = [customizedRoomDataSource jitsiWidget]; - + if ([self.roomDataSource.mxSession.syncError.errcode isEqualToString:kMXErrCodeStringResourceLimitExceeded]) { + self.activitiesViewExpanded = YES; [roomActivitiesView showResourceLimitExceededError:self.roomDataSource.mxSession.syncError.userInfo onAdminContactTapped:^(NSURL *adminContactURL) { [[UIApplication sharedApplication] vc_open:adminContactURL completionHandler:^(BOOL success) { - if (!success) - { + if (!success) + { NSLog(@"[RoomVC] refreshActivitiesViewDisplay: adminContact(%@) cannot be opened", adminContactURL); - } + } }]; }]; } else if ([AppDelegate theDelegate].isOffline) { + self.activitiesViewExpanded = YES; [roomActivitiesView displayNetworkErrorNotification:NSLocalizedStringFromTable(@"room_offline_notification", @"Vector", nil)]; } else if (customizedRoomDataSource.roomState.isObsolete) { + self.activitiesViewExpanded = YES; MXWeakify(self); [roomActivitiesView displayRoomReplacementWithRoomLinkTappedHandler:^{ MXStrongifyAndReturnIfNil(self); - + MXEvent *stoneTombEvent = [self->customizedRoomDataSource.roomState stateEventsWithType:kMXEventTypeStringRoomTombStone].lastObject; - + NSString *replacementRoomId = self->customizedRoomDataSource.roomState.tombStoneContent.replacementRoomId; if ([self.roomDataSource.mxSession roomWithRoomId:replacementRoomId]) { @@ -4295,20 +4350,20 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo // Else auto join it via the server that sent the event NSLog(@"[RoomVC] Auto join an upgraded room: %@ -> %@. Sender: %@", self->customizedRoomDataSource.roomState.roomId, replacementRoomId, stoneTombEvent.sender); - + NSString *viaSenderServer = [MXTools serverNameInMatrixIdentifier:stoneTombEvent.sender]; - + if (viaSenderServer) { [self startActivityIndicator]; [self.roomDataSource.mxSession joinRoom:replacementRoomId viaServers:@[viaSenderServer] success:^(MXRoom *room) { [self stopActivityIndicator]; - + [[AppDelegate theDelegate] showRoom:replacementRoomId andEventId:nil withMatrixSession:self.roomDataSource.mxSession]; - + } failure:^(NSError *error) { [self stopActivityIndicator]; - + NSLog(@"[RoomVC] Failed to join an upgraded room. Error: %@", error); [[AppDelegate theDelegate] showErrorAsAlert:error]; @@ -4330,6 +4385,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo } else { + self.activitiesViewExpanded = YES; [roomActivitiesView displayOngoingConferenceCall:^(BOOL video) { NSLog(@"[RoomVC] onOngoingConferenceCallPressed"); @@ -4356,54 +4412,55 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo } else { + self.activitiesViewExpanded = YES; [roomActivitiesView displayOngoingConferenceCall:^(BOOL video) { - + NSLog(@"[RoomVC] onOngoingConferenceCallPressed (jitsi)"); - + __weak __typeof(self) weakSelf = self; NSString *appDisplayName = [[NSBundle mainBundle] infoDictionary][@"CFBundleDisplayName"]; - + // Check app permissions first [MXKTools checkAccessForCall:video manualChangeMessageForAudio:[NSString stringWithFormat:[NSBundle mxk_localizedStringForKey:@"microphone_access_not_granted_for_call"], appDisplayName] manualChangeMessageForVideo:[NSString stringWithFormat:[NSBundle mxk_localizedStringForKey:@"camera_access_not_granted_for_call"], appDisplayName] showPopUpInViewController:self completionHandler:^(BOOL granted) { - - if (weakSelf) - { - if (granted) - { - // Present the Jitsi view controller - [appDelegate displayJitsiViewControllerWithWidget:jitsiWidget andVideo:video]; - } - else - { - NSLog(@"[RoomVC] onOngoingConferenceCallPressed: Warning: The application does not have the perssion to join the call"); - } - } - }]; - + + if (weakSelf) + { + if (granted) + { + // Present the Jitsi view controller + [appDelegate displayJitsiViewControllerWithWidget:jitsiWidget andVideo:video]; + } + else + { + NSLog(@"[RoomVC] onOngoingConferenceCallPressed: Warning: The application does not have the perssion to join the call"); + } + } + }]; + } onClosePressed:^{ - + [self startActivityIndicator]; - + // Close the widget __weak __typeof(self) weakSelf = self; [[WidgetManager sharedManager] closeWidget:jitsiWidget.widgetId inRoom:self.roomDataSource.room success:^{ - + if (weakSelf) { typeof(self) self = weakSelf; [self stopActivityIndicator]; - + // The banner will automatically leave thanks to kWidgetManagerDidUpdateWidgetNotification } - + } failure:^(NSError *error) { if (weakSelf) { typeof(self) self = weakSelf; - + [self showJitsiErrorAsAlert:error]; [self stopActivityIndicator]; } @@ -4421,32 +4478,26 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo // Retrieve the unread messages count NSUInteger unreadCount = self.roomDataSource.room.summary.localUnreadEventCount; - if (unreadCount == 0) - { - // Refresh the typing notification here - // We will keep visible this notification (if any) beside the "scroll to bottom" icon. - [self refreshTypingNotification]; - } - - [roomActivitiesView displayScrollToBottomIcon:unreadCount onIconTapGesture:^{ - - [self goBackToLive]; - - }]; + self.scrollToBottomBadgeLabel.text = unreadCount ? [NSString stringWithFormat:@"%lu", unreadCount] : nil; + self.scrollToBottomHidden = NO; } else if (serverNotices.usageLimit && serverNotices.usageLimit.isServerNoticeUsageLimit) { - [roomActivitiesView showResourceUsageLimitNotice:serverNotices.usageLimit onAdminContactTapped:^(NSURL *adminContactURL) { + self.scrollToBottomHidden = YES; + self.activitiesViewExpanded = YES; + [roomActivitiesView showResourceUsageLimitNotice:serverNotices.usageLimit onAdminContactTapped:^(NSURL *adminContactURL) { [[UIApplication sharedApplication] vc_open:adminContactURL completionHandler:^(BOOL success) { - if (!success) - { + if (!success) + { NSLog(@"[RoomVC] refreshActivitiesViewDisplay: adminContact(%@) cannot be opened", adminContactURL); - } + } }]; }]; } else { + self.scrollToBottomHidden = YES; + self.activitiesViewExpanded = NO; [self refreshTypingNotification]; } } @@ -4473,22 +4524,22 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { // Switch back to the room live timeline managed by MXKRoomDataSourceManager MXKRoomDataSourceManager *roomDataSourceManager = [MXKRoomDataSourceManager sharedManagerForMatrixSession:self.mainSession]; - + MXWeakify(self); [roomDataSourceManager roomDataSourceForRoom:self.roomDataSource.roomId create:YES onComplete:^(MXKRoomDataSource *roomDataSource) { MXStrongifyAndReturnIfNil(self); - + // Scroll to bottom the bubble history on the display refresh. self->shouldScrollToBottomOnTableRefresh = YES; - + [self displayRoom:roomDataSource]; - + // The room view controller do not have here the data source ownership. self.hasRoomDataSourceOwnership = NO; - + [self refreshActivitiesViewDisplay]; [self refreshJumpToLastUnreadBannerDisplay]; - + if (self.saveProgressTextInput) { // Restore the potential message partially typed before jump to last unread messages. @@ -4503,11 +4554,16 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)refreshMissedDiscussionsCount:(BOOL)force { // Ignore this action when no room is displayed - if (!self.roomDataSource || !missedDiscussionsBarButtonCustomView) + if (!self.roomDataSource || !missedDiscussionsBadgeLabel + || [UIDevice currentDevice].userInterfaceIdiom != UIUserInterfaceIdiomPhone + || ([[UIScreen mainScreen] nativeBounds].size.height > 2532 && UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation))) { + self.showMissedDiscussionsBadge = NO; return; } + self.showMissedDiscussionsBadge = YES; + NSUInteger highlightCount = 0; NSUInteger missedCount = [[AppDelegate theDelegate].masterTabBarController missedDiscussionsCount]; @@ -4541,8 +4597,6 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo missedDiscussionsCount = missedCount; missedHighlightCount = highlightCount; - NSMutableArray *leftBarButtonItems = [NSMutableArray arrayWithArray: self.navigationItem.leftBarButtonItems]; - if (missedCount) { // Refresh missed discussions count label @@ -4555,65 +4609,12 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo missedDiscussionsBadgeLabel.text = [NSString stringWithFormat:@"%tu", missedCount]; } - [missedDiscussionsBadgeLabel sizeToFit]; - - // Update the label background view frame - CGRect frame = missedDiscussionsBadgeLabelBgView.frame; - frame.size.width = round(missedDiscussionsBadgeLabel.frame.size.width + 18); - - if ([GBDeviceInfo deviceInfo].osVersion.major < 11) - { - // Consider the main navigation controller if the current view controller is embedded inside a split view controller. - UINavigationController *mainNavigationController = self.navigationController; - if (self.splitViewController.isCollapsed && self.splitViewController.viewControllers.count) - { - mainNavigationController = self.splitViewController.viewControllers.firstObject; - } - UINavigationItem *backItem = mainNavigationController.navigationBar.backItem; - UIBarButtonItem *backButton = backItem.backBarButtonItem; - - if (backButton && !backButton.title.length) - { - // Shift the badge on the left to be close the back icon - frame.origin.x = ([GBDeviceInfo deviceInfo].displayInfo.display > GBDeviceDisplay4Inch ? -35 : -25); - } - else - { - frame.origin.x = 0; - } - } - - // Caution: set label background view frame only in case of changes to prevent from looping on 'viewDidLayoutSubviews'. - if (!CGRectEqualToRect(missedDiscussionsBadgeLabelBgView.frame, frame)) - { - missedDiscussionsBadgeLabelBgView.frame = frame; - } - - // Set the right background color - if (highlightCount) - { - missedDiscussionsBadgeLabelBgView.backgroundColor = ThemeService.shared.theme.noticeColor; - } - else - { - missedDiscussionsBadgeLabelBgView.backgroundColor = ThemeService.shared.theme.noticeSecondaryColor; - } - - if (!missedDiscussionsButton || [leftBarButtonItems indexOfObject:missedDiscussionsButton] == NSNotFound) - { - missedDiscussionsButton = [[UIBarButtonItem alloc] initWithCustomView:missedDiscussionsBarButtonCustomView]; - - // Add it in left bar items - [leftBarButtonItems addObject:missedDiscussionsButton]; - } + missedDiscussionsDotView.alpha = highlightCount == 0 ? 0 : 1; } - else if (missedDiscussionsButton) + else { - [leftBarButtonItems removeObject:missedDiscussionsButton]; - missedDiscussionsButton = nil; + missedDiscussionsBadgeLabel.text = nil; } - - self.navigationItem.leftBarButtonItems = leftBarButtonItems; } } @@ -4625,7 +4626,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo if ([self.activitiesView isKindOfClass:RoomActivitiesView.class]) { sentStatus = self.roomDataSource.room.sentStatus; - + if (sentStatus != RoomSentStatusOk) { NSString *notification = sentStatus == RoomSentStatusSentFailedDueToUnknownDevices ? @@ -4633,6 +4634,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo NSLocalizedStringFromTable(@"room_unsent_messages_notification", @"Vector", nil); RoomActivitiesView *roomActivitiesView = (RoomActivitiesView*) self.activitiesView; + self.activitiesViewExpanded = YES; [roomActivitiesView displayUnsentMessagesNotification:notification withResendLink:^{ [self resendAllUnsentMessages]; @@ -4654,40 +4656,40 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_resend_unsent_messages", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - [self resendAllUnsentMessages]; - self->currentAlert = nil; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + [self resendAllUnsentMessages]; + self->currentAlert = nil; + } + + }]]; [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_delete_unsent_messages", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - [self cancelAllUnsentMessages]; - self->currentAlert = nil; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + [self cancelAllUnsentMessages]; + self->currentAlert = nil; + } + + }]]; [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"cancel", @"Vector", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + self->currentAlert = nil; + } + + }]]; [currentAlert mxk_setAccessibilityIdentifier:@"RoomVCUnsentMessagesMenuAlert"]; [currentAlert popoverPresentationController].sourceView = roomActivitiesView; @@ -4739,39 +4741,39 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"unknown_devices_verify"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - - [self performSegueWithIdentifier:@"showUnknownDevices" sender:self]; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + self->currentAlert = nil; + + [self performSegueWithIdentifier:@"showUnknownDevices" sender:self]; + } + + }]]; [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"unknown_devices_send_anyway"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - - // Acknowledge the existence of all devices - [self startActivityIndicator]; - [self.mainSession.crypto setDevicesKnown:self->unknownDevices complete:^{ - - self->unknownDevices = nil; - [self stopActivityIndicator]; - - // And resend pending messages - [self resendAllUnsentMessages]; - }]; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + self->currentAlert = nil; + + // Acknowledge the existence of all devices + [self startActivityIndicator]; + [self.mainSession.crypto setDevicesKnown:self->unknownDevices complete:^{ + + self->unknownDevices = nil; + [self stopActivityIndicator]; + + // And resend pending messages + [self resendAllUnsentMessages]; + }]; + } + + }]]; [currentAlert mxk_setAccessibilityIdentifier:@"RoomVCUnknownDevicesAlert"]; [self presentViewController:currentAlert animated:YES completion:nil]; @@ -4782,7 +4784,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { MXEvent *event = notif.object; NSString *previousId = notif.userInfo[kMXEventIdentifierKey]; - + if ([customizedRoomDataSource.selectedEventId isEqualToString:previousId]) { NSLog(@"[RoomVC] eventDidChangeIdentifier: Update selectedEventId"); @@ -4837,7 +4839,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)cancelAllUnsentMessages { currentAlert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"room_unsent_messages_cancel_title", @"Vector", nil) message:NSLocalizedStringFromTable(@"room_unsent_messages_cancel_message", @"Vector", nil) preferredStyle:UIAlertControllerStyleAlert]; - + MXWeakify(self); [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { MXStrongifyAndReturnIfNil(self); @@ -4859,8 +4861,10 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo index ++; } } + + [self refreshActivitiesViewDisplay]; }]]; - + [self presentViewController:currentAlert animated:YES completion:nil]; } @@ -4976,21 +4980,21 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [UIView animateWithDuration:1.5 delay:0 options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseIn animations:^{ - - readMarkerTableViewCell.readMarkerViewLeadingConstraint.constant = readMarkerTableViewCell.readMarkerViewTrailingConstraint.constant = readMarkerTableViewCell.bubbleOverlayContainer.frame.size.width / 2; - readMarkerTableViewCell.readMarkerView.alpha = 0; - - // Force to render the view - [readMarkerTableViewCell.bubbleOverlayContainer layoutIfNeeded]; - - } + + readMarkerTableViewCell.readMarkerViewLeadingConstraint.constant = readMarkerTableViewCell.readMarkerViewTrailingConstraint.constant = readMarkerTableViewCell.bubbleOverlayContainer.frame.size.width / 2; + readMarkerTableViewCell.readMarkerView.alpha = 0; + + // Force to render the view + [readMarkerTableViewCell.bubbleOverlayContainer layoutIfNeeded]; + + } completion:^(BOOL finished){ - - readMarkerTableViewCell.readMarkerView.hidden = YES; - readMarkerTableViewCell.readMarkerView.alpha = 1; - - readMarkerTableViewCell = nil; - }]; + + readMarkerTableViewCell.readMarkerView.hidden = YES; + readMarkerTableViewCell.readMarkerView.alpha = 1; + + readMarkerTableViewCell = nil; + }]; }); } @@ -5069,110 +5073,110 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->currentAlert = nil; - } - - }]]; + + if (weakSelf) + { + typeof(self) self = weakSelf; + self->currentAlert = nil; + } + + }]]; [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"invite", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - - // Sanity check - if (!weakSelf) - { - return; - } - - typeof(self) self = weakSelf; - self->currentAlert = nil; - - MXSession* session = self.roomDataSource.mxSession; - NSString* roomId = self.roomDataSource.roomId; - MXRoom *room = [session roomWithRoomId:roomId]; - - NSArray *identifiers = contact.matrixIdentifiers; - NSString *participantId; - - if (identifiers.count) - { - participantId = identifiers.firstObject; - - // Invite this user if a room is defined - [room inviteUser:participantId success:^{ - - // Refresh display by removing the contacts picker - [contactsTableViewController withdrawViewControllerAnimated:YES completion:nil]; - - } failure:^(NSError *error) { - - NSLog(@"[RoomVC] Invite %@ failed", participantId); - // Alert user - [[AppDelegate theDelegate] showErrorAsAlert:error]; - - }]; - } - else - { - if (contact.emailAddresses.count) - { - // This is a local contact, consider the first email by default. - // TODO: Prompt the user to select the right email. - MXKEmail *email = contact.emailAddresses.firstObject; - participantId = email.emailAddress; - } - else - { - // This is the text filled by the user. - participantId = contact.displayName; - } - - // Is it an email or a Matrix user ID? - if ([MXTools isEmailAddress:participantId]) - { - [room inviteUserByEmail:participantId success:^{ - - // Refresh display by removing the contacts picker - [contactsTableViewController withdrawViewControllerAnimated:YES completion:nil]; - - } failure:^(NSError *error) { - - NSLog(@"[RoomVC] Invite be email %@ failed", participantId); - // Alert user - if ([error.domain isEqualToString:kMXRestClientErrorDomain] - && error.code == MXRestClientErrorMissingIdentityServer) - { - NSString *message = [NSBundle mxk_localizedStringForKey:@"error_invite_3pid_with_no_identity_server"]; - [[AppDelegate theDelegate] showAlertWithTitle:message message:nil]; - } - else - { - [[AppDelegate theDelegate] showErrorAsAlert:error]; - } - }]; - } - else //if ([MXTools isMatrixUserIdentifier:participantId]) - { - [room inviteUser:participantId success:^{ - - // Refresh display by removing the contacts picker - [contactsTableViewController withdrawViewControllerAnimated:YES completion:nil]; - - } failure:^(NSError *error) { - - NSLog(@"[RoomVC] Invite %@ failed", participantId); - // Alert user - [[AppDelegate theDelegate] showErrorAsAlert:error]; - - }]; - } - } - - }]]; + + // Sanity check + if (!weakSelf) + { + return; + } + + typeof(self) self = weakSelf; + self->currentAlert = nil; + + MXSession* session = self.roomDataSource.mxSession; + NSString* roomId = self.roomDataSource.roomId; + MXRoom *room = [session roomWithRoomId:roomId]; + + NSArray *identifiers = contact.matrixIdentifiers; + NSString *participantId; + + if (identifiers.count) + { + participantId = identifiers.firstObject; + + // Invite this user if a room is defined + [room inviteUser:participantId success:^{ + + // Refresh display by removing the contacts picker + [contactsTableViewController withdrawViewControllerAnimated:YES completion:nil]; + + } failure:^(NSError *error) { + + NSLog(@"[RoomVC] Invite %@ failed", participantId); + // Alert user + [[AppDelegate theDelegate] showErrorAsAlert:error]; + + }]; + } + else + { + if (contact.emailAddresses.count) + { + // This is a local contact, consider the first email by default. + // TODO: Prompt the user to select the right email. + MXKEmail *email = contact.emailAddresses.firstObject; + participantId = email.emailAddress; + } + else + { + // This is the text filled by the user. + participantId = contact.displayName; + } + + // Is it an email or a Matrix user ID? + if ([MXTools isEmailAddress:participantId]) + { + [room inviteUserByEmail:participantId success:^{ + + // Refresh display by removing the contacts picker + [contactsTableViewController withdrawViewControllerAnimated:YES completion:nil]; + + } failure:^(NSError *error) { + + NSLog(@"[RoomVC] Invite be email %@ failed", participantId); + // Alert user + if ([error.domain isEqualToString:kMXRestClientErrorDomain] + && error.code == MXRestClientErrorMissingIdentityServer) + { + NSString *message = [NSBundle mxk_localizedStringForKey:@"error_invite_3pid_with_no_identity_server"]; + [[AppDelegate theDelegate] showAlertWithTitle:message message:nil]; + } + else + { + [[AppDelegate theDelegate] showErrorAsAlert:error]; + } + }]; + } + else //if ([MXTools isMatrixUserIdentifier:participantId]) + { + [room inviteUser:participantId success:^{ + + // Refresh display by removing the contacts picker + [contactsTableViewController withdrawViewControllerAnimated:YES completion:nil]; + + } failure:^(NSError *error) { + + NSLog(@"[RoomVC] Invite %@ failed", participantId); + // Alert user + [[AppDelegate theDelegate] showErrorAsAlert:error]; + + }]; + } + } + + }]]; [currentAlert mxk_setAccessibilityIdentifier:@"RoomVCInviteAlert"]; [self presentViewController:currentAlert animated:YES completion:nil]; @@ -5191,22 +5195,22 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [self presentReviewUnverifiedSessionsAlert]; return; } - + // Make the re-request [self.mainSession.crypto reRequestRoomKeyForEvent:event]; - + // Observe kMXEventDidDecryptNotification to remove automatically the dialog // if the user has shared the keys from another device mxEventDidDecryptNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXEventDidDecryptNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) { MXStrongifyAndReturnIfNil(self); - + MXEvent *decryptedEvent = notif.object; - + if ([decryptedEvent.eventId isEqualToString:event.eventId]) { [[NSNotificationCenter defaultCenter] removeObserver:self->mxEventDidDecryptNotificationObserver]; self->mxEventDidDecryptNotificationObserver = nil; - + if (self->currentAlert == alert) { [self->currentAlert dismissViewControllerAnimated:YES completion:nil]; @@ -5214,51 +5218,51 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo } } }]; - + // Show the explanation dialog alert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"rerequest_keys_alert_title", @"Vector", nil) - message:NSLocalizedStringFromTable(@"rerequest_keys_alert_message", @"Vector", nil) - preferredStyle:UIAlertControllerStyleAlert]; + message:NSLocalizedStringFromTable(@"rerequest_keys_alert_message", @"Vector", nil) + preferredStyle:UIAlertControllerStyleAlert]; currentAlert = alert; - - + + [alert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"ok"] - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) - { - MXStrongifyAndReturnIfNil(self); - - [[NSNotificationCenter defaultCenter] removeObserver:self->mxEventDidDecryptNotificationObserver]; - self->mxEventDidDecryptNotificationObserver = nil; - - self->currentAlert = nil; - }]]; - + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) + { + MXStrongifyAndReturnIfNil(self); + + [[NSNotificationCenter defaultCenter] removeObserver:self->mxEventDidDecryptNotificationObserver]; + self->mxEventDidDecryptNotificationObserver = nil; + + self->currentAlert = nil; + }]]; + [self presentViewController:currentAlert animated:YES completion:nil]; } - (void)presentReviewUnverifiedSessionsAlert { NSLog(@"[MasterTabBarController] presentReviewUnverifiedSessionsAlertWithSession"); - + [currentAlert dismissViewControllerAnimated:NO completion:nil]; - + UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"key_verification_self_verify_unverified_sessions_alert_title", @"Vector", nil) message:NSLocalizedStringFromTable(@"key_verification_self_verify_unverified_sessions_alert_message", @"Vector", nil) preferredStyle:UIAlertControllerStyleAlert]; - + [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"key_verification_self_verify_unverified_sessions_alert_validate_action", @"Vector", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - [self showSettingsSecurityScreen]; - }]]; - + [self showSettingsSecurityScreen]; + }]]; + [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"later", @"Vector", nil) style:UIAlertActionStyleCancel handler:nil]]; - + [self presentViewController:alert animated:YES completion:nil]; - + currentAlert = alert; } @@ -5309,12 +5313,12 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo - (void)listenMXSessionStateChangeNotifications { kMXSessionStateDidChangeObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXSessionStateDidChangeNotification object:self.roomDataSource.mxSession queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) { - + if (self.roomDataSource.mxSession.state == MXSessionStateSyncError || self.roomDataSource.mxSession.state == MXSessionStateRunning) { [self refreshActivitiesViewDisplay]; - + // update inputToolbarView [self updateRoomInputToolbarViewClassIfNeeded]; } @@ -5411,10 +5415,10 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo fromSingleTapGesture:usedSingleTapGesture animated:animated completion:^{ - }]; + }]; preventBubblesTableViewScroll = YES; - [self selectEventWithId:selectedEventId]; + [self selectEventWithId:selectedEventId]; } - (void)hideContextualMenuAnimated:(BOOL)animated @@ -5469,7 +5473,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [self cancelEventSelection]; [self.roomDataSource resendEventWithEventId:event.eventId success:nil failure:nil]; }; - + return resendMenuItem; } @@ -5497,7 +5501,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [self presentViewController:self->currentAlert animated:YES completion:nil]; }]; }; - + return deleteMenuItem; } @@ -5510,7 +5514,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo MXStrongifyAndReturnIfNil(self); [self hideContextualMenuAnimated:YES cancelEventSelection:NO completion:nil]; [self editEventContentWithId:event.eventId]; - + // And display the keyboard [self.inputToolbarView becomeFirstResponder]; }; @@ -5524,7 +5528,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo { MXKRoomBubbleTableViewCell *roomBubbleTableViewCell = (MXKRoomBubbleTableViewCell *)cell; MXKAttachment *attachment = roomBubbleTableViewCell.bubbleData.attachment; - + MXWeakify(self); BOOL isCopyActionEnabled = !attachment || attachment.type != MXKAttachmentTypeSticker; @@ -5612,7 +5616,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo }]; } }; - + return copyMenuItem; } @@ -5627,7 +5631,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [self hideContextualMenuAnimated:YES cancelEventSelection:NO completion:nil]; [self selectEventWithId:event.eventId inputToolBarSendMode:RoomInputToolbarViewSendModeReply showTimestamp:NO]; - + // And display the keyboard [self.inputToolbarView becomeFirstResponder]; }; @@ -5645,7 +5649,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo [self hideContextualMenuAnimated:YES completion:nil]; [self showAdditionalActionsMenuForEvent:event inCell:cell animated:YES]; }; - + return moreMenuItem; } @@ -5705,7 +5709,7 @@ NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNo if (cellRow >= 0) { - NSIndexPath *cellIndexPath = [NSIndexPath indexPathForRow:cellRow inSection:0]; + NSIndexPath *cellIndexPath = [NSIndexPath indexPathForRow:cellRow inSection:0]; UITableViewCell *cell = [self.bubblesTableView cellForRowAtIndexPath:cellIndexPath]; sourceView = cell; diff --git a/Riot/Modules/Room/RoomViewController.xib b/Riot/Modules/Room/RoomViewController.xib index 15ac46dc7..2371d6a0e 100644 --- a/Riot/Modules/Room/RoomViewController.xib +++ b/Riot/Modules/Room/RoomViewController.xib @@ -1,10 +1,11 @@ - + - + + @@ -13,6 +14,7 @@ + @@ -28,6 +30,8 @@ + + @@ -36,7 +40,7 @@ - + @@ -54,7 +58,7 @@ + + + + + + + + + diff --git a/Riot/Modules/Room/Views/Activities/RoomActivitiesView.h b/Riot/Modules/Room/Views/Activities/RoomActivitiesView.h index 54eb3feb7..b66c61a5f 100644 --- a/Riot/Modules/Room/Views/Activities/RoomActivitiesView.h +++ b/Riot/Modules/Room/Views/Activities/RoomActivitiesView.h @@ -73,16 +73,6 @@ */ - (void)displayOngoingConferenceCall:(void (^)(BOOL video))ongoingConferenceCallPressed onClosePressed:(void (^)(void))ongoingConferenceCallClosePressed; -/** - Display a "scroll to bottom" icon. - Replace the current notification if any. - - @param newMessagesCount the count of the unread messages. - @param onIconTapGesture block called when user taps on notification icon. - */ -- (void)displayScrollToBottomIcon:(NSUInteger)newMessagesCount onIconTapGesture:(void (^)(void))onIconTapGesture; - - /** Notify that the a room is obsolete and a replacement room is available. diff --git a/Riot/Modules/Room/Views/Activities/RoomActivitiesView.m b/Riot/Modules/Room/Views/Activities/RoomActivitiesView.m index fa6ebd452..1f65678ad 100644 --- a/Riot/Modules/Room/Views/Activities/RoomActivitiesView.m +++ b/Riot/Modules/Room/Views/Activities/RoomActivitiesView.m @@ -268,59 +268,6 @@ [self checkHeight:YES]; } -- (void)displayScrollToBottomIcon:(NSUInteger)newMessagesCount onIconTapGesture:(void (^)(void))onIconTapGesture -{ - if (newMessagesCount) - { - [self reset]; - - self.iconImageView.image = [UIImage imageNamed:@"scrolldown"]; - self.iconImageView.tintColor = ThemeService.shared.theme.noticeColor; - - NSString *notification; - if (newMessagesCount > 1) - { - notification = NSLocalizedStringFromTable(@"room_new_messages_notification", @"Vector", nil); - } - else - { - notification = NSLocalizedStringFromTable(@"room_new_message_notification", @"Vector", nil); - } - self.messageLabel.text = [NSString stringWithFormat:notification, newMessagesCount]; - self.messageLabel.textColor = ThemeService.shared.theme.warningColor; - self.messageLabel.hidden = NO; - } - else - { - // We keep the current message if any - [self resetIcon]; - - self.iconImageView.image = [UIImage imageNamed:@"scrolldown"]; - self.iconImageView.tintColor = ThemeService.shared.theme.textPrimaryColor; - } - self.iconImageView.hidden = NO; - - // Make VoiceOver consider it as a button - self.iconImageView.accessibilityLabel = NSLocalizedStringFromTable(@"room_accessiblity_scroll_to_bottom", @"Vector", nil); - self.iconImageView.isAccessibilityElement = YES; - self.iconImageView.accessibilityTraits = UIAccessibilityTraitButton; - - if (onIconTapGesture) - { - objc_setAssociatedObject(self.iconImageView, "onIconTapGesture", [onIconTapGesture copy], OBJC_ASSOCIATION_RETAIN_NONATOMIC); - - // Listen to icon tap - UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onIconTap:)]; - [tapGesture setNumberOfTouchesRequired:1]; - [tapGesture setNumberOfTapsRequired:1]; - [tapGesture setDelegate:self]; - [self.iconImageView addGestureRecognizer:tapGesture]; - self.iconImageView.userInteractionEnabled = YES; - } - - [self checkHeight:YES]; -} - - (void)displayRoomReplacementWithRoomLinkTappedHandler:(void (^)(void))onRoomReplacementLinkTapped { [self reset]; diff --git a/Riot/Modules/Room/Views/Activities/RoomActivitiesView.xib b/Riot/Modules/Room/Views/Activities/RoomActivitiesView.xib index 8f491dc8c..cc44ee7e6 100644 --- a/Riot/Modules/Room/Views/Activities/RoomActivitiesView.xib +++ b/Riot/Modules/Room/Views/Activities/RoomActivitiesView.xib @@ -128,7 +128,7 @@ - + diff --git a/Riot/Modules/Room/Views/BubbleCells/RoomTypingBubbleCell.swift b/Riot/Modules/Room/Views/BubbleCells/RoomTypingBubbleCell.swift new file mode 100644 index 000000000..f0eba07b2 --- /dev/null +++ b/Riot/Modules/Room/Views/BubbleCells/RoomTypingBubbleCell.swift @@ -0,0 +1,143 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +@objcMembers +class RoomTypingBubbleCell: MXKTableViewCell, Themable { + // MARK: - Constants + + private enum Constants { + static let maxPictureCount = 4 + static let pictureSize: CGFloat = 24 + static let pictureMaxMargin: CGFloat = 16 + static let pictureMinMargin: CGFloat = 8 + } + + // MARK: - Outlets + + @IBOutlet private weak var additionalUsersLabel: UILabel! + @IBOutlet private weak var additionalUsersLabelLeadingConstraint: NSLayoutConstraint! + @IBOutlet private weak var dotsView: DotsView! + @IBOutlet private weak var dotsViewLeadingConstraint: NSLayoutConstraint! + + // MARK: - members + + private var userPictureViews: [MXKImageView] = [] + + // MARK: - Lifecycle + + override func awakeFromNib() { + super.awakeFromNib() + + update(theme: ThemeService.shared().theme) + } + + override func prepareForReuse() { + super.prepareForReuse() + + for pictureView in userPictureViews { + pictureView.removeFromSuperview() + } + } + + override func layoutSubviews() { + super.layoutSubviews() + + dotsView.isHidden = userPictureViews.count == 0 + + guard userPictureViews.count > 0 else { + return + } + + additionalUsersLabel?.sizeToFit() + + var pictureViewsMaxX: CGFloat = 0 + var xOffset: CGFloat = 0 + for pictureView in userPictureViews { + pictureView.center = CGPoint(x: Constants.pictureMaxMargin + xOffset + pictureView.bounds.midX, y: self.bounds.midY) + xOffset += round(pictureView.bounds.maxX * 2 / 3) + pictureViewsMaxX = pictureView.frame.maxX + } + + let leftMagin: CGFloat = pictureViewsMaxX + (userPictureViews.count == 1 ? Constants.pictureMaxMargin : Constants.pictureMinMargin) + additionalUsersLabelLeadingConstraint.constant = leftMagin + + dotsViewLeadingConstraint?.constant = additionalUsersLabel.text.isEmptyOrNil == true ? leftMagin : leftMagin + 8 + additionalUsersLabel.frame.width + } + + // MARK: - Overrides + + override class func defaultReuseIdentifier() -> String { + return String(describing: self) + } + + override class func nib() -> UINib { + return UINib(nibName: String(describing: self), bundle: nil) + } + + // MARK: - Themable + + func update(theme: Theme) { + additionalUsersLabel.textColor = theme.textSecondaryColor + dotsView.highlightedDotColor = theme.textTertiaryColor + dotsView.dotColor = theme.textSecondaryColor + } + + + // MARK: - Business methods + + func updateTypingUsers(_ typingUsers: [TypingUserInfo], mediaManager: MXMediaManager) { + for pictureView in userPictureViews { + pictureView.removeFromSuperview() + } + userPictureViews = [] + + for user in typingUsers { + if userPictureViews.count >= Constants.maxPictureCount { + break + } + + let pictureView = MXKImageView(frame: CGRect(x: 0, y: 0, width: Constants.pictureSize, height: Constants.pictureSize)) + pictureView.layer.masksToBounds = true + pictureView.layer.cornerRadius = pictureView.bounds.midX + + let defaultavatarImage = AvatarGenerator.generateAvatar(forMatrixItem: user.userId, withDisplayName: user.displayName) + pictureView.setImageURI(user.avatarUrl, withType: nil, andImageOrientation: .up, toFitViewSize: pictureView.bounds.size, with: MXThumbnailingMethodCrop, previewImage: defaultavatarImage, mediaManager: mediaManager) + + userPictureViews.append(pictureView) + self.contentView.addSubview(pictureView) + } + + switch typingUsers.count { + case 0: + additionalUsersLabel.text = nil + case 1: + additionalUsersLabel.text = firstUserNameFor(typingUsers) + default: + additionalUsersLabel.text = VectorL10n.roomMultipleTypingNotification(firstUserNameFor(typingUsers) ?? "") + } + self.setNeedsLayout() + } + + private func firstUserNameFor(_ typingUsers: Array) -> String? { + guard let firstUser = typingUsers.first else { + return nil + } + + return firstUser.displayName.isEmptyOrNil ? firstUser.userId : firstUser.displayName + } +} diff --git a/Riot/Modules/Room/Views/BubbleCells/RoomTypingBubbleCell.xib b/Riot/Modules/Room/Views/BubbleCells/RoomTypingBubbleCell.xib new file mode 100644 index 000000000..5cd15a92d --- /dev/null +++ b/Riot/Modules/Room/Views/BubbleCells/RoomTypingBubbleCell.xib @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Riot/Modules/Room/Views/InputToolbar/RoomActionItem.swift b/Riot/Modules/Room/Views/InputToolbar/RoomActionItem.swift new file mode 100644 index 000000000..773e4be3d --- /dev/null +++ b/Riot/Modules/Room/Views/InputToolbar/RoomActionItem.swift @@ -0,0 +1,30 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +@objcMembers +class RoomActionItem: NSObject { + let image: UIImage + let action: (() -> Void) + + init(image: UIImage, andAction action: @escaping () -> Void) { + self.image = image + self.action = action + + super.init() + } +} diff --git a/Riot/Modules/Room/Views/InputToolbar/RoomActionsBar.swift b/Riot/Modules/Room/Views/InputToolbar/RoomActionsBar.swift new file mode 100644 index 000000000..5482ab833 --- /dev/null +++ b/Riot/Modules/Room/Views/InputToolbar/RoomActionsBar.swift @@ -0,0 +1,132 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +@objcMembers +class RoomActionsBar: UIScrollView, Themable { + // MARK: - Properties + + var itemSpacing: CGFloat = 20 { + didSet { + self.setNeedsLayout() + } + } + + var actionItems: [RoomActionItem] = [] { + didSet { + var actionButtons: [UIButton] = [] + for (index, item) in actionItems.enumerated() { + let button = UIButton(type: .custom) + button.setImage(item.image, for: .normal) + button.addTarget(self, action: #selector(buttonAction(_:)), for: .touchUpInside) + button.tintColor = ThemeService.shared().theme.tintColor + button.tag = index + actionButtons.append(button) + addSubview(button) + } + self.actionButtons = actionButtons + self.lastBounds = .zero + self.setNeedsLayout() + } + } + + private var actionButtons: [UIButton] = [] { + willSet { + for button in actionButtons { + button.removeFromSuperview() + } + } + } + + private var lastBounds = CGRect.zero + + // MARK: - Lifecycle + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setupView() + } + + override func layoutSubviews() { + super.layoutSubviews() + + guard lastBounds != self.bounds else { + return + } + + lastBounds = self.bounds + + var currentX: CGFloat = 0 + for button in actionButtons { + button.transform = CGAffineTransform.identity + button.frame = CGRect(x: currentX, y: 0, width: self.bounds.height, height: self.bounds.height) + currentX = button.frame.maxX + itemSpacing + } + + self.contentSize = CGSize(width: currentX - itemSpacing, height: self.bounds.height) + } + + // MARK: - Themable + + func update(theme: Theme) { + for button in actionButtons { + button.tintColor = theme.tintColor + } + } + + // MARK: - Business methods + + func animate(showIn: Bool, completion: ((Bool) -> Void)? = nil) { + if showIn { + for button in actionButtons { + button.transform = CGAffineTransform(translationX: 0, y: self.bounds.height) + } + for (index, button) in actionButtons.enumerated() { + UIView.animate(withDuration: 0.3, delay: 0.05 * Double(index), usingSpringWithDamping: 0.45, initialSpringVelocity: 11, options: .curveEaseInOut) { + button.transform = CGAffineTransform.identity + } completion: { (finished) in + completion?(finished) + } + } + } else { + for (index, button) in actionButtons.enumerated() { + UIView.animate(withDuration: 0.25, delay: 0.05 * Double(index), options: .curveEaseInOut) { + button.transform = CGAffineTransform(translationX: 0, y: self.bounds.height) + } completion: { (finished) in + if index == self.actionButtons.count - 1 { + completion?(finished) + } + } + } + } + } + + // MARK: - Private methods + + @objc private func buttonAction(_ sender: UIButton) { + actionItems[sender.tag].action() + } + + private func setupView() { + self.showsHorizontalScrollIndicator = false + } +} diff --git a/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.h b/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.h index 41d4c0aff..b2ad883b8 100644 --- a/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.h +++ b/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.h @@ -18,6 +18,8 @@ #import "MediaPickerViewController.h" +@class RoomActionsBar; + /** Destination of the message in the composer */ @@ -32,32 +34,11 @@ typedef enum : NSUInteger @protocol RoomInputToolbarViewDelegate /** - Tells the delegate that the user wants to display the sticker picker. - - @param toolbarView the room input toolbar view. - */ -- (void)roomInputToolbarViewPresentStickerPicker:(MXKRoomInputToolbarView*)toolbarView; - -/** - Tells the delegate that the user wants to send external files. + Tells the delegate that the user wants to cancel the current edition / reply. @param toolbarView the room input toolbar view */ -- (void)roomInputToolbarViewDidTapFileUpload:(MXKRoomInputToolbarView*)toolbarView; - -/** - Tells the delegate that the user wants to take photo or video with camera. - - @param toolbarView the room input toolbar view - */ -- (void)roomInputToolbarViewDidTapCamera:(MXKRoomInputToolbarView*)toolbarView; - -/** - Tells the delegate that the user wants to show media library. - - @param toolbarView the room input toolbar view - */ -- (void)roomInputToolbarViewDidTapMediaLibrary:(MXKRoomInputToolbarView*)toolbarView; +- (void)roomInputToolbarViewDidTapCancel:(MXKRoomInputToolbarView*)toolbarView; @end @@ -74,11 +55,6 @@ typedef enum : NSUInteger @property (weak, nonatomic) IBOutlet UIView *mainToolbarView; -@property (weak, nonatomic) IBOutlet UIView *separatorView; -@property (strong, nonatomic) IBOutlet MXKImageView *pictureView; - -@property (strong, nonatomic) IBOutlet UIImageView *encryptedRoomIcon; - @property (weak, nonatomic) IBOutlet NSLayoutConstraint *mainToolbarMinHeightConstraint; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *mainToolbarHeightConstraint; @@ -86,29 +62,33 @@ typedef enum : NSUInteger @property (weak, nonatomic) IBOutlet NSLayoutConstraint *messageComposerContainerTrailingConstraint; @property (weak, nonatomic) IBOutlet UIButton *attachMediaButton; -@property (weak, nonatomic) IBOutlet UIButton *voiceCallButton; -@property (weak, nonatomic) IBOutlet UIButton *hangupCallButton; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint *voiceCallButtonWidthConstraint; +@property (weak, nonatomic) IBOutlet UIImageView *inputTextBackgroundView; -/** - Tell whether the call option is supported. YES by default. - */ -@property (nonatomic) BOOL supportCallOption; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *inputContextViewHeightConstraint; +@property (weak, nonatomic) IBOutlet UIImageView *inputContextImageView; +@property (weak, nonatomic) IBOutlet UILabel *inputContextLabel; +@property (weak, nonatomic) IBOutlet UIButton *inputContextButton; +@property (weak, nonatomic) IBOutlet RoomActionsBar *actionsBar; /** Tell whether the filled data will be sent encrypted. NO by default. */ @property (nonatomic) BOOL isEncryptionEnabled; +/** + Sender of the event being edited / replied. + */ +@property (nonatomic, strong) NSString *eventSenderDisplayName; + /** Destination of the message in the composer. */ @property (nonatomic) RoomInputToolbarViewSendMode sendMode; /** - Tell whether a call is active. + YES if action menu is opened. NO otherwise */ -@property (nonatomic) BOOL activeCall; +@property (nonatomic, getter=isActionMenuOpened) BOOL actionMenuOpened; @end diff --git a/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.m b/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.m index de0724e52..26a2f4c69 100644 --- a/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.m +++ b/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.m @@ -27,6 +27,14 @@ #import "WidgetManager.h" #import "IntegrationManagerViewController.h" +const double kContextBarHeight = 24; +const NSTimeInterval kSendModeAnimationDuration = .15; +const NSTimeInterval kActionMenuAttachButtonAnimationDuration = .4; +const CGFloat kActionMenuAttachButtonSpringVelocity = 7; +const CGFloat kActionMenuAttachButtonSpringDamping = .45; +const NSTimeInterval kActionMenuContentAlphaAnimationDuration = .2; +const NSTimeInterval kActionMenuComposerHeightAnimationDuration = .3; + @interface RoomInputToolbarView() { // The intermediate action sheet @@ -60,14 +68,12 @@ { [super awakeFromNib]; - _supportCallOption = YES; _sendMode = RoomInputToolbarViewSendModeSend; - - self.rightInputToolbarButton.hidden = YES; - - [self.rightInputToolbarButton setTitleColor:ThemeService.shared.theme.tintColor forState:UIControlStateNormal]; - [self.rightInputToolbarButton setTitleColor:ThemeService.shared.theme.tintColor forState:UIControlStateHighlighted]; - + self.inputContextViewHeightConstraint.constant = 0; + + [self.rightInputToolbarButton setTitle:nil forState:UIControlStateNormal]; + [self.rightInputToolbarButton setTitle:nil forState:UIControlStateHighlighted]; + self.isEncryptionEnabled = _isEncryptionEnabled; } @@ -80,8 +86,6 @@ // Remove default toolbar background color self.backgroundColor = [UIColor clearColor]; - self.separatorView.backgroundColor = ThemeService.shared.theme.lineBreakColor; - // Custom the growingTextView display growingTextView.layer.cornerRadius = 0; growingTextView.layer.borderWidth = 0; @@ -90,6 +94,8 @@ growingTextView.font = [UIFont systemFontOfSize:15]; growingTextView.textColor = ThemeService.shared.theme.textPrimaryColor; growingTextView.tintColor = ThemeService.shared.theme.tintColor; + growingTextView.placeholderColor = ThemeService.shared.theme.textTertiaryColor; + growingTextView.internalTextView.showsVerticalScrollIndicator = NO; growingTextView.internalTextView.keyboardAppearance = ThemeService.shared.theme.keyboardAppearance; if (growingTextView.isFirstResponder) @@ -99,33 +105,36 @@ } self.attachMediaButton.accessibilityLabel = NSLocalizedStringFromTable(@"room_accessibility_upload", @"Vector", nil); - self.voiceCallButton.accessibilityLabel = NSLocalizedStringFromTable(@"room_accessibility_call", @"Vector", nil); - self.hangupCallButton.accessibilityLabel = NSLocalizedStringFromTable(@"room_accessibility_hangup", @"Vector", nil); - self.hangupCallButton.tintColor = ThemeService.shared.theme.noticeColor; - self.voiceCallButton.tintColor = ThemeService.shared.theme.tintColor; - self.attachMediaButton.tintColor = ThemeService.shared.theme.tintColor; + UIImage *image = [UIImage imageNamed:@"input_text_background"]; + image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(9, 15, 10, 16)]; + self.inputTextBackgroundView.image = image; + self.inputTextBackgroundView.tintColor = ThemeService.shared.theme.roomInputTextBorder; + + if ([ThemeService.shared.themeId isEqualToString:@"light"]) + { + [self.attachMediaButton setImage:[UIImage imageNamed:@"upload_icon"] forState:UIControlStateNormal]; + } + else if ([ThemeService.shared.themeId isEqualToString:@"dark"] || [ThemeService.shared.themeId isEqualToString:@"black"]) + { + [self.attachMediaButton setImage:[UIImage imageNamed:@"upload_icon_dark"] forState:UIControlStateNormal]; + } + else if (@available(iOS 12.0, *) && ThemeService.shared.theme.userInterfaceStyle == UIUserInterfaceStyleDark) { + [self.attachMediaButton setImage:[UIImage imageNamed:@"upload_icon_dark"] forState:UIControlStateNormal]; + } + + self.inputContextImageView.tintColor = ThemeService.shared.theme.textSecondaryColor; + self.inputContextLabel.textColor = ThemeService.shared.theme.textSecondaryColor; + self.inputContextButton.tintColor = ThemeService.shared.theme.textSecondaryColor; + [self.actionsBar updateWithTheme:ThemeService.shared.theme]; } #pragma mark - -- (void)setSupportCallOption:(BOOL)supportCallOption +- (void)setTextMessage:(NSString *)textMessage { - if (_supportCallOption != supportCallOption) - { - _supportCallOption = supportCallOption; - - if (supportCallOption) - { - self.voiceCallButtonWidthConstraint.constant = 46; - } - else - { - self.voiceCallButtonWidthConstraint.constant = 0; - } - - [self setNeedsUpdateConstraints]; - } + [self updateSendButtonWithMessage:textMessage]; + [super setTextMessage:textMessage]; } - (void)setIsEncryptionEnabled:(BOOL)isEncryptionEnabled @@ -137,31 +146,78 @@ - (void)setSendMode:(RoomInputToolbarViewSendMode)sendMode { + RoomInputToolbarViewSendMode previousMode = _sendMode; _sendMode = sendMode; + self.actionMenuOpened = NO; [self updatePlaceholder]; - [self updateToolbarButtonLabel]; + [self updateToolbarButtonLabelWithPreviousMode: previousMode]; } -- (void)updateToolbarButtonLabel +- (void)updateToolbarButtonLabelWithPreviousMode:(RoomInputToolbarViewSendMode)previousMode { - NSString *title; + UIImage *buttonImage; + double updatedHeight = self.mainToolbarHeightConstraint.constant; + switch (_sendMode) { case RoomInputToolbarViewSendModeReply: - title = NSLocalizedStringFromTable(@"room_action_reply", @"Vector", nil); + buttonImage = [UIImage imageNamed:@"send_icon"]; + self.inputContextImageView.image = [UIImage imageNamed:@"input_reply_icon"]; + self.inputContextLabel.text = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_message_replying_to", @"Vector", nil), self.eventSenderDisplayName]; + + self.inputContextViewHeightConstraint.constant = kContextBarHeight; + updatedHeight += kContextBarHeight; + self->growingTextView.maxHeight -= kContextBarHeight; break; case RoomInputToolbarViewSendModeEdit: - title = NSLocalizedStringFromTable(@"save", @"Vector", nil); + buttonImage = [UIImage imageNamed:@"save_icon"]; + self.inputContextImageView.image = [UIImage imageNamed:@"input_edit_icon"]; + self.inputContextLabel.text = NSLocalizedStringFromTable(@"room_message_editing", @"Vector", nil); + + self.inputContextViewHeightConstraint.constant = kContextBarHeight; + updatedHeight += kContextBarHeight; + self->growingTextView.maxHeight -= kContextBarHeight; break; default: - title = [NSBundle mxk_localizedStringForKey:@"send"]; + buttonImage = [UIImage imageNamed:@"send_icon"]; + + if (previousMode != _sendMode) + { + updatedHeight -= kContextBarHeight; + self->growingTextView.maxHeight += kContextBarHeight; + } + self.inputContextViewHeightConstraint.constant = 0; break; } + + [self.rightInputToolbarButton setImage:buttonImage forState:UIControlStateNormal]; + + if (self.maxHeight && updatedHeight > self.maxHeight) + { + growingTextView.maxHeight -= updatedHeight - self.maxHeight; + updatedHeight = self.maxHeight; + } - [self.rightInputToolbarButton setTitle:title forState:UIControlStateNormal]; - [self.rightInputToolbarButton setTitle:title forState:UIControlStateHighlighted]; + if (updatedHeight < self.mainToolbarMinHeightConstraint.constant) + { + updatedHeight = self.mainToolbarMinHeightConstraint.constant; + } + + if (self.mainToolbarHeightConstraint.constant != updatedHeight) + { + [UIView animateWithDuration:kSendModeAnimationDuration animations:^{ + self.mainToolbarHeightConstraint.constant = updatedHeight; + [self layoutIfNeeded]; + + // Update toolbar superview + if ([self.delegate respondsToSelector:@selector(roomInputToolbarView:heightDidChanged:completion:)]) + { + [self.delegate roomInputToolbarView:self heightDidChanged:updatedHeight completion:nil]; + } + }]; + } } - (void)updatePlaceholder @@ -219,19 +275,26 @@ self.placeholder = placeholder; } -- (void)setActiveCall:(BOOL)activeCall -{ - if (_activeCall != activeCall) - { - _activeCall = activeCall; +#pragma mark - Actions - self.voiceCallButton.hidden = (_activeCall || !self.rightInputToolbarButton.hidden); - self.hangupCallButton.hidden = (!_activeCall || !self.rightInputToolbarButton.hidden); +- (IBAction)cancelAction:(id)sender +{ + if ([self.delegate respondsToSelector:@selector(roomInputToolbarViewDidTapCancel:)]) + { + [self.delegate roomInputToolbarViewDidTapCancel:self]; } } #pragma mark - HPGrowingTextView delegate +- (BOOL)growingTextView:(HPGrowingTextView *)growingTextView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text +{ + NSString *newText = [growingTextView.text stringByReplacingCharactersInRange:range withString:text]; + [self updateSendButtonWithMessage:newText]; + + return YES; +} + - (void)growingTextViewDidChange:(HPGrowingTextView *)hpGrowingTextView { // Clean the carriage return added on return press @@ -241,32 +304,19 @@ } [super growingTextViewDidChange:hpGrowingTextView]; - - if (self.rightInputToolbarButton.isEnabled && self.rightInputToolbarButton.isHidden) - { - self.rightInputToolbarButton.hidden = NO; - self.attachMediaButton.hidden = YES; - self.voiceCallButton.hidden = YES; - self.hangupCallButton.hidden = YES; - - self.messageComposerContainerTrailingConstraint.constant = self.frame.size.width - self.rightInputToolbarButton.frame.origin.x + 4; - } - else if (!self.rightInputToolbarButton.isEnabled && !self.rightInputToolbarButton.isHidden) - { - self.rightInputToolbarButton.hidden = YES; - self.attachMediaButton.hidden = NO; - self.voiceCallButton.hidden = _activeCall; - self.hangupCallButton.hidden = !_activeCall; - - self.messageComposerContainerTrailingConstraint.constant = self.frame.size.width - self.attachMediaButton.frame.origin.x + 4; - } } - (void)growingTextView:(HPGrowingTextView *)hpGrowingTextView willChangeHeight:(float)height { // Update height of the main toolbar (message composer) - CGFloat updatedHeight = height + (self.messageComposerContainerTopConstraint.constant + self.messageComposerContainerBottomConstraint.constant); + CGFloat updatedHeight = height + (self.messageComposerContainerTopConstraint.constant + self.messageComposerContainerBottomConstraint.constant) + self.inputContextViewHeightConstraint.constant; + if (self.maxHeight && updatedHeight > self.maxHeight) + { + hpGrowingTextView.maxHeight -= updatedHeight - self.maxHeight; + updatedHeight = self.maxHeight; + } + if (updatedHeight < self.mainToolbarMinHeightConstraint.constant) { updatedHeight = self.mainToolbarMinHeightConstraint.constant; @@ -287,152 +337,7 @@ { if (button == self.attachMediaButton) { - // Check whether media attachment is supported - if ([self.delegate respondsToSelector:@selector(roomInputToolbarView:presentViewController:)]) - { - // Ask the user the kind of the call: voice or video? - actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; - - __weak typeof(self) weakSelf = self; - - [actionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_action_camera", @"Vector", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->actionSheet = nil; - - [self.delegate roomInputToolbarViewDidTapCamera:self]; - } - }]]; - - - [actionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_action_send_photo_or_video", @"Vector", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->actionSheet = nil; - - [self.delegate roomInputToolbarViewDidTapMediaLibrary:self]; - } - - }]]; - - if (BuildSettings.allowSendingStickers) - { - [actionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_action_send_sticker", @"Vector", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->actionSheet = nil; - - [self.delegate roomInputToolbarViewPresentStickerPicker:self]; - } - - }]]; - } - - [actionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_action_send_file", @"Vector", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->actionSheet = nil; - - [self.delegate roomInputToolbarViewDidTapFileUpload:self]; - } - }]]; - - [actionSheet addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] - style:UIAlertActionStyleCancel - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->actionSheet = nil; - } - - }]]; - - [actionSheet popoverPresentationController].sourceView = self.attachMediaButton; - [actionSheet popoverPresentationController].sourceRect = self.attachMediaButton.bounds; - [self.window.rootViewController presentViewController:actionSheet animated:YES completion:nil]; - } - else - { - NSLog(@"[RoomInputToolbarView] Attach media is not supported"); - } - } - else if (button == self.voiceCallButton) - { - if ([self.delegate respondsToSelector:@selector(roomInputToolbarView:placeCallWithVideo:)]) - { - // Ask the user the kind of the call: voice or video? - actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; - - __weak typeof(self) weakSelf = self; - [actionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"voice", @"Vector", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->actionSheet = nil; - - [self.delegate roomInputToolbarView:self placeCallWithVideo:NO]; - } - - }]]; - - [actionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"video", @"Vector", nil) - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->actionSheet = nil; - - [self.delegate roomInputToolbarView:self placeCallWithVideo:YES]; - } - - }]]; - - [actionSheet addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"] - style:UIAlertActionStyleCancel - handler:^(UIAlertAction * action) { - - if (weakSelf) - { - typeof(self) self = weakSelf; - self->actionSheet = nil; - } - - }]]; - - [actionSheet popoverPresentationController].sourceView = self.voiceCallButton; - [actionSheet popoverPresentationController].sourceRect = self.voiceCallButton.bounds; - [self.window.rootViewController presentViewController:actionSheet animated:YES completion:nil]; - } - } - else if (button == self.hangupCallButton) - { - if ([self.delegate respondsToSelector:@selector(roomInputToolbarViewHangupCall:)]) - { - [self.delegate roomInputToolbarViewHangupCall:self]; - } + self.actionMenuOpened = !self.isActionMenuOpened; } [super onTouchUpInside:button]; @@ -449,6 +354,75 @@ [super destroy]; } +- (void)updateSendButtonWithMessage:(NSString *)textMessage +{ + self.actionMenuOpened = NO; + + if (textMessage.length) + { + self.rightInputToolbarButton.alpha = 1; + self.messageComposerContainerTrailingConstraint.constant = self.frame.size.width - self.rightInputToolbarButton.frame.origin.x + 12; + } + else + { + self.rightInputToolbarButton.alpha = 0; + self.messageComposerContainerTrailingConstraint.constant = 12; + } + + [self layoutIfNeeded]; +} + +#pragma mark - properties + +- (void)setActionMenuOpened:(BOOL)actionMenuOpened +{ + if (_actionMenuOpened != actionMenuOpened) + { + _actionMenuOpened = actionMenuOpened; + + if (self->growingTextView.internalTextView.selectedRange.length > 0) + { + NSRange range = self->growingTextView.internalTextView.selectedRange; + range.location = range.location + range.length; + range.length = 0; + self->growingTextView.internalTextView.selectedRange = range; + } + + if (_actionMenuOpened) { + self.actionsBar.hidden = NO; + [self.actionsBar animateWithShowIn:_actionMenuOpened completion:nil]; + } + else + { + [self.actionsBar animateWithShowIn:_actionMenuOpened completion:^(BOOL finished) { + self.actionsBar.hidden = YES; + }]; + } + + [UIView animateWithDuration:kActionMenuAttachButtonAnimationDuration delay:0 usingSpringWithDamping:kActionMenuAttachButtonSpringDamping initialSpringVelocity:kActionMenuAttachButtonSpringVelocity options:UIViewAnimationOptionCurveEaseIn animations:^{ + self.attachMediaButton.transform = actionMenuOpened ? CGAffineTransformMakeRotation(M_PI * 3 / 4) : CGAffineTransformIdentity; + } completion:nil]; + + [UIView animateWithDuration:kActionMenuContentAlphaAnimationDuration delay:_actionMenuOpened ? 0 : .1 options:UIViewAnimationOptionCurveEaseIn animations:^{ + self->messageComposerContainer.alpha = actionMenuOpened ? 0 : 1; + self.rightInputToolbarButton.alpha = self->growingTextView.text.length == 0 || actionMenuOpened ? 0 : 1; + } completion:nil]; + + [UIView animateWithDuration:kActionMenuComposerHeightAnimationDuration animations:^{ + if (actionMenuOpened) + { + self.mainToolbarHeightConstraint.constant = self.mainToolbarMinHeightConstraint.constant; + } + else + { + [self->growingTextView refreshHeight]; + } + [self layoutIfNeeded]; + [self.delegate roomInputToolbarView:self heightDidChanged:self.mainToolbarHeightConstraint.constant completion:nil]; + }]; + } +} + #pragma mark - Clipboard - Handle image/data paste from general pasteboard - (void)paste:(id)sender diff --git a/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.xib b/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.xib index 8cab0f465..aef8b2f81 100644 --- a/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.xib +++ b/Riot/Modules/Room/Views/InputToolbar/RoomInputToolbarView.xib @@ -1,142 +1,126 @@ - + - + - + - + - - - + + - - - - - - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -152,31 +136,31 @@ + - - + + + + + - - - - - - + - - - - + + + + + diff --git a/Riot/Modules/Room/Views/Title/RoomTitleView.h b/Riot/Modules/Room/Views/Title/RoomTitleView.h index 882d79fda..d4295093f 100644 --- a/Riot/Modules/Room/Views/Title/RoomTitleView.h +++ b/Riot/Modules/Room/Views/Title/RoomTitleView.h @@ -35,9 +35,17 @@ @interface RoomTitleView : MXKRoomTitleView @property (weak, nonatomic) IBOutlet UIView *titleMask; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint *displayNameCenterXConstraint; -@property (weak, nonatomic) IBOutlet UIImageView *roomDetailsIconImageView; @property (weak, nonatomic) IBOutlet UIImageView *badgeImageView; +@property (weak, nonatomic) IBOutlet MXKImageView *pictureView; +@property (weak, nonatomic) IBOutlet UILabel *missedDiscussionsBadgeLabel; +@property (weak, nonatomic) IBOutlet UILabel *typingLabel; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *displayNameCenterYConstraint; +@property (weak, nonatomic) IBOutlet UIView *dotView; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *missedDiscussionsBadgeLabelLeadingConstraint; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *pictureViewHeightConstraint; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *pictureViewWidthConstraint; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *dotViewCenterXConstraint; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *dotViewCenterYConstraint; /** The room preview data may be used when mxRoom instance is not available @@ -49,9 +57,19 @@ */ @property (nonatomic) id tapGestureDelegate; +/** + the typing notification string to be displayed (default nil if notification is hidden). + */ +@property (copy, nonatomic) NSString *typingNotificationString; + /** The method used to handle the gesture recognized by a receiver. */ - (void)reportTapGesture:(UITapGestureRecognizer*)tapGestureRecognizer; +/** + update the layout of the title view according to the target orientation + */ +- (void)updateLayoutForOrientation:(UIInterfaceOrientation)orientation; + @end diff --git a/Riot/Modules/Room/Views/Title/RoomTitleView.m b/Riot/Modules/Room/Views/Title/RoomTitleView.m index 679fd719f..4829578ed 100644 --- a/Riot/Modules/Room/Views/Title/RoomTitleView.m +++ b/Riot/Modules/Room/Views/Title/RoomTitleView.m @@ -47,6 +47,8 @@ [tap setDelegate:self]; [self.titleMask addGestureRecognizer:tap]; self.titleMask.userInteractionEnabled = YES; + self.dotView.layer.masksToBounds = YES; + self.dotView.layer.cornerRadius = CGRectGetMidX(self.dotView.bounds); } } @@ -54,8 +56,8 @@ { [super layoutSubviews]; - self.roomDetailsIconImageView.image = self.roomDetailsIconImageView.image; - + self.pictureView.layer.cornerRadius = self.pictureView.bounds.size.width / 2.; + if (self.superview) { // Force the title view layout by adding 2 new constraints on the UINavigationBarContentView instance. @@ -84,7 +86,9 @@ self.backgroundColor = UIColor.clearColor; self.displayNameTextField.textColor = (self.mxRoom.summary.displayname.length ? ThemeService.shared.theme.textPrimaryColor : ThemeService.shared.theme.textSecondaryColor); - self.roomDetailsIconImageView.tintColor = ThemeService.shared.theme.textPrimaryColor; + self.typingLabel.textColor = ThemeService.shared.theme.textSecondaryColor; + self.dotView.backgroundColor = ThemeService.shared.theme.warningColor; + self.missedDiscussionsBadgeLabel.textColor = ThemeService.shared.theme.tintColor; } - (void)setRoomPreviewData:(RoomPreviewData *)roomPreviewData @@ -133,4 +137,58 @@ } } +- (void)updateLayoutForOrientation:(UIInterfaceOrientation)orientation +{ + if (UIInterfaceOrientationIsLandscape(orientation)) + { + self.missedDiscussionsBadgeLabel.font = [UIFont systemFontOfSize:10]; + self.missedDiscussionsBadgeLabelLeadingConstraint.constant = -24; + self.pictureViewWidthConstraint.constant = 28; + self.pictureViewHeightConstraint.constant = 28; + self.displayNameTextField.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium]; + self.typingLabel.font = [UIFont systemFontOfSize:10]; + self.dotViewCenterYConstraint.constant = -2; + } + else + { + self.missedDiscussionsBadgeLabel.font = [UIFont systemFontOfSize:15]; + self.missedDiscussionsBadgeLabelLeadingConstraint.constant = -32; + self.pictureViewWidthConstraint.constant = 32; + self.pictureViewHeightConstraint.constant = 32; + self.displayNameTextField.font = [UIFont systemFontOfSize:17 weight:UIFontWeightMedium]; + self.typingLabel.font = [UIFont systemFontOfSize:12]; + self.dotViewCenterYConstraint.constant = -1; + } +} + +- (void)setTypingNotificationString:(NSString *)typingNotificationString +{ + if (typingNotificationString.length > 0) + { + self.typingLabel.text = typingNotificationString; + [self layoutIfNeeded]; + + [UIView animateWithDuration:.1 animations:^{ + self.typingLabel.alpha = 1; + self.displayNameCenterYConstraint.constant = -8; + [self layoutIfNeeded]; + }]; + } + else + { + [UIView animateWithDuration:.1 animations:^{ + self.typingLabel.alpha = 0; + self.displayNameCenterYConstraint.constant = 0; + [self layoutIfNeeded]; + } completion:^(BOOL finished) { + self.typingLabel.text = nil; + }]; + } +} + +- (NSString *)typingNotificationString +{ + return self.typingLabel.text; +} + @end diff --git a/Riot/Modules/Room/Views/Title/RoomTitleView.xib b/Riot/Modules/Room/Views/Title/RoomTitleView.xib index 47d170601..d25cbdf79 100644 --- a/Riot/Modules/Room/Views/Title/RoomTitleView.xib +++ b/Riot/Modules/Room/Views/Title/RoomTitleView.xib @@ -1,9 +1,10 @@ - + - + + @@ -13,69 +14,101 @@ + + + + + + + + + + + + + + + + + + - + - - + + - + - - - - - - - - - + - - + + + - - - - - - + + + + - + + + + + - + - + - - + + + + + + + + + - - + + + + diff --git a/Riot/Modules/Rooms/ShowDirectory/Cells/Room/DirectoryRoomTableViewCell.swift b/Riot/Modules/Rooms/ShowDirectory/Cells/Room/DirectoryRoomTableViewCell.swift index 577ea6a02..2df14e8e2 100644 --- a/Riot/Modules/Rooms/ShowDirectory/Cells/Room/DirectoryRoomTableViewCell.swift +++ b/Riot/Modules/Rooms/ShowDirectory/Cells/Room/DirectoryRoomTableViewCell.swift @@ -97,7 +97,7 @@ extension DirectoryRoomTableViewCell: Themable { numberOfUsersLabel.textColor = theme.textSecondaryColor topicLabel.textColor = theme.textSecondaryColor - if viewModel.isJoined { + if let viewModel = viewModel, viewModel.isJoined { joinButton.backgroundColor = theme.backgroundColor joinButton.tintColor = theme.textSecondaryColor joinButton.layer.borderWidth = 1.0 diff --git a/Riot/Modules/Settings/Security/SecurityViewController.m b/Riot/Modules/Settings/Security/SecurityViewController.m index 291a02d73..c087bdfb6 100644 --- a/Riot/Modules/Settings/Security/SecurityViewController.m +++ b/Riot/Modules/Settings/Security/SecurityViewController.m @@ -329,42 +329,60 @@ TableViewSectionsDelegate> // Crypto sessions section - Section *sessionsSection = [Section sectionWithTag:SECTION_CRYPTO_SESSIONS]; - - sessionsSection.headerTitle = NSLocalizedStringFromTable(@"security_settings_crypto_sessions", @"Vector", nil); - - NSUInteger sessionsSectionRowsCount; - - if (self.showLoadingDevicesInformation) + if (RiotSettings.shared.settingsSecurityScreenShowSessions) { - sessionsSectionRowsCount = 2; - } else { - sessionsSectionRowsCount = devicesArray.count + 1; - } + Section *sessionsSection = [Section sectionWithTag:SECTION_CRYPTO_SESSIONS]; + + sessionsSection.headerTitle = NSLocalizedStringFromTable(@"security_settings_crypto_sessions", @"Vector", nil); + + NSUInteger sessionsSectionRowsCount; + + if (self.showLoadingDevicesInformation) + { + sessionsSectionRowsCount = 2; + } + else + { + sessionsSectionRowsCount = devicesArray.count + 1; + } - [sessionsSection addRowsWithCount:sessionsSectionRowsCount]; - - [sections addObject:sessionsSection]; + [sessionsSection addRowsWithCount:sessionsSectionRowsCount]; + + [sections addObject:sessionsSection]; + } // Secure backup - Section *secureBackupSection = [Section sectionWithTag:SECTION_SECURE_BACKUP]; secureBackupSection.headerTitle = NSLocalizedStringFromTable(@"security_settings_secure_backup", @"Vector", nil); - + [secureBackupSection addRowsWithCount:[self numberOfRowsInSecureBackupSection]]; - - [sections addObject:secureBackupSection]; + + if (secureBackupSection.rows.count) + { + [sections addObject:secureBackupSection]; + } // Cryptograhpy Section *cryptograhpySection = [Section sectionWithTag:SECTION_CRYPTOGRAPHY]; cryptograhpySection.headerTitle = NSLocalizedStringFromTable(@"security_settings_cryptography", @"Vector", nil); - [cryptograhpySection addRowsWithCount:CRYPTOGRAPHY_COUNT]; - - [sections addObject:cryptograhpySection]; + if (RiotSettings.shared.settingsSecurityScreenShowCryptographyInfo) + { + [cryptograhpySection addRowWithTag:CRYPTOGRAPHY_INFO]; + } + if (RiotSettings.shared.settingsSecurityScreenShowCryptographyExport) + { + [cryptograhpySection addRowWithTag:CRYPTOGRAPHY_EXPORT]; + } + + if (cryptograhpySection.rows.count) + { + [sections addObject:cryptograhpySection]; + } + #ifdef CROSS_SIGNING_AND_BACKUP_DEV // Cross-Signing @@ -392,11 +410,17 @@ TableViewSectionsDelegate> Section *advancedSection = [Section sectionWithTag:SECTION_ADVANCED]; advancedSection.headerTitle = NSLocalizedStringFromTable(@"security_settings_advanced", @"Vector", nil); - [advancedSection addRowWithTag:ADVANCED_BLACKLIST_UNVERIFIED_DEVICES]; - [advancedSection addRowWithTag:ADVANCED_BLACKLIST_UNVERIFIED_DEVICES_DESCRIPTION]; + if (RiotSettings.shared.settingsSecurityScreenShowAdvancedUnverifiedDevices) + { + [advancedSection addRowWithTag:ADVANCED_BLACKLIST_UNVERIFIED_DEVICES]; + [advancedSection addRowWithTag:ADVANCED_BLACKLIST_UNVERIFIED_DEVICES_DESCRIPTION]; + } - [sections addObject:advancedSection]; - + if (advancedSection.rows.count) + { + [sections addObject:advancedSection]; + } + // Update sections self.tableViewSections.sections = sections; @@ -853,28 +877,36 @@ TableViewSectionsDelegate> - (void)refreshSecureBackupSectionData { MXRecoveryService *recoveryService = self.mainSession.crypto.recoveryService; + NSMutableArray *secureBackupSectionState = [NSMutableArray new]; if (recoveryService.hasRecovery) { - secureBackupSectionState = @[ - @(SECURE_BACKUP_RESTORE), - @(SECURE_BACKUP_DELETE), - @(SECURE_BACKUP_DESCRIPTION), - //@(SECURE_BACKUP_MANAGE_MANUALLY), - ]; + if (RiotSettings.shared.settingsSecurityScreenShowRestoreBackup) + { + [secureBackupSectionState addObject:@(SECURE_BACKUP_RESTORE)]; + } + if (RiotSettings.shared.settingsSecurityScreenShowDeleteBackup) + { + [secureBackupSectionState addObject:@(SECURE_BACKUP_DELETE)]; + } } else { - secureBackupSectionState = @[ - @(SECURE_BACKUP_SETUP), - @(SECURE_BACKUP_DESCRIPTION), - //@(SECURE_BACKUP_MANAGE_MANUALLY), - ]; + if (RiotSettings.shared.settingsSecurityScreenShowSetupBackup) + { + [secureBackupSectionState addObject:@(SECURE_BACKUP_SETUP)]; + } } + if (secureBackupSectionState.count) + { + [secureBackupSectionState addObject:@(SECURE_BACKUP_DESCRIPTION)]; + } + #ifdef CROSS_SIGNING_AND_BACKUP_DEV - secureBackupSectionState = [@[@(SECURE_BACKUP_INFO)] arrayByAddingObjectsFromArray:secureBackupSectionState]; + [secureBackupSectionState addObject:@(SECURE_BACKUP_INFO)]; #endif + self->secureBackupSectionState = secureBackupSectionState; } - (NSUInteger)secureBackupSectionEnumForRow:(NSUInteger)row diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index fdac6daff..12adb0364 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -300,7 +300,10 @@ TableViewSectionsDelegate> Section *sectionUserSettings = [Section sectionWithTag:SECTION_TAG_USER_SETTINGS]; [sectionUserSettings addRowWithTag:USER_SETTINGS_PROFILE_PICTURE_INDEX]; [sectionUserSettings addRowWithTag:USER_SETTINGS_DISPLAYNAME_INDEX]; - [sectionUserSettings addRowWithTag:USER_SETTINGS_CHANGE_PASSWORD_INDEX]; + if (RiotSettings.shared.settingsScreenShowChangePassword) + { + [sectionUserSettings addRowWithTag:USER_SETTINGS_CHANGE_PASSWORD_INDEX]; + } if (BuildSettings.settingsScreenShowUserFirstName) { [sectionUserSettings addRowWithTag:USER_SETTINGS_FIRST_NAME_INDEX]; @@ -332,8 +335,10 @@ TableViewSectionsDelegate> { [sectionUserSettings addRowWithTag:USER_SETTINGS_THREEPIDS_INFORMATION_INDEX]; } - - [sectionUserSettings addRowWithTag:USER_SETTINGS_INVITE_FRIENDS_INDEX]; + if (RiotSettings.shared.settingsScreenShowInviteFriends) + { + [sectionUserSettings addRowWithTag:USER_SETTINGS_INVITE_FRIENDS_INDEX]; + } sectionUserSettings.headerTitle = NSLocalizedStringFromTable(@"settings_user_settings", @"Vector", nil); [tmpSections addObject:sectionUserSettings]; @@ -355,10 +360,18 @@ TableViewSectionsDelegate> if (BuildSettings.allowVoIPUsage && BuildSettings.stunServerFallbackUrlString) { Section *sectionCalls = [Section sectionWithTag:SECTION_TAG_CALLS]; - [sectionCalls addRowWithTag:CALLS_ENABLE_STUN_SERVER_FALLBACK_INDEX]; - [sectionCalls addRowWithTag:CALLS_STUN_SERVER_FALLBACK_DESCRIPTION_INDEX]; sectionCalls.headerTitle = NSLocalizedStringFromTable(@"settings_calls_settings", @"Vector", nil); - [tmpSections addObject:sectionCalls]; + + if (RiotSettings.shared.settingsScreenShowEnableStunServerFallback) + { + [sectionCalls addRowWithTag:CALLS_ENABLE_STUN_SERVER_FALLBACK_INDEX]; + [sectionCalls addRowWithTag:CALLS_STUN_SERVER_FALLBACK_DESCRIPTION_INDEX]; + } + + if (sectionCalls.rows.count) + { + [tmpSections addObject:sectionCalls]; + } } if (BuildSettings.settingsScreenShowDiscoverySettings) @@ -432,9 +445,18 @@ TableViewSectionsDelegate> Section *sectionOther = [Section sectionWithTag:SECTION_TAG_OTHER]; [sectionOther addRowWithTag:OTHER_VERSION_INDEX]; [sectionOther addRowWithTag:OTHER_OLM_VERSION_INDEX]; - [sectionOther addRowWithTag:OTHER_COPYRIGHT_INDEX]; - [sectionOther addRowWithTag:OTHER_TERM_CONDITIONS_INDEX]; - [sectionOther addRowWithTag:OTHER_PRIVACY_INDEX]; + if (BuildSettings.applicationCopyrightUrlString.length) + { + [sectionOther addRowWithTag:OTHER_COPYRIGHT_INDEX]; + } + if (BuildSettings.applicationTermsConditionsUrlString.length) + { + [sectionOther addRowWithTag:OTHER_TERM_CONDITIONS_INDEX]; + } + if (BuildSettings.applicationPrivacyPolicyUrlString.length) + { + [sectionOther addRowWithTag:OTHER_PRIVACY_INDEX]; + } [sectionOther addRowWithTag:OTHER_THIRD_PARTY_INDEX]; [sectionOther addRowWithTag:OTHER_SHOW_NSFW_ROOMS_INDEX]; diff --git a/Riot/Modules/StartChat/StartChatViewController.m b/Riot/Modules/StartChat/StartChatViewController.m index eb35cd1fb..421ac343e 100644 --- a/Riot/Modules/StartChat/StartChatViewController.m +++ b/Riot/Modules/StartChat/StartChatViewController.m @@ -133,6 +133,12 @@ - (void)setupInviteFriendsHeaderView { + if (!RiotSettings.shared.allowInviteExernalUsers) + { + self.contactsTableView.tableHeaderView = nil; + return; + } + InviteFriendsHeaderView *inviteFriendsHeaderView = [InviteFriendsHeaderView instantiate]; inviteFriendsHeaderView.delegate = self; self.contactsTableView.tableHeaderView = inviteFriendsHeaderView; diff --git a/Riot/Modules/TabBar/MasterTabBarController.m b/Riot/Modules/TabBar/MasterTabBarController.m index d532bfdca..dd7a3e9f2 100644 --- a/Riot/Modules/TabBar/MasterTabBarController.m +++ b/Riot/Modules/TabBar/MasterTabBarController.m @@ -130,6 +130,8 @@ }]; [self userInterfaceThemeDidChange]; + + [self updateTabs]; } - (void)userInterfaceThemeDidChange @@ -880,38 +882,75 @@ #pragma mark - +- (void)updateTabs +{ + if (RiotSettings.shared.homeScreenShowCommunitiesTab && RiotSettings.shared.homeScreenShowRoomsTab + && RiotSettings.shared.homeScreenShowPeopleTab && RiotSettings.shared.homeScreenShowFavouritesTab) + { + return; + } + + NSMutableArray *newTabs = [NSMutableArray arrayWithArray:self.viewControllers]; + if (!RiotSettings.shared.homeScreenShowCommunitiesTab) + { + [newTabs removeObjectAtIndex:TABBAR_GROUPS_INDEX]; + } + if (!RiotSettings.shared.homeScreenShowRoomsTab) + { + [newTabs removeObjectAtIndex:TABBAR_ROOMS_INDEX]; + } + if (!RiotSettings.shared.homeScreenShowPeopleTab) + { + [newTabs removeObjectAtIndex:TABBAR_PEOPLE_INDEX]; + } + if (!RiotSettings.shared.homeScreenShowFavouritesTab) + { + [newTabs removeObjectAtIndex:TABBAR_FAVOURITES_INDEX]; + } + self.viewControllers = newTabs; +} + - (void)refreshTabBarBadges { // Use a middle dot to signal missed notif in favourites - [self setMissedDiscussionsMark:(recentsDataSource.missedFavouriteDiscussionsCount? @"\u00B7": nil) - onTabBarItem:TABBAR_FAVOURITES_INDEX - withBadgeColor:(recentsDataSource.missedHighlightFavouriteDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + if (RiotSettings.shared.homeScreenShowFavouritesTab) + { + [self setMissedDiscussionsMark:(recentsDataSource.missedFavouriteDiscussionsCount? @"\u00B7": nil) + onTabBarItem:TABBAR_FAVOURITES_INDEX + withBadgeColor:(recentsDataSource.missedHighlightFavouriteDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + } // Update the badge on People and Rooms tabs - if (recentsDataSource.unsentMessagesDirectDiscussionsCount) + if (RiotSettings.shared.homeScreenShowPeopleTab) { - [self setBadgeValue:@"!" - onTabBarItem:TABBAR_PEOPLE_INDEX - withBadgeColor:ThemeService.shared.theme.noticeColor]; - } - else - { - [self setMissedDiscussionsCount:recentsDataSource.missedDirectDiscussionsCount - onTabBarItem:TABBAR_PEOPLE_INDEX - withBadgeColor:(recentsDataSource.missedHighlightDirectDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + if (recentsDataSource.unsentMessagesDirectDiscussionsCount) + { + [self setBadgeValue:@"!" + onTabBarItem:TABBAR_PEOPLE_INDEX + withBadgeColor:ThemeService.shared.theme.noticeColor]; + } + else + { + [self setMissedDiscussionsCount:recentsDataSource.missedDirectDiscussionsCount + onTabBarItem:TABBAR_PEOPLE_INDEX + withBadgeColor:(recentsDataSource.missedHighlightDirectDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + } } - if (recentsDataSource.unsentMessagesGroupDiscussionsCount) + if (RiotSettings.shared.homeScreenShowRoomsTab) { - [self setMissedDiscussionsCount:recentsDataSource.unsentMessagesGroupDiscussionsCount - onTabBarItem:TABBAR_ROOMS_INDEX - withBadgeColor:ThemeService.shared.theme.noticeColor]; - } - else - { - [self setMissedDiscussionsCount:recentsDataSource.missedGroupDiscussionsCount - onTabBarItem:TABBAR_ROOMS_INDEX - withBadgeColor:(recentsDataSource.missedHighlightGroupDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + if (recentsDataSource.unsentMessagesGroupDiscussionsCount) + { + [self setMissedDiscussionsCount:recentsDataSource.unsentMessagesGroupDiscussionsCount + onTabBarItem:TABBAR_ROOMS_INDEX + withBadgeColor:ThemeService.shared.theme.noticeColor]; + } + else + { + [self setMissedDiscussionsCount:recentsDataSource.missedGroupDiscussionsCount + onTabBarItem:TABBAR_ROOMS_INDEX + withBadgeColor:(recentsDataSource.missedHighlightGroupDiscussionsCount ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor)]; + } } } @@ -922,39 +961,47 @@ - (void)setBadgeValue:(NSString *)value onTabBarItem:(NSUInteger)index withBadgeColor:(UIColor*)badgeColor { - if (value) + NSInteger itemIndex = [self indexOfTabItemWithTag:index]; + if (itemIndex != NSNotFound) { - self.tabBar.items[index].badgeValue = value; - - self.tabBar.items[index].badgeColor = badgeColor; - - [self.tabBar.items[index] setBadgeTextAttributes:@{ - NSForegroundColorAttributeName: ThemeService.shared.theme.baseTextPrimaryColor - } - forState:UIControlStateNormal]; - } - else - { - self.tabBar.items[index].badgeValue = nil; + if (value) + { + self.tabBar.items[itemIndex].badgeValue = value; + + self.tabBar.items[itemIndex].badgeColor = badgeColor; + + [self.tabBar.items[itemIndex] setBadgeTextAttributes:@{ + NSForegroundColorAttributeName: ThemeService.shared.theme.baseTextPrimaryColor + } + forState:UIControlStateNormal]; + } + else + { + self.tabBar.items[itemIndex].badgeValue = nil; + } } } - (void)setMissedDiscussionsMark:(NSString*)mark onTabBarItem:(NSUInteger)index withBadgeColor:(UIColor*)badgeColor { - if (mark) + NSInteger itemIndex = [self indexOfTabItemWithTag:index]; + if (itemIndex != NSNotFound) { - self.tabBar.items[index].badgeValue = mark; - - self.tabBar.items[index].badgeColor = badgeColor; - - [self.tabBar.items[index] setBadgeTextAttributes:@{ - NSForegroundColorAttributeName: ThemeService.shared.theme.baseTextPrimaryColor - } - forState:UIControlStateNormal]; - } - else - { - self.tabBar.items[index].badgeValue = nil; + if (mark) + { + self.tabBar.items[itemIndex].badgeValue = mark; + + self.tabBar.items[itemIndex].badgeColor = badgeColor; + + [self.tabBar.items[itemIndex] setBadgeTextAttributes:@{ + NSForegroundColorAttributeName: ThemeService.shared.theme.baseTextPrimaryColor + } + forState:UIControlStateNormal]; + } + else + { + self.tabBar.items[itemIndex].badgeValue = nil; + } } } @@ -975,6 +1022,19 @@ return badgeValue; } +- (NSInteger)indexOfTabItemWithTag:(NSUInteger)tag +{ + for (int i = 0 ; i < self.tabBar.items.count ; i++) + { + if (self.tabBar.items[i].tag == tag) + { + return i; + } + } + + return NSNotFound; +} + #pragma mark - - (void)promptUserBeforeUsingAnalytics diff --git a/Riot/SupportingFiles/Riot-Bridging-Header.h b/Riot/SupportingFiles/Riot-Bridging-Header.h index fbf30cb3a..7daa40759 100644 --- a/Riot/SupportingFiles/Riot-Bridging-Header.h +++ b/Riot/SupportingFiles/Riot-Bridging-Header.h @@ -23,9 +23,12 @@ #import "DirectoryServerPickerViewController.h" #import "MXSession+Riot.h" #import "RoomFilesViewController.h" +#import "RoomSearchViewController.h" +#import "IntegrationManagerViewController.h" #import "RoomSettingsViewController.h" #import "JitsiWidgetData.h" #import "InviteRecentTableViewCell.h" #import "AuthFallBackViewController.h" #import "CallViewController.h" #import "MatrixContactsDataSource.h" +#import "TypingUserInfo.h" diff --git a/RiotNSE/NotificationService.swift b/RiotNSE/NotificationService.swift index 45f9b2b6e..a7def37e1 100644 --- a/RiotNSE/NotificationService.swift +++ b/RiotNSE/NotificationService.swift @@ -264,147 +264,188 @@ class NotificationService: UNNotificationServiceExtension { NSLog("[NotificationService] notificationContentForEvent: Attempt to fetch the room state") - NotificationService.backgroundSyncService.roomState(forRoomId: roomId, completion: { (response) in + self.context(ofEvent: event, inRoom: roomId, completion: { (response) in switch response { - case .success(let roomState): - var notificationTitle: String? - var notificationBody: String? - - var threadIdentifier: String? = roomId - let eventSenderName = roomState.members.memberName(event.sender) - let currentUserId = account.mxCredentials.userId - let roomDisplayName = roomSummary?.displayname - let pushRule = NotificationService.backgroundSyncService.pushRule(matching: event, roomState: roomState) - - switch event.eventType { - case .callInvite: - let offer = event.content["offer"] as? [AnyHashable: Any] - let sdp = offer?["sdp"] as? String - let isVideoCall = sdp?.contains("m=video") ?? false + case .success(let (roomState, eventSenderName)): + var notificationTitle: String? + var notificationBody: String? - if isVideoCall { - notificationBody = NSString.localizedUserNotificationString(forKey: "VIDEO_CALL_FROM_USER", arguments: [eventSenderName as Any]) - } else { - notificationBody = NSString.localizedUserNotificationString(forKey: "VOICE_CALL_FROM_USER", arguments: [eventSenderName as Any]) - } + var threadIdentifier: String? = roomId + let currentUserId = account.mxCredentials.userId + let roomDisplayName = roomSummary?.displayname + let pushRule = NotificationService.backgroundSyncService.pushRule(matching: event, roomState: roomState) - // call notifications should stand out from normal messages, so we don't stack them - threadIdentifier = nil - self.sendVoipPush(forEvent: event) - case .roomMessage, .roomEncrypted: - if isRoomMentionsOnly { - // A local notification will be displayed only for highlighted notification. - var isHighlighted = false - - // Check whether is there an highlight tweak on it - for ruleAction in pushRule?.actions ?? [] { - guard let action = ruleAction as? MXPushRuleAction else { continue } - guard action.actionType == MXPushRuleActionTypeSetTweak else { continue } - guard action.parameters["set_tweak"] as? String == "highlight" else { continue } - // Check the highlight tweak "value" - // If not present, highlight. Else check its value before highlighting - if nil == action.parameters["value"] || true == (action.parameters["value"] as? Bool) { - isHighlighted = true - break + switch event.eventType { + case .callInvite: + let offer = event.content["offer"] as? [AnyHashable: Any] + let sdp = offer?["sdp"] as? String + let isVideoCall = sdp?.contains("m=video") ?? false + + if isVideoCall { + notificationBody = NSString.localizedUserNotificationString(forKey: "VIDEO_CALL_FROM_USER", arguments: [eventSenderName as Any]) + } else { + notificationBody = NSString.localizedUserNotificationString(forKey: "VOICE_CALL_FROM_USER", arguments: [eventSenderName as Any]) + } + + // call notifications should stand out from normal messages, so we don't stack them + threadIdentifier = nil + self.sendVoipPush(forEvent: event) + case .roomMessage, .roomEncrypted: + if isRoomMentionsOnly { + // A local notification will be displayed only for highlighted notification. + var isHighlighted = false + + // Check whether is there an highlight tweak on it + for ruleAction in pushRule?.actions ?? [] { + guard let action = ruleAction as? MXPushRuleAction else { continue } + guard action.actionType == MXPushRuleActionTypeSetTweak else { continue } + guard action.parameters["set_tweak"] as? String == "highlight" else { continue } + // Check the highlight tweak "value" + // If not present, highlight. Else check its value before highlighting + if nil == action.parameters["value"] || true == (action.parameters["value"] as? Bool) { + isHighlighted = true + break + } + } + + if !isHighlighted { + // Ignore this notif. + NSLog("[NotificationService] notificationContentForEvent: Ignore non highlighted notif in mentions only room") + onComplete(nil) + return + } + } + + var msgType = event.content["msgtype"] as? String + let messageContent = event.content["body"] as? String + + if event.isEncrypted && !self.showDecryptedContentInNotifications { + // Hide the content + msgType = nil + } + + // Display the room name only if it is different than the sender name + if roomDisplayName != nil && roomDisplayName != eventSenderName { + notificationTitle = NSString.localizedUserNotificationString(forKey: "MSG_FROM_USER_IN_ROOM_TITLE", arguments: [eventSenderName as Any, roomDisplayName as Any]) + + if msgType == kMXMessageTypeText { + notificationBody = messageContent + } else if msgType == kMXMessageTypeEmote { + notificationBody = NSString.localizedUserNotificationString(forKey: "ACTION_FROM_USER", arguments: [eventSenderName as Any, messageContent as Any]) + } else if msgType == kMXMessageTypeImage { + notificationBody = NSString.localizedUserNotificationString(forKey: "IMAGE_FROM_USER", arguments: [eventSenderName as Any, messageContent as Any]) + } else { + // Encrypted messages falls here + notificationBody = NSString.localizedUserNotificationString(forKey: "MESSAGE", arguments: []) + } + } else { + notificationTitle = eventSenderName + + switch msgType { + case kMXMessageTypeText: + notificationBody = messageContent + break + case kMXMessageTypeEmote: + notificationBody = NSString.localizedUserNotificationString(forKey: "ACTION_FROM_USER", arguments: [eventSenderName as Any, messageContent as Any]) + break + case kMXMessageTypeImage: + notificationBody = NSString.localizedUserNotificationString(forKey: "IMAGE_FROM_USER", arguments: [eventSenderName as Any, messageContent as Any]) + break + default: + // Encrypted messages falls here + notificationBody = NSString.localizedUserNotificationString(forKey: "MESSAGE", arguments: []) + break + } } - } - - if !isHighlighted { - // Ignore this notif. - NSLog("[NotificationService] notificationContentForEvent: Ignore non highlighted notif in mentions only room") - onComplete(nil) - return - } - } - - var msgType = event.content["msgtype"] as? String - let messageContent = event.content["body"] as? String - - if event.isEncrypted && !self.showDecryptedContentInNotifications { - // Hide the content - msgType = nil - } - - // Display the room name only if it is different than the sender name - if roomDisplayName != nil && roomDisplayName != eventSenderName { - notificationTitle = NSString.localizedUserNotificationString(forKey: "MSG_FROM_USER_IN_ROOM_TITLE", arguments: [eventSenderName as Any, roomDisplayName as Any]) - - if msgType == kMXMessageTypeText { - notificationBody = messageContent - } else if msgType == kMXMessageTypeEmote { - notificationBody = NSString.localizedUserNotificationString(forKey: "ACTION_FROM_USER", arguments: [eventSenderName as Any, messageContent as Any]) - } else if msgType == kMXMessageTypeImage { - notificationBody = NSString.localizedUserNotificationString(forKey: "IMAGE_FROM_USER", arguments: [eventSenderName as Any, messageContent as Any]) - } else { - // Encrypted messages falls here - notificationBody = NSString.localizedUserNotificationString(forKey: "MESSAGE", arguments: []) - } - } else { - notificationTitle = eventSenderName - - switch msgType { - case kMXMessageTypeText: - notificationBody = messageContent - break - case kMXMessageTypeEmote: - notificationBody = NSString.localizedUserNotificationString(forKey: "ACTION_FROM_USER", arguments: [eventSenderName as Any, messageContent as Any]) - break - case kMXMessageTypeImage: - notificationBody = NSString.localizedUserNotificationString(forKey: "IMAGE_FROM_USER", arguments: [eventSenderName as Any, messageContent as Any]) break + case .roomMember: + if roomDisplayName != nil && roomDisplayName != eventSenderName { + notificationBody = NSString.localizedUserNotificationString(forKey: "USER_INVITE_TO_NAMED_ROOM", arguments: [eventSenderName as Any, roomDisplayName as Any]) + } else { + notificationBody = NSString.localizedUserNotificationString(forKey: "USER_INVITE_TO_CHAT", arguments: [eventSenderName as Any]) + } + case .sticker: + if roomDisplayName != nil && roomDisplayName != eventSenderName { + notificationTitle = NSString.localizedUserNotificationString(forKey: "MSG_FROM_USER_IN_ROOM_TITLE", arguments: [eventSenderName as Any, roomDisplayName as Any]) + } else { + notificationTitle = eventSenderName + } + + notificationBody = NSString.localizedUserNotificationString(forKey: "STICKER_FROM_USER", arguments: [eventSenderName as Any]) default: - // Encrypted messages falls here - notificationBody = NSString.localizedUserNotificationString(forKey: "MESSAGE", arguments: []) break - } - } - break - case .roomMember: - if roomDisplayName != nil && roomDisplayName != eventSenderName { - notificationBody = NSString.localizedUserNotificationString(forKey: "USER_INVITE_TO_NAMED_ROOM", arguments: [eventSenderName as Any, roomDisplayName as Any]) - } else { - notificationBody = NSString.localizedUserNotificationString(forKey: "USER_INVITE_TO_CHAT", arguments: [eventSenderName as Any]) - } - case .sticker: - if roomDisplayName != nil && roomDisplayName != eventSenderName { - notificationTitle = NSString.localizedUserNotificationString(forKey: "MSG_FROM_USER_IN_ROOM_TITLE", arguments: [eventSenderName as Any, roomDisplayName as Any]) - } else { - notificationTitle = eventSenderName } - notificationBody = NSString.localizedUserNotificationString(forKey: "STICKER_FROM_USER", arguments: [eventSenderName as Any]) - default: - break - } - - if self.localAuthenticationService.isProtectionSet { - NSLog("[NotificationService] notificationContentForEvent: Resetting title and body because app protection is set") - notificationBody = NSString.localizedUserNotificationString(forKey: "MESSAGE_PROTECTED", arguments: []) - notificationTitle = nil - } - - guard notificationBody != nil else { - NSLog("[NotificationService] notificationContentForEvent: notificationBody is nil") + if self.localAuthenticationService.isProtectionSet { + NSLog("[NotificationService] notificationContentForEvent: Resetting title and body because app protection is set") + notificationBody = NSString.localizedUserNotificationString(forKey: "MESSAGE_PROTECTED", arguments: []) + notificationTitle = nil + } + + guard notificationBody != nil else { + NSLog("[NotificationService] notificationContentForEvent: notificationBody is nil") + onComplete(nil) + return + } + + let notificationContent = self.notificationContent(withTitle: notificationTitle, + body: notificationBody, + threadIdentifier: threadIdentifier, + userId: currentUserId, + event: event, + pushRule: pushRule) + + NSLog("[NotificationService] notificationContentForEvent: Calling onComplete.") + onComplete(notificationContent) + case .failure(let error): + NSLog("[NotificationService] notificationContentForEvent: error: \(error)") onComplete(nil) - return - } - - let notificationContent = self.notificationContent(withTitle: notificationTitle, - body: notificationBody, - threadIdentifier: threadIdentifier, - userId: currentUserId, - event: event, - pushRule: pushRule) - - NSLog("[NotificationService] notificationContentForEvent: Calling onComplete.") - onComplete(notificationContent) - case .failure(let error): - NSLog("[NotificationService] notificationContentForEvent: error: \(error)") - onComplete(nil) } }) } + /// Get the context of an event. + /// - Parameters: + /// - event: the event + /// - roomId: the id of the room of the event. + /// - completion: Completion block that will return the room state and the sender display name. + private func context(ofEvent event: MXEvent, inRoom roomId: String, + completion: @escaping (MXResponse<(MXRoomState, String)>) -> Void) { + // First get the room state + NotificationService.backgroundSyncService.roomState(forRoomId: roomId) { (response) in + switch response { + case .success(let roomState): + // Extract the member name from room state member + let eventSender = event.sender! + let eventSenderName = roomState.members.memberName(eventSender) ?? eventSender + + // Check if we are happy with it + if eventSenderName != eventSender + || roomState.members.member(withUserId: eventSender) != nil { + completion(.success((roomState, eventSenderName))) + return + } + + // Else, if the room member is not known, use the user profile to avoid to display a Matrix id + NotificationService.backgroundSyncService.profile(ofMember: eventSender, inRoom: roomId) { (response) in + switch response { + case .success((let displayName, _)): + guard let displayName = displayName else { + completion(.success((roomState, eventSender))) + return + } + completion(.success((roomState, displayName))) + + case .failure(_): + completion(.success((roomState, eventSender))) + } + } + case .failure(let error): + completion(.failure(error)) + } + } + } + private func notificationContent(withTitle title: String?, body: String?, threadIdentifier: String?, diff --git a/RiotTests/Debug.xcconfig b/RiotTests/Debug.xcconfig new file mode 100644 index 000000000..be053c75b --- /dev/null +++ b/RiotTests/Debug.xcconfig @@ -0,0 +1,20 @@ +// +// Copyright 2020 Vector Creations Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// Configuration settings file format documentation can be found at: +// https://help.apple.com/xcode/#/dev745c5c974 + +#include "Pods/Target Support Files/Pods-RiotTests/Pods-RiotTests.debug.xcconfig" diff --git a/RiotTests/EmojiStoreTests.swift b/RiotTests/EmojiStoreTests.swift new file mode 100644 index 000000000..56742ac98 --- /dev/null +++ b/RiotTests/EmojiStoreTests.swift @@ -0,0 +1,72 @@ +/* + Copyright 2021 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import XCTest + +@testable import Riot + +class EmojiStoreTests: XCTestCase { + + private lazy var store = loadStore() + + // MARK: - Tests + + func testFinds๐Ÿ’ฏWhenSearchingForHundred() { + find("hundred", expect: "๐Ÿ’ฏ") + } + + func testFinds๐Ÿ’ฏWhenSearchingFor100() { + find("100", expect: "๐Ÿ’ฏ") + } + + func testFinds2๏ธโƒฃWhenSearchingForTwo() { + find("two", expect: "2๏ธโƒฃ") + } + + func testFinds2๏ธโƒฃWhenSearchingFor2() { + find("2", expect: "2๏ธโƒฃ") + } + + // MARK: - Helpers + + private func loadStore() -> EmojiStore { + let store = EmojiStore() + let emojiService = EmojiMartService() + let expectation = self.expectation(description: "The wai-ai-ting is the hardest part") + + emojiService.getEmojiCategories { response in + switch response { + case .success(let categories): + store.set(categories) + expectation.fulfill() + case .failure(let error): + XCTFail("Failed to load emojis: \(error)") + } + } + + waitForExpectations(timeout: 2) { error in + XCTAssertNil(error) + } + + return store + } + + private func find(_ searchText: String, expect emoji: String) { + let emojis = store.findEmojiItemsSortedByCategory(with: searchText).flatMap { $0.emojis.map { $0.value } } + XCTAssert(emojis.contains(emoji), "Search text \"\(searchText)\" should find \"\(emoji)\" but only found \(emojis)") + } + +} diff --git a/RiotTests/Release.xcconfig b/RiotTests/Release.xcconfig new file mode 100644 index 000000000..5a62ed9cd --- /dev/null +++ b/RiotTests/Release.xcconfig @@ -0,0 +1,20 @@ +// +// Copyright 2020 Vector Creations Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// Configuration settings file format documentation can be found at: +// https://help.apple.com/xcode/#/dev745c5c974 + +#include "Pods/Target Support Files/Pods-RiotTests/Pods-RiotTests.release.xcconfig" diff --git a/RiotTests/target.yml b/RiotTests/target.yml index 83cd4c55e..fa2288a2e 100644 --- a/RiotTests/target.yml +++ b/RiotTests/target.yml @@ -33,15 +33,19 @@ targets: dependencies: - target: Riot + configFiles: + Debug: Debug.xcconfig + Release: Release.xcconfig + settings: base: BUNDLE_LOADER: $(TEST_HOST) FRAMEWORK_SEARCH_PATHS: $(SDKROOT)/Developer/Library/Frameworks $(inherited) - INFOPLIST_FILE: Info.plist + INFOPLIST_FILE: RiotTests/Info.plist LD_RUNPATH_SEARCH_PATHS: $(inherited) @executable_path/Frameworks @loader_path/Frameworks PRODUCT_BUNDLE_IDENTIFIER: org.matrix.$(PRODUCT_NAME:rfc1034identifier) PRODUCT_NAME: RiotTests - SWIFT_OBJC_BRIDGING_HEADER: RiotTests-Bridging-Header.h + SWIFT_OBJC_BRIDGING_HEADER: RiotTests/RiotTests-Bridging-Header.h TEST_HOST: $(BUILT_PRODUCTS_DIR)/Riot.app/Riot configs: Debug: @@ -49,4 +53,14 @@ targets: PROVISIONING_PROFILE: $(RIOT_PROVISIONING_PROFILE) PROVISIONING_PROFILE_SPECIFIER: $(RIOT_PROVISIONING_PROFILE_SPECIFIER) - sources: . + sources: + - path: . + - path: ../Config/Configurable.swift + - path: ../Config/BuildSettings.swift + - path: ../Config/AppConfiguration.swift + - path: ../Config/CommonConfiguration.swift + - path: ../Riot/Categories/Bundle.swift + - path: ../Riot/Generated/InfoPlist.swift + - path: ../Riot/Managers/Settings/RiotSettings.swift + - path: ../Riot/Managers/EncryptionKeyManager/EncryptionKeyManager.swift + - path: ../Riot/Managers/KeyValueStorage/