Merge pull request #5364 from vector-im/release/1.6.12/release

Release 1.6.12
This commit is contained in:
Doug 2022-01-11 14:09:10 +00:00 committed by GitHub
commit 953d29b6cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
231 changed files with 8790 additions and 893 deletions

View file

@ -11,6 +11,7 @@ on:
env: env:
# Make the git branch for a PR available to our Fastfile # Make the git branch for a PR available to our Fastfile
MX_GIT_BRANCH: ${{ github.event.pull_request.head.ref }} MX_GIT_BRANCH: ${{ github.event.pull_request.head.ref }}
MapTilerAPIKey: ${{ secrets.MAPTILER_API_KEY }}
jobs: jobs:
build: build:

View file

@ -12,6 +12,7 @@ on:
env: env:
# Make the git branch for a PR available to our Fastfile # Make the git branch for a PR available to our Fastfile
MX_GIT_BRANCH: ${{ github.event.pull_request.head.ref }} MX_GIT_BRANCH: ${{ github.event.pull_request.head.ref }}
MapTilerAPIKey: ${{ secrets.MAPTILER_API_KEY }}
jobs: jobs:
tests: tests:

View file

@ -11,6 +11,7 @@ on:
env: env:
# Make the git branch for a PR available to our Fastfile # Make the git branch for a PR available to our Fastfile
MX_GIT_BRANCH: ${{ github.event.pull_request.head.ref }} MX_GIT_BRANCH: ${{ github.event.pull_request.head.ref }}
MapTilerAPIKey: ${{ secrets.MAPTILER_API_KEY }}
jobs: jobs:
build: build:

View file

@ -1,3 +1,15 @@
## Changes in 1.6.12 (2022-01-11)
🙌 Improvements
- Upgrade MatrixSDK version ([v0.20.16](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.20.16)).
- Analytics: Replace Matomo with PostHog. ([#5035](https://github.com/vector-im/element-ios/issues/5035))
🐛 Bugfixes
- RoomVC: Fix left room reason label memory management. ([#5311](https://github.com/vector-im/element-ios/issues/5311))
## Changes in 1.6.11 (2021-12-14) ## Changes in 1.6.11 (2021-12-14)
✨ Features ✨ Features

View file

@ -15,5 +15,5 @@
// //
// Version // Version
MARKETING_VERSION = 1.6.11 MARKETING_VERSION = 1.6.12
CURRENT_PROJECT_VERSION = 1.6.11 CURRENT_PROJECT_VERSION = 1.6.12

View file

@ -15,6 +15,7 @@
// //
import Foundation import Foundation
import Keys
/// BuildSettings provides settings computed at build time. /// BuildSettings provides settings computed at build time.
/// In future, it may be automatically generated from xcconfig files /// In future, it may be automatically generated from xcconfig files
@ -22,13 +23,6 @@ import Foundation
final class BuildSettings: NSObject { final class BuildSettings: NSObject {
// MARK: - Bundle Settings // MARK: - Bundle Settings
static var bundleDisplayName: String {
guard let bundleDisplayName = Bundle.app.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String else {
fatalError("CFBundleDisplayName should be defined")
}
return bundleDisplayName
}
static var applicationGroupIdentifier: String { static var applicationGroupIdentifier: String {
guard let applicationGroupIdentifier = Bundle.app.object(forInfoDictionaryKey: "applicationGroupIdentifier") as? String else { guard let applicationGroupIdentifier = Bundle.app.object(forInfoDictionaryKey: "applicationGroupIdentifier") as? String else {
fatalError("applicationGroupIdentifier should be defined") fatalError("applicationGroupIdentifier should be defined")
@ -165,8 +159,20 @@ final class BuildSettings: NSObject {
static let roomsAllowToJoinPublicRooms: Bool = true static let roomsAllowToJoinPublicRooms: Bool = true
// MARK: - Analytics // MARK: - Analytics
static let analyticsServerUrl = URL(string: "https://piwik.riot.im/piwik.php") #if DEBUG
static let analyticsAppId = "14" /// Host to use for PostHog analytics during development. Set to nil to disable analytics in debug builds.
static let analyticsHost: String? = "https://posthog-poc.lab.element.dev"
/// Public key for submitting analytics during development. Set to nil to disable analytics in debug builds.
static let analyticsKey: String? = "rs-pJjsYJTuAkXJfhaMmPUNBhWliDyTKLOOxike6ck8"
#else
/// Host to use for PostHog analytics. Set to nil to disable analytics.
static let analyticsHost: String? = "https://posthog.hss.element.io"
/// Public key for submitting analytics. Set to nil to disable analytics.
static let analyticsKey: String? = "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO"
#endif
/// The URL to open with more information about analytics terms.
static let analyticsTermsURL = URL(string: "https://element.io/cookie-policy")!
// MARK: - Bug report // MARK: - Bug report
@ -352,4 +358,16 @@ final class BuildSettings: NSObject {
return true return true
} }
// MARK: - Location Sharing
static let tileServerMapURL = URL(string: "https://api.maptiler.com/maps/streets/style.json?key=" + RiotKeys().mapTilerAPIKey)!
static var locationSharingEnabled: Bool {
guard #available(iOS 14, *) else {
return false
}
return false
}
} }

View file

@ -3,6 +3,7 @@ source "https://rubygems.org"
gem "xcode-install" gem "xcode-install"
gem "fastlane" gem "fastlane"
gem "cocoapods", '~>1.11.2' gem "cocoapods", '~>1.11.2'
gem "cocoapods-keys"
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path) eval_gemfile(plugins_path) if File.exist?(plugins_path)

View file

@ -1,9 +1,12 @@
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
CFPropertyList (3.0.4) CFPropertyList (3.0.5)
rexml rexml
activesupport (6.1.4.1) RubyInline (3.12.5)
ZenTest (~> 4.3)
ZenTest (4.12.0)
activesupport (6.1.4.4)
concurrent-ruby (~> 1.0, >= 1.0.2) concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2) i18n (>= 1.6, < 2)
minitest (>= 5.1) minitest (>= 5.1)
@ -17,17 +20,17 @@ GEM
artifactory (3.0.15) artifactory (3.0.15)
atomos (0.1.3) atomos (0.1.3)
aws-eventstream (1.2.0) aws-eventstream (1.2.0)
aws-partitions (1.510.0) aws-partitions (1.541.0)
aws-sdk-core (3.121.1) aws-sdk-core (3.124.0)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.239.0) aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
jmespath (~> 1.0) jmespath (~> 1.0)
aws-sdk-kms (1.48.0) aws-sdk-kms (1.52.0)
aws-sdk-core (~> 3, >= 3.120.0) aws-sdk-core (~> 3, >= 3.122.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.103.0) aws-sdk-s3 (1.109.0)
aws-sdk-core (~> 3, >= 3.120.0) aws-sdk-core (~> 3, >= 3.122.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4) aws-sigv4 (~> 1.4)
aws-sigv4 (1.4.0) aws-sigv4 (1.4.0)
@ -64,6 +67,9 @@ GEM
typhoeus (~> 1.0) typhoeus (~> 1.0)
cocoapods-deintegrate (1.0.5) cocoapods-deintegrate (1.0.5)
cocoapods-downloader (1.5.1) cocoapods-downloader (1.5.1)
cocoapods-keys (2.2.1)
dotenv
osx_keychain
cocoapods-plugins (1.0.0) cocoapods-plugins (1.0.0)
nap nap
cocoapods-search (1.0.1) cocoapods-search (1.0.1)
@ -84,9 +90,9 @@ GEM
dotenv (2.7.6) dotenv (2.7.6)
emoji_regex (3.2.3) emoji_regex (3.2.3)
escape (0.0.4) escape (0.0.4)
ethon (0.14.0) ethon (0.15.0)
ffi (>= 1.15.0) ffi (>= 1.15.0)
excon (0.86.0) excon (0.89.0)
faraday (1.8.0) faraday (1.8.0)
faraday-em_http (~> 1.0) faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0) faraday-em_synchrony (~> 1.0)
@ -109,10 +115,10 @@ GEM
faraday-net_http_persistent (1.2.0) faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0) faraday-patron (1.0.0)
faraday-rack (1.0.0) faraday-rack (1.0.0)
faraday_middleware (1.1.0) faraday_middleware (1.2.0)
faraday (~> 1.0) faraday (~> 1.0)
fastimage (2.2.5) fastimage (2.2.6)
fastlane (2.195.0) fastlane (2.199.0)
CFPropertyList (>= 2.3, < 4.0.0) CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0) addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0) artifactory (~> 3.0)
@ -161,7 +167,7 @@ GEM
fourflusher (2.3.1) fourflusher (2.3.1)
fuzzy_match (2.0.4) fuzzy_match (2.0.4)
gh_inspector (1.1.3) gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.11.0) google-apis-androidpublisher_v3 (0.14.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.4, < 2.a)
google-apis-core (0.4.1) google-apis-core (0.4.1)
addressable (~> 2.5, >= 2.5.1) addressable (~> 2.5, >= 2.5.1)
@ -172,11 +178,11 @@ GEM
retriable (>= 2.0, < 4.a) retriable (>= 2.0, < 4.a)
rexml rexml
webrick webrick
google-apis-iamcredentials_v1 (0.7.0) google-apis-iamcredentials_v1 (0.9.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.4, < 2.a)
google-apis-playcustomapp_v1 (0.5.0) google-apis-playcustomapp_v1 (0.6.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.4, < 2.a)
google-apis-storage_v1 (0.8.0) google-apis-storage_v1 (0.10.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.4, < 2.a)
google-cloud-core (1.6.0) google-cloud-core (1.6.0)
google-cloud-env (~> 1.0) google-cloud-env (~> 1.0)
@ -184,15 +190,15 @@ GEM
google-cloud-env (1.5.0) google-cloud-env (1.5.0)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.3, < 2.0)
google-cloud-errors (1.2.0) google-cloud-errors (1.2.0)
google-cloud-storage (1.34.1) google-cloud-storage (1.35.0)
addressable (~> 2.5) addressable (~> 2.8)
digest-crc (~> 0.4) digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1) google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.1) google-apis-storage_v1 (~> 0.1)
google-cloud-core (~> 1.6) google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0) mini_mime (~> 1.0)
googleauth (1.0.0) googleauth (1.1.0)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.3, < 2.0)
jwt (>= 1.4, < 3.0) jwt (>= 1.4, < 3.0)
memoist (~> 0.16) memoist (~> 0.16)
@ -204,18 +210,18 @@ GEM
http-cookie (1.0.4) http-cookie (1.0.4)
domain_name (~> 0.5) domain_name (~> 0.5)
httpclient (2.8.3) httpclient (2.8.3)
i18n (1.8.10) i18n (1.8.11)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
jmespath (1.4.0) jmespath (1.4.0)
json (2.5.1) json (2.6.1)
jwt (2.3.0) jwt (2.3.0)
memoist (0.16.2) memoist (0.16.2)
mime-types (3.3.1) mime-types (3.4.1)
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
mime-types-data (3.2021.0901) mime-types-data (3.2021.1115)
mini_magick (4.11.0) mini_magick (4.11.0)
mini_mime (1.1.1) mini_mime (1.1.2)
minitest (5.14.4) minitest (5.15.0)
molinillo (0.8.0) molinillo (0.8.0)
multi_json (1.15.0) multi_json (1.15.0)
multipart-post (2.0.0) multipart-post (2.0.0)
@ -224,7 +230,9 @@ GEM
naturally (2.2.1) naturally (2.2.1)
netrc (0.11.0) netrc (0.11.0)
optparse (0.1.1) optparse (0.1.1)
os (1.1.1) os (1.1.4)
osx_keychain (1.0.2)
RubyInline (~> 3)
plist (3.6.0) plist (3.6.0)
public_suffix (4.0.6) public_suffix (4.0.6)
rake (13.0.6) rake (13.0.6)
@ -255,7 +263,7 @@ GEM
terminal-notifier (2.0.0) terminal-notifier (2.0.0)
terminal-table (1.8.0) terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1) unicode-display_width (~> 1.1, >= 1.1.1)
trailblazer-option (0.1.1) trailblazer-option (0.1.2)
tty-cursor (0.7.1) tty-cursor (0.7.1)
tty-screen (0.8.1) tty-screen (0.8.1)
tty-spinner (0.9.3) tty-spinner (0.9.3)
@ -285,13 +293,14 @@ GEM
rouge (~> 2.0.7) rouge (~> 2.0.7)
xcpretty-travis-formatter (1.0.1) xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7) xcpretty (~> 0.2, >= 0.0.7)
zeitwerk (2.4.2) zeitwerk (2.5.1)
PLATFORMS PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
cocoapods (~> 1.11.2) cocoapods (~> 1.11.2)
cocoapods-keys
fastlane fastlane
fastlane-plugin-diawi fastlane-plugin-diawi
fastlane-plugin-versioning fastlane-plugin-versioning

16
Podfile
View file

@ -3,7 +3,7 @@ source 'https://cdn.cocoapods.org/'
# Uncomment this line to define a global platform for your project # Uncomment this line to define a global platform for your project
platform :ios, '12.1' platform :ios, '12.1'
# Use frameforks to allow usage of pod written in Swift (like PiwikTracker) # Use frameworks to allow usage of pods written in Swift
use_frameworks! use_frameworks!
# Different flavours of pods to MatrixSDK. Can be one of: # Different flavours of pods to MatrixSDK. Can be one of:
@ -13,7 +13,7 @@ use_frameworks!
# - `{ :specHash => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for MatrixSDK repo. Used by Fastfile during CI # - `{ :specHash => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for MatrixSDK repo. Used by Fastfile during CI
# #
# Warning: our internal tooling depends on the name of this variable name, so be sure not to change it # Warning: our internal tooling depends on the name of this variable name, so be sure not to change it
$matrixSDKVersion = '0.20.15' $matrixSDKVersion = '= 0.20.16'
# $matrixSDKVersion = :local # $matrixSDKVersion = :local
# $matrixSDKVersion = { :branch => 'develop'} # $matrixSDKVersion = { :branch => 'develop'}
# $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } } # $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } }
@ -67,8 +67,10 @@ abstract_target 'RiotPods' do
pod 'KeychainAccess', '~> 4.2.2' pod 'KeychainAccess', '~> 4.2.2'
pod 'WeakDictionary', '~> 2.0' pod 'WeakDictionary', '~> 2.0'
# Piwik for analytics # PostHog for analytics
pod 'MatomoTracker', '~> 7.4.1' pod 'PostHog', '~> 1.4.4'
pod 'AnalyticsEvents', :git => 'https://github.com/matrix-org/matrix-analytics-events.git', :branch => 'release/swift'
# pod 'AnalyticsEvents', :path => '../matrix-analytics-events/AnalyticsEvents.podspec'
# Remove warnings from "bad" pods # Remove warnings from "bad" pods
pod 'OLMKit', :inhibit_warnings => true pod 'OLMKit', :inhibit_warnings => true
@ -93,7 +95,7 @@ abstract_target 'RiotPods' do
pod 'SwiftJWT', '~> 3.6.200' pod 'SwiftJWT', '~> 3.6.200'
pod 'SideMenu', '~> 6.5' pod 'SideMenu', '~> 6.5'
pod 'DSWaveformImage', '~> 6.1.1' pod 'DSWaveformImage', '~> 6.1.1'
pod 'ffmpeg-kit-ios-audio', '~> 4.5' pod 'ffmpeg-kit-ios-audio', '4.5.1'
pod 'FLEX', '~> 4.5.0', :configurations => ['Debug'] pod 'FLEX', '~> 4.5.0', :configurations => ['Debug']
@ -127,6 +129,10 @@ abstract_target 'RiotPods' do
end end
plugin 'cocoapods-keys', {
:project => "Riot",
:keys => ["MapTilerAPIKey"]
}
post_install do |installer| post_install do |installer|
installer.pods_project.targets.each do |target| installer.pods_project.targets.each do |target|

View file

@ -14,6 +14,7 @@ PODS:
- AFNetworking/Serialization (4.0.1) - AFNetworking/Serialization (4.0.1)
- AFNetworking/UIKit (4.0.1): - AFNetworking/UIKit (4.0.1):
- AFNetworking/NSURLSession - AFNetworking/NSURLSession
- AnalyticsEvents (0.1.0)
- BlueCryptor (1.0.32) - BlueCryptor (1.0.32)
- BlueECC (1.2.5) - BlueECC (1.2.5)
- BlueRSA (1.0.200) - BlueRSA (1.0.200)
@ -56,9 +57,6 @@ PODS:
- LoggerAPI (1.9.200): - LoggerAPI (1.9.200):
- Logging (~> 1.1) - Logging (~> 1.1)
- Logging (1.4.0) - Logging (1.4.0)
- MatomoTracker (7.4.1):
- MatomoTracker/Core (= 7.4.1)
- MatomoTracker/Core (7.4.1)
- MatrixSDK (0.20.15): - MatrixSDK (0.20.15):
- MatrixSDK/Core (= 0.20.15) - MatrixSDK/Core (= 0.20.15)
- MatrixSDK/Core (0.20.15): - MatrixSDK/Core (0.20.15):
@ -76,6 +74,7 @@ PODS:
- OLMKit/olmcpp (= 3.2.5) - OLMKit/olmcpp (= 3.2.5)
- OLMKit/olmc (3.2.5) - OLMKit/olmc (3.2.5)
- OLMKit/olmcpp (3.2.5) - OLMKit/olmcpp (3.2.5)
- PostHog (1.4.4)
- ReadMoreTextView (3.0.1) - ReadMoreTextView (3.0.1)
- Realm (10.16.0): - Realm (10.16.0):
- Realm/Headers (= 10.16.0) - Realm/Headers (= 10.16.0)
@ -103,6 +102,7 @@ PODS:
- ZXingObjC/All (3.6.5) - ZXingObjC/All (3.6.5)
DEPENDENCIES: DEPENDENCIES:
- AnalyticsEvents (from `https://github.com/matrix-org/matrix-analytics-events.git`, branch `release/swift`)
- DGCollectionViewLeftAlignFlowLayout (~> 1.0.4) - DGCollectionViewLeftAlignFlowLayout (~> 1.0.4)
- Down (~> 0.11.0) - Down (~> 0.11.0)
- DSWaveformImage (~> 6.1.1) - DSWaveformImage (~> 6.1.1)
@ -116,10 +116,10 @@ DEPENDENCIES:
- KeychainAccess (~> 4.2.2) - KeychainAccess (~> 4.2.2)
- KTCenterFlowLayout (~> 1.3.1) - KTCenterFlowLayout (~> 1.3.1)
- libPhoneNumber-iOS (~> 0.9.13) - libPhoneNumber-iOS (~> 0.9.13)
- MatomoTracker (~> 7.4.1)
- MatrixSDK (= 0.20.15) - MatrixSDK (= 0.20.15)
- MatrixSDK/JingleCallStack (= 0.20.15) - MatrixSDK/JingleCallStack (= 0.20.15)
- OLMKit - OLMKit
- PostHog (~> 1.4.4)
- ReadMoreTextView (~> 3.0.1) - ReadMoreTextView (~> 3.0.1)
- Reusable (~> 4.1) - Reusable (~> 4.1)
- SideMenu (~> 6.5) - SideMenu (~> 6.5)
@ -157,9 +157,9 @@ SPEC REPOS:
- libPhoneNumber-iOS - libPhoneNumber-iOS
- LoggerAPI - LoggerAPI
- Logging - Logging
- MatomoTracker
- MatrixSDK - MatrixSDK
- OLMKit - OLMKit
- PostHog
- ReadMoreTextView - ReadMoreTextView
- Realm - Realm
- Reusable - Reusable
@ -173,8 +173,19 @@ SPEC REPOS:
- zxcvbn-ios - zxcvbn-ios
- ZXingObjC - ZXingObjC
EXTERNAL SOURCES:
AnalyticsEvents:
:branch: release/swift
:git: https://github.com/matrix-org/matrix-analytics-events.git
CHECKOUT OPTIONS:
AnalyticsEvents:
:commit: f1805ad7c3fafa7fd9c6e2eaa9e0165f8142ecd2
:git: https://github.com/matrix-org/matrix-analytics-events.git
SPEC CHECKSUMS: SPEC CHECKSUMS:
AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce
AnalyticsEvents: 333bf47d67dc628fadd29ce887b7ac93d8bd6e05
BlueCryptor: b0aee3d9b8f367b49b30de11cda90e1735571c24 BlueCryptor: b0aee3d9b8f367b49b30de11cda90e1735571c24
BlueECC: 0d18e93347d3ec6d41416de21c1ffa4d4cd3c2cc BlueECC: 0d18e93347d3ec6d41416de21c1ffa4d4cd3c2cc
BlueRSA: dfeef51db96bcc4edec654956c1581adbda4e6a3 BlueRSA: dfeef51db96bcc4edec654956c1581adbda4e6a3
@ -198,9 +209,9 @@ SPEC CHECKSUMS:
libPhoneNumber-iOS: 0a32a9525cf8744fe02c5206eb30d571e38f7d75 libPhoneNumber-iOS: 0a32a9525cf8744fe02c5206eb30d571e38f7d75
LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d
Logging: beeb016c9c80cf77042d62e83495816847ef108b Logging: beeb016c9c80cf77042d62e83495816847ef108b
MatomoTracker: 24a846c9d3aa76933183fe9d47fd62c9efa863fb
MatrixSDK: 2f4d3aacb1c53e2785f0be71d24b8e62e5c5c056 MatrixSDK: 2f4d3aacb1c53e2785f0be71d24b8e62e5c5c056
OLMKit: 9fb4799c4a044dd2c06bda31ec31a12191ad30b5 OLMKit: 9fb4799c4a044dd2c06bda31ec31a12191ad30b5
PostHog: 4b6321b521569092d4ef3a02238d9435dbaeb99f
ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d
Realm: b6027801398f3743fc222f096faa85281b506e6c Realm: b6027801398f3743fc222f096faa85281b506e6c
Reusable: 6bae6a5e8aa793c9c441db0213c863a64bce9136 Reusable: 6bae6a5e8aa793c9c441db0213c863a64bce9136
@ -214,6 +225,6 @@ SPEC CHECKSUMS:
zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c
ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb
PODFILE CHECKSUM: 989bcc8b1857dc64a9b810ddaf4446903adbe162 PODFILE CHECKSUM: e60814fe2084a7dca3f82c3a1c4a1b763ae822c0
COCOAPODS: 1.11.2 COCOAPODS: 1.11.2

View file

@ -0,0 +1,123 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 1.000000 -1.000000 cm
0.049479 0.742188 0.545395 scn
10.000000 23.000000 m
3.947715 23.000000 -1.000000 18.052284 -1.000000 12.000000 c
1.000000 12.000000 l
1.000000 16.947716 5.052285 21.000000 10.000000 21.000000 c
10.000000 23.000000 l
h
-1.000000 12.000000 m
-1.000000 5.947716 3.947715 1.000000 10.000000 1.000000 c
10.000000 3.000000 l
5.052285 3.000000 1.000000 7.052285 1.000000 12.000000 c
-1.000000 12.000000 l
h
10.000000 1.000000 m
16.052284 1.000000 21.000000 5.947716 21.000000 12.000000 c
19.000000 12.000000 l
19.000000 7.052285 14.947715 3.000000 10.000000 3.000000 c
10.000000 1.000000 l
h
21.000000 12.000000 m
21.000000 18.052284 16.052284 23.000000 10.000000 23.000000 c
10.000000 21.000000 l
14.947715 21.000000 19.000000 16.947716 19.000000 12.000000 c
21.000000 12.000000 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 5.545532 4.655060 cm
0.049479 0.742188 0.545395 scn
0.717378 6.153159 m
0.332610 6.549356 -0.300487 6.558620 -0.696684 6.173852 c
-1.092881 5.789084 -1.102146 5.155987 -0.717378 4.759790 c
0.717378 6.153159 l
h
3.257576 2.102139 m
2.540198 1.405455 l
2.728505 1.211555 2.987285 1.102139 3.257576 1.102139 c
3.527867 1.102139 3.786646 1.211555 3.974954 1.405455 c
3.257576 2.102139 l
h
11.626469 9.284243 m
12.011237 9.680439 12.001972 10.313537 11.605776 10.698304 c
11.209579 11.083073 10.576482 11.073808 10.191713 10.677610 c
11.626469 9.284243 l
h
-0.717378 4.759790 m
2.540198 1.405455 l
3.974954 2.798823 l
0.717378 6.153159 l
-0.717378 4.759790 l
h
3.974954 1.405455 m
11.626469 9.284243 l
10.191713 10.677610 l
2.540198 2.798823 l
3.974954 1.405455 l
h
f
n
Q
endstream
endobj
3 0 obj
1679
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 22.000000 22.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001769 00000 n
0000001792 00000 n
0000001965 00000 n
0000002039 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2098
%%EOF

View file

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "AnalyticsTick.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View file

@ -0,0 +1,641 @@
%PDF-1.7
1 0 obj
<< /Type /XObject
/Length 2 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << /ExtGState << /E2 << /ca 0.400000 >>
/E1 << /ca 0.400000 >>
>> >>
/BBox [ 0.000000 0.000000 119.000000 93.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 14.875000 -0.000015 cm
0.049479 0.742188 0.545395 scn
0.000000 44.521278 m
0.000000 69.109695 20.036579 89.042557 44.625000 89.042557 c
44.625000 89.042557 l
69.213417 89.042557 89.250000 69.109695 89.250000 44.521278 c
89.250000 44.521278 l
89.250000 19.932861 69.213417 0.000000 44.625000 0.000000 c
44.625000 0.000000 l
20.036579 0.000000 0.000000 19.932861 0.000000 44.521278 c
0.000000 44.521278 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 52.227402 46.594299 cm
1.000000 1.000000 1.000000 scn
0.000000 20.730219 m
0.000000 22.447567 1.395428 23.839752 3.116776 23.839752 c
14.592426 23.839752 23.895279 14.558517 23.895279 3.109533 c
23.895279 1.392185 22.499851 0.000000 20.778503 0.000000 c
19.057156 0.000000 17.661728 1.392185 17.661728 3.109533 c
17.661728 11.123821 11.149731 17.620686 3.116776 17.620686 c
1.395428 17.620686 0.000000 19.012871 0.000000 20.730219 c
h
f*
n
Q
q
-1.000000 0.000000 -0.000000 -1.000000 66.772202 42.448242 cm
1.000000 1.000000 1.000000 scn
0.000000 20.730206 m
0.000000 22.447552 1.395429 23.839737 3.116779 23.839737 c
14.592443 23.839737 23.895306 14.558502 23.895306 3.109520 c
23.895306 1.392172 22.499878 -0.000011 20.778526 -0.000011 c
19.057177 -0.000011 17.661749 1.392172 17.661749 3.109520 c
17.661749 11.123808 11.149744 17.620672 3.116779 17.620672 c
1.395429 17.620672 0.000000 19.012857 0.000000 20.730206 c
h
f*
n
Q
q
-0.000000 1.000000 -1.000000 -0.000000 57.366512 37.265598 cm
1.000000 1.000000 1.000000 scn
0.000000 20.722975 m
0.000000 22.444323 1.392186 23.839752 3.109534 23.839752 c
14.558520 23.839752 23.839758 14.536892 23.839758 3.061234 c
23.839758 1.339886 22.447573 -0.055544 20.730225 -0.055544 c
19.012875 -0.055544 17.620689 1.339886 17.620689 3.061234 c
17.620689 11.094195 11.123824 17.606197 3.109534 17.606197 c
1.392186 17.606197 0.000000 19.001625 0.000000 20.722975 c
h
f*
n
Q
q
-0.000000 -1.000000 1.000000 -0.000000 61.633194 51.777008 cm
1.000000 1.000000 1.000000 scn
0.000000 20.722975 m
0.000000 22.444324 1.392186 23.839752 3.109534 23.839752 c
14.558520 23.839752 23.839758 14.536893 23.839758 3.061237 c
23.839758 1.339888 22.447573 -0.055540 20.730225 -0.055540 c
19.012875 -0.055540 17.620689 1.339888 17.620689 3.061237 c
17.620689 11.094196 11.123824 17.606197 3.109534 17.606197 c
1.392186 17.606197 0.000000 19.001627 0.000000 20.722975 c
h
f*
n
Q
q
1.000000 0.000000 -0.000000 1.000000 28.123089 16.695465 cm
1.000000 1.000000 1.000000 scn
10.448288 0.000008 m
11.057861 0.000008 11.560491 0.448122 11.646045 1.077618 c
12.576446 7.617959 13.464069 8.514189 19.795069 9.229038 c
20.436726 9.303724 20.917965 9.826525 20.917965 10.434681 c
20.917965 11.053506 20.447418 11.554968 19.805763 11.640323 c
13.506846 12.461866 12.694082 13.262072 11.646045 19.802414 c
11.539103 20.431910 11.057861 20.869354 10.448288 20.869354 c
9.849410 20.869354 9.346780 20.431910 9.250531 19.791744 c
8.330826 13.251402 7.443202 12.355172 1.112203 11.640323 c
0.470547 11.565637 0.000000 11.053506 0.000000 10.434681 c
0.000000 9.826525 0.459853 9.314394 1.112203 9.229038 c
7.411120 8.354148 8.191800 7.607290 9.250531 1.066948 c
9.368169 0.437452 9.860105 0.000008 10.448288 0.000008 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 28.123089 15.195465 cm
0.049479 0.742188 0.545395 scn
11.646045 2.577618 m
10.903506 2.683247 l
10.902877 2.678619 l
11.646045 2.577618 l
h
19.795069 10.729038 m
19.879219 9.983770 l
19.881781 9.984068 l
19.795069 10.729038 l
h
19.805763 13.140323 m
19.904661 13.883777 l
19.902761 13.884024 l
19.805763 13.140323 l
h
11.646045 21.302414 m
12.386630 21.421087 l
12.385450 21.428030 l
11.646045 21.302414 l
h
9.250531 21.291744 m
8.508834 21.403259 l
8.507838 21.396183 l
9.250531 21.291744 l
h
1.112203 13.140323 m
1.028052 13.885592 l
1.025491 13.885293 l
1.112203 13.140323 l
h
1.112203 10.729038 m
1.215387 11.471931 l
1.209505 11.472700 l
1.112203 10.729038 l
h
9.250531 2.566948 m
8.510169 2.447100 l
8.511623 2.438120 l
8.513294 2.429176 l
9.250531 2.566948 l
h
10.448288 0.750008 m
11.450765 0.750008 12.255557 1.493191 12.389213 2.476614 c
10.902877 2.678619 l
10.865425 2.403053 10.664957 2.250008 10.448288 2.250008 c
10.448288 0.750008 l
h
12.388570 2.471989 m
12.620602 4.103085 12.844038 5.334888 13.138243 6.288948 c
13.429995 7.235054 13.776924 7.858273 14.225985 8.307880 c
15.140809 9.223818 16.666159 9.620979 19.879219 9.983774 c
19.710920 11.474303 l
16.592981 11.122249 14.509018 10.713870 13.164680 9.367895 c
12.484159 8.686545 12.039045 7.814714 11.704848 6.730967 c
11.373105 5.655174 11.136688 4.322321 10.903521 2.683245 c
12.388570 2.471989 l
h
19.881781 9.984068 m
20.873766 10.099530 21.667965 10.918526 21.667965 11.934681 c
20.167965 11.934681 l
20.167965 11.734525 19.999683 11.507918 19.708359 11.474010 c
19.881781 9.984068 l
h
21.667965 11.934681 m
21.667965 12.966555 20.881077 13.753887 19.904659 13.883774 c
19.706867 12.396872 l
20.013762 12.356048 20.167965 12.140457 20.167965 11.934681 c
21.667965 11.934681 l
h
19.902761 13.884024 m
18.330524 14.089085 17.151228 14.287123 16.235826 14.561028 c
15.331247 14.831694 14.731587 15.163220 14.286853 15.607450 c
13.840208 16.053589 13.492528 16.670565 13.191763 17.611713 c
12.888441 18.560867 12.648228 19.788363 12.386598 21.421082 c
10.905493 21.183746 l
11.167881 19.546295 11.422276 18.221136 11.762950 17.155106 c
12.106180 16.081072 12.551881 15.220337 13.226795 14.546188 c
13.903622 13.870131 14.753702 13.438795 15.805837 13.123979 c
16.847151 12.812399 18.131544 12.602333 19.708765 12.396622 c
19.902761 13.884024 l
h
12.385450 21.428030 m
12.223795 22.379583 11.461336 23.119354 10.448288 23.119354 c
10.448288 21.619354 l
10.654386 21.619354 10.854410 21.484234 10.906639 21.176800 c
12.385450 21.428030 l
h
10.448288 23.119354 m
9.455997 23.119354 8.656921 22.387987 8.508867 21.403254 c
9.992196 21.180237 l
10.036638 21.475830 10.242823 21.619354 10.448288 21.619354 c
10.448288 23.119354 l
h
8.507838 21.396183 m
8.278477 19.765110 8.056973 18.533388 7.764218 17.579443 c
7.473907 16.633463 7.127907 16.010515 6.679636 15.561167 c
5.766263 14.645599 4.241331 14.248406 1.028053 13.885587 c
1.196352 12.395059 l
4.314074 12.747088 6.398453 13.155437 7.741569 14.501781 c
8.421542 15.183390 8.865580 16.055490 9.198210 17.139366 c
9.528394 18.215273 9.762733 19.548208 9.993224 21.187307 c
8.507838 21.396183 l
h
1.025491 13.885293 m
0.028613 13.769261 -0.750000 12.956783 -0.750000 11.934681 c
0.750000 11.934681 l
0.750000 12.150229 0.912482 12.362013 1.198914 12.395352 c
1.025491 13.885293 l
h
-0.750000 11.934681 m
-0.750000 10.922595 0.016880 10.115961 1.014900 9.985377 c
1.209505 11.472700 l
0.902826 11.512827 0.750000 11.730454 0.750000 11.934681 c
-0.750000 11.934681 l
h
1.009022 9.986170 m
2.582546 9.767614 3.760892 9.563175 4.675031 9.286510 c
5.578484 9.013078 6.174878 8.682938 6.616406 8.241908 c
7.059544 7.799271 7.404263 7.187467 7.703608 6.250257 c
8.005574 5.304842 8.245770 4.080437 8.510169 2.447100 c
9.990894 2.686794 l
9.725928 4.323629 9.471515 5.645210 9.132493 6.706642 c
8.790851 7.776280 8.348207 8.632186 7.676467 9.303166 c
7.003119 9.975756 6.157125 10.405144 5.109545 10.722197 c
4.072651 11.036015 2.791318 11.253017 1.215384 11.471908 c
1.009022 9.986170 l
h
8.513294 2.429176 m
8.688872 1.489628 9.455215 0.750008 10.448288 0.750008 c
10.448288 2.250008 l
10.264993 2.250008 10.047464 2.385277 9.987769 2.704720 c
8.513294 2.429176 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 72.573807 58.608093 cm
1.000000 1.000000 1.000000 scn
8.619835 -0.000011 m
9.122732 -0.000011 9.537402 0.373419 9.607985 0.897997 c
10.375565 6.348283 11.107853 7.095141 16.330927 7.690849 c
16.860292 7.753087 17.257317 8.188755 17.257317 8.695551 c
17.257317 9.211239 16.869114 9.629124 16.339748 9.700253 c
11.143145 10.384872 10.472614 11.051710 9.607985 16.501997 c
9.519756 17.026575 9.122732 17.391113 8.619835 17.391113 c
8.125761 17.391113 7.711091 17.026575 7.631686 16.493105 c
6.872929 11.042820 6.140640 10.295961 0.917567 9.700253 c
0.388201 9.638015 0.000000 9.211239 0.000000 8.695551 c
0.000000 8.188755 0.379379 7.761978 0.917567 7.690849 c
6.114172 6.961774 6.758233 6.339392 7.631686 0.889107 c
7.728737 0.364527 8.134583 -0.000011 8.619835 -0.000011 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 72.573807 57.608093 cm
0.049479 0.742188 0.545395 scn
9.607985 1.897997 m
9.112861 1.967726 l
9.112450 1.964672 l
9.607985 1.897997 l
h
16.330927 8.690849 m
16.387587 8.194067 l
16.389311 8.194269 l
16.330927 8.690849 l
h
16.339748 10.700253 m
16.406334 11.195801 l
16.405056 11.195970 l
16.339748 10.700253 l
h
9.607985 17.501997 m
10.101830 17.580339 l
10.101059 17.584925 l
9.607985 17.501997 l
h
7.631686 17.493105 m
7.137113 17.566721 l
7.136462 17.562048 l
7.631686 17.493105 l
h
0.917567 10.700253 m
0.860907 11.197035 l
0.859183 11.196833 l
0.917567 10.700253 l
h
0.917567 8.690849 m
0.987038 9.186015 l
0.983079 9.186539 l
0.917567 8.690849 l
h
7.631686 1.889107 m
7.137843 1.809963 l
7.140029 1.798147 l
7.631686 1.889107 l
h
8.619835 0.499989 m
9.388696 0.499989 10.001672 1.074373 10.103518 1.831324 c
9.112450 1.964672 l
9.073133 1.672462 8.856770 1.499989 8.619835 1.499989 c
8.619835 0.499989 l
h
10.103099 1.828268 m
10.294624 3.188222 10.480069 4.223436 10.725984 5.028956 c
10.970345 5.829387 11.264832 6.369568 11.654185 6.763333 c
12.442908 7.560994 13.744701 7.892640 16.387587 8.194070 c
16.274267 9.187629 l
13.694078 8.893350 12.018190 8.553713 10.943106 7.466446 c
10.400556 6.917747 10.041607 6.212054 9.769561 5.320940 c
9.499068 4.434915 9.305134 3.332915 9.112870 1.967726 c
10.103099 1.828268 l
h
16.389311 8.194269 m
17.155991 8.284410 17.757317 8.920855 17.757317 9.695551 c
16.757317 9.695551 l
16.757317 9.456655 16.564592 9.221766 16.272543 9.187428 c
16.389311 8.194269 l
h
17.757317 9.695551 m
17.757317 10.482604 17.162529 11.094193 16.406334 11.195800 c
16.273165 10.204706 l
16.575699 10.164056 16.757317 9.939874 16.757317 9.695551 c
17.757317 9.695551 l
h
16.405056 11.195970 m
15.107601 11.366901 14.126670 11.532858 13.361839 11.764020 c
12.604449 11.992933 12.090017 12.277006 11.704502 12.665974 c
11.317406 13.056538 11.022324 13.591100 10.770527 14.386979 c
10.517109 15.187984 10.317721 16.219311 10.101810 17.580338 c
9.114160 17.423656 l
9.330563 16.059540 9.539227 14.963654 9.817105 14.085340 c
10.096603 13.201900 10.456060 12.505035 10.994250 11.962027 c
11.534022 11.417421 12.215625 11.065775 13.072525 10.806786 c
13.921983 10.550046 14.973595 10.375915 16.274443 10.204536 c
16.405056 11.195970 l
h
10.101059 17.584925 m
9.977288 18.320837 9.395552 18.891113 8.619835 18.891113 c
8.619835 17.891113 l
8.849913 17.891113 9.062225 17.732313 9.114909 17.419067 c
10.101059 17.584925 l
h
8.619835 18.891113 m
7.859531 18.891113 7.250215 18.326427 7.137135 17.566717 c
8.126238 17.419493 l
8.171968 17.726725 8.391990 17.891113 8.619835 17.891113 c
8.619835 18.891113 l
h
7.136462 17.562048 m
6.947139 16.202108 6.763302 15.166948 6.518592 14.361504 c
6.275430 13.561155 5.981721 13.021152 5.592998 12.627558 c
4.805452 11.830145 3.503936 11.498478 0.860908 11.197033 c
0.974226 10.203474 l
3.554271 10.497736 5.230436 10.837353 6.304493 11.924868 c
6.846570 12.473737 7.204643 13.179608 7.475406 14.070805 c
7.744622 14.956905 7.936855 16.058958 8.126910 17.424164 c
7.136462 17.562048 l
h
0.859183 11.196833 m
0.089259 11.106312 -0.500000 10.475979 -0.500000 9.695551 c
0.500000 9.695551 l
0.500000 9.946500 0.687143 10.169718 0.975950 10.203673 c
0.859183 11.196833 l
h
-0.500000 9.695551 m
-0.500000 8.923503 0.079786 8.297226 0.852054 8.195160 c
0.983079 9.186539 l
0.678971 9.226731 0.500000 9.454006 0.500000 9.695551 c
-0.500000 9.695551 l
h
0.848098 8.195699 m
2.146421 8.013546 3.126409 7.842214 3.889960 7.608789 c
4.646159 7.377612 5.157835 7.094736 5.540681 6.708459 c
5.924912 6.320785 6.217544 5.790504 6.468155 4.997945 c
6.720429 4.200129 6.919805 3.171420 7.137986 1.809986 c
8.125387 1.968225 l
7.906841 3.331934 7.698164 4.424881 7.421624 5.299438 c
7.143422 6.179253 6.786478 6.872063 6.250936 7.412404 c
5.714010 7.954142 5.035716 8.304206 4.182313 8.565100 c
3.336262 8.823746 2.287016 9.003614 0.987036 9.186000 c
0.848098 8.195699 l
h
7.140029 1.798147 m
7.274719 1.070122 7.860904 0.499989 8.619835 0.499989 c
8.619835 1.499989 l
8.408263 1.499989 8.182755 1.658932 8.123343 1.980066 c
7.140029 1.798147 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 107.227104 75.129669 cm
0.049479 0.742188 0.545395 scn
5.619252 -0.000010 m
5.947090 -0.000010 6.217412 0.238985 6.263425 0.574716 c
6.763808 4.062898 7.241186 4.540888 10.646096 4.922141 c
10.991189 4.961974 11.250008 5.240800 11.250008 5.565150 c
11.250008 5.895190 10.996941 6.162637 10.651848 6.208159 c
7.264192 6.646316 6.827075 7.073092 6.263425 10.561275 c
6.205909 10.897006 5.947090 11.130310 5.619252 11.130310 c
5.297166 11.130310 5.026845 10.897006 4.975080 10.555585 c
4.480448 7.067402 4.003070 6.589413 0.598160 6.208159 c
0.253068 6.168327 0.000000 5.895190 0.000000 5.565150 c
0.000000 5.240800 0.247316 4.967664 0.598160 4.922141 c
3.985816 4.455533 4.405678 4.057208 4.975080 0.569025 c
5.038347 0.233294 5.302918 -0.000010 5.619252 -0.000010 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 103.008408 84.868683 cm
0.049479 0.742188 0.545395 scn
3.160831 -0.000001 m
3.345240 -0.000001 3.497297 0.134433 3.523178 0.323282 c
3.804644 2.285384 4.073170 2.554254 5.988433 2.768708 c
6.182547 2.791114 6.328133 2.947954 6.328133 3.130401 c
6.328133 3.316049 6.185782 3.466487 5.991668 3.492094 c
4.086111 3.738557 3.840232 3.978619 3.523178 5.940721 c
3.490826 6.129570 3.345240 6.260803 3.160831 6.260803 c
2.979658 6.260803 2.827601 6.129570 2.798484 5.937521 c
2.520254 3.975418 2.251728 3.706549 0.336465 3.492094 c
0.142351 3.469688 0.000000 3.316049 0.000000 3.130401 c
0.000000 2.947954 0.139115 2.794315 0.336465 2.768708 c
2.242023 2.506241 2.478195 2.282184 2.798484 0.320081 c
2.834072 0.131233 2.982893 -0.000001 3.160831 -0.000001 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 103.711479 69.564484 cm
0.049479 0.742188 0.545395 scn
3.863233 0.000004 m
4.088622 0.000004 4.274468 0.164312 4.306101 0.395127 c
4.650115 2.793253 4.978312 3.121871 7.319186 3.383983 c
7.556437 3.411368 7.734375 3.603061 7.734375 3.826052 c
7.734375 4.052955 7.560391 4.236824 7.323141 4.268121 c
4.994129 4.569354 4.693611 4.862762 4.306101 7.260888 c
4.266560 7.491703 4.088622 7.652100 3.863233 7.652100 c
3.641799 7.652100 3.455953 7.491703 3.420365 7.256976 c
3.080306 4.858850 2.752109 4.530232 0.411235 4.268121 c
0.173984 4.240736 0.000000 4.052955 0.000000 3.826052 c
0.000000 3.603061 0.170030 3.415280 0.411235 3.383983 c
2.740246 3.063190 3.028902 2.789341 3.420365 0.391215 c
3.463861 0.160400 3.645753 0.000004 3.863233 0.000004 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 -0.070938 78.607880 cm
0.049479 0.742188 0.545395 scn
5.268045 -0.000012 m
5.575393 -0.000012 5.828820 0.224045 5.871957 0.538792 c
6.341066 3.808963 6.788608 4.257079 9.980709 4.614503 c
10.304233 4.651846 10.546875 4.913247 10.546875 5.217325 c
10.546875 5.526737 10.309625 5.777468 9.986101 5.820146 c
6.810176 6.230918 6.400379 6.631021 5.871957 9.901192 c
5.818036 10.215940 5.575393 10.434662 5.268045 10.434662 c
4.966090 10.434662 4.712663 10.215940 4.664135 9.895857 c
4.200418 6.625686 3.752876 6.177571 0.560775 5.820146 c
0.237251 5.782803 0.000000 5.526737 0.000000 5.217325 c
0.000000 4.913247 0.231859 4.657181 0.560775 4.614503 c
3.736700 4.177058 4.130321 3.803629 4.664135 0.533457 c
4.723447 0.218710 4.971482 -0.000012 5.268045 -0.000012 c
h
f
n
Q
q
/E1 gs
1.000000 0.000000 -0.000000 1.000000 9.772858 88.346924 cm
0.049479 0.742188 0.545395 scn
2.458421 -0.000008 m
2.601850 -0.000008 2.720115 0.104552 2.740246 0.251434 c
2.959164 1.777514 3.168016 1.986634 4.657663 2.153433 c
4.808641 2.170859 4.921874 2.292846 4.921874 2.434749 c
4.921874 2.579142 4.811157 2.696150 4.660179 2.716066 c
3.178081 2.907759 2.986843 3.094474 2.740246 4.620554 c
2.715083 4.767436 2.601850 4.869507 2.458421 4.869507 c
2.317508 4.869507 2.199242 4.767436 2.176596 4.618064 c
1.960194 3.091985 1.751342 2.882864 0.261695 2.716066 c
0.110717 2.698639 0.000000 2.579142 0.000000 2.434749 c
0.000000 2.292846 0.108201 2.173349 0.261695 2.153433 c
1.743793 1.949291 1.927482 1.775024 2.176596 0.248944 c
2.204275 0.102062 2.320024 -0.000008 2.458421 -0.000008 c
h
f
n
Q
q
/E2 gs
1.000000 0.000000 -0.000000 1.000000 13.288479 82.086121 cm
0.049479 0.742188 0.545395 scn
2.458421 -0.000008 m
2.601850 -0.000008 2.720116 0.104552 2.740247 0.251434 c
2.959164 1.777514 3.168017 1.986634 4.657664 2.153433 c
4.808642 2.170859 4.921875 2.292846 4.921875 2.434749 c
4.921875 2.579142 4.811158 2.696150 4.660181 2.716066 c
3.178082 2.907759 2.986844 3.094474 2.740247 4.620554 c
2.715084 4.767436 2.601850 4.869507 2.458421 4.869507 c
2.317509 4.869507 2.199243 4.767436 2.176596 4.618064 c
1.960195 3.091985 1.751342 2.882864 0.261695 2.716066 c
0.110717 2.698639 0.000000 2.579142 0.000000 2.434749 c
0.000000 2.292846 0.108201 2.173349 0.261695 2.153433 c
1.743793 1.949291 1.927483 1.775024 2.176596 0.248944 c
2.204276 0.102062 2.320025 -0.000008 2.458421 -0.000008 c
h
f
n
Q
endstream
endobj
2 0 obj
17245
endobj
3 0 obj
<< /Type /XObject
/Length 4 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 119.000000 93.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
0.000000 93.000000 m
119.000000 93.000000 l
119.000000 0.000000 l
0.000000 0.000000 l
0.000000 93.000000 l
h
f
n
Q
endstream
endobj
4 0 obj
234
endobj
5 0 obj
<< /XObject << /X1 1 0 R >>
/ExtGState << /E1 << /SMask << /Type /Mask
/G 3 0 R
/S /Alpha
>>
/Type /ExtGState
>> >>
>>
endobj
6 0 obj
<< /Length 7 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
/E1 gs
/X1 Do
Q
endstream
endobj
7 0 obj
46
endobj
8 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 119.000000 93.000000 ]
/Resources 5 0 R
/Contents 6 0 R
/Parent 9 0 R
>>
endobj
9 0 obj
<< /Kids [ 8 0 R ]
/Count 1
/Type /Pages
>>
endobj
10 0 obj
<< /Pages 9 0 R
/Type /Catalog
>>
endobj
xref
0 11
0000000000 65535 f
0000000010 00000 n
0000017630 00000 n
0000017654 00000 n
0000018137 00000 n
0000018159 00000 n
0000018457 00000 n
0000018559 00000 n
0000018580 00000 n
0000018754 00000 n
0000018828 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 10 0 R
/Size 11
>>
startxref
18888
%%EOF

View file

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "AnalyticsLogo.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "action_location.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "action_location@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "action_location@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 907 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "location_marker_icon.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "location_marker_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "location_marker_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 907 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "location_share_icon.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "location_share_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "location_share_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 596 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 819 B

View file

@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "location_user_marker.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "location_user_marker@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "location_user_marker@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,005 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -55,7 +55,7 @@
"auth_missing_phone" = "Fehlende Telefon-Nummer"; "auth_missing_phone" = "Fehlende Telefon-Nummer";
"auth_missing_email_or_phone" = "Fehlende E-Mail-Adresse oder Telefon-Nummer"; "auth_missing_email_or_phone" = "Fehlende E-Mail-Adresse oder Telefon-Nummer";
"auth_password_dont_match" = "Passwörter stimmen nicht überein"; "auth_password_dont_match" = "Passwörter stimmen nicht überein";
"auth_username_in_use" = "Nutzername bereits verwendet"; "auth_username_in_use" = "Benutzername bereits verwendet";
"auth_forgot_password" = "Passwort vergessen?"; "auth_forgot_password" = "Passwort vergessen?";
"auth_msisdn_validation_title" = "Verifizierung ausstehend"; "auth_msisdn_validation_title" = "Verifizierung ausstehend";
"auth_msisdn_validation_message" = "Bitte gib unten den Aktivierungs-Code ein, den wir per SMS verschickt haben."; "auth_msisdn_validation_message" = "Bitte gib unten den Aktivierungs-Code ein, den wir per SMS verschickt haben.";
@ -114,10 +114,10 @@
"contacts_address_book_no_contact" = "Keine lokalen Kontakte"; "contacts_address_book_no_contact" = "Keine lokalen Kontakte";
"contacts_address_book_permission_required" = "Berechtigungen benötigt um auf lokale Kontakte zuzugreifen"; "contacts_address_book_permission_required" = "Berechtigungen benötigt um auf lokale Kontakte zuzugreifen";
// Chat participants // Chat participants
"room_participants_title" = "Teilnehmer"; "room_participants_title" = "Teilnehmende";
"room_participants_add_participant" = "Teilnehmer hinzufügen"; "room_participants_add_participant" = "Teilnehmer hinzufügen";
"room_participants_one_participant" = "1 Teilnehmer"; "room_participants_one_participant" = "1 Teilnehmer";
"room_participants_multi_participants" = "%d Teilnehmer"; "room_participants_multi_participants" = "%d Teilnehmende";
"room_participants_leave_prompt_title" = "Raum verlassen"; "room_participants_leave_prompt_title" = "Raum verlassen";
"room_participants_leave_prompt_msg" = "Bist du sicher, dass du den Raum verlassen willst?"; "room_participants_leave_prompt_msg" = "Bist du sicher, dass du den Raum verlassen willst?";
"room_participants_remove_prompt_title" = "Bestätigung"; "room_participants_remove_prompt_title" = "Bestätigung";
@ -140,7 +140,7 @@
"room_participants_action_ban" = "Aus diesem Raum bannen"; "room_participants_action_ban" = "Aus diesem Raum bannen";
"room_participants_action_ignore" = "Alle Nachrichten von diesem Nutzer verbergen"; "room_participants_action_ignore" = "Alle Nachrichten von diesem Nutzer verbergen";
"room_participants_action_unignore" = "Zeige alle Nachrichten von diesem Nutzer"; "room_participants_action_unignore" = "Zeige alle Nachrichten von diesem Nutzer";
"room_participants_action_set_moderator" = "Mache zu Moderator"; "room_participants_action_set_moderator" = "Gib Moderationsrechte";
"room_participants_action_set_admin" = "Mache zum Administrator"; "room_participants_action_set_admin" = "Mache zum Administrator";
"room_participants_action_start_new_chat" = "Starte neuen Chat"; "room_participants_action_start_new_chat" = "Starte neuen Chat";
"room_participants_action_start_video_call" = "Starte Video-Anruf"; "room_participants_action_start_video_call" = "Starte Video-Anruf";
@ -206,9 +206,9 @@
"settings_user_settings" = "NUTZER-EINSTELLUNGEN"; "settings_user_settings" = "NUTZER-EINSTELLUNGEN";
"settings_notifications_settings" = "BENACHRICHTIGUNGS-EINSTELLUNGEN"; "settings_notifications_settings" = "BENACHRICHTIGUNGS-EINSTELLUNGEN";
"settings_ignored_users" = "IGNORIERTE NUTZER"; "settings_ignored_users" = "IGNORIERTE NUTZER";
"settings_contacts" = "LOKALE KONTAKTE"; "settings_contacts" = "GERÄTEKONTAKTE";
"settings_advanced" = "ERWEITERT"; "settings_advanced" = "ERWEITERT";
"settings_other" = "WEITERES"; "settings_other" = "Weiteres";
"settings_devices" = "SITZUNGEN"; "settings_devices" = "SITZUNGEN";
"settings_cryptography" = "VERSCHLÜSSELUNG"; "settings_cryptography" = "VERSCHLÜSSELUNG";
"settings_sign_out" = "Abmelden"; "settings_sign_out" = "Abmelden";
@ -397,7 +397,7 @@
"bug_report_send_screenshot" = "Sende Bildschirmfoto"; "bug_report_send_screenshot" = "Sende Bildschirmfoto";
"bug_report_progress_zipping" = "Sammele Protokolle"; "bug_report_progress_zipping" = "Sammele Protokolle";
"bug_report_progress_uploading" = "Bericht hochladen"; "bug_report_progress_uploading" = "Bericht hochladen";
"bug_report_send" = "Gesendet"; "bug_report_send" = "Senden";
"collapse" = "zusammenklappen"; "collapse" = "zusammenklappen";
"auth_email_in_use" = "Diese E-Mail-Adresse wird bereits verwendet"; "auth_email_in_use" = "Diese E-Mail-Adresse wird bereits verwendet";
"auth_phone_in_use" = "Diese Telefonnummer wird bereits verwendet"; "auth_phone_in_use" = "Diese Telefonnummer wird bereits verwendet";
@ -547,8 +547,8 @@
"room_resource_limit_exceeded_message_contact_2_link" = "kontaktiere deinen Dienst-Administrator"; "room_resource_limit_exceeded_message_contact_2_link" = "kontaktiere deinen Dienst-Administrator";
"room_resource_limit_exceeded_message_contact_3" = " um diesen Dienst 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."; "homeserver_connection_lost" = "Konnte keine Verbindung zum Heimserver herstellen.";
"room_resource_usage_limit_reached_message_1_default" = "Dieser Heimserver hat einer seiner Ressourcengrenzen überschritten, sodass "; "room_resource_usage_limit_reached_message_1_default" = "Dieser Heimserver hat eine 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_1_monthly_active_user" = "Dieser Heimserver hat seine Begrenzung an monatlich aktiven Benutzern ü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_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."; "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:"; "auth_accept_policies" = "Bitte Regeln dieses Heimservers ansehen und akzeptieren:";
@ -1001,10 +1001,10 @@
"skip" = "Überspringen"; "skip" = "Überspringen";
"security_settings_crosssigning_info_not_bootstrapped" = "Quersignierung ist bisher nicht konfiguriert."; "security_settings_crosssigning_info_not_bootstrapped" = "Quersignierung ist bisher nicht konfiguriert.";
"room_member_power_level_admin_in" = "Admin in %@"; "room_member_power_level_admin_in" = "Admin in %@";
"room_member_power_level_moderator_in" = "Moderator in %@"; "room_member_power_level_moderator_in" = "Mod in %@";
"room_member_power_level_custom_in" = "Benutzerdefiniert (%@) in %@"; "room_member_power_level_custom_in" = "Benutzerdefiniert (%@) in %@";
"room_member_power_level_short_admin" = "Admin"; "room_member_power_level_short_admin" = "Admin";
"room_member_power_level_short_moderator" = "Moderator"; "room_member_power_level_short_moderator" = "Mod";
"room_member_power_level_short_custom" = "Benutzerdefiniert"; "room_member_power_level_short_custom" = "Benutzerdefiniert";
"security_settings_secure_backup" = "SICHERE SICHERHEITSKOPIE"; "security_settings_secure_backup" = "SICHERE SICHERHEITSKOPIE";
"security_settings_secure_backup_synchronise" = "Synchronisiere"; "security_settings_secure_backup_synchronise" = "Synchronisiere";
@ -1019,7 +1019,7 @@
"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."; "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"; "room_participants_action_security_status_complete_security" = "Vollständige Sicherheit";
"external_link_confirmation_title" = "Überprüfe diesen Link genau"; "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?"; "external_link_confirmation_message" = "Der Link %@ bringt dich auf eine andere Seite: %@\n\nSicher, dass du fortfahren möchtest?";
"security_settings_crypto_sessions_description_2" = "Wenn du dich nicht angemeldet hast, ändere dein Passwort und setze die Sichere Sicherheitskopie 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 die Schlüssel, um Datenverlust zu verhindern. Sie werden mit einem Sicherungsschlüssel gesichert."; "security_settings_secure_backup_description" = "Sichere die Schlüssel, um Datenverlust zu verhindern. Sie werden mit einem Sicherungsschlüssel gesichert.";
"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_exists" = "Dein Konto hat eine Quersignatur-Identität, aber dieser Sitzung wird noch nicht vertraut. Vervollständige die Sicherheit auf diese Sitzung.";
@ -1349,7 +1349,7 @@
"event_formatter_call_ringing" = "Läuten…"; "event_formatter_call_ringing" = "Läuten…";
"event_formatter_call_connecting" = "Verbinden…"; "event_formatter_call_connecting" = "Verbinden…";
"settings_labs_enable_ringing_for_group_calls" = "Bei Gruppenanrufen klingeln"; "settings_labs_enable_ringing_for_group_calls" = "Bei Gruppenanrufen klingeln";
"room_no_privileges_to_create_group_call" = "Du musst Admin oder Moderator sein, um einen Anruf zu starten."; "room_no_privileges_to_create_group_call" = "Du musst Admin oder Mod sein, um einen Anruf zu starten.";
"room_join_group_call" = "Beitreten"; "room_join_group_call" = "Beitreten";
// Chat // Chat
@ -1404,7 +1404,7 @@
"event_formatter_call_incoming_video" = "Eingehender Videoanruf"; "event_formatter_call_incoming_video" = "Eingehender Videoanruf";
"event_formatter_call_has_ended_with_time" = "Anruf beendet • %@"; "event_formatter_call_has_ended_with_time" = "Anruf beendet • %@";
"voice_message_stop_locked_mode_recording" = "Klicke, um die Aufnahme zu starten oder stoppen"; "voice_message_stop_locked_mode_recording" = "Klicke, um die Aufnahme zu starten oder stoppen";
"settings_device_notifications" = "Gerätbenachrichtigungen"; "settings_device_notifications" = "Gerätebenachrichtigungen";
"voice_message_lock_screen_placeholder" = "Sprachnachricht"; "voice_message_lock_screen_placeholder" = "Sprachnachricht";
"voice_message_remaining_recording_time" = "%@s übrig"; "voice_message_remaining_recording_time" = "%@s übrig";
@ -1439,7 +1439,7 @@
"settings_notify_me_for" = "Benachrichtige mich bei"; "settings_notify_me_for" = "Benachrichtige mich bei";
"settings_mentions_and_keywords" = "Erwähnungen und Schlüsselwörter"; "settings_mentions_and_keywords" = "Erwähnungen und Schlüsselwörter";
"settings_confirm_media_size_description" = "Wenn dies aktiviert ist, wirst du beim Senden von Bildern und Videos gefragt, in welcher Größe sie gesendet werden sollen."; "settings_confirm_media_size_description" = "Wenn dies aktiviert ist, wirst du beim Senden von Bildern und Videos gefragt, in welcher Größe sie gesendet werden sollen.";
"settings_confirm_media_size" = "Größe beim Senden bestätigen"; "settings_confirm_media_size" = "Größe beim Senden auswählen";
"settings_notifications" = "BENACHRICHTIGUNGEN"; "settings_notifications" = "BENACHRICHTIGUNGEN";
"settings_mentions_and_keywords_encryption_notice" = "Auf deinem Mobilgerät wirst du keine Benachrichtigungen für Erwähnungen und Schlüsselwörter in verschlüsselten Räumen erhalten."; "settings_mentions_and_keywords_encryption_notice" = "Auf deinem Mobilgerät wirst du keine Benachrichtigungen für Erwähnungen und Schlüsselwörter in verschlüsselten Räumen erhalten.";
"version_check_modal_subtitle_supported" = "Wir haben daran gearbeitet %@ zu verbessern um ein schnelleres und bereinigteres Erlebnis zu schaffen. Leider ist deine aktuelle iOS-Version mit einigen dieser Verbesserungen nicht kompatibel und wird daher nicht mehr unterstützt werden.\nWir empfehlen dir die Aktualisierung deines Betriebssystems um %@ weiterhin vollumfänglich zu nutzen."; "version_check_modal_subtitle_supported" = "Wir haben daran gearbeitet %@ zu verbessern um ein schnelleres und bereinigteres Erlebnis zu schaffen. Leider ist deine aktuelle iOS-Version mit einigen dieser Verbesserungen nicht kompatibel und wird daher nicht mehr unterstützt werden.\nWir empfehlen dir die Aktualisierung deines Betriebssystems um %@ weiterhin vollumfänglich zu nutzen.";
@ -1487,7 +1487,7 @@
"settings_contacts_enable_sync" = "Finde deine Kontakte"; "settings_contacts_enable_sync" = "Finde deine Kontakte";
"space_home_show_all_rooms" = "Alle Räume anzeigen"; "space_home_show_all_rooms" = "Alle Räume anzeigen";
"service_terms_modal_information_description_integration_manager" = "Ein Integrationsmanager erlaubt dir, externe Funktionen hinzuzufügen."; "service_terms_modal_information_description_integration_manager" = "Ein Integrationsmanager erlaubt dir, externe Funktionen hinzuzufügen.";
"service_terms_modal_information_description_identity_server" = "Der Identitätsserver sucht anhand der Telefonnummern und E-Mails in deinen Kontakten, ob diese einen Matrix-Account haben."; "service_terms_modal_information_description_identity_server" = "Der Identitätsserver sucht anhand der Telefonnummern und E-Mails deiner Kontakte nach ihren Matrix-Accounts.";
"service_terms_modal_information_title_integration_manager" = "Integrationsmanager"; "service_terms_modal_information_title_integration_manager" = "Integrationsmanager";
// Alert explaining what an identity server / integration manager is. // Alert explaining what an identity server / integration manager is.
@ -1502,8 +1502,68 @@
"service_terms_modal_title_message" = "Zum Fortfahren musst du die Nutzungsbedingungen akzeptieren"; "service_terms_modal_title_message" = "Zum Fortfahren musst du die Nutzungsbedingungen akzeptieren";
"settings_contacts_enable_sync_description" = "Dies verwendet deinen Identitätsserver um dich mit deinen Kontakten zu verbinden."; "settings_contacts_enable_sync_description" = "Dies verwendet deinen Identitätsserver um dich mit deinen Kontakten zu verbinden.";
"settings_phone_contacts" = "KONTAKTE AM HANDY"; "settings_phone_contacts" = "KONTAKTE AM HANDY";
"room_event_action_forward" = "Weiter"; "room_event_action_forward" = "Weiterleiten";
"find_your_contacts_identity_service_error" = "Konnte keine Verbindung zum Identitätsserver aufbauen."; "find_your_contacts_identity_service_error" = "Konnte keine Verbindung zum Identitätsserver aufbauen.";
"find_your_contacts_button_title" = "Finde deine Kontakte"; "find_your_contacts_button_title" = "Finde deine Kontakte";
"contacts_address_book_permission_denied_alert_message" = "Um Kontakte zu aktivieren, öffne die Einstellungen deines Gerätes."; "contacts_address_book_permission_denied_alert_message" = "Um Kontakte zu aktivieren, öffne die Einstellungen deines Gerätes.";
"contacts_address_book_permission_denied_alert_title" = "Kontakte deaktiviert"; "contacts_address_book_permission_denied_alert_title" = "Kontakte deaktiviert";
"poll_edit_form_create_options" = "Erstelle Optionen";
"settings_discovery_accept_terms" = "Bedingungen des Identitätsservers akzeptieren";
"find_your_contacts_message" = "Lass dir von %@ deine Kontakte anzeigen um schnell mit denen zu chatten, die du am besten kennst.";
"poll_timeline_votes_count" = "%lu Stimmen";
"poll_timeline_one_vote" = "1 Stimme";
"poll_edit_form_add_option" = "Option hinzufügen";
"poll_edit_form_option_number" = "Option %lu";
"poll_edit_form_question_or_topic" = "Frage oder Thematik";
"room_event_action_end_poll" = "Umfrage beenden";
"room_event_action_remove_poll" = "Umfrage entfernen";
// Mark: - Polls
"poll_edit_form_create_poll" = "Umfrage erstellen";
"settings_labs_enabled_polls" = "Umfragen";
"share_extension_send_now" = "Jetzt senden";
"accessibility_button_label" = "Knopf";
"settings_analytics_and_crash_data" = "Sende Absturz- und Analysedaten";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "Wir senden <b>keine</b> Informationen an Dritte";
"analytics_prompt_terms_link_new_user" = "hier";
// Analytics
"analytics_prompt_title" = "Hilf dabei %@ zu verbessern";
"settings_about" = "ÜBER";
"enable" = "Aktivieren";
"analytics_prompt_message_upgrade" = "Du hast in der Vergangenheit bereits zugestimmt anonyme Nutzungsdaten mit uns zu teilen. Jetzt werden wir als Hilfe, um zu verstehen, wie Personen mehrere Geräte benutzen, eine zufällige Kennung generieren, die zwischen deinen Geräten geteilt wird.";
"analytics_prompt_message_new_user" = "Hilf uns dabei Probleme zu identifizieren und Element zu verbessern, indem du anonyme Nutzungsdaten teilst. Um zu verstehen, wie Personen mehrere Geräte benutzen, werden wir eine zufällige Kennung generieren, die zwischen deinen Geräten geteilt wird.";
"find_your_contacts_title" = "Starte mit der Auflistung deiner Kontakte";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "Du kannst unsere gesamten Bedingungen %@ nachlesen.";
"poll_timeline_total_votes" = "%lu Stimmen abgegeben";
"poll_timeline_total_one_vote" = "1 Stimme abgegeben";
"poll_timeline_total_no_votes" = "Keine Stimmen abgegeben";
"poll_timeline_not_closed_action" = "OK";
"poll_timeline_vote_not_registered_action" = "OK";
"poll_edit_form_post_failure_action" = "OK";
"poll_edit_form_poll_question_or_topic" = "Frage oder Thema der Umfrage";
"poll_edit_form_input_placeholder" = "Schreib etwas";
"analytics_prompt_terms_link_upgrade" = "hier";
"poll_timeline_not_closed_title" = "Fehler beim Beenden der Abstimmung";
"poll_timeline_vote_not_registered_subtitle" = "Wir konnten deine Stimme leider nicht erfassen. Versuche es bitte erneut";
"poll_timeline_total_final_results" = "Es wurden %lu Stimmen abgegeben";
"poll_timeline_total_final_results_one_vote" = "Es wurde 1 Stimme abgegeben";
"poll_timeline_total_votes_not_voted" = "%lu Stimmen abgegeben. Stimme ab, um die Ergebnisse zu sehen";
"poll_timeline_total_one_vote_not_voted" = "1 Stimme abgegeben. Stimme ab, um die Ergebnisse zu sehen";
"poll_timeline_not_closed_subtitle" = "Versuche es bitte erneut";
"poll_timeline_vote_not_registered_title" = "Stimme nicht erfasst";
"poll_edit_form_post_failure_subtitle" = "Versuche es bitte erneut";
"poll_edit_form_post_failure_title" = "Fehler beim Senden der Abstimmung";
"share_extension_low_quality_video_message" = "Für eine bessere Qualität sende es in %@ oder sende es in niedriger Qualität.";
"share_extension_low_quality_video_title" = "Das Video wird in niedriger Qualität gesendet werden";
"analytics_prompt_stop" = "Teilen beenden";
"analytics_prompt_not_now" = "Nicht jetzt";
"analytics_prompt_yes" = "Das ist Okay";
"analytics_prompt_point_3" = "Du kannst dies jederzeit in den Einstellungen deaktivieren";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "Wir erfassen und analysieren <b>keine</b> Accountdaten";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Alle unsere Bedingungen lesen %@. Bist du damit einverstanden?";

View file

@ -21,3 +21,4 @@
"NSContactsUsageDescription" = "Element will show your contacts so you can invite them to chat."; "NSContactsUsageDescription" = "Element will show your contacts so you can invite them to chat.";
"NSCalendarsUsageDescription" = "See your scheduled meetings in the app."; "NSCalendarsUsageDescription" = "See your scheduled meetings in the app.";
"NSFaceIDUsageDescription" = "Face ID is used to access your app."; "NSFaceIDUsageDescription" = "Face ID is used to access your app.";
"NSLocationWhenInUseUsageDescription" = "When you share your location to people, Element needs access to show them a map.";

View file

@ -71,6 +71,9 @@
/* New file message from a specific person, not referencing a room. */ /* New file message from a specific person, not referencing a room. */
"FILE_FROM_USER" = "%@ sent a file %@"; "FILE_FROM_USER" = "%@ sent a file %@";
/* New file message from a specific person, not referencing a room. */
"LOCATION_FROM_USER" = "%@ shared their location";
/* A single unread message in a room */ /* A single unread message in a room */
"SINGLE_UNREAD_IN_ROOM" = "You received a message in %@"; "SINGLE_UNREAD_IN_ROOM" = "You received a message in %@";

View file

@ -41,6 +41,7 @@
"retry" = "Retry"; "retry" = "Retry";
"on" = "On"; "on" = "On";
"off" = "Off"; "off" = "Off";
"enable" = "Enable";
"cancel" = "Cancel"; "cancel" = "Cancel";
"save" = "Save"; "save" = "Save";
"join" = "Join"; "join" = "Join";
@ -65,6 +66,7 @@
"less" = "Less"; "less" = "Less";
"open" = "Open"; "open" = "Open";
"done" = "Done"; "done" = "Done";
"ok" = "OK";
// Call Bar // Call Bar
"callbar_only_single_active" = "Tap to return to the call (%@)"; "callbar_only_single_active" = "Tap to return to the call (%@)";
@ -77,6 +79,7 @@
// Accessibility // Accessibility
"accessibility_checkbox_label" = "checkbox"; "accessibility_checkbox_label" = "checkbox";
"accessibility_button_label" = "button";
// Authentication // Authentication
"auth_login" = "Log in"; "auth_login" = "Log in";
@ -577,7 +580,7 @@ Tap the + to start adding people.";
"settings_term_conditions" = "Terms & Conditions"; "settings_term_conditions" = "Terms & Conditions";
"settings_privacy_policy" = "Privacy Policy"; "settings_privacy_policy" = "Privacy Policy";
"settings_third_party_notices" = "Third-party Notices"; "settings_third_party_notices" = "Third-party Notices";
"settings_send_crash_report" = "Send anon crash & usage data"; "settings_analytics_and_crash_data" = "Send crash and analytics data";
"settings_enable_rageshake" = "Rage shake to report bug"; "settings_enable_rageshake" = "Rage shake to report bug";
"settings_clear_cache" = "Clear cache"; "settings_clear_cache" = "Clear cache";
@ -945,8 +948,24 @@ Tap the + to start adding people.";
"no_voip_title" = "Incoming call"; "no_voip_title" = "Incoming call";
"no_voip" = "%@ is calling you but %@ does not support calls yet.\nYou can ignore this notification and answer the call from another device or you can reject it."; "no_voip" = "%@ is calling you but %@ does not support calls yet.\nYou can ignore this notification and answer the call from another device or you can reject it.";
// Crash report // Analytics
"google_analytics_use_prompt" = "Would you like to help improve %@ by automatically reporting anonymous crash reports and usage data?"; "analytics_prompt_title" = "Help improve %@";
"analytics_prompt_message_new_user" = "Help us identify issues and improve %@ by sharing anonymous usage data. To understand how people use multiple devices, well generate a random identifier, shared by your devices.";
"analytics_prompt_message_upgrade" = "You previously consented to share anonymous usage data with us. Now, to help understand how people use multiple devices, well generate a random identifier, shared by your devices.";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "You can read all our terms %@.";
"analytics_prompt_terms_link_new_user" = "here";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Read all our terms %@. Is that OK?";
"analytics_prompt_terms_link_upgrade" = "here";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "We <b>don't</b> record or profile any account data";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "We <b>don't</b> share information with third parties";
"analytics_prompt_point_3" = "You can turn this off anytime in settings";
"analytics_prompt_not_now" = "Not now";
"analytics_prompt_yes" = "Yes, that's fine";
"analytics_prompt_stop" = "Stop sharing";
// Crypto // Crypto
"e2e_enabling_on_app_update" = "%@ now supports end-to-end encryption but you need to log in again to enable it.\n\nYou can do it now or later from the application settings."; "e2e_enabling_on_app_update" = "%@ now supports end-to-end encryption but you need to log in again to enable it.\n\nYou can do it now or later from the application settings.";
@ -1733,7 +1752,7 @@ Tap the + to start adding people.";
"spaces_coming_soon_title" = "Coming soon"; "spaces_coming_soon_title" = "Coming soon";
"spaces_add_rooms_coming_soon_title" = "Adding rooms coming soon"; "spaces_add_rooms_coming_soon_title" = "Adding rooms coming soon";
"spaces_invites_coming_soon_title" = "Invites coming soon"; "spaces_invites_coming_soon_title" = "Invites coming soon";
"spaces_coming_soon_detail" = "This feature hasnt been implemented here, but its on the way. For now, you can do that with Element on your computer."; "spaces_coming_soon_detail" = "This feature hasnt been implemented here, but its on the way. For now, you can do that with %@ on your computer.";
"space_participants_action_remove" = "Remove from this space"; "space_participants_action_remove" = "Remove from this space";
"space_participants_action_ban" = "Ban from this space"; "space_participants_action_ban" = "Ban from this space";
"space_home_show_all_rooms" = "Show all rooms"; "space_home_show_all_rooms" = "Show all rooms";
@ -1803,8 +1822,6 @@ Tap the + to start adding people.";
"poll_edit_form_post_failure_subtitle" = "Please try again"; "poll_edit_form_post_failure_subtitle" = "Please try again";
"poll_edit_form_post_failure_action" = "OK";
"poll_timeline_one_vote" = "1 vote"; "poll_timeline_one_vote" = "1 vote";
"poll_timeline_votes_count" = "%lu votes"; "poll_timeline_votes_count" = "%lu votes";
@ -1827,10 +1844,32 @@ Tap the + to start adding people.";
"poll_timeline_vote_not_registered_subtitle" = "Sorry, your vote was not registered, please try again"; "poll_timeline_vote_not_registered_subtitle" = "Sorry, your vote was not registered, please try again";
"poll_timeline_vote_not_registered_action" = "OK";
"poll_timeline_not_closed_title" = "Failed to end poll"; "poll_timeline_not_closed_title" = "Failed to end poll";
"poll_timeline_not_closed_subtitle" = "Please try again"; "poll_timeline_not_closed_subtitle" = "Please try again";
"poll_timeline_not_closed_action" = "OK"; // MARK: - Location sharing
"location_sharing_title" = "Location";
"location_sharing_close_action" = "Close";
"location_sharing_share_action" = "Share";
"location_sharing_loading_map_error_title" = "%@ could not load the map. Please try again later.";
"location_sharing_locating_user_error_title" = "%@ could not access your location. Please try again later.";
"location_sharing_invalid_authorization_error_title" = "%@ does not have permission to access your location. You can enable access in Settings > Location";
"location_sharing_invalid_authorization_not_now" = "Not now";
"location_sharing_invalid_authorization_settings" = "Settings";
"location_sharing_open_apple_maps" = "Open in Apple Maps";
"location_sharing_open_google_maps" = "Open in Google Maps";
"location_sharing_settings_header" = "Location sharing";
"location_sharing_settings_toggle_title" = "Enable location sharing";

View file

@ -1474,7 +1474,7 @@
"share_extension_low_quality_video_title" = "Saadame video madalama kvalitediga"; "share_extension_low_quality_video_title" = "Saadame video madalama kvalitediga";
"settings_about" = "TEAVE MEIST"; "settings_about" = "TEAVE MEIST";
"poll_edit_form_add_option" = "Lisa valik"; "poll_edit_form_add_option" = "Lisa valik";
"poll_edit_form_option_number" = "Valik %d"; "poll_edit_form_option_number" = "Valik %lu";
"poll_edit_form_create_options" = "Koosta valikud"; "poll_edit_form_create_options" = "Koosta valikud";
"poll_edit_form_input_placeholder" = "Kirjuta midagi"; "poll_edit_form_input_placeholder" = "Kirjuta midagi";
"poll_edit_form_question_or_topic" = "Küsimus või teema"; "poll_edit_form_question_or_topic" = "Küsimus või teema";
@ -1484,3 +1484,46 @@
"poll_edit_form_create_poll" = "Koosta üks küsitlus"; "poll_edit_form_create_poll" = "Koosta üks küsitlus";
"settings_discovery_accept_terms" = "Nõustu isikutuvastusserveri tingimustega"; "settings_discovery_accept_terms" = "Nõustu isikutuvastusserveri tingimustega";
"poll_timeline_not_closed_action" = "Sobib";
"poll_timeline_not_closed_subtitle" = "Palun proovi uuesti";
"poll_timeline_not_closed_title" = "Küsitluse lõpetamine ei õnnestunud";
"poll_timeline_vote_not_registered_action" = "Sobib";
"poll_timeline_vote_not_registered_subtitle" = "Vabandust, aga sinu valik jäi salvestamata. Palun proovi uuesti";
"poll_timeline_vote_not_registered_title" = "Hääl ei salvestunud";
"poll_timeline_total_final_results" = "%lu'l häälel põhinev lõpptulemus";
"poll_timeline_total_final_results_one_vote" = "Ühel häälel põhinev lõpptulemus";
"poll_timeline_total_votes_not_voted" = "%lu hääletanut. Tulemuste nägemiseks osale ise ka küsitluses";
"poll_timeline_total_one_vote_not_voted" = "1 hääletanu. Tulemuste nägemiseks osale ise ka küsitluses";
"poll_timeline_total_votes" = "%lu hääletanut";
"poll_timeline_total_one_vote" = "1 hääletanu";
"poll_timeline_total_no_votes" = "Hääletanuid ei ole";
"poll_timeline_votes_count" = "%lu häält";
"poll_timeline_one_vote" = "1 hääl";
"poll_edit_form_post_failure_action" = "Sobib";
"poll_edit_form_post_failure_subtitle" = "Palun proovi uuesti";
"poll_edit_form_post_failure_title" = "Küsitluse üleslaadimine ei õnnestunud";
"settings_labs_enabled_polls" = "Küsitlused";
"room_event_action_end_poll" = "Lõpeta küsitlus";
"room_event_action_remove_poll" = "Kustuta küsitlus";
"analytics_prompt_stop" = "Lõpeta andmete jagamine";
"analytics_prompt_yes" = "Jah, see on sobilik";
"analytics_prompt_not_now" = "Mitte praegu";
"analytics_prompt_point_3" = "Seadistustest saad alati määrata, et see funktsionaalsus pole kasutusel";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "Meie <b>ei</b> jaga teavet kolmandate osapooltega";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "Meie <b>ei</b> salvesta ega profileeri sinu kasutajakonto andmeid";
"analytics_prompt_terms_link_upgrade" = "siit";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Kõik meie tingimused leiad %@. Kas sa oled nõus?";
"analytics_prompt_terms_link_new_user" = "siit";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "Meie kasutustingimused leiad %@.";
"analytics_prompt_message_upgrade" = "Sa oled varem nõustunud meiega anonüümsete andmete jagamisega. Selleks, et mõistaksime, kuidas kasutajad erinevaid seadmeid pruugivad, me loome sinu seadmetele ühise juhusliku tunnuse.";
"analytics_prompt_message_new_user" = "Võimalike vigade leidmiseks ja Element'i arendamiseks jaga meiega anonüümseid andmeid. Selleks, et mõistaksime, kuidas kasutajad erinevaid seadmeid pruugivad me loome sinu seadmetele ühise juhusliku tunnuse.";
// Analytics
"analytics_prompt_title" = "Aita arendada %@ rakendust";
"settings_analytics_and_crash_data" = "Saada rakenduse vigade ja analüütika andmeid";
"accessibility_button_label" = "nupp";
"enable" = "Võta kasutusele";

View file

@ -2,6 +2,6 @@
"NSCameraUsageDescription" = "Lappareil photo est utilisé pour prendre des photos, des vidéos et pour passer des appels vidéo."; "NSCameraUsageDescription" = "Lappareil photo est utilisé pour prendre des photos, des vidéos et pour passer des appels vidéo.";
"NSPhotoLibraryUsageDescription" = "La photothèque est utilisée pour envoyer des photos et des vidéos."; "NSPhotoLibraryUsageDescription" = "La photothèque est utilisée pour envoyer des photos et des vidéos.";
"NSMicrophoneUsageDescription" = "Element doit avoir accès au microphone pour passer des appels, capturer des vidéos et enregistrer des messages vocaux."; "NSMicrophoneUsageDescription" = "Element doit avoir accès au microphone pour passer des appels, capturer des vidéos et enregistrer des messages vocaux.";
"NSContactsUsageDescription" = "Pour découvrir vos contacts qui utilisent déjà Matrix, Element peut envoyer les adresses e-mail et les numéros de téléphone de votre carnet dadresse à votre serveur didentité Matrix. Si votre serveur didentité le prend en charge, les données personnelles sont hachées avant lenvoi  vérifiez sa politique de confidentialité pour plus de détails."; "NSContactsUsageDescription" = "Element affichera vos contacts pour que vous puissiez les inviter à parler.";
"NSCalendarsUsageDescription" = "Voir vos rendez-vous dans lapplication."; "NSCalendarsUsageDescription" = "Voir vos rendez-vous dans lapplication.";
"NSFaceIDUsageDescription" = "Face ID est utilisé pour accéder à votre application."; "NSFaceIDUsageDescription" = "Face ID est utilisé pour accéder à votre application.";

View file

@ -62,7 +62,7 @@
"auth_missing_phone" = "Numéro de téléphone manquant"; "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_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_password_dont_match" = "Les mots de passe ne correspondent pas";
"auth_username_in_use" = ""; "auth_username_in_use" = "Nom dutilisateur déjà pris";
"auth_forgot_password" = "Mot de passe oublié ?"; "auth_forgot_password" = "Mot de passe oublié ?";
"auth_use_server_options" = "Utiliser un serveur personnalisé (avancé)"; "auth_use_server_options" = "Utiliser un serveur personnalisé (avancé)";
"auth_email_validation_message" = "Merci de vérifier vos e-mails pour continuer linscription"; "auth_email_validation_message" = "Merci de vérifier vos e-mails pour continuer linscription";
@ -94,7 +94,7 @@
"room_creation_keep_private" = "Garder privée"; "room_creation_keep_private" = "Garder privée";
"room_creation_make_private" = "Rendre 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."; "room_creation_wait_for_creation" = "Un salon est déjà en cours de création. Veuillez patienter.";
"room_creation_invite_another_user" = "Rechercher/inviter par identifiant, nom ou e-mail"; "room_creation_invite_another_user" = "Identifiant, nom ou e-mail";
// Room recents // Room recents
"room_recents_directory_section" = "RÉPERTOIRE DES SALONS"; "room_recents_directory_section" = "RÉPERTOIRE DES SALONS";
"room_recents_favourites_section" = "FAVORIS"; "room_recents_favourites_section" = "FAVORIS";
@ -251,9 +251,9 @@
"settings_user_settings" = "PRÉFÉRENCES UTILISATEUR"; "settings_user_settings" = "PRÉFÉRENCES UTILISATEUR";
"settings_notifications_settings" = "PRÉFÉRENCES DE NOTIFICATIONS"; "settings_notifications_settings" = "PRÉFÉRENCES DE NOTIFICATIONS";
"settings_ignored_users" = "UTILISATEURS IGNORÉS"; "settings_ignored_users" = "UTILISATEURS IGNORÉS";
"settings_contacts" = "CONTACTS LOCAUX"; "settings_contacts" = "CONTACTS DE LAPPAREIL";
"settings_advanced" = "AVANCÉ"; "settings_advanced" = "AVANCÉ";
"settings_other" = "AUTRES"; "settings_other" = "Autres";
"settings_labs" = "EXPÉRIMENTAL"; "settings_labs" = "EXPÉRIMENTAL";
"settings_devices" = "SESSIONS"; "settings_devices" = "SESSIONS";
"settings_cryptography" = "CHIFFREMENT"; "settings_cryptography" = "CHIFFREMENT";
@ -1520,3 +1520,87 @@
"room_recents_suggested_rooms_section" = "SALONS RECOMMANDÉS"; "room_recents_suggested_rooms_section" = "SALONS RECOMMANDÉS";
"done" = "Terminé"; "done" = "Terminé";
"open" = "Ouvrir"; "open" = "Ouvrir";
"poll_timeline_not_closed_action" = "Ok";
"poll_timeline_not_closed_subtitle" = "Merci de réessayer";
"poll_timeline_not_closed_title" = "Échec de la fermeture du sondage";
"poll_timeline_vote_not_registered_action" = "Ok";
"poll_timeline_vote_not_registered_subtitle" = "Désolé votre vote na pas été enregistré, veuillez réessayer";
"poll_timeline_vote_not_registered_title" = "Vote non enregistré";
"poll_timeline_total_final_results" = "Résultats finaux basés sur %lu votes";
"poll_timeline_total_final_results_one_vote" = "Résultats finaux basés sur 1 vote";
"poll_timeline_total_votes_not_voted" = "%lu votes recueillis. Votez pour consulter les résultats";
"poll_timeline_total_one_vote_not_voted" = "1 vote recueilli. Votez pour connaître les résultats";
"poll_timeline_total_votes" = "%lu votes recueillis";
"poll_timeline_total_one_vote" = "1 vote recueilli";
"poll_timeline_total_no_votes" = "Aucun vote recueilli";
"poll_timeline_votes_count" = "%lu votes";
"poll_timeline_one_vote" = "1 vote";
"poll_edit_form_post_failure_action" = "Ok";
"poll_edit_form_post_failure_subtitle" = "Merci de réessayer";
"poll_edit_form_post_failure_title" = "Échec de la publication du sondage";
"poll_edit_form_add_option" = "Ajouter une option";
"poll_edit_form_option_number" = "Option %lu";
"poll_edit_form_create_options" = "Ajouter des options";
"poll_edit_form_input_placeholder" = "Écrivez quelque chose";
"poll_edit_form_question_or_topic" = "Question ou sujet";
"poll_edit_form_poll_question_or_topic" = "Question ou sujet du sondage";
// Mark: - Polls
"poll_edit_form_create_poll" = "Créer un sondage";
"space_home_show_all_rooms" = "Afficher tous les salons";
"service_terms_modal_information_description_integration_manager" = "Un gestionnaire dintégrations vous permet dajouter des fonctionnalités de tierces-parties.";
"service_terms_modal_information_description_identity_server" = "Un serveur didentité vous aide à trouver vos contacts, en recherchant leur numéro de téléphone ou adresse e-mail pour vérifier sils ont déjà un compte.";
"service_terms_modal_information_title_integration_manager" = "Gestionnaire dintégrations";
// Alert explaining what an identity server / integration manager is.
"service_terms_modal_information_title_identity_server" = "Serveur didentité";
"service_terms_modal_description_integration_manager" = "Ceci vous permettra dutiliser les robots, passerelles, widgets et jeux dautocollants.";
"service_terms_modal_description_identity_server" = "Ceci permettra aux personnes qui ont votre numéro de téléphone ou adresse e-mail de sauvegardées dans leurs contacts de vous trouver.";
"service_terms_modal_table_header_integration_manager" = "CONDITIONS DUTILISATION DU GESTIONNAIRE DINTÉGRATIONS";
"service_terms_modal_table_header_identity_server" = "CONDITIONS DUTILISATION DU SERVEUR DIDENTITÉ";
"service_terms_modal_footer" = "Ceci peut être désactivé a nimporte quel moment dans les paramètres.";
// Service terms
"service_terms_modal_title_message" = "Pour poursuivre, acceptez nos conditions dutilisation";
"share_extension_send_now" = "Envoyer maintenant";
"share_extension_low_quality_video_message" = "Envoyez depuis %@ pour une meilleure qualité. Ou envoyez en mauvaise qualité ci-dessous.";
"share_extension_low_quality_video_title" = "La vidéo sera envoyée en mauvaise qualité";
"analytics_prompt_stop" = "Arrêter de partager";
"analytics_prompt_yes" = "Oui, ça me va";
"analytics_prompt_not_now" = "Pas maintenant";
"analytics_prompt_point_3" = "Vous pouvez désactiver ceci à tout moment dans les paramètres";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "Nous ne partageons <b>pas</b> les données avec des entités tierces";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "Nous nenregistrons et ne profilons <b>pas</b> de données liées à votre compte";
"analytics_prompt_terms_link_upgrade" = "ici";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Lisez nos conditions dutilisation %@. Êtes vous daccord ?";
"analytics_prompt_terms_link_new_user" = "ici";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "Vous pouvez lire nos conditions dutilisation %@.";
"analytics_prompt_message_upgrade" = "Vous aviez consenti précédemment à partager des rapports dutilisation avec nous. Désormais, pour nous aider à comprendre comment les gens utilisent cette application sur plusieurs appareils, nous allons générer un identifiant aléatoire commun à tous vos appareils.";
"analytics_prompt_message_new_user" = "Aidez nous à identifier les problèmes et améliorer Element en envoyant des rapports dusage anonymes. Pour comprendre de quelle manière les gens utilisent Element sur plusieurs appareils, nous créeront un identifiant aléatoire commun à tous vos appareils.";
// Analytics
"analytics_prompt_title" = "Aidez à améliorer %@";
"settings_discovery_accept_terms" = "Accepter les conditions du serveur didentité";
"settings_analytics_and_crash_data" = "Envoyer les rapports de plantages et dutilisation";
"settings_labs_enabled_polls" = "Sondages";
"settings_about" = "À PROPOS";
"settings_phone_contacts" = "CONTACTS DU TÉLÉPHONE";
"room_event_action_forward" = "Transférer";
"room_event_action_end_poll" = "Mettre fin au sondage";
"room_event_action_remove_poll" = "Supprimer le sondage";
"find_your_contacts_identity_service_error" = "Impossible de se connecter au serveur didentité.";
"find_your_contacts_button_title" = "Trouvez vos contacts";
"find_your_contacts_message" = "Permettez à %@ daccéder à vos contacts pour commencer à discuter rapidement avec ceux que vous connaissez le mieux.";
"contacts_address_book_permission_denied_alert_message" = "Pour activer les contacts, rendez vous dans les paramètres de votre appareil.";
"contacts_address_book_permission_denied_alert_title" = "Contacts désactivés";
"accessibility_button_label" = "bouton";
"enable" = "Activer";
"find_your_contacts_footer" = "Cette fonctionnalité peut être désactivé à tout moment à partir des paramètres.";
"find_your_contacts_title" = "Commencez par lister vos contacts";
"settings_contacts_enable_sync_description" = "Cette fonctionnalité utilisera votre serveur d'identité pour vous connecter avec vos contacts, ainsi que pour les aider à vous trouver.";
"settings_contacts_enable_sync" = "Trouvez vos contacts";

View file

@ -1533,7 +1533,7 @@
"space_home_show_all_rooms" = "Minden szoba megjelenítése"; "space_home_show_all_rooms" = "Minden szoba megjelenítése";
"room_event_action_forward" = "Továbbítás"; "room_event_action_forward" = "Továbbítás";
"poll_edit_form_add_option" = "Lehetőség hozzáadása"; "poll_edit_form_add_option" = "Lehetőség hozzáadása";
"poll_edit_form_option_number" = "%d lehetőség"; "poll_edit_form_option_number" = "%lu lehetőség";
"poll_edit_form_create_options" = "Lehetőségek hozzáadása"; "poll_edit_form_create_options" = "Lehetőségek hozzáadása";
"poll_edit_form_input_placeholder" = "Írjon valamit"; "poll_edit_form_input_placeholder" = "Írjon valamit";
"poll_edit_form_question_or_topic" = "Kérdés vagy téma"; "poll_edit_form_question_or_topic" = "Kérdés vagy téma";
@ -1547,3 +1547,46 @@
"share_extension_low_quality_video_title" = "Alacsony minőségű videó lesz elküldve"; "share_extension_low_quality_video_title" = "Alacsony minőségű videó lesz elküldve";
"settings_discovery_accept_terms" = "Azonosítási Szolgáltatás felhasználási feltételeinek elfogadása"; "settings_discovery_accept_terms" = "Azonosítási Szolgáltatás felhasználási feltételeinek elfogadása";
"settings_about" = "NÉVJEGY"; "settings_about" = "NÉVJEGY";
"poll_timeline_not_closed_action" = "OK";
"poll_timeline_not_closed_subtitle" = "Kérlek próbáld újra";
"poll_timeline_not_closed_title" = "Nem sikerült a szavazás lezárása";
"poll_timeline_vote_not_registered_action" = "OK";
"poll_timeline_vote_not_registered_subtitle" = "Sajnos a szavazatod nem lett rögzítve. Kérlek ismételd meg újra";
"poll_timeline_vote_not_registered_title" = "Szavazás nem sikerült";
"poll_timeline_total_final_results" = "Végeredmény %lu szavazat alapján";
"poll_timeline_total_final_results_one_vote" = "Eredmény 1 szavazat alapján";
"poll_timeline_total_votes_not_voted" = "%lu szavazatot adtak le. Szavazz az eredmény megtekintéséhez";
"poll_timeline_total_one_vote_not_voted" = "1 szavazatot adtak le. Szavazz az eredmény megtekintéséhez";
"poll_timeline_total_votes" = "%lu szavazatot adtak le";
"poll_timeline_total_one_vote" = "1 szavazatot adtak le";
"poll_timeline_total_no_votes" = "Nem adtak le szavazatot";
"poll_timeline_votes_count" = "%lu szavazat";
"poll_timeline_one_vote" = "1 szavazat";
"poll_edit_form_post_failure_action" = "OK";
"poll_edit_form_post_failure_subtitle" = "Kérlek próbáld újra";
"poll_edit_form_post_failure_title" = "A szavazást nem sikerült beküldeni";
"analytics_prompt_stop" = "Megosztás megállítása";
"analytics_prompt_yes" = "Igen, rendben van";
"analytics_prompt_not_now" = "Nem most";
"analytics_prompt_point_3" = "Ezt bármikor kikapcsolhatod a beállításokban";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "<b>Nem</b> osztjuk meg az információt harmadik féllel";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "<b>Nem</b> küldünk és nem profilozunk semmilyen fiók adatot";
"analytics_prompt_terms_link_upgrade" = "itt";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Olvasd el minden feltételünket: %@. Rendben?";
"analytics_prompt_terms_link_new_user" = "itt";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "Az összes feltételünket elolvashatod itt: %@.";
"analytics_prompt_message_new_user" = "Segíts észrevennünk a hibákat, és jobbá tenni az Element-et a névtelen használati adatok küldése által. Ahhoz, hogy megértsük, hogyan használnak a felhasználók egyszerre több eszközt, egy véletlenszerű azonosítót generálunk, ami az eszközeid között meg lesz osztva.";
// Analytics
"analytics_prompt_title" = "Segíts jobbá tenni %@";
"settings_analytics_and_crash_data" = "Összeomlás és analitikai adatok küldése";
"settings_labs_enabled_polls" = "Szavazások";
"room_event_action_end_poll" = "Szavazás lezárása";
"room_event_action_remove_poll" = "Szavazás törlése";
"accessibility_button_label" = "gomb";
"enable" = "Engedélyezés";
"analytics_prompt_message_upgrade" = "Korábban beleegyeztél, hogy velünk anonimizált adatokat osztasz meg. Most, hogy jobban megértsük, hogyan használnak több eszközt az emberek, véletlenszerű azonosítót állítunk elő amit az eszközeid használni fognak.";

View file

@ -102,7 +102,7 @@
"joined" = "Bergabung"; "joined" = "Bergabung";
"collapse" = "tutup"; "collapse" = "tutup";
"store_promotional_text" = "Aplikasi perpesanan dan kolaborasi yang menjaga privasi, pada jaringan terbuka. Terdesentralisasi untuk Anda kendali. Tidak ada penambangan data, tidak ada pintu belakang dan tidak ada akses pihak ketiga."; "store_promotional_text" = "Aplikasi perpesanan dan kolaborasi yang menjaga privasi, pada jaringan terbuka. Terdesentralisasi untuk Anda kendali. Tidak ada penambangan data, tidak ada pintu belakang dan tidak ada akses pihak ketiga.";
"store_full_description" = "Element adalah aplikasi messenger dan kolaborasi tipe baru yang:\n\n1. Menempatkan Anda dalam kendali untuk mempertahankan privasi Anda\n2. Memungkinkan Anda berkomunikasi dengan siapa pun di jaringan Matrix, dan bahkan di luar dengan mengintegrasikan dengan aplikasi seperti Slack\n3. Melindungi Anda dari iklan, menambangan data, pintu belakang, dan taman berdinding\n4. Mengamankan Anda melalui enkripsi ujung-ke-ujung, dengan penandatanganan silang untuk memverifikasi orang lain\n\nElement benar-benar berbeda dari aplikasi perpesanan dan kolaborasi lain karena Element terdesentralisasi dan sumber terbuka.\n\nElement memungkinkan Anda host sendiri - atau memilih host - sehingga Anda memiliki privasi, kepemilikan, dan kontrol data dan obrolan Anda. Ini memberi Anda akses ke jaringan terbuka, jadi Anda tidak hanya terjebak berbicara dengan pengguna Element. Itu sangat aman.\n\nElement dapat melakukan semua ini karena beroperasi pada Matrix - standar untuk komunikasi terdesentralisasi terbuka.\n\nElement menempatkan Anda dalam kendali dengan membiarkan Anda memilih siapa yang menghost percakapan Anda. Dari aplikasi Element, Anda dapat memilih untuk menghost dengan cara yang berbeda:\n\n1. Dapatkan akun gratis pada server publik matrix.org\n2. Host sendiri akun Anda dengan menjalankan server pada perangkat keras Anda sendiri\n3. Mendaftar untuk akun di server khusus dengan hanya berlangganan platform hosting Element Matrix Services\n\nMengapa memilih Element?\n\nMILIKI DATA ANDA: Anda memutuskan di mana untuk menyimpan data dan pesan Anda. Anda memilikinya dan mengendalikannya, bukan perusahaan besar yang menambang data Anda atau memberikan akses ke pihak ketiga.\n\nPESAN DAN KOLABORASI TERBUKA: Anda dapat mengobrol dengan orang lain di jaringan Matrix, jika mereka menggunakan Element atau aplikasi Matrix lain, dan bahkan jika mereka menggunakan sistem perpesanan seperti Slack, IRC atau XMPP.\n\nSANGAT AMAN: Enkripsi ujung-ke-ujung yang nyata (hanya mereka yang dalam percakapan dapat mendekripsi pesan), dan penandatanganan silang untuk memverifikasi perangkat anggota obrolan.\n\nKOMUNIKASI LENGKAP: Perpesanan, panggilan suara dan video, pembagian file, pembagian layar dan banyak integrasi, bot dan widget. Buat ruangan, komunitas, tetap terhubung dan selesaikan hal-hal.\n\nDI MANA PUN ANDA BERADA: Tetap berkomunikasi di mana pun Anda berada dengan riwayat pesan yang sepenuhnya disinkronkan di semua perangkat Anda dan di web di https://app.element.io/."; "store_full_description" = "Element adalah aplikasi messenger dan kolaborasi tipe baru yang:\n\n1. Menempatkan Anda dalam kendali untuk mempertahankan privasi Anda\n2. Memungkinkan Anda berkomunikasi dengan siapa pun di jaringan Matrix, dan bahkan di luar dengan mengintegrasikan dengan aplikasi seperti Slack\n3. Melindungi Anda dari iklan, menambangan data, pintu belakang, dan taman berdinding\n4. Mengamankan Anda melalui enkripsi ujung-ke-ujung, dengan penandatanganan silang untuk memverifikasi orang lain\n\nElement benar-benar berbeda dari aplikasi perpesanan dan kolaborasi lain karena Element terdesentralisasi dan sumber terbuka.\n\nElement memungkinkan Anda host sendiri — atau memilih host — sehingga Anda memiliki privasi, kepemilikan, dan kontrol data dan obrolan Anda. Ini memberi Anda akses ke jaringan terbuka, jadi Anda tidak hanya terjebak berbicara dengan pengguna Element. Itu sangat aman.\n\nElement dapat melakukan semua ini karena beroperasi pada Matrix standar untuk komunikasi terdesentralisasi terbuka.\n\nElement menempatkan Anda dalam kendali dengan membiarkan Anda memilih siapa yang menghost percakapan Anda. Dari aplikasi Element, Anda dapat memilih untuk menghost dengan cara yang berbeda:\n\n1. Dapatkan akun gratis pada server publik matrix.org\n2. Host sendiri akun Anda dengan menjalankan server pada perangkat keras Anda sendiri\n3. Mendaftar untuk akun di server khusus dengan hanya berlangganan platform hosting Element Matrix Services\n\nMengapa memilih Element?\n\nMILIKI DATA ANDA: Anda memutuskan di mana untuk menyimpan data dan pesan Anda. Anda memilikinya dan mengendalikannya, bukan perusahaan besar yang menambang data Anda atau memberikan akses ke pihak ketiga.\n\nPESAN DAN KOLABORASI TERBUKA: Anda dapat mengobrol dengan orang lain di jaringan Matrix, jika mereka menggunakan Element atau aplikasi Matrix lain, dan bahkan jika mereka menggunakan sistem perpesanan seperti Slack, IRC atau XMPP.\n\nSANGAT AMAN: Enkripsi ujung-ke-ujung yang nyata (hanya mereka yang dalam percakapan dapat mendekripsi pesan), dan penandatanganan silang untuk memverifikasi perangkat anggota obrolan.\n\nKOMUNIKASI LENGKAP: Perpesanan, panggilan suara dan video, pembagian file, pembagian layar dan banyak integrasi, bot dan widget. Buat ruangan, komunitas, tetap terhubung dan selesaikan hal-hal.\n\nDI MANA PUN ANDA BERADA: Tetap berkomunikasi di mana pun Anda berada dengan riwayat pesan yang sepenuhnya disinkronkan di semua perangkat Anda dan di web di https://app.element.io/.";
// String for App Store // String for App Store
"store_short_description" = "Obrolan/VoIP terdesentralisasi aman"; "store_short_description" = "Obrolan/VoIP terdesentralisasi aman";
@ -617,7 +617,7 @@
"spaces_empty_space_detail" = "Beberapa ruangan mungkin disembunyikan karena ruangannya pribadi dan Anda memerlukan sebuah undangan."; "spaces_empty_space_detail" = "Beberapa ruangan mungkin disembunyikan karena ruangannya pribadi dan Anda memerlukan sebuah undangan.";
"leave_space_message" = "Apakah anda Anda yakin ingin keluar dari %@? Apakah Anda juga ingin meninggalkan semua ruangan dan space lainnya di space ini?"; "leave_space_message" = "Apakah anda Anda yakin ingin keluar dari %@? Apakah Anda juga ingin meninggalkan semua ruangan dan space lainnya di space ini?";
"space_beta_announce_information" = "Space adalah cara baru untuk mengelompokkan ruangan dan orang. Mereka belum ada di iOS, tetapi Anda dapat menggunakannya sekarang di Web dan Desktop."; "space_beta_announce_information" = "Space adalah cara baru untuk mengelompokkan ruangan dan orang. Mereka belum ada di iOS, tetapi Anda dapat menggunakannya sekarang di Web dan Desktop.";
"favourites_empty_view_information" = "Anda dapat memfavoritkan dengan beberapa cara - yang tercepat adalah dengan menekan dan menahan. Ketuk ikon bintang dan mereka akan secara otomatis muncul di sini."; "favourites_empty_view_information" = "Anda dapat memfavoritkan dengan beberapa cara yang tercepat adalah dengan menekan dan menahan. Ketuk ikon bintang dan mereka akan secara otomatis muncul di sini.";
"home_empty_view_information" = "Aplikasi obrolan aman semua-dalam-satu untuk tim, teman, dan organisasi. Ketuk tombol + di bawah untuk menambahkan orang dan ruangan."; "home_empty_view_information" = "Aplikasi obrolan aman semua-dalam-satu untuk tim, teman, dan organisasi. Ketuk tombol + di bawah untuk menambahkan orang dan ruangan.";
"pin_protection_explanatory" = "Menyiapkan PIN memungkinkan Anda melindungi data seperti pesan dan kontak, jadi hanya Anda yang dapat mengaksesnya dengan memasukkan PIN di awal aplikasi."; "pin_protection_explanatory" = "Menyiapkan PIN memungkinkan Anda melindungi data seperti pesan dan kontak, jadi hanya Anda yang dapat mengaksesnya dengan memasukkan PIN di awal aplikasi.";
"major_update_information" = "Kami senang mengumumkan bahwa kami telah mengubah nama kami! Aplikasi Anda telah diperbarui dan Anda masuk ke akun Anda."; "major_update_information" = "Kami senang mengumumkan bahwa kami telah mengubah nama kami! Aplikasi Anda telah diperbarui dan Anda masuk ke akun Anda.";
@ -1538,7 +1538,7 @@
"space_feature_unavailable_information" = "Space adalah cara baru untuk mengelompokkan ruangan dan pengguna.\n\nMereka akan segera datang. Untuk saat ini, jika Anda bergabung sebuah space di platform lain, Anda akan dapat mengakses ruang mana saja yang Anda ikuti di sini."; "space_feature_unavailable_information" = "Space adalah cara baru untuk mengelompokkan ruangan dan pengguna.\n\nMereka akan segera datang. Untuk saat ini, jika Anda bergabung sebuah space di platform lain, Anda akan dapat mengakses ruang mana saja yang Anda ikuti di sini.";
// Success from passphrase // Success from passphrase
"key_backup_setup_success_from_passphrase_info" = "Kunci Anda sedang dicadangkan.\n\nKunci Keamanan Anda adalah jaring pengaman - Anda dapat menggunakannya untuk memulihkan akses ke pesan terenkripsi jika Anda lupa frasa sandi.\n\nSimpan Kunci Keamanan Anda di suatu tempat yang sangat aman, seperti pengelola kata sandi (atau brankas)."; "key_backup_setup_success_from_passphrase_info" = "Kunci Anda sedang dicadangkan.\n\nKunci Keamanan Anda adalah jaring pengaman Anda dapat menggunakannya untuk memulihkan akses ke pesan terenkripsi jika Anda lupa frasa sandi.\n\nSimpan Kunci Keamanan Anda di suatu tempat yang sangat aman, seperti pengelola kata sandi (atau brankas).";
"key_backup_setup_passphrase_info" = "Kami akan menyimpan salinan terenkripsi dari kunci Anda di server kami. Lindungi cadangan Anda dengan frasa agar tetap aman.\n\nUntuk keamanan maksimum, ini harus berbeda dari kata sandi akun Anda."; "key_backup_setup_passphrase_info" = "Kami akan menyimpan salinan terenkripsi dari kunci Anda di server kami. Lindungi cadangan Anda dengan frasa agar tetap aman.\n\nUntuk keamanan maksimum, ini harus berbeda dari kata sandi akun Anda.";
"key_backup_setup_intro_info" = "Pesan di ruang terenkripsi diamankan dengan enkripsi ujung-ke-ujung. Hanya Anda dan penerima yang memiliki kunci untuk membaca pesan ini.\n\nCadangkan kunci Anda dengan aman untuk menghindari kehilangannya."; "key_backup_setup_intro_info" = "Pesan di ruang terenkripsi diamankan dengan enkripsi ujung-ke-ujung. Hanya Anda dan penerima yang memiliki kunci untuk membaca pesan ini.\n\nCadangkan kunci Anda dengan aman untuk menghindari kehilangannya.";
"deactivate_account_informations_part5" = "Jika Anda ingin kami melupakan pesan Anda, silakan centang kotak di bawah ini\n\nVisibilitas pesan di Matrix mirip dengan email. Kami melupakan pesan Anda berarti bahwa pesan yang telah Anda kirim tidak akan dibagikan dengan pengguna baru atau tidak terdaftar, tetapi pengguna terdaftar yang sudah memiliki akses ke pesan ini akan tetap memiliki akses ke salinannya."; "deactivate_account_informations_part5" = "Jika Anda ingin kami melupakan pesan Anda, silakan centang kotak di bawah ini\n\nVisibilitas pesan di Matrix mirip dengan email. Kami melupakan pesan Anda berarti bahwa pesan yang telah Anda kirim tidak akan dibagikan dengan pengguna baru atau tidak terdaftar, tetapi pengguna terdaftar yang sudah memiliki akses ke pesan ini akan tetap memiliki akses ke salinannya.";
@ -1649,7 +1649,7 @@
"group_details_title" = "Detail Komunitas"; "group_details_title" = "Detail Komunitas";
"room_event_action_forward" = "Teruskan"; "room_event_action_forward" = "Teruskan";
"poll_edit_form_add_option" = "Tambahkan opsi"; "poll_edit_form_add_option" = "Tambahkan opsi";
"poll_edit_form_option_number" = "Opsi %d"; "poll_edit_form_option_number" = "Opsi %lu";
"poll_edit_form_create_options" = "Buat opsi"; "poll_edit_form_create_options" = "Buat opsi";
"poll_edit_form_input_placeholder" = "Tulis sesuatu"; "poll_edit_form_input_placeholder" = "Tulis sesuatu";
"poll_edit_form_question_or_topic" = "Pertanyaan atau topik"; "poll_edit_form_question_or_topic" = "Pertanyaan atau topik";
@ -1663,3 +1663,46 @@
"share_extension_low_quality_video_title" = "Video akan dikirim dalam kualitas rendah"; "share_extension_low_quality_video_title" = "Video akan dikirim dalam kualitas rendah";
"settings_discovery_accept_terms" = "Terima Persyaratan Server Identitas"; "settings_discovery_accept_terms" = "Terima Persyaratan Server Identitas";
"settings_about" = "TENTANG"; "settings_about" = "TENTANG";
"poll_timeline_not_closed_action" = "OK";
"poll_timeline_not_closed_subtitle" = "Mohon coba lagi";
"poll_timeline_not_closed_title" = "Gagal untuk mengakhiri poll";
"poll_timeline_vote_not_registered_action" = "OK";
"poll_timeline_vote_not_registered_subtitle" = "Maaf, suara Anda tidak diberikan, mohon coba lagi";
"poll_timeline_vote_not_registered_title" = "Suara tidak diberikan";
"poll_timeline_total_final_results" = "Hasil akhir berdasarkan %lu suara";
"poll_timeline_total_final_results_one_vote" = "Hasil akhir berdasarkan 1 suara";
"poll_timeline_total_votes_not_voted" = "%lu suara diberikan. Berikan suara untuk melihat hasilnya";
"poll_timeline_total_one_vote_not_voted" = "1 suara diberikan. Berikan suara untuk melihat hasilnya";
"poll_timeline_total_no_votes" = "Tidak ada suara yang diberikan";
"poll_timeline_total_votes" = "%lu suara diberikan";
"poll_timeline_total_one_vote" = "1 suara diberikan";
"poll_timeline_votes_count" = "%lu suara";
"poll_timeline_one_vote" = "1 suara";
"poll_edit_form_post_failure_action" = "OK";
"poll_edit_form_post_failure_subtitle" = "Silakan coba lagi";
"poll_edit_form_post_failure_title" = "Gagal untuk mengirim poll";
"settings_labs_enabled_polls" = "Poll";
"room_event_action_end_poll" = "Akhiri poll";
"room_event_action_remove_poll" = "Hapus poll";
"analytics_prompt_stop" = "Berhenti membagikan";
"analytics_prompt_yes" = "Iya, saya tidak keberatan";
"analytics_prompt_not_now" = "Jangan sekarang";
"analytics_prompt_point_3" = "Anda dapat mematikannya kapan saja di pengaturan";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "Kami <b>tidak</b> membagikan informasi ini dengan pihak ketiga";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "Kami <b>tidak</b> merekam atau memprofil data akun apapun";
"analytics_prompt_terms_link_upgrade" = "di sini";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Baca semua kebijakan kami %@. Apakah Anda tidak keberatan?";
"analytics_prompt_terms_link_new_user" = "di sini";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "Anda dapat membaca semua kebijakan kami %@.";
"analytics_prompt_message_upgrade" = "Anda sebelumnya setuju untuk mengirimkan data penggunaan anonim dengan kami. Sekarang, supaya kami dapat memahami bagaimana orang-orang menggunakan beberapa perangkat-perangkat, kami akan membuat pengenal acak, yang dibagikan oleh perangkat Anda.";
"analytics_prompt_message_new_user" = "Bantu kami mengidentifikasi masalah-masalah dan membuat Element lebih baik dengan membagikan data penggunaan anonim. Untuk memahami bagaimana orang-orang menggunakan beberapa perangkat-perangkat, kami akan membuat pengenal acak, yang dibagikan oleh perangkat Anda.";
// Analytics
"analytics_prompt_title" = "Bantu membuat %@ lebih baik";
"settings_analytics_and_crash_data" = "Kirim data crash dan analitik";
"accessibility_button_label" = "tombol";
"enable" = "Aktifkan";

View file

@ -1504,7 +1504,7 @@
"space_home_show_all_rooms" = "Mostra tutte le stanze"; "space_home_show_all_rooms" = "Mostra tutte le stanze";
"room_event_action_forward" = "Inoltra"; "room_event_action_forward" = "Inoltra";
"poll_edit_form_add_option" = "Aggiungi opzione"; "poll_edit_form_add_option" = "Aggiungi opzione";
"poll_edit_form_option_number" = "Opzione %d"; "poll_edit_form_option_number" = "Opzione %lu";
"poll_edit_form_create_options" = "Crea opzioni"; "poll_edit_form_create_options" = "Crea opzioni";
"poll_edit_form_input_placeholder" = "Scrivi qualcosa"; "poll_edit_form_input_placeholder" = "Scrivi qualcosa";
"poll_edit_form_question_or_topic" = "Domanda o argomento"; "poll_edit_form_question_or_topic" = "Domanda o argomento";
@ -1518,3 +1518,46 @@
"share_extension_low_quality_video_title" = "Il video verrà inviato in bassa qualità"; "share_extension_low_quality_video_title" = "Il video verrà inviato in bassa qualità";
"settings_discovery_accept_terms" = "Accetta termini del server d'identità"; "settings_discovery_accept_terms" = "Accetta termini del server d'identità";
"settings_about" = "INFORMAZIONI"; "settings_about" = "INFORMAZIONI";
"poll_timeline_not_closed_action" = "OK";
"poll_timeline_not_closed_subtitle" = "Riprova";
"poll_timeline_not_closed_title" = "Chiusura del sondaggio fallita";
"poll_timeline_vote_not_registered_action" = "OK";
"poll_timeline_vote_not_registered_subtitle" = "Spiacenti, il tuo voto non è stato registrato, riprova";
"poll_timeline_vote_not_registered_title" = "Voto non registrato";
"poll_timeline_total_final_results" = "Risultato finale basato su %lu voti";
"poll_timeline_total_final_results_one_vote" = "Risultato finale basato su 1 voto";
"poll_timeline_total_votes_not_voted" = "%lu voti inviati. Vota per vedere i risultati";
"poll_timeline_total_one_vote_not_voted" = "1 voto inviato. Vota per vedere i risultati";
"poll_timeline_total_votes" = "%lu voti";
"poll_timeline_total_one_vote" = "1 voto";
"poll_timeline_total_no_votes" = "Nessun voto";
"poll_timeline_votes_count" = "%lu voti";
"poll_timeline_one_vote" = "1 voto";
"poll_edit_form_post_failure_action" = "OK";
"poll_edit_form_post_failure_subtitle" = "Riprova";
"poll_edit_form_post_failure_title" = "Invio del sondaggio fallito";
"settings_labs_enabled_polls" = "Sondaggi";
"room_event_action_end_poll" = "Termina sondaggio";
"room_event_action_remove_poll" = "Rimuovi sondaggio";
"analytics_prompt_stop" = "Non condividere più";
"analytics_prompt_yes" = "Sì, va bene";
"analytics_prompt_not_now" = "Non ora";
"analytics_prompt_point_3" = "Puoi disattivarlo in qualsiasi momento nelle impostazioni";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "<b>Non</b> condividiamo informazioni con terze parti";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "<b>Non</b> registriamo o profiliamo alcun dato dell'account";
"analytics_prompt_terms_link_upgrade" = "qui";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Leggi i nostri termini di servizio %@. Accetti?";
"analytics_prompt_terms_link_new_user" = "qui";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "Puoi leggere i nostri termini di servizio %@.";
"analytics_prompt_message_upgrade" = "Hai acconsentito precedentemente a condividere con noi dati di utilizzo anonimi. Ora, per capire come le persone usano diversi dispositivi, genereremo un identificativo casuale, condiviso dai tuoi dispositivi.";
"analytics_prompt_message_new_user" = "Aiutaci a identificare problemi e a migliorare Element condividendo dati di utilizzo anonimi. Per capire come le persone usano diversi dispositivi, genereremo un identificativo casuale, condiviso dai tuoi dispositivi.";
// Analytics
"analytics_prompt_title" = "Aiuta a migliorare %@";
"settings_analytics_and_crash_data" = "Invia crash e dati analitici";
"accessibility_button_label" = "pulsante";
"enable" = "Attiva";

View file

@ -1068,3 +1068,64 @@
"contacts_address_book_permission_denied_alert_message" = "연락처를 사용하려면, 설정으로 이동하십시오."; "contacts_address_book_permission_denied_alert_message" = "연락처를 사용하려면, 설정으로 이동하십시오.";
"contacts_address_book_permission_denied_alert_title" = "연락처 사용 안 함"; "contacts_address_book_permission_denied_alert_title" = "연락처 사용 안 함";
"rooms_empty_view_title" = "방"; "rooms_empty_view_title" = "방";
// AuthenticatedSessionViewControllerFactory
"authenticated_session_flow_not_supported" = "이 앱은 해당 홈서버의 인증 구조를 지원하지 않습니다.";
"security_settings_user_password_description" = "신원을 확인하기 위해 계정 비밀번호를 입력해주세요.";
"event_formatter_widget_removed_by_you" = "위젯을 제거함 : %@";
// Events formatter with you
"event_formatter_widget_added_by_you" = "위젯을 추가함 : %@";
"event_formatter_group_call_leave" = "떠나기";
"event_formatter_group_call_join" = "들어가기";
"event_formatter_group_call" = "그룹 전화";
"event_formatter_call_end_call" = "통화 종료";
"event_formatter_call_retry" = "재시도";
"event_formatter_call_decline" = "거부";
"event_formatter_call_back" = "통화 재시도";
"event_formatter_call_connection_failed" = "연결 실패";
"event_formatter_call_missed_voice" = "음성 통화 부재중";
"event_formatter_call_missed_video" = "영상 통화 부재중";
"event_formatter_call_you_declined" = "통화 거부";
"event_formatter_call_active_voice" = "음성 통화 활성";
"event_formatter_call_active_video" = "영상 통화 활성";
"event_formatter_call_incoming_video" = "영상 통화 수신";
"event_formatter_call_incoming_voice" = "음성 통화 수신";
"event_formatter_call_has_ended_with_time" = "통화 끊김 %@";
"event_formatter_call_has_ended" = "통화 끊기";
"event_formatter_call_ringing" = "통화중…";
"event_formatter_call_connecting" = "연결중…";
"room_notifs_settings_encrypted_room_notice" = "암호화된 방에서는 멘션 및 키워드 알림이 작동하지 않습니다.";
"room_notifs_settings_account_settings" = "계정 설정";
"room_notifs_settings_cancel_action" = "취소";
"room_notifs_settings_done_action" = "적용";
"room_notifs_settings_none" = "알림받지 않기";
"room_notifs_settings_mentions_and_keywords" = "멘션과 키워드만";
"room_notifs_settings_all_messages" = "모든 메시지";
"room_details_advanced_e2e_encryption_disabled_for_dm" = "이 방의 암호화가 활성화되지 않음.";
"room_details_advanced_e2e_encryption_enabled_for_dm" = "이 방의 암호화 활성화됨";
"room_details_advanced_room_id_for_dm" = "아이디 :";
"room_details_no_local_addresses_for_dm" = "이 방은 로컬 주소를 가지고 있지 않음";
"room_details_access_section_anyone_for_dm" = "게스트를 포함한 초대 링크를 알고 있는 누구나";
"room_details_access_section_anyone_apart_from_guest_for_dm" = "게스트를 제외하고 초대 링크를 알고 있는 누구나";
"room_details_access_section_for_dm" = "누가 접근할 수 있나요?";
"room_details_notifs" = "알림";
"room_details_room_name_for_dm" = "이름";
"room_details_photo_for_dm" = "사진";
"room_details_integrations" = "통합";
"room_details_search" = "방 검색";
"room_details_title_for_dm" = "정보";
"manage_session_sign_out" = "세션 연결 끊기";
"manage_session_not_trusted" = "신뢰하지 않음";
"manage_session_trusted" = "신뢰하도록 설정됨";
"manage_session_name" = "세션 이름";
"manage_session_info" = "세션 정보";
// Manage session
"manage_session_title" = "세션 관리";
"settings_analytics_and_crash_data" = "오류 및 분석 데이터 전송";
"settings_labs_enabled_polls" = "투표";
"room_event_action_end_poll" = "투표 종료";
"room_event_action_remove_poll" = "투표 제거";
"accessibility_button_label" = "버튼";
"enable" = "활성화";

View file

@ -1633,7 +1633,7 @@
"contacts_address_book_permission_denied_alert_message" = "Om contacten in te schakelen, ga naar uw apparaatinstellingen."; "contacts_address_book_permission_denied_alert_message" = "Om contacten in te schakelen, ga naar uw apparaatinstellingen.";
"contacts_address_book_permission_denied_alert_title" = "Contacten uitgeschakeld"; "contacts_address_book_permission_denied_alert_title" = "Contacten uitgeschakeld";
"poll_edit_form_add_option" = "Optie toevoegen"; "poll_edit_form_add_option" = "Optie toevoegen";
"poll_edit_form_option_number" = "Optie %d"; "poll_edit_form_option_number" = "Optie %lu";
"poll_edit_form_create_options" = "Opties maken"; "poll_edit_form_create_options" = "Opties maken";
"poll_edit_form_input_placeholder" = "Schrijf iets"; "poll_edit_form_input_placeholder" = "Schrijf iets";
"poll_edit_form_question_or_topic" = "Vraag of onderwerp"; "poll_edit_form_question_or_topic" = "Vraag of onderwerp";
@ -1647,3 +1647,46 @@
"share_extension_low_quality_video_title" = "Video zal in lage kwaliteit worden verstuurd"; "share_extension_low_quality_video_title" = "Video zal in lage kwaliteit worden verstuurd";
"settings_discovery_accept_terms" = "Identiteitsserver-voorwaarden aanvaarden"; "settings_discovery_accept_terms" = "Identiteitsserver-voorwaarden aanvaarden";
"settings_about" = "OVER"; "settings_about" = "OVER";
"poll_timeline_not_closed_action" = "OK";
"poll_timeline_not_closed_subtitle" = "Probeer het opnieuw";
"poll_timeline_not_closed_title" = "Sluiten van de poll mislukt";
"poll_timeline_vote_not_registered_action" = "OK";
"poll_timeline_vote_not_registered_subtitle" = "Sorry, uw stem is niet geregistreerd. Probeer het opnieuw";
"poll_timeline_vote_not_registered_title" = "Stem niet geregistreerd";
"poll_timeline_total_final_results" = "Uitslag gebaseerd op %lu stemmen";
"poll_timeline_total_final_results_one_vote" = "Uitslag gebaseerd op 1 stem";
"poll_timeline_total_votes_not_voted" = "%lu stemmen uitgebracht. Stem om de resultaten te zien";
"poll_timeline_total_one_vote_not_voted" = "1 stem uitgebracht. Stem om de resultaten te zien";
"poll_timeline_total_votes" = "%lu stemmen uitgebracht";
"poll_timeline_total_one_vote" = "1 stem uitgebracht";
"poll_timeline_total_no_votes" = "Geen stemmen uitgebracht";
"poll_timeline_votes_count" = "%lu stemmen";
"poll_timeline_one_vote" = "1 stem";
"poll_edit_form_post_failure_action" = "OK";
"poll_edit_form_post_failure_subtitle" = "Probeer het opnieuw";
"poll_edit_form_post_failure_title" = "Poll plaatsen mislukt";
"analytics_prompt_stop" = "Delen stoppen";
"analytics_prompt_yes" = "Ja, dat is prima";
"analytics_prompt_not_now" = "Niet nu";
"analytics_prompt_point_3" = "U kunt dit op elk moment uitzetten in de instellingen";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "Wij delen <b>geen</b> informatie met derden";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "We registreren of profileren <b>geen</b> accountgegevens";
"analytics_prompt_terms_link_upgrade" = "hier";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Lees al onze voorwaarden %@. Is dit akkoord?";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "U kunt al onze voorwaarden %@ lezen.";
"analytics_prompt_terms_link_new_user" = "hier";
"analytics_prompt_message_upgrade" = "U heeft eerder toestemming gegeven om anonieme gebruiksgegevens met ons te delen. Om beter te begrijpen hoe mensen meerdere apparaten gebruiken, genereren we nu een willekeurige identificatiecode die door uw apparaten wordt gedeeld.";
"analytics_prompt_message_new_user" = "Help ons bij het identificeren van problemen en het verbeteren van Element door anonieme gebruiksgegevens te delen. Om te begrijpen hoe mensen meerdere apparaten gebruiken genereren we een willekeurige identificatie die we verspreiden over uw apparaten.";
// Analytics
"analytics_prompt_title" = "Help %@ verbeteren";
"settings_analytics_and_crash_data" = "Crash en analytische data versturen";
"settings_labs_enabled_polls" = "Polls";
"room_event_action_end_poll" = "Poll sluiten";
"room_event_action_remove_poll" = "Poll verwijderen";
"accessibility_button_label" = "knop";
"enable" = "Inschakelen";

View file

@ -0,0 +1,11 @@
"title_rooms" = "Rom";
"title_people" = "Folk";
"title_favourites" = "Favorittar";
// Titles
"title_home" = "Heim";
"warning" = "Åtvaring";
// String for App Store
"store_short_description" = "Sikker desentralisert chat/IP-telefoni";

View file

@ -0,0 +1,7 @@
"NSContactsUsageDescription" = "O Element vai mostrar os seus contactos para que os possa convidar para conversar.";
"NSMicrophoneUsageDescription" = "O Element necessita de aceder ao seu microfone para fazer e receber chamadas e para gravar mensagens de voz.";
"NSPhotoLibraryUsageDescription" = "A biblioteca de fotos é usada para enviar fotos e vídeos.";
// Permissions usage explanations
"NSCameraUsageDescription" = "A câmara é usada para tirar fotos e vídeos e fazer videochamadas.";

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@

View file

@ -1501,7 +1501,7 @@
"space_home_show_all_rooms" = "Mostrar todas as salas"; "space_home_show_all_rooms" = "Mostrar todas as salas";
"room_event_action_forward" = "Encaminhar"; "room_event_action_forward" = "Encaminhar";
"poll_edit_form_add_option" = "Adicionar opção"; "poll_edit_form_add_option" = "Adicionar opção";
"poll_edit_form_option_number" = "Opção %d"; "poll_edit_form_option_number" = "Opção %lu";
"poll_edit_form_create_options" = "Criar opções"; "poll_edit_form_create_options" = "Criar opções";
"poll_edit_form_input_placeholder" = "Escreva algo"; "poll_edit_form_input_placeholder" = "Escreva algo";
"poll_edit_form_question_or_topic" = "Pergunta ou tópico"; "poll_edit_form_question_or_topic" = "Pergunta ou tópico";
@ -1515,3 +1515,46 @@
"share_extension_low_quality_video_title" = "Vídeo vai ser enviado em baixa qualidade"; "share_extension_low_quality_video_title" = "Vídeo vai ser enviado em baixa qualidade";
"settings_discovery_accept_terms" = "Aceitar Termos de Servidor de Identidade"; "settings_discovery_accept_terms" = "Aceitar Termos de Servidor de Identidade";
"settings_about" = "SOBRE"; "settings_about" = "SOBRE";
"poll_timeline_not_closed_action" = "OK";
"poll_timeline_not_closed_subtitle" = "Por favor tente de novo";
"poll_timeline_not_closed_title" = "Falha para terminar sondagem";
"poll_timeline_vote_not_registered_action" = "OK";
"poll_timeline_vote_not_registered_subtitle" = "Desculpe, seu voto não foi registrado, por favor tente de novo";
"poll_timeline_vote_not_registered_title" = "Voto não registrado";
"poll_timeline_total_final_results" = "Resultados finais baseados em %lu votos";
"poll_timeline_total_final_results_one_vote" = "Resultados finais baseados em 1 voto";
"poll_timeline_total_votes_not_voted" = "%lu votos lançados. Vote para ver os resultados";
"poll_timeline_total_one_vote_not_voted" = "1 voto lançado. Vote para ver os resultados";
"poll_timeline_total_votes" = "%lu votos lançados";
"poll_timeline_total_one_vote" = "1 voto lançado";
"poll_timeline_total_no_votes" = "Nenhum voto lançado";
"poll_timeline_votes_count" = "%lu votos";
"poll_timeline_one_vote" = "1 voto";
"poll_edit_form_post_failure_action" = "OK";
"poll_edit_form_post_failure_subtitle" = "Por favor tente de novo";
"poll_edit_form_post_failure_title" = "Falha para postar sondagem";
"settings_labs_enabled_polls" = "Sondagens";
"room_event_action_end_poll" = "Terminar sondagem";
"room_event_action_remove_poll" = "Remover sondagem";
"analytics_prompt_stop" = "Parar de compartilhar";
"analytics_prompt_yes" = "Sim, pode ser";
"analytics_prompt_not_now" = "Não agora";
"analytics_prompt_point_3" = "Você pode desativar isto a qualquer hora em configurações";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "Nós <b>não</b> compartilhamos informação com terceiros";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "Nós <b>não</b> gravamos ou perfilamos quaisquer dados de conta";
"analytics_prompt_terms_link_upgrade" = "aqui";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Leia todos os nossos termos %@. Isso está OK?";
"analytics_prompt_terms_link_new_user" = "aqui";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "Você pode ler todos os nossos termos %@.";
"analytics_prompt_message_upgrade" = "Você previamente consentiu a compartilhar dados de uso anônimos conosco. Agora, para ajudar a entender como pessoas usam múltiplos dispositivos, nós vamos gerar um identificador aleatório, compartilhado por seus dispositivos.";
"analytics_prompt_message_new_user" = "Ajude-nos a identificar problemas e melhorar Element ao compartilhar dados de uso anônimos. Para entender como pessoas usam múltiplos dispositivos, nós geramos um identificador aleatório, compartilhado por seus dispositivos.";
// Analytics
"analytics_prompt_title" = "Ajudar a melhorar %@";
"settings_analytics_and_crash_data" = "Enviar dados de crash e analítica";
"accessibility_button_label" = "botão";
"enable" = "Habilitar";

View file

@ -75,3 +75,93 @@
/** General **/ /** General **/
"NOTIFICATION" = "Oznámenia"; "NOTIFICATION" = "Oznámenia";
/* New message from a specific person in a named room */
"MSG_FROM_USER_IN_ROOM" = "%@ napísal v %@";
/** Key verification **/
"KEY_VERIFICATION_REQUEST_FROM_USER" = "%@ žiada o overenie";
/* Group call from user, CallKit caller name */
"GROUP_CALL_FROM_USER" = "%@ (Skupinový hovor)";
/* A user added a Jitsi call to a room */
"GROUP_CALL_STARTED" = "Začal sa skupinový hovor";
/* Incoming named video conference invite from a specific person */
"VIDEO_CONF_NAMED_FROM_USER" = "Skupinový videohovor od používateľa %@: '%@'";
/* Incoming named voice conference invite from a specific person */
"VOICE_CONF_NAMED_FROM_USER" = "Skupinový hovor od používateľa %@: '%@'";
/* Incoming unnamed video conference invite from a specific person */
"VIDEO_CONF_FROM_USER" = "Skupinový videohovor od používateľa %@";
/* Incoming unnamed voice conference invite from a specific person */
"VOICE_CONF_FROM_USER" = "Skupinový hovor od používateľa %@";
/** Calls **/
/* Incoming one-to-one voice call */
"VOICE_CALL_FROM_USER" = "Hovor od používateľa %@";
/* Incoming one-to-one video call */
"VIDEO_CALL_FROM_USER" = "Videohovor od používateľa %@";
/* A user's membership has updated in an unknown way */
"USER_MEMBERSHIP_UPDATED" = "%@ aktualizoval/a svoj profil";
/* A user has change their avatar */
"USER_UPDATED_AVATAR" = "%@ zmenil/a svoj obrázok";
/* A user has change their name to a new name which we don't know */
"GENERIC_USER_UPDATED_DISPLAYNAME" = "%@ zmenil/a svoje meno";
/** Membership Updates **/
/* A user has change their name to a new name */
"USER_UPDATED_DISPLAYNAME" = "%@ zmenil/a svoje meno na %@";
/* A user has invited you to a named room */
"USER_INVITE_TO_NAMED_ROOM" = "%@ vás pozval/a do %@";
/* A user has invited you to an (unamed) group chat */
"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ vás pozval/a na skupinovú konverzáciu";
/** Invites **/
/* A user has invited you to a chat */
"USER_INVITE_TO_CHAT" = "%@ vás pozval/a na konverzáciu";
/* A user has reacted to a message, but the reaction content is unknown */
"GENERIC_REACTION_FROM_USER" = "%@ poslal/a reakciu";
/** Reactions **/
/* A user has reacted to a message, including the reaction e.g. "Alice reacted 👍". */
"REACTION_FROM_USER" = "%@ reagoval/a %@";
/* Look, stuff's happened, alright? Just open the app. */
"MSGS_IN_TWO_PLUS_ROOMS" = "%@ nových správ v %@, %@ a ďalších";
/* Multiple messages in two rooms */
"MSGS_IN_TWO_ROOMS" = "%@ nových správ v %@ a %@";
/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */
"MSGS_FROM_TWO_PLUS_USERS" = "%@ nových správ od %@, %@ a ďalších";
/* Sticker from a specific person, not referencing a room. */
"STICKER_FROM_USER" = "%@ poslal/a nálepku";
/* New file message from a specific person, not referencing a room. */
"FILE_FROM_USER" = "%@ poslal/a súbor %@";
/* New voice message from a specific person, not referencing a room. */
"VOICE_MESSAGE_FROM_USER" = "%@ poslal/a zvukovú správu";
/* New audio message from a specific person, not referencing a room. */
"AUDIO_FROM_USER" = "%@ poslal/a zvukový súbor %@";
/* New message reply from a specific person in a named room. */
"REPLY_FROM_USER_IN_ROOM_TITLE" = "%@ odpovedal/a v %@";

File diff suppressed because it is too large Load diff

View file

@ -222,7 +222,7 @@
"settings_ignored_users" = "PËRDORUES TË SHPËRFILLUR"; "settings_ignored_users" = "PËRDORUES TË SHPËRFILLUR";
"settings_contacts" = "KONTAKTE PAJISJEJE"; "settings_contacts" = "KONTAKTE PAJISJEJE";
"settings_advanced" = "TË MËTEJSHME"; "settings_advanced" = "TË MËTEJSHME";
"settings_other" = "TË TJERA"; "settings_other" = "Tjetër";
"settings_devices" = "SESIONE"; "settings_devices" = "SESIONE";
"settings_cryptography" = "KRIPTOGRAFI"; "settings_cryptography" = "KRIPTOGRAFI";
"settings_sign_out" = "Dilni"; "settings_sign_out" = "Dilni";
@ -1519,3 +1519,63 @@
"contacts_address_book_permission_denied_alert_message" = "Që të aktivizoni kontakte, kaloni te rregullimet e pajisjes tua."; "contacts_address_book_permission_denied_alert_message" = "Që të aktivizoni kontakte, kaloni te rregullimet e pajisjes tua.";
"contacts_address_book_permission_denied_alert_title" = "Kontaktet u çaktivizuan"; "contacts_address_book_permission_denied_alert_title" = "Kontaktet u çaktivizuan";
"space_home_show_all_rooms" = "Shfaqi krejt dhomat"; "space_home_show_all_rooms" = "Shfaqi krejt dhomat";
"poll_timeline_not_closed_action" = "OK";
"poll_timeline_not_closed_subtitle" = "Ju lutemi, riprovoni";
"poll_timeline_not_closed_title" = "Su arrit të përfundohej pyetësori";
"poll_timeline_vote_not_registered_action" = "OK";
"poll_timeline_vote_not_registered_subtitle" = "Na ndjeni, vota juaj su regjistrua, ju lutemi, riprovoni";
"poll_timeline_vote_not_registered_title" = "Votë e paregjistruar";
"poll_timeline_total_final_results" = "Rezultati përfundimtar, bazua në %lu votë";
"poll_timeline_total_final_results_one_vote" = "Rezultati përfundimtar, bazua në 1 votë";
"poll_timeline_total_votes_not_voted" = "%lu vota të hedhura. Që të shihni përfundimet, votoni";
"poll_timeline_total_one_vote_not_voted" = "1 votë e hedhur. Që të shihni përfundimet, votoni";
"poll_timeline_total_votes" = "%lu vota të hedhura";
"poll_timeline_total_one_vote" = "1 votë e hedhur";
"poll_timeline_total_no_votes" = "Su votua gjë";
"poll_timeline_votes_count" = "%lu vota";
"poll_timeline_one_vote" = "1 votë";
"poll_edit_form_post_failure_action" = "OK";
"poll_edit_form_post_failure_subtitle" = "Ju lutemi, riprovoni";
"poll_edit_form_post_failure_title" = "Su arrit të postohej anketimi";
"poll_edit_form_add_option" = "Shtoni mundësi";
"poll_edit_form_option_number" = "Mundësia %lu";
"poll_edit_form_create_options" = "Krijo mundësi";
"poll_edit_form_input_placeholder" = "Shkruani diçka!";
"poll_edit_form_question_or_topic" = "Pyetje ose temë";
"poll_edit_form_poll_question_or_topic" = "Pyetje ose temë pyetësori";
// Mark: - Polls
"poll_edit_form_create_poll" = "Krijoni anketim";
"share_extension_send_now" = "Dërgoje tani";
"share_extension_low_quality_video_message" = "Dërgojeni në %@. për cilësi më të mirë, ose dërgojeni në cilësi të ulët si më poshtë.";
"share_extension_low_quality_video_title" = "Videoja do të dërgohet në cilësi të ulët";
"analytics_prompt_stop" = "Resht së ndari";
"analytics_prompt_yes" = "Po, ska problem";
"analytics_prompt_not_now" = "Jo tani";
"analytics_prompt_point_3" = "Këtë mund të çaktivizoni në çfarëdo kohe, që nga rregullimet";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "<b>Nuk</b> u japin hollësi palëve të treta";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "<b>Nuk</b> regjistrojmë ose profilizojmë ndonjë të dhënë llogarie";
"analytics_prompt_terms_link_upgrade" = "këtu";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Lexoni krejt kushtet tona %@. Në rregull?";
"analytics_prompt_terms_link_new_user" = "këtu";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "Mund të lexoni krejt kushtet tona %@.";
"analytics_prompt_message_upgrade" = "Keni pranuar më herët të ndani me ne të dhëna anonime përdorimi. Tani, që të na ndihmoni të kuptojmë se si njerëzit përdorin pajisje të shumta, do të prodhojmë një identifikues kuturu, të përbashkët për pajisjet tuaja.";
"analytics_prompt_message_new_user" = "Ndihmonani të identifikojmë probleme dhe të përmirësojmë Element-in, duke ndarë me ne të dhëna anonime përdorimi. Për të kuptuar se si i përdorin njerëzit disa pajisje njëherësh, do të prodhojmë një identifikues kuturu, të përbashkët për pajisjet tuaja.";
// Analytics
"analytics_prompt_title" = "Ndihmoni të përmirësohet %@";
"settings_discovery_accept_terms" = "Pranoni Kushte Shërbyesi Identitetesh";
"settings_analytics_and_crash_data" = "Dërgoni të dhëna vithisjesh dhe analitike";
"settings_labs_enabled_polls" = "Pyetësorë";
"settings_about" = "MBI";
"room_event_action_forward" = "Përpara";
"room_event_action_end_poll" = "Përfundoje pyetësorin";
"room_event_action_remove_poll" = "Hiqe pyetësorin";
"accessibility_button_label" = "kopsë";
"open" = "Hapur";
"enable" = "Aktivizoje";

View file

@ -1897,6 +1897,34 @@ Library.
SOFTWARE. SOFTWARE.
<br/><br/> <br/><br/>
</li> </li>
<li>
<b>PostHog iOS</b> (<a href="https://github.com/PostHog/posthog-ios">https://github.com/PostHog/posthog-ios</a>)
<br/><br/>
The MIT License (MIT)
<br/><br/>
Copyright (c) 2020 PostHog (part of Hiberly Inc)
<br/><br/>
Copyright (c) 2016 Segment.io, Inc.
<br/><br/>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
<br/><br/>
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
<br/><br/>
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
<br/><br/>
</li>
</ul> </ul>
</body> </body>
</html> </html>

View file

@ -163,7 +163,7 @@
"room_participants_leave_prompt_msg_for_dm" = "Ви впевнені, що хочете вийти?"; "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"; "client_android_name" = "Element Android";
"store_promotional_text" = "Застосунок для бесід та співпраці, що зберігає приватність у відкритій мережі. Децентралізований, щоб надати вам контроль над даними. Без обробки даних, без бекдорів, без доступу для третіх сторін."; "store_promotional_text" = "Застосунок для спілкування та співпраці, що зберігає приватність у відкритій мережі. Децентралізований, щоб надати вам контроль над даними. Без обробки даних, без бекдорів, без доступу для третіх сторін.";
"settings_three_pids_management_information_part3" = "."; "settings_three_pids_management_information_part3" = ".";
"settings_three_pids_management_information_part1" = "Керуйте звідси адресами е-пошти чи номерами телефонів, які можна застосовувати для входу або відновлення облікового запису. Контролюйте хто і як може вас знайти "; "settings_three_pids_management_information_part1" = "Керуйте звідси адресами е-пошти чи номерами телефонів, які можна застосовувати для входу або відновлення облікового запису. Контролюйте хто і як може вас знайти ";
"contacts_address_book_no_identity_server" = "Сервер ідентифікації не налаштований"; "contacts_address_book_no_identity_server" = "Сервер ідентифікації не налаштований";
@ -388,7 +388,7 @@
"settings_identity_server_settings" = "СЕРВЕР ІДЕНТИФІКАЦІЇ"; "settings_identity_server_settings" = "СЕРВЕР ІДЕНТИФІКАЦІЇ";
"settings_calls_settings" = "ВИКЛИКИ"; "settings_calls_settings" = "ВИКЛИКИ";
"settings_notifications" = "СПОВІЩЕННЯ"; "settings_notifications" = "СПОВІЩЕННЯ";
"settings_user_settings" = "НАЛАШТУВАННЯ КОРИСТУВАЧА"; "settings_user_settings" = "КОРИСТУВАЦЬКІ НАЛАШТУВАННЯ";
"event_formatter_call_connecting" = "З'єднання…"; "event_formatter_call_connecting" = "З'єднання…";
"settings_config_identity_server" = "Сервер ідентифікації %@"; "settings_config_identity_server" = "Сервер ідентифікації %@";
"settings_config_home_server" = "Домашній сервер %@"; "settings_config_home_server" = "Домашній сервер %@";
@ -408,7 +408,7 @@
// Bug report // Bug report
"bug_report_title" = "Звіт про ваду"; "bug_report_title" = "Звіт про ваду";
"e2e_key_backup_wrong_version_button_wasme" = "Це був я"; "e2e_key_backup_wrong_version_button_wasme" = "Це я";
"e2e_key_backup_wrong_version_button_settings" = "Налаштування"; "e2e_key_backup_wrong_version_button_settings" = "Налаштування";
"settings_privacy_policy" = "Політика приватності"; "settings_privacy_policy" = "Політика приватності";
"settings_term_conditions" = "Умови та положення"; "settings_term_conditions" = "Умови та положення";
@ -433,7 +433,7 @@
"room_widget_permission_theme_permission" = "Ваша тема"; "room_widget_permission_theme_permission" = "Ваша тема";
"room_widget_permission_user_id_permission" = "Ваш ID користувача"; "room_widget_permission_user_id_permission" = "Ваш ID користувача";
"room_widget_permission_avatar_url_permission" = "URL-адреса вашого аватара"; "room_widget_permission_avatar_url_permission" = "URL-адреса вашого аватара";
"room_widget_permission_display_name_permission" = "Ваше показуване ім'я"; "room_widget_permission_display_name_permission" = "Ваше показуване імʼя";
"room_widget_permission_creator_info_title" = "Цей віджет додано:"; "room_widget_permission_creator_info_title" = "Цей віджет додано:";
// Room widget permissions // Room widget permissions
@ -591,7 +591,7 @@
"user_avatar_view_accessibility_label" = "аватар"; "user_avatar_view_accessibility_label" = "аватар";
"room_intro_cell_information_dm_sentence1_part3" = ". "; "room_intro_cell_information_dm_sentence1_part3" = ". ";
"room_intro_cell_information_room_without_topic_sentence2_part1" = "Додати тему"; "room_intro_cell_information_room_without_topic_sentence2_part1" = "Додайте тему,";
"room_intro_cell_information_room_with_topic_sentence2" = "Тема: %@"; "room_intro_cell_information_room_with_topic_sentence2" = "Тема: %@";
"room_intro_cell_information_room_sentence1_part3" = ". "; "room_intro_cell_information_room_sentence1_part3" = ". ";
"room_intro_cell_information_room_sentence1_part1" = "Це початок "; "room_intro_cell_information_room_sentence1_part1" = "Це початок ";
@ -1002,7 +1002,7 @@
// Room key request dialog // Room key request dialog
"e2e_room_key_request_title" = "Запит ключів шифрування"; "e2e_room_key_request_title" = "Запит ключів шифрування";
"share_extension_send_now" = "Надіслати зараз"; "share_extension_send_now" = "Надіслати зараз";
"service_terms_modal_accept_button" = "Прийняти"; "service_terms_modal_accept_button" = "Погодитися";
"room_details_flair_invalid_id_prompt_msg" = "%@ — неправильний ідентифікатор спільноти"; "room_details_flair_invalid_id_prompt_msg" = "%@ — неправильний ідентифікатор спільноти";
"room_details_flair_invalid_id_prompt_title" = "Неправильний формат"; "room_details_flair_invalid_id_prompt_title" = "Неправильний формат";
"room_details_new_flair_placeholder" = "Додати новий ID спільноти (напр., +foo%@)"; "room_details_new_flair_placeholder" = "Додати новий ID спільноти (напр., +foo%@)";
@ -1022,3 +1022,683 @@
"room_details_history_section_members_only" = "Лише учасники (від часу вибору цієї опції)"; "room_details_history_section_members_only" = "Лише учасники (від часу вибору цієї опції)";
"room_details_history_section_anyone" = "Будь-хто"; "room_details_history_section_anyone" = "Будь-хто";
"room_details_history_section" = "Хто може переглядати історію?"; "room_details_history_section" = "Хто може переглядати історію?";
"identity_server_settings_alert_disconnect" = "Від'єднатися від сервера ідентифікації %@?";
"identity_server_settings_alert_disconnect_title" = "Від'єднатися від сервера ідентифікації";
"identity_server_settings_alert_change" = "Від'єднатися від сервера ідентифікації %1$@ й натомість під'єднатися до %2$@?";
"identity_server_settings_alert_change_title" = "Змінити сервер ідентифікації";
"identity_server_settings_alert_no_terms" = "Обраний вами сервер ідентифікації не має жодних умов використання. Продовжуйте лише якщо довіряєте власнику сервісу.";
"identity_server_settings_alert_no_terms_title" = "Сервер ідентифікації не має умов використання";
"identity_server_settings_disconnect_info" = "Після від'єднання від сервера ідентифікації вас більше не зможуть знаходити інші користувачі, а ви не зможете запрошувати інших за е-поштою чи телефоном.";
"identity_server_settings_no_is_description" = "Зараз ви не використовуєте сервер ідентифікації. Щоб знаходити наявні контакти й вони знаходили вас, додайте сервер угорі.";
"identity_server_settings_description" = "Ви користуєтесь %@, щоб знаходити людей за наявними контактами й вони знаходили вас.";
// AuthenticatedSessionViewControllerFactory
"authenticated_session_flow_not_supported" = "Цей застосунок не підтримує способу входу, доступного на вашому домашньому сервері.";
"security_settings_user_password_description" = "Підтвердьте свою особу, ввівши пароль свого облікового запису";
"security_settings_coming_soon" = "Вибачте, ця дія ще не доступна в %@ iOS. Якщо налаштуєте це іншим клієнтом Matrix, %@ iOS зможе також це використати.";
"security_settings_complete_security_alert_message" = "Спершу слід доповнити захист вашого поточного сеансу.";
"security_settings_blacklist_unverified_devices_description" = "Звірте всі сеанси користувача, щоб позначити його довіреним і надіслати йому повідомлення.";
"security_settings_crosssigning_bootstrap" = "Налаштувати";
"security_settings_crosssigning_info_ok" = "Перехресне підписування готове до використання.";
"security_settings_crosssigning_info_trusted" = "Перехресне підписування увімкнено. Ви можете робити інших користувачів і свої інші сеанси довіреними на підставі перехресного підпису, але ви не можете перехресно підписувати цим сеансом, бо в нього ще нема закритих ключів перехресного підписування. Доповніть захист цього сеансу.";
"security_settings_crosssigning_info_exists" = "Ваш обліковий запис має ідентичність перехресного підписування, але вона ще не довірена цим сеансом. Доповніть захист цього сеансу.";
"security_settings_secure_backup_description" = "Зробіть резервну копію своїх ключів шифрування й даних облікового запису на випадок втрати доступу до своїх сеансів. Ваші ключі будуть захищені унікальним ключем безпеки.";
"security_settings_crypto_sessions_description_2" = "Якщо не впізнаєте вхід, скиньте пароль і налаштування безпечного резервного копіювання.";
"settings_identity_server_no_is_description" = "Зараз ви не використовуєте сервер ідентифікації. Щоб знаходити наявні контакти й вони знаходили вас, додайте сервер угорі.";
"settings_identity_server_description" = "Налаштований угорі сервер ідентифікації дає вам змогу знаходити людей за наявними контактами, а їм знаходити вас.";
"settings_discovery_three_pid_details_information_phone_number" = "Керуйте параметрами для цього номера телефону, за яким інші користувачі можуть вас знаходити й запрошувати до кімнат. Додавайте й видаляйте номери в Облікових записах.";
"settings_discovery_three_pid_details_information_email" = "Керуйте параметрами для цієї адреси е-пошти, за якою інші користувачі можуть вас знаходити й запрошувати до кімнат. Додавайте й видаляйте адреси в Облікових записах.";
"settings_discovery_three_pids_management_information_part1" = "Керуйте, за якими адресами е-пошти й номерами телефону інші користувачі зможуть вас знаходити й запрошувати до кімнат. Щоб додати адреси й номери в цей список чи вилучити наявні, перейдіть у ";
"settings_discovery_no_identity_server" = "Зараз ви не використовуєте сервер ідентифікації. Щоб наявні контакти могли вас знаходити, додайте такий сервер.";
"settings_key_backup_info_not_valid" = "Цей сеанс не створює резервної копії ваших ключів, але у вас уже є резервна копія, яку ви можете відновити й додати у майбутньому.";
"settings_key_backup_info_version" = "Версія резервного копіювання ключів: %@";
"settings_labs_message_reaction" = "Реагувати на повідомлення за допомогою емодзі";
"settings_contacts_enable_sync_description" = "Це використовуватиме ваш сервер ідентифікації, щоб ви знаходили свої контакти, а вони вас.";
"settings_integrations_allow_description" = "Використовуйте менеджер інтеграцій (%@), щоб керувати ботами, мостами, віджетами й пакунками наліпок.\n\nМенеджери інтеграцій отримують ваші параметри й можуть змінювати віджети, надсилати запрошення до кімнат і надавати повноваження від вашого імені.";
"settings_calls_stun_server_fallback_description" = "Дозволити допоміжний сервер викликів %@, коли ваш домашній сервер не надає свого (ваша IP-адреса ставатиме відомою при виклику).";
"settings_callkit_info" = "Отримувати вхідні виклики, не розблоковуючи екран. Перегляньте свої виклики (%@) в історії викликів системи. Якщо iCloud увімкнено, ця історія викликів надсилатиметься Apple.";
"settings_confirm_media_size_description" = "Коли це ввімкнено, при надсиланні зображень чи відео вам пропонуватиметься підтвердити їхній розмір.";
"settings_three_pids_management_information_part2" = "Знаходження";
"settings_config_user_id" = "Ви ввійшли як %@";
"unknown_devices_alert" = "Кімната містить сеанси, які досі не пройшли звірку.\nТобто нема гарантії, що ці сеанси належать користувачам, від імені яких вони створені.\nРадимо звірити кожен сеанс, перш ніж продовжити; але за потреби можете повторити надсилання повідомлення без звірки.";
"room_action_camera" = "Зробити світлину або відео";
"room_ongoing_conference_call_with_close" = "Відбувається конференц-виклик. Приєднатись як %1$s чи %2$s. %@ його.";
"room_member_power_level_short_custom" = "Інше";
"room_member_power_level_custom_in" = "Інше (%@) у %@";
"room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Поки жоден сервер ідентифікації не налаштований, ви не можете почати бесіду з кимось за адресою е-пошти.";
"find_your_contacts_message" = "Дозвольте %@ показувати ваші контакти, щоб ви могли швидко почати бесіду з тими, кого знаєте найкраще.";
"find_your_contacts_title" = "Почніть із переліку своїх контактів";
"store_full_description" = "Element — застосунок для листування й співпраці нового покоління:\n\n1. Надає вам контроль над збереженням вашої приватності\n2. Дає змогу спілкуватися з будь-ким у мережі Matrix і навіть за її межами, інтегруючись із такими застосунками, як Slack\n3. Оберігає вас від реклами, збору даних, бекдорів і прив'язаності до провайдера\n4. Захищає вас наскрізним шифруванням і звіркою інших перехресним підписуванням\n\nElement суттєво відрізняється від інших застосунків для листування й співпраці тим, що децентралізований і має відкритий код.\n\nElement дає змогу самостійно встановити сервер або обрати з-поміж загальнодоступних, щоб ви зберігали приватність своїх даних і розмов, власність і контроль над ними. Він надає вам доступ до відкритої мережі; тож ви можете спілкуватися з користувачами інших застосунків, не лише Element. А ще він добре захищений.\n\nElement здатен на це все завдяки своїй основі Matrix — стандарту відкритого, децентралізованого спілкування.\n\nElement надає вам контроль, даючи змогу обрати, в кого зберігаються ваші розмови. У застосунку Element ви можете обрати між такими шляхами:\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.";
"security_settings_crosssigning_info_not_bootstrapped" = "Перехресне підписування ще не налаштовано.";
"security_settings_crosssigning" = "ПЕРЕХРЕСНЕ ПІДПИСУВАННЯ";
"security_settings_backup" = "РЕЗЕРВНЕ КОПІЮВАННЯ ПОВІДОМЛЕНЬ";
"security_settings_secure_backup_restore" = "Відновити з резервної копії";
"key_verification_manually_verify_device_key_title" = "Ключ сеансу";
"key_verification_manually_verify_device_id_title" = "ID сеансу";
"identity_server_settings_alert_error_invalid_identity_server" = "%@ не дійсний сервер ідентифікації.";
"identity_server_settings_alert_error_terms_not_accepted" = "Ви повинні погодитися з умовами %@, щоб налаштувати сервер ідентифікації.";
"identity_server_settings_alert_disconnect_still_sharing_3pid_button" = "Усе одно відʼєднати";
"identity_server_settings_alert_disconnect_button" = "Відʼєднати";
"identity_server_settings_disconnect" = "Відʼєднати";
"identity_server_settings_change" = "Змінити";
"identity_server_settings_add" = "Додати";
"identity_server_settings_place_holder" = "Введіть сервер ідентифікації";
// Identity server settings
"identity_server_settings_title" = "Сервер ідентифікації";
"manage_session_sign_out" = "Вийти з цього сеансу";
"manage_session_not_trusted" = "Не довірені";
"manage_session_trusted" = "Довірені вами";
"key_verification_manually_verify_device_name_title" = "Назва сеансу";
"manage_session_name" = "Назва сеансу";
"manage_session_info" = "ВІДОМОСТІ ПРО СЕАНС";
// Manage session
"manage_session_title" = "Керувати сеансом";
"security_settings_complete_security_alert_title" = "Завершити налаштування безпеки";
"user_verification_session_details_verify_action_current_user" = "Інтерактивна перевірка";
"secrets_recovery_reset_action_part_2" = "Скинути все";
// MARK: - Secrets reset
"secrets_reset_title" = "Скинути все";
"cross_signing_setup_banner_subtitle" = "Спростіть перевірку інших своїх пристроїв";
// MARK: - Cross-signing
// Banner
"cross_signing_setup_banner_title" = "Налаштування шифрування";
"secrets_reset_authentication_message" = "Введіть пароль свого облікового запису, щоб продовжити";
"security_settings_blacklist_unverified_devices" = "Ніколи не надсилати повідомлення не довіреним сеансам";
"security_settings_advanced" = "ДОДАТКОВО";
"security_settings_export_keys_manually" = "Експорт ключів вручну";
"security_settings_cryptography" = "КРИПТОГРАФІЯ";
"security_settings_crosssigning_complete_security" = "Завершити налаштування безпеки";
"security_settings_crosssigning_reset" = "Скинути";
"secrets_reset_reset_action" = "Скинути";
"security_settings_secure_backup_reset" = "Скинути";
"settings_show_NSFW_public_rooms" = "Показувати загальнодоступні кімнати з делікатним вмістом";
"settings_identity_server_no_is" = "Сервер ідентифікації не налаштований";
"settings_discovery_three_pid_details_enter_sms_code_action" = "Введіть код активації з СМС";
"settings_discovery_three_pid_details_cancel_email_validation_action" = "Скасувати перевірку е-пошти";
"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_send_crash_report" = "Надсилати анонімні дані про збої та користування";
"settings_show_url_previews_description" = "Попередній перегляд виконується лише у кімнатах без шифрування.";
"settings_show_url_previews" = "Попередній перегляд вебсайтів";
"settings_ui_theme_picker_message_match_system_theme" = "«Авто» застосовує тему вашого пристрою";
"settings_ui_theme_picker_message_invert_colours" = "«Авто» застосовує налаштування вашого пристрою «Інвертувати кольори»";
"settings_messages_containing_display_name" = "Моє показуване імʼя";
"settings_discovery_three_pid_details_title_phone_number" = "Керувати номером телефону";
"settings_discovery_three_pid_details_title_email" = "Керувати е-поштою";
"settings_discovery_error_message" = "Сталася помилка. Повторіть спробу.";
"settings_discovery_three_pids_management_information_part2" = "Користувацькі налаштування";
"settings_discovery_accept_terms" = "Погодитися з умовами використання сервера ідентифікації";
"settings_discovery_terms_not_signed" = "Погодьтеся з умовами використання сервера ідентифікації (%@), щоб дозволити вашу виявність за електронною адресою та номером телефону.";
"settings_key_backup_delete_confirmation_prompt_msg" = "Ви впевнені? Ви втратите ваші зашифровані повідомлення якщо копія ключів не була створена коректно.";
"settings_key_backup_delete_confirmation_prompt_title" = "Видалити резервну копію";
"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_valid" = "Резервна копія має чинний підпис цього сеансу";
"settings_key_backup_info_trust_signature_unknown" = "Резервна копія містить підпис невідомого сеансу з ID: %@";
"settings_key_backup_info_progress_done" = "Резервні копії всіх ключів створено";
"settings_key_backup_info_progress" = "Резервне копіювання %@ ключів…";
"security_settings_secure_backup_info_valid" = "Цей сеанс створює резервну копію ваших ключів.";
"settings_key_backup_info_valid" = "Цей сеанс створює резервну копію ваших ключів.";
"settings_key_backup_info_signout_warning" = "Створіть резервну копію ключів перед виходом, щоб не втратити їх.";
"settings_key_backup_info_none" = "Для цього сеансу не створюється резервна копія ваших ключів.";
"security_settings_secure_backup_info_checking" = "Перевірка…";
"settings_key_backup_info_checking" = "Перевірка…";
"settings_key_backup_info" = "Зашифровані повідомлення захищені наскрізним шифруванням. Лише ви та отримувачі повідомлень мають ключі для їх читання.";
"settings_deactivate_my_account" = "Деактивувати обліковий запис";
"settings_enable_rageshake" = "Струснути пристрій, щоб повідомити про ваду";
"settings_third_party_notices" = "Примітки третіх сторін";
"settings_labs_enable_ringing_for_group_calls" = "Дзвінок групових викликів";
"settings_labs_enabled_polls" = "Опитування";
"settings_labs_create_conference_with_jitsi" = "Створити конференц-виклик за допомогою jitsi";
"settings_labs_e2e_encryption_prompt_message" = "Щоб завершити налаштування шифрування вам потрібно повторно увійти.";
"settings_labs_e2e_encryption" = "Наскрізне шифрування";
"settings_unignore_user" = "Показати всі повідомлення від %@?";
"settings_ui_theme_picker_title" = "Вибрати тему";
"settings_ui_theme_black" = "Чорна";
"settings_ui_theme_dark" = "Темна";
"settings_ui_theme_light" = "Світла";
"settings_ui_theme_auto" = "Авто";
"settings_ui_theme" = "Тема";
"settings_ui_language" = "Мова";
"settings_integrations_allow_button" = "Керування інтеграціями";
"settings_calls_stun_server_fallback_button" = "Дозволити допоміжний сервер викликів";
"settings_enable_callkit" = "Інтегрований виклик";
"settings_new_keyword" = "Додати нове ключове слово";
"settings_your_keywords" = "Ваші ключові слова";
"settings_room_upgrades" = "Поліпшення кімнати";
"settings_messages_by_a_bot" = "Повідомлення бота";
"settings_call_invitations" = "Запрошення до виклику";
"settings_room_invitations" = "Запрошення до кімнати";
"settings_messages_containing_keywords" = "Ключові слова";
"settings_messages_containing_user_name" = "Моє користувацьке імʼя";
"settings_messages_containing_at_room" = "@room";
"settings_encrypted_group_messages" = "Зашифровані групові повідомлення";
"settings_group_messages" = "Групові повідомлення";
"settings_other" = "Інше";
"settings_mentions_and_keywords" = "Згадки та ключові слова";
"settings_pin_rooms_with_unread" = "Закріплювати кімнати з новими повідомленнями";
"settings_confirm_media_size" = "Підтверджувати розмір під час надсилання";
"settings_discovery_settings" = "ВИЯВНІСТЬ";
"room_preview_unlinked_email_warning" = "Запрошення надіслано на адресу %@, не повʼязану з цим обліковим записом. Ви можете увійти за допомогою іншого облікового запису або додати е-пошту до цього.";
"unknown_devices_verify" = "Перевірка…";
"room_message_edits_history_title" = "Редагування повідомлення";
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Цей домашній сервер досяг свого місячного обмеження активних користувачів, тож ";
"room_resource_usage_limit_reached_message_1_default" = "Цей домашній сервер досягнув одного зі своїх лімітів ресурсів, тож ";
"room_conference_call_no_power" = "Для керування конференц-викликами у цій кімнаті потрібен дозвіл";
"room_ongoing_conference_call" = "Відбувається конференц-виклик. Приєднатись як %1$s чи %2$s.";
"room_participants_security_information_room_encrypted_for_dm" = "Повідомлення тут захищені наскрізним шифруванням.\n\nВаші повідомлення захищені замками, тож лише ви та отримувач маєте унікальні ключі для їхнього відмикання.";
"room_participants_security_information_room_encrypted" = "Повідомлення тут захищені наскрізним шифруванням.\n\nВаші повідомлення захищені замками, тож лише ви та отримувачі мають унікальні ключі для їхнього відмикання.";
"room_participants_action_security_status_complete_security" = "Завершити налаштування безпеки";
"room_participants_idle" = "Неактивний";
"settings_labs" = "ЛАБОРАТОРІЯ";
"settings_about" = "ПРО";
"settings_advanced" = "ДОДАТКОВО";
"settings_phone_contacts" = "КОНТАКТИ ТЕЛЕФОНА";
"settings_links" = "ПОСИЛАННЯ";
"settings_sending_media" = "НАДСИЛАННЯ ЗОБРАЖЕНЬ І ВІДЕО";
"room_preview_try_join_an_unknown_room" = "Ви намагаєтесь отримати доступ до %@. Бажаєте приєднатися, щоб взяти участь в обговоренні?";
"room_preview_subtitle" = "Це попередній перегляд кімнати. Ви в режимі лише читання.";
// Room Preview
"room_preview_invitation_format" = "%s запрошує вас приєднатися до цієї кімнати";
// Unknown devices
"unknown_devices_alert_title" = "Кімната містить невідомі сеанси";
"external_link_confirmation_message" = "Посилання %@ спрямовує вас на інший сайт: %@.\n\nВи впевнені, що бажаєте продовжити?";
"external_link_confirmation_title" = "Перевірте це посилання";
"room_accessibility_hangup" = "Покласти слухавку";
"room_resource_usage_limit_reached_message_contact_3" = " , щоб збільшити ліміт.";
"room_resource_usage_limit_reached_message_2" = "деякі користувачі не зможуть увійти.";
"room_resource_limit_exceeded_message_contact_3" = " , щоб продовжити користуватися цією службою.";
"room_resource_limit_exceeded_message_contact_2_link" = "зв’яжіться з адміністратором вашого сервера";
"room_predecessor_link" = "Торкніться тут, щоб переглянути давніші повідомлення.";
"room_predecessor_information" = "Ця кімната — продовження спілкування в іншій кімнаті.";
"room_replacement_link" = "Спілкування продовжується тут.";
"room_replacement_information" = "Цю кімнату замінено й вона більше не активна.";
"room_event_action_end_poll" = "Завершити опитування";
"room_event_action_remove_poll" = "Вилучити опитування";
"user_verification_session_details_information_trusted_current_user" = "Цей сеанс довірений для захищеного листування, бо ви звірили його:";
"user_verification_session_details_information_trusted_other_user_part1" = "Цей сеанс довірений для захищеного листування, бо ";
"user_verification_session_details_information_trusted_other_user_part2" = " звіряє його:";
"user_verification_session_details_information_untrusted_other_user" = " входить у новому сеансі:";
"user_verification_session_details_additional_information_untrusted_other_user" = "Надіслані цьому сеансу й цим сеансом повідомлення позначатимуться застереженнями, поки цей користувач йому не довірить. Або ви можете власноруч звірити сеанс.";
"user_verification_session_details_additional_information_untrusted_current_user" = "Якщо ви не входили в цей сеанс, ваш обліковий запис може бути під загрозою.";
"user_verification_session_details_verify_action_other_user" = "Звірити власноруч";
"key_verification_bootstrap_not_setup_message" = "Спершу налаштуйте перехресне підписування.";
"key_verification_verify_qr_code_information" = "Відскануйте код, щоб безпечно звірити одне одного.";
"key_verification_verify_qr_code_scan_code_action" = "Сканувати їхній код";
"key_verification_verify_qr_code_cannot_scan_action" = "Не вдалося сканувати?";
"key_verification_verify_qr_code_other_scan_my_code_title" = "Чи зміг інший користувач відсканувати QR-код?";
"key_verification_verify_qr_code_scan_other_code_success_title" = "Код підтверджено!";
"key_verification_verify_qr_code_scan_other_code_success_message" = "QR-код успішно підтверджено.";
// MARK: Self verification start
// New login
"device_verification_self_verify_alert_title" = "Новий вхід. Це були ви?";
"device_verification_self_verify_alert_message" = "Звірте новий вхід до вашого облікового запису: %@";
"device_verification_self_verify_start_information" = "Звірте цим сеансом свій новий. Це надасть йому доступ до зашифрованих повідомлень.";
"device_verification_self_verify_start_waiting" = "Очікування…";
// MARK: Self verification wait
"device_verification_self_verify_wait_title" = "Доповніть безпеку";
"device_verification_self_verify_wait_information" = "Звірте цей сеанс одним зі своїх інших, щоб надати йому доступ до зашифрованих повідомлень.\n\nВикористайте найостанніший %@ на своїх інших пристроях:";
// Recover from private key
"key_backup_recover_from_private_key_info" = "Відновлення резервної копії…";
// MARK: Scan confirmation
// Scanning
"key_verification_scan_confirmation_scanning_title" = "Майже все! Чекаємо на підтвердження…";
"key_verification_scan_confirmation_scanning_user_waiting_other" = "Очікування на %@…";
"key_verification_scan_confirmation_scanning_device_waiting_other" = "Очікування іншого пристрою…";
// Scanned
"key_verification_scan_confirmation_scanned_title" = "Майже все!";
"key_verification_scan_confirmation_scanned_user_information" = "Чи показує %@ такий же щит?";
"key_verification_scan_confirmation_scanned_device_information" = "Чи показує інший пристрій такий же щит?";
"device_verification_self_verify_wait_new_sign_in_title" = "Звірте цей вхід";
"device_verification_self_verify_wait_additional_information" = "Це працює з %@ та іншими клієнтами Matrix, здатними на перехресне підписування.";
// MARK: - Device Verification
"key_verification_other_session_title" = "Звірте сеанс";
"key_verification_new_session_title" = "Звірте свій новий сеанс";
"key_verification_this_session_title" = "Звірити цей сеанс";
"device_verification_security_advice_emoji" = "Порівняйте унікальні емоджі, переконавшись, що їх показано в однаковому порядку.";
"device_verification_security_advice_number" = "Порівняйте числа, переконавшись, що їх показано в однаковому порядку.";
// MARK: Verify
"key_verification_verify_sas_title_emoji" = "Порівняйте емодзі";
"key_verification_verify_sas_title_number" = "Порівняйте числа";
"key_verification_verify_sas_cancel_action" = "Вони не збігаються";
"key_verification_verify_sas_validate_action" = "Вони збігаються";
"key_verification_verify_sas_additional_information" = "Для більшої безпеки зв'яжіться іншим довіреним засобом чи особисто.";
"key_verification_verify_qr_code_emoji_information" = "Звірити порівнянням унікальних емодзі.";
"key_verification_verify_qr_code_start_emoji_action" = "Звірити за допомогою емодзі";
"key_verification_verified_other_session_information" = "Тепер ви можете читати захищені повідомлення в своєму іншому сеансі, а інші користувачі знатимуть, що можуть йому довіряти.";
"key_verification_verified_new_session_information" = "Тепер ви можете читати захищені повідомлення на своєму новому пристрої, а інші користувачі знатимуть, що можуть йому довіряти.";
"key_verification_verified_this_session_information" = "Тепер ви можете читати захищені повідомлення на цьому пристрої, а інші користувачі знатимуть, що можуть йому довіряти.";
// User
"key_verification_verified_user_information" = "Листування з цим користувачем наскрізно зашифроване й непрочитне для сторонніх.";
// Current session
"key_verification_self_verify_current_session_alert_title" = "Звірити цей сеанс";
"key_verification_self_verify_current_session_alert_message" = "Інші користувачі можуть йому не довіряти.";
"key_verification_verify_qr_code_information_other_device" = "Відскануйте код знизу для звірки:";
// MARK: Manually Verify Device
"key_verification_manually_verify_device_title" = "Звірити власноруч за допомогою тексту";
"key_verification_manually_verify_device_instruction" = "Підтвердьте шляхом порівняння наступного рядка з рядком у користувацьких налаштуваннях вашого іншого сеансу:";
"key_verification_manually_verify_device_additional_information" = "Якщо вони відрізняються, безпека вашого зв'язку може бути під загрозою.";
"user_verification_session_details_verify_action_current_user_manually" = "Звірити власноруч за допомогою тексту";
"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Використати ключ безпеки";
"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Використати фразу чи ключ безпеки";
"device_verification_self_verify_wait_recover_secrets_additional_information" = "Якщо не маєте доступу до наявного сеансу";
// Recover with passphrase
"secrets_recovery_with_passphrase_title" = "Фраза безпеки";
"secrets_recovery_with_passphrase_information_default" = "Отримайте доступ до своєї захищеної історії повідомлень та ідентичності перехресного підписування для звірки інших сеансів, увівши свою фразу безпеки.";
"secrets_recovery_with_passphrase_information_verify_device" = "Підтвердьте цей пристрій своєю фразою безпеки.";
"secrets_recovery_with_passphrase_passphrase_placeholder" = "Введіть фразу безпеки";
"secrets_recovery_with_passphrase_recover_action" = "Використати фразу";
"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Забули свою фразу безпеки? Можете ";
"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "використати ключ безпеки";
"secrets_recovery_with_passphrase_invalid_passphrase_title" = "Не вдалося зайти до таємного сховища";
"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Переконайтеся, що вводите правильну фразу безпеки.";
// Recover with key
"secrets_recovery_with_key_title" = "Ключ безпеки";
"secrets_recovery_with_key_information_default" = "Отримайте доступ до своєї захищеної історії повідомлень та ідентичності перехресного підписування для звірки інших сеансів, увівши свій ключ безпеки.";
"secrets_recovery_with_key_information_verify_device" = "Підтвердьте цей пристрій своїм ключем безпеки.";
"secrets_recovery_with_key_recovery_key_placeholder" = "Введіть ключ безпеки";
"secrets_recovery_with_key_recover_action" = "Використати ключ";
"secrets_recovery_with_key_invalid_recovery_key_title" = "Не вдалося зайти до таємного сховища";
"secrets_recovery_with_key_invalid_recovery_key_message" = "Переконайтеся, що вводите правильний ключ безпеки.";
"secure_key_backup_setup_intro_use_security_key_title" = "Використати ключ безпеки";
"secure_key_backup_setup_intro_use_security_key_info" = "Згенерувати ключ безпеки для зберігання в надійному місці, наприклад у менеджері паролів чи сейфі.";
"secure_key_backup_setup_intro_use_security_passphrase_title" = "Встановити фразу безпеки";
"secure_key_backup_setup_intro_use_security_passphrase_info" = "Ввести таємну фразу, відому лише вам, і згенерувати ключ резервного копіювання.";
// Cancel
"secure_key_backup_setup_cancel_alert_title" = "Ви впевнені?";
"secure_key_backup_setup_cancel_alert_message" = "Якщо скасуєте це й загубите пристрій, то втратите зашифровані повідомлення й дані.\n\nВвімкнути захищене резервне копіювання й керувати своїми ключами можна в налаштуваннях.";
// MARK: - Secrets set up
// Recovery Key
"secrets_setup_recovery_key_title" = "Збережіть ключ безпеки";
"secrets_setup_recovery_key_information" = "Зберігайте ключ безпеки в надійному місці. Ним можна буде розблокувати ваші зашифровані повідомлення й дані.";
"secrets_setup_recovery_key_storage_alert_title" = "Зберігайте його у надійному місці";
// Recovery passphrase
"secrets_setup_recovery_passphrase_title" = "Встановіть фразу безпеки";
"secrets_setup_recovery_passphrase_information" = "Введіть відому лише вам фразу безпеки для захисту таємниць на вашому сервері.";
"secrets_setup_recovery_passphrase_additional_information" = "Не застосовуйте пароль облікового запису повторно.";
"secrets_setup_recovery_passphrase_confirm_information" = "Для підтвердження введіть таємну фразу ще раз.";
"secure_key_backup_setup_existing_backup_error_title" = "Резервна копія повідомлень уже існує";
"secure_key_backup_setup_existing_backup_error_info" = "Розблокуйте її, щоб продовжити попереднє захищене резервне копіювання, або видаліть її, щоб почати захищене резервне копіювання повідомлень заново.";
"secure_key_backup_setup_existing_backup_error_unlock_it" = "Розблокувати";
"secure_key_backup_setup_existing_backup_error_delete_it" = "Видалити";
"sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "Налаштувати резервне копіювання ключів";
"major_update_information" = "Ми раді повідомити, що змінили назву! Ваш застосунок оновлено й ви ввійшли у свій обліковий запис.";
"pin_protection_reset_alert_message" = "Щоб скинути PIN-код, увійдіть заново та створіть новий";
"pin_protection_explanatory" = "Встановлення PIN-коду захищає ваші дані, як-от повідомлення чи контакти, обов'язковим запитом вашого PIN-коду при відкритті застосунку.";
"pin_protection_not_allowed_pin" = "Цей PIN-код недостатньо безпечний. Спробуйте інший";
"pin_protection_settings_section_footer" = "Щоб скинути PIN-код, потрібно ввійти заново та створити новий.";
"pin_protection_mismatch_too_many_times_error_message" = "Не пригадуєте свій PIN-код? Торкніться кнопки \"Забули PIN-код\".";
"biometrics_usage_reason" = "Застосунок потребує підтвердження особи";
"biometrics_cant_unlocked_alert_message_x" = "Розблокуйте за допомогою %@ або ввійдіть заново й увімкніть %@ ще раз";
"biometrics_cant_unlocked_alert_message_login" = "Увійти заново";
"device_verification_self_verify_wait_recover_secrets_checking_availability" = "Перевірка інших можливостей звірки ...";
"create_room_section_footer_type" = "Вхід до закритої кімнати — лише за запрошенням.";
"pin_protection_kick_user_alert_message" = "Забагато помилок, ваш сеанс припинено";
// MARK: - Secrets recovery
"secrets_recovery_reset_action_part_1" = "Забули чи втратили всі способи відновлення? ";
"secrets_reset_information" = "Робіть це лише якщо у вас немає іншого пристрою для звірки.";
"secrets_reset_warning_title" = "Якщо ви скинете все";
"secrets_reset_warning_message" = "Ви розпочнете знову, але без історії повідомлень, без довірених пристроїв та користувачів.";
"secrets_setup_recovery_passphrase_summary_title" = "Збережіть ключ безпеки";
"secrets_setup_recovery_passphrase_summary_information" = "Запам'ятайте свою фразу безпеки. Нею можна буде розблокувати ваші зашифровані повідомлення й дані.";
"home_empty_view_information" = "Досконалий застосунок для захищеного спілкування команд, друзів і організацій. Торкніться кнопки + унизу, щоб додати людей і кімнати.";
"bug_report_background_mode" = "Продовжити у фоновому режимі";
"room_intro_cell_information_room_without_topic_sentence2_part2" = " щоб люди знали, про що ця кімната.";
"room_intro_cell_information_dm_sentence2" = "У цій розмові лише ви двоє, більше ніхто не може приєднатися.";
"room_intro_cell_information_multiple_dm_sentence2" = "У цій розмові лише ви, поки хтось із вас не запросить іще когось приєднатися.";
"space_feature_unavailable_subtitle" = "Простори ще не готові на iOS, але доступні у вебпереглядачі та на комп'ютері";
"space_feature_unavailable_information" = "Простори — новий спосіб групувати кімнати й людей.\n\nСкоро ми їх допрацюємо. Якщо приєднаєтеся до простору на іншій платформі, всі його кімнати стануть доступні й тут.";
// Success from secure backup
"key_backup_setup_success_from_secure_backup_info" = "Створюється резервна копія ключів.";
"secrets_recovery_with_key_information_unlock_secure_backup_with_phrase" = "Введіть фразу безпеки для продовження.";
"secrets_recovery_with_key_information_unlock_secure_backup_with_key" = "Скористайтеся ключем безпеки для продовження.";
"key_verification_verify_qr_code_scan_code_other_device_action" = "Сканувати цим пристроєм";
"voice_message_stop_locked_mode_recording" = "Торкніться запису, щоб зупинити або прослухати";
"version_check_banner_subtitle_supported" = "Ми скоро припинимо підтримку %@ на iOS %@. Щоб усі можливості %@ залишалися вам доступні, радимо оновити вашу версію iOS.";
"version_check_banner_subtitle_deprecated" = "Ми більше не підтримуємо %@ на iOS %@. Щоб усі можливості %@ залишалися вам доступні, радимо оновити вашу версію iOS.";
"version_check_modal_subtitle_supported" = "Ми вдосконалюємо швидкодію та дизайн %@. На жаль, ваша версія iOS сумісна не з усіма нашими виправленнями й скоро втратить підтримку.\nРадимо оновити операційну систему, щоб усі можливості %@ були вам доступні.";
"version_check_modal_subtitle_deprecated" = "Ми вдосконалюємо швидкодію та дизайн %@. На жаль, ваша версія iOS сумісна не з усіма нашими виправленнями й більше не підтримується.\nРадимо оновити операційну систему, щоб усі можливості %@ були вам доступні.";
"leave_space_message" = "Точно вийти з %@? Вийти також із усіх кімнат і просторів цього простору?";
"leave_space_message_admin_warning" = "Ви адмініструєте цей простір. Перед виходом переконайтесь, що передали права адміністрування іншому учаснику.";
"leave_space_only_action" = "Не виходити з жодної кімнати";
"leave_space_and_all_rooms_action" = "Вийти з усіх кімнат і просторів";
"spaces_explore_rooms" = "Дослідити кімнати";
"spaces_empty_space_detail" = "Деяких кімнат може бути не видно, бо вони закриті й потребують запрошення.";
"spaces_suggested_room" = "Пропоновано";
"room_details_access_section_anyone_for_dm" = "Будь-хто з посиланням, зокрема гості";
"spaces_no_room_found_detail" = "Деяких результатів може бути не видно, бо вони закриті й потребують запрошення.";
"spaces_no_member_found_detail" = "Шукаєте когось, хто ще не в %@? Запросіть їх вебпереглядачем або комп'ютером.";
"spaces_invites_coming_soon_title" = "Запрошення ще в розробці";
"spaces_coming_soon_detail" = "Ця можливість тут іще не втілена, але скоро буде. Поки що можете зробити це в Element на комп'ютері.";
"space_participants_action_remove" = "Вилучити з цього простору";
"space_participants_action_ban" = "Заблокувати в цьому просторі";
// Service terms
"service_terms_modal_title_message" = "Щоб продовжити, погодьтеся з запропонованими умови й положеннями";
"service_terms_modal_description_identity_server" = "Інші зможуть знаходити вас, якщо в контактах їхнього телефону записаний ваш номер чи е-пошта.";
"service_terms_modal_description_integration_manager" = "Це дасть змогу використовувати ботів, мости, віджети й пакунки наліпок.";
"service_terms_modal_information_description_identity_server" = "Сервер ідентифікації допомагає знаходити облікові записи за номером телефону чи адресою е-пошти.";
"service_terms_modal_information_description_integration_manager" = "Менеджер інтеграцій дає змогу додавати сторонній функціонал.";
"share_extension_low_quality_video_message" = "Надішліть в %@ у кращій якості, або нижче в низькій.";
// Mark: - Polls
"poll_edit_form_create_poll" = "Створити опитування";
"poll_edit_form_poll_question_or_topic" = "Питання опитування або тема";
"poll_edit_form_question_or_topic" = "Питання чи тема";
"poll_edit_form_input_placeholder" = "Напишіть щось";
"poll_edit_form_create_options" = "Створіть варіанти";
"poll_edit_form_option_number" = "Варіант %lu";
"poll_edit_form_add_option" = "Додати варіант";
"poll_edit_form_post_failure_title" = "Не вдалося надіслати опитування";
"poll_edit_form_post_failure_subtitle" = "Повторіть спробу";
"poll_edit_form_post_failure_action" = "Гаразд";
"poll_timeline_one_vote" = "1 голос";
"poll_timeline_votes_count" = "%lu голосів";
"poll_timeline_total_no_votes" = "Жодного голосу";
"poll_timeline_total_one_vote" = "1 голос надіслано";
"poll_timeline_total_votes" = "%lu голосів надіслано";
"poll_timeline_total_one_vote_not_voted" = "1 голос надіслано. Проголосуйте, щоб побачити результати";
"poll_timeline_total_votes_not_voted" = "%lu голосів надіслано. Проголосуйте, щоб побачити результати";
"poll_timeline_total_final_results_one_vote" = "Остаточні результати на підставі 1 голосу";
"poll_timeline_total_final_results" = "Остаточні результати на підставі %lu голосів";
"poll_timeline_vote_not_registered_title" = "Голос не зареєстровано";
"poll_timeline_vote_not_registered_subtitle" = "Не вдалося зареєструвати ваш голос, просимо повторити спробу";
"poll_timeline_vote_not_registered_action" = "Гаразд";
"poll_timeline_not_closed_title" = "Не вдалося завершити опитування";
"poll_timeline_not_closed_subtitle" = "Повторіть спробу";
"poll_timeline_not_closed_action" = "Гаразд";
"e2e_need_log_in_again" = "Вам потрібно ввійти заново, щоб згенерувати ключі наскрізного шифрування для цього сеансу й надіслати відкритий ключ домашньому серверу.\nЦе одноразова дія; перепрошуємо за незручності.";
// Crypto
"e2e_enabling_on_app_update" = "%@ тепер підтримує наскрізне шифрування. Перезайдіть, щоб його ввімкнути.\n\nМожете зробити це зараз або пізніше в налаштуваннях застосунку.";
// Key backup wrong version
"e2e_key_backup_wrong_version_title" = "Нова резервна копія ключів";
"e2e_key_backup_wrong_version" = "Знайдено нову резервну копію ключів до захищених повідомлень.\n\nЯкщо це були не ви, встановіть нову фразу безпеки в налаштуваннях.";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "Ми <b>не</b> записуємо й <b>не</b> аналізуємо жодних даних облікового запису";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "Ми <b>не</b> передаємо даних стороннім особам";
"analytics_prompt_point_3" = "Можете вимкнути це коли завгодно в налаштуваннях";
"analytics_prompt_not_now" = "Відкласти";
"analytics_prompt_yes" = "Так, усе гаразд";
"analytics_prompt_stop" = "Більше не надсилати";
"analytics_prompt_terms_link_upgrade" = "тут";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "Прочитайте всі наші умови %@. Згодні з ними?";
"analytics_prompt_terms_link_new_user" = "тут";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "Можете прочитати всі наші умови %@.";
"analytics_prompt_message_upgrade" = "Раніше ви погодилися надсилати нам анонімні дані про використання. Тепер, щоб розуміти, як люди використовують кілька пристроїв, ми створимо спільний для ваших пристроїв випадковий ідентифікатор.";
"analytics_prompt_message_new_user" = "Допомагайте нам визначати проблеми й удосконалювати Element, надсилаючи анонімні дані про використання. Щоб розуміти, як люди використовують кілька пристроїв, ми створимо спільний для ваших пристроїв випадковий ідентифікатор.";
// Analytics
"analytics_prompt_title" = "Допоможіть удосконалити %@";
"widget_integration_room_not_visible" = "Кімната %@ недоступна.";
"widget_integration_missing_user_id" = "В запиті бракує user_id.";
"widget_integration_missing_room_id" = "В запиті бракує room_id.";
"widget_integration_no_permission_in_room" = "У вас нема такого дозволу в цій кімнаті.";
"widget_integration_must_be_in_room" = "Вас нема в цій кімнаті.";
"widget_integration_positive_power_level" = "Рівень повноважень має бути цілим додатним числом.";
"widget_integration_room_not_recognised" = "Кімнату не знайдено.";
"widget_integration_failed_to_send_request" = "Не вдалося надіслати запит.";
"widget_integration_unable_to_create" = "Не вдалося створити віджет.";
// Widget Integration Manager
"widget_integration_need_to_be_able_to_invite" = "Для цього вам потрібен дозвіл запрошувати користувачів.";
"widget_creation_failure" = "Помилка створення віджету";
"widget_no_power_to_manage" = "Для керування віджетами у цій кімнаті потрібен дозвіл";
"bug_report_progress_uploading" = "Надсилання звіту";
"bug_report_progress_zipping" = "Збір журналів";
"bug_report_send_screenshot" = "Надіслати знімок екрана";
"room_details_access_section_for_dm" = "Хто може мати доступ?";
"room_details_access_section" = "Хто має доступ до кімнати?";
"room_details_low_priority_tag" = "Неважливе";
"room_details_favourite_tag" = "Улюблене";
"identity_server_settings_alert_disconnect_still_sharing_3pid" = "Сервер ідентифікації %@ досі поширює ваші особисті дані.\n\nРадимо вилучити адреси е-пошти й номери телефонів із сервера ідентифікації, перш ніж від'єднатися.";
"settings_analytics_and_crash_data" = "Надсилати дані про збої та аналітику";
"accessibility_button_label" = "кнопка";
"enable" = "Увімкнути";
"call_no_stun_server_error_use_fallback_button" = "Спробувати %@";
"call_no_stun_server_error_message_2" = "Також ви можете спробувати публічний сервер %@, але це буде менш надійно й сервер бачитиме вашу IP-адресу. Ви можете керувати цим у налаштуваннях";
"call_no_stun_server_error_message_1" = "Запропонуйте адміністратору вашого домашнього сервера %@ налаштувати сервер TURN для надійної роботи викликів.";
"call_no_stun_server_error_title" = "Не вдалося зателефонувати через неправильно налаштований сервер";
"call_jitsi_error" = "Не вдалося приєднатися до конференції.";
"call_already_displayed" = "Виклик уже триває.";
"photo_library_access_not_granted" = "%@ не має доступу до медіатеки, просимо змінити налаштування приватності";
"camera_unavailable" = "Камера недоступна на вашому пристрої";
"camera_access_not_granted" = "%@ не має дозволу використовувати камеру, просимо змінити налаштування приватності";
"rage_shake_prompt" = "Схоже, ви розчаровано струсили телефон. Бажаєте надіслати звіт про ваду?";
"bug_report_prompt" = "При останньому запуску застосунок закрився з помилкою. Бажаєте надіслати звіт про помилку?";
"homeserver_connection_lost" = "Не вдалося з'єднатися з домашнім сервером.";
"event_formatter_jitsi_widget_removed_by_you" = "Ви вилучаєте голосову конференцію";
"event_formatter_jitsi_widget_added_by_you" = "Ви додаєте голосову конференцію";
"event_formatter_rerequest_keys_part2" = " ваших інших сеансів.";
"event_formatter_rerequest_keys_part1_link" = "Повторити запит ключів шифрування";
"event_formatter_jitsi_widget_removed" = "%@ вилучає голосову конференцію";
"event_formatter_jitsi_widget_added" = "%@ додає голосову конференцію";
"event_formatter_widget_removed" = "%@ віджет видалено %@";
"event_formatter_widget_added" = "%@ віджет додано %@";
// Events formatter
"event_formatter_member_updates" = "%tu змін членства";
"directory_server_type_homeserver" = "Загальнодоступні кімнати якого домашнього сервера перелічити?";
"receipt_status_read" = "Прочитано: ";
// Read Receipts
"read_receipts_list" = "Список міток прочитання";
"room_details_addresses_disable_main_address_prompt_msg" = "Ви вилучаєте головну адресу. Усталена головна адреса для цієї кімнати буде обрана випадково";
"room_details_access_section_no_address_warning" = "Щоб на кімнату посилалися, вона повинна мати адресу";
"room_details_access_section_anyone" = "Будь-хто з посиланням, зокрема гості";
"room_details_access_section_anyone_apart_from_guest_for_dm" = "Будь-хто з посиланням, окрім гостей";
"room_details_access_section_anyone_apart_from_guest" = "Будь-хто з посиланням, окрім гостей";
"deactivate_account_informations_part5" = "Якщо ви хочете, щоб ми вилучили ваші повідомлення, встановіть прапорець унизу\n\nВидимість повідомлень у Matrix схожа на електронну пошту. Тобто ваші повідомлення не зможуть переглянути нові або незареєстровані користувачі, але зареєстровані користувачі, які вже мають доступ до цих повідомлень і надалі матимуть доступ до їхньої копії на своїх пристроях.";
"deactivate_account_informations_part4_emphasize" = "типово не вилучає надіслані вами повідомлення. ";
"deactivate_account_informations_part2_emphasize" = "Ця дія незворотна.";
"deactivate_account_informations_part1" = "Вашим обліковим записом більше ніколи не можна буде користуватися. Ви не зможете увійти, і ніхто не зможе повторно зареєструвати той самий ID користувача. Ваш обліковий запис буде видалено з усіх кімнат, а всі його дані вилучено з вашого сервера ідентифікації. ";
"e2e_room_key_request_message" = "Ваш не звірений сеанс «%@» запитує ключі шифрування.";
"e2e_room_key_request_message_new_device" = "Ви додали новий сеанс «%@», котрий запитує ключі шифрування.";
"room_widget_permission_information_title" = "Віджет може надсилати дані до %@:\n";
"room_widget_permission_webview_information_title" = "Віджет може встановлювати куки та надсилати дані до %@:\n";
"share_extension_failed_to_encrypt" = "Не вдалося надіслати. Перевірте налаштування шифрування для цієї кімнати в головному застосунку";
// Share extension
"share_extension_auth_prompt" = "Увійдіть до основного застосунку, щоб поділитися вмістом";
"service_terms_modal_policy_checkbox_accessibility_hint" = "Позначте, щоб погодитися на %@";
"gdpr_consent_not_given_alert_review_now_action" = "Переглянути зараз";
// GDPR
"gdpr_consent_not_given_alert_message" = "Перегляньте та погодьтеся з умовами користування, щоб продовжувати використовувати сервер %@.";
"e2e_room_key_request_ignore_request" = "Знехтувати запит";
"e2e_room_key_request_share_without_verifying" = "Надіслати без перевірки";
"e2e_room_key_request_start_verification" = "Починається перевірка…";
"deactivate_account_forget_messages_information_part3" = ": внаслідок цього майбутні користувачі не можуть не розуміти змісту розмов)";
"deactivate_account_forget_messages_information_part1" = "Видаліть усі надіслані мною повідомлення після деактивації мого облікового запису (";
"rerequest_keys_alert_message" = "Запустіть %@ на іншому пристрої, який зможе розшифрувати повідомлення та надіслати ключі цьому сеансу.";
"widget_integration_manager_disabled" = "Необхідно увімкнути менеджер інтеграцій у налаштуваннях";
"widget_menu_remove" = "Вилучити для всіх";
"widget_menu_revoke_permission" = "Відкликати мій доступ";
"widget_menu_open_outside" = "Відкрити у переглядачі";
"widget_menu_refresh" = "Оновити";
"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Додати зараз?";
"widget_sticker_picker_no_stickerpacks_alert" = "На разі жоден пакунок наліпок не увімкнено.";
"widget_integrations_server_failed_to_connect" = "Не вдалося зʼєднатися з сервером інтеграцій";
// Widget
"widget_no_integrations_server_configured" = "Сервер інтеграцій не налаштовано";
"bug_report_description" = "Опишіть ваду. Що ви робили? Виконання якої дії очікували? Що сталося натомість?";
"bug_crash_report_title" = "Звіт про збій";
"bug_crash_report_description" = "Будь ласка, опишіть свої дії перед збоєм:";
"bug_report_logs_description" = "Задля діагностики, журнали клієнта будуть надіслані разом зі звітом про ваду. Якщо бажаєте надіслати лише текст угорі, зніміть галочку:";
"bug_report_send_logs" = "Надіслати журнали";
"group_participants_invite_another_user" = "Знайти чи запросити за ID користувача чи іменем";
"group_participants_invite_malformed_id" = "Хибний ID. Треба Matrix ID вигляду «@localpart:domain»";
// MARK: Key backup setup
"key_backup_setup_title" = "Резервне копіювання ключів";
"key_backup_setup_skip_alert_message" = "Ви втратите захищені повідомлення, якщо вийдете чи загубите пристрій.";
// Intro
"key_backup_setup_intro_title" = "Ніколи не втрачайте зашифровані повідомлення";
"key_backup_setup_intro_info" = "Повідомлення в зашифрованих кімнатах захищені наскрізним шифруванням. Тільки ви та одержувачі маєте ключі для читання цих повідомлень.\n\nСтворіть захищену резервну копію ключів, щоб їх не втратити.";
"key_backup_setup_passphrase_info" = "Ми збережемо зашифровану копію ваших ключів на нашому сервері. Захистіть свою резервну копію парольною фразою.\n\nДля максимальної безпеки фраза повинна відрізнятися від пароля вашого облікового запису.";
"key_backup_setup_passphrase_set_passphrase_action" = "Встановити фразу";
// MARK: Key backup recover
"key_backup_recover_title" = "Захищені повідомлення";
// Recover from passphrase
"key_backup_recover_from_passphrase_info" = "Використайте фразу безпеки, щоб розблокувати історію зашифрованих повідомлень";
// Recover from recovery key
"key_backup_recover_from_recovery_key_info" = "Використайте ключ безпеки, щоб розблокувати історію зашифрованих повідомлень";
"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Забули свою фразу безпеки? Можете ";
"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "використати ключ безпеки";
"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Введіть ключ безпеки";
"key_backup_recover_from_recovery_key_recover_action" = "Розблокувати історію";
"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Втратили ключ безпеки? Встановіть новий у налаштуваннях.";
// Success
"key_backup_recover_success_info" = "Резервну копію відновлено!";
"key_backup_recover_done_action" = "Готово";
"key_backup_setup_intro_setup_action_without_existing_backup" = "Налаштувати резервне копіювання ключів";
// Passphrase
"key_backup_setup_passphrase_title" = "Захистіть резервну копію фразою безпеки";
"key_backup_setup_passphrase_setup_recovery_key_info" = "Або захистіть резервну копію ключем безпеки, який зберігатимете в надійному місці.";
"key_backup_setup_passphrase_setup_recovery_key_action" = "(Додатково) Налаштувати ключ безпеки";
// Success
"key_backup_setup_success_title" = "Успіх!";
// Success from passphrase
"key_backup_setup_success_from_passphrase_info" = "Триває резервне копіювання ваших ключів.\n\nКлюч безпеки підстраховує вас: можете використати його для відновлення доступу до ваших зашифрованих повідомлень, якщо забудете парольну фразу.\n\nТримайте відновлювальний ключ у якомусь дуже надійному місці, наприклад у менеджері паролів (або сейфі).";
"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Зберегти ключ безпеки";
// Success from recovery key
"key_backup_setup_success_from_recovery_key_info" = "Триває резервне копіювання ваших ключів.\n\nСкопіюйте цей ключ безпеки й надійно його зберігайте.";
"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Ключ безпеки";
"key_backup_setup_success_from_recovery_key_make_copy_action" = "Зробити копію";
"key_backup_setup_success_from_recovery_key_made_copy_action" = "Вже маю копію";
"key_backup_recover_invalid_passphrase_title" = "Хибна фраза безпеки";
"key_backup_recover_invalid_passphrase" = "Не вдається розшифрувати резервну копію цією фразою: переконайтеся, що вводите правильну фразу безпеки.";
"key_backup_recover_invalid_recovery_key_title" = "Хибний ключ безпеки";
"key_backup_recover_invalid_recovery_key" = "Не вдалося розшифрувати резервну копію цим ключем: переконайтеся, що вводите правильний ключ безпеки.";
// MARK: Sign out warning
"sign_out_existing_key_backup_alert_title" = "Точно вийти?";
"sign_out_existing_key_backup_alert_sign_out_action" = "Вийти";
"sign_out_non_existing_key_backup_alert_title" = "Якщо вийти зараз, ви втратите свої зашифровані повідомлення";
"sign_out_non_existing_key_backup_alert_discard_key_backup_action" = "Мені не потрібні мої зашифровані повідомлення";
"sign_out_non_existing_key_backup_sign_out_confirmation_alert_title" = "Ви втратите доступ до ваших зашифрованих повідомлень";
"sign_out_non_existing_key_backup_sign_out_confirmation_alert_message" = "Ви втратите доступ до своїх зашифрованих повідомлень, якщо не зробите резервну копію ключів перед виходом з системи.";
"sign_out_non_existing_key_backup_sign_out_confirmation_alert_sign_out_action" = "Вийти";
"sign_out_non_existing_key_backup_sign_out_confirmation_alert_backup_action" = "Резервна копія";
"sign_out_key_backup_in_progress_alert_title" = "Триває резервне копіювання ключів. Якщо вийти зараз, ви втратите доступ до своїх зашифрованих повідомлень.";
"sign_out_key_backup_in_progress_alert_discard_key_backup_action" = "Мені не потрібні мої зашифровані повідомлення";
"sign_out_key_backup_in_progress_alert_cancel_action" = "Почекаю";
"key_backup_setup_intro_manual_export_info" = "(Розширені)";
"key_backup_setup_intro_manual_export_action" = "Експорт ключів вручну";
"key_backup_setup_intro_setup_connect_action_with_existing_backup" = "Налаштувати цьому пристрою резервне копіювання ключів";
"device_verification_cancelled" = "Інша сторона скасувала звірку.";
"device_verification_cancelled_by_me" = "Звірку скасовано. Причина: %@";
"device_verification_error_cannot_load_device" = "Не вдалося отримати дані сеансу.";
// Mark: Incoming
"device_verification_incoming_title" = "Надійшов запит на звірку";
"device_verification_incoming_description_1" = "Звірте цей сеанс, щоб позначити його довіреним. Довірені сеанси партнерів дають змогу впевненіше користуватися наскрізним шифруванням повідомлень.";
"device_verification_incoming_description_2" = "Звірка цього сеансу позначить його довіреним для вас, а ваш довіреним для партнера.";
// MARK: Start
"device_verification_start_title" = "Звірити, порівнявши короткий текстовий рядок";
"device_verification_start_wait_partner" = "Очікування підтвердження партнером…";
"device_verification_start_use_legacy" = "Нічого не з'являється? Ще не всі клієнти підтримують інтерактивну звірку. Звірте по-старому.";
"device_verification_start_verify_button" = "Почати звірку";
"device_verification_start_use_legacy_action" = "Звірити по-старому";
"key_verification_tile_request_status_expired" = "Термін сплив";
"key_verification_user_title" = "Звірте їх";
"user_verification_start_information_part2" = " порівнявши одноразовий код на обох ваших пристроях.";
"user_verification_start_information_part1" = "Звірте безпечніше, ";
// MARK: - User verification
// Start
"user_verification_start_verify_action" = "Почати звірку";
"user_verification_start_waiting_partner" = "Очікування на %@…";
"user_verification_start_additional_information" = "Для безпеки зробіть це особисто або скористайтеся іншим способом зв'язку.";
// Sessions list
"user_verification_sessions_list_user_trust_level_trusted_title" = "Довірений";
"user_verification_sessions_list_information" = "Листування з цим користувачем у цій кімнаті наскрізно зашифроване й непрочитне для сторонніх.";
"user_verification_session_details_information_untrusted_current_user" = "Звірте цей сеанс, щоб позначити його довіреним і надати йому доступ до зашифрованих повідомлень:";
"secrets_setup_recovery_key_storage_alert_message" = "✓ Надрукуйте його й зберігайте в надійному місці\n✓ Збережіть його на USB-ключ або носій резервного копіювання\n✓ Скопіюйте його до вашого особистого хмарного сховища";
"call_transfer_error_message" = "Не вдалося переадресувати виклик";
"favourites_empty_view_information" = "Ви можете додати до улюблених кількома способами, найшвидший — це просто натиснути й утримувати. Торкніться зірки, і вони автоматично зʼявляться тут для безпечного зберігання.";
// MARK: - Favourites
"favourites_empty_view_title" = "Улюблені кімнати й люди";
"group_participants_filter_members" = "Фільтр учасників спільноти";
"group_participants_invite_prompt_msg" = "Ви впевнені, що хочете запросити %@ до цієї групи?";
"room_details_fail_to_update_room_direct" = "Не вдалося оновити прямий прапор цієї кімнати";
"room_details_flair_section" = "Показувати значки для спільнот";
"settings_flair" = "Показувати значок, де це дозволено";
"room_warning_about_encryption" = "Наскрізне шифрування ще на етапі бета-тестування й може бути ненадійним.\n\nПоки що не варто довіряти йому захист даних.\n\nПристрої ще не зможуть розшифрувати історію до того, як з них приєдналися до кімнати.\n\nЗашифровані повідомлення не буде показано у клієнтах, які ще не використовують шифрування.";

View file

@ -1548,7 +1548,7 @@
"space_home_show_all_rooms" = "显示所有聊天室"; "space_home_show_all_rooms" = "显示所有聊天室";
"room_event_action_forward" = "转发"; "room_event_action_forward" = "转发";
"poll_edit_form_add_option" = "添加选项"; "poll_edit_form_add_option" = "添加选项";
"poll_edit_form_option_number" = "选项 %d"; "poll_edit_form_option_number" = "选项 %lu";
"poll_edit_form_create_options" = "创建选项"; "poll_edit_form_create_options" = "创建选项";
"poll_edit_form_input_placeholder" = "写些东西"; "poll_edit_form_input_placeholder" = "写些东西";
"poll_edit_form_question_or_topic" = "问题或话题"; "poll_edit_form_question_or_topic" = "问题或话题";
@ -1562,3 +1562,46 @@
"share_extension_low_quality_video_title" = "将以低画质发送视频"; "share_extension_low_quality_video_title" = "将以低画质发送视频";
"settings_discovery_accept_terms" = "接受身份服务器条款"; "settings_discovery_accept_terms" = "接受身份服务器条款";
"settings_about" = "关于"; "settings_about" = "关于";
"poll_timeline_not_closed_action" = "好";
"poll_timeline_not_closed_subtitle" = "请再试一次";
"poll_timeline_not_closed_title" = "结束投票失败";
"poll_timeline_vote_not_registered_action" = "好";
"poll_timeline_vote_not_registered_subtitle" = "抱歉,您的投票未登记,请重试";
"poll_timeline_vote_not_registered_title" = "投票未登记";
"poll_timeline_total_final_results" = "基于 %lu 票的最终结果";
"poll_timeline_total_final_results_one_vote" = "基于 1 票的最终结果";
"poll_timeline_total_votes_not_voted" = "已有 %lu 票。投票查看结果";
"poll_timeline_total_one_vote_not_voted" = "已有 1 票。 投票查看结果";
"poll_timeline_total_votes" = "%lu 票";
"poll_timeline_total_one_vote" = "1 票";
"poll_timeline_total_no_votes" = "尚无投票";
"poll_timeline_votes_count" = "%lu 票";
"poll_timeline_one_vote" = "1 票";
"poll_edit_form_post_failure_action" = "好";
"poll_edit_form_post_failure_subtitle" = "请再试一次";
"poll_edit_form_post_failure_title" = "发布投票失败";
"settings_labs_enabled_polls" = "投票";
"room_event_action_end_poll" = "结束投票";
"room_event_action_remove_poll" = "删除投票";
"analytics_prompt_stop" = "停止共享";
"analytics_prompt_yes" = "是的,没关系";
"analytics_prompt_not_now" = "不是现在";
"analytics_prompt_point_3" = "您可以随时在设置中关闭此功能";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_2" = "我们<b>不</b>与第三方共享信息";
/* Note: The word "don't" is formatted in bold */
"analytics_prompt_point_1" = "我们 <b>不</b>记录任何账户数据或绘制任何账户数据的画像";
"analytics_prompt_terms_link_upgrade" = "此处";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
"analytics_prompt_terms_upgrade" = "阅读我们所有的条款 %@。 那样行吗?";
"analytics_prompt_terms_link_new_user" = "此处";
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
"analytics_prompt_terms_new_user" = "你可以阅读我们所有的条款 %@。";
"analytics_prompt_message_upgrade" = "您之前同意与我们共享匿名使用数据。 现在,为了帮助了解人们如何使用多个设备,我们将生成一个随机标识符,由您的设备共享。";
"analytics_prompt_message_new_user" = "通过共享匿名使用数据帮助我们发现问题并改进 Element。 为了了解人们如何使用多个设备,我们将生成一个随机标识符,由您的设备共享。";
// Analytics
"analytics_prompt_title" = "帮助改进 %@";
"settings_analytics_and_crash_data" = "发送崩溃和分析数据";
"accessibility_button_label" = "按钮";
"enable" = "启用";

View file

@ -20,6 +20,8 @@ internal typealias AssetImageTypeAlias = ImageAsset.Image
// swiftlint:disable identifier_name line_length nesting type_body_length type_name // swiftlint:disable identifier_name line_length nesting type_body_length type_name
internal enum Asset { internal enum Asset {
internal enum Images { internal enum Images {
internal static let analyticsCheckmark = ImageAsset(name: "AnalyticsCheckmark")
internal static let analyticsLogo = ImageAsset(name: "AnalyticsLogo")
internal static let socialLoginButtonApple = ImageAsset(name: "social_login_button_apple") internal static let socialLoginButtonApple = ImageAsset(name: "social_login_button_apple")
internal static let socialLoginButtonFacebook = ImageAsset(name: "social_login_button_facebook") internal static let socialLoginButtonFacebook = ImageAsset(name: "social_login_button_facebook")
internal static let socialLoginButtonGithub = ImageAsset(name: "social_login_button_github") internal static let socialLoginButtonGithub = ImageAsset(name: "social_login_button_github")
@ -113,6 +115,7 @@ internal enum Asset {
internal static let peopleFloatingAction = ImageAsset(name: "people_floating_action") internal static let peopleFloatingAction = ImageAsset(name: "people_floating_action")
internal static let actionCamera = ImageAsset(name: "action_camera") internal static let actionCamera = ImageAsset(name: "action_camera")
internal static let actionFile = ImageAsset(name: "action_file") internal static let actionFile = ImageAsset(name: "action_file")
internal static let actionLocation = ImageAsset(name: "action_location")
internal static let actionMediaLibrary = ImageAsset(name: "action_media_library") internal static let actionMediaLibrary = ImageAsset(name: "action_media_library")
internal static let actionPoll = ImageAsset(name: "action_poll") internal static let actionPoll = ImageAsset(name: "action_poll")
internal static let actionSticker = ImageAsset(name: "action_sticker") internal static let actionSticker = ImageAsset(name: "action_sticker")
@ -143,6 +146,9 @@ internal enum Asset {
internal static let videoCall = ImageAsset(name: "video_call") internal static let videoCall = ImageAsset(name: "video_call")
internal static let voiceCallHangonIcon = ImageAsset(name: "voice_call_hangon_icon") internal static let voiceCallHangonIcon = ImageAsset(name: "voice_call_hangon_icon")
internal static let voiceCallHangupIcon = ImageAsset(name: "voice_call_hangup_icon") internal static let voiceCallHangupIcon = ImageAsset(name: "voice_call_hangup_icon")
internal static let locationMarkerIcon = ImageAsset(name: "location_marker_icon")
internal static let locationShareIcon = ImageAsset(name: "location_share_icon")
internal static let locationUserMarker = ImageAsset(name: "location_user_marker")
internal static let pollCheckboxDefault = ImageAsset(name: "poll_checkbox_default") internal static let pollCheckboxDefault = ImageAsset(name: "poll_checkbox_default")
internal static let pollCheckboxSelected = ImageAsset(name: "poll_checkbox_selected") internal static let pollCheckboxSelected = ImageAsset(name: "poll_checkbox_selected")
internal static let pollDeleteIcon = ImageAsset(name: "poll_delete_icon") internal static let pollDeleteIcon = ImageAsset(name: "poll_delete_icon")

View file

@ -695,6 +695,10 @@ public class MatrixKitL10n: NSObject {
public static var messageReplyToSenderSentAnImage: String { public static var messageReplyToSenderSentAnImage: String {
return MatrixKitL10n.tr("message_reply_to_sender_sent_an_image") return MatrixKitL10n.tr("message_reply_to_sender_sent_an_image")
} }
/// has shared their location.
public static var messageReplyToSenderSentTheirLocation: String {
return MatrixKitL10n.tr("message_reply_to_sender_sent_their_location")
}
/// There are unsaved changes. Leaving will discard them. /// There are unsaved changes. Leaving will discard them.
public static var messageUnsavedChanges: String { public static var messageUnsavedChanges: String {
return MatrixKitL10n.tr("message_unsaved_changes") return MatrixKitL10n.tr("message_unsaved_changes")

View file

@ -15,6 +15,10 @@ public class VectorL10n: NSObject {
public static var accept: String { public static var accept: String {
return VectorL10n.tr("Vector", "accept") return VectorL10n.tr("Vector", "accept")
} }
/// button
public static var accessibilityButtonLabel: String {
return VectorL10n.tr("Vector", "accessibility_button_label")
}
/// checkbox /// checkbox
public static var accessibilityCheckboxLabel: String { public static var accessibilityCheckboxLabel: String {
return VectorL10n.tr("Vector", "accessibility_checkbox_label") return VectorL10n.tr("Vector", "accessibility_checkbox_label")
@ -31,6 +35,58 @@ public class VectorL10n: NSObject {
public static func activeCallDetails(_ p1: String) -> String { public static func activeCallDetails(_ p1: String) -> String {
return VectorL10n.tr("Vector", "active_call_details", p1) return VectorL10n.tr("Vector", "active_call_details", p1)
} }
/// Help us identify issues and improve %@ by sharing anonymous usage data. To understand how people use multiple devices, well generate a random identifier, shared by your devices.
public static func analyticsPromptMessageNewUser(_ p1: String) -> String {
return VectorL10n.tr("Vector", "analytics_prompt_message_new_user", p1)
}
/// You previously consented to share anonymous usage data with us. Now, to help understand how people use multiple devices, well generate a random identifier, shared by your devices.
public static var analyticsPromptMessageUpgrade: String {
return VectorL10n.tr("Vector", "analytics_prompt_message_upgrade")
}
/// Not now
public static var analyticsPromptNotNow: String {
return VectorL10n.tr("Vector", "analytics_prompt_not_now")
}
/// We <b>don't</b> record or profile any account data
public static var analyticsPromptPoint1: String {
return VectorL10n.tr("Vector", "analytics_prompt_point_1")
}
/// We <b>don't</b> share information with third parties
public static var analyticsPromptPoint2: String {
return VectorL10n.tr("Vector", "analytics_prompt_point_2")
}
/// You can turn this off anytime in settings
public static var analyticsPromptPoint3: String {
return VectorL10n.tr("Vector", "analytics_prompt_point_3")
}
/// Stop sharing
public static var analyticsPromptStop: String {
return VectorL10n.tr("Vector", "analytics_prompt_stop")
}
/// here
public static var analyticsPromptTermsLinkNewUser: String {
return VectorL10n.tr("Vector", "analytics_prompt_terms_link_new_user")
}
/// here
public static var analyticsPromptTermsLinkUpgrade: String {
return VectorL10n.tr("Vector", "analytics_prompt_terms_link_upgrade")
}
/// You can read all our terms %@.
public static func analyticsPromptTermsNewUser(_ p1: String) -> String {
return VectorL10n.tr("Vector", "analytics_prompt_terms_new_user", p1)
}
/// Read all our terms %@. Is that OK?
public static func analyticsPromptTermsUpgrade(_ p1: String) -> String {
return VectorL10n.tr("Vector", "analytics_prompt_terms_upgrade", p1)
}
/// Help improve %@
public static func analyticsPromptTitle(_ p1: String) -> String {
return VectorL10n.tr("Vector", "analytics_prompt_title", p1)
}
/// Yes, that's fine
public static var analyticsPromptYes: String {
return VectorL10n.tr("Vector", "analytics_prompt_yes")
}
/// Please review and accept the policies of this homeserver: /// Please review and accept the policies of this homeserver:
public static var authAcceptPolicies: String { public static var authAcceptPolicies: String {
return VectorL10n.tr("Vector", "auth_accept_policies") return VectorL10n.tr("Vector", "auth_accept_policies")
@ -1235,6 +1291,10 @@ public class VectorL10n: NSObject {
public static var emojiPickerTitle: String { public static var emojiPickerTitle: String {
return VectorL10n.tr("Vector", "emoji_picker_title") return VectorL10n.tr("Vector", "emoji_picker_title")
} }
/// Enable
public static var enable: String {
return VectorL10n.tr("Vector", "enable")
}
/// Send an encrypted message /// Send an encrypted message
public static var encryptedRoomMessagePlaceholder: String { public static var encryptedRoomMessagePlaceholder: String {
return VectorL10n.tr("Vector", "encrypted_room_message_placeholder") return VectorL10n.tr("Vector", "encrypted_room_message_placeholder")
@ -1439,10 +1499,6 @@ public class VectorL10n: NSObject {
public static var gdprConsentNotGivenAlertReviewNowAction: String { public static var gdprConsentNotGivenAlertReviewNowAction: String {
return VectorL10n.tr("Vector", "gdpr_consent_not_given_alert_review_now_action") return VectorL10n.tr("Vector", "gdpr_consent_not_given_alert_review_now_action")
} }
/// Would you like to help improve %@ by automatically reporting anonymous crash reports and usage data?
public static func googleAnalyticsUsePrompt(_ p1: String) -> String {
return VectorL10n.tr("Vector", "google_analytics_use_prompt", p1)
}
/// Home /// Home
public static var groupDetailsHome: String { public static var groupDetailsHome: String {
return VectorL10n.tr("Vector", "group_details_home") return VectorL10n.tr("Vector", "group_details_home")
@ -2135,6 +2191,54 @@ public class VectorL10n: NSObject {
public static var less: String { public static var less: String {
return VectorL10n.tr("Vector", "less") return VectorL10n.tr("Vector", "less")
} }
/// Close
public static var locationSharingCloseAction: String {
return VectorL10n.tr("Vector", "location_sharing_close_action")
}
/// %@ does not have permission to access your location. You can enable access in Settings > Location
public static func locationSharingInvalidAuthorizationErrorTitle(_ p1: String) -> String {
return VectorL10n.tr("Vector", "location_sharing_invalid_authorization_error_title", p1)
}
/// Not now
public static var locationSharingInvalidAuthorizationNotNow: String {
return VectorL10n.tr("Vector", "location_sharing_invalid_authorization_not_now")
}
/// Settings
public static var locationSharingInvalidAuthorizationSettings: String {
return VectorL10n.tr("Vector", "location_sharing_invalid_authorization_settings")
}
/// %@ could not load the map. Please try again later.
public static func locationSharingLoadingMapErrorTitle(_ p1: String) -> String {
return VectorL10n.tr("Vector", "location_sharing_loading_map_error_title", p1)
}
/// %@ could not access your location. Please try again later.
public static func locationSharingLocatingUserErrorTitle(_ p1: String) -> String {
return VectorL10n.tr("Vector", "location_sharing_locating_user_error_title", p1)
}
/// Open in Apple Maps
public static var locationSharingOpenAppleMaps: String {
return VectorL10n.tr("Vector", "location_sharing_open_apple_maps")
}
/// Open in Google Maps
public static var locationSharingOpenGoogleMaps: String {
return VectorL10n.tr("Vector", "location_sharing_open_google_maps")
}
/// Location sharing
public static var locationSharingSettingsHeader: String {
return VectorL10n.tr("Vector", "location_sharing_settings_header")
}
/// Enable location sharing
public static var locationSharingSettingsToggleTitle: String {
return VectorL10n.tr("Vector", "location_sharing_settings_toggle_title")
}
/// Share
public static var locationSharingShareAction: String {
return VectorL10n.tr("Vector", "location_sharing_share_action")
}
/// Location
public static var locationSharingTitle: String {
return VectorL10n.tr("Vector", "location_sharing_title")
}
/// Got it /// Got it
public static var majorUpdateDoneAction: String { public static var majorUpdateDoneAction: String {
return VectorL10n.tr("Vector", "major_update_done_action") return VectorL10n.tr("Vector", "major_update_done_action")
@ -2235,6 +2339,10 @@ public class VectorL10n: NSObject {
public static var off: String { public static var off: String {
return VectorL10n.tr("Vector", "off") return VectorL10n.tr("Vector", "off")
} }
/// OK
public static var ok: String {
return VectorL10n.tr("Vector", "ok")
}
/// On /// On
public static var on: String { public static var on: String {
return VectorL10n.tr("Vector", "on") return VectorL10n.tr("Vector", "on")
@ -2387,10 +2495,6 @@ public class VectorL10n: NSObject {
public static var pollEditFormPollQuestionOrTopic: String { public static var pollEditFormPollQuestionOrTopic: String {
return VectorL10n.tr("Vector", "poll_edit_form_poll_question_or_topic") return VectorL10n.tr("Vector", "poll_edit_form_poll_question_or_topic")
} }
/// OK
public static var pollEditFormPostFailureAction: String {
return VectorL10n.tr("Vector", "poll_edit_form_post_failure_action")
}
/// Please try again /// Please try again
public static var pollEditFormPostFailureSubtitle: String { public static var pollEditFormPostFailureSubtitle: String {
return VectorL10n.tr("Vector", "poll_edit_form_post_failure_subtitle") return VectorL10n.tr("Vector", "poll_edit_form_post_failure_subtitle")
@ -2403,10 +2507,6 @@ public class VectorL10n: NSObject {
public static var pollEditFormQuestionOrTopic: String { public static var pollEditFormQuestionOrTopic: String {
return VectorL10n.tr("Vector", "poll_edit_form_question_or_topic") return VectorL10n.tr("Vector", "poll_edit_form_question_or_topic")
} }
/// OK
public static var pollTimelineNotClosedAction: String {
return VectorL10n.tr("Vector", "poll_timeline_not_closed_action")
}
/// Please try again /// Please try again
public static var pollTimelineNotClosedSubtitle: String { public static var pollTimelineNotClosedSubtitle: String {
return VectorL10n.tr("Vector", "poll_timeline_not_closed_subtitle") return VectorL10n.tr("Vector", "poll_timeline_not_closed_subtitle")
@ -2447,10 +2547,6 @@ public class VectorL10n: NSObject {
public static func pollTimelineTotalVotesNotVoted(_ p1: Int) -> String { public static func pollTimelineTotalVotesNotVoted(_ p1: Int) -> String {
return VectorL10n.tr("Vector", "poll_timeline_total_votes_not_voted", p1) return VectorL10n.tr("Vector", "poll_timeline_total_votes_not_voted", p1)
} }
/// OK
public static var pollTimelineVoteNotRegisteredAction: String {
return VectorL10n.tr("Vector", "poll_timeline_vote_not_registered_action")
}
/// Sorry, your vote was not registered, please try again /// Sorry, your vote was not registered, please try again
public static var pollTimelineVoteNotRegisteredSubtitle: String { public static var pollTimelineVoteNotRegisteredSubtitle: String {
return VectorL10n.tr("Vector", "poll_timeline_vote_not_registered_subtitle") return VectorL10n.tr("Vector", "poll_timeline_vote_not_registered_subtitle")
@ -4227,6 +4323,10 @@ public class VectorL10n: NSObject {
public static var settingsAdvanced: String { public static var settingsAdvanced: String {
return VectorL10n.tr("Vector", "settings_advanced") return VectorL10n.tr("Vector", "settings_advanced")
} }
/// Send crash and analytics data
public static var settingsAnalyticsAndCrashData: String {
return VectorL10n.tr("Vector", "settings_analytics_and_crash_data")
}
/// Call invitations /// Call invitations
public static var settingsCallInvitations: String { public static var settingsCallInvitations: String {
return VectorL10n.tr("Vector", "settings_call_invitations") return VectorL10n.tr("Vector", "settings_call_invitations")
@ -4755,10 +4855,6 @@ public class VectorL10n: NSObject {
public static var settingsSecurity: String { public static var settingsSecurity: String {
return VectorL10n.tr("Vector", "settings_security") return VectorL10n.tr("Vector", "settings_security")
} }
/// Send anon crash & usage data
public static var settingsSendCrashReport: String {
return VectorL10n.tr("Vector", "settings_send_crash_report")
}
/// SENDING IMAGES AND VIDEOS /// SENDING IMAGES AND VIDEOS
public static var settingsSendingMedia: String { public static var settingsSendingMedia: String {
return VectorL10n.tr("Vector", "settings_sending_media") return VectorL10n.tr("Vector", "settings_sending_media")
@ -5059,9 +5155,9 @@ public class VectorL10n: NSObject {
public static var spacesAddRoomsComingSoonTitle: String { public static var spacesAddRoomsComingSoonTitle: String {
return VectorL10n.tr("Vector", "spaces_add_rooms_coming_soon_title") return VectorL10n.tr("Vector", "spaces_add_rooms_coming_soon_title")
} }
/// This feature hasnt been implemented here, but its on the way. For now, you can do that with Element on your computer. /// This feature hasnt been implemented here, but its on the way. For now, you can do that with %@ on your computer.
public static var spacesComingSoonDetail: String { public static func spacesComingSoonDetail(_ p1: String) -> String {
return VectorL10n.tr("Vector", "spaces_coming_soon_detail") return VectorL10n.tr("Vector", "spaces_coming_soon_detail", p1)
} }
/// Coming soon /// Coming soon
public static var spacesComingSoonTitle: String { public static var spacesComingSoonTitle: String {

View file

@ -1,65 +0,0 @@
/*
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import <Foundation/Foundation.h>
#import <MatrixSDK/MatrixSDK.h>
// Metrics related to notifications
FOUNDATION_EXPORT NSString *const AnalyticsNoficationsCategory;
FOUNDATION_EXPORT NSString *const AnalyticsNoficationsTimeToDisplayContent;
/**
The analytics value for accept/decline of the identity server's terms.
*/
FOUNDATION_EXPORT NSString *const AnalyticsContactsIdentityServerAccepted;
/**
`Analytics` sends analytics to an analytics tool.
*/
@interface Analytics : NSObject <MXAnalyticsDelegate>
/**
Returns the shared Analytics manager.
@return the shared Analytics manager.
*/
+ (instancetype)sharedInstance;
/**
Start doing analytics if the settings `enableCrashReport` is enabled.
*/
- (void)start;
/**
Stop doing analytics.
*/
- (void)stop;
/**
Track a screen display.
@param screenName the name of the displayed screen.
*/
- (void)trackScreen:(NSString*)screenName;
/**
Flush analytics data.
*/
- (void)dispatch;
@end

View file

@ -1,162 +0,0 @@
/*
Copyright 2018 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 "Analytics.h"
#import "GeneratedInterface-Swift.h"
NSString *const AnalyticsNoficationsCategory = @"notifications";
NSString *const AnalyticsNoficationsTimeToDisplayContent = @"timelineDisplay";
NSString *const AnalyticsContactsIdentityServerAccepted = @"identityServerAccepted";
// Duration data will be visible under the Piwik category called "Performance".
// Other values will be visible in "Metrics".
// Some Matomo screenshots are available at https://github.com/vector-im/element-ios/pull/3789.
NSString *const kAnalyticsPerformanceCategory = @"Performance";
NSString *const kAnalyticsMetricsCategory = @"Metrics";
@import MatomoTracker;
@interface Analytics ()
{
MatomoTracker *matomoTracker;
}
@end
@implementation Analytics
+ (instancetype)sharedInstance
{
static Analytics *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[Analytics alloc] init];
});
return sharedInstance;
}
- (instancetype)init
{
self = [super init];
if (self)
{
matomoTracker = [[MatomoTracker alloc] initWithSiteId:BuildSettings.analyticsAppId
baseURL:BuildSettings.analyticsServerUrl
userAgent:@"iOSMatomoTracker"];
[self migrateFromFourPointFourSharedInstance];
}
return self;
}
- (void)migrateFromFourPointFourSharedInstance
{
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"migratedFromFourPointFourSharedInstance"]) return;
[matomoTracker copyFromOldSharedInstance];
[[NSUserDefaults standardUserDefaults] setBool:true forKey:@"migratedFromFourPointFourSharedInstance"];
}
- (void)start
{
// Check whether the user has enabled the sending of crash reports.
if (RiotSettings.shared.enableCrashReport)
{
matomoTracker.isOptedOut = NO;
[matomoTracker setCustomVariableWithIndex:1 name:@"App Platform" value:@"iOS Platform"];
[matomoTracker setCustomVariableWithIndex:2 name:@"App Version" value:[AppDelegate theDelegate].appVersion];
// The language is either the one selected by the user within the app
// or, else, the one configured by the OS
NSString *language = [NSBundle mxk_language] ? [NSBundle mxk_language] : [[NSBundle mainBundle] preferredLocalizations][0];
[matomoTracker setCustomVariableWithIndex:4 name:@"Chosen Language" value:language];
MXKAccount* account = [MXKAccountManager sharedManager].activeAccounts.firstObject;
if (account)
{
[matomoTracker setCustomVariableWithIndex:7 name:@"Homeserver URL" value:account.mxCredentials.homeServer];
[matomoTracker setCustomVariableWithIndex:8 name:@"Identity Server URL" value:account.identityServerURL];
}
// TODO: We should also track device and os version
// But that needs to be decided for all platforms
// Catch and log crashes
[MXLogger logCrashes:YES];
[MXLogger setBuildVersion:[AppDelegate theDelegate].build];
#ifdef DEBUG
// Disable analytics in debug as it pollutes stats
matomoTracker.isOptedOut = YES;
#endif
}
else
{
MXLogDebug(@"[AppDelegate] The user decided to not send analytics");
matomoTracker.isOptedOut = YES;
[MXLogger logCrashes:NO];
}
}
- (void)stop
{
matomoTracker.isOptedOut = YES;
[MXLogger logCrashes:NO];
}
- (void)trackScreen:(NSString *)screenName
{
// Use the same pattern as Android
NSString *appName = [[NSBundle mainBundle] infoDictionary][@"CFBundleDisplayName"];
NSString *appVersion = [AppDelegate theDelegate].appVersion;
[matomoTracker trackWithView:@[@"ios", appName, appVersion, screenName]
url:nil];
}
- (void)dispatch
{
[matomoTracker dispatch];
}
#pragma mark - MXAnalyticsDelegate
- (void)trackDuration:(NSTimeInterval)seconds category:(NSString*)category name:(NSString*)name
{
// Report time in ms to make figures look better in Matomo
NSNumber *value = @(seconds * 1000);
[matomoTracker trackWithEventWithCategory:kAnalyticsPerformanceCategory
action:category
name:name
number:value
url:nil];
}
- (void)trackValue:(NSNumber*)value category:(NSString*)category name:(NSString*)name
{
[matomoTracker trackWithEventWithCategory:kAnalyticsMetricsCategory
action:category
name:name
number:value
url:nil];
}
@end

View file

@ -1,51 +0,0 @@
/*
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import <Foundation/Foundation.h>
/**
Failure reasons as defined in https://docs.google.com/document/d/1es7cTCeJEXXfRCTRgZerAM2Wg5ZerHjvlpfTW-gsOfI.
*/
struct DecryptionFailureReasonStruct
{
__unsafe_unretained NSString * const unspecified;
__unsafe_unretained NSString * const olmKeysNotSent;
__unsafe_unretained NSString * const olmIndexError;
__unsafe_unretained NSString * const unexpected;
};
extern const struct DecryptionFailureReasonStruct DecryptionFailureReason;
/**
`DecryptionFailure` represents a decryption failure.
*/
@interface DecryptionFailure : NSObject
/**
The id of the event that was unabled to decrypt.
*/
@property (nonatomic) NSString *failedEventId;
/**
The time the failure has been reported.
*/
@property (nonatomic, readonly) NSTimeInterval ts;
/**
Decryption failure reason.
*/
@property (nonatomic) NSString *reason;
@end

View file

@ -1,38 +0,0 @@
/*
Copyright 2018 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 "DecryptionFailure.h"
const struct DecryptionFailureReasonStruct DecryptionFailureReason = {
.unspecified = @"unspecified_error",
.olmKeysNotSent = @"olm_keys_not_sent_error",
.olmIndexError = @"olm_index_error",
.unexpected = @"unexpected_error"
};
@implementation DecryptionFailure
- (instancetype)init
{
self = [super init];
if (self)
{
_ts = [NSDate date].timeIntervalSince1970;
}
return self;
}
@end

View file

@ -19,17 +19,14 @@ import Foundation
/// Used to handle the application information /// Used to handle the application information
@objcMembers @objcMembers
final class AppInfo: NSObject { final class AppInfo: NSObject {
// MARK: - Constants // MARK: - Constants
/// Current application information /// Current application information
static var current: AppInfo { static var current: AppInfo {
let appDisplayName = BuildSettings.bundleDisplayName return AppInfo(displayName: self.bundleDisplayName,
let buildInfo: BuildInfo = BuildInfo()
return AppInfo(displayName: appDisplayName,
appVersion: AppVersion.current, appVersion: AppVersion.current,
buildInfo: buildInfo) buildInfo: BuildInfo())
} }
// MARK: - Properties // MARK: - Properties
@ -52,4 +49,11 @@ final class AppInfo: NSObject {
self.appVersion = appVersion self.appVersion = appVersion
self.buildInfo = buildInfo self.buildInfo = buildInfo
} }
private static var bundleDisplayName: String {
guard let bundleDisplayName = Bundle.app.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String else {
fatalError("CFBundleDisplayName should be defined")
}
return bundleDisplayName
}
} }

View file

@ -23,7 +23,8 @@ final class RiotSettings: NSObject {
// MARK: - Constants // MARK: - Constants
public enum UserDefaultsKeys { public enum UserDefaultsKeys {
static let enableCrashReport = "enableCrashReport" static let enableAnalytics = "enableAnalytics"
static let matomoAnalytics = "enableCrashReport"
static let notificationsShowDecryptedContent = "showDecryptedContent" static let notificationsShowDecryptedContent = "showDecryptedContent"
static let allowStunServerFallback = "allowStunServerFallback" static let allowStunServerFallback = "allowStunServerFallback"
static let pinRoomsWithMissedNotificationsOnHome = "pinRoomsWithMissedNotif" static let pinRoomsWithMissedNotificationsOnHome = "pinRoomsWithMissedNotif"
@ -100,13 +101,31 @@ final class RiotSettings: NSObject {
// MARK: Other // MARK: Other
/// Indicate if `enableCrashReport` settings has been set once. /// Whether the user was previously shown the Matomo analytics prompt.
var isEnableCrashReportHasBeenSetOnce: Bool { var hasSeenAnalyticsPrompt: Bool {
return RiotSettings.defaults.object(forKey: UserDefaultsKeys.enableCrashReport) != nil RiotSettings.defaults.object(forKey: UserDefaultsKeys.enableAnalytics) != nil
} }
@UserDefault(key: UserDefaultsKeys.enableCrashReport, defaultValue: false, storage: defaults) /// Whether the user has both seen the Matomo analytics prompt and declined it.
var enableCrashReport var hasDeclinedMatomoAnalytics: Bool {
RiotSettings.defaults.object(forKey: UserDefaultsKeys.matomoAnalytics) != nil && !RiotSettings.defaults.bool(forKey: UserDefaultsKeys.matomoAnalytics)
}
/// Whether the user previously accepted the Matomo analytics prompt.
/// This allows these users to be shown a different prompt to explain the changes.
var hasAcceptedMatomoAnalytics: Bool {
RiotSettings.defaults.bool(forKey: UserDefaultsKeys.matomoAnalytics)
}
/// `true` when the user has opted in to send analytics.
@UserDefault(key: UserDefaultsKeys.enableAnalytics, defaultValue: false, storage: defaults)
var enableAnalytics
/// Indicates if the device has already called identify for this session to PostHog.
/// This is separate to `enableAnalytics` as logging out will leave analytics
/// enabled but reset identification.
@UserDefault(key: "isIdentifiedForAnalytics", defaultValue: false, storage: defaults)
var isIdentifiedForAnalytics
@UserDefault(key: "enableRageShake", defaultValue: false, storage: defaults) @UserDefault(key: "enableRageShake", defaultValue: false, storage: defaults)
var enableRageShake var enableRageShake
@ -168,6 +187,9 @@ final class RiotSettings: NSObject {
@UserDefault(key: "roomScreenAllowPollsAction", defaultValue: false, storage: defaults) @UserDefault(key: "roomScreenAllowPollsAction", defaultValue: false, storage: defaults)
var roomScreenAllowPollsAction var roomScreenAllowPollsAction
@UserDefault(key: "roomScreenAllowLocationAction", defaultValue: false, storage: defaults)
var roomScreenAllowLocationAction
@UserDefault(key: "roomScreenShowsURLPreviews", defaultValue: true, storage: defaults) @UserDefault(key: "roomScreenShowsURLPreviews", defaultValue: true, storage: defaults)
var roomScreenShowsURLPreviews var roomScreenShowsURLPreviews

View file

@ -0,0 +1,259 @@
//
// 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 PostHog
import AnalyticsEvents
/// A class responsible for managing an analytics client
/// and sending events through this client.
@objcMembers class Analytics: NSObject {
// MARK: - Properties
/// The singleton instance to be used within the Riot target.
static let shared = Analytics()
/// The analytics client to send events with.
private var client: AnalyticsClientProtocol = PostHogAnalyticsClient()
/// The service used to interact with account data settings.
private var service: AnalyticsService?
/// Whether or not the object is enabled and sending events to the server.
var isRunning: Bool { client.isRunning }
/// Whether to show the user the analytics opt in prompt.
var shouldShowAnalyticsPrompt: Bool {
// Only show the prompt once, and when analytics are configured in BuildSettings.
!RiotSettings.shared.hasSeenAnalyticsPrompt && PHGPostHogConfiguration.standard != nil
}
/// Indicates whether the user previously accepted Matomo analytics and should be shown the upgrade prompt.
var promptShouldDisplayUpgradeMessage: Bool {
RiotSettings.shared.hasAcceptedMatomoAnalytics
}
// MARK: - Public
/// Opts in to analytics tracking with the supplied session.
/// - Parameter session: An optional session to use to when reading/generating the analytics ID.
/// The session will be ignored if not running.
func optIn(with session: MXSession?) {
RiotSettings.shared.enableAnalytics = true
startIfEnabled()
guard let session = session else { return }
useAnalyticsSettings(from: session)
}
/// Stops analytics tracking and calls `reset` to clear any IDs and event queues.
func optOut() {
RiotSettings.shared.enableAnalytics = false
// The order is important here. PostHog ignores the reset if stopped.
reset()
client.stop()
MXLog.debug("[Analytics] Stopped.")
}
/// Starts the analytics client if the user has opted in, otherwise does nothing.
func startIfEnabled() {
guard RiotSettings.shared.enableAnalytics, !isRunning else { return }
client.start()
// Sanity check in case something went wrong.
guard client.isRunning else { return }
MXLog.debug("[Analytics] Started.")
// Catch and log crashes
MXLogger.logCrashes(true)
MXLogger.setBuildVersion(AppDelegate.theDelegate().build)
}
/// Use the analytics settings from the supplied session to configure analytics.
/// For now this is only used for (pseudonymous) identification.
/// - Parameter session: The session to read analytics settings from.
func useAnalyticsSettings(from session: MXSession) {
guard
RiotSettings.shared.enableAnalytics,
!RiotSettings.shared.isIdentifiedForAnalytics
else { return }
let service = AnalyticsService(session: session)
self.service = service
service.settings { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let settings):
self.identify(with: settings)
self.service = nil
case .failure:
MXLog.error("[Analytics] Failed to use analytics settings. Will continue to run without analytics ID.")
self.service = nil
}
}
}
/// Resets the any IDs and event queues in the analytics client. This method should
/// be called on sign-out to maintain opt-in status, whilst ensuring the next
/// account used isn't associated with the previous one.
/// Note: **MUST** be called before stopping PostHog or the reset is ignored.
func reset() {
client.reset()
MXLog.debug("[Analytics] Reset.")
RiotSettings.shared.isIdentifiedForAnalytics = false
// Stop collecting crash logs
MXLogger.logCrashes(false)
}
/// Flushes the event queue in the analytics client, uploading all pending events.
/// Normally events are sent in batches. Call this method when you need an event
/// to be sent immediately.
func forceUpload() {
client.flush()
}
// MARK: - Private
/// Identify (pseudonymously) any future events with the ID from the analytics account data settings.
/// - Parameter settings: The settings to use for identification. The ID must be set *before* calling this method.
private func identify(with settings: AnalyticsSettings) {
guard let id = settings.id else {
MXLog.error("[Analytics] identify(with:) called before an ID has been generated.")
return
}
client.identify(id: id)
MXLog.debug("[Analytics] Identified.")
RiotSettings.shared.isIdentifiedForAnalytics = true
}
/// Capture an event in the `client`.
/// - Parameter event: The event to capture.
private func capture(event: AnalyticsEventProtocol) {
client.capture(event)
}
}
// MARK: - Public tracking methods
// The following methods are exposed for compatibility with Objective-C as
// the `capture` method and the generated events cannot be bridged from Swift.
extension Analytics {
/// Track the presentation of a screen
/// - Parameters:
/// - screen: The screen that was shown.
/// - milliseconds: An optional value representing how long the screen was shown for in milliseconds.
func trackScreen(_ screen: AnalyticsScreen, duration milliseconds: Int?) {
let event = AnalyticsEvent.Screen(durationMs: milliseconds, screenName: screen.screenName)
client.screen(event)
}
/// The the presentation of a screen without including a duration
/// - Parameter screen: The screen that was shown
func trackScreen(_ screen: AnalyticsScreen) {
trackScreen(screen, duration: nil)
}
/// Track an element that has been tapped
/// - Parameters:
/// - tap: The element that was tapped
/// - index: The index of the element, if it's in a list of elements
func trackTap(_ tap: AnalyticsUIElement, index: Int?) {
let event = AnalyticsEvent.Click(index: index, name: tap.elementName)
client.capture(event)
}
/// Track an element that has been tapped without including an index
/// - Parameters:
/// - tap: The element that was tapped
func trackTap(_ tap: AnalyticsUIElement) {
trackTap(tap, index: nil)
}
/// Track an E2EE error that occurred
/// - Parameters:
/// - reason: The error that occurred.
/// - count: The number of times that error occurred.
func trackE2EEError(_ reason: DecryptionFailureReason, count: Int) {
for _ in 0..<count {
let event = AnalyticsEvent.Error(context: nil, domain: .E2EE, name: reason.errorName)
capture(event: event)
}
}
/// Track whether the user accepted or declined the terms to an identity server.
/// **Note** This method isn't currently implemented.
/// - Parameter accepted: Whether the terms were accepted.
func trackIdentityServerAccepted(_ accepted: Bool) {
// Do we still want to track this?
}
}
// MARK: - MXAnalyticsDelegate
extension Analytics: MXAnalyticsDelegate {
func trackDuration(_ milliseconds: Int, name: MXTaskProfileName, units: UInt) {
guard let analyticsName = name.analyticsName else {
MXLog.warning("[Analytics] Attempt to capture unknown profile task: \(name.rawValue)")
return
}
let event = AnalyticsEvent.PerformanceTimer(context: nil, itemCount: Int(units), name: analyticsName, timeMs: milliseconds)
capture(event: event)
}
func trackCallStarted(withVideo isVideo: Bool, numberOfParticipants: Int, incoming isIncoming: Bool) {
let event = AnalyticsEvent.CallStarted(isVideo: isVideo, numParticipants: numberOfParticipants, placed: !isIncoming)
capture(event: event)
}
func trackCallEnded(withDuration duration: Int, video isVideo: Bool, numberOfParticipants: Int, incoming isIncoming: Bool) {
let event = AnalyticsEvent.CallEnded(durationMs: duration, isVideo: isVideo, numParticipants: numberOfParticipants, placed: !isIncoming)
capture(event: event)
}
func trackCallError(with reason: __MXCallHangupReason, video isVideo: Bool, numberOfParticipants: Int, incoming isIncoming: Bool) {
let callEvent = AnalyticsEvent.CallError(isVideo: isVideo, numParticipants: numberOfParticipants, placed: !isIncoming)
let event = AnalyticsEvent.Error(context: nil, domain: .VOIP, name: reason.errorName)
capture(event: callEvent)
capture(event: event)
}
func trackCreatedRoom(asDM isDM: Bool) {
let event = AnalyticsEvent.CreatedRoom(isDM: isDM)
capture(event: event)
}
func trackJoinedRoom(asDM isDM: Bool, memberCount: UInt) {
guard let roomSize = AnalyticsEvent.JoinedRoom.RoomSize(memberCount: memberCount) else {
MXLog.warning("[Analytics] Attempt to capture joined room with invalid member count: \(memberCount)")
return
}
let event = AnalyticsEvent.JoinedRoom(isDM: isDM, roomSize: roomSize)
capture(event: event)
}
/// **Note** This method isn't currently implemented.
func trackContactsAccessGranted(_ granted: Bool) {
// Do we still want to track this?
}
}

View file

@ -0,0 +1,48 @@
//
// 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 AnalyticsEvents
/// A protocol representing an analytics client.
protocol AnalyticsClientProtocol {
/// Whether the analytics client is currently reporting data or ignoring it.
var isRunning: Bool { get }
/// Starts the analytics client reporting data.
func start()
/// Associate the client with an ID. This is persisted until `reset` is called.
/// - Parameter id: The ID to associate with the user.
func identify(id: String)
/// Reset all stored properties and any event queues on the client. Note that
/// the client will remain active, but in a fresh unidentified state.
func reset()
/// Stop the analytics client reporting data.
func stop()
/// Send any queued events immediately.
func flush()
/// Capture the supplied analytics event.
/// - Parameter event: The event to capture.
func capture(_ event: AnalyticsEventProtocol)
/// Capture the supplied analytics screen event.
/// - Parameter event: The screen event to capture.
func screen(_ event: AnalyticsScreenProtocol)
}

View file

@ -0,0 +1,114 @@
//
// Copyright 2021 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Foundation
import AnalyticsEvents
@objc enum AnalyticsScreen: Int {
case sidebar
case home
case favourites
case people
case rooms
case searchRooms
case searchMessages
case searchPeople
case searchFiles
case room
case roomDetails
case roomMembers
case user
case roomSearch
case roomUploads
case roomSettings
case roomNotifications
case roomDirectory
case switchDirectory
case startChat
case createRoom
case settings
case settingsSecurity
case settingsDefaultNotifications
case settingsMentionsAndKeywords
case deactivateAccount
case group
case myGroups
case inviteFriends
/// The screen name reported to the AnalyticsEvent.
var screenName: AnalyticsEvent.Screen.ScreenName {
switch self {
case .sidebar:
return .MobileSidebar
case .home:
return .Home
case .favourites:
return .MobileFavourites
case .people:
return .MobilePeople
case .rooms:
return .MobileRooms
case .searchRooms:
return .MobileSearchRooms
case .searchMessages:
return .MobileSearchMessages
case .searchPeople:
return .MobileSearchPeople
case .searchFiles:
return .MobileSearchFiles
case .room:
return .Room
case .roomDetails:
return .RoomDetails
case .roomMembers:
return .RoomMembers
case .user:
return .User
case .roomSearch:
return .RoomSearch
case .roomUploads:
return .RoomUploads
case .roomSettings:
return .RoomSettings
case .roomNotifications:
return .RoomNotifications
case .roomDirectory:
return .RoomDirectory
case .switchDirectory:
return .MobileSwitchDirectory
case .startChat:
return .StartChat
case .createRoom:
return .CreateRoom
case .settings:
return .Settings
case .settingsSecurity:
return .SettingsSecurity
case .settingsDefaultNotifications:
return .SettingsDefaultNotifications
case .settingsMentionsAndKeywords:
return .SettingsMentionsAndKeywords
case .deactivateAccount:
return .DeactivateAccount
case .group:
return .Group
case .myGroups:
return .MyGroups
case .inviteFriends:
return .MobileInviteFriends
}
}
}

View file

@ -0,0 +1,82 @@
//
// 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
/// An object to record how long a screen has been presented for and
/// report the screen's display to the `Analytics` object.
@objcMembers class AnalyticsScreenTimer: NSObject {
// MARK: - Properties
/// The screen being tracked.
private let screen: AnalyticsScreen
/// The date that the screen was presented to the user.
private var startDate: Date?
/// Whether the app was backgrounded whilst the screen was being presented.
private var didPause = false
/// The duration in milliseconds that the screen has been shown for. The value will
/// be reported as `nil` if the timer isn't running, or if the app was backgrounded
/// during the screen's display.
private var duration: Int? {
guard let startDate = startDate else {
MXLog.warning("[AnalyticsScreenTimer] Duration requested on a stopped timer!")
return nil
}
// Consider the duration invalid if the app has been backgrounded
guard !didPause else { return nil }
let timeInterval = Date().timeIntervalSince(startDate)
return Int(timeInterval * 1000)
}
// MARK: - Setup
/// Create a new screen timer for the specified screen.
/// - Parameter screen: The screen that should be timed.
init(screen: AnalyticsScreen) {
self.screen = screen
super.init()
NotificationCenter.default.addObserver(self, selector: #selector(pause), name: UIApplication.willResignActiveNotification, object: nil)
}
// MARK: - Public
/// Start the timer.
func start() {
startDate = Date()
}
/// Stop the timer and report the screen to `Analytics`.
func stop() {
guard let duration = duration else { return }
Analytics.shared.trackScreen(screen, duration: duration)
self.startDate = nil
}
// MARK: - Private
/// Record that the timer has been interrupted by the app moving to the background.
@objc private func pause() {
didPause = true
}
}

View file

@ -0,0 +1,77 @@
//
// Copyright 2021 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Foundation
enum AnalyticsServiceError: Error {
/// The session supplied to the service does not have a state of `MXSessionStateRunning`.
case sessionIsNotRunning
/// An error occurred but the session did not report what it was.
case unknown
}
/// A service responsible for handling the `im.vector.analytics` event from the user's account data.
class AnalyticsService {
let session: MXSession
/// Creates an analytics service with the supplied session.
/// - Parameter session: The session to use when reading analytics settings from account data.
init(session: MXSession) {
self.session = session
}
/// The analytics settings for the current user. Calling this method will check whether the settings already
/// contain an `id` property and if not, will add one to the account data before calling the completion.
/// - Parameter completion: A completion handler that will be called when the request completes.
///
/// The request will fail if the service's session does not have the `MXSessionStateRunning` state.
func settings(completion: @escaping (Result<AnalyticsSettings, Error>) -> Void) {
// Only use the session if it is running otherwise we could wipe out an existing analytics ID.
guard session.state == .running else {
MXLog.warning("[AnalyticsService] Aborting attempt to read analytics settings. The session may not be up-to-date.")
completion(.failure(AnalyticsServiceError.sessionIsNotRunning))
return
}
let settings = AnalyticsSettings(accountData: session.accountData)
// The id has already be set so we are done here.
if settings.id != nil {
completion(.success(settings))
return
}
// Create a new ID and modify the event dictionary.
let id = UUID().uuidString
var eventDictionary = settings.dictionary
eventDictionary[AnalyticsSettings.Constants.idKey] = id
session.setAccountData(eventDictionary, forType: AnalyticsSettings.eventType) { [weak self] in
guard let self = self else {
completion(.failure(AnalyticsServiceError.unknown))
return
}
MXLog.debug("[AnalyticsService] Successfully updated analytics settings in account data.")
let settings = AnalyticsSettings(accountData: self.session.accountData)
completion(.success(settings))
} failure: { error in
MXLog.warning("[AnalyticsService] Failed to update analytics settings.")
completion(.failure(error ?? AnalyticsServiceError.unknown))
}
}
}

View file

@ -0,0 +1,65 @@
//
// Copyright 2021 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Foundation
/// An analytics settings event from the user's account data.
struct AnalyticsSettings {
static let eventType = "im.vector.analytics"
enum Constants {
static let idKey = "id"
static let webOptInKey = "pseudonymousAnalyticsOptIn"
}
/// A randomly generated analytics token for this user.
/// This is suggested to be a UUID string.
let id: String?
/// Whether the user has opted in on web or not. This is unused on iOS but necessary
/// to store here so that it's value is preserved when updating the account data if we
/// generated an ID on iOS.
///
/// `true` if opted in on web, `false` if opted out on web and `nil` if the web prompt is not yet seen.
private let webOptIn: Bool?
}
extension AnalyticsSettings {
// Private as AnalyticsSettings should only be created from an MXSession
private init(dictionary: Dictionary<AnyHashable, Any>?) {
self.id = dictionary?[Constants.idKey] as? String
self.webOptIn = dictionary?[Constants.webOptInKey] as? Bool
}
/// A dictionary representation of the settings.
var dictionary: Dictionary<AnyHashable, Any> {
var dictionary = [AnyHashable: Any]()
dictionary[Constants.idKey] = id
dictionary[Constants.webOptInKey] = webOptIn
return dictionary
}
}
// MARK: - Public initializer
extension AnalyticsSettings {
/// Create the analytics settings from account data.
/// - Parameter accountData: The account data to read the event from.
init(accountData: MXAccountData) {
self.init(dictionary: accountData.accountData(forEventType: AnalyticsSettings.eventType))
}
}

View file

@ -0,0 +1,32 @@
//
// 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 AnalyticsEvents
/// A tappable UI element that can be track in Analytics.
@objc enum AnalyticsUIElement: Int {
case sendMessageButton
/// The element name reported to the AnalyticsEvent.
var elementName: AnalyticsEvent.Click.Name {
switch self {
// Note: This is a test element that doesn't need to be captured.
// It will likely be removed when the AnalyticsEvent.Click is updated.
case .sendMessageButton:
return .SendMessageButton
}
}
}

View file

@ -0,0 +1,53 @@
//
// 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 AnalyticsEvents
/// Failure reasons as defined in https://docs.google.com/document/d/1es7cTCeJEXXfRCTRgZerAM2Wg5ZerHjvlpfTW-gsOfI.
@objc enum DecryptionFailureReason: Int {
case unspecified
case olmKeysNotSent
case olmIndexError
case unexpected
var errorName: AnalyticsEvent.Error.Name {
switch self {
case .unspecified:
return .OlmUnspecifiedError
case .olmKeysNotSent:
return .OlmKeysNotSentError
case .olmIndexError:
return .OlmIndexError
case .unexpected:
return .UnknownError
}
}
}
/// `DecryptionFailure` represents a decryption failure.
@objcMembers class DecryptionFailure: NSObject {
/// The id of the event that was unabled to decrypt.
let failedEventId: String
/// The time the failure has been reported.
let ts: TimeInterval = Date().timeIntervalSince1970
/// Decryption failure reason.
let reason: DecryptionFailureReason
init(failedEventId: String, reason: DecryptionFailureReason) {
self.failedEventId = failedEventId
self.reason = reason
}
}

View file

@ -16,8 +16,9 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import "DecryptionFailure.h" @class DecryptionFailureTracker;
@class Analytics;
@import MatrixSDK; @import MatrixSDK;
@interface DecryptionFailureTracker : NSObject @interface DecryptionFailureTracker : NSObject
@ -32,7 +33,7 @@
/** /**
The delegate object to receive analytics events. The delegate object to receive analytics events.
*/ */
@property (nonatomic, weak) id<MXAnalyticsDelegate> delegate; @property (nonatomic, weak) Analytics *delegate;
/** /**
Report an event unable to decrypt. Report an event unable to decrypt.

View file

@ -15,6 +15,7 @@
*/ */
#import "DecryptionFailureTracker.h" #import "DecryptionFailureTracker.h"
#import "GeneratedInterface-Swift.h"
// Call `checkFailures` every `CHECK_INTERVAL` // Call `checkFailures` every `CHECK_INTERVAL`
@ -90,31 +91,32 @@ NSString *const kDecryptionFailureTrackerAnalyticsCategory = @"e2e.failure";
return; return;
} }
DecryptionFailure *decryptionFailure = [[DecryptionFailure alloc] init]; NSString *failedEventId = event.eventId;
decryptionFailure.failedEventId = event.eventId; DecryptionFailureReason reason;
// Categorise the error // Categorise the error
switch (event.decryptionError.code) switch (event.decryptionError.code)
{ {
case MXDecryptingErrorUnknownInboundSessionIdCode: case MXDecryptingErrorUnknownInboundSessionIdCode:
decryptionFailure.reason = DecryptionFailureReason.olmKeysNotSent; reason = DecryptionFailureReasonOlmKeysNotSent;
break; break;
case MXDecryptingErrorOlmCode: case MXDecryptingErrorOlmCode:
decryptionFailure.reason = DecryptionFailureReason.olmIndexError; reason = DecryptionFailureReasonOlmIndexError;
break; break;
case MXDecryptingErrorEncryptionNotEnabledCode: case MXDecryptingErrorEncryptionNotEnabledCode:
case MXDecryptingErrorUnableToDecryptCode: case MXDecryptingErrorUnableToDecryptCode:
decryptionFailure.reason = DecryptionFailureReason.unexpected; reason = DecryptionFailureReasonUnexpected;
break; break;
default: default:
decryptionFailure.reason = DecryptionFailureReason.unspecified; reason = DecryptionFailureReasonUnspecified;
break; break;
} }
reportedFailures[event.eventId] = decryptionFailure; reportedFailures[event.eventId] = [[DecryptionFailure alloc] initWithFailedEventId:failedEventId
reason:reason];
} }
- (void)dispatch - (void)dispatch
@ -152,17 +154,17 @@ NSString *const kDecryptionFailureTrackerAnalyticsCategory = @"e2e.failure";
if (failuresToTrack.count) if (failuresToTrack.count)
{ {
// Sort failures by error reason // Sort failures by error reason
NSMutableDictionary<NSString*, NSNumber*> *failuresCounts = [NSMutableDictionary dictionary]; NSMutableDictionary<NSNumber*, NSNumber*> *failuresCounts = [NSMutableDictionary dictionary];
for (DecryptionFailure *failure in failuresToTrack) for (DecryptionFailure *failure in failuresToTrack)
{ {
failuresCounts[failure.reason] = @(failuresCounts[failure.reason].unsignedIntegerValue + 1); failuresCounts[@(failure.reason)] = @(failuresCounts[@(failure.reason)].unsignedIntegerValue + 1);
} }
MXLogDebug(@"[DecryptionFailureTracker] trackFailures: %@", failuresCounts); MXLogDebug(@"[DecryptionFailureTracker] trackFailures: %@", failuresCounts);
for (NSString *reason in failuresCounts) for (NSNumber *reason in failuresCounts)
{ {
[_delegate trackValue:failuresCounts[reason] category:kDecryptionFailureTrackerAnalyticsCategory name:reason]; [self.delegate trackE2EEError:reason.integerValue count:failuresCounts[reason].integerValue];
} }
} }
} }

View file

@ -1,5 +1,5 @@
// //
// Copyright 2020 The Matrix.org Foundation C.I.C // Copyright 2021 New Vector Ltd
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
@ -14,20 +14,23 @@
// limitations under the License. // limitations under the License.
// //
#import <Foundation/Foundation.h> import AnalyticsEvents
extension AnalyticsEvent.JoinedRoom.RoomSize {
typedef NSString *const MXKAnalyticsCategory NS_TYPED_EXTENSIBLE_ENUM; init?(memberCount: UInt) {
switch memberCount {
/** case 2:
The analytics category for local contacts. self = .Two
*/ case 3...10:
static MXKAnalyticsCategory const MXKAnalyticsCategoryContacts = @"localContacts"; self = .ThreeToTen
case 11...100:
self = .ElevenToOneHundred
typedef NSString *const MXKAnalyticsName NS_TYPED_EXTENSIBLE_ENUM; case 101...1000:
self = .OneHundredAndOneToAThousand
/** case 1001...:
The analytics value for accept/decline of local contacts access. self = .MoreThanAThousand
*/ default:
static MXKAnalyticsName const MXKAnalyticsNameContactsAccessGranted = @"accessGranted"; return nil
}
}
}

View file

@ -0,0 +1,38 @@
//
// 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 AnalyticsEvents
extension __MXCallHangupReason {
var errorName: AnalyticsEvent.Error.Name {
switch self {
case .userHangup:
return .VoipUserHangup
case .inviteTimeout:
return .VoipInviteTimeout
case .iceFailed:
return .VoipIceFailed
case .iceTimeout:
return .VoipIceTimeout
case .userMediaFailed:
return .VoipUserMediaFailed
case .unknownError:
return .UnknownError
default:
return .UnknownError
}
}
}

View file

@ -0,0 +1,42 @@
//
// 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 AnalyticsEvents
extension MXTaskProfileName {
var analyticsName: AnalyticsEvent.PerformanceTimer.Name? {
switch self {
case .startupIncrementalSync:
return .StartupIncrementalSync
case .startupInitialSync:
return .StartupInitialSync
case .startupLaunchScreen:
return .StartupLaunchScreen
case .startupStorePreload:
return .StartupStorePreload
case .startupMountData:
return .StartupStoreReady
case .initialSyncRequest:
return .InitialSyncRequest
case .initialSyncParsing:
return .InitialSyncParsing
case .notificationsOpenEvent:
return .NotificationsOpenEvent
default:
return nil
}
}
}

View file

@ -0,0 +1,28 @@
//
// 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 PostHog
extension PHGPostHogConfiguration {
static var standard: PHGPostHogConfiguration? {
guard let apiKey = BuildSettings.analyticsKey, let host = BuildSettings.analyticsHost else { return nil }
let configuration = PHGPostHogConfiguration(apiKey: apiKey, host: host)
configuration.shouldSendDeviceID = false
return configuration
}
}

View file

@ -0,0 +1,65 @@
//
// 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 PostHog
import AnalyticsEvents
/// An analytics client that reports events to a PostHog server.
class PostHogAnalyticsClient: AnalyticsClientProtocol {
/// The PHGPostHog object used to report events.
private var postHog: PHGPostHog?
var isRunning: Bool { postHog?.enabled ?? false }
func start() {
// Only start if analytics have been configured in BuildSettings
guard let configuration = PHGPostHogConfiguration.standard else { return }
if postHog == nil {
postHog = PHGPostHog(configuration: configuration)
}
postHog?.enable()
}
func identify(id: String) {
postHog?.identify(id)
}
func reset() {
postHog?.reset()
}
func stop() {
postHog?.disable()
// As of PostHog 1.4.4, setting the client to nil here doesn't release
// it. Keep it around to avoid having multiple instances if the user re-enables
}
func flush() {
postHog?.flush()
}
func capture(_ event: AnalyticsEventProtocol) {
postHog?.capture(event.eventName, properties: event.properties)
}
func screen(_ event: AnalyticsScreenProtocol) {
postHog?.screen(event.screenName.rawValue, properties: event.properties)
}
}

View file

@ -22,7 +22,6 @@
#import "JitsiViewController.h" #import "JitsiViewController.h"
#import "RageShakeManager.h" #import "RageShakeManager.h"
#import "Analytics.h"
#import "ThemeService.h" #import "ThemeService.h"
#import "UniversalLink.h" #import "UniversalLink.h"

View file

@ -433,16 +433,16 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
_isAppForeground = NO; _isAppForeground = NO;
_handleSelfVerificationRequest = YES; _handleSelfVerificationRequest = YES;
// Configure our analytics. It will indeed start if the option is enabled // Configure our analytics. It will start if the option is enabled
Analytics *analytics = [Analytics sharedInstance]; Analytics *analytics = Analytics.shared;
[MXSDKOptions sharedInstance].analyticsDelegate = analytics; [MXSDKOptions sharedInstance].analyticsDelegate = analytics;
[DecryptionFailureTracker sharedInstance].delegate = [Analytics sharedInstance]; [DecryptionFailureTracker sharedInstance].delegate = analytics;
MXBaseProfiler *profiler = [MXBaseProfiler new]; MXBaseProfiler *profiler = [MXBaseProfiler new];
profiler.analytics = analytics; profiler.analytics = analytics;
[MXSDKOptions sharedInstance].profiler = profiler; [MXSDKOptions sharedInstance].profiler = profiler;
[analytics start]; [analytics startIfEnabled];
self.localAuthenticationService = [[LocalAuthenticationService alloc] initWithPinCodePreferences:[PinCodePreferences shared]]; self.localAuthenticationService = [[LocalAuthenticationService alloc] initWithPinCodePreferences:[PinCodePreferences shared]];
@ -587,7 +587,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
// Analytics: Force to send the pending actions // Analytics: Force to send the pending actions
[[DecryptionFailureTracker sharedInstance] dispatch]; [[DecryptionFailureTracker sharedInstance] dispatch];
[[Analytics sharedInstance] dispatch]; [Analytics.shared forceUpload];
} }
- (void)applicationWillEnterForeground:(UIApplication *)application - (void)applicationWillEnterForeground:(UIApplication *)application
@ -648,9 +648,13 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
MXLogDebug(@"[AppDelegate] afterAppUnlockedByPin"); MXLogDebug(@"[AppDelegate] afterAppUnlockedByPin");
// Check if there is crash log to send // Check if there is crash log to send
if (RiotSettings.shared.enableCrashReport) if (RiotSettings.shared.enableAnalytics)
{ {
#if DEBUG
// Don't show alerts for crashes during development.
#else
[self checkExceptionToReport]; [self checkExceptionToReport];
#endif
} }
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
@ -1880,6 +1884,11 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
[self.pushNotificationService checkPushKitPushersInSession:mxSession]; [self.pushNotificationService checkPushKitPushersInSession:mxSession];
} }
else if (mxSession.state == MXSessionStateRunning)
{
// Configure analytics from the session if necessary
[Analytics.shared useAnalyticsSettingsFrom:mxSession];
}
else if (mxSession.state == MXSessionStateClosed) else if (mxSession.state == MXSessionStateClosed)
{ {
[self removeMatrixSession:mxSession]; [self removeMatrixSession:mxSession];
@ -2225,6 +2234,9 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
// Reset push notification store // Reset push notification store
[self.pushNotificationStore reset]; [self.pushNotificationStore reset];
// Reset analytics
[Analytics.shared reset];
#ifdef MX_CALL_STACK_ENDPOINT #ifdef MX_CALL_STACK_ENDPOINT
// Erase all created certificates and private keys by MXEndpointCallStack // Erase all created certificates and private keys by MXEndpointCallStack
for (MXKAccount *account in MXKAccountManager.sharedManager.accounts) for (MXKAccount *account in MXKAccountManager.sharedManager.accounts)
@ -2390,8 +2402,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
launchAnimationContainerView = launchLoadingView; launchAnimationContainerView = launchLoadingView;
[MXSDKOptions.sharedInstance.profiler startMeasuringTaskWithName:kMXAnalyticsStartupLaunchScreen [MXSDKOptions.sharedInstance.profiler startMeasuringTaskWithName:MXTaskProfileNameStartupLaunchScreen];
category:kMXAnalyticsStartupCategory];
} }
} }
@ -2400,7 +2411,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
if (launchAnimationContainerView) if (launchAnimationContainerView)
{ {
id<MXProfiler> profiler = MXSDKOptions.sharedInstance.profiler; id<MXProfiler> profiler = MXSDKOptions.sharedInstance.profiler;
MXTaskProfile *launchTaskProfile = [profiler taskProfileWithName:kMXAnalyticsStartupLaunchScreen category:kMXAnalyticsStartupCategory]; MXTaskProfile *launchTaskProfile = [profiler taskProfileWithName:MXTaskProfileNameStartupLaunchScreen];
if (launchTaskProfile) if (launchTaskProfile)
{ {
[profiler stopMeasuringTaskWithProfile:launchTaskProfile]; [profiler stopMeasuringTaskWithProfile:launchTaskProfile];

View file

@ -309,9 +309,6 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0;
- (void)viewWillAppear:(BOOL)animated - (void)viewWillAppear:(BOOL)animated
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
// Screen tracking
[[Analytics sharedInstance] trackScreen:@"Authentication"];
[_keyboardAvoider startAvoiding]; [_keyboardAvoider startAvoiding];
} }
@ -330,7 +327,7 @@ static const CGFloat kAuthInputContainerViewMinHeightConstraintConstant = 150.0;
return; return;
} }
// Verify that the app does not show the authentification screean whereas // Verify that the app does not show the authentication screen whereas
// the user has already logged in. // the user has already logged in.
// This bug rarely happens (https://github.com/vector-im/riot-ios/issues/1643) // This bug rarely happens (https://github.com/vector-im/riot-ios/issues/1643)
// but it invites the user to log in again. They will then lose all their // but it invites the user to log in again. They will then lose all their

View file

@ -18,6 +18,7 @@
#import "MatrixKit.h" #import "MatrixKit.h"
@class RootTabEmptyView; @class RootTabEmptyView;
@class AnalyticsScreenTimer;
/** /**
Notification to be posted when recents data is ready. Notification object will be the RecentsViewController instance. Notification to be posted when recents data is ready. Notification object will be the RecentsViewController instance.
@ -85,16 +86,16 @@ FOUNDATION_EXPORT NSString *const RecentsViewControllerDataReadyNotification;
*/ */
@property (nonatomic) CGFloat stickyHeaderHeight; @property (nonatomic) CGFloat stickyHeaderHeight;
/**
The analytics instance screen name (Default is "RecentsScreen").
*/
@property (nonatomic) NSString *screenName;
/** /**
Empty view to display when there is no item to show on the screen. Empty view to display when there is no item to show on the screen.
*/ */
@property (nonatomic, weak) RootTabEmptyView *emptyView; @property (nonatomic, weak) RootTabEmptyView *emptyView;
/**
The screen timer used for analytics if they've been enabled. The default value is nil.
*/
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
/** /**
Return the sticky header for the specified section of the table view Return the sticky header for the specified section of the table view

View file

@ -106,9 +106,6 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro
self.enableBarTintColorStatusChange = NO; self.enableBarTintColorStatusChange = NO;
self.rageShakeManager = [RageShakeManager sharedManager]; self.rageShakeManager = [RageShakeManager sharedManager];
// Set default screen name
_screenName = @"RecentsScreen";
// Enable the search bar in the recents table, and remove the search option from the navigation bar. // Enable the search bar in the recents table, and remove the search option from the navigation bar.
_enableSearchBar = YES; _enableSearchBar = YES;
self.enableBarButtonSearch = NO; self.enableBarButtonSearch = NO;
@ -259,9 +256,6 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
// Screen tracking
[[Analytics sharedInstance] trackScreen:_screenName];
// Reset back user interactions // Reset back user interactions
self.userInteractionEnabled = YES; self.userInteractionEnabled = YES;
@ -329,11 +323,14 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro
// the selected room (if any) is highlighted. // the selected room (if any) is highlighted.
[self refreshCurrentSelectedCell:YES]; [self refreshCurrentSelectedCell:YES];
} }
[self.screenTimer start];
} }
- (void)viewDidDisappear:(BOOL)animated - (void)viewDidDisappear:(BOOL)animated
{ {
[super viewDidDisappear:animated]; [super viewDidDisappear:animated];
[self.screenTimer stop];
} }
- (void)viewDidLayoutSubviews - (void)viewDidLayoutSubviews

View file

@ -42,6 +42,8 @@
__weak id kThemeServiceDidChangeThemeNotificationObserver; __weak id kThemeServiceDidChangeThemeNotificationObserver;
} }
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@end @end
@implementation GroupsViewController @implementation GroupsViewController
@ -74,6 +76,8 @@
// Set itself as delegate by default. // Set itself as delegate by default.
self.delegate = self; self.delegate = self;
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenMyGroups];
} }
- (void)viewDidLoad - (void)viewDidLoad
@ -203,9 +207,6 @@
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
// Screen tracking
[[Analytics sharedInstance] trackScreen:@"Groups"];
// Deselect the current selected row, it will be restored on viewDidAppear (if any) // Deselect the current selected row, it will be restored on viewDidAppear (if any)
NSIndexPath *indexPath = [self.groupsTableView indexPathForSelectedRow]; NSIndexPath *indexPath = [self.groupsTableView indexPathForSelectedRow];
if (indexPath) if (indexPath)
@ -258,11 +259,14 @@
// the selected group (if any) is highlighted. // the selected group (if any) is highlighted.
[self refreshCurrentSelectedCell:YES]; [self refreshCurrentSelectedCell:YES];
} }
[self.screenTimer start];
} }
- (void)viewDidDisappear:(BOOL)animated - (void)viewDidDisappear:(BOOL)animated
{ {
[super viewDidDisappear:animated]; [super viewDidDisappear:animated];
[self.screenTimer stop];
} }
#pragma mark - Override MXKGroupListViewController #pragma mark - Override MXKGroupListViewController

View file

@ -48,6 +48,8 @@
@property (nonatomic, readonly) DTHTMLAttributedStringBuilderWillFlushCallback longDescriptionSanitizationCallback; @property (nonatomic, readonly) DTHTMLAttributedStringBuilderWillFlushCallback longDescriptionSanitizationCallback;
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@end @end
@implementation GroupHomeViewController @implementation GroupHomeViewController
@ -95,6 +97,8 @@
MXStrongifyAndReturnIfNil(self); MXStrongifyAndReturnIfNil(self);
[element sanitizeWith:allowedHTMLTags bodyFont:self->_groupLongDescription.font imageHandler:[self groupLongDescriptionImageHandler]]; [element sanitizeWith:allowedHTMLTags bodyFont:self->_groupLongDescription.font imageHandler:[self groupLongDescriptionImageHandler]];
}; };
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenGroup];
} }
- (void)viewDidLoad - (void)viewDidLoad
@ -205,9 +209,6 @@
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
// Screen tracking
[[Analytics sharedInstance] trackScreen:@"GroupDetailsHome"];
// Release the potential pushed view controller // Release the potential pushed view controller
[self releasePushedViewController]; [self releasePushedViewController];
@ -259,6 +260,18 @@
[self cancelRegistrationOnGroupChangeNotifications]; [self cancelRegistrationOnGroupChangeNotifications];
} }
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
- (void)viewDidLayoutSubviews - (void)viewDidLayoutSubviews
{ {
[super viewDidLayoutSubviews]; [super viewDidLayoutSubviews];

View file

@ -219,9 +219,6 @@
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
// Screen tracking
[[Analytics sharedInstance] trackScreen:@"GroupDetailsPeople"];
// Release the potential pushed view controller // Release the potential pushed view controller
[self releasePushedViewController]; [self releasePushedViewController];

View file

@ -183,9 +183,6 @@
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
// Screen tracking
[[Analytics sharedInstance] trackScreen:@"GroupDetailsRooms"];
// Release the potential pushed view controller // Release the potential pushed view controller
[self releasePushedViewController]; [self releasePushedViewController];

View file

@ -136,9 +136,6 @@
- (void)viewWillAppear:(BOOL)animated - (void)viewWillAppear:(BOOL)animated
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
// Screen tracking
[[Analytics sharedInstance] trackScreen:@"GroupDetails"];
} }
- (void)viewWillDisappear:(BOOL)animated - (void)viewWillDisappear:(BOOL)animated

View file

@ -19,6 +19,7 @@
#import "ContactTableViewCell.h" #import "ContactTableViewCell.h"
@class ContactsTableViewController; @class ContactsTableViewController;
@class AnalyticsScreenTimer;
/** /**
`ContactsTableViewController` delegate. `ContactsTableViewController` delegate.
@ -85,11 +86,6 @@
*/ */
@property (nonatomic) BOOL shouldScrollToTopOnRefresh; @property (nonatomic) BOOL shouldScrollToTopOnRefresh;
/**
The analytics instance screen name (Default is "ContactsTable").
*/
@property (nonatomic) NSString *screenName;
/** /**
Callback used to take into account the change of the user interface theme. Callback used to take into account the change of the user interface theme.
*/ */
@ -124,5 +120,10 @@
*/ */
@property (nonatomic, weak) id<ContactsTableViewControllerDelegate> contactsTableViewControllerDelegate; @property (nonatomic, weak) id<ContactsTableViewControllerDelegate> contactsTableViewControllerDelegate;
/**
The screen timer used for analytics if they've been enabled. The default value is nil.
*/
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@end @end

View file

@ -76,8 +76,6 @@
// Setup `MXKViewControllerHandling` properties // Setup `MXKViewControllerHandling` properties
self.enableBarTintColorStatusChange = NO; self.enableBarTintColorStatusChange = NO;
self.rageShakeManager = [RageShakeManager sharedManager]; self.rageShakeManager = [RageShakeManager sharedManager];
_screenName = @"ContactsTable";
} }
- (void)viewDidLoad - (void)viewDidLoad
@ -159,9 +157,6 @@
- (void)viewWillAppear:(BOOL)animated - (void)viewWillAppear:(BOOL)animated
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
// Screen tracking
[[Analytics sharedInstance] trackScreen:_screenName];
MXWeakify(self); MXWeakify(self);
@ -182,6 +177,12 @@
[self updateFooterViewVisibility]; [self updateFooterViewVisibility];
} }
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
}
- (void)viewDidLayoutSubviews - (void)viewDidLayoutSubviews
{ {
[super viewDidLayoutSubviews]; [super viewDidLayoutSubviews];
@ -206,6 +207,12 @@
} }
} }
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
#pragma mark - #pragma mark -
/** /**

View file

@ -232,9 +232,6 @@
- (void)viewWillAppear:(BOOL)animated - (void)viewWillAppear:(BOOL)animated
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
// Screen tracking
[[Analytics sharedInstance] trackScreen:@"ContactDetails"];
// Hide the bottom border of the navigation bar to display the expander header // Hide the bottom border of the navigation bar to display the expander header
[self hideNavigationBarBorder:YES]; [self hideNavigationBarBorder:YES];

View file

@ -55,7 +55,7 @@ class FindYourContactsFooterView: UIView, NibLoadable, Themable {
button.layer.cornerRadius = 8 button.layer.cornerRadius = 8
titleLabel.text = VectorL10n.findYourContactsTitle titleLabel.text = VectorL10n.findYourContactsTitle
messageLabel.text = VectorL10n.findYourContactsMessage(BuildSettings.bundleDisplayName) messageLabel.text = VectorL10n.findYourContactsMessage(AppInfo.current.displayName)
button.setTitle(VectorL10n.findYourContactsButtonTitle, for: .normal) button.setTitle(VectorL10n.findYourContactsButtonTitle, for: .normal)
footerLabel.text = VectorL10n.findYourContactsFooter footerLabel.text = VectorL10n.findYourContactsFooter
} }

View file

@ -53,6 +53,7 @@ final class EnterNewRoomDetailsViewController: UIViewController {
item.isEnabled = false item.isEnabled = false
return item return item
}() }()
private var screenTimer = AnalyticsScreenTimer(screen: .createRoom)
private enum RowType { private enum RowType {
case `default` case `default`
@ -215,10 +216,17 @@ final class EnterNewRoomDetailsViewController: UIViewController {
self.keyboardAvoider?.startAvoiding() self.keyboardAvoider?.startAvoiding()
} }
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
screenTimer.start()
}
override func viewDidDisappear(_ animated: Bool) { override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated) super.viewDidDisappear(animated)
self.keyboardAvoider?.stopAvoiding() self.keyboardAvoider?.stopAvoiding()
screenTimer.stop()
} }
override var preferredStatusBarStyle: UIStatusBarStyle { override var preferredStatusBarStyle: UIStatusBarStyle {

View file

@ -39,9 +39,9 @@
{ {
[super finalizeInit]; [super finalizeInit];
self.screenName = @"Favourites";
self.enableDragging = YES; self.enableDragging = YES;
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenFavourites];
} }
- (void)viewDidLoad - (void)viewDidLoad

View file

@ -37,7 +37,7 @@
roomId = event.roomId; roomId = event.roomId;
// Title is here the file name stored in event body // Title is here the file name stored in event body
title = [event.content[@"body"] isKindOfClass:[NSString class]] ? event.content[@"body"] : nil; title = [event.content[kMXMessageBodyKey] isKindOfClass:[NSString class]] ? event.content[kMXMessageBodyKey] : nil;
// Check attachment if any // Check attachment if any
if ([searchDataSource.eventFormatter isSupportedAttachment:event]) if ([searchDataSource.eventFormatter isSupportedAttachment:event])
@ -128,7 +128,7 @@
{ {
MXEvent *event = searchResult.result; MXEvent *event = searchResult.result;
NSString *msgtype; NSString *msgtype;
MXJSONModelSetString(msgtype, event.content[@"msgtype"]); MXJSONModelSetString(msgtype, event.content[kMXMessageTypeKey]);
if ([msgtype isEqualToString:kMXMessageTypeImage]) if ([msgtype isEqualToString:kMXMessageTypeImage])
{ {
@ -142,10 +142,6 @@
{ {
return [UIImage imageNamed:@"file_video_icon"]; return [UIImage imageNamed:@"file_video_icon"];
} }
else if ([msgtype isEqualToString:kMXMessageTypeLocation])
{
// Not supported yet
}
else if ([msgtype isEqualToString:kMXMessageTypeFile]) else if ([msgtype isEqualToString:kMXMessageTypeFile])
{ {
return [UIImage imageNamed:@"file_doc_icon"]; return [UIImage imageNamed:@"file_doc_icon"];

View file

@ -17,6 +17,8 @@
#import "MatrixKit.h" #import "MatrixKit.h"
@class AnalyticsScreenTimer;
/** /**
`HomeFilesSearchViewController` displays the files search in user's rooms under a `HomeViewController` segment. `HomeFilesSearchViewController` displays the files search in user's rooms under a `HomeViewController` segment.
*/ */
@ -27,4 +29,9 @@
*/ */
@property (nonatomic, readonly) MXEvent *selectedEvent; @property (nonatomic, readonly) MXEvent *selectedEvent;
/**
The screen timer used for analytics if they've been enabled. The default value is nil.
*/
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@end @end

View file

@ -109,9 +109,6 @@
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
// Screen tracking
[[Analytics sharedInstance] trackScreen:@"FilesGlobalSearch"];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionDidLeaveRoomNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionDidLeaveRoomNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionNewRoomNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionNewRoomNotification object:nil];
} }
@ -124,6 +121,18 @@
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionNewRoomNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionNewRoomNotification object:nil];
} }
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
#pragma mark - #pragma mark -
- (void)refreshSearchResult:(NSNotification *)notif - (void)refreshSearchResult:(NSNotification *)notif

View file

@ -17,6 +17,8 @@
#import "MatrixKit.h" #import "MatrixKit.h"
@class AnalyticsScreenTimer;
/** /**
`HomeMessagesSearchViewController` displays messages search in user's rooms under a `HomeViewController` segment. `HomeMessagesSearchViewController` displays messages search in user's rooms under a `HomeViewController` segment.
*/ */
@ -27,4 +29,9 @@
*/ */
@property (nonatomic, readonly) MXEvent *selectedEvent; @property (nonatomic, readonly) MXEvent *selectedEvent;
/**
The screen timer used for analytics if they've been enabled. The default value is nil.
*/
@property (nonatomic) AnalyticsScreenTimer *screenTimer;
@end @end

View file

@ -115,9 +115,6 @@
- (void)viewWillAppear:(BOOL)animated - (void)viewWillAppear:(BOOL)animated
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
// Screen tracking
[[Analytics sharedInstance] trackScreen:@"MessagesGlobalSearch"];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionDidLeaveRoomNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionDidLeaveRoomNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionNewRoomNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshSearchResult:) name:kMXSessionNewRoomNotification object:nil];
@ -131,6 +128,18 @@
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionNewRoomNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionNewRoomNotification object:nil];
} }
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.screenTimer start];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.screenTimer stop];
}
#pragma mark - #pragma mark -
- (void)refreshSearchResult:(NSNotification *)notif - (void)refreshSearchResult:(NSNotification *)notif

Some files were not shown because too many files have changed in this diff Show more