Merge branch 'feature/4260_merge_foss_1_10_2' into develop
@@ -4,33 +4,17 @@ on:
|
||||
|
||||
# Triggers the workflow on any pull request
|
||||
pull_request:
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
types: [ labeled, synchronize, opened, reopened ]
|
||||
|
||||
env:
|
||||
# Make the git branch for a PR available to our Fastfile
|
||||
MX_GIT_BRANCH: ${{ github.event.pull_request.head.ref }}
|
||||
|
||||
jobs:
|
||||
check-secret:
|
||||
runs-on: macos-12
|
||||
outputs:
|
||||
out-key: ${{ steps.out-key.outputs.defined }}
|
||||
steps:
|
||||
- id: out-key
|
||||
env:
|
||||
P12_KEY: ${{ secrets.ALPHA_CERTIFICATES_P12 }}
|
||||
P12_PASSWORD_KEY: ${{ secrets.ALPHA_CERTIFICATES_P12 }}
|
||||
if: "${{ env.P12_KEY != '' || env.P12_PASSWORD_KEY != '' }}"
|
||||
run: echo "::set-output name=defined::true"
|
||||
build:
|
||||
# Run job if secrets are available (not available for forks).
|
||||
needs: [check-secret]
|
||||
if: |
|
||||
needs.check-secret.outputs.out-key == 'true' &&
|
||||
(github.event_name == 'push' ||
|
||||
(github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'Trigger-PR-Build')))
|
||||
# Only run for PRs that contain the trigger label. The action will fail for forks due to
|
||||
# missing secrets, but there's no need to handle this as it won't run automatically.
|
||||
if: contains(github.event.pull_request.labels.*.name, 'Trigger-PR-Build')
|
||||
|
||||
name: Release
|
||||
runs-on: macos-12
|
||||
|
||||
@@ -1,3 +1,102 @@
|
||||
## Changes in 1.10.2 (2023-02-10)
|
||||
|
||||
🐛 Bugfixes
|
||||
|
||||
- Fixes #7350 - Fix green dot only to appear for marked action ([#7530](https://github.com/vector-im/element-ios/issues/7530))
|
||||
|
||||
|
||||
## Changes in 1.10.1 (2023-02-07)
|
||||
|
||||
✨ Features
|
||||
|
||||
- Add mark as unread option for rooms ([#7253](https://github.com/vector-im/element-ios/issues/7253))
|
||||
|
||||
🙌 Improvements
|
||||
|
||||
- Polls: add logic for fetching poll histories in rooms. ([#7293](https://github.com/vector-im/element-ios/pull/7293))
|
||||
- Poll: add a feature to load more polls in the poll history. ([#7303](https://github.com/vector-im/element-ios/pull/7303))
|
||||
- CryptoV2: Generate Crypto SDK store key ([#7310](https://github.com/vector-im/element-ios/pull/7310))
|
||||
- Poll: added poll detail in poll list hisotry with navigation to timeline ([#7314](https://github.com/vector-im/element-ios/pull/7314))
|
||||
- Backup: Display backup import progress ([#7319](https://github.com/vector-im/element-ios/pull/7319))
|
||||
- Polls: sync push rules with the one of normal messages. ([#7320](https://github.com/vector-im/element-ios/pull/7320))
|
||||
- CryptoV2: Reset Crypto SDK on logout ([#7323](https://github.com/vector-im/element-ios/pull/7323))
|
||||
- Polls: add error handling when syncing push rules with the ones of normal messages. ([#7324](https://github.com/vector-im/element-ios/pull/7324))
|
||||
- CryptoV2: Refresh notification service on crypto change ([#7332](https://github.com/vector-im/element-ios/pull/7332))
|
||||
- CryptoV2: Enable Crypto SDK for production ([#7333](https://github.com/vector-im/element-ios/pull/7333))
|
||||
- Polls: add automatic synchronization logic for poll push rules. ([#7335](https://github.com/vector-im/element-ios/pull/7335))
|
||||
- Polls: update poll history UI. ([#7341](https://github.com/vector-im/element-ios/pull/7341))
|
||||
- Upgrade MatrixSDK version ([v0.25.1](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.25.1)).
|
||||
- Hide the presence info if the presence status is unknown. ([#6597](https://github.com/vector-im/element-ios/issues/6597))
|
||||
- Inform the user about decryption errors during a voice broadcast. ([#7189](https://github.com/vector-im/element-ios/issues/7189))
|
||||
- App Layout: Removed the onboarding flow ([#7298](https://github.com/vector-im/element-ios/issues/7298))
|
||||
- Improve error handling during a voice broadcast playback. ([#7311](https://github.com/vector-im/element-ios/issues/7311))
|
||||
- Labs: Rich text editor: enable list items indentation ([#7316](https://github.com/vector-im/element-ios/issues/7316))
|
||||
|
||||
|
||||
## Changes in 1.10.0 (2023-02-02)
|
||||
|
||||
🙌 Improvements
|
||||
|
||||
- CryptoV2: Generate Crypto SDK store key ([#7310](https://github.com/vector-im/element-ios/pull/7310))
|
||||
- Backup: Display backup import progress ([#7319](https://github.com/vector-im/element-ios/pull/7319))
|
||||
- CryptoV2: Reset Crypto SDK on logout ([#7323](https://github.com/vector-im/element-ios/pull/7323))
|
||||
- CryptoV2: Refresh notification service on crypto change ([#7332](https://github.com/vector-im/element-ios/pull/7332))
|
||||
- CryptoV2: Enable Crypto SDK for production ([#7333](https://github.com/vector-im/element-ios/pull/7333))
|
||||
- Upgrade MatrixSDK version ([v0.25.0](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.25.0)).
|
||||
|
||||
|
||||
## Changes in 1.9.17 (2023-01-26)
|
||||
|
||||
🙌 Improvements
|
||||
|
||||
- Analytics: Ensure E2EE never tracks UnknownError ([#7304](https://github.com/vector-im/element-ios/pull/7304))
|
||||
|
||||
🐛 Bugfixes
|
||||
|
||||
- Fix a deadlock when updating the summary of a room that has a voice broadcast. ([#7300](https://github.com/vector-im/element-ios/pull/7300))
|
||||
- Space Switcher: Fix a bug where the avatars would all be the same. ([#7305](https://github.com/vector-im/element-ios/issues/7305))
|
||||
|
||||
|
||||
## Changes in 1.9.16 (2023-01-24)
|
||||
|
||||
✨ Features
|
||||
|
||||
- Rich Text Composer: Enable bulleted/numbered lists support ([#7238](https://github.com/vector-im/element-ios/issues/7238))
|
||||
- Rich Text Composer: Enable quote & code blocks support ([#7271](https://github.com/vector-im/element-ios/issues/7271))
|
||||
- Voice Broadcast: When deleting a voice broadcast, all data is now deleted on server side (MSC3912 implementation). ([#7283](https://github.com/vector-im/element-ios/issues/7283))
|
||||
|
||||
🙌 Improvements
|
||||
|
||||
- Labs: VoiceBroadcast: Handle VoIP buttons when VB is used ([#7225](https://github.com/vector-im/element-ios/pull/7225))
|
||||
- Polls: add UI for active poll history. ([#7267](https://github.com/vector-im/element-ios/pull/7267))
|
||||
- CryptoSDK: Add labs settings to enable Crypto SDK ([#7272](https://github.com/vector-im/element-ios/pull/7272))
|
||||
- Voice Broadcast: Improved detection of voice broadcast completion during playback. ([#7273](https://github.com/vector-im/element-ios/pull/7273))
|
||||
- Remove "Leave" button on Room details screen ([#7275](https://github.com/vector-im/element-ios/pull/7275))
|
||||
- Polls: poll history UI for past polls. ([#7278](https://github.com/vector-im/element-ios/pull/7278))
|
||||
- Polls: render replies to poll events better. ([#7284](https://github.com/vector-im/element-ios/pull/7284))
|
||||
- CryptoV2: Display migration progress during startup ([#7286](https://github.com/vector-im/element-ios/pull/7286))
|
||||
- Upgrade MatrixSDK version ([v0.24.8](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.24.8)).
|
||||
- Voice broadcast connection error handling while recording. ([#7229](https://github.com/vector-im/element-ios/issues/7229))
|
||||
- Handle a connection issue when we try to start a new voice broadcast. ([#7234](https://github.com/vector-im/element-ios/issues/7234))
|
||||
- Rich Text Editor: https:// or mailto: scheme is automatically added when creating a link if no scheme is specified. ([#7279](https://github.com/vector-im/element-ios/issues/7279))
|
||||
- Rich Text Editor: Adding a link over a blank selection, prompts the user to create a new link with new text to replace such selection. ([#7280](https://github.com/vector-im/element-ios/issues/7280))
|
||||
- Voice Broadcast: handle the lost of connectivity with the homeserver while recording. ([#7285](https://github.com/vector-im/element-ios/issues/7285))
|
||||
|
||||
🐛 Bugfixes
|
||||
|
||||
- Voice Broadcast: The Now Playing Info Center now displays a voice broadcast instead of a voice message when a user is listening to a voice broadcast. ([#7257](https://github.com/vector-im/element-ios/pull/7257))
|
||||
- Fix a crash caused by the missing Avatar Service dependency. ([#7268](https://github.com/vector-im/element-ios/pull/7268))
|
||||
- The (edited) tag for messages is now light grey like on web and Android. ([#5148](https://github.com/vector-im/element-ios/issues/5148))
|
||||
- Live Location Sharing does not work on first selection after granting "Allow always" location permission. ([#7222](https://github.com/vector-im/element-ios/issues/7222))
|
||||
- Voice Broadcast: Fixed an issue where the voice broadcast audio player progress bar behaved unexpectedly. ([#7252](https://github.com/vector-im/element-ios/issues/7252))
|
||||
- Voice Broadcast: VoiceBroadcast chunks are no longer resent as voice messages ([#7261](https://github.com/vector-im/element-ios/issues/7261))
|
||||
- Timeline's links and hyperlinks match now the blue colour of Android and Web. ([#7263](https://github.com/vector-im/element-ios/issues/7263))
|
||||
|
||||
🧱 Build
|
||||
|
||||
- Fix Element Alpha workflow not being able to run. ([#7256](https://github.com/vector-im/element-ios/pull/7256))
|
||||
|
||||
|
||||
## Changes in 1.9.15 (2023-01-10)
|
||||
|
||||
✨ Features
|
||||
|
||||
@@ -90,6 +90,15 @@ class CommonConfiguration: NSObject, Configurable {
|
||||
EncryptionKeyManager.shared.initKeys()
|
||||
|
||||
sdkOptions.enableNewClientInformationFeature = RiotSettings.shared.enableClientInformationFeature
|
||||
|
||||
if sdkOptions.isCryptoSDKAvailable {
|
||||
let isEnabled = RiotSettings.shared.enableCryptoSDK
|
||||
MXLog.debug("[CommonConfiguration] Crypto SDK is \(isEnabled ? "enabled" : "disabled")")
|
||||
sdkOptions.enableCryptoSDK = isEnabled
|
||||
sdkOptions.enableStartupProgress = isEnabled
|
||||
} else {
|
||||
MXLog.debug("[CommonConfiguration] Crypto SDK is not available)")
|
||||
}
|
||||
}
|
||||
|
||||
private func makeASCIIUserAgent() -> String? {
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
//
|
||||
// Copyright 2023 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
|
||||
|
||||
/// Configuration for enabling / disabling Matrix Crypto SDK
|
||||
@objcMembers class CryptoSDKConfiguration: NSObject {
|
||||
static let shared = CryptoSDKConfiguration()
|
||||
|
||||
func enable() {
|
||||
guard MXSDKOptions.sharedInstance().isCryptoSDKAvailable else {
|
||||
return
|
||||
}
|
||||
|
||||
RiotSettings.shared.enableCryptoSDK = true
|
||||
MXSDKOptions.sharedInstance().enableCryptoSDK = true
|
||||
MXSDKOptions.sharedInstance().enableStartupProgress = true
|
||||
|
||||
MXLog.debug("[CryptoSDKConfiguration] enabling Crypto SDK")
|
||||
}
|
||||
|
||||
func disable() {
|
||||
RiotSettings.shared.enableCryptoSDK = false
|
||||
MXSDKOptions.sharedInstance().enableCryptoSDK = false
|
||||
MXSDKOptions.sharedInstance().enableStartupProgress = false
|
||||
|
||||
MXLog.debug("[CryptoSDKConfiguration] disabling Crypto SDK")
|
||||
}
|
||||
}
|
||||
@@ -48,5 +48,7 @@ public struct ColorValues: Colors {
|
||||
|
||||
public let ems: UIColor
|
||||
|
||||
public let links: UIColor
|
||||
|
||||
public let namesAndAvatars: [UIColor]
|
||||
}
|
||||
|
||||
@@ -67,6 +67,10 @@ public protocol Colors {
|
||||
/// Global color: The EMS brand's purple colour.
|
||||
var ems: ColorType { get }
|
||||
|
||||
/// - Links
|
||||
/// - Hyperlinks
|
||||
var links: ColorType { get }
|
||||
|
||||
/// - Names in chat timeline
|
||||
/// - Avatars default states that include first name letter
|
||||
var namesAndAvatars: [ColorType] { get }
|
||||
|
||||
@@ -21,7 +21,7 @@ import SwiftUI
|
||||
Struct for holding colors for use in SwiftUI.
|
||||
*/
|
||||
public struct ColorSwiftUI: Colors {
|
||||
|
||||
|
||||
public let accent: Color
|
||||
|
||||
public let alert: Color
|
||||
@@ -48,8 +48,10 @@ public struct ColorSwiftUI: Colors {
|
||||
|
||||
public var ems: Color
|
||||
|
||||
public let namesAndAvatars: [Color]
|
||||
public let links: Color
|
||||
|
||||
public let namesAndAvatars: [Color]
|
||||
|
||||
init(values: ColorValues) {
|
||||
accent = Color(values.accent)
|
||||
alert = Color(values.alert)
|
||||
@@ -64,6 +66,7 @@ public struct ColorSwiftUI: Colors {
|
||||
navigation = Color(values.navigation)
|
||||
background = Color(values.background)
|
||||
ems = Color(values.ems)
|
||||
links = Color(values.links)
|
||||
namesAndAvatars = values.namesAndAvatars.map({ Color($0) })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,6 +45,8 @@ import UIKit
|
||||
public let navigation: UIColor
|
||||
|
||||
public let background: UIColor
|
||||
|
||||
public let links: UIColor
|
||||
|
||||
public let namesAndAvatars: [UIColor]
|
||||
|
||||
@@ -61,6 +63,7 @@ import UIKit
|
||||
tile = values.tile
|
||||
navigation = values.navigation
|
||||
background = values.background
|
||||
links = values.links
|
||||
namesAndAvatars = values.namesAndAvatars
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ public class DarkColors {
|
||||
navigation: UIColor(rgb:0x21262C),
|
||||
background: UIColor(rgb:0x15191E),
|
||||
ems: UIColor(rgb: 0x7E69FF),
|
||||
links: UIColor(rgb: 0x0086E6),
|
||||
namesAndAvatars: [
|
||||
UIColor(rgb:0x368BD6),
|
||||
UIColor(rgb:0xAC3BA8),
|
||||
|
||||
@@ -35,6 +35,7 @@ public class LightColors {
|
||||
navigation: UIColor(rgb:0xF4F6FA),
|
||||
background: UIColor(rgb:0xFFFFFF),
|
||||
ems: UIColor(rgb: 0x7E69FF),
|
||||
links: UIColor(rgb: 0x0086E6),
|
||||
namesAndAvatars: [
|
||||
UIColor(rgb:0x368BD6),
|
||||
UIColor(rgb:0xAC3BA8),
|
||||
|
||||
@@ -16,7 +16,7 @@ use_frameworks!
|
||||
# - `{ :specHash => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for MatrixSDK repo. Used by Fastfile during CI
|
||||
#
|
||||
# Warning: our internal tooling depends on the name of this variable name, so be sure not to change it
|
||||
$matrixSDKVersion = '= 0.24.7'
|
||||
$matrixSDKVersion = '= 0.25.1'
|
||||
# $matrixSDKVersion = :local
|
||||
# $matrixSDKVersion = { :branch => 'develop'}
|
||||
# $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } }
|
||||
@@ -43,7 +43,7 @@ when String # specific MatrixSDK released version
|
||||
$matrixSDKVersionSpec = $matrixSDKVersion
|
||||
end
|
||||
|
||||
$matrixSDKVersionSpec = { :git => 'https://dl-gitlab.example.com/bwmessenger/bundesmessenger/bundesmessenger-ios-sdk', :tag => 'v0.24.7_bwi_beta' }
|
||||
$matrixSDKVersionSpec = { :git => 'https://dl-gitlab.example.com/bwmessenger/bundesmessenger/bundesmessenger-ios-sdk', :tag => 'v0.25.1_bwi_beta' }
|
||||
|
||||
# Method to import the MatrixSDK
|
||||
def import_MatrixSDK
|
||||
|
||||
@@ -21,13 +21,13 @@ PODS:
|
||||
- Down (0.11.0)
|
||||
- DSBottomSheet (0.3.0)
|
||||
- DSWaveformImage (6.1.1)
|
||||
- DTCoreText (1.6.27):
|
||||
- DTCoreText/Core (= 1.6.27)
|
||||
- DTCoreText (1.6.26):
|
||||
- DTCoreText/Core (= 1.6.26)
|
||||
- DTFoundation/Core (~> 1.7.5)
|
||||
- DTFoundation/DTAnimatedGIF (~> 1.7.5)
|
||||
- DTFoundation/DTHTMLParser (~> 1.7.5)
|
||||
- DTFoundation/UIKit (~> 1.7.5)
|
||||
- DTCoreText/Core (1.6.27):
|
||||
- DTCoreText/Core (1.6.26):
|
||||
- DTFoundation/Core (~> 1.7.5)
|
||||
- DTFoundation/DTAnimatedGIF (~> 1.7.5)
|
||||
- DTFoundation/DTHTMLParser (~> 1.7.5)
|
||||
@@ -59,22 +59,20 @@ PODS:
|
||||
- MatomoTracker (7.4.1):
|
||||
- MatomoTracker/Core (= 7.4.1)
|
||||
- MatomoTracker/Core (7.4.1)
|
||||
- MatrixSDK (0.24.7):
|
||||
- MatrixSDK/Core (= 0.24.7)
|
||||
- MatrixSDK/Core (0.24.7):
|
||||
- MatrixSDK (0.25.1):
|
||||
- MatrixSDK/Core (= 0.25.1)
|
||||
- MatrixSDK/Core (0.25.1):
|
||||
- AFNetworking (~> 4.0.0)
|
||||
- GZIP (~> 1.3.0)
|
||||
- libbase58 (~> 0.1.4)
|
||||
- MatrixSDK/CryptoSDK
|
||||
- MatrixSDKCrypto (= 0.2.0)
|
||||
- OLMKit (~> 3.2.5)
|
||||
- Realm (= 10.27.0)
|
||||
- SwiftyBeaver (= 1.9.5)
|
||||
- MatrixSDK/CryptoSDK (0.24.7):
|
||||
- MatrixSDKCrypto (= 0.1.7)
|
||||
- MatrixSDK/JingleCallStack (0.24.7):
|
||||
- MatrixSDK/JingleCallStack (0.25.1):
|
||||
- JitsiMeetSDK (= 5.0.2)
|
||||
- MatrixSDK/Core
|
||||
- MatrixSDKCrypto (0.1.7)
|
||||
- MatrixSDKCrypto (0.2.0)
|
||||
- OLMKit (3.2.12):
|
||||
- OLMKit/olmc (= 3.2.12)
|
||||
- OLMKit/olmcpp (= 3.2.12)
|
||||
@@ -118,7 +116,7 @@ DEPENDENCIES:
|
||||
- Down (~> 0.11.0)
|
||||
- DSBottomSheet (~> 0.3)
|
||||
- DSWaveformImage (~> 6.1.1)
|
||||
- DTCoreText (~> 1.6.25)
|
||||
- DTCoreText (= 1.6.26)
|
||||
- DTTJailbreakDetection (~> 0.4.0)
|
||||
- FLEX (~> 4.5.0)
|
||||
- FlowCommoniOS (~> 1.12.0)
|
||||
@@ -128,8 +126,8 @@ DEPENDENCIES:
|
||||
- KTCenterFlowLayout (~> 1.3.1)
|
||||
- libPhoneNumber-iOS (~> 0.9.13)
|
||||
- MatomoTracker (~> 7.4.1)
|
||||
- MatrixSDK (from `https://dl-gitlab.example.com/bwmessenger/bundesmessenger/bundesmessenger-ios-sdk`, tag `v0.24.7_bwi_beta`)
|
||||
- MatrixSDK/JingleCallStack (from `https://dl-gitlab.example.com/bwmessenger/bundesmessenger/bundesmessenger-ios-sdk`, tag `v0.24.7_bwi_beta`)
|
||||
- MatrixSDK (from `https://dl-gitlab.example.com/bwmessenger/bundesmessenger/bundesmessenger-ios-sdk`, tag `v0.25.1_bwi_beta`)
|
||||
- MatrixSDK/JingleCallStack (from `https://dl-gitlab.example.com/bwmessenger/bundesmessenger/bundesmessenger-ios-sdk`, tag `v0.25.1_bwi_beta`)
|
||||
- OLMKit
|
||||
- PostHog (~> 1.4.4)
|
||||
- ReadMoreTextView (~> 3.0.1)
|
||||
@@ -199,7 +197,7 @@ EXTERNAL SOURCES:
|
||||
:git: https://github.com/matrix-org/matrix-analytics-events.git
|
||||
MatrixSDK:
|
||||
:git: https://dl-gitlab.example.com/bwmessenger/bundesmessenger/bundesmessenger-ios-sdk
|
||||
:tag: v0.24.7_bwi_beta
|
||||
:tag: v0.25.1_bwi_beta
|
||||
|
||||
CHECKOUT OPTIONS:
|
||||
AnalyticsEvents:
|
||||
@@ -207,7 +205,7 @@ CHECKOUT OPTIONS:
|
||||
:git: https://github.com/matrix-org/matrix-analytics-events.git
|
||||
MatrixSDK:
|
||||
:git: https://dl-gitlab.example.com/bwmessenger/bundesmessenger/bundesmessenger-ios-sdk
|
||||
:tag: v0.24.7_bwi_beta
|
||||
:tag: v0.25.1_bwi_beta
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
AFNetworking: 3bd23d814e976cd148d7d44c3ab78017b744cd58
|
||||
@@ -218,7 +216,7 @@ SPEC CHECKSUMS:
|
||||
Down: b6ba1bc985c9d2f4e15e3b293d2207766fa12612
|
||||
DSBottomSheet: ca0ac37eb5af2dd54663f86b84382ed90a59be2a
|
||||
DSWaveformImage: 3c718a0cf99291887ee70d1d0c18d80101d3d9ce
|
||||
DTCoreText: ac297b565abd3b12390d33cd6e076d875f0c0a5e
|
||||
DTCoreText: ec749e013f2e1f76de5e7c7634642e600a7467ce
|
||||
DTFoundation: a53f8cda2489208cbc71c648be177f902ee17536
|
||||
DTTJailbreakDetection: 5e356c5badc17995f65a83ed9483f787a0057b71
|
||||
FLEX: e51461dd6f0bfb00643c262acdfea5d5d12c596b
|
||||
@@ -235,8 +233,8 @@ SPEC CHECKSUMS:
|
||||
LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d
|
||||
Logging: beeb016c9c80cf77042d62e83495816847ef108b
|
||||
MatomoTracker: 24a846c9d3aa76933183fe9d47fd62c9efa863fb
|
||||
MatrixSDK: 895929fad10b7ec9aa96d557403b44c5e3522211
|
||||
MatrixSDKCrypto: 2bd9ca41b2c644839f4e680a64897d56b3f95392
|
||||
MatrixSDK: 823c5c2ef8b8a769c30fa62e1be8ec801e6312e7
|
||||
MatrixSDKCrypto: e1ef22aae76b5a6f030ace21a47be83864f4ff44
|
||||
OLMKit: da115f16582e47626616874e20f7bb92222c7a51
|
||||
PostHog: 4b6321b521569092d4ef3a02238d9435dbaeb99f
|
||||
ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d
|
||||
@@ -256,6 +254,6 @@ SPEC CHECKSUMS:
|
||||
zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c
|
||||
ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb
|
||||
|
||||
PODFILE CHECKSUM: 869221f53222bc657fc29068c97625ccb2b82cb5
|
||||
PODFILE CHECKSUM: e4c596034adbad09681a3a6913c9ff04c5a3e0a9
|
||||
|
||||
COCOAPODS: 1.11.3
|
||||
|
||||
@@ -5,8 +5,26 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/devicekit/DeviceKit",
|
||||
"state" : {
|
||||
"revision" : "20e0991f3975916ab0f6d58db84d8bc64f883537",
|
||||
"version" : "4.7.0"
|
||||
"revision" : "d37e70cb2646666dcf276d7d3d4a9760a41ff8a6",
|
||||
"version" : "4.9.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "dtcoretext",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/Cocoanetics/DTCoreText",
|
||||
"state" : {
|
||||
"revision" : "9d2d4d2296e5d2d852a7d3c592b817d913a5d020",
|
||||
"version" : "1.6.27"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "dtfoundation",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/Cocoanetics/DTFoundation.git",
|
||||
"state" : {
|
||||
"revision" : "76062513434421cb6c8a1ae1d4f8368a7ebc2da3",
|
||||
"version" : "1.7.18"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -32,7 +50,8 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/matrix-org/matrix-wysiwyg-composer-swift",
|
||||
"state" : {
|
||||
"revision" : "534ee5bae5e8de69ed398937b5edb7b5f21551d2"
|
||||
"revision" : "3f72aeab7d7e04b52ff3f735ab79a75993f97ef2",
|
||||
"version" : "0.22.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -58,8 +77,8 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/apple/swift-collections",
|
||||
"state" : {
|
||||
"revision" : "48254824bb4248676bf7ce56014ff57b142b77eb",
|
||||
"version" : "1.0.2"
|
||||
"revision" : "937e904258d22af6e447a0b72c0bc67583ef64a2",
|
||||
"version" : "1.0.4"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 166 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "all_chats_onboarding2.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "all_chats_onboarding2@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "all_chats_onboarding2@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 94 KiB |
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "all_chats_onboarding3.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "all_chats_onboarding3@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "all_chats_onboarding3@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 151 KiB |
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "all_chats_onboarding1.png",
|
||||
"filename" : "code_block.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "all_chats_onboarding1@2x.png",
|
||||
"filename" : "code_block@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "all_chats_onboarding1@3x.png",
|
||||
"filename" : "code_block@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
|
After Width: | Height: | Size: 493 B |
|
After Width: | Height: | Size: 649 B |
|
After Width: | Height: | Size: 953 B |
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "pollHistory.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.5 2C10.2239 2 10 2.22386 10 2.5V22H14V2.5C14 2.22386 13.7761 2 13.5 2H10.5ZM3 9.5C3 9.22386 3.22386 9 3.5 9H6.5C6.77614 9 7 9.22386 7 9.5V22H3V9.5ZM17 13.5C17 13.2239 17.2239 13 17.5 13H20.5C20.7761 13 21 13.2239 21 13.5V22H17V13.5Z" fill="#8D97A5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 407 B |
@@ -455,7 +455,7 @@
|
||||
"sign_up" = "الاِشتِراك";
|
||||
"dismiss" = "إبعَاد";
|
||||
"discard" = "اِستِبعاد";
|
||||
"abort" = "إِجهَاض";
|
||||
"abort" = "إنهاء";
|
||||
"yes" = "نَعَم";
|
||||
|
||||
// Action
|
||||
@@ -1078,3 +1078,8 @@
|
||||
/* The placeholder will show the email address that was entered. */
|
||||
"authentication_verify_email_waiting_message" = "اتبع التعليمات المرسلة إلى %@";
|
||||
"invite_to" = "الدعوة إلى %@";
|
||||
"password_policy_pwd_in_dict_error" = "تم العثور على كلمة المرور هذه في القاموس لدينا، وهي كلمة مرور غير مسموح في استخدامها.";
|
||||
|
||||
// Others
|
||||
"or" = "أو";
|
||||
"accessibility_selected" = "تم تحديده";
|
||||
|
||||
@@ -2457,9 +2457,7 @@
|
||||
"all_chats_all_filter" = "Alle";
|
||||
"all_chats_edit_layout_show_filters" = "Filter anzeigen";
|
||||
"all_chats_edit_menu_leave_space" = "%@ verlassen";
|
||||
"all_chats_onboarding_page_title3" = "Rückmeldung geben";
|
||||
"room_invites_empty_view_information" = "Hier erscheinen deine Einladungen.";
|
||||
"all_chats_onboarding_try_it" = "Probiere es aus";
|
||||
"threads_discourage_information_1" = "Dein Heimserver unterstützt aktuell keine Threads, weshalb diese Funktion unzuverlässig sein könnte. Manche Thread-Nachrichten könnten nicht zuverlässig verfügbar sein. ";
|
||||
"all_chats_nothing_found_placeholder_title" = "Nichts gefunden.";
|
||||
"spaces_create_subspace_title" = "Sub-Space erstellen";
|
||||
@@ -2475,16 +2473,10 @@
|
||||
"room_access_settings_screen_private_message" = "Nur sichtbar und betretbar für eingeladene Personen.";
|
||||
"location_sharing_allow_background_location_message" = "Wenn du deinen Echtzeit-Standort freigeben möchtest, benötigt Element den Standortzugriff auch im Hintergrund. Um den Zugriff zu gewähren, tippe auf Einstellungen > Standort und wähle „Immer“";
|
||||
"space_selector_empty_view_information" = "Spaces sind eine neue Möglichkeit, Räume und Personen zu gruppieren. Erstelle einen Space, um zu beginnen.";
|
||||
"all_chats_onboarding_title" = "Was ist neu";
|
||||
"all_chats_onboarding_page_message3" = "Drücke auf dein Profil um uns Wissen zu lassen, was du denkst.";
|
||||
"all_chats_onboarding_page_message2" = "Greife auf deine Spaces (unten links) schneller und einfacher denn je zu.";
|
||||
"all_chats_onboarding_page_title2" = "Auf Spaces zugreifen";
|
||||
"all_chats_onboarding_page_message1" = "Um dein Element zu vereinfachen, sind Tabs nun optional. Verwalte sie mit dem Menü oben rechts.";
|
||||
"all_chats_empty_view_information" = "Die Komplettlösung für sichere Kommunikation unter Freunden, in Gruppen oder in Organisationen. Erstelle eine Unterhaltung oder trete einem bestehenden Raum bei, um loszulegen.";
|
||||
"all_chats_empty_space_information" = "Spaces sind eine neue Möglichkeit, Räume und Personen zu gruppieren. Füge einen bestehenden Raum hinzu oder erstelle einen neuen mit der Schaltfläche unten rechts.";
|
||||
"all_chats_edit_layout_sorting_options_title" = "Sortiere deine Nachrichten nach";
|
||||
"space_detail_nav_title" = "Space-Details";
|
||||
"all_chats_onboarding_page_title1" = "Willkommen in einer neuen Übersicht!";
|
||||
"all_chats_edit_menu_space_settings" = "Space-Einstellungen";
|
||||
"all_chats_user_menu_settings" = "Nutzereinstellungen";
|
||||
"room_recents_recently_viewed_section" = "Kürzlich angesehen";
|
||||
@@ -2700,5 +2692,46 @@
|
||||
"notice_voice_broadcast_live" = "Echtzeitübertragung";
|
||||
"user_other_session_security_recommendation_title" = "Andere Sitzungen";
|
||||
"voice_message_broadcast_in_progress_title" = "Kann Sprachnachricht nicht beginnen";
|
||||
"poll_timeline_decryption_error" = "Aufgrund von Entschlüsselungsfehlern könnten einige Stimmen nicht gezählt werden";
|
||||
"voice_message_broadcast_in_progress_message" = "Du kannst kein Gespräch beginnen, da du im Moment eine Sprachübertragung aufzeichnest. Bitte beende deine Sprachübertragung, um ein Gespräch zu beginnen";
|
||||
"poll_timeline_decryption_error" = "Evtl. werden infolge von Entschlüsselungsfehlern einige Stimmen nicht gezählt";
|
||||
"voice_message_broadcast_in_progress_message" = "Du kannst keine Sprachnachricht beginnen, da du im Moment eine Echtzeitübertragung aufzeichnest. Bitte beende deine Sprachübertragung, um ein Gespräch zu beginnen";
|
||||
"poll_timeline_ended_text" = "Umfrage beendet";
|
||||
"voice_broadcast_voip_cannot_start_description" = "Du kannst keinen Anruf beginnen, da du im Moment eine Sprachübertragung aufzeichnest. Bitte beende deine Sprachübertragung, um ein Gespräch zu beginnen.";
|
||||
"voice_broadcast_voip_cannot_start_title" = "Kann keinen Anruf beginnen";
|
||||
"poll_history_no_past_poll_text" = "In diesem Raum gibt es keine abgeschlossenen Umfragen";
|
||||
"poll_history_no_active_poll_text" = "In diesem Raum gibt es keine aktiven Umfragen";
|
||||
"poll_history_past_segment_title" = "Vergangene Umfragen";
|
||||
"poll_history_active_segment_title" = "Aktive Umfragen";
|
||||
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "Umfrageverlauf";
|
||||
"room_details_polls" = "Umfrageverlauf";
|
||||
"accessibility_selected" = "ausgewählt";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Sprachübertragung";
|
||||
"voice_broadcast_connection_error_message" = "Leider ist es aktuell nicht möglich, eine Aufnahme zu beginnen. Bitte versuche es später erneut.";
|
||||
"voice_broadcast_connection_error_title" = "Verbindungsfehler";
|
||||
"wysiwyg_composer_format_action_code_block" = "Quelltextblock umschalten";
|
||||
"wysiwyg_composer_format_action_quote" = "Zitat umschalten";
|
||||
"wysiwyg_composer_format_action_ordered_list" = "Nummerierte Liste umschalten";
|
||||
"wysiwyg_composer_format_action_unordered_list" = "Unsortierte Liste umschalten";
|
||||
"voice_broadcast_recorder_connection_error" = "Verbindungsfehler − Aufnahme pausiert";
|
||||
"poll_timeline_reply_ended_poll" = "Beendete Umfrage";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_migrating_data" = "Migriere Daten\n%@ %%";
|
||||
"settings_labs_disable_crypto_sdk" = "Rust-Ende-zu-Ende-Verschlüsselung (zum Deaktivieren abmelden)";
|
||||
"settings_labs_confirm_crypto_sdk" = "Bitte beachte, dass diese Funktion noch experimentell ist, womöglich nicht wie erwartet funktioniert und unerwünschte Nebeneffekte haben kann. Melde dich zum deaktivieren einfach ab und erneut an. Nutze diese Funktion nach eigenem Ermessen und mit Vorsicht.";
|
||||
"settings_labs_enable_crypto_sdk" = "Rust-Ende-zu-Ende-Verschlüsselung";
|
||||
"poll_history_no_past_poll_period_text" = "Für die vergangenen %@ Tage sind keine beendeten Umfragen verfügbar. Lade weitere Umfragen, um die der vorherigen Monate zu sehen";
|
||||
"poll_history_no_active_poll_period_text" = "Für die vergangenen %@ Tage sind keine aktiven Umfragen verfügbar. Lade weitere Umfragen, um die der vorherigen Monate zu sehen";
|
||||
"poll_history_load_more" = "Weitere Umfragen laden";
|
||||
"poll_history_loading_text" = "Zeige Umfragen an";
|
||||
"poll_history_fetching_error" = "Fehler beim Laden der Umfragen.";
|
||||
"key_backup_recover_from_private_key_progress" = "%@% % abgeschlossen";
|
||||
"voice_broadcast_playback_unable_to_decrypt" = "Entschlüsseln der Sprachübertragung nicht möglich.";
|
||||
"home_context_menu_mark_as_unread" = "Als ungelesen markieren";
|
||||
"wysiwyg_composer_format_action_un_indent" = "Einrückung verringern";
|
||||
"wysiwyg_composer_format_action_indent" = "Einrückung erhöhen";
|
||||
"settings_push_rules_error" = "Ein Fehler ist während der Aktualisierung deiner Benachrichtigungseinstellungen aufgetreten. Bitte versuche die Option erneut umzuschalten.";
|
||||
"poll_history_detail_view_in_timeline" = "Umfrage in Verlauf anzeigen";
|
||||
|
||||
@@ -96,6 +96,7 @@
|
||||
// Accessibility
|
||||
"accessibility_checkbox_label" = "checkbox";
|
||||
"accessibility_button_label" = "button";
|
||||
"accessibility_selected" = "selected";
|
||||
|
||||
// MARK: Onboarding
|
||||
"onboarding_splash_register_button_title" = "Create account";
|
||||
@@ -758,6 +759,7 @@ Tap the + to start adding people.";
|
||||
"settings_your_keywords" = "Your Keywords";
|
||||
"settings_new_keyword" = "Add new Keyword";
|
||||
"settings_mentions_and_keywords_encryption_notice" = "You won’t get notifications for mentions & keywords in encrypted rooms on mobile.";
|
||||
"settings_push_rules_error" = "An error occurred when updating your notification preferences. Please try to toggle your option again.";
|
||||
|
||||
"settings_enable_callkit" = "Integrated calling";
|
||||
"settings_callkit_info" = "Receive incoming calls on your lock screen. See your %@ calls in the system's call history. If iCloud is enabled, this call history will be shared with Apple.";
|
||||
@@ -803,6 +805,9 @@ Tap the + to start adding people.";
|
||||
"settings_labs_enable_new_app_layout" = "New Application Layout";
|
||||
"settings_labs_enable_wysiwyg_composer" = "Try out the rich text editor";
|
||||
"settings_labs_enable_voice_broadcast" = "Voice broadcast";
|
||||
"settings_labs_enable_crypto_sdk" = "Rust end-to-end encryption";
|
||||
"settings_labs_confirm_crypto_sdk" = "Please be advised that as this feature is still in its experimental stage, it may not function as expected and could potentially have unintended consequences. To revert the feature, simply log out and log back in. Use at your own discretion and with caution.";
|
||||
"settings_labs_disable_crypto_sdk" = "Rust end-to-end encryption (log out to disable)";
|
||||
|
||||
"settings_version" = "Version %@";
|
||||
"settings_olm_version" = "Olm Version %@";
|
||||
@@ -982,6 +987,7 @@ Tap the + to start adding people.";
|
||||
"room_details_title_for_dm" = "Details";
|
||||
"room_details_people" = "Members";
|
||||
"room_details_files" = "Uploads";
|
||||
"room_details_polls" = "Poll history";
|
||||
"room_details_search" = "Search room";
|
||||
"room_details_integrations" = "Integrations";
|
||||
"room_details_settings" = "Settings";
|
||||
@@ -1464,6 +1470,7 @@ Tap the + to start adding people.";
|
||||
|
||||
// Recover from private key
|
||||
"key_backup_recover_from_private_key_info" = "Restoring backup…";
|
||||
"key_backup_recover_from_private_key_progress" = "%@%% Complete";
|
||||
|
||||
// Recover from passphrase
|
||||
|
||||
@@ -1522,7 +1529,7 @@ Tap the + to start adding people.";
|
||||
"device_verification_cancelled_by_me" = "The verification has been cancelled. Reason: %@";
|
||||
"device_verification_error_cannot_load_device" = "Cannot load session information.";
|
||||
|
||||
// Mark: Incoming
|
||||
// MARK: Incoming
|
||||
"device_verification_incoming_title" = "Incoming Verification Request";
|
||||
"device_verification_incoming_description_1" = "Verify this session to mark it as trusted. Trusting sessions of partners gives you extra peace of mind when using end-to-end encrypted messages.";
|
||||
"device_verification_incoming_description_2" = "Verifying this session will mark it as trusted, and also mark your session as trusted to the partner.";
|
||||
@@ -1974,6 +1981,7 @@ Tap the + to start adding people.";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_migrating_data" = "Migrating data\n%@ %%";
|
||||
"launch_loading_server_syncing" = "Syncing with the server";
|
||||
"launch_loading_server_syncing_nth_attempt" = "Syncing with the server\n(%@ attempt)";
|
||||
"launch_loading_processing_response" = "Processing data\n%@ %%";
|
||||
@@ -1993,6 +2001,7 @@ Tap the + to start adding people.";
|
||||
"home_context_menu_normal_priority" = "Normal priority";
|
||||
"home_context_menu_leave" = "Leave";
|
||||
"home_context_menu_mark_as_read" = "Mark as read";
|
||||
"home_context_menu_mark_as_unread" = "Mark as unread";
|
||||
"home_syncing" = "Syncing";
|
||||
|
||||
// MARK: - Favourites
|
||||
@@ -2011,12 +2020,12 @@ Tap the + to start adding people.";
|
||||
"share_invite_link_room_text" = "Hey, join this room on %@";
|
||||
"share_invite_link_space_text" = "Hey, join this space on %@";
|
||||
|
||||
// Mark: - Room avatar view
|
||||
// MARK: - Room avatar view
|
||||
|
||||
"room_avatar_view_accessibility_label" = "avatar";
|
||||
"room_avatar_view_accessibility_hint" = "Change room avatar";
|
||||
|
||||
// Mark: - Room creation introduction cell
|
||||
// MARK: - Room creation introduction cell
|
||||
|
||||
"room_intro_cell_add_participants_action" = "Add people";
|
||||
|
||||
@@ -2033,7 +2042,7 @@ Tap the + to start adding people.";
|
||||
"room_intro_cell_information_dm_sentence2" = "Only the two of you are in this conversation, no one else can join.";
|
||||
"room_intro_cell_information_multiple_dm_sentence2" = "Only you are in this conversation, unless any of you invites someone to join.";
|
||||
|
||||
// Mark: - Room invite
|
||||
// MARK: - Room invite
|
||||
|
||||
"room_invite_to_space_option_title" = "To %@";
|
||||
"room_invite_to_space_option_detail" = "They can explore %@, but won’t be a member of %@.";
|
||||
@@ -2042,7 +2051,7 @@ Tap the + to start adding people.";
|
||||
"room_invite_not_enough_permission" = "You do not have permission to invite people to this room";
|
||||
"space_invite_not_enough_permission" = "You do not have permission to invite people to this space";
|
||||
|
||||
// Mark: - Spaces
|
||||
// MARK: - Spaces
|
||||
|
||||
"space_feature_unavailable_title" = "Spaces aren’t here yet";
|
||||
"space_feature_unavailable_subtitle" = "Spaces aren't on iOS yet, but you can use them now on Web and Desktop";
|
||||
@@ -2099,7 +2108,7 @@ Tap the + to start adding people.";
|
||||
|
||||
"spaces_feature_not_available" = "This feature isn't available here. For now, you can do this with %@ on your computer.";
|
||||
|
||||
// Mark: - Space Creation
|
||||
// MARK: - Space Creation
|
||||
|
||||
"spaces_creation_hint" = "Spaces are a new way to group rooms and people.";
|
||||
"spaces_creation_visibility_title" = "What type of space do you want to create?";
|
||||
@@ -2158,7 +2167,7 @@ Tap the + to start adding people.";
|
||||
|
||||
"spaces_add_room_missing_permission_message" = "You do not have permissions to add rooms to this space.";
|
||||
|
||||
// Mark: Leave space
|
||||
// MARK: Leave space
|
||||
|
||||
"leave_space_action" = "Leave space";
|
||||
"leave_space_and_one_room" = "Leave space and 1 room";
|
||||
@@ -2171,17 +2180,17 @@ Tap the + to start adding people.";
|
||||
|
||||
"room_event_action_reaction_more" = "%@ more";
|
||||
|
||||
// Mark: Avatar
|
||||
// MARK: Avatar
|
||||
|
||||
"space_avatar_view_accessibility_label" = "avatar";
|
||||
"space_avatar_view_accessibility_hint" = "Change space avatar";
|
||||
|
||||
// Mark: - User avatar view
|
||||
// MARK: - User avatar view
|
||||
|
||||
"user_avatar_view_accessibility_label" = "avatar";
|
||||
"user_avatar_view_accessibility_hint" = "Change user avatar";
|
||||
|
||||
// Mark: - Side menu
|
||||
// MARK: - Side menu
|
||||
|
||||
"side_menu_reveal_action_accessibility_label" = "Left panel";
|
||||
"side_menu_action_invite_friends" = "Invite friends";
|
||||
@@ -2191,7 +2200,7 @@ Tap the + to start adding people.";
|
||||
"side_menu_app_version" = "Version %@";
|
||||
"side_menu_coach_message" = "Swipe right or tap to see all rooms";
|
||||
|
||||
// Mark: - Voice Messages
|
||||
// MARK: - Voice Messages
|
||||
|
||||
"voice_message_release_to_send" = "Hold to record, release to send";
|
||||
"voice_message_remaining_recording_time" = "%@s left";
|
||||
@@ -2200,12 +2209,13 @@ Tap the + to start adding people.";
|
||||
"voice_message_broadcast_in_progress_title" = "Can't start voice message";
|
||||
"voice_message_broadcast_in_progress_message" = "You can't start a voice message as you are currently recording a live broadcast. Please end your live broadcast in order to start recording a voice message";
|
||||
|
||||
// Mark: - Voice broadcast
|
||||
// MARK: - Voice Broadcast
|
||||
"voice_broadcast_unauthorized_title" = "Can't start a new voice broadcast";
|
||||
"voice_broadcast_permission_denied_message" = "You don't have the required permissions to start a voice broadcast in this room. Contact a room administrator to upgrade your permissions.";
|
||||
"voice_broadcast_blocked_by_someone_else_message" = "Someone else is already recording a voice broadcast. Wait for their voice broadcast to end to start a new one.";
|
||||
"voice_broadcast_already_in_progress_message" = "You are already recording a voice broadcast. Please end your current voice broadcast to start a new one.";
|
||||
"voice_broadcast_playback_loading_error" = "Unable to play this voice broadcast.";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Voice broadcast";
|
||||
"voice_broadcast_live" = "Live";
|
||||
"voice_broadcast_tile" = "Voice broadcast";
|
||||
"voice_broadcast_time_left" = "%@ left";
|
||||
@@ -2213,8 +2223,14 @@ Tap the + to start adding people.";
|
||||
"voice_broadcast_stop_alert_title" = "Stop live broadcasting?";
|
||||
"voice_broadcast_stop_alert_description" = "Are you sure you want to stop your live broadcast? This will end the broadcast, and the full recording will be available in the room.";
|
||||
"voice_broadcast_stop_alert_agree_button" = "Yes, stop";
|
||||
"voice_broadcast_voip_cannot_start_title" = "Can’t start a call";
|
||||
"voice_broadcast_voip_cannot_start_description" = "You can’t start a call as you are currently recording a live broadcast. Please end your live broadcast in order to start a call.";
|
||||
"voice_broadcast_connection_error_title" = "Connection error";
|
||||
"voice_broadcast_connection_error_message" = "Unfortunately we’re unable to start a recording right now. Please try again later.";
|
||||
"voice_broadcast_recorder_connection_error" = "Connection error - Recording paused";
|
||||
"voice_broadcast_playback_unable_to_decrypt" = "Unable to decrypt this voice broadcast.";
|
||||
|
||||
// Mark: - Version check
|
||||
// MARK: - Version check
|
||||
|
||||
"version_check_banner_title_supported" = "We’re ending support for iOS %@";
|
||||
"version_check_banner_subtitle_supported" = "We will soon be ending support for %@ on iOS %@. To continue using %@ to its full potential, we advise you to upgrade your version of iOS.";
|
||||
@@ -2230,7 +2246,7 @@ Tap the + to start adding people.";
|
||||
"version_check_modal_subtitle_deprecated" = "We've been working on enhancing %@ for a faster and more polished experience. Unfortunately your current version of iOS is not compatible with some of those fixes and is no longer supported.\nWe're advising you to upgrade your operating system to use %@ to its full potential.";
|
||||
"version_check_modal_action_title_deprecated" = "Find out how";
|
||||
|
||||
// Mark: - All Chats
|
||||
// MARK: - All Chats
|
||||
|
||||
"all_chats_title" = "All chats";
|
||||
"all_chats_section_title" = "Chats";
|
||||
@@ -2265,21 +2281,12 @@ Tap the + to start adding people.";
|
||||
"all_chats_edit_menu_leave_space" = "Leave %@";
|
||||
"all_chats_edit_menu_space_settings" = "Space settings";
|
||||
|
||||
"all_chats_onboarding_page_title1" = "Welcome to a new view!";
|
||||
"all_chats_onboarding_page_message1" = "To simplify your Element, tabs are now optional. Manage them using the top-right menu.";
|
||||
"all_chats_onboarding_page_title2" = "Access Spaces";
|
||||
"all_chats_onboarding_page_message2" = "Access your Spaces (bottom-left) faster and easier than ever before.";
|
||||
"all_chats_onboarding_page_title3" = "Give Feedback";
|
||||
"all_chats_onboarding_page_message3" = "Tap your profile to let us know what you think.";
|
||||
"all_chats_onboarding_title" = "What's new";
|
||||
"all_chats_onboarding_try_it" = "Try it out";
|
||||
|
||||
// Mark: - Room invites
|
||||
// MARK: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Nothing new.";
|
||||
"room_invites_empty_view_information" = "This is where your invites appear.";
|
||||
|
||||
// Mark: - Space Selector
|
||||
// MARK: - Space Selector
|
||||
|
||||
"space_selector_title" = "My spaces";
|
||||
"space_selector_empty_view_title" = "No spaces yet.";
|
||||
@@ -2289,7 +2296,21 @@ Tap the + to start adding people.";
|
||||
"space_detail_nav_title" = "Space detail";
|
||||
"space_invite_nav_title" = "Space invite";
|
||||
|
||||
// Mark: - Polls
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "Poll history";
|
||||
"poll_history_loading_text" = "Displaying polls";
|
||||
"poll_history_active_segment_title" = "Active polls";
|
||||
"poll_history_past_segment_title" = "Past polls";
|
||||
"poll_history_no_active_poll_text" = "There are no active polls in this room";
|
||||
"poll_history_no_past_poll_text" = "There are no past polls in this room";
|
||||
"poll_history_no_active_poll_period_text" = "There are no active polls for the past %@ days. Load more polls to view polls for previous months";
|
||||
"poll_history_no_past_poll_period_text" = "There are no past polls for the past %@ days. Load more polls to view polls for previous months";
|
||||
"poll_history_detail_view_in_timeline" = "View poll in timeline";
|
||||
"poll_history_load_more" = "Load more polls";
|
||||
"poll_history_fetching_error" = "Error fetching polls.";
|
||||
|
||||
// MARK: - Polls
|
||||
|
||||
"poll_edit_form_create_poll" = "Create poll";
|
||||
|
||||
@@ -2353,6 +2374,8 @@ Tap the + to start adding people.";
|
||||
|
||||
"poll_timeline_ended_text" = "Ended the poll";
|
||||
|
||||
"poll_timeline_reply_ended_poll" = "Ended poll";
|
||||
|
||||
// MARK: - Location sharing
|
||||
|
||||
"location_sharing_title" = "Location";
|
||||
@@ -2538,7 +2561,7 @@ To enable access, tap Settings> Location and select Always";
|
||||
"user_session_overview_session_details_button_title" = "Session details";
|
||||
|
||||
|
||||
// Mark: - WYSIWYG Composer
|
||||
// MARK: - WYSIWYG Composer
|
||||
|
||||
// Send Media Actions
|
||||
"wysiwyg_composer_start_action_media_picker" = "Photo Library";
|
||||
@@ -2557,6 +2580,12 @@ To enable access, tap Settings> Location and select Always";
|
||||
"wysiwyg_composer_format_action_strikethrough" = "Apply underline format";
|
||||
"wysiwyg_composer_format_action_link" = "Apply link format";
|
||||
"wysiwyg_composer_format_action_inline_code" = "Apply inline code format";
|
||||
"wysiwyg_composer_format_action_unordered_list" = "Toggle bulleted list";
|
||||
"wysiwyg_composer_format_action_ordered_list" = "Toggle numbered list";
|
||||
"wysiwyg_composer_format_action_code_block" = "Toggle code block";
|
||||
"wysiwyg_composer_format_action_quote" = "Toggle quote";
|
||||
"wysiwyg_composer_format_action_indent" = "Increase indentation";
|
||||
"wysiwyg_composer_format_action_un_indent" = "Decrease indentation";
|
||||
|
||||
// Links
|
||||
"wysiwyg_composer_link_action_text" = "Text";
|
||||
|
||||
@@ -118,3 +118,6 @@
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"LOCATION_FROM_USER" = "%@ jagas oma asukohta";
|
||||
|
||||
/* New voice broadcast from a specific person, not referencing a room. */
|
||||
"VOICE_BROADCAST_FROM_USER" = "%@ alustas ringhäälingukõnet";
|
||||
|
||||
@@ -1473,7 +1473,7 @@
|
||||
|
||||
// Mark: - Polls
|
||||
|
||||
"poll_edit_form_create_poll" = "Koosta üks küsitlus";
|
||||
"poll_edit_form_create_poll" = "Loo selline küsitlus";
|
||||
"settings_discovery_accept_terms" = "Nõustu isikutuvastusserveri tingimustega";
|
||||
"poll_timeline_not_closed_action" = "Sobib";
|
||||
"poll_timeline_not_closed_subtitle" = "Palun proovi uuesti";
|
||||
@@ -1548,9 +1548,9 @@
|
||||
// Onboarding
|
||||
"onboarding_splash_register_button_title" = "Loo kasutajakonto";
|
||||
"poll_edit_form_poll_type_closed_description" = "Tulemusi kuvame vaid siis, kui küsitlus on lõppenud";
|
||||
"poll_edit_form_poll_type_closed" = "Küsitlus on lõppenud";
|
||||
"poll_edit_form_poll_type_closed" = "Suletud valikutega küsitlus";
|
||||
"poll_edit_form_poll_type_open_description" = "Osalejad näevad tulemusi peale oma valiku salvestamist";
|
||||
"poll_edit_form_poll_type_open" = "Ava küsitlus";
|
||||
"poll_edit_form_poll_type_open" = "Avatud valikutega küsitlus";
|
||||
"poll_edit_form_update_failure_subtitle" = "Palun proovi uuesti";
|
||||
"poll_edit_form_update_failure_title" = "Küsitluse muutmine ei õnnestunud";
|
||||
"poll_edit_form_poll_type" = "Küsitluse tüüp";
|
||||
@@ -2417,14 +2417,6 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Uut teavet ei leidu.";
|
||||
"all_chats_onboarding_try_it" = "Proovi nüüd";
|
||||
"all_chats_onboarding_title" = "Mida on meil uut";
|
||||
"all_chats_onboarding_page_message3" = "Kui soovid meile teada anda oma arvamustest, siis klõpsi oma profiili ikooni.";
|
||||
"all_chats_onboarding_page_title3" = "Jaga tagasisidet";
|
||||
"all_chats_onboarding_page_message2" = "Kogukonnad leiad alt vasakult kiiremini ja lihtsamini, kui varem.";
|
||||
"all_chats_onboarding_page_title2" = "Ligipääs kogukondadele";
|
||||
"all_chats_onboarding_page_message1" = "Et Element'i kasutamine oleks lihtsam, siis kaardid on nüüd valikulised. Neid saad hallata ülal paremal avanevast menüüst.";
|
||||
"all_chats_onboarding_page_title1" = "Meie liidesel on nüüd uus vaade!";
|
||||
"all_chats_nothing_found_placeholder_message" = "Proovi muuta oma otsingut.";
|
||||
"all_chats_nothing_found_placeholder_title" = "Mitte midagi ei leidu.";
|
||||
"all_chats_empty_unreads_placeholder_message" = "Kui sul on lugemata sõnumeid, siis nad on siit leitavad.";
|
||||
@@ -2640,3 +2632,44 @@
|
||||
"poll_timeline_decryption_error" = "Krüptimisvigade tõttu jääb osa hääli lugemata";
|
||||
"voice_message_broadcast_in_progress_title" = "Häälsõnumi salvestamine või esitamine ei õnnestu";
|
||||
"voice_message_broadcast_in_progress_message" = "Kuna sa hetkel salvestad ringhäälingukõnet, siis häälsõnumi salvestamine või esitamine ei õnnestu. Selleks palun lõpeta ringhäälingukõne";
|
||||
"poll_timeline_ended_text" = "Küsitlus on lõppenud";
|
||||
"voice_broadcast_voip_cannot_start_description" = "Kuna sa hetkel salvestad ringhäälingukõnet, siis tavakõne algatamine ei õnnestu. Kõne alustamiseks palun lõpeta ringhäälingukõne.";
|
||||
"voice_broadcast_voip_cannot_start_title" = "Kõne algatamine ei õnnestu";
|
||||
"poll_history_no_past_poll_text" = "Selles jututoas pole varasemaid küsitlusi";
|
||||
"poll_history_no_active_poll_text" = "Selles jututoas pole käimasolevaid küsitlusi";
|
||||
"poll_history_past_segment_title" = "Varasemad küsitlused";
|
||||
"poll_history_active_segment_title" = "Käimasolevad küsitlused";
|
||||
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "Küsitluste ajalugu";
|
||||
"room_details_polls" = "Küsitluste ajalugu";
|
||||
"accessibility_selected" = "valitud";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Ringhäälingukõne";
|
||||
"voice_broadcast_connection_error_message" = "Kahjuks me ei saa hetkel salvestamist alustada. Palun proovi hiljem uuesti.";
|
||||
"voice_broadcast_connection_error_title" = "Ühenduse viga";
|
||||
"wysiwyg_composer_format_action_quote" = "Lülita tsiteerimine sisse/välja";
|
||||
"wysiwyg_composer_format_action_code_block" = "Lülita koodiblokk sisse/välja";
|
||||
"wysiwyg_composer_format_action_ordered_list" = "Lülita nummerdatud loend sisse/välja";
|
||||
"wysiwyg_composer_format_action_unordered_list" = "Lülita täpploend sisse/välja";
|
||||
"voice_broadcast_recorder_connection_error" = "Viga võrguühenduses - salvestamine on peatatud";
|
||||
"poll_timeline_reply_ended_poll" = "Lõppenud küsitlus";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_migrating_data" = "Tõstame andmeid ümber\n%@ %%";
|
||||
"settings_labs_disable_crypto_sdk" = "Rust'i-põhine läbiv krüptimine (väljalülitamiseks pead välja logima)";
|
||||
"settings_labs_confirm_crypto_sdk" = "Palun arvesta, et see funktsionaalsus on alles katseline ja ei pruugi toimida eesmärgipäraselt. Kui ta juba on kasutusel, siis väljalülitamiseks pead hiljem korraks võrgust välja logima. Jätka ettevaatlikult ja omal äranägemisel.";
|
||||
"settings_labs_enable_crypto_sdk" = "Rust'i-põhine läbiv krüptimine";
|
||||
"poll_history_load_more" = "Laadi veel küsitlusi";
|
||||
"poll_history_no_active_poll_period_text" = "Möödunud %@ päeva jooksul polnud ühtegi toimumas olnud küsitlust. Varasemate kuude vaatamiseks laadi veel küsitlusi";
|
||||
"poll_history_no_past_poll_period_text" = "Möödunud %@ päeva jooksul polnud ühtegi lõppenud küsitlust. Varasemate kuude vaatamiseks laadi veel küsitlusi";
|
||||
"poll_history_loading_text" = "Küsitluste kuvamise ootel";
|
||||
"poll_history_fetching_error" = "Viga küsitluste laadimisel.";
|
||||
"key_backup_recover_from_private_key_progress" = "%@%% tehtud";
|
||||
"voice_broadcast_playback_unable_to_decrypt" = "Selle ringhäälingukõne dekrüptimine ei õnnestu.";
|
||||
"home_context_menu_mark_as_unread" = "Märgi mitteloetuks";
|
||||
"wysiwyg_composer_format_action_un_indent" = "Vähenda taandrida";
|
||||
"wysiwyg_composer_format_action_indent" = "Suurenda taandrida";
|
||||
"settings_push_rules_error" = "Teavituste eelistuste muutmisel tekkis viga. Palun proovi sama valikut uuesti sisse/välja lülitada.";
|
||||
"poll_history_detail_view_in_timeline" = "Näita küsitlust ajajoonel";
|
||||
|
||||
@@ -118,3 +118,6 @@
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"LOCATION_FROM_USER" = "%@ a partagé sa localisation";
|
||||
|
||||
/* New voice broadcast from a specific person, not referencing a room. */
|
||||
"VOICE_BROADCAST_FROM_USER" = "%@ a lancé une diffusion vocale";
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
"room_recents_no_conversation" = "Aucun salon";
|
||||
"room_recents_low_priority_section" = "PRIORITÉ BASSE";
|
||||
"room_recents_invites_section" = "INVITATIONS";
|
||||
"room_recents_start_chat_with" = "Commencer une discussion";
|
||||
"room_recents_start_chat_with" = "Nouveau message direct";
|
||||
"room_recents_create_empty_room" = "Créer un salon";
|
||||
"room_recents_join_room" = "Rejoindre le salon";
|
||||
"room_recents_join_room_title" = "Rejoindre un salon";
|
||||
@@ -113,7 +113,7 @@
|
||||
"people_conversation_section" = "DISCUSSIONS";
|
||||
"people_no_conversation" = "Aucune discussion";
|
||||
// Rooms tab
|
||||
"room_directory_no_public_room" = "Aucun salon public disponible";
|
||||
"room_directory_no_public_room" = "Aucun forum disponible";
|
||||
// Groups tab
|
||||
"group_invite_section" = "INVITATIONS";
|
||||
"group_section" = "COMMUNAUTÉS";
|
||||
@@ -166,20 +166,20 @@
|
||||
"room_participants_now" = "maintenant";
|
||||
"room_participants_ago" = "d’inactivité";
|
||||
"room_participants_action_section_admin_tools" = "Outils d’administration";
|
||||
"room_participants_action_section_direct_chats" = "Conversations privées";
|
||||
"room_participants_action_section_direct_chats" = "Messages directs";
|
||||
"room_participants_action_section_devices" = "Sessions";
|
||||
"room_participants_action_section_other" = "Options";
|
||||
"room_participants_action_invite" = "Inviter";
|
||||
"room_participants_action_leave" = "Quitter ce salon";
|
||||
"room_participants_action_remove" = "Exclure de ce salon";
|
||||
"room_participants_action_ban" = "Bannir de ce salon";
|
||||
"room_participants_action_ban" = "Interdire l’accès au salon (définitif)";
|
||||
"room_participants_action_unban" = "Révoquer le bannissement";
|
||||
"room_participants_action_ignore" = "Masquer tous les messages de cet utilisateur";
|
||||
"room_participants_action_unignore" = "Afficher tous les messages de cet utilisateur";
|
||||
"room_participants_action_set_default_power_level" = "Rétrograder en utilisateur normal";
|
||||
"room_participants_action_set_moderator" = "Nommer modérateur";
|
||||
"room_participants_action_set_admin" = "Nommer administrateur";
|
||||
"room_participants_action_start_new_chat" = "Commencer une nouvelle discussion";
|
||||
"room_participants_action_start_new_chat" = "Nouveau message direct";
|
||||
"room_participants_action_start_voice_call" = "Commencer un appel audio";
|
||||
"room_participants_action_start_video_call" = "Commencer un appel vidéo";
|
||||
"room_participants_action_mention" = "Mentionner";
|
||||
@@ -399,7 +399,7 @@
|
||||
"directory_server_picker_title" = "Sélectionner un répertoire";
|
||||
"directory_server_all_rooms" = "Tous les salons sur le serveur %@";
|
||||
"directory_server_all_native_rooms" = "Tous les salons Matrix natifs";
|
||||
"directory_server_type_homeserver" = "Saisir un serveur d’accueil pour lister ses salons publics";
|
||||
"directory_server_type_homeserver" = "Saisir un serveur d’accueil pour lister ses forums";
|
||||
"directory_server_placeholder" = "matrix.org";
|
||||
// Others
|
||||
"or" = "ou";
|
||||
@@ -407,7 +407,7 @@
|
||||
"today" = "Aujourd’hui";
|
||||
"yesterday" = "Hier";
|
||||
"network_offline_prompt" = "La connexion Internet semble être hors-ligne.";
|
||||
"public_room_section_title" = "Salons publics (sur %@) :";
|
||||
"public_room_section_title" = "Forums (sur %@) :";
|
||||
"bug_report_prompt" = "L’application s’est arrêtée brusquement la dernière fois. Voulez-vous envoyer un rapport d’anomalie ?";
|
||||
"rage_shake_prompt" = "Vous semblez secouer le téléphone avec frustration. Souhaitez-vous soumettre un rapport d’anomalie ?";
|
||||
"do_not_ask_again" = "Ne plus demander";
|
||||
@@ -1211,8 +1211,8 @@
|
||||
"create_room_section_header_address" = "ADRESSE";
|
||||
"create_room_show_in_directory" = "Afficher le salon dans le répertoire";
|
||||
"create_room_section_footer_type" = "Les personnes ne rejoignent un salon privé que sur invitation.";
|
||||
"create_room_type_public" = "Salon public (tout le monde)";
|
||||
"create_room_type_private" = "Salon privé (seulement sur invitation)";
|
||||
"create_room_type_public" = "Forum (tout le monde)";
|
||||
"create_room_type_private" = "Salon (seulement sur invitation)";
|
||||
"create_room_section_header_type" = "QUI PEUT Y ACCÉDER";
|
||||
"create_room_section_footer_encryption" = "Le chiffrement ne peut pas être désactivé ensuite.";
|
||||
"create_room_enable_encryption" = "Activer le chiffrement";
|
||||
@@ -1317,7 +1317,7 @@
|
||||
"room_details_room_name_for_dm" = "Nom";
|
||||
"room_details_photo_for_dm" = "Photo";
|
||||
"room_details_title_for_dm" = "Détails";
|
||||
"settings_show_NSFW_public_rooms" = "Afficher les salons publics au contenu choquant";
|
||||
"settings_show_NSFW_public_rooms" = "Afficher les forums au contenu choquant";
|
||||
"external_link_confirmation_message" = "Le lien %@ vous emmène vers un autre site : %@\n\nÊtes vous sûr de vouloir poursuivre ?";
|
||||
"external_link_confirmation_title" = "Inspectez ce lien";
|
||||
"room_open_dialpad" = "Pavé de numérotation";
|
||||
@@ -1494,7 +1494,7 @@
|
||||
"spaces_empty_space_title" = "Cet espace n’a pas (encore) de salon";
|
||||
"space_tag" = "espace";
|
||||
"spaces_suggested_room" = "Recommandé";
|
||||
"spaces_explore_rooms" = "Parcourir les salons";
|
||||
"spaces_explore_rooms" = "Rejoindre un forum";
|
||||
"leave_space_and_all_rooms_action" = "Quitter tous les salons et espaces";
|
||||
"leave_space_only_action" = "Ne quitter aucun salon";
|
||||
"leave_space_message_admin_warning" = "Vous êtes administrateur de cet espace. Assurez-vous d’avoir transmis les droits d’administration à un autre membre avant de partir.";
|
||||
@@ -1723,7 +1723,7 @@
|
||||
"set_default_power_level" = "Réinitialiser le rang";
|
||||
"set_moderator" = "Nommer modérateur";
|
||||
"set_admin" = "Nommer administrateur";
|
||||
"start_chat" = "Nouvelle conversation privée";
|
||||
"start_chat" = "Nouveau message direct";
|
||||
"start_voice_call" = "Commencer un appel audio";
|
||||
"start_video_call" = "Commencer un appel vidéo";
|
||||
"mention" = "Mentionner";
|
||||
@@ -1959,8 +1959,8 @@
|
||||
"membership_ban" = "Banni";
|
||||
"num_members_one" = "%@ utilisateur";
|
||||
"num_members_other" = "%@ utilisateurs";
|
||||
"kick" = "Expulser";
|
||||
"ban" = "Bannir";
|
||||
"kick" = "Retirer du salon (réversible)";
|
||||
"ban" = "Interdire l’accès au salon (définitif)";
|
||||
"unban" = "Révoquer le bannissement";
|
||||
"message_unsaved_changes" = "Il y a des modifications non enregistrées. Quitter les annulera.";
|
||||
// Login Screen
|
||||
@@ -2440,7 +2440,6 @@
|
||||
"room_access_space_chooser_other_spaces_section_info" = "Ce sont probablement des choses auxquelles les autres admins de %@ participent.";
|
||||
"authentication_choose_password_not_verified_message" = "Vérifiez votre boîte de réception";
|
||||
"authentication_choose_password_not_verified_title" = "Email non vérifié";
|
||||
"all_chats_onboarding_page_title3" = "Donner mon avis";
|
||||
|
||||
// MARK: User sessions management
|
||||
|
||||
@@ -2460,20 +2459,13 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Rien de neuf.";
|
||||
"all_chats_onboarding_try_it" = "Essayez";
|
||||
"all_chats_onboarding_title" = "Quoi de neuf";
|
||||
"all_chats_onboarding_page_message3" = "Appuyez sur votre profil pour nous faire vos retours.";
|
||||
"all_chats_onboarding_page_message2" = "Accédez à vos espaces (en bas à gauche) plus rapidement et facilement qu’avant.";
|
||||
"all_chats_onboarding_page_title2" = "Accéder aux espaces";
|
||||
"all_chats_onboarding_page_message1" = "Pour simplifier Element, les onglets sont désormais facultatifs. Gérez les depuis le menu en haut à droite.";
|
||||
"all_chats_onboarding_page_title1" = "Bienvenu dans une nouvelle vue !";
|
||||
"all_chats_edit_menu_space_settings" = "Paramètres de l’espace";
|
||||
"all_chats_edit_menu_leave_space" = "Quitter %@";
|
||||
"all_chats_user_menu_settings" = "Paramètres utilisateur";
|
||||
"room_recents_recently_viewed_section" = "Récemment vus";
|
||||
"all_chats_nothing_found_placeholder_message" = "Essayez d’affiner votre recherche.";
|
||||
"all_chats_nothing_found_placeholder_title" = "Aucun résultat.";
|
||||
"all_chats_empty_unreads_placeholder_message" = "C'est ici que vos messages non-lus s’afficheront lorsque vous en aurez.";
|
||||
"all_chats_empty_unreads_placeholder_message" = "C'est ici que vos messages non lus s’afficheront lorsque vous en aurez.";
|
||||
"all_chats_empty_list_placeholder_title" = "Plus rien à voir.";
|
||||
"all_chats_empty_view_information" = "La messagerie sécurisée tout en un pour les équipes, les amis, et les organisations. Créez une discussion ou rejoignez un salon pour démarrer.";
|
||||
"all_chats_empty_space_information" = "Les espaces sont un nouveau moyen de grouper les salons et les gens. Ajoutez un salon, ou créez en un nouveau à l’aide du bouton en bas à droite.";
|
||||
@@ -2489,14 +2481,14 @@
|
||||
"all_chats_edit_layout_add_filters_title" = "Filtrez vos messages";
|
||||
"all_chats_edit_layout_add_section_message" = "Épinglez des sections à l’accueil pour y accéder plus rapidement";
|
||||
"all_chats_edit_layout_add_section_title" = "Ajouter une section à l’accueil";
|
||||
"all_chats_edit_layout_unreads" = "Non-lus";
|
||||
"all_chats_edit_layout_unreads" = "Non lus";
|
||||
"all_chats_edit_layout_recents" = "Récents";
|
||||
"all_chats_edit_layout" = "Préférences d’agencement";
|
||||
"all_chats_section_title" = "Discussions";
|
||||
|
||||
// Mark: - All Chats
|
||||
|
||||
"all_chats_title" = "Tous mes chats";
|
||||
"all_chats_title" = "Accueil";
|
||||
"spaces_subspace_creation_visibility_message" = "L’espace créé sera ajouté à %@.";
|
||||
"spaces_subspace_creation_visibility_title" = "Quel type de sous-espace voulez-vous créer ?";
|
||||
"spaces_explore_rooms_format" = "Parcourir %@";
|
||||
@@ -2537,7 +2529,7 @@
|
||||
"device_name_desktop" = "%@ Bureau";
|
||||
"user_inactive_session_item_with_date" = "Inactif depuis 90 jours ou plus (%@)";
|
||||
"user_inactive_session_item" = "Inactif depuis 90 jours ou plus";
|
||||
"user_session_item_details" = "%@ · Dernière activité %@";
|
||||
"user_session_item_details" = "%1$@ · %2$@";
|
||||
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@ : %@";
|
||||
@@ -2614,3 +2606,136 @@
|
||||
"manage_session_name_info" = "Gardez en tête que les noms des sessions sont aussi visibles par les personnes avec qui vous communiquez. %@";
|
||||
"manage_session_name_hint" = "Personnaliser les noms des sessions peut vous aider à reconnaître vos appareils plus facilement.";
|
||||
"settings_labs_enable_wysiwyg_composer" = "Essayez le compositeur de messages visuel";
|
||||
"settings_labs_enable_voice_broadcast" = "Diffusion vocale";
|
||||
"wysiwyg_composer_format_action_un_indent" = "Diminuer le retrait";
|
||||
"wysiwyg_composer_format_action_indent" = "Augmenter le retrait";
|
||||
"wysiwyg_composer_format_action_code_block" = "Bloc de code";
|
||||
"wysiwyg_composer_start_action_stickers" = "Autocollants";
|
||||
"user_session_rename_session_title" = "Renommer les sessions";
|
||||
"user_session_verified_session_description" = "Les sessions vérifiées sont toutes celles où vous vous êtes connecté à Element grâce à vos identifiants ou celles pour lesquelles vous avez confirmé votre identité à l'aide d'une autre session.\n\nCela signifie que vous êtes en possession de toutes les clés requises pour déchiffrer vos messages et montrer aux autres utilisateurs que vous faites confiance à cette session.";
|
||||
"poll_history_loading_text" = "Afficher les sondages";
|
||||
"voice_message_broadcast_in_progress_title" = "Impossible de démarrer l'enregistrement vocal";
|
||||
"home_context_menu_mark_as_unread" = "Marquer comme non lu";
|
||||
"launch_loading_processing_response" = "Traitement des données\n%@ %%";
|
||||
"notice_voice_broadcast_ended_by_you" = "Vous avez terminé une diffusion vocale.";
|
||||
"notice_voice_broadcast_ended" = "%@ a terminé une diffusion vocale.";
|
||||
"notice_voice_broadcast_live" = "Diffusion en direct";
|
||||
"deselect_all" = "Tout désélectionner";
|
||||
"wysiwyg_composer_link_action_edit_title" = "Modifier le lien";
|
||||
"wysiwyg_composer_link_action_create_title" = "Créer un lien";
|
||||
"wysiwyg_composer_link_action_link" = "Lien";
|
||||
|
||||
// Links
|
||||
"wysiwyg_composer_link_action_text" = "Texte";
|
||||
"wysiwyg_composer_format_action_quote" = "Citation";
|
||||
"wysiwyg_composer_format_action_ordered_list" = "Liste numérique";
|
||||
"wysiwyg_composer_format_action_unordered_list" = "Liste à puces";
|
||||
"wysiwyg_composer_format_action_inline_code" = "Formater comme code informatique";
|
||||
"wysiwyg_composer_format_action_link" = "Formater comme lien";
|
||||
"wysiwyg_composer_format_action_strikethrough" = "Souligner";
|
||||
"wysiwyg_composer_format_action_underline" = "Barrer";
|
||||
"wysiwyg_composer_format_action_italic" = "Mettre en italique";
|
||||
|
||||
// Formatting Actions
|
||||
"wysiwyg_composer_format_action_bold" = "Mettre en caractères gras";
|
||||
"wysiwyg_composer_start_action_voice_broadcast" = "Diffusion vocale";
|
||||
"wysiwyg_composer_start_action_text_formatting" = "Formatage du texte";
|
||||
"wysiwyg_composer_start_action_camera" = "Appareil photo";
|
||||
"wysiwyg_composer_start_action_location" = "Position";
|
||||
"wysiwyg_composer_start_action_polls" = "Sondages";
|
||||
"wysiwyg_composer_start_action_attachments" = "Pièces jointes";
|
||||
|
||||
|
||||
// MARK: - WYSIWYG Composer
|
||||
|
||||
// Send Media Actions
|
||||
"wysiwyg_composer_start_action_media_picker" = "Galerie photo";
|
||||
"user_session_details_last_activity" = "Dernière activité";
|
||||
"user_session_item_details_last_activity" = "Dernière activité %@";
|
||||
"user_other_session_menu_sign_out_sessions" = "Déconnecter %@ sessions";
|
||||
"user_other_session_selected_count" = "%@ sélectionnées";
|
||||
"user_other_session_menu_select_sessions" = "Sélectionnez des sessions";
|
||||
"user_other_session_clear_filter" = "Effacer les filtres";
|
||||
"user_other_session_no_unverified_sessions" = "Aucune session non vérifiée trouvée.";
|
||||
"user_other_session_no_verified_sessions" = "Aucune session vérifiée trouvée.";
|
||||
"user_other_session_no_inactive_sessions" = "Aucune session inactive trouvée.";
|
||||
"user_other_session_filter_menu_inactive" = "Inactives";
|
||||
"user_other_session_filter_menu_unverified" = "Non vérifiées";
|
||||
"user_other_session_filter_menu_verified" = "Vérifiées";
|
||||
"user_other_session_filter_menu_all" = "Toutes les sessions";
|
||||
"user_other_session_filter" = "Filtrer";
|
||||
"user_other_session_verified_sessions_header_subtitle" = "Pour augmenter la sécurité, veuillez déconnecter toutes les sessions qui vous semblent inconnues ou que vous n'utilisez plus.";
|
||||
"user_other_session_current_session_details" = "Votre session actuelle";
|
||||
"user_other_session_security_recommendation_title" = "Autres sessions";
|
||||
"user_session_rename_session_description" = "D'autres utilisateurs des conversations et salons que vous rejoignez peuvent consulter la liste complète de vos session.\n\nCela leur permet de confirmer qu'ils communiquent bien avec vous, mais cela signifie également qu'ils verront le nom que vous donnez à vos sessions.";
|
||||
"user_session_inactive_session_description" = "Les sessions inactives sont celles qui n'ont pas été utilisées depuis un certain temps, mais qui continuent de recevoir des clés de chiffrement.\n\nÉliminer ces sessions inactives augmente la sécurité et les performances, et facilite l'identification de nouvelles connexions suspectes.";
|
||||
"user_session_inactive_session_title" = "Sessions inactives";
|
||||
"user_session_permanently_unverified_session_description" = "Cette session de prend pas en charge le chiffrement et ne peut donc être vérifiée.\n\nVous ne pourrez pas intervenir dans les salons où le chiffrement est activé en utilisant cette session.\n\nPour une sécurité et confidentialité optimale, il est recommandé d'utiliser des clients Matrix qui prennent en charge le chiffrement.";
|
||||
"user_session_unverified_session_description" = "Les sessions non vérifiez sont celles qui sont connectées avec vos identifiants, mais qui n'ont pas passé les vérifications croisées.\n\nVous devriez passer en revue ces sessions car elles pourraient témoigner d'un usage malicieux de votre compte.";
|
||||
"user_session_unverified_session_title" = "Session non vérifiée";
|
||||
"user_session_verified_session_title" = "Sessions vérifiées";
|
||||
"user_session_got_it" = "Entendu";
|
||||
"user_other_session_verified_additional_info" = "Cette session est prête à l'échange de messages.";
|
||||
"user_other_session_permanently_unverified_additional_info" = "Cette session ne prend pas en charge le chiffrement et ne peut donc être vérifiée.";
|
||||
"user_other_session_unverified_additional_info" = "Vérifier ou déconnecter cette session pour une sécurité et une fiabilité accrue.";
|
||||
"user_session_verification_unknown_additional_info" = "Vérifier la session actuelle pour révéler l'état de vérification de cette session.";
|
||||
"user_session_verification_unknown_short" = "Inconnu";
|
||||
"user_session_verification_unknown" = "État de vérification inconnu";
|
||||
"user_sessions_hide_location_info" = "Masquer l'adresse IP";
|
||||
"user_sessions_show_location_info" = "Montrer l'adresse IP";
|
||||
"poll_timeline_reply_ended_poll" = "Sondage terminé";
|
||||
"poll_timeline_ended_text" = "Sondage clos";
|
||||
"poll_timeline_decryption_error" = "Des erreurs de déchiffrement pourrait empêcher certains votes d'être comptabilisés";
|
||||
"poll_history_fetching_error" = "Erreur au cours de la récupération des sondages.";
|
||||
"poll_history_load_more" = "Charger plus de sondages";
|
||||
"poll_history_no_past_poll_period_text" = "Il n'y a pas eu de sondages les %@ derniers jours. Veuillez charger plus de sondages pour consulter les sondages des mois antérieurs";
|
||||
"poll_history_no_active_poll_period_text" = "Il n'y a pas eu de sondages depuis %@ jours. Veuillez charger plus de sondages pour consulter les sondages des mois antérieurs";
|
||||
"poll_history_detail_view_in_timeline" = "Consulter la chronologie des sondages";
|
||||
"poll_history_no_past_poll_text" = "Il n'y a pas de sondage précédent dans ce salon";
|
||||
"poll_history_no_active_poll_text" = "Il n'y a aucun sondage en cours dans ce salon";
|
||||
"poll_history_past_segment_title" = "Sondages précédents";
|
||||
"poll_history_active_segment_title" = "Sondages en cours";
|
||||
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "Historique des sondages";
|
||||
"voice_broadcast_playback_unable_to_decrypt" = "Impossible de déchiffrer cette diffusion vocale.";
|
||||
"voice_broadcast_recorder_connection_error" = "Erreur de connexion - Enregistrement interrompu";
|
||||
"voice_broadcast_connection_error_message" = "Nous sommes malheureusement dans l'impossibilité de démarrer un enregistrement maintenant. Veuillez réessayer plus tard.";
|
||||
"voice_broadcast_connection_error_title" = "Erreur de connexion";
|
||||
"voice_broadcast_voip_cannot_start_description" = "Vous ne pouvez pas démarrer d'appel car vous enregistrez déjà une diffusion en direct. Veuillez interrompre votre diffusion pour lancer un appel.";
|
||||
"voice_broadcast_voip_cannot_start_title" = "Impossible de démarrer l'appel";
|
||||
"voice_broadcast_stop_alert_agree_button" = "Oui, terminer";
|
||||
"voice_broadcast_stop_alert_description" = "Êtes vous sûr de vouloir interrompre votre diffusion vocale ? Cela mettra fin à la diffusion et rendra l'enregistrement disponible dans le salon.";
|
||||
"voice_broadcast_stop_alert_title" = "Arrêter la diffusion vocale ?";
|
||||
"voice_broadcast_buffering" = "Mise en mémoire tampon...";
|
||||
"voice_broadcast_time_left" = "%@ restant";
|
||||
"voice_broadcast_tile" = "Diffusion vocale";
|
||||
"voice_broadcast_live" = "En direct";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Diffusion vocale";
|
||||
"voice_broadcast_playback_loading_error" = "Impossible de lire cette diffusion vocale.";
|
||||
"voice_broadcast_blocked_by_someone_else_message" = "Quelqu'un d'autre est déjà en train d'enregistrer une diffusion vocale. Veuillez attendre la fin de la leur pour en démarrer une nouvelle.";
|
||||
"voice_broadcast_already_in_progress_message" = "Vous êtes déjà en train d'enregistrer une diffusion vocale. Veuillez y mettre fin avant d'en démarrer une nouvelle.";
|
||||
"voice_broadcast_permission_denied_message" = "Vous n'avez pas les autorisations nécessaires pour démarrer une diffusion vocal dans ce salon. Contactez un administrateur pour qu'il vous octroie la permission.";
|
||||
|
||||
// MARK: - Voice Broadcast
|
||||
"voice_broadcast_unauthorized_title" = "Impossible de démarrer une nouvelle diffusion vocale";
|
||||
"voice_message_broadcast_in_progress_message" = "Vous ne pouvez pas démarrer d'enregistrement vocal car vous diffusez en direct. Veuillez interrompre votre diffusion pour démarrer l'enregistrement vocal";
|
||||
"launch_loading_server_syncing_nth_attempt" = "Synchronisation avec le serveur\n(%@ tentatives)";
|
||||
"launch_loading_server_syncing" = "Synchronisation avec le serveur";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_migrating_data" = "Migration des données\n%@ %%";
|
||||
"key_backup_recover_from_private_key_progress" = "%@%% Fini";
|
||||
"room_details_polls" = "Historique des sondages";
|
||||
"settings_labs_disable_crypto_sdk" = "Chiffrement de bout en bout avec Rust (se déconnecter pour désactiver)";
|
||||
"settings_labs_confirm_crypto_sdk" = "Cette option activera le nouveau moteur de chiffrement de bout en bout, plus rapide et plus fiable, écrit en Rust. Une fois activé vous devrez vous déconnecter pour le désactiver. Voulez-vous continuer ?";
|
||||
"settings_labs_enable_crypto_sdk" = "Chiffrement de bout en bout en Rust";
|
||||
"settings_push_rules_error" = "Nous avons rencontré une erreur lors de la mise à jours de vos préférences de notification. Veuillez réactiver l'option.";
|
||||
"password_policy_pwd_in_dict_error" = "Ce mot de passe a été trouvé dans un dictionnaire, et son usage n'est donc pas autorisé.";
|
||||
"password_policy_weak_pwd_error" = "Ce mot de passe est trop faible. Il doit contenir au moins 8 caractères, dont au moins une majuscule, une minuscule, un chiffre et un caractère spécial.";
|
||||
|
||||
// MARK: Password policy errors
|
||||
"password_policy_too_short_pwd_error" = "Mot de passe trop court";
|
||||
"accessibility_selected" = "sélectionné";
|
||||
|
||||
@@ -120,3 +120,6 @@
|
||||
|
||||
/* New video message from a specific person, not referencing a room. */
|
||||
"VIDEO_FROM_USER" = "%@ videót küldött";
|
||||
|
||||
/* New voice broadcast from a specific person, not referencing a room. */
|
||||
"VOICE_BROADCAST_FROM_USER" = "%@ hang közvetítést indított";
|
||||
|
||||
@@ -2467,14 +2467,6 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Semmi új.";
|
||||
"all_chats_onboarding_try_it" = "Próbáld ki";
|
||||
"all_chats_onboarding_title" = "Újdonságok";
|
||||
"all_chats_onboarding_page_message3" = "Koppints a profilodra és mond el mit gondolsz.";
|
||||
"all_chats_onboarding_page_title3" = "Visszajelzés adása";
|
||||
"all_chats_onboarding_page_message2" = "A terekhez való hozzáférés (balra lent) gyorsabb és egyszerűbb mint valaha.";
|
||||
"all_chats_onboarding_page_title2" = "Hozzáférés a terekhez";
|
||||
"all_chats_onboarding_page_message1" = "Element egyszerűsítéséhez a lapok mostantól választhatók. Beállítani a jobb felső menüből lehet.";
|
||||
"all_chats_onboarding_page_title1" = "Üdv az új kinézetben!";
|
||||
"all_chats_nothing_found_placeholder_message" = "Próbáld meg a keresést módosítani.";
|
||||
"all_chats_nothing_found_placeholder_title" = "Nincs találat.";
|
||||
"all_chats_empty_unreads_placeholder_message" = "Ez az a hely ahol az olvasatlan üzeneteid megjelennek, ha lesznek.";
|
||||
@@ -2688,3 +2680,40 @@
|
||||
"poll_timeline_decryption_error" = "Visszafejtési hibák miatt néhány szavazat nem kerül beszámításra";
|
||||
"voice_message_broadcast_in_progress_message" = "Nem lehet hang üzenetet indítani élő közvetítés felvétele közben. Az élő közvetítés bejezése szükséges a hang üzenet indításához";
|
||||
"voice_message_broadcast_in_progress_title" = "Hang üzenetet nem lehet elindítani";
|
||||
"poll_timeline_ended_text" = "Szavazás vége";
|
||||
"voice_broadcast_voip_cannot_start_description" = "Nem lehet hívást kezdeményezni élő közvetítés felvétele közben. Az élő közvetítés bejezése szükséges a hívás indításához.";
|
||||
"voice_broadcast_voip_cannot_start_title" = "Nem sikerült hívást indítani";
|
||||
"poll_history_no_past_poll_text" = "Nincsenek régi szavazások ebben a szobában";
|
||||
"poll_history_no_active_poll_text" = "Nincsenek aktív szavazások ebben a szobában";
|
||||
"poll_history_past_segment_title" = "Régi szavazások";
|
||||
"poll_history_active_segment_title" = "Aktív szavazások";
|
||||
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "Szavazás alakulása";
|
||||
"room_details_polls" = "Szavazás alakulása";
|
||||
"accessibility_selected" = "kiválasztva";
|
||||
"wysiwyg_composer_format_action_quote" = "Idézet be/ki";
|
||||
"wysiwyg_composer_format_action_code_block" = "Kód blokk be/ki";
|
||||
"wysiwyg_composer_format_action_ordered_list" = "Számozott lista ki-,bekapcsolása";
|
||||
"wysiwyg_composer_format_action_unordered_list" = "Lista ki-,bekapcsolása";
|
||||
"poll_timeline_reply_ended_poll" = "Lezárt szavazások";
|
||||
"voice_broadcast_recorder_connection_error" = "Kapcsolódási hiba – Felvétel szüneteltetve";
|
||||
"voice_broadcast_connection_error_message" = "Sajnos most nem lehet elindítani a felvételt. Próbálja meg később.";
|
||||
"voice_broadcast_connection_error_title" = "Kapcsolat hiba";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Hang közvetítés";
|
||||
"poll_history_load_more" = "Még több szavazás betöltése";
|
||||
"poll_history_no_past_poll_period_text" = "%@ napja nincs aktív szavazás. További szavazások betöltése az előző havi szavazások megjelenítéséhez";
|
||||
"poll_history_no_active_poll_period_text" = "%@ napja nincs aktív szavazás. További szavazások betöltése az előző havi szavazások megjelenítéséhez";
|
||||
"poll_history_loading_text" = "Szavazások megjelenítése";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_migrating_data" = "Adatok migrálása\n%@ %%";
|
||||
"settings_labs_disable_crypto_sdk" = "Végpontok közötti titkosítás 2.0 (kikapcsoláshoz kijelentkezés szükséges)";
|
||||
"settings_labs_confirm_crypto_sdk" = "Ezzel az opcióval egy gyorsabb és megbízhatóbb végponttól végponting titkosító motor kerül engedélyezésre ami Rustban lett megírva. Bekapcsolás után a kikapcsolásához ki kell jelentkezni. Folytatod?";
|
||||
"settings_labs_enable_crypto_sdk" = "Az új Rust alapú Titkosítási SDK engedélyezése";
|
||||
"home_context_menu_mark_as_unread" = "Olvasatlannak jelöl";
|
||||
"poll_history_fetching_error" = "Szavazás betöltési hiba.";
|
||||
"voice_broadcast_playback_unable_to_decrypt" = "A hang közvetítés nem fejthető vissza.";
|
||||
"key_backup_recover_from_private_key_progress" = "%@%% kész";
|
||||
|
||||
@@ -2672,14 +2672,6 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Belum ada yang baru.";
|
||||
"all_chats_onboarding_try_it" = "Coba";
|
||||
"all_chats_onboarding_title" = "Apa yang baru";
|
||||
"all_chats_onboarding_page_message3" = "Ketuk profil Anda untuk memberi tahu kami bagaimana menurut Anda.";
|
||||
"all_chats_onboarding_page_title3" = "Berikan Masukan";
|
||||
"all_chats_onboarding_page_message2" = "Akses Space Anda (di kiri bawah) dengan lebih cepat dan lebih mudah dari sebelumnya.";
|
||||
"all_chats_onboarding_page_title2" = "Akses Space";
|
||||
"all_chats_onboarding_page_message1" = "Untuk membuat Element Anda lebih sederhana, fitur tab sekarang opsional. Kelola menggunakan menu kanan atas.";
|
||||
"all_chats_onboarding_page_title1" = "Selamat datang di tampilan yang baru!";
|
||||
"all_chats_nothing_found_placeholder_message" = "Coba atur pencarian Anda.";
|
||||
"all_chats_nothing_found_placeholder_title" = "Tidak ada yang ditemukan.";
|
||||
"all_chats_empty_unreads_placeholder_message" = "Ini di mana pesan Anda yang belum dibaca akan ditampilkan, ketika Anda menerimanya.";
|
||||
@@ -2893,5 +2885,46 @@
|
||||
"notice_voice_broadcast_live" = "Siaran langsung";
|
||||
"user_other_session_security_recommendation_title" = "Sesi lainnya";
|
||||
"poll_timeline_decryption_error" = "Karena kesalahan enkripsi, beberapa suara mungkin tidak terhitung";
|
||||
"voice_message_broadcast_in_progress_message" = "Anda tidak dapat memulai sebuah pesan suara selagi Anda merekam sebuah siaran langsung. Silakan mengakhiri siaran langsung Anda untuk memulai merekam sebuah pesan suara";
|
||||
"voice_message_broadcast_in_progress_message" = "Anda tidak dapat memulai sebuah pesan suara karena Anda saat ini merekam sebuah siaran langsung. Silakan mengakhiri siaran langsung Anda untuk memulai merekam sebuah pesan suara";
|
||||
"voice_message_broadcast_in_progress_title" = "Tidak dapat memulai pesan suara";
|
||||
"poll_timeline_ended_text" = "Mengakhiri pemungutan suara";
|
||||
"voice_broadcast_voip_cannot_start_description" = "Anda tidak dapat memulai sebuah panggilan karena Anda saat ini merekam sebuah siaran langsung. Mohon akhiri siaran langsung Anda untuk memulai sebuah panggilan.";
|
||||
"voice_broadcast_voip_cannot_start_title" = "Tidak dapat memulai sebuah panggilan";
|
||||
"poll_history_no_past_poll_text" = "Tidak ada pemungutan suara masa lalu di ruangan ini";
|
||||
"poll_history_no_active_poll_text" = "Tidak ada pemungutan suara yang aktifk di ruangan ini";
|
||||
"poll_history_past_segment_title" = "Pemungutan suara sebelumnya";
|
||||
"poll_history_active_segment_title" = "Pemungutan suara aktif";
|
||||
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "Riwayat pemungutan suara";
|
||||
"room_details_polls" = "Riwayat pemungutan suara";
|
||||
"accessibility_selected" = "dipilih";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Siaran suara";
|
||||
"wysiwyg_composer_format_action_quote" = "Saklar kutipan";
|
||||
"wysiwyg_composer_format_action_code_block" = "Saklar blok kode";
|
||||
"wysiwyg_composer_format_action_ordered_list" = "Saklar daftar bernomor";
|
||||
"wysiwyg_composer_format_action_unordered_list" = "Saklar daftar bulat";
|
||||
"voice_broadcast_connection_error_message" = "Sayangnya kami tidak dapat memulai sebuah rekaman saat ini. Silakan coba lagi nanti.";
|
||||
"voice_broadcast_connection_error_title" = "Kesalahan koneksi";
|
||||
"voice_broadcast_recorder_connection_error" = "Kesalahan koneksi - Perekaman dijeda";
|
||||
"poll_timeline_reply_ended_poll" = "Pemungutan suara berakhir";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_migrating_data" = "Memigrasikan data\n%@ %%";
|
||||
"settings_labs_disable_crypto_sdk" = "Enkripsi ujung ke ujung Rust (keluar dari akun untuk menonaktifkan)";
|
||||
"settings_labs_confirm_crypto_sdk" = "Ketahui bahwa fitur ini masih dalam masa eksperimental, ini mungkin tidak berfungsi seperti yang diharapkan dan dapat memiliki konsekuensi yang tidak terduga. Untuk mengembalikan fitur, cukup keluar dari akun dan masuk kembali ke akun. Gunakan dengan pengetahuan dan risiko Anda.";
|
||||
"settings_labs_enable_crypto_sdk" = "Enkripsi ujung ke ujung Rust";
|
||||
"poll_history_load_more" = "Muat lebih banyak pemungutan suara";
|
||||
"poll_history_no_active_poll_period_text" = "Tidak ada pemungutan suara terakhir untuk %@ hari sebelumnya. Muat lebih banyak pemungutan suara untuk bulan sebelumnya";
|
||||
"poll_history_no_past_poll_period_text" = "Tidak ada pemungutan suara untuk %@ hari sebelumnya. Muat lebih banyak pemungutan suara untuk melihat pemungutan suara untuk bulan sebelumnya";
|
||||
"poll_history_loading_text" = "Menampilkan pemungutan suara";
|
||||
"poll_history_fetching_error" = "Terjadi kesalahan mendapatkan pemungutan suara.";
|
||||
"key_backup_recover_from_private_key_progress" = "%@%% Selesai";
|
||||
"voice_broadcast_playback_unable_to_decrypt" = "Tidak dapat mendekripsi siaran suara ini.";
|
||||
"home_context_menu_mark_as_unread" = "Tandai sebagai belum dibaca";
|
||||
"wysiwyg_composer_format_action_un_indent" = "Kurangi indentasi";
|
||||
"wysiwyg_composer_format_action_indent" = "Tambahkan indentasi";
|
||||
"poll_history_detail_view_in_timeline" = "Tampilkan pemungutan suara dalam lini masa";
|
||||
"settings_push_rules_error" = "Sebuah kesalahan terjadi ketika memperbarui preferensi notifikasi Anda. Silakan alih ulang opsi Anda.";
|
||||
|
||||
@@ -170,3 +170,6 @@
|
||||
|
||||
/* Look, stuff's happened, alright? Just open the app. */
|
||||
"MSGS_IN_TWO_PLUS_ROOMS" = "%@ ný skilaboð í %@, %@ og fleirum";
|
||||
|
||||
/* New voice broadcast from a specific person, not referencing a room. */
|
||||
"VOICE_BROADCAST_FROM_USER" = "%@ byrjaði talútsendingu";
|
||||
|
||||
@@ -1283,7 +1283,7 @@
|
||||
"settings_add_3pid_invalid_password_message" = "Ógild auðkenni";
|
||||
"settings_add_3pid_password_title_msidsn" = "Bæta við símanúmeri";
|
||||
"settings_add_3pid_password_title_email" = "Bæta við tölvupóstfangi";
|
||||
"settings_labs_enable_threads" = "Skilaboð í spjallþráðum";
|
||||
"settings_labs_enable_threads" = "Spjallþræðir skilaboða";
|
||||
"settings_labs_enabled_polls" = "Kannanir";
|
||||
"settings_integrations_allow_button" = "Sýsla með samþættingar";
|
||||
"settings_new_keyword" = "Bæta við nýju stikkorði";
|
||||
@@ -2132,7 +2132,6 @@
|
||||
|
||||
"user_sessions_overview_title" = "Setur";
|
||||
"space_selector_create_space" = "Búa til svæði";
|
||||
"all_chats_onboarding_try_it" = "Prófaðu það";
|
||||
"all_chats_edit_menu_space_settings" = "Stillingar svæðis";
|
||||
"all_chats_edit_menu_leave_space" = "Yfirgefa %@";
|
||||
"room_recents_recently_viewed_section" = "Nýlega skoðað";
|
||||
@@ -2234,7 +2233,6 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Ekkert nýtt.";
|
||||
"all_chats_onboarding_page_title1" = "Velkomin í nýja sýn!";
|
||||
"all_chats_nothing_found_placeholder_message" = "Reyndu að aðlaga leitina þína.";
|
||||
"all_chats_edit_layout_alphabetical_order" = "Raða A-Ö";
|
||||
"all_chats_edit_layout_activity_order" = "Raða eftir virkni";
|
||||
@@ -2317,7 +2315,7 @@
|
||||
"device_name_mobile" = "%@ fyrir farsíma";
|
||||
"device_name_web" = "%@ á vefnum";
|
||||
"device_name_desktop" = "%@ fyrir einkatölvur";
|
||||
"user_session_item_details" = "%@ · Síðasta virkni %@";
|
||||
"user_session_item_details" = "%1$@ · %2$@";
|
||||
"location_sharing_live_loading" = "Hleð inn rauntímastaðsetningu...";
|
||||
"location_sharing_live_list_item_time_left" = "%@ fór";
|
||||
"location_sharing_map_credits_title" = "© Höfundarréttur";
|
||||
@@ -2330,9 +2328,6 @@
|
||||
// Mark: - Space Selector
|
||||
|
||||
"space_selector_title" = "Svæðin mín";
|
||||
"all_chats_onboarding_title" = "Hvað er nýtt";
|
||||
"all_chats_onboarding_page_title3" = "Gefðu umsögn";
|
||||
"all_chats_onboarding_page_title2" = "Aðgangur að svæðum";
|
||||
"all_chats_user_menu_settings" = "Notandastillingar";
|
||||
"all_chats_edit_layout_pin_spaces_title" = "Festu svæðin þín";
|
||||
|
||||
@@ -2368,3 +2363,119 @@
|
||||
|
||||
// MARK: Authentication
|
||||
"authentication_registration_title" = "Búðu til aðganginn þinn";
|
||||
"notice_voice_broadcast_ended_by_you" = "Þú endaðir talútsendingu.";
|
||||
"notice_voice_broadcast_ended" = "%@ endaði talútsendingu.";
|
||||
"notice_voice_broadcast_live" = "Bein útsending";
|
||||
"deselect_all" = "Afvelja allt";
|
||||
"wysiwyg_composer_link_action_edit_title" = "Breyta tengli";
|
||||
"wysiwyg_composer_link_action_create_title" = "Búa til tengil";
|
||||
"wysiwyg_composer_link_action_link" = "Tengill";
|
||||
|
||||
|
||||
|
||||
// Links
|
||||
"wysiwyg_composer_link_action_text" = "Texti";
|
||||
"wysiwyg_composer_start_action_voice_broadcast" = "Útvörpun tals";
|
||||
"wysiwyg_composer_start_action_text_formatting" = "Sníðing texta";
|
||||
"wysiwyg_composer_start_action_camera" = "Myndavél";
|
||||
"wysiwyg_composer_start_action_location" = "Staðsetning";
|
||||
"wysiwyg_composer_start_action_polls" = "Kannanir";
|
||||
"wysiwyg_composer_start_action_attachments" = "Viðhengi";
|
||||
"wysiwyg_composer_start_action_stickers" = "Límmerki";
|
||||
|
||||
|
||||
// MARK: - WYSIWYG Composer
|
||||
|
||||
// Send Media Actions
|
||||
"wysiwyg_composer_start_action_media_picker" = "Ljósmyndasafn";
|
||||
"user_session_overview_session_details_button_title" = "Nánar um setuna";
|
||||
"user_session_overview_session_title" = "Seta";
|
||||
"user_session_overview_current_session_title" = "Núverandi seta";
|
||||
"user_session_details_application_url" = "Slóð (URL)";
|
||||
"user_session_details_application_version" = "Útgáfa";
|
||||
"user_session_details_application_name" = "Heiti";
|
||||
"user_session_details_device_os" = "Stýrikerfi";
|
||||
"user_session_details_device_browser" = "Vafri";
|
||||
"user_session_details_device_model" = "Gerð";
|
||||
"user_session_details_device_ip_location" = "Staðsetning IP-vistfangs";
|
||||
"user_session_details_device_ip_address" = "IP-vistfang";
|
||||
"user_session_details_last_activity" = "Síðasta virkni";
|
||||
"user_session_details_session_id" = "Auðkenni setu";
|
||||
"user_session_details_session_name" = "Nafn á setu";
|
||||
"user_session_details_device_section_header" = "Tæki";
|
||||
"user_session_details_application_section_header" = "Forrit";
|
||||
"user_session_details_session_section_header" = "Seta";
|
||||
"user_session_details_title" = "Nánar um setuna";
|
||||
"device_type_name_unknown" = "Óþekkt";
|
||||
"device_type_name_mobile" = "Farsími";
|
||||
"device_type_name_web" = "Vefur";
|
||||
"device_type_name_desktop" = "Borðtölva";
|
||||
"user_other_session_selected_count" = "%@ valið";
|
||||
"user_other_session_clear_filter" = "Hreinsa síu";
|
||||
"user_other_session_no_unverified_sessions" = "Engar óstaðfestar setur fundust.";
|
||||
"user_other_session_no_verified_sessions" = "Engar staðfestar setur fundust.";
|
||||
"user_other_session_no_inactive_sessions" = "Engar óvirkar setur fundust.";
|
||||
"user_other_session_filter_menu_inactive" = "Óvirkt";
|
||||
"user_other_session_filter_menu_unverified" = "Óstaðfestar";
|
||||
"user_other_session_filter_menu_verified" = "Staðfestar";
|
||||
"user_other_session_filter_menu_all" = "Allar setur";
|
||||
"user_other_session_filter" = "Sía";
|
||||
"user_other_session_security_recommendation_title" = "Aðrar setur";
|
||||
"user_session_inactive_session_title" = "Óvirkar setur";
|
||||
"user_session_unverified_session_title" = "Óstaðfest seta";
|
||||
"user_session_verified_session_title" = "Sannreyndar setur";
|
||||
"user_session_got_it" = "Náði því";
|
||||
"user_session_push_notifications" = "Ýti-tilkynningar";
|
||||
"user_session_verification_unknown_short" = "Óþekkt";
|
||||
"user_session_verification_unknown" = "Óþekkt staða sannvottunar";
|
||||
"user_sessions_view_all_action" = "Skoða öll (%d)";
|
||||
"user_sessions_overview_link_device" = "Tengja tæki";
|
||||
"user_sessions_overview_current_session_section_title" = "Núverandi seta";
|
||||
"user_sessions_hide_location_info" = "Fela IP-vistfang";
|
||||
"user_sessions_show_location_info" = "Birta IP-vistfang";
|
||||
"user_sessions_overview_other_sessions_section_title" = "Aðrar setur";
|
||||
"user_sessions_overview_security_recommendations_inactive_title" = "Óvirkar setur";
|
||||
"user_sessions_overview_security_recommendations_unverified_title" = "Óstaðfestar setur";
|
||||
"user_sessions_overview_security_recommendations_section_title" = "Ráðleggingar varðandi öryggi";
|
||||
|
||||
// MARK: User sessions management
|
||||
|
||||
// Parameter is the application display name (e.g. "Element")
|
||||
"user_sessions_default_session_display_name" = "%@ iOS";
|
||||
"location_sharing_live_lab_promotion_activation" = "Virkja deilingu rauntímastaðsetninga";
|
||||
"location_sharing_live_timer_incoming" = "Í beinni til %@";
|
||||
"poll_timeline_reply_ended_poll" = "Lauk könnun";
|
||||
"poll_timeline_ended_text" = "Lauk könnuninni";
|
||||
"poll_history_past_segment_title" = "Fyrri kannanir";
|
||||
"poll_history_active_segment_title" = "Virkar kannanir";
|
||||
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "Breytingaskrá könnunar";
|
||||
"all_chats_user_menu_accessibility_label" = "Valmynd notandans";
|
||||
"voice_broadcast_connection_error_title" = "Villa í tengingu";
|
||||
"voice_broadcast_voip_cannot_start_title" = "Get ekki hafið símtal";
|
||||
"voice_broadcast_stop_alert_agree_button" = "Já, stöðva";
|
||||
"voice_broadcast_buffering" = "Hleð í biðminni...";
|
||||
"voice_broadcast_time_left" = "%@ eftir";
|
||||
"voice_broadcast_tile" = "Útvörpun tals";
|
||||
"voice_broadcast_live" = "Beint";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Útvörpun tals";
|
||||
|
||||
// Unverified sessions
|
||||
"key_verification_alert_title" = "Þú ert með óstaðfestar setur";
|
||||
"sign_out_confirmation_message" = "Ertu viss um að þú viljir skrá þig út?";
|
||||
|
||||
// MARK: Sign out warning
|
||||
|
||||
"sign_out" = "Skrá út";
|
||||
"secure_key_backup_setup_cancel_alert_message" = "Ef þú hættir við núna, geturðu tapað dulrituðum skilaboðum og gögnum ef þú missir aðgang að innskráningum þínum.\n\nÞú getur víka sett upp örugga afritun og sýslað með dulritunarlyklana þína í stillingunum.";
|
||||
"room_details_polls" = "Breytingaskrá könnunar";
|
||||
"manage_session_sign_out_other_sessions" = "Skrá út úr öllum öðrum setum";
|
||||
"manage_session_rename" = "Endurnefna setu";
|
||||
"settings_labs_enable_voice_broadcast" = "Útvörpun tals";
|
||||
"authentication_qr_login_failure_retry" = "Reyna aftur";
|
||||
"authentication_qr_login_loading_connecting_device" = "Tengist við tæki";
|
||||
"authentication_qr_login_scan_title" = "Skanna QR-kóða";
|
||||
"authentication_qr_login_start_title" = "Skanna QR-kóða";
|
||||
"authentication_login_with_qr" = "Skrá inn með QR-kóða";
|
||||
|
||||
@@ -118,3 +118,6 @@
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"LOCATION_FROM_USER" = "%@ ha condiviso la sua posizione";
|
||||
|
||||
/* New voice broadcast from a specific person, not referencing a room. */
|
||||
"VOICE_BROADCAST_FROM_USER" = "%@ ha iniziato una trasmissione vocale";
|
||||
|
||||
@@ -2445,14 +2445,6 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Niente di nuovo.";
|
||||
"all_chats_onboarding_try_it" = "Provalo";
|
||||
"all_chats_onboarding_title" = "Novità";
|
||||
"all_chats_onboarding_page_message3" = "Tocca il tuo profilo per farci sapere cosa ne pensi.";
|
||||
"all_chats_onboarding_page_title3" = "Invia un feedback";
|
||||
"all_chats_onboarding_page_message2" = "Accedi ai tuoi spazi (in basso a sinistra) più velocemente e più facilmente che mai.";
|
||||
"all_chats_onboarding_page_title2" = "Accedi agli spazi";
|
||||
"all_chats_onboarding_page_message1" = "Per semplificare Element, le schede ora sono opzionali. Gestiscile usando il menu in alto a destra.";
|
||||
"all_chats_onboarding_page_title1" = "Benvenuti ad una nuova panoramica!";
|
||||
"all_chats_nothing_found_placeholder_message" = "Prova a cambiare la tua ricerca.";
|
||||
"all_chats_nothing_found_placeholder_title" = "Non è stato trovato niente.";
|
||||
"all_chats_empty_unreads_placeholder_message" = "Qui è dove verranno mostrati i messaggi non letti, quando ne avrai qualcuno.";
|
||||
@@ -2665,3 +2657,47 @@
|
||||
"notice_voice_broadcast_live" = "Trasmissione in diretta";
|
||||
"wysiwyg_composer_format_action_inline_code" = "Applica formato codice interlinea";
|
||||
"user_other_session_security_recommendation_title" = "Altre sessioni";
|
||||
"poll_timeline_ended_text" = "Sondaggio terminato";
|
||||
"poll_timeline_decryption_error" = "A causa di errori di decifrazione, alcuni voti potrebbero non venire contati";
|
||||
"voice_broadcast_voip_cannot_start_description" = "Non puoi avviare una chiamata perché stai registrando una trasmissione in diretta. Termina la trasmissione per potere iniziare una chiamata.";
|
||||
"voice_broadcast_voip_cannot_start_title" = "Impossibile avviare una chiamata";
|
||||
"voice_message_broadcast_in_progress_title" = "Impossibile iniziare il messaggio vocale";
|
||||
"voice_message_broadcast_in_progress_message" = "Non puoi iniziare un messaggio vocale perché stai registrando una trasmissione in diretta. Termina la trasmissione per potere iniziare un messaggio vocale";
|
||||
"poll_history_no_past_poll_text" = "In questa stanza non ci sono sondaggi passati";
|
||||
"poll_history_no_active_poll_text" = "In questa stanza non ci sono sondaggi attivi";
|
||||
"poll_history_past_segment_title" = "Sondaggi passati";
|
||||
"poll_history_active_segment_title" = "Sondaggi attivi";
|
||||
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "Cronologia sondaggi";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Trasmissione vocale";
|
||||
"room_details_polls" = "Cronologia sondaggi";
|
||||
"accessibility_selected" = "selezionato";
|
||||
"wysiwyg_composer_format_action_quote" = "Attiva/disattiva citazione";
|
||||
"wysiwyg_composer_format_action_code_block" = "Attiva/disattiva blocco di codice";
|
||||
"wysiwyg_composer_format_action_ordered_list" = "Attiva/disattiva elenco numerato";
|
||||
"wysiwyg_composer_format_action_unordered_list" = "Attiva/disattiva elenco puntato";
|
||||
"poll_timeline_reply_ended_poll" = "Sondaggio terminato";
|
||||
"voice_broadcast_recorder_connection_error" = "Errore di connessione - Registrazione in pausa";
|
||||
"voice_broadcast_connection_error_message" = "Sfortunatamente non riusciamo ad iniziare una registrazione al momento. Riprova più tardi.";
|
||||
"voice_broadcast_connection_error_title" = "Errore di connessione";
|
||||
"poll_history_load_more" = "Carica più sondaggi";
|
||||
"poll_history_no_past_poll_period_text" = "Non ci sono sondaggi passati negli ultimi %@ giorni. Carica più sondaggi per vedere quelli dei mesi precedenti";
|
||||
"poll_history_no_active_poll_period_text" = "Non ci sono sondaggi attivi negli ultimi %@ giorni. Carica più sondaggi per vedere quelli dei mesi precedenti";
|
||||
"poll_history_loading_text" = "Visualizzazione sondaggi";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_migrating_data" = "Migrazione dati\n%@ %%";
|
||||
"settings_labs_disable_crypto_sdk" = "Crittografia end-to-end Rust (disconnettiti per disattivarla)";
|
||||
"settings_labs_confirm_crypto_sdk" = "Si noti che questa funzione, essendo ancora in fase sperimentale, potrebbe non funzionare come previsto e potrebbe avere conseguenze indesiderate. Per disattivare la funzione, è sufficiente disconnettersi e riaccedere. Utilizzare a propria discrezione e con cautela.";
|
||||
"settings_labs_enable_crypto_sdk" = "Crittografia end-to-end Rust";
|
||||
"wysiwyg_composer_format_action_un_indent" = "Diminuisci indentazione";
|
||||
"wysiwyg_composer_format_action_indent" = "Aumenta indentazione";
|
||||
"poll_history_fetching_error" = "Errore di recupero dei sondaggi.";
|
||||
"voice_broadcast_playback_unable_to_decrypt" = "Impossibile decifrare questa trasmissione vocale.";
|
||||
"home_context_menu_mark_as_unread" = "Segna come non letto";
|
||||
"key_backup_recover_from_private_key_progress" = "%@%% Completato";
|
||||
"poll_history_detail_view_in_timeline" = "Vedi sondaggio nella linea temporale";
|
||||
"settings_push_rules_error" = "Si è verificato un errore aggiornando le tue preferenze di notifica. Prova ad attivare/disattivare di nuovo l'opzione.";
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// Permissions usage explanations
|
||||
"NSCameraUsageDescription" = "カメラは、ビデオ通話や写真撮影、動画撮影に使用されます。";
|
||||
"NSPhotoLibraryUsageDescription" = "フォトライブラリは、写真や動画の送信に使用されます。";
|
||||
"NSCameraUsageDescription" = "カメラは、ビデオ通話や写真、動画の撮影とアップロードに使用されます。";
|
||||
"NSPhotoLibraryUsageDescription" = "フォトへのアクセスを許可すると、写真や動画をライブラリーからアップロードできるようになります。";
|
||||
"NSMicrophoneUsageDescription" = "Elementは通話、動画撮影、ボイスメッセージの録音にマイクへのアクセスを必要としています。";
|
||||
"NSContactsUsageDescription" = "Elementは、あなたが連絡先をチャットに招待できるように、連絡先を表示します。";
|
||||
"NSContactsUsageDescription" = "あなたのIDサーバーに共有され、Matrixで連絡先を発見するのに使用されます。";
|
||||
"NSCalendarsUsageDescription" = "予定されているミーティングをアプリで確認することができます。";
|
||||
"NSFaceIDUsageDescription" = "Face IDはアプリへのアクセスに使用されます。";
|
||||
"NSLocationWhenInUseUsageDescription" = "位置情報を共有する際には、地図を表示するためのアクセスをElementに付与する必要があります。";
|
||||
"NSLocationAlwaysAndWhenInUseUsageDescription" = "あなたが他の人に位置を共有するとき、Elementは地図をその人に表示するアクセス権が必要です。";
|
||||
"NSLocationAlwaysAndWhenInUseUsageDescription" = "位置情報を共有する際には、地図を表示するためのアクセスをElementに付与する必要があります。";
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/* New message from a specific person, not referencing a room */
|
||||
"MSG_FROM_USER" = "%@ さんからメッセージ";
|
||||
"MSG_FROM_USER" = "%@さんがメッセージを送信しました";
|
||||
/* New message from a specific person in a named room */
|
||||
"MSG_FROM_USER_IN_ROOM" = "%@ さんが %@ へ発言";
|
||||
"MSG_FROM_USER_IN_ROOM" = "%@さんが%@に投稿しました";
|
||||
/* New message from a specific person, not referencing a room. Content included. */
|
||||
"MSG_FROM_USER_WITH_CONTENT" = "%@: %@";
|
||||
"MSG_FROM_USER_WITH_CONTENT" = "%@:%@";
|
||||
/* New message from a specific person in a named room. Content included. */
|
||||
"MSG_FROM_USER_IN_ROOM_WITH_CONTENT" = "%@ in %@: %@";
|
||||
/* New action message from a specific person, not referencing a room. */
|
||||
@@ -12,62 +12,62 @@
|
||||
"ACTION_FROM_USER_IN_ROOM" = "%@: * %@ %@";
|
||||
/* New action message from a specific person, not referencing a room. */
|
||||
/* New action message from a specific person in a named room. */
|
||||
"IMAGE_FROM_USER_IN_ROOM" = "%@ さんが写真を投稿 %@ in %@";
|
||||
"IMAGE_FROM_USER_IN_ROOM" = "%@さんが写真%@を%@に投稿しました";
|
||||
/* Multiple unread messages in a room */
|
||||
"UNREAD_IN_ROOM" = "%@ 新しいメッセージ in %@";
|
||||
"UNREAD_IN_ROOM" = "%@件の新しいメッセージが%@にあります";
|
||||
/* Multiple unread messages from a specific person, not referencing a room */
|
||||
"MSGS_FROM_USER" = "%@ 新しいメッセージ in %@";
|
||||
"MSGS_FROM_USER" = "%@件の新しいメッセージが%@にあります";
|
||||
/* Multiple unread messages from two people */
|
||||
"MSGS_FROM_TWO_USERS" = "%@ 新しいメッセージ from %@ and %@";
|
||||
"MSGS_FROM_TWO_USERS" = "%@件の新しいメッセージを%@と%@から受信しました";
|
||||
/* Multiple unread messages from three people */
|
||||
"MSGS_FROM_THREE_USERS" = "%@ 新しいメッセージ from %@, %@ and %@";
|
||||
"MSGS_FROM_THREE_USERS" = "%@件の新しいメッセージを%@、%@、%@から受信しました";
|
||||
/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */
|
||||
"MSGS_FROM_TWO_PLUS_USERS" = "%@ 新しいメッセージ from %@, %@ 他";
|
||||
"MSGS_FROM_TWO_PLUS_USERS" = "%@件の新しいメッセージを%@、%@、ほか数人から受信しました";
|
||||
/* Multiple messages in two rooms */
|
||||
"MSGS_IN_TWO_ROOMS" = "%@ 新しいメッセージ in %@ and %@";
|
||||
"MSGS_IN_TWO_ROOMS" = "%@件の新しいメッセージが%@と%@にあります";
|
||||
/* Look, stuff's happened, alright? Just open the app. */
|
||||
"MSGS_IN_TWO_PLUS_ROOMS" = "%@ 新しいメッセージ in %@, %@ 他";
|
||||
"MSGS_IN_TWO_PLUS_ROOMS" = "%@件の新しいメッセージが%@、%@などにあります";
|
||||
/* A user has invited you to a chat */
|
||||
"USER_INVITE_TO_CHAT" = "%@ さんがあなたを対話に招待しました";
|
||||
"USER_INVITE_TO_CHAT" = "%@さんがあなたをチャットに招待しました";
|
||||
/* A user has invited you to an (unamed) group chat */
|
||||
"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ さんがあなたをルームへ招待しました";
|
||||
"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@さんがあなたをグループチャットに招待しました";
|
||||
/* A user has invited you to a named room */
|
||||
"USER_INVITE_TO_NAMED_ROOM" = "%@ さんがルーム %@ へ招待しました";
|
||||
"USER_INVITE_TO_NAMED_ROOM" = "%@さんがルーム %@ に招待しました";
|
||||
/* Incoming one-to-one voice call */
|
||||
"VOICE_CALL_FROM_USER" = "%@ さんから通話着信";
|
||||
"VOICE_CALL_FROM_USER" = "%@さんから通話着信";
|
||||
/* Incoming one-to-one video call */
|
||||
"VIDEO_CALL_FROM_USER" = "%@ さんから映像つき通話着信";
|
||||
"VIDEO_CALL_FROM_USER" = "%@さんからビデオ通話の着信";
|
||||
/* Incoming unnamed voice conference invite from a specific person */
|
||||
"VOICE_CONF_FROM_USER" = "%@ さんから会議通話の着信";
|
||||
"VOICE_CONF_FROM_USER" = "%@さんからグループ通話の着信";
|
||||
/* Incoming unnamed video conference invite from a specific person */
|
||||
"VIDEO_CONF_FROM_USER" = "%@ さんから映像つき会議通話の着信";
|
||||
"VIDEO_CONF_FROM_USER" = "%@さんからビデオグループ通話の着信";
|
||||
/* Incoming named voice conference invite from a specific person */
|
||||
"VOICE_CONF_NAMED_FROM_USER" = "会議通話の着信 from %@: '%@'";
|
||||
"VOICE_CONF_NAMED_FROM_USER" = "%@さんからグループ通話の着信:'%@'";
|
||||
/* Incoming named video conference invite from a specific person */
|
||||
"VIDEO_CONF_NAMED_FROM_USER" = "映像つき会議通話の着信 from %@: '%@'";
|
||||
"VIDEO_CONF_NAMED_FROM_USER" = "%@さんからビデオグループ通話の着信:'%@'";
|
||||
/* A single unread message in a room */
|
||||
"SINGLE_UNREAD_IN_ROOM" = "%@にメッセージを受け取りました";
|
||||
"SINGLE_UNREAD_IN_ROOM" = "%@でメッセージを受信しました";
|
||||
/* A single unread message */
|
||||
"SINGLE_UNREAD" = "あなたはメッセージを受け取りました";
|
||||
"SINGLE_UNREAD" = "メッセージを受信しました";
|
||||
|
||||
/** Key verification **/
|
||||
|
||||
"KEY_VERIFICATION_REQUEST_FROM_USER" = "%@は認証を要求しています";
|
||||
|
||||
/* New message indicator on a room */
|
||||
"MESSAGE_IN_X" = "%@ 内のメッセージ";
|
||||
"MESSAGE_IN_X" = "%@内のメッセージ";
|
||||
|
||||
/* Sticker from a specific person, not referencing a room. */
|
||||
"STICKER_FROM_USER" = "%@ さんからのスタンプ";
|
||||
"STICKER_FROM_USER" = "%@さんがステッカーを送信しました";
|
||||
/* Message title for a specific person in a named room */
|
||||
"MSG_FROM_USER_IN_ROOM_TITLE" = "%@(%@ から)";
|
||||
|
||||
/* Group call from user, CallKit caller name */
|
||||
"GROUP_CALL_FROM_USER" = "%@ (グループ通話)";
|
||||
"GROUP_CALL_FROM_USER" = "%@(グループ通話)";
|
||||
"MESSAGE_PROTECTED" = "新しいメッセージ";
|
||||
|
||||
/* New message indicator from a DM */
|
||||
"MESSAGE_FROM_X" = "%@ からのメッセージ";
|
||||
"MESSAGE_FROM_X" = "%@さんからのメッセージ";
|
||||
|
||||
/** Notification messages **/
|
||||
|
||||
@@ -78,52 +78,55 @@
|
||||
"Notification" = "通知";
|
||||
|
||||
/* New message reply from a specific person in a named room. */
|
||||
"REPLY_FROM_USER_IN_ROOM_TITLE" = "%@ さんが %@ で返信";
|
||||
"REPLY_FROM_USER_IN_ROOM_TITLE" = "%@さんが%@で返信しました";
|
||||
|
||||
/* New message reply from a specific person, not referencing a room. */
|
||||
"REPLY_FROM_USER_TITLE" = "%@ さんが返信";
|
||||
"REPLY_FROM_USER_TITLE" = "%@さんが返信しました";
|
||||
|
||||
/** Reactions **/
|
||||
|
||||
/* A user has reacted to a message, including the reaction e.g. "Alice reacted 👍". */
|
||||
"REACTION_FROM_USER" = "%@ さんが %@ とリアクション";
|
||||
"REACTION_FROM_USER" = "%@さんが%@でリアクションしました";
|
||||
|
||||
/* A user has reacted to a message, but the reaction content is unknown */
|
||||
"GENERIC_REACTION_FROM_USER" = "%@ さんがリアクション";
|
||||
"GENERIC_REACTION_FROM_USER" = "%@さんがリアクションを送信しました";
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"LOCATION_FROM_USER" = "%@ さんが位置情報を共有";
|
||||
"LOCATION_FROM_USER" = "%@さんが位置情報を共有しました";
|
||||
|
||||
/* New voice message from a specific person, not referencing a room. */
|
||||
"VOICE_MESSAGE_FROM_USER" = "%@ さんが音声メッセージを送信";
|
||||
"VOICE_MESSAGE_FROM_USER" = "%@さんが音声メッセージを送信しました";
|
||||
|
||||
/* New video message from a specific person, not referencing a room. */
|
||||
"VIDEO_FROM_USER" = "%@ さんが動画を送信";
|
||||
"VIDEO_FROM_USER" = "%@さんが動画を送信しました";
|
||||
|
||||
/** Media Messages **/
|
||||
|
||||
/* New image message from a specific person, not referencing a room. */
|
||||
"PICTURE_FROM_USER" = "%@ さんが写真を送信";
|
||||
"PICTURE_FROM_USER" = "%@さんが写真を送信しました";
|
||||
|
||||
/* A user added a Jitsi call to a room */
|
||||
"GROUP_CALL_STARTED" = "グループ通話が開始されました";
|
||||
"GROUP_CALL_STARTED" = "グループ通話を開始しました";
|
||||
|
||||
/* A user's membership has updated in an unknown way */
|
||||
"USER_MEMBERSHIP_UPDATED" = "%@ がプロフィールを更新しました";
|
||||
"USER_MEMBERSHIP_UPDATED" = "%@さんがプロフィールを更新しました";
|
||||
|
||||
/* A user has change their avatar */
|
||||
"USER_UPDATED_AVATAR" = "%@ がアバター画像を変更しました";
|
||||
"USER_UPDATED_AVATAR" = "%@さんがアバターを変更しました";
|
||||
|
||||
/* A user has change their name to a new name which we don't know */
|
||||
"GENERIC_USER_UPDATED_DISPLAYNAME" = "%@ が名前を変更しました";
|
||||
"GENERIC_USER_UPDATED_DISPLAYNAME" = "%@さんが名前を変更しました";
|
||||
|
||||
/** Membership Updates **/
|
||||
|
||||
/* A user has change their name to a new name */
|
||||
"USER_UPDATED_DISPLAYNAME" = "%@ が名前を %@ に変更しました";
|
||||
"USER_UPDATED_DISPLAYNAME" = "%@さんが名前を%@に変更しました";
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"FILE_FROM_USER" = "%@ がファイルを送信しました: %@";
|
||||
"FILE_FROM_USER" = "%@がファイルを送信しました:%@";
|
||||
|
||||
/* New audio message from a specific person, not referencing a room. */
|
||||
"AUDIO_FROM_USER" = "%@ が音声ファイルを送信しました: %@";
|
||||
"AUDIO_FROM_USER" = "%@が音声ファイルを送信しました:%@";
|
||||
|
||||
/* New voice broadcast from a specific person, not referencing a room. */
|
||||
"VOICE_BROADCAST_FROM_USER" = "%@さんが音声配信を開始しました";
|
||||
|
||||
@@ -2605,14 +2605,6 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Niets nieuws.";
|
||||
"all_chats_onboarding_try_it" = "Probeer het uit";
|
||||
"all_chats_onboarding_title" = "Wat is nieuw";
|
||||
"all_chats_onboarding_page_message3" = "Tik op je profiel om ons te laten weten wat je ervan vindt.";
|
||||
"all_chats_onboarding_page_title3" = "Geef feedback";
|
||||
"all_chats_onboarding_page_message2" = "Krijg sneller en gemakkelijker toegang tot je Spaces (linksonder) dan ooit tevoren.";
|
||||
"all_chats_onboarding_page_title2" = "Toegang tot spaces";
|
||||
"all_chats_onboarding_page_message1" = "Om je Element te vereenvoudigen, zijn tabbladen nu optioneel. Beheer ze met behulp van het menu rechtsboven.";
|
||||
"all_chats_onboarding_page_title1" = "Welkom bij de nieuwe weergave!";
|
||||
"all_chats_edit_menu_space_settings" = "Space instellingen";
|
||||
"all_chats_edit_menu_leave_space" = "Verlaat %@";
|
||||
"all_chats_user_menu_settings" = "Gebruikersinstellingen";
|
||||
|
||||
@@ -2533,13 +2533,6 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Nic nowego.";
|
||||
"all_chats_onboarding_try_it" = "Wypróbuj";
|
||||
"all_chats_onboarding_title" = "Co nowego";
|
||||
"all_chats_onboarding_page_message3" = "Dotknij swojego profilu by poinformować nas, co o tym sądzisz.";
|
||||
"all_chats_onboarding_page_title3" = "Prześlij opinię";
|
||||
"all_chats_onboarding_page_message2" = "Uzyskaj dostęp do twoich przestrzeni (lewy dolny róg) szybciej i prościej niż kiedykolwiek.";
|
||||
"all_chats_onboarding_page_message1" = "Aby uprościć korzystanie z Element, karty są teraz opcjonalne. Możesz nimi zarządzać w menu w prawym górnym rogu.";
|
||||
"all_chats_onboarding_page_title1" = "Witaj w nowym widoku!";
|
||||
"all_chats_edit_menu_space_settings" = "Ustawienia przestrzeni";
|
||||
"all_chats_edit_menu_leave_space" = "Opuść %@";
|
||||
"all_chats_user_menu_settings" = "Ustawienia użytkownika";
|
||||
|
||||
@@ -2446,14 +2446,6 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Nada novo.";
|
||||
"all_chats_onboarding_try_it" = "Experimentar";
|
||||
"all_chats_onboarding_title" = "O que tem de novo";
|
||||
"all_chats_onboarding_page_message3" = "Toque em seu perfil para nos deixar sabendo do que você acha.";
|
||||
"all_chats_onboarding_page_title3" = "Dê Feedback";
|
||||
"all_chats_onboarding_page_message2" = "Acesse seus Espaços (esquerda fundo) mais rápido e fácil que jamais antes.";
|
||||
"all_chats_onboarding_page_title2" = "Acesse Espaços";
|
||||
"all_chats_onboarding_page_message1" = "Para simplificar seu Element, abas são agora opcionais. Gerencie-as usando o menu direito topo.";
|
||||
"all_chats_onboarding_page_title1" = "Boas vindas a uma nova visão!";
|
||||
"all_chats_nothing_found_placeholder_message" = "Tente ajustar sua pesquisa.";
|
||||
"all_chats_nothing_found_placeholder_title" = "Nada encontrado.";
|
||||
"all_chats_empty_unreads_placeholder_message" = "Isto é onde suas mensagens não-lidas vão aparecer, quando você tiver algumas.";
|
||||
|
||||
@@ -168,3 +168,6 @@
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"LOCATION_FROM_USER" = "%@ zdieľal/a svoju polohu";
|
||||
|
||||
/* New voice broadcast from a specific person, not referencing a room. */
|
||||
"VOICE_BROADCAST_FROM_USER" = "%@ začal/a hlasové vysielanie";
|
||||
|
||||
@@ -2668,14 +2668,6 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Nič nové.";
|
||||
"all_chats_onboarding_try_it" = "Vyskúšajte si to";
|
||||
"all_chats_onboarding_title" = "Čo je nové";
|
||||
"all_chats_onboarding_page_message3" = "Ťuknite na svoj profil a dajte nám vedieť, čo si myslíte.";
|
||||
"all_chats_onboarding_page_title3" = "Poskytnite spätnú väzbu";
|
||||
"all_chats_onboarding_page_title2" = "Prístup k priestorom";
|
||||
"all_chats_onboarding_page_message2" = "Získajte prístup k svojim priestorom (vľavo dole) rýchlejšie a jednoduchšie ako kedykoľvek predtým.";
|
||||
"all_chats_onboarding_page_message1" = "Pre zjednodušenie vašej aplikácie Element, sú teraz karty voliteľné. Spravujte ich pomocou ponuky vpravo hore.";
|
||||
"all_chats_onboarding_page_title1" = "Vitajte v novom zobrazení!";
|
||||
"all_chats_nothing_found_placeholder_message" = "Skúste upraviť svoje hľadanie.";
|
||||
"all_chats_nothing_found_placeholder_title" = "Nič sa nenašlo.";
|
||||
"all_chats_empty_unreads_placeholder_message" = "Tu sa zobrazia neprečítané správy, ak nejaké máte.";
|
||||
@@ -2891,3 +2883,44 @@
|
||||
"poll_timeline_decryption_error" = "Z dôvodu chýb v dešifrovaní sa niektoré hlasy nemusia započítať";
|
||||
"voice_message_broadcast_in_progress_message" = "Nemôžete spustiť hlasovú správu, pretože práve nahrávate živé vysielanie. Ukončite prosím živé vysielanie, aby ste mohli začať nahrávať hlasovú správu";
|
||||
"voice_message_broadcast_in_progress_title" = "Nemožno spustiť hlasovú správu";
|
||||
"poll_timeline_ended_text" = "Ukončil anketu";
|
||||
"voice_broadcast_voip_cannot_start_description" = "Nemôžete spustiť hovor, pretože práve nahrávate živé vysielanie. Ukončite živé vysielanie, aby ste mohli začať hovor.";
|
||||
"voice_broadcast_voip_cannot_start_title" = "Nie je možné začať hovor";
|
||||
"poll_history_no_past_poll_text" = "V tejto miestnosti nie sú žiadne predchádzajúce ankety";
|
||||
"poll_history_no_active_poll_text" = "V tejto miestnosti nie sú žiadne aktívne ankety";
|
||||
"poll_history_past_segment_title" = "Predchádzajúce ankety";
|
||||
"poll_history_active_segment_title" = "Aktívne ankety";
|
||||
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "História ankety";
|
||||
"room_details_polls" = "História ankety";
|
||||
"accessibility_selected" = "vybrané";
|
||||
"voice_broadcast_connection_error_message" = "Bohužiaľ teraz nemôžeme spustiť nahrávanie. Skúste to prosím neskôr.";
|
||||
"voice_broadcast_connection_error_title" = "Chyba pripojenia";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Hlasové vysielanie";
|
||||
"wysiwyg_composer_format_action_quote" = "Prepínanie citácie";
|
||||
"wysiwyg_composer_format_action_code_block" = "Prepnutie bloku kódu";
|
||||
"wysiwyg_composer_format_action_ordered_list" = "Prepínanie číslovaného zoznamu";
|
||||
"wysiwyg_composer_format_action_unordered_list" = "Prepnúť zoznam s odrážkami";
|
||||
"voice_broadcast_recorder_connection_error" = "Chyba pripojenia - nahrávanie pozastavené";
|
||||
"poll_timeline_reply_ended_poll" = "Ukončená anketa";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_migrating_data" = "Migrácia údajov\n%@ %%";
|
||||
"settings_labs_disable_crypto_sdk" = "Rust end-to-end šifrovanie (odhláste sa, aby ste ho vypli)";
|
||||
"settings_labs_confirm_crypto_sdk" = "Upozorňujeme, že táto funkcia je stále v experimentálnej fáze, preto nemusí fungovať podľa očakávaní a môže mať potenciálne nezamýšľané dôsledky. Ak chcete funkciu vrátiť späť, jednoducho sa odhláste a znova prihláste. Používajte ju podľa vlastného uváženia a s opatrnosťou.";
|
||||
"settings_labs_enable_crypto_sdk" = "Rust end-to-end šifrovanie";
|
||||
"poll_history_load_more" = "Načítať ďalšie ankety";
|
||||
"poll_history_no_past_poll_period_text" = "Za posledných %@ dní nie sú aktívne žiadne ankety. Načítaním ďalších ankiet zobrazíte ankety za predchádzajúce mesiace";
|
||||
"poll_history_no_active_poll_period_text" = "Za posledných %@ dní nie sú aktívne žiadne ankety. Načítaním ďalších ankiet zobrazíte ankety za predchádzajúce mesiace";
|
||||
"poll_history_loading_text" = "Zobrazenie ankiet";
|
||||
"poll_history_fetching_error" = "Chyba pri načítavaní ankiet.";
|
||||
"voice_broadcast_playback_unable_to_decrypt" = "Toto hlasové vysielanie sa nedá dešifrovať.";
|
||||
"home_context_menu_mark_as_unread" = "Označiť ako neprečítané";
|
||||
"key_backup_recover_from_private_key_progress" = "%@%% Dokončené";
|
||||
"wysiwyg_composer_format_action_indent" = "Zväčšenie odsadenia";
|
||||
"wysiwyg_composer_format_action_un_indent" = "Zmenšenie odsadenia";
|
||||
"poll_history_detail_view_in_timeline" = "Zobraziť anketu na časovej osi";
|
||||
"settings_push_rules_error" = "Pri aktualizácii vašich predvolieb oznámení došlo k chybe. Skúste prosím prepnúť možnosť znova.";
|
||||
|
||||
@@ -118,3 +118,6 @@
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"LOCATION_FROM_USER" = "%@ tregoi vendndodhjen e vet";
|
||||
|
||||
/* New voice broadcast from a specific person, not referencing a room. */
|
||||
"VOICE_BROADCAST_FROM_USER" = "%@ nisi një transmetim zanor";
|
||||
|
||||
@@ -2417,7 +2417,6 @@
|
||||
|
||||
// MARK: Authentication
|
||||
"authentication_registration_title" = "Krijoni llogarinë tuaj";
|
||||
"all_chats_onboarding_page_message3" = "Prekni profilin tuaj që të na bëni të ditur se ç’mendoni.";
|
||||
"all_chats_edit_layout_add_section_message" = "Fiksoni ndarje te kreu, për hyrje të lehtë në ta";
|
||||
"room_event_encryption_info_key_authenticity_not_guaranteed" = "S’mund të garantohet mirëfilltësia e këtij mesazhi të fshehtëzuar në këtë pajisje.";
|
||||
"deselect_all" = "Shpërzgjidhi Krejt";
|
||||
@@ -2534,13 +2533,6 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "S’ka gjë të re.";
|
||||
"all_chats_onboarding_try_it" = "Provojeni";
|
||||
"all_chats_onboarding_title" = "Ç’ka të re";
|
||||
"all_chats_onboarding_page_title3" = "Jepni Përshtypje";
|
||||
"all_chats_onboarding_page_message2" = "Hyni në Hapësirat tuaja (poshtë djathtas) më shpejt dhe më kollaj se kurrë më parë.";
|
||||
"all_chats_onboarding_page_title2" = "Hyni Në Hapësira";
|
||||
"all_chats_onboarding_page_message1" = "Që të thjeshtohet Element-i juaj, skedat tanimë janë opsionale. Administrojini duke përdorur menunë djathtas në krye.";
|
||||
"all_chats_onboarding_page_title1" = "Mirë se vini te një pamje e re!";
|
||||
"all_chats_edit_menu_space_settings" = "Rregullime hapësire";
|
||||
"all_chats_edit_menu_leave_space" = "Braktise %@";
|
||||
"all_chats_user_menu_settings" = "Rregullime përdoruesi";
|
||||
@@ -2676,3 +2668,46 @@
|
||||
"notice_voice_broadcast_ended" = "%@ përfundoi një transmetim zanor.";
|
||||
"notice_voice_broadcast_live" = "Transmetim i drejtëpërdrejtë";
|
||||
"user_other_session_security_recommendation_title" = "Sesione të tjerë";
|
||||
"poll_timeline_ended_text" = "Përfundoi pyetësori";
|
||||
"poll_timeline_decryption_error" = "Për shkak gabimesh shfshehtëzimi, mund të mos jenë numëruar disa vota";
|
||||
"poll_history_no_past_poll_text" = "Në këtë dhomë s’ka pyetësorë të dikurshëm";
|
||||
"poll_history_no_active_poll_text" = "Në këtë dhomë s’ka pyetësorë aktivë";
|
||||
"poll_history_past_segment_title" = "Pyetësorë të dikurshëm";
|
||||
"poll_history_active_segment_title" = "Pyetësorë aktivë";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Transmetim zanor";
|
||||
"voice_broadcast_voip_cannot_start_description" = "S’mund të niset thirrje, ngaqë aktualisht po regjistroni një transmetim të drejtpërdrejtë. Ju lutemi, përfundoni transmetimin e drejtpërdrejtë, që të mund të nisni një thirrje.";
|
||||
"voice_broadcast_voip_cannot_start_title" = "S’niset dot një thirrje";
|
||||
"voice_message_broadcast_in_progress_message" = "S’mund të niset mesazh zanor, ngaqë aktualisht po regjistroni një transmetim të drejtpërdrejtë. Ju lutemi, përfundoni transmetimin e drejtpërdrejtë, që të mund të nisni regjistrimin e një mesazhi zanor";
|
||||
"voice_message_broadcast_in_progress_title" = "S’niset dot mesazh zanor";
|
||||
"wysiwyg_composer_format_action_quote" = "Shfaq/fshih citim";
|
||||
"wysiwyg_composer_format_action_code_block" = "Shfaq/fshih bllok kodi";
|
||||
"wysiwyg_composer_format_action_ordered_list" = "Shfaq/fshih listë të numërtuar";
|
||||
"wysiwyg_composer_format_action_unordered_list" = "Shfaq/fshih listë me toptha";
|
||||
"poll_timeline_reply_ended_poll" = "Pyetësor i përfunduar";
|
||||
"poll_history_fetching_error" = "Gabim në sjelle pyetësorë.";
|
||||
"poll_history_load_more" = "Ngarko më tepër pyetësorë";
|
||||
"poll_history_no_past_poll_period_text" = "S’ka pyetësorë të kaluar për %@ ditët e shkuara. Që të shihni pyetësorë nga muajt e kaluar, ngarkoni më tepër pyetësorë";
|
||||
"poll_history_no_active_poll_period_text" = "S’ka pyetësorë aktivë për %@ ditët e shkuara. Që të shihni pyetësorë nga muajt e kaluar, ngarkoni më tepër pyetësorë";
|
||||
"poll_history_loading_text" = "Shfaqje pyetësorësh";
|
||||
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "Historik pyetësorësh";
|
||||
"voice_broadcast_playback_unable_to_decrypt" = "S’arrihet të shfshehtëzohet ky transmetim zanor.";
|
||||
"voice_broadcast_recorder_connection_error" = "Gabim lidhjeje - Incizimi u ndal";
|
||||
"voice_broadcast_connection_error_message" = "Mjerisht, s’jemi në gjendje të nisim një incizim mu tani. Ju lutemi, riprovoni më vonë.";
|
||||
"voice_broadcast_connection_error_title" = "Gabim lidhjeje";
|
||||
"home_context_menu_mark_as_unread" = "Vëri shenjë si i palexuar";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_migrating_data" = "Po migrohen të dhëna\n%@ %%";
|
||||
"key_backup_recover_from_private_key_progress" = "Plotësuar %@%%";
|
||||
"room_details_polls" = "Historik pyetësorësh";
|
||||
"settings_labs_disable_crypto_sdk" = "Fshehtëzim skaj-më-skaj bazuar në Rust (që ta çaktivizoni, dilni)";
|
||||
"settings_labs_confirm_crypto_sdk" = "Ju lutemi, kini parasysh se kjo veçori është ende në fazë eksperimentale, mund të mos funksionojë siç pritet dhe mundet, në potencial, të ketë pasojë të paparashikuara. Që ta prapaktheni këtë veçori, thjesht dilni nga llogaria dhe rihyni. Përdoreni me përgjegjësinë tuaj dhe me kujdes.";
|
||||
"settings_labs_enable_crypto_sdk" = "Fshehtëzim skaj-më-skaj bazuar në Rust";
|
||||
"settings_push_rules_error" = "Ndodhi një gabim, kur përditësoheshin parapëlqimet tuaja për njoftime. JU lutemi, provoni të aktivizoni mundësi tuaj sërish.";
|
||||
"wysiwyg_composer_format_action_un_indent" = "Zvogëlo shmangie kryeradhë";
|
||||
"wysiwyg_composer_format_action_indent" = "Rrit shmangie kryeradhe";
|
||||
"poll_history_detail_view_in_timeline" = "Shiheni pyetësorin në rrjedhë kohore";
|
||||
|
||||
@@ -118,3 +118,6 @@
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"LOCATION_FROM_USER" = "%@ delade sin plats";
|
||||
|
||||
/* New voice broadcast from a specific person, not referencing a room. */
|
||||
"VOICE_BROADCAST_FROM_USER" = "%@ påbörjade en röstsändning";
|
||||
|
||||
@@ -2310,7 +2310,7 @@
|
||||
"authentication_terms_policy_url_error" = "Kan inte hitta den valda policyn. Vänligen pröva igen senare.";
|
||||
/* The placeholder will show the homeserver's domain */
|
||||
"authentication_terms_message" = "Vänligen läs villkor och policyer för %@";
|
||||
"authentication_terms_title" = "Serverpolicyer";
|
||||
"authentication_terms_title" = "Sekretesspolicyer";
|
||||
"authentication_verify_msisdn_invalid_phone_number" = "Ogiltigt telefonnummer";
|
||||
"authentication_verify_msisdn_waiting_button" = "Skicka kod igen";
|
||||
/* The placeholder will show the phone number that was entered. */
|
||||
@@ -2363,3 +2363,308 @@
|
||||
|
||||
// MARK: Authentication
|
||||
"authentication_registration_title" = "Skapa ditt konto";
|
||||
"voice_broadcast_time_left" = "%@ kvar";
|
||||
"all_chats_empty_list_placeholder_title" = "Du är ikapp.";
|
||||
"all_chats_empty_view_information" = "Den säkra allt-i-ett-chattappen för lag, vänner och organisationer. Skapa en chatt, eller gå med i ett existerande rum, för att komma igång.";
|
||||
"all_chats_empty_space_information" = "Utrymmen är ett nytt sätt att gruppera rum och personer. Lägg till ett existerande rum, eller skapa ett nytt, med knappen nere till höger.";
|
||||
"all_chats_empty_view_title" = "%@\nser lite tom ut.";
|
||||
"all_chats_all_filter" = "Alla";
|
||||
"all_chats_edit_layout_alphabetical_order" = "Sortera A-Ö";
|
||||
"all_chats_edit_layout_activity_order" = "Sortera efter aktivitet";
|
||||
"all_chats_edit_layout_show_filters" = "Visa filter";
|
||||
"all_chats_edit_layout_show_recents" = "Visa nyliga";
|
||||
"all_chats_edit_layout_sorting_options_title" = "Sortera meddelanden efter";
|
||||
"all_chats_edit_layout_pin_spaces_title" = "Fäst dina utrymmen";
|
||||
"all_chats_edit_layout_add_filters_message" = "Filtrera automatiskt dina meddelanden i valfria kategorier";
|
||||
"all_chats_edit_layout_add_filters_title" = "Filtrera dina meddelanden";
|
||||
"all_chats_edit_layout_add_section_message" = "Fäst sektioner till hem för enkel åtkomst";
|
||||
"all_chats_edit_layout_add_section_title" = "Lägg till sektion i hem";
|
||||
"all_chats_edit_layout_unreads" = "Olästa";
|
||||
"all_chats_edit_layout_recents" = "Nyliga";
|
||||
"all_chats_edit_layout" = "Layoutalternativ";
|
||||
"all_chats_section_title" = "Chattar";
|
||||
|
||||
// MARK: - All Chats
|
||||
|
||||
"all_chats_title" = "Alla chattar";
|
||||
"voice_broadcast_voip_cannot_start_description" = "Du kan inte starta ett samtal eftersom att du för närvarande spelar in en direktsändning. Vänligen avsluta din direktsändning för att starta ett samtal.";
|
||||
"voice_broadcast_voip_cannot_start_title" = "Kan inte starta ett samtal";
|
||||
"voice_broadcast_stop_alert_agree_button" = "Ja, avsluta";
|
||||
"voice_broadcast_stop_alert_description" = "Är du säker på att du vill avsluta din direktsändning? Det här kommer att avsluta sändningen, och den fulla inspelningen kommer att bli tillgänglig i rummet.";
|
||||
"voice_broadcast_stop_alert_title" = "Avsluta direktsändning?";
|
||||
"voice_broadcast_buffering" = "Buffrar…";
|
||||
"voice_broadcast_tile" = "Röstsändning";
|
||||
"voice_broadcast_live" = "Live";
|
||||
"voice_broadcast_playback_loading_error" = "Kunde inte spela den här röstsändningen.";
|
||||
"voice_broadcast_already_in_progress_message" = "Du spelar redan in en röstsändning. Vänligen avsluta din nuvarande röstsändning för att starta en ny.";
|
||||
"voice_broadcast_blocked_by_someone_else_message" = "Någon annan spelar redan in en röstsändning. Vänta på att deras röstsändning avslutas för att starta en ny.";
|
||||
"voice_broadcast_permission_denied_message" = "Du har inte behörigheten som krävs för att starta en röstsändning i det här rummet. Kontakta en rumsadministratör för att uppgradera din behörighet.";
|
||||
|
||||
// MARK: - Voice Broadcast
|
||||
"voice_broadcast_unauthorized_title" = "Du kan inte starta en ny röstsändning";
|
||||
"voice_message_broadcast_in_progress_message" = "Du kan inte starta ett röstmeddelande eftersom att du för närvarande spelar in en direktsändning. Vänligen avsluta din direktsändning för att börja spela in ett röstmeddelande";
|
||||
"voice_message_broadcast_in_progress_title" = "Kan inte starta röstmeddelande";
|
||||
"spaces_subspace_creation_visibility_message" = "Det skapade utrymmet kommer att läggas till i %@.";
|
||||
"spaces_subspace_creation_visibility_title" = "Vad för sorts utrymme vill du skapa?";
|
||||
"spaces_explore_rooms_format" = "Utforska %@";
|
||||
"spaces_create_subspace_title" = "Skapa ett underutrymme";
|
||||
"spaces_add_subspace_title" = "Skapa utrymme inuti %@";
|
||||
"launch_loading_processing_response" = "Hanterar data\n%@ %%";
|
||||
"launch_loading_server_syncing_nth_attempt" = "Synkar med servern\n(%@ försök)";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_server_syncing" = "Synkar med servern";
|
||||
"key_verification_alert_body" = "Granska för att försäkra att ditt konto är säkert.";
|
||||
|
||||
// Unverified sessions
|
||||
"key_verification_alert_title" = "Du har overifierade sessioner";
|
||||
"sign_out_confirmation_message" = "Är du säker på att du vill logga ut?";
|
||||
|
||||
// MARK: Sign out warning
|
||||
|
||||
"sign_out" = "Logga ut";
|
||||
// User sessions management
|
||||
"user_sessions_settings" = "Hantera sessioner";
|
||||
"manage_session_sign_out_other_sessions" = "Logga ut ur alla andra sessioner";
|
||||
"manage_session_rename" = "Döp om session";
|
||||
"manage_session_name_info_link" = "Läs mer";
|
||||
/* The placeholder will be replaces with manage_session_name_info_link */
|
||||
"manage_session_name_info" = "Observera att sessionsnamn också är synliga för personer du pratar med. %@";
|
||||
"manage_session_name_hint" = "Anpassade sessionsnamn kan hjälpa dig att känna igen dina enheter lättare.";
|
||||
"settings_labs_enable_voice_broadcast" = "Röstsändning";
|
||||
"settings_labs_enable_wysiwyg_composer" = "Pröva den nya riktextredigeraren";
|
||||
"settings_labs_enable_new_app_layout" = "Ny applikationslayout";
|
||||
"settings_labs_enable_new_client_info_feature" = "Spara klientens namn, version och URL för att lättare känna igen sessioner i sessionshanteraren";
|
||||
"settings_labs_enable_new_session_manager" = "My sessionshanterare";
|
||||
"room_first_message_placeholder" = "Skicka ditt första meddelande…";
|
||||
"password_policy_pwd_in_dict_error" = "Det här lösenordet har hittats i en ordlista, och tillåts inte.";
|
||||
"password_policy_weak_pwd_error" = "Det här lösenordet är för svagt. Det måste innehålla minst 8 tecken, och minst ett tecken av varje typ: stor bokstav, liten bokstav, siffra och specialtecken.";
|
||||
|
||||
// MARK: Password policy errors
|
||||
"password_policy_too_short_pwd_error" = "För kort lösenord";
|
||||
"authentication_qr_login_failure_retry" = "Pröva igen";
|
||||
"authentication_qr_login_failure_request_timed_out" = "Länkningen slutfördes inte inom den krävda tiden.";
|
||||
"authentication_qr_login_failure_request_denied" = "Förfrågan nekades på en andra enheten.";
|
||||
"authentication_qr_login_failure_invalid_qr" = "QR-kod är ogiltig.";
|
||||
"authentication_qr_login_failure_title" = "Länkning misslyckades";
|
||||
"authentication_qr_login_loading_signed_in" = "Du är nu inloggad på din andra enhet.";
|
||||
"authentication_qr_login_loading_waiting_signin" = "Väntar på att enheten loggar in.";
|
||||
"authentication_qr_login_loading_connecting_device" = "Ansluter till enhet";
|
||||
"authentication_qr_login_confirm_alert" = "Vänligen försäkra att du känner till källan till den här koden. Genom att länka enheter så ger du någon full åtkomst till ditt konto.";
|
||||
"authentication_qr_login_confirm_subtitle" = "Bekräfta att koden nedan matchar den andra enheten:";
|
||||
"authentication_qr_login_confirm_title" = "Säker kommunikation etablerad";
|
||||
"authentication_qr_login_scan_subtitle" = "Placera QR-koden i rutan nedan";
|
||||
"authentication_qr_login_scan_title" = "Skanna QR-kod";
|
||||
"authentication_qr_login_display_step2" = "Välj 'Logga in med QR-kod'";
|
||||
"authentication_qr_login_display_step1" = "Öppna Element på din andra enhet";
|
||||
"authentication_qr_login_display_subtitle" = "Skanna QR-koden nedan med din enhet som är utloggad.";
|
||||
"authentication_qr_login_display_title" = "Länka en enhet";
|
||||
"authentication_qr_login_start_display_qr" = "Visa QR-kod på den här enheten";
|
||||
"authentication_qr_login_start_need_alternative" = "Behöver du en alternativ metod?";
|
||||
"authentication_qr_login_start_step4" = "Välj 'Visa QR-kod på den här enheten'";
|
||||
"authentication_qr_login_start_step3" = "Välj 'Länka en enhet'";
|
||||
"authentication_qr_login_start_step2" = "Gå till Inställningar -> Säkerhet & sekretess";
|
||||
"authentication_qr_login_start_step1" = "Öppna Element på den andra enheten";
|
||||
"authentication_qr_login_start_subtitle" = "Använd kameran på den här enheten för att skanna QR-koden som visas på den andra enheten:";
|
||||
"authentication_qr_login_start_title" = "Skanna QR-kod";
|
||||
"authentication_choose_password_not_verified_message" = "Kolla din inkorg";
|
||||
"authentication_choose_password_not_verified_title" = "E-post inte verifierad";
|
||||
"authentication_login_with_qr" = "Logga in med QR-kod";
|
||||
"invite_to" = "Bjud in till %@";
|
||||
"room_event_encryption_info_key_authenticity_not_guaranteed" = "Äktheten för det här krypterade meddelandet kan inte garanteras på den här enheten.";
|
||||
"notice_voice_broadcast_ended_by_you" = "Du avslutade en röstsändning.";
|
||||
"notice_voice_broadcast_ended" = "%@ avslutade en röstsändning.";
|
||||
"notice_voice_broadcast_live" = "Direktsändning";
|
||||
"deselect_all" = "Välj bort alla";
|
||||
"wysiwyg_composer_link_action_edit_title" = "Redigera länk";
|
||||
"wysiwyg_composer_link_action_create_title" = "Skapa en länk";
|
||||
"wysiwyg_composer_link_action_link" = "Länk";
|
||||
|
||||
|
||||
|
||||
// Links
|
||||
"wysiwyg_composer_link_action_text" = "Text";
|
||||
"wysiwyg_composer_format_action_quote" = "Växla citat";
|
||||
"wysiwyg_composer_format_action_code_block" = "Växla kodblock";
|
||||
"wysiwyg_composer_format_action_ordered_list" = "Växla numrerad lista";
|
||||
"wysiwyg_composer_format_action_unordered_list" = "Växla punktlista";
|
||||
"wysiwyg_composer_format_action_inline_code" = "Tillämpa inline-kodstil";
|
||||
"wysiwyg_composer_format_action_link" = "Tillämpa länkformat";
|
||||
"wysiwyg_composer_format_action_strikethrough" = "Tillämpa understruken stil";
|
||||
"wysiwyg_composer_format_action_underline" = "Tillämpa genomstruken stil";
|
||||
"wysiwyg_composer_format_action_italic" = "Tillämpa kursiv stil";
|
||||
|
||||
// Formatting Actions
|
||||
"wysiwyg_composer_format_action_bold" = "Tillämpa fetstil";
|
||||
"wysiwyg_composer_start_action_voice_broadcast" = "Röstsändning";
|
||||
"wysiwyg_composer_start_action_text_formatting" = "Textformatering";
|
||||
"wysiwyg_composer_start_action_camera" = "Kamera";
|
||||
"wysiwyg_composer_start_action_location" = "Plats";
|
||||
"wysiwyg_composer_start_action_polls" = "Omröstningar";
|
||||
"wysiwyg_composer_start_action_attachments" = "Bilagor";
|
||||
"wysiwyg_composer_start_action_stickers" = "Dekaler";
|
||||
|
||||
|
||||
// MARK: - WYSIWYG Composer
|
||||
|
||||
// Send Media Actions
|
||||
"wysiwyg_composer_start_action_media_picker" = "Fotobibliotek";
|
||||
"user_session_overview_session_details_button_title" = "Sessionsdetaljer";
|
||||
"user_session_overview_session_title" = "Session";
|
||||
"user_session_overview_current_session_title" = "Nuvarande session";
|
||||
"user_session_details_application_url" = "URL";
|
||||
"user_session_details_application_version" = "Version";
|
||||
"user_session_details_application_name" = "Namn";
|
||||
"user_session_details_device_os" = "Operativsystem";
|
||||
"user_session_details_device_browser" = "Webbläsare";
|
||||
"user_session_details_device_model" = "Modell";
|
||||
"user_session_details_device_ip_location" = "IP-plats";
|
||||
"user_session_details_device_ip_address" = "IP-adress";
|
||||
"user_session_details_last_activity" = "Senaste aktivitet";
|
||||
"user_session_details_session_section_footer" = "Kopiera data genom att trycka på den och hålla nere.";
|
||||
"user_session_details_session_id" = "Sessions-ID";
|
||||
"user_session_details_session_name" = "Sessionsnamn";
|
||||
"user_session_details_device_section_header" = "Enhet";
|
||||
"user_session_details_application_section_header" = "Applikation";
|
||||
"user_session_details_session_section_header" = "Session";
|
||||
"user_session_details_title" = "Sessionsdetaljer";
|
||||
"device_type_name_unknown" = "Okänd";
|
||||
"device_type_name_mobile" = "Mobil";
|
||||
"device_type_name_web" = "Webb";
|
||||
"device_type_name_desktop" = "Skrivbord";
|
||||
"device_name_unknown" = "Okänd klient";
|
||||
"device_name_mobile" = "%@ Mobil";
|
||||
"device_name_web" = "%@ Webb";
|
||||
"device_name_desktop" = "%@ Skrivbord";
|
||||
"user_inactive_session_item_with_date" = "Inaktiv i 90+ dagar (%@)";
|
||||
"user_inactive_session_item" = "Inaktiv i 90+ dagar";
|
||||
"user_session_item_details_last_activity" = "Senast aktiv %@";
|
||||
|
||||
/* %1$@ will be the verification state and %2$@ will be user_session_item_details_verification_unknown or user_other_session_current_session_details */
|
||||
"user_session_item_details" = "%1$@ · %2$@";
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@: %@";
|
||||
"user_other_session_menu_sign_out_sessions" = "Logga ut ur %@ sessioner";
|
||||
"user_other_session_menu_select_sessions" = "Välj sessioner";
|
||||
"user_other_session_selected_count" = "%@ valda";
|
||||
"user_other_session_clear_filter" = "Rensa filter";
|
||||
"user_other_session_no_unverified_sessions" = "Inga overifierade sessioner hittade.";
|
||||
"user_other_session_no_verified_sessions" = "Inga verifierade sessioner hittade.";
|
||||
"user_other_session_no_inactive_sessions" = "Inga inaktiva sessioner hittade.";
|
||||
"user_other_session_filter_menu_inactive" = "Inaktiva";
|
||||
"user_other_session_filter_menu_unverified" = "Overifierade";
|
||||
"user_other_session_filter_menu_verified" = "Verifierade";
|
||||
"user_other_session_filter_menu_all" = "Alla sessioner";
|
||||
"user_other_session_filter" = "Filtrera";
|
||||
"user_other_session_verified_sessions_header_subtitle" = "För bäst säkerhet, logga ut ur alla sessioner du inte känner igen eller använder längre.";
|
||||
"user_other_session_current_session_details" = "Din nuvarande session";
|
||||
"user_other_session_unverified_sessions_header_subtitle" = "Verifiera dina sessioner för förbättrade säkra meddelanden eller logga ut ur de du inte känner igen eller använder längre.";
|
||||
"user_other_session_security_recommendation_title" = "Andra sessioner";
|
||||
"user_session_rename_session_description" = "Andra användare i direktmeddelanden och rum du går med i kan se den fulla listan över dina sessioner.\n\nDetta gör att de kan lita på att de verkligen pratar med dig, men det betyder också att de kan se sessionsnamnet du anger här.";
|
||||
"user_session_rename_session_title" = "Döper om sessioner";
|
||||
"user_session_inactive_session_description" = "Inaktiva sessioner är sessioner du inte har använt på ett tag, men de fortsätter att ta emot krypteringsnycklar.\n\nBorttagning av inaktiva sessioner förbättrar säkerhet och prestanda, och gör det enklare för dig att identifiera om en ny session ser misstänkt ut.";
|
||||
"user_session_inactive_session_title" = "Inaktiva sessioner";
|
||||
"user_session_permanently_unverified_session_description" = "Sessionen stöder inte kryptering, så den kan inte verifieras.\n\nDu kommer inte kunna delta i rum där kryptering är aktiverat när du använder den här sessionen.\n\nFör bäst säkerhet så rekommenderas det att använda Matrixklienter som stöder kryptering.";
|
||||
"user_session_unverified_session_description" = "Overifierade sessioner är sessioner som har loggat in med dina uppgifter men som inte har korsverifierats.\n\nDu bör speciellt försäkra att du känner igen dessa sessioner eftersom de kan representera obehörig användning av ditt konto.";
|
||||
"user_session_unverified_session_title" = "Overifierad session";
|
||||
"user_session_verified_session_description" = "Verifierade sessioner är alla ställen där du använder Element efter att ha angett din lösenfras eller bekräftat din identitet med en annan verifierad session.\n\nDet betyder att du har alla nycklar som krävs för att låsa upp krypterade meddelanden och bekräfta för andra användare att du litar på den här sessionen.";
|
||||
"user_session_verified_session_title" = "Verifierade sessioner";
|
||||
"user_session_got_it" = "Förstått";
|
||||
"user_session_push_notifications_message" = "När aktiverad så tar den här sessionen emot pushnotiser.";
|
||||
"user_session_push_notifications" = "Pushnotiser";
|
||||
"user_other_session_verified_additional_info" = "Den här sessioner är redo för säkra meddelanden.";
|
||||
"user_other_session_permanently_unverified_additional_info" = "Den här sessionen stöder inte kryptering och kan därför inte verifieras.";
|
||||
"user_other_session_unverified_additional_info" = "Verifiera eller logga ut ur den här sessionen för bäst säkerhet och pålitlighet.";
|
||||
"user_session_verification_unknown_additional_info" = "Verifiera din nuvarande session för att avslöja den här sessionens verifieringsstatus.";
|
||||
"user_session_unverified_additional_info" = "Verifiera din nuvarande session för förbättrade säkra meddelanden.";
|
||||
"user_session_verified_additional_info" = "Din nuvarande session är redo för säkra meddelanden.";
|
||||
"user_session_learn_more" = "Läs mer";
|
||||
"user_session_view_details" = "Visa detaljer";
|
||||
"user_session_verify_action" = "Verifiera session";
|
||||
"user_session_verification_unknown_short" = "Okänd";
|
||||
"user_session_unverified_short" = "Overifierad";
|
||||
"user_session_verified_short" = "Verifierad";
|
||||
"user_session_verification_unknown" = "Okänd verifieringsstatus";
|
||||
"user_session_unverified" = "Overifierad session";
|
||||
"user_session_verified" = "Verifierad session";
|
||||
"user_sessions_view_all_action" = "Visa alla (%d)";
|
||||
"user_sessions_overview_link_device" = "Länka en enhet";
|
||||
"user_sessions_overview_current_session_section_title" = "Nuvarande session";
|
||||
"user_sessions_hide_location_info" = "Dölj IP-adress";
|
||||
"user_sessions_show_location_info" = "Visa IP-adress";
|
||||
"user_sessions_overview_other_sessions_section_info" = "För bäst säkerhet, verifiera dina sessioner och logga ut ur alla sessioner du inte känner igen eller använder längre.";
|
||||
"user_sessions_overview_other_sessions_section_title" = "Andra sessioner";
|
||||
"user_sessions_overview_security_recommendations_inactive_info" = "Överväg att logga ut ur gamla sessioner (90 dagar eller äldre) du inte använder längre.";
|
||||
"user_sessions_overview_security_recommendations_inactive_title" = "Inaktiva sessioner";
|
||||
"user_sessions_overview_security_recommendations_unverified_info" = "Verifiera eller logga ut från overifierade sessioner.";
|
||||
"user_sessions_overview_security_recommendations_unverified_title" = "Overifierade sessioner";
|
||||
"user_sessions_overview_security_recommendations_section_info" = "Förbättra din kontosäkerhet genom att följa dessa rekommendationer.";
|
||||
"user_sessions_overview_security_recommendations_section_title" = "Säkerhetsrekommendationer";
|
||||
"user_sessions_overview_title" = "Sessioner";
|
||||
|
||||
// MARK: User sessions management
|
||||
|
||||
// Parameter is the application display name (e.g. "Element")
|
||||
"user_sessions_default_session_display_name" = "%@ iOS";
|
||||
"location_sharing_map_loading_error" = "Kan inte ladda karta.\nDen här hemservern är inte konfigurerad för att visa kartor";
|
||||
"location_sharing_invalid_power_level_message" = "Du har inte de behörigheter som krävs för att dela realtidsplats i det här rummet.";
|
||||
"location_sharing_invalid_power_level_title" = "Du är inte behörig att dela realtidsplats";
|
||||
"poll_timeline_reply_ended_poll" = "Avslutade omröstning";
|
||||
"poll_timeline_ended_text" = "Avslutade omröstningen";
|
||||
"poll_timeline_decryption_error" = "På grund av avkrypteringsfel så kanske inte vissa röster räknas";
|
||||
"poll_history_fetching_error" = "Fel vid hämtning av omröstningar.";
|
||||
"poll_history_load_more" = "Ladda fler omröstningar";
|
||||
"poll_history_no_past_poll_period_text" = "Det finns inga tidigare omröstningar från det senaste %@ dagarna. Ladda fler omröstningar för att se omröstningar från tidigare månader";
|
||||
"poll_history_no_active_poll_period_text" = "Det finns inga aktiva omröstningar under de senaste %@ dagarna. Ladda fler omröstningar för att visa omröstningar för tidigare månader";
|
||||
"poll_history_no_past_poll_text" = "Det finns inga tidigare omröstningar i det här rummet";
|
||||
"poll_history_no_active_poll_text" = "Det finns inga aktiva omröstningar i det här rummet";
|
||||
"poll_history_past_segment_title" = "Tidigare omröstningar";
|
||||
"poll_history_active_segment_title" = "Aktiva omröstningar";
|
||||
"poll_history_loading_text" = "Visar omröstningar";
|
||||
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "Omröstningshistorik";
|
||||
"space_invite_nav_title" = "Utrymmesinbjudan";
|
||||
"space_detail_nav_title" = "Utrymmesdetalj";
|
||||
"space_selector_create_space" = "Skapa utrymme";
|
||||
"space_selector_empty_view_information" = "Utrymmen är ett sätt att gruppera rum och personer. Skapa et utrymme för att komma igång.";
|
||||
"space_selector_empty_view_title" = "Inga utrymmen än.";
|
||||
|
||||
// MARK: - Space Selector
|
||||
|
||||
"space_selector_title" = "Mina utrymmen";
|
||||
"room_invites_empty_view_information" = "Det här är vart dina inbjudningar hamnar.";
|
||||
|
||||
// MARK: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Inget nytt.";
|
||||
"all_chats_edit_menu_space_settings" = "Utrymmesinställningar";
|
||||
"all_chats_edit_menu_leave_space" = "Lämna %@";
|
||||
"all_chats_user_menu_settings" = "Användarinställningar";
|
||||
"all_chats_user_menu_accessibility_label" = "Användarmeny";
|
||||
"room_recents_recently_viewed_section" = "Nyligen sedda";
|
||||
"all_chats_nothing_found_placeholder_message" = "Pröva att justera din sökning.";
|
||||
"all_chats_nothing_found_placeholder_title" = "Inget hittat.";
|
||||
"all_chats_empty_unreads_placeholder_message" = "Det här är vart dina olästa meddelanden kommer att hamna, när du har några.";
|
||||
"voice_broadcast_recorder_connection_error" = "Anslutningsfel - Inspelning pausad";
|
||||
"voice_broadcast_connection_error_message" = "Tyvärr kan vi inte starta en röstsändning för tillfället. Vänligen pröva igen senare.";
|
||||
"voice_broadcast_connection_error_title" = "Anslutningsfel";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Röstsändning";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_migrating_data" = "Migrerar data\n%@ %%";
|
||||
"room_details_polls" = "Omröstningshistorik";
|
||||
"settings_labs_disable_crypto_sdk" = "Totalsträckskryptering i Rust (logga ut för att stänga av)";
|
||||
"settings_labs_confirm_crypto_sdk" = "Vänligen observera att den här funktionen fortfarande ska anses vara experimentell, den kanske inte fungerar som förväntat eller kan leda till okända konsekvenser. För att återgå, logga ut och logga sedan in igen. Använd på egen risk.";
|
||||
"settings_labs_enable_crypto_sdk" = "Totalsträckskryptering i Rust";
|
||||
"accessibility_selected" = "vald";
|
||||
"settings_push_rules_error" = "Ett fel uppstod vid uppdatering av dina aviseringsinställningar. Vänligen försök att växla dina alternativ igen.";
|
||||
"wysiwyg_composer_format_action_un_indent" = "Minska indrag";
|
||||
"wysiwyg_composer_format_action_indent" = "Öka indrag";
|
||||
"poll_history_detail_view_in_timeline" = "Visa omröstning i tidslinje";
|
||||
"voice_broadcast_playback_unable_to_decrypt" = "Kunde inte avkryptera denna röstsändning.";
|
||||
"home_context_menu_mark_as_unread" = "Markera som oläst";
|
||||
"key_backup_recover_from_private_key_progress" = "%@%% Färdig";
|
||||
|
||||
@@ -118,3 +118,6 @@
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"LOCATION_FROM_USER" = "%@ надсилає дані про своє місцеперебування";
|
||||
|
||||
/* New voice broadcast from a specific person, not referencing a room. */
|
||||
"VOICE_BROADCAST_FROM_USER" = "%@ розпочинає голосову трансляцію";
|
||||
|
||||
@@ -2670,14 +2670,6 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Нічого нового.";
|
||||
"all_chats_onboarding_try_it" = "Спробувати";
|
||||
"all_chats_onboarding_title" = "Що нового";
|
||||
"all_chats_onboarding_page_message3" = "Торкніться свого профілю, щоб розповісти нам свою думку.";
|
||||
"all_chats_onboarding_page_title3" = "Напишіть відгук";
|
||||
"all_chats_onboarding_page_message2" = "Отримуйте доступ до своїх просторів (унизу ліворуч) швидше та легше, ніж раніше.";
|
||||
"all_chats_onboarding_page_title2" = "Доступ до просторів";
|
||||
"all_chats_onboarding_page_message1" = "Щоб спростити ваш Element, вкладки тепер необов’язкові. Керуйте ними у верхньому правому меню.";
|
||||
"all_chats_onboarding_page_title1" = "Вітаємо в новому вигляді!";
|
||||
"all_chats_nothing_found_placeholder_message" = "Спробуйте налаштувати пошук.";
|
||||
"all_chats_nothing_found_placeholder_title" = "Нічого не знайдено.";
|
||||
"all_chats_empty_unreads_placeholder_message" = "Тут з'являтимуться ваші непрочитані повідомлення, якщо вони є.";
|
||||
@@ -2893,3 +2885,44 @@
|
||||
"poll_timeline_decryption_error" = "Через помилки під час розшифрування деякі голоси можуть бути не враховані";
|
||||
"voice_message_broadcast_in_progress_title" = "Неможливо розпочати запис голосового повідомлення";
|
||||
"voice_message_broadcast_in_progress_message" = "Ви не можете розпочати запис голосового повідомлення, оскільки зараз триває запис трансляції наживо. Будь ласка, завершіть трансляцію, щоб розпочати запис голосового повідомлення";
|
||||
"poll_timeline_ended_text" = "Опитування завершено";
|
||||
"voice_broadcast_voip_cannot_start_description" = "Ви не можете розпочати виклик, оскільки зараз відбувається запис трансляції наживо. Завершіть трансляцію, щоб розпочати виклик.";
|
||||
"voice_broadcast_voip_cannot_start_title" = "Неможливо розпочати виклик";
|
||||
"poll_history_no_past_poll_text" = "У цій кімнаті немає минулих опитувань";
|
||||
"poll_history_no_active_poll_text" = "У цій кімнаті немає активних опитувань";
|
||||
"poll_history_past_segment_title" = "Минулі опитування";
|
||||
"poll_history_active_segment_title" = "Активні опитування";
|
||||
|
||||
// MARK: - Polls history
|
||||
|
||||
"poll_history_title" = "Історія опитувань";
|
||||
"room_details_polls" = "Історія опитувань";
|
||||
"accessibility_selected" = "вибрано";
|
||||
"voice_broadcast_playback_lock_screen_placeholder" = "Голосові трансляції";
|
||||
"voice_broadcast_connection_error_message" = "На жаль, ми не можемо розпочати запис прямо зараз. Повторіть спробу пізніше.";
|
||||
"voice_broadcast_connection_error_title" = "Помилка з'єднання";
|
||||
"wysiwyg_composer_format_action_quote" = "Перемкнути цитування";
|
||||
"wysiwyg_composer_format_action_code_block" = "Перемкнути блок коду";
|
||||
"wysiwyg_composer_format_action_ordered_list" = "Перемкнути на нумерований список";
|
||||
"wysiwyg_composer_format_action_unordered_list" = "Перемкнути на маркований список";
|
||||
"voice_broadcast_recorder_connection_error" = "Помилка з'єднання - Запис призупинено";
|
||||
"poll_timeline_reply_ended_poll" = "Завершене опитування";
|
||||
|
||||
// MARK: - Launch loading
|
||||
|
||||
"launch_loading_migrating_data" = "Перенесення даних\n%@ %%";
|
||||
"settings_labs_disable_crypto_sdk" = "Наскрізне шифрування Rust (вийдіть, щоб вимкнути)";
|
||||
"settings_labs_confirm_crypto_sdk" = "Зауважте, що оскільки ця функція досі перебуває на стадії експерименту, вона може працювати не так, як очікується, і може мати непередбачувані наслідки. Щоб вимкнути цю функцію, просто вийдіть з системи та увійдіть знову. Використовуйте на власний розсуд і з обережністю.";
|
||||
"settings_labs_enable_crypto_sdk" = "Наскрізне шифрування Rust";
|
||||
"poll_history_load_more" = "Завантажити більше опитувань";
|
||||
"poll_history_no_past_poll_period_text" = "За останні %@ днів немає активних опитувань. Завантажте більше опитувань, щоб переглянути опитування за попередні місяці";
|
||||
"poll_history_no_active_poll_period_text" = "За останні %@ днів немає активних опитувань. Завантажте більше опитувань, щоб переглянути опитування за попередні місяці";
|
||||
"poll_history_loading_text" = "Показ опитувань";
|
||||
"poll_history_fetching_error" = "Помилка отримання опитувань.";
|
||||
"key_backup_recover_from_private_key_progress" = "%@%% виконано";
|
||||
"voice_broadcast_playback_unable_to_decrypt" = "Неможливо розшифрувати цю голосову трансляцію.";
|
||||
"home_context_menu_mark_as_unread" = "Позначити непрочитаним";
|
||||
"wysiwyg_composer_format_action_un_indent" = "Зменшити відступ";
|
||||
"wysiwyg_composer_format_action_indent" = "Збільшити відступ";
|
||||
"settings_push_rules_error" = "Сталася помилка під час оновлення налаштувань сповіщень. Спробуйте змінити налаштування ще раз.";
|
||||
"poll_history_detail_view_in_timeline" = "Переглянути опитування у стрічці";
|
||||
|
||||
@@ -123,3 +123,6 @@
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"LOCATION_FROM_USER" = "%@ 分享了他们的位置";
|
||||
|
||||
/* New voice broadcast from a specific person, not referencing a room. */
|
||||
"VOICE_BROADCAST_FROM_USER" = "%@开始语音广播";
|
||||
|
||||
@@ -196,7 +196,7 @@
|
||||
"room_event_action_copy" = "复制";
|
||||
"room_event_action_quote" = "引用";
|
||||
"room_event_action_redact" = "移除";
|
||||
"room_event_action_more" = "移动";
|
||||
"room_event_action_more" = "更多";
|
||||
"room_event_action_share" = "分享";
|
||||
"room_event_action_permalink" = "复制消息的链接";
|
||||
"room_event_action_view_source" = "查看源数据";
|
||||
@@ -287,8 +287,8 @@
|
||||
"settings_old_password" = "旧密码";
|
||||
"settings_new_password" = "新密码";
|
||||
"settings_confirm_password" = "确认密码";
|
||||
"settings_fail_to_update_password" = "更新密码失败";
|
||||
"settings_password_updated" = "您的密码已经更新";
|
||||
"settings_fail_to_update_password" = "更新Matrix账户密码失败";
|
||||
"settings_password_updated" = "您的Matrix账户密码已经更新";
|
||||
"settings_crypto_device_name" = "会话名称: ";
|
||||
"settings_crypto_device_id" = "\n会话ID: ";
|
||||
"settings_crypto_device_key" = "\n会话密钥:\n";
|
||||
@@ -582,7 +582,7 @@
|
||||
"deactivate_account_informations_part5" = "如果您希望我们忘记您的消息,请勾选下面的框\n\nMatrix中的消息可见性与电子邮件类似。 我们忘记您的消息意味着您已发送的消息将不会再与任何新用户或未注册用户共享,但已有权访问这些消息的注册用户仍可访问其副本。";
|
||||
"deactivate_account_forget_messages_information_part1" = "当我的账户被停用时,请忘记我发送的所有消息(";
|
||||
"deactivate_account_forget_messages_information_part3" = ": 这会导致将来加入的用户看到的是一段不完整的对话)";
|
||||
"deactivate_account_password_alert_message" = "要继续,请输入您的密码";
|
||||
"deactivate_account_password_alert_message" = "要继续,请输入你的Matrix账户密码";
|
||||
"rerequest_keys_alert_message" = "请在另一台可以解密消息的设备上启动%@,这样它就可以将密钥发送到此会话。";
|
||||
"key_backup_setup_title" = "密钥备份";
|
||||
"key_backup_setup_skip_alert_title" = "您确定吗?";
|
||||
@@ -725,7 +725,7 @@
|
||||
"settings_labs_enable_cross_signing" = "开启交叉签名按用户验证而不是按设备验证(开发中)";
|
||||
"settings_add_3pid_password_title_email" = "添加邮箱地址";
|
||||
"settings_add_3pid_password_title_msidsn" = "添加电话号码";
|
||||
"settings_add_3pid_password_message" = "请填写你的密码以继续";
|
||||
"settings_add_3pid_password_message" = "请填写你的Matrix账户的密码以继续";
|
||||
"settings_add_3pid_invalid_password_message" = "验证信息无效";
|
||||
"settings_key_backup_button_connect" = "关联此会话到密钥备份";
|
||||
"settings_devices_description" = "会话的公开名字会对你联络的人可见";
|
||||
@@ -1044,15 +1044,15 @@
|
||||
"key_verification_bootstrap_not_setup_title" = "错误";
|
||||
"key_verification_bootstrap_not_setup_message" = "您需要先启动交叉签名。";
|
||||
"key_verification_verify_qr_code_title" = "通过扫描进行验证";
|
||||
"key_verification_verify_qr_code_information" = "扫描代码以安全地相互验证。";
|
||||
"key_verification_verify_qr_code_information_other_device" = "扫描以下代码以验证:";
|
||||
"key_verification_verify_qr_code_information" = "扫描条码以安全地相互验证。";
|
||||
"key_verification_verify_qr_code_information_other_device" = "扫描以下条码以验证:";
|
||||
"key_verification_verify_qr_code_emoji_information" = "通过比较唯一的表情符号进行验证。";
|
||||
"key_verification_verify_qr_code_scan_code_action" = "扫描他们的代码";
|
||||
"key_verification_verify_qr_code_scan_code_action" = "扫描他们的条码";
|
||||
"key_verification_verify_qr_code_cannot_scan_action" = "不能扫描吗?";
|
||||
"key_verification_verify_qr_code_start_emoji_action" = "通过表情符号验证";
|
||||
"key_verification_verify_qr_code_other_scan_my_code_title" = "其他用户是否成功扫描了二维码?";
|
||||
"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" = "二维码已成功验证。";
|
||||
"key_verification_verify_qr_code_scan_other_code_success_message" = "QR码已成功验证。";
|
||||
// Scanning
|
||||
"key_verification_scan_confirmation_scanning_title" = "快好了!正在等待确认…";
|
||||
"key_verification_scan_confirmation_scanning_user_waiting_other" = "等待中%@…";
|
||||
@@ -1082,7 +1082,7 @@
|
||||
"secrets_recovery_with_key_invalid_recovery_key_title" = "无法访问机密存储";
|
||||
"secrets_recovery_with_key_invalid_recovery_key_message" = "请验证您输入的安全密钥是否正确。";
|
||||
"rooms_empty_view_information" = "房间非常适合任何群聊,无论是私人的还是公共的。点击+以查找现有房间,或新建房间。";
|
||||
"security_settings_user_password_description" = "通过输入您的账户密码确认您的身份";
|
||||
"security_settings_user_password_description" = "通过输入您的Matrix账户密码确认您的身份";
|
||||
"rooms_empty_view_title" = "房间";
|
||||
"people_empty_view_information" = "与任何人安全聊天。点击+开始添加人员。";
|
||||
"people_empty_view_title" = "用户";
|
||||
@@ -1104,7 +1104,7 @@
|
||||
"security_settings_secure_backup_synchronise" = "同步";
|
||||
"security_settings_secure_backup_setup" = "设置";
|
||||
"security_settings_secure_backup_description" = "备份你的账户数据备份和加密密钥,以防你无法访问会话。 你的密钥将受到唯一的安全密钥保护。";
|
||||
"security_settings_crypto_sessions_description_2" = "如果您未曾发起登录,请更改密码并重置安全备份。";
|
||||
"security_settings_crypto_sessions_description_2" = "如果您未曾发起登录,请更改Matrix账户的密码并重置安全备份。";
|
||||
"settings_show_NSFW_public_rooms" = "显示 NSFW 公共房间";
|
||||
"external_link_confirmation_message" = "此链接 %@ 会将您带至另一个网站:%@\n\n是否前往?";
|
||||
"external_link_confirmation_title" = "双击此链接";
|
||||
@@ -1167,14 +1167,14 @@
|
||||
"room_info_list_section_other" = "其他";
|
||||
"create_room_section_footer_encryption" = "加密一经启用,便无法禁用。";
|
||||
"create_room_placeholder_address" = "#testroom:matrix.org";
|
||||
"create_room_section_header_address" = "房间地址";
|
||||
"create_room_section_header_type" = "房间类型";
|
||||
"create_room_section_header_address" = "地址";
|
||||
"create_room_section_header_type" = "谁可以加入";
|
||||
"create_room_enable_encryption" = "启用加密";
|
||||
"create_room_section_header_encryption" = "房间加密";
|
||||
"create_room_section_header_encryption" = "加密";
|
||||
"create_room_placeholder_topic" = "这个房间是关于什么的?";
|
||||
"create_room_section_header_topic" = "房间话题(可选)";
|
||||
"create_room_section_header_topic" = "话题(可选)";
|
||||
"create_room_placeholder_name" = "名称";
|
||||
"create_room_section_header_name" = "房间名称";
|
||||
"create_room_section_header_name" = "名称";
|
||||
|
||||
// MARK: - Create Room
|
||||
|
||||
@@ -1251,10 +1251,10 @@
|
||||
"invite_friends_share_text" = "嗨,在 %@ 跟我说:%@";
|
||||
"favourites_empty_view_information" = "你可以选择几种方法 - 最快只需按住。点击星星,它们会自动出现在这里,以确保安全。";
|
||||
"home_empty_view_information" = "团队、朋友和组织的一体化安全聊天应用程序。 点击下面的「+」按钮添加人员和房间。";
|
||||
"create_room_show_in_directory" = "在目录中显示房间";
|
||||
"create_room_show_in_directory" = "在房间目录中显示";
|
||||
"create_room_section_footer_type" = "人们只有在收到聊天室邀请后才可以进入私有房间。";
|
||||
"create_room_type_public" = "公开房间";
|
||||
"create_room_type_private" = "私有房间";
|
||||
"create_room_type_public" = "公开房间(任何人)";
|
||||
"create_room_type_private" = "私有房间(仅邀请)";
|
||||
"biometrics_cant_unlocked_alert_message_login" = "重新登录";
|
||||
"biometrics_cant_unlocked_alert_message_x" = "若要解锁,请使用 %@ 或重新登录并启用 %@";
|
||||
"biometrics_cant_unlocked_alert_title" = "无法解锁应用程序";
|
||||
@@ -1288,7 +1288,7 @@
|
||||
// Banner
|
||||
|
||||
"cross_signing_setup_banner_title" = "设置加密";
|
||||
"secrets_reset_authentication_message" = "请输入你的账户密码进行确认";
|
||||
"secrets_reset_authentication_message" = "请输入你的Matrix账户密码进行确认";
|
||||
"secrets_reset_warning_message" = "您将重新启动,没有历史记录,消息,受信任的设备或受信任的用户。";
|
||||
"secrets_reset_warning_title" = "如果你选择全部重置";
|
||||
"secrets_reset_information" = "仅当没有其他设备可用来验证此设备时,才执行此操作。";
|
||||
@@ -2231,3 +2231,57 @@
|
||||
"onboarding_congratulations_home_button" = "带我到主页";
|
||||
"onboarding_use_case_message" = "我们将帮助你连接";
|
||||
"invite_to" = "邀请到%@";
|
||||
"threads_empty_title" = "保持讨论的有条理性";
|
||||
"threads_action_my_threads" = "我的消息列";
|
||||
"threads_action_all_threads" = "所有消息列";
|
||||
"threads_title" = "消息列";
|
||||
"thread_copy_link_to_thread" = "将链接复制到消息列";
|
||||
|
||||
// MARK: Threads
|
||||
"room_thread_title" = "消息列";
|
||||
"room_accessibility_record_voice_message_hint" = "双击并保持录音。";
|
||||
"room_accessibility_record_voice_message" = "录制语音消息";
|
||||
"room_accessibility_thread_more" = "更多";
|
||||
"room_accessibility_threads" = "消息列";
|
||||
"room_event_copy_link_info" = "链接已复制到剪贴板。";
|
||||
"room_event_action_reply_in_thread" = "消息列";
|
||||
"room_event_action_view_in_room" = "在房间浏览";
|
||||
"room_first_message_placeholder" = "发送您的第一条消息……";
|
||||
"room_participants_invite_prompt_to_msg" = "您确定要邀请%@ 到 %@吗?";
|
||||
"room_participants_leave_success" = "离开房间";
|
||||
"room_participants_leave_processing" = "离开";
|
||||
"search_filter_placeholder" = "过滤";
|
||||
"password_policy_pwd_in_dict_error" = "此密码已在字典中找到,不允许使用。";
|
||||
"password_policy_weak_pwd_error" = "此密码太弱了。它必须包含至少8个字符,每种类型至少有一个字符: 大写、小写、数字和特殊字符。";
|
||||
|
||||
// MARK: Password policy errors
|
||||
"password_policy_too_short_pwd_error" = "密码过短";
|
||||
"authentication_qr_login_failure_retry" = "再试一次";
|
||||
"authentication_qr_login_failure_request_timed_out" = "连接没有在规定的时间内完成。";
|
||||
"authentication_qr_login_failure_request_denied" = "请求在另一个设备上被拒绝。";
|
||||
"authentication_qr_login_failure_invalid_qr" = "QR码无效。";
|
||||
"authentication_qr_login_failure_title" = "连接失败";
|
||||
"authentication_qr_login_loading_signed_in" = "您现在已经登录到另一个设备上。";
|
||||
"authentication_qr_login_loading_waiting_signin" = "正在等待设备以登录。";
|
||||
"authentication_qr_login_loading_connecting_device" = "正在连接到设备";
|
||||
"authentication_qr_login_confirm_alert" = "请确保您知道此代码的来源。通过连接设备,您将为某人提供对您账户的完全访问权限。";
|
||||
"authentication_qr_login_confirm_subtitle" = "确认下面的代码与您的其他设备匹配:";
|
||||
"authentication_qr_login_confirm_title" = "安全连接已建立";
|
||||
"authentication_qr_login_scan_subtitle" = "将QR码放置在下面的方框中";
|
||||
"authentication_qr_login_scan_title" = "扫描QR码";
|
||||
"authentication_qr_login_display_step2" = "选择“以QR码登入”";
|
||||
"authentication_qr_login_display_step1" = "在您的其它设备中打开Element";
|
||||
"onboarding_splash_page_4_title_no_pun" = "为您的团队发送消息。";
|
||||
"user_session_learn_more" = "了解更多";
|
||||
"manage_session_name_info_link" = "了解更多";
|
||||
"threads_beta_information_link" = "了解更多";
|
||||
"authentication_qr_login_display_subtitle" = "用你登出的设备扫描下面的QR码。";
|
||||
"room_invite_to_space_option_detail" = "他们可以探索 %@,但不会成为 %@ 的成员。";
|
||||
"analytics_prompt_message_new_user" = "通过分享匿名的使用数据,帮助我们识别问题并改进 %@ 。为了了解人们如何使用多个设备,我们将生成一个随机的标识符,由你的设备共享。";
|
||||
"threads_notice_done" = "知道了";
|
||||
"message_from_a_thread" = "来自消息列";
|
||||
"threads_empty_info_all" = "消息列帮助你的对话不离题且易于跟踪。";
|
||||
"accessibility_selected" = "已选中";
|
||||
"deselect_all" = "取消全选";
|
||||
"notice_voice_broadcast_ended" = "%@结束了一个语音广播。";
|
||||
"notice_voice_broadcast_ended_by_you" = "你结束了一个语音广播。";
|
||||
|
||||
@@ -46,10 +46,10 @@ extension MXBugReportRestClient {
|
||||
// User info (TODO: handle multi-account and find a way to expose them in rageshake API)
|
||||
var userInfo = [String: String]()
|
||||
let mainAccount = MXKAccountManager.shared().accounts.first
|
||||
if let userId = mainAccount?.mxSession.myUser.userId {
|
||||
if let userId = mainAccount?.mxSession?.myUser?.userId {
|
||||
userInfo["user_id"] = userId
|
||||
}
|
||||
if let deviceId = mainAccount?.mxSession.matrixRestClient.credentials.deviceId {
|
||||
if let deviceId = mainAccount?.mxSession?.myDeviceId {
|
||||
userInfo["device_id"] = deviceId
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@ extension MXKTableViewCellWithTextView: Themable {
|
||||
func update(theme: Theme) {
|
||||
mxkTextView.backgroundColor = .clear
|
||||
mxkTextView.textColor = theme.textPrimaryColor
|
||||
mxkTextView.tintColor = theme.tintColor
|
||||
backgroundColor = theme.backgroundColor
|
||||
contentView.backgroundColor = .clear
|
||||
}
|
||||
|
||||
@@ -637,7 +637,7 @@
|
||||
}];
|
||||
}
|
||||
|
||||
[notificationCenter enableRule:rule isEnabled:YES];
|
||||
[notificationCenter enableRule:rule isEnabled:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)setNotificationCenterDidFailObserver:(id)anObserver
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Copyright 2023 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.
|
||||
@@ -15,16 +15,12 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import MatrixSDKCrypto
|
||||
|
||||
/// A protocol for classes that can be injected with a dependency container
|
||||
protocol Injectable: AnyObject {
|
||||
var dependencies: DependencyContainer! { get set }
|
||||
}
|
||||
|
||||
extension Injectable {
|
||||
/// Used to inject the dependency container into an Injectable.
|
||||
/// - Parameter dependencies: The `DependencyContainer` to inject.
|
||||
func inject(dependencies: DependencyContainer) {
|
||||
self.dependencies = dependencies
|
||||
extension CryptoStoreError: LocalizedError {
|
||||
public var errorDescription: String? {
|
||||
// We dont really care about the type of error here when showing to the user.
|
||||
// Details about the error are tracked independently
|
||||
return VectorL10n.e2eNeedLogInAgain
|
||||
}
|
||||
}
|
||||
@@ -33,4 +33,10 @@ extension Publisher {
|
||||
Just($0).delay(for: .seconds(spacingDelay), scheduler: scheduler)
|
||||
}
|
||||
}
|
||||
|
||||
func eraseOutput() -> AnyPublisher<Void, Failure> {
|
||||
self
|
||||
.map { _ in () }
|
||||
.eraseToAnyPublisher()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,10 +51,34 @@ public class BWIL10n: NSObject {
|
||||
public static var authenticationServerSelectionLoginTitle: String {
|
||||
return BWIL10n.tr("Bwi", "authentication_server_selection_login_title")
|
||||
}
|
||||
/// Homeserver URL
|
||||
/// Gehe in die Einstellungen deines iPhones, um der App den Zugriff auf die Kamera zu erlauben.
|
||||
public static var authenticationServerSelectionQrMissingAuthorizationMessage: String {
|
||||
return BWIL10n.tr("Bwi", "authentication_server_selection_qr_missing_authorization_message")
|
||||
}
|
||||
/// Scannen nicht möglich
|
||||
public static var authenticationServerSelectionQrMissingAuthorizationTitle: String {
|
||||
return BWIL10n.tr("Bwi", "authentication_server_selection_qr_missing_authorization_title")
|
||||
}
|
||||
/// QR-Code einlesen
|
||||
public static var authenticationServerSelectionScanCodeButtonTitle: String {
|
||||
return BWIL10n.tr("Bwi", "authentication_server_selection_scan_code_button_title")
|
||||
}
|
||||
/// Dein Server ist leider noch nicht für den BundesMessenger eingerichtet. Wenn Du aus der Öffentlichen Verwaltung bist und Fragen hast, wie du den BundesMessenger nutzen kannst, besuche unsere Webseite.
|
||||
public static var authenticationServerSelectionServerDeniedMessage: String {
|
||||
return BWIL10n.tr("Bwi", "authentication_server_selection_server_denied_message")
|
||||
}
|
||||
/// Unbekannte URL
|
||||
public static var authenticationServerSelectionServerDeniedTitle: String {
|
||||
return BWIL10n.tr("Bwi", "authentication_server_selection_server_denied_title")
|
||||
}
|
||||
/// Server-URL
|
||||
public static var authenticationServerSelectionServerUrl: String {
|
||||
return BWIL10n.tr("Bwi", "authentication_server_selection_server_url")
|
||||
}
|
||||
/// Anmelden
|
||||
public static var authenticationServerSelectionSubmitButtonTitle: String {
|
||||
return BWIL10n.tr("Bwi", "authentication_server_selection_submit_button_title")
|
||||
}
|
||||
/// PIN eingeben
|
||||
public static var biometricsModeCantUnlockButtonTitle: String {
|
||||
return BWIL10n.tr("Bwi", "biometrics_mode_cant_unlock_button_title")
|
||||
@@ -903,7 +927,7 @@ public class BWIL10n: NSObject {
|
||||
public static var pinProtectionChoosePinWelcomeAfterRegister: String {
|
||||
return BWIL10n.tr("Bwi", "pin_protection_choose_pin_welcome_after_register")
|
||||
}
|
||||
/// Bestätige deine PIN
|
||||
/// Bestätige PIN
|
||||
public static var pinProtectionConfirmPin: String {
|
||||
return BWIL10n.tr("Bwi", "pin_protection_confirm_pin")
|
||||
}
|
||||
|
||||
@@ -22,9 +22,6 @@ internal typealias AssetImageTypeAlias = ImageAsset.Image
|
||||
internal class Asset: NSObject {
|
||||
@objcMembers
|
||||
@objc(AssetImages) internal class Images: NSObject {
|
||||
internal static let allChatsOnboarding1 = ImageAsset(name: "all_chats_onboarding1")
|
||||
internal static let allChatsOnboarding2 = ImageAsset(name: "all_chats_onboarding2")
|
||||
internal static let allChatsOnboarding3 = ImageAsset(name: "all_chats_onboarding3")
|
||||
internal static let analyticsCheckmark = ImageAsset(name: "AnalyticsCheckmark")
|
||||
internal static let analyticsLogo = ImageAsset(name: "AnalyticsLogo")
|
||||
internal static let socialLoginButtonApple = ImageAsset(name: "social_login_button_apple")
|
||||
@@ -126,6 +123,7 @@ internal class Asset: NSObject {
|
||||
internal static let strikethrough = ImageAsset(name: "Strikethrough")
|
||||
internal static let underlined = ImageAsset(name: "Underlined")
|
||||
internal static let bulletList = ImageAsset(name: "bullet_list")
|
||||
internal static let codeBlock = ImageAsset(name: "code_block")
|
||||
internal static let indentDecrease = ImageAsset(name: "indent_decrease")
|
||||
internal static let maximiseComposer = ImageAsset(name: "maximise_composer")
|
||||
internal static let minimiseComposer = ImageAsset(name: "minimise_composer")
|
||||
@@ -303,6 +301,7 @@ internal class Asset: NSObject {
|
||||
internal static let modIcon = ImageAsset(name: "mod_icon")
|
||||
internal static let moreReactions = ImageAsset(name: "more_reactions")
|
||||
internal static let notifications = ImageAsset(name: "notifications")
|
||||
internal static let pollHistory = ImageAsset(name: "pollHistory")
|
||||
internal static let reactionsMoreAction = ImageAsset(name: "reactions_more_action")
|
||||
internal static let rollsAndRights = ImageAsset(name: "rolls_and_rights")
|
||||
internal static let roomAccessInfoHeaderIcon = ImageAsset(name: "room_access_info_header_icon")
|
||||
@@ -380,6 +379,7 @@ internal class Asset: NSObject {
|
||||
internal static let cancel = ImageAsset(name: "cancel")
|
||||
internal static let e2eVerified = ImageAsset(name: "e2e_verified")
|
||||
internal static let horizontalLogo = ImageAsset(name: "horizontal_logo")
|
||||
internal static let loginFlowLogo = ImageAsset(name: "login_flow_logo")
|
||||
internal static let radioButtonDefault = ImageAsset(name: "radio-button-default")
|
||||
internal static let radioButtonSelected = ImageAsset(name: "radio-button-selected")
|
||||
}
|
||||
|
||||
@@ -27,6 +27,10 @@ public class VectorL10n: NSObject {
|
||||
public static var accessibilityCheckboxLabel: String {
|
||||
return VectorL10n.tr("Vector", "accessibility_checkbox_label")
|
||||
}
|
||||
/// selected
|
||||
public static var accessibilitySelected: String {
|
||||
return VectorL10n.tr("Vector", "accessibility_selected")
|
||||
}
|
||||
/// Unable to verify email address. Please check your email and click on the link it contains. Once this is done, click continue
|
||||
public static var accountEmailValidationError: String {
|
||||
return VectorL10n.tr("Vector", "account_email_validation_error")
|
||||
@@ -207,38 +211,6 @@ public class VectorL10n: NSObject {
|
||||
public static var allChatsNothingFoundPlaceholderTitle: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_nothing_found_placeholder_title")
|
||||
}
|
||||
/// To simplify your Element, tabs are now optional. Manage them using the top-right menu.
|
||||
public static var allChatsOnboardingPageMessage1: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_onboarding_page_message1")
|
||||
}
|
||||
/// Access your Spaces (bottom-left) faster and easier than ever before.
|
||||
public static var allChatsOnboardingPageMessage2: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_onboarding_page_message2")
|
||||
}
|
||||
/// Tap your profile to let us know what you think.
|
||||
public static var allChatsOnboardingPageMessage3: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_onboarding_page_message3")
|
||||
}
|
||||
/// Welcome to a new view!
|
||||
public static var allChatsOnboardingPageTitle1: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_onboarding_page_title1")
|
||||
}
|
||||
/// Access Spaces
|
||||
public static var allChatsOnboardingPageTitle2: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_onboarding_page_title2")
|
||||
}
|
||||
/// Give Feedback
|
||||
public static var allChatsOnboardingPageTitle3: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_onboarding_page_title3")
|
||||
}
|
||||
/// What's new
|
||||
public static var allChatsOnboardingTitle: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_onboarding_title")
|
||||
}
|
||||
/// Try it out
|
||||
public static var allChatsOnboardingTryIt: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_onboarding_try_it")
|
||||
}
|
||||
/// Chats
|
||||
public static var allChatsSectionTitle: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_section_title")
|
||||
@@ -2543,6 +2515,10 @@ public class VectorL10n: NSObject {
|
||||
public static var homeContextMenuMarkAsRead: String {
|
||||
return VectorL10n.tr("Vector", "home_context_menu_mark_as_read")
|
||||
}
|
||||
/// Mark as unread
|
||||
public static var homeContextMenuMarkAsUnread: String {
|
||||
return VectorL10n.tr("Vector", "home_context_menu_mark_as_unread")
|
||||
}
|
||||
/// Mute
|
||||
public static var homeContextMenuMute: String {
|
||||
return VectorL10n.tr("Vector", "home_context_menu_mute")
|
||||
@@ -2751,6 +2727,10 @@ public class VectorL10n: NSObject {
|
||||
public static var keyBackupRecoverFromPrivateKeyInfo: String {
|
||||
return VectorL10n.tr("Vector", "key_backup_recover_from_private_key_info")
|
||||
}
|
||||
/// %@%% Complete
|
||||
public static func keyBackupRecoverFromPrivateKeyProgress(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "key_backup_recover_from_private_key_progress", p1)
|
||||
}
|
||||
/// Use your Security Key to unlock your secure message history
|
||||
public static var keyBackupRecoverFromRecoveryKeyInfo: String {
|
||||
return VectorL10n.tr("Vector", "key_backup_recover_from_recovery_key_info")
|
||||
@@ -3179,6 +3159,10 @@ public class VectorL10n: NSObject {
|
||||
public static var later: String {
|
||||
return VectorL10n.tr("Vector", "later")
|
||||
}
|
||||
/// Migrating data\n%@ %%
|
||||
public static func launchLoadingMigratingData(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "launch_loading_migrating_data", p1)
|
||||
}
|
||||
/// Processing data\n%@ %%
|
||||
public static func launchLoadingProcessingResponse(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "launch_loading_processing_response", p1)
|
||||
@@ -4839,6 +4823,50 @@ public class VectorL10n: NSObject {
|
||||
public static var pollEditFormUpdateFailureTitle: String {
|
||||
return VectorL10n.tr("Vector", "poll_edit_form_update_failure_title")
|
||||
}
|
||||
/// Active polls
|
||||
public static var pollHistoryActiveSegmentTitle: String {
|
||||
return VectorL10n.tr("Vector", "poll_history_active_segment_title")
|
||||
}
|
||||
/// View poll in timeline
|
||||
public static var pollHistoryDetailViewInTimeline: String {
|
||||
return VectorL10n.tr("Vector", "poll_history_detail_view_in_timeline")
|
||||
}
|
||||
/// Error fetching polls.
|
||||
public static var pollHistoryFetchingError: String {
|
||||
return VectorL10n.tr("Vector", "poll_history_fetching_error")
|
||||
}
|
||||
/// Load more polls
|
||||
public static var pollHistoryLoadMore: String {
|
||||
return VectorL10n.tr("Vector", "poll_history_load_more")
|
||||
}
|
||||
/// Displaying polls
|
||||
public static var pollHistoryLoadingText: String {
|
||||
return VectorL10n.tr("Vector", "poll_history_loading_text")
|
||||
}
|
||||
/// There are no active polls for the past %@ days. Load more polls to view polls for previous months
|
||||
public static func pollHistoryNoActivePollPeriodText(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "poll_history_no_active_poll_period_text", p1)
|
||||
}
|
||||
/// There are no active polls in this room
|
||||
public static var pollHistoryNoActivePollText: String {
|
||||
return VectorL10n.tr("Vector", "poll_history_no_active_poll_text")
|
||||
}
|
||||
/// There are no past polls for the past %@ days. Load more polls to view polls for previous months
|
||||
public static func pollHistoryNoPastPollPeriodText(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "poll_history_no_past_poll_period_text", p1)
|
||||
}
|
||||
/// There are no past polls in this room
|
||||
public static var pollHistoryNoPastPollText: String {
|
||||
return VectorL10n.tr("Vector", "poll_history_no_past_poll_text")
|
||||
}
|
||||
/// Past polls
|
||||
public static var pollHistoryPastSegmentTitle: String {
|
||||
return VectorL10n.tr("Vector", "poll_history_past_segment_title")
|
||||
}
|
||||
/// Poll history
|
||||
public static var pollHistoryTitle: String {
|
||||
return VectorL10n.tr("Vector", "poll_history_title")
|
||||
}
|
||||
/// Due to decryption errors, some votes may not be counted
|
||||
public static var pollTimelineDecryptionError: String {
|
||||
return VectorL10n.tr("Vector", "poll_timeline_decryption_error")
|
||||
@@ -4859,6 +4887,10 @@ public class VectorL10n: NSObject {
|
||||
public static var pollTimelineOneVote: String {
|
||||
return VectorL10n.tr("Vector", "poll_timeline_one_vote")
|
||||
}
|
||||
/// Ended poll
|
||||
public static var pollTimelineReplyEndedPoll: String {
|
||||
return VectorL10n.tr("Vector", "poll_timeline_reply_ended_poll")
|
||||
}
|
||||
/// Final results based on %lu votes
|
||||
public static func pollTimelineTotalFinalResults(_ p1: Int) -> String {
|
||||
return VectorL10n.tr("Vector", "poll_timeline_total_final_results", p1)
|
||||
@@ -5503,6 +5535,10 @@ public class VectorL10n: NSObject {
|
||||
public static var roomDetailsPhotoForDm: String {
|
||||
return VectorL10n.tr("Vector", "room_details_photo_for_dm")
|
||||
}
|
||||
/// Poll history
|
||||
public static var roomDetailsPolls: String {
|
||||
return VectorL10n.tr("Vector", "room_details_polls")
|
||||
}
|
||||
/// Suggest to space members
|
||||
public static var roomDetailsPromoteRoomSuggestTitle: String {
|
||||
return VectorL10n.tr("Vector", "room_details_promote_room_suggest_title")
|
||||
@@ -7547,10 +7583,18 @@ public class VectorL10n: NSObject {
|
||||
public static var settingsLabs: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs")
|
||||
}
|
||||
/// Please be advised that as this feature is still in its experimental stage, it may not function as expected and could potentially have unintended consequences. To revert the feature, simply log out and log back in. Use at your own discretion and with caution.
|
||||
public static var settingsLabsConfirmCryptoSdk: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs_confirm_crypto_sdk")
|
||||
}
|
||||
/// Create conference calls with jitsi
|
||||
public static var settingsLabsCreateConferenceWithJitsi: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs_create_conference_with_jitsi")
|
||||
}
|
||||
/// Rust end-to-end encryption (log out to disable)
|
||||
public static var settingsLabsDisableCryptoSdk: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs_disable_crypto_sdk")
|
||||
}
|
||||
/// End-to-End Encryption
|
||||
public static var settingsLabsE2eEncryption: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs_e2e_encryption")
|
||||
@@ -7563,6 +7607,10 @@ public class VectorL10n: NSObject {
|
||||
public static var settingsLabsEnableAutoReportDecryptionErrors: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs_enable_auto_report_decryption_errors")
|
||||
}
|
||||
/// Rust end-to-end encryption
|
||||
public static var settingsLabsEnableCryptoSdk: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs_enable_crypto_sdk")
|
||||
}
|
||||
/// Live location sharing - share current location (active development, and temporarily, locations persist in room history)
|
||||
public static var settingsLabsEnableLiveLocationSharing: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs_enable_live_location_sharing")
|
||||
@@ -7723,6 +7771,10 @@ public class VectorL10n: NSObject {
|
||||
public static var settingsProfilePicture: String {
|
||||
return VectorL10n.tr("Vector", "settings_profile_picture")
|
||||
}
|
||||
/// An error occurred when updating your notification preferences. Please try to toggle your option again.
|
||||
public static var settingsPushRulesError: String {
|
||||
return VectorL10n.tr("Vector", "settings_push_rules_error")
|
||||
}
|
||||
/// Are you sure you want to remove the email address %@?
|
||||
public static func settingsRemoveEmailPromptMsg(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "settings_remove_email_prompt_msg", p1)
|
||||
@@ -9179,6 +9231,14 @@ public class VectorL10n: NSObject {
|
||||
public static var voiceBroadcastBuffering: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_buffering")
|
||||
}
|
||||
/// Unfortunately we’re unable to start a recording right now. Please try again later.
|
||||
public static var voiceBroadcastConnectionErrorMessage: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_connection_error_message")
|
||||
}
|
||||
/// Connection error
|
||||
public static var voiceBroadcastConnectionErrorTitle: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_connection_error_title")
|
||||
}
|
||||
/// Live
|
||||
public static var voiceBroadcastLive: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_live")
|
||||
@@ -9191,6 +9251,18 @@ public class VectorL10n: NSObject {
|
||||
public static var voiceBroadcastPlaybackLoadingError: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_playback_loading_error")
|
||||
}
|
||||
/// Voice broadcast
|
||||
public static var voiceBroadcastPlaybackLockScreenPlaceholder: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_playback_lock_screen_placeholder")
|
||||
}
|
||||
/// Unable to decrypt this voice broadcast.
|
||||
public static var voiceBroadcastPlaybackUnableToDecrypt: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_playback_unable_to_decrypt")
|
||||
}
|
||||
/// Connection error - Recording paused
|
||||
public static var voiceBroadcastRecorderConnectionError: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_recorder_connection_error")
|
||||
}
|
||||
/// Yes, stop
|
||||
public static var voiceBroadcastStopAlertAgreeButton: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_stop_alert_agree_button")
|
||||
@@ -9215,6 +9287,14 @@ public class VectorL10n: NSObject {
|
||||
public static var voiceBroadcastUnauthorizedTitle: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_unauthorized_title")
|
||||
}
|
||||
/// You can’t start a call as you are currently recording a live broadcast. Please end your live broadcast in order to start a call.
|
||||
public static var voiceBroadcastVoipCannotStartDescription: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_voip_cannot_start_description")
|
||||
}
|
||||
/// Can’t start a call
|
||||
public static var voiceBroadcastVoipCannotStartTitle: String {
|
||||
return VectorL10n.tr("Vector", "voice_broadcast_voip_cannot_start_title")
|
||||
}
|
||||
/// You can't start a voice message as you are currently recording a live broadcast. Please end your live broadcast in order to start recording a voice message
|
||||
public static var voiceMessageBroadcastInProgressMessage: String {
|
||||
return VectorL10n.tr("Vector", "voice_message_broadcast_in_progress_message")
|
||||
@@ -9339,6 +9419,14 @@ public class VectorL10n: NSObject {
|
||||
public static var wysiwygComposerFormatActionBold: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_format_action_bold")
|
||||
}
|
||||
/// Toggle code block
|
||||
public static var wysiwygComposerFormatActionCodeBlock: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_format_action_code_block")
|
||||
}
|
||||
/// Increase indentation
|
||||
public static var wysiwygComposerFormatActionIndent: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_format_action_indent")
|
||||
}
|
||||
/// Apply inline code format
|
||||
public static var wysiwygComposerFormatActionInlineCode: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_format_action_inline_code")
|
||||
@@ -9351,14 +9439,30 @@ public class VectorL10n: NSObject {
|
||||
public static var wysiwygComposerFormatActionLink: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_format_action_link")
|
||||
}
|
||||
/// Toggle numbered list
|
||||
public static var wysiwygComposerFormatActionOrderedList: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_format_action_ordered_list")
|
||||
}
|
||||
/// Toggle quote
|
||||
public static var wysiwygComposerFormatActionQuote: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_format_action_quote")
|
||||
}
|
||||
/// Apply underline format
|
||||
public static var wysiwygComposerFormatActionStrikethrough: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_format_action_strikethrough")
|
||||
}
|
||||
/// Decrease indentation
|
||||
public static var wysiwygComposerFormatActionUnIndent: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_format_action_un_indent")
|
||||
}
|
||||
/// Apply strikethrough format
|
||||
public static var wysiwygComposerFormatActionUnderline: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_format_action_underline")
|
||||
}
|
||||
/// Toggle bulleted list
|
||||
public static var wysiwygComposerFormatActionUnorderedList: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_format_action_unordered_list")
|
||||
}
|
||||
/// Create a link
|
||||
public static var wysiwygComposerLinkActionCreateTitle: String {
|
||||
return VectorL10n.tr("Vector", "wysiwyg_composer_link_action_create_title")
|
||||
|
||||
@@ -32,6 +32,7 @@ class EncryptionKeyManager: NSObject, MXKeyProviderDelegate {
|
||||
private static let cryptoOlmPickleKey = "cryptoOlmPickleKey"
|
||||
private static let roomLastMessageIv = "roomLastMessageIv"
|
||||
private static let roomLastMessageAesKey = "roomLastMessageAesKey"
|
||||
private static let cryptoSDKStoreKey = "cryptoSDKStoreKey"
|
||||
|
||||
private var initialized = false
|
||||
|
||||
@@ -54,9 +55,11 @@ class EncryptionKeyManager: NSObject, MXKeyProviderDelegate {
|
||||
|
||||
generateIvIfNotExists(forKey: EncryptionKeyManager.roomLastMessageIv, inStore: keychainVault)
|
||||
generateAesKeyIfNotExists(forKey: EncryptionKeyManager.roomLastMessageAesKey, inStore: keychainVault)
|
||||
generateKeyIfNotExists(forKey: EncryptionKeyManager.cryptoSDKStoreKey, inStore: keychainVault, size: 32)
|
||||
|
||||
assert(keychainVault.objectExists(withKey: EncryptionKeyManager.roomLastMessageIv), "[EncryptionKeyManager] initKeys: Failed to generate IV for room last message")
|
||||
assert(keychainVault.objectExists(withKey: EncryptionKeyManager.roomLastMessageAesKey), "[EncryptionKeyManager] initKeys: Failed to generate AES Key for room last message encryption")
|
||||
assert(keychainVault.objectExists(withKey: EncryptionKeyManager.cryptoSDKStoreKey), "[EncryptionKeyManager] initKeys: Failed to generate Key for crypto sdk store")
|
||||
|
||||
guard !BWIBuildSettings.shared.forcedPinProtection || !SecureFileStorage.shared.locked else {
|
||||
MXLog.debug("[EncryptionKeyManager] initKeys: cannot init keys as store is not ready")
|
||||
@@ -79,6 +82,7 @@ class EncryptionKeyManager: NSObject, MXKeyProviderDelegate {
|
||||
|| dataType == MXKAccountManagerDataType
|
||||
|| dataType == MXCryptoOlmPickleKeyDataType
|
||||
|| dataType == MXRoomLastMessageDataType
|
||||
|| dataType == MXCryptoSDKStoreKeyDataType
|
||||
}
|
||||
|
||||
func hasKeyForData(ofType dataType: String) -> Bool {
|
||||
@@ -92,7 +96,10 @@ class EncryptionKeyManager: NSObject, MXKeyProviderDelegate {
|
||||
case MXRoomLastMessageDataType:
|
||||
return keychainVault.objectExists(withKey: EncryptionKeyManager.roomLastMessageIv) &&
|
||||
keychainVault.objectExists(withKey: EncryptionKeyManager.roomLastMessageAesKey)
|
||||
case MXCryptoSDKStoreKeyDataType:
|
||||
return keychainVault.objectExists(withKey: EncryptionKeyManager.cryptoSDKStoreKey)
|
||||
default:
|
||||
MXLog.warning("[EncryptionKeyManager] hasKeyForData: No key for \(dataType)")
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -118,7 +125,12 @@ class EncryptionKeyManager: NSObject, MXKeyProviderDelegate {
|
||||
let aesKey = try? keychainVault.data(forKey: EncryptionKeyManager.roomLastMessageAesKey) {
|
||||
return MXAesKeyData(iv: ivKey, key: aesKey)
|
||||
}
|
||||
case MXCryptoSDKStoreKeyDataType:
|
||||
if let key = try? keychainVault.data(forKey: EncryptionKeyManager.cryptoSDKStoreKey) {
|
||||
return MXRawDataKey(key: key)
|
||||
}
|
||||
default:
|
||||
MXLog.failure("[EncryptionKeyManager] keyDataForData: Attempting to get data for unknown type", dataType)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
//
|
||||
// Copyright 2023 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import Combine
|
||||
|
||||
final class PushRulesUpdater {
|
||||
private var cancellables: Set<AnyCancellable> = .init()
|
||||
private var rules: [NotificationPushRuleType] = []
|
||||
private let notificationSettingsService: NotificationSettingsServiceType
|
||||
|
||||
init(notificationSettingsService: NotificationSettingsServiceType) {
|
||||
self.notificationSettingsService = notificationSettingsService
|
||||
|
||||
notificationSettingsService
|
||||
.rulesPublisher
|
||||
.weakAssign(to: \.rules, on: self)
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
|
||||
func syncRulesIfNeeded() async {
|
||||
await withTaskGroup(of: Void.self) { [rules, notificationSettingsService] group in
|
||||
for rule in rules {
|
||||
guard let ruleId = rule.pushRuleId else {
|
||||
continue
|
||||
}
|
||||
|
||||
let relatedRules = ruleId.syncedRules(in: rules)
|
||||
|
||||
for relatedRule in relatedRules {
|
||||
guard rule.hasSameContentOf(relatedRule) == false else {
|
||||
continue
|
||||
}
|
||||
|
||||
group.addTask {
|
||||
try? await notificationSettingsService.updatePushRuleActions(for: relatedRule.ruleId,
|
||||
enabled: rule.enabled,
|
||||
actions: rule.ruleActions)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private extension NotificationPushRuleType {
|
||||
func hasSameContentOf(_ otherRule: NotificationPushRuleType) -> Bool? {
|
||||
enabled == otherRule.enabled && ruleActions == otherRule.ruleActions
|
||||
}
|
||||
}
|
||||
@@ -205,6 +205,10 @@ final class RiotSettings: NSObject {
|
||||
/// Flag indicating if the voice broadcast feature is enabled
|
||||
@UserDefault(key: "enableVoiceBroadcast", defaultValue: false, storage: defaults)
|
||||
var enableVoiceBroadcast
|
||||
|
||||
/// Flag indicating if we are using rust-based `MatrixCryptoSDK` instead of `MatrixSDK`'s internal crypto module
|
||||
@UserDefault(key: "enableCryptoSDK", defaultValue: false, storage: defaults)
|
||||
var enableCryptoSDK
|
||||
|
||||
// MARK: Calls
|
||||
|
||||
@@ -471,11 +475,6 @@ final class RiotSettings: NSObject {
|
||||
@UserDefault(key: "lastNumberOfTrackedSpaces", defaultValue: nil, storage: defaults)
|
||||
var lastNumberOfTrackedSpaces: Int?
|
||||
|
||||
// MARK: - All Chats Onboarding
|
||||
|
||||
@UserDefault(key: "allChatsOnboardingHasBeenDisplayed", defaultValue: false, storage: defaults)
|
||||
var allChatsOnboardingHasBeenDisplayed
|
||||
|
||||
}
|
||||
|
||||
// MARK: - RiotSettings notification constants
|
||||
|
||||
@@ -169,14 +169,8 @@ class DarkTheme: NSObject, Theme {
|
||||
searchBar.backgroundImage = UIImage() // Remove top and bottom shadow
|
||||
searchBar.tintColor = self.tintColor
|
||||
|
||||
if #available(iOS 13.0, *) {
|
||||
searchBar.searchTextField.backgroundColor = self.searchBackgroundColor
|
||||
searchBar.searchTextField.textColor = self.searchPlaceholderColor
|
||||
} else {
|
||||
if let searchBarTextField = searchBar.vc_searchTextField {
|
||||
searchBarTextField.textColor = self.searchPlaceholderColor
|
||||
}
|
||||
}
|
||||
searchBar.searchTextField.backgroundColor = self.searchBackgroundColor
|
||||
searchBar.searchTextField.textColor = self.searchPlaceholderColor
|
||||
}
|
||||
|
||||
func applyStyle(onTextField texField: UITextField) {
|
||||
|
||||
@@ -177,14 +177,8 @@ class DefaultTheme: NSObject, Theme {
|
||||
return
|
||||
}
|
||||
|
||||
if #available(iOS 13.0, *) {
|
||||
searchBar.searchTextField.backgroundColor = self.searchBackgroundColor
|
||||
searchBar.searchTextField.textColor = self.searchPlaceholderColor
|
||||
} else {
|
||||
if let searchBarTextField = searchBar.vc_searchTextField {
|
||||
searchBarTextField.textColor = self.searchPlaceholderColor
|
||||
}
|
||||
}
|
||||
searchBar.searchTextField.backgroundColor = self.searchBackgroundColor
|
||||
searchBar.searchTextField.textColor = self.searchPlaceholderColor
|
||||
}
|
||||
|
||||
func applyStyle(onTextField texField: UITextField) {
|
||||
|
||||
@@ -324,6 +324,11 @@ extension Analytics {
|
||||
viewRoomTrigger = .unknown
|
||||
capture(event: event)
|
||||
}
|
||||
|
||||
func trackCryptoSDKEnabled() {
|
||||
let event = AnalyticsEvent.CryptoSDKEnabled()
|
||||
capture(event: event)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - MXAnalyticsDelegate
|
||||
@@ -393,3 +398,14 @@ extension Analytics: MXAnalyticsDelegate {
|
||||
monitoringClient.trackNonFatalIssue(issue, details: details)
|
||||
}
|
||||
}
|
||||
|
||||
/// iOS-specific analytics event triggered when users select the Crypto SDK labs option
|
||||
///
|
||||
/// Due to this event being iOS only, and temporary during gradual rollout of Crypto SDK,
|
||||
/// this event is not added into the shared analytics schema
|
||||
extension AnalyticsEvent {
|
||||
struct CryptoSDKEnabled: AnalyticsEventProtocol {
|
||||
let eventName = "CryptoSDKEnabled"
|
||||
let properties: [String: Any] = [:]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,12 +16,10 @@
|
||||
|
||||
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 {
|
||||
@@ -31,8 +29,6 @@ import AnalyticsEvents
|
||||
return .OlmKeysNotSentError
|
||||
case .olmIndexError:
|
||||
return .OlmIndexError
|
||||
case .unexpected:
|
||||
return .UnknownError
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -106,12 +106,9 @@ NSString *const kDecryptionFailureTrackerAnalyticsCategory = @"e2e.failure";
|
||||
reason = DecryptionFailureReasonOlmIndexError;
|
||||
break;
|
||||
|
||||
case MXDecryptingErrorEncryptionNotEnabledCode:
|
||||
case MXDecryptingErrorUnableToDecryptCode:
|
||||
reason = DecryptionFailureReasonUnexpected;
|
||||
break;
|
||||
|
||||
default:
|
||||
// All other error codes will be tracked as `OlmUnspecifiedError` and will include `context` containing
|
||||
// the actual error code and localized description
|
||||
reason = DecryptionFailureReasonUnspecified;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -21,6 +21,9 @@ extension __MXCallHangupReason {
|
||||
switch self {
|
||||
case .userHangup:
|
||||
return .VoipUserHangup
|
||||
case .userBusy:
|
||||
// There is no dedicated analytics event for `userBusy` error
|
||||
return .UnknownError
|
||||
case .inviteTimeout:
|
||||
return .VoipInviteTimeout
|
||||
case .iceFailed:
|
||||
@@ -32,6 +35,9 @@ extension __MXCallHangupReason {
|
||||
case .unknownError:
|
||||
return .UnknownError
|
||||
default:
|
||||
MXLog.failure("Unknown or unhandled hangup reason", context: [
|
||||
"reason": rawValue
|
||||
])
|
||||
return .UnknownError
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import Combine
|
||||
import Foundation
|
||||
import Intents
|
||||
import MatrixSDK
|
||||
@@ -61,6 +62,8 @@ final class AppCoordinator: NSObject, AppCoordinatorType {
|
||||
}
|
||||
|
||||
private var currentSpaceId: String?
|
||||
private var cancellables: Set<AnyCancellable> = .init()
|
||||
private var pushRulesUpdater: PushRulesUpdater?
|
||||
|
||||
// MARK: Public
|
||||
|
||||
@@ -82,9 +85,10 @@ final class AppCoordinator: NSObject, AppCoordinatorType {
|
||||
// MARK: - Public methods
|
||||
|
||||
func start() {
|
||||
self.setupLogger()
|
||||
self.setupTheme()
|
||||
self.excludeAllItemsFromBackup()
|
||||
setupLogger()
|
||||
setupTheme()
|
||||
excludeAllItemsFromBackup()
|
||||
setupPushRulesSessionEvents()
|
||||
|
||||
// Setup navigation router store
|
||||
_ = NavigationRouterStore.shared
|
||||
@@ -102,7 +106,7 @@ final class AppCoordinator: NSObject, AppCoordinatorType {
|
||||
if AppDelegate.theDelegate().isOffline {
|
||||
self.splitViewCoordinator?.showAppStateIndicator(with: VectorL10n.networkOfflineTitle, icon: UIImage(systemName: "wifi.slash"))
|
||||
} else {
|
||||
self.splitViewCoordinator?.hideAppStateIndicator()
|
||||
self.splitViewCoordinator?.hideAppStateIndicator()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -260,6 +264,47 @@ final class AppCoordinator: NSObject, AppCoordinatorType {
|
||||
// Reload split view with selected space id
|
||||
self.splitViewCoordinator?.start(with: spaceId)
|
||||
}
|
||||
|
||||
private func setupPushRulesSessionEvents() {
|
||||
let sessionReady = NotificationCenter.default.publisher(for: .mxSessionStateDidChange)
|
||||
.compactMap { $0.object as? MXSession }
|
||||
.filter { $0.state == .running }
|
||||
.removeDuplicates { session1, session2 in
|
||||
session1 == session2
|
||||
}
|
||||
|
||||
sessionReady
|
||||
.sink { [weak self] session in
|
||||
self?.setupPushRulesUpdater(session: session)
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
|
||||
let sessionClosed = NotificationCenter.default.publisher(for: .mxSessionStateDidChange)
|
||||
.compactMap { $0.object as? MXSession }
|
||||
.filter { $0.state == .closed }
|
||||
|
||||
sessionClosed
|
||||
.sink { [weak self] _ in
|
||||
self?.pushRulesUpdater = nil
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
|
||||
private func setupPushRulesUpdater(session: MXSession) {
|
||||
pushRulesUpdater = .init(notificationSettingsService: MXNotificationSettingsService(session: session))
|
||||
|
||||
let applicationDidBecomeActive = NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification).eraseOutput()
|
||||
let needsCheckPublisher = applicationDidBecomeActive.merge(with: Just(())).eraseToAnyPublisher()
|
||||
|
||||
needsCheckPublisher
|
||||
.sink { _ in
|
||||
Task { @MainActor [weak self] in
|
||||
await self?.pushRulesUpdater?.syncRulesIfNeeded()
|
||||
}
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - LegacyAppDelegateDelegate
|
||||
|
||||
@@ -634,6 +634,9 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
|
||||
// Pause Voice Broadcast recording if needed
|
||||
[VoiceBroadcastRecorderProvider.shared pauseRecording];
|
||||
|
||||
// Pause Voice Broadcast playing if needed
|
||||
[VoiceBroadcastPlaybackProvider.shared pausePlayingInProgressVoiceBroadcast];
|
||||
|
||||
// bwi: the app is really going into background
|
||||
self.isApplicationActiveFromSystemAlert = NO;
|
||||
}
|
||||
@@ -2341,6 +2344,9 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
|
||||
// Clear cache
|
||||
[self clearCache];
|
||||
|
||||
// Reset Crypto SDK configuration (labs flag for which crypto module to use)
|
||||
[CryptoSDKConfiguration.shared disable];
|
||||
|
||||
// Reset key backup banner preferences
|
||||
[SecureBackupBannerPreferences.shared reset];
|
||||
|
||||
@@ -2374,9 +2380,6 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
|
||||
// Logout all matrix account
|
||||
[[MXKAccountManager sharedManager] logoutWithCompletion:^{
|
||||
|
||||
// We reset allChatsOnboardingHasBeenDisplayed flag on logout
|
||||
RiotSettings.shared.allChatsOnboardingHasBeenDisplayed = NO;
|
||||
|
||||
if (completion)
|
||||
{
|
||||
completion (YES);
|
||||
@@ -2559,18 +2562,27 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
|
||||
MXLogDebug(@"[AppDelegate] showLaunchAnimation");
|
||||
|
||||
UIView *launchLoadingView;
|
||||
if (MXSDKOptions.sharedInstance.enableSyncProgress)
|
||||
if (MXSDKOptions.sharedInstance.enableStartupProgress)
|
||||
{
|
||||
if (BWIBuildSettings.shared.showBUMLottieAnimation)
|
||||
{
|
||||
launchLoadingView = [BUMLaunchLoadingViewController makeView];
|
||||
} else {
|
||||
MXSession *mainSession = self.mxSessions.firstObject;
|
||||
launchLoadingView = [LaunchLoadingView instantiateWithSyncProgress:mainSession.syncProgress];
|
||||
if (MXSDKOptions.sharedInstance.enableStartupProgress)
|
||||
{
|
||||
MXSession *mainSession = self.mxSessions.firstObject;
|
||||
launchLoadingView = [LaunchLoadingView instantiateWithStartupProgress:mainSession.startupProgress];
|
||||
}
|
||||
else
|
||||
{
|
||||
launchLoadingView = [LaunchLoadingView instantiateWithStartupProgress:nil];
|
||||
}
|
||||
[(LaunchLoadingView *) launchLoadingView updateWithTheme:ThemeService.shared.theme];
|
||||
}
|
||||
|
||||
launchLoadingView.frame = window.bounds;
|
||||
launchLoadingView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||
|
||||
[window addSubview:launchLoadingView];
|
||||
}
|
||||
|
||||
|
||||
@@ -618,8 +618,8 @@ final class AuthenticationCoordinator: NSObject, AuthenticationCoordinatorProtoc
|
||||
loadingViewController.modalPresentationStyle = .fullScreen
|
||||
navigationRouter.setRootModule(loadingViewController)
|
||||
} else {
|
||||
let syncProgress: MXSessionSyncProgress? = MXSDKOptions.sharedInstance().enableSyncProgress ? session?.syncProgress : nil
|
||||
let loadingViewController = LaunchLoadingViewController(syncProgress: syncProgress)
|
||||
let startupProgress: MXSessionStartupProgress? = MXSDKOptions.sharedInstance().enableStartupProgress ? session?.startupProgress : nil
|
||||
let loadingViewController = LaunchLoadingViewController(startupProgress: startupProgress)
|
||||
loadingViewController.modalPresentationStyle = .fullScreen
|
||||
|
||||
// Replace the navigation stack with the loading animation
|
||||
|
||||
@@ -111,8 +111,8 @@ final class LegacyAuthenticationCoordinator: NSObject, AuthenticationCoordinator
|
||||
loadingViewController.modalPresentationStyle = .fullScreen
|
||||
navigationRouter.setRootModule(loadingViewController)
|
||||
} else {
|
||||
let syncProgress: MXSessionSyncProgress? = MXSDKOptions.sharedInstance().enableSyncProgress ? session?.syncProgress : nil
|
||||
let loadingViewController = LaunchLoadingViewController(syncProgress: syncProgress)
|
||||
let startupProgress: MXSessionStartupProgress? = MXSDKOptions.sharedInstance().enableStartupProgress ? session?.startupProgress : nil
|
||||
let loadingViewController = LaunchLoadingViewController(startupProgress: startupProgress)
|
||||
loadingViewController.modalPresentationStyle = .fullScreen
|
||||
|
||||
// Replace the navigation stack with the loading animation
|
||||
|
||||
@@ -2656,6 +2656,11 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro
|
||||
editedRoomId = nil;
|
||||
}
|
||||
|
||||
-(void)roomContextActionServiceDidMarkRoom:(id<RoomContextActionServiceProtocol>)service
|
||||
{
|
||||
[self refreshRecentsTable];
|
||||
}
|
||||
|
||||
#pragma mark - RecentCellContextMenuProviderDelegate
|
||||
|
||||
- (void)recentCellContextMenuProviderDidStartShowingPreview:(RecentCellContextMenuProvider *)menuProvider
|
||||
|
||||
@@ -69,6 +69,7 @@
|
||||
self.missedNotifAndUnreadIndicator.hidden = YES;
|
||||
self.missedNotifAndUnreadBadgeBgView.hidden = YES;
|
||||
self.missedNotifAndUnreadBadgeBgViewWidthConstraint.constant = 0;
|
||||
self.missedNotifAndUnreadBadgeLabel.text = @"";
|
||||
|
||||
roomCellData = (id<MXKRecentCellDataStoring>)cellData;
|
||||
if (roomCellData)
|
||||
@@ -91,10 +92,15 @@
|
||||
self.lastEventDecriptionLabelTrailingConstraint.constant = self.unsentImageView.hidden ? 10 : 30;
|
||||
|
||||
// Notify unreads and bing
|
||||
if (roomCellData.hasUnread)
|
||||
if (roomCellData.isRoomMarkedAsUnread)
|
||||
{
|
||||
self.missedNotifAndUnreadBadgeBgView.hidden = NO;
|
||||
self.missedNotifAndUnreadBadgeBgView.backgroundColor = ThemeService.shared.theme.tintColor;
|
||||
self.missedNotifAndUnreadBadgeBgViewWidthConstraint.constant = 20;
|
||||
}
|
||||
else if (roomCellData.hasUnread)
|
||||
{
|
||||
self.missedNotifAndUnreadIndicator.hidden = NO;
|
||||
|
||||
if (0 < roomCellData.notificationCount)
|
||||
{
|
||||
if( [BWIBuildSettings.shared showMentionsInRoom] ) {
|
||||
|
||||
@@ -48,13 +48,15 @@ class RoomActionProvider: RoomActionProviderProtocol {
|
||||
])
|
||||
}
|
||||
} else {
|
||||
return UIMenu(children: [
|
||||
var children = service.hasUnread ? [self.markAsReadAction] : [self.markAsUnreadAction]
|
||||
children.append(contentsOf: [
|
||||
self.directChatAction,
|
||||
self.notificationsAction,
|
||||
self.favouriteAction,
|
||||
self.lowPriorityAction,
|
||||
self.leaveAction
|
||||
])
|
||||
return UIMenu(children: children)
|
||||
}
|
||||
} else {
|
||||
if service.roomMembership == .invite {
|
||||
@@ -126,6 +128,14 @@ class RoomActionProvider: RoomActionProviderProtocol {
|
||||
self.service.markAsRead()
|
||||
}
|
||||
}
|
||||
private var markAsUnreadAction: UIAction {
|
||||
return UIAction(
|
||||
title: VectorL10n.homeContextMenuMarkAsUnread,
|
||||
image: UIImage(systemName: "envelope.badge")) { [weak self] action in
|
||||
guard let self = self else { return }
|
||||
self.service.markAsUnread()
|
||||
}
|
||||
}
|
||||
|
||||
private var leaveAction: UIAction {
|
||||
let image = UIImage(systemName: "rectangle.righthalf.inset.fill.arrow.right")
|
||||
|
||||
@@ -38,7 +38,7 @@ class RoomContextActionService: NSObject, RoomContextActionServiceProtocol {
|
||||
self.room = room
|
||||
self.delegate = delegate
|
||||
self.isRoomJoined = room.summary?.isJoined ?? false
|
||||
self.hasUnread = room.summary?.hasAnyUnread ?? false
|
||||
self.hasUnread = (room.summary?.hasAnyUnread ?? false) || room.isMarkedAsUnread
|
||||
self.roomMembership = room.summary?.membership ?? .unknown
|
||||
self.session = room.mxSession
|
||||
self.unownedRoomService = UnownedRoomContextActionService(roomId: room.roomId, canonicalAlias: room.summary?.aliases?.first, session: self.session, delegate: delegate)
|
||||
@@ -108,6 +108,11 @@ class RoomContextActionService: NSObject, RoomContextActionServiceProtocol {
|
||||
|
||||
func markAsRead() {
|
||||
room.markAllAsRead()
|
||||
self.delegate?.roomContextActionServiceDidMarkRoom(self)
|
||||
}
|
||||
func markAsUnread() {
|
||||
room.setUnread()
|
||||
self.delegate?.roomContextActionServiceDidMarkRoom(self)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
@@ -22,6 +22,7 @@ import Foundation
|
||||
func roomContextActionService(_ service: RoomContextActionServiceProtocol, showRoomNotificationSettingsForRoomWithId roomId: String)
|
||||
func roomContextActionServiceDidJoinRoom(_ service: RoomContextActionServiceProtocol)
|
||||
func roomContextActionServiceDidLeaveRoom(_ service: RoomContextActionServiceProtocol)
|
||||
func roomContextActionServiceDidMarkRoom(_ service: RoomContextActionServiceProtocol)
|
||||
}
|
||||
|
||||
/// `RoomContextActionServiceProtocol` classes are meant to be called by a `RoomActionProviderProtocol` instance so it provides the implementation of the menu actions.
|
||||
|
||||
@@ -28,9 +28,7 @@
|
||||
[super customizeTableViewCellRendering];
|
||||
|
||||
self.roomNameLabel.textColor = ThemeService.shared.theme.textSecondaryColor;
|
||||
|
||||
self.messageTextView.tintColor = ThemeService.shared.theme.tintColor;
|
||||
|
||||
|
||||
[self updateUserNameColor];
|
||||
}
|
||||
|
||||
|
||||
@@ -30,8 +30,6 @@
|
||||
[self updateUserNameColor];
|
||||
|
||||
self.roomNameLabel.textColor = ThemeService.shared.theme.textSecondaryColor;
|
||||
|
||||
self.messageTextView.tintColor = ThemeService.shared.theme.tintColor;
|
||||
}
|
||||
|
||||
- (void)render:(MXKCellData *)cellData
|
||||
|
||||
@@ -70,8 +70,6 @@ class AllChatsViewController: HomeViewController {
|
||||
|
||||
private var isOnboardingCoordinatorPreparing: Bool = false
|
||||
|
||||
private var allChatsOnboardingCoordinatorBridgePresenter: AllChatsOnboardingCoordinatorBridgePresenter?
|
||||
|
||||
private var theme: Theme {
|
||||
ThemeService.shared().theme
|
||||
}
|
||||
@@ -182,10 +180,7 @@ class AllChatsViewController: HomeViewController {
|
||||
|
||||
AppDelegate.theDelegate().checkAppVersion()
|
||||
|
||||
// bwi: we don't want to show element specific onboarding screens
|
||||
if BuildSettings.newAppLayoutEnabled && !RiotSettings.shared.allChatsOnboardingHasBeenDisplayed && BWIBuildSettings.shared.shouldShowAllChatsOnboarding {
|
||||
self.showAllChatsOnboardingScreen()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
|
||||
@@ -203,7 +198,7 @@ class AllChatsViewController: HomeViewController {
|
||||
searchController.isActive = false
|
||||
|
||||
guard let spaceId = spaceId else {
|
||||
self.dataSource?.currentSpace = nil
|
||||
dataSource?.currentSpace = nil
|
||||
updateUI()
|
||||
|
||||
return
|
||||
@@ -214,7 +209,7 @@ class AllChatsViewController: HomeViewController {
|
||||
return
|
||||
}
|
||||
|
||||
self.dataSource.currentSpace = space
|
||||
dataSource?.currentSpace = space
|
||||
updateUI()
|
||||
|
||||
self.recentsTableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
|
||||
@@ -296,7 +291,7 @@ class AllChatsViewController: HomeViewController {
|
||||
|
||||
@objc private func showSpaceSelectorAction(sender: AnyObject) {
|
||||
Analytics.shared.viewRoomTrigger = .roomList
|
||||
let currentSpaceId = self.dataSource.currentSpace?.spaceId ?? SpaceSelectorConstants.homeSpaceId
|
||||
let currentSpaceId = dataSource?.currentSpace?.spaceId ?? SpaceSelectorConstants.homeSpaceId
|
||||
let spaceSelectorBridgePresenter = SpaceSelectorBottomSheetCoordinatorBridgePresenter(session: self.mainSession, selectedSpaceId: currentSpaceId, showHomeSpace: true)
|
||||
spaceSelectorBridgePresenter.present(from: self, animated: true)
|
||||
spaceSelectorBridgePresenter.delegate = self
|
||||
@@ -318,7 +313,7 @@ class AllChatsViewController: HomeViewController {
|
||||
return super.tableView(tableView, numberOfRowsInSection: section)
|
||||
}
|
||||
|
||||
return dataSource.tableView(tableView, numberOfRowsInSection: section)
|
||||
return dataSource?.tableView(tableView, numberOfRowsInSection: section) ?? 0
|
||||
}
|
||||
|
||||
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||
@@ -326,6 +321,10 @@ class AllChatsViewController: HomeViewController {
|
||||
return super.tableView(tableView, cellForRowAt: indexPath)
|
||||
}
|
||||
|
||||
guard let dataSource = dataSource else {
|
||||
MXLog.failure("Missing data source")
|
||||
return UITableViewCell()
|
||||
}
|
||||
return dataSource.tableView(tableView, cellForRowAt: indexPath)
|
||||
}
|
||||
|
||||
@@ -336,7 +335,7 @@ class AllChatsViewController: HomeViewController {
|
||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
||||
}
|
||||
|
||||
return dataSource.cellHeight(at: indexPath)
|
||||
return dataSource?.cellHeight(at: indexPath) ?? 0
|
||||
}
|
||||
|
||||
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||
@@ -599,7 +598,7 @@ class AllChatsViewController: HomeViewController {
|
||||
}
|
||||
|
||||
private func showSpaceInvite() {
|
||||
guard let session = mainSession, let spaceRoom = dataSource.currentSpace?.room else {
|
||||
guard let session = mainSession, let spaceRoom = dataSource?.currentSpace?.room else {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -611,7 +610,7 @@ class AllChatsViewController: HomeViewController {
|
||||
}
|
||||
|
||||
private func showSpaceMembers() {
|
||||
guard let session = mainSession, let spaceId = dataSource.currentSpace?.spaceId else {
|
||||
guard let session = mainSession, let spaceId = dataSource?.currentSpace?.spaceId else {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -625,7 +624,7 @@ class AllChatsViewController: HomeViewController {
|
||||
}
|
||||
|
||||
private func showSpaceSettings() {
|
||||
guard let session = mainSession, let spaceId = dataSource.currentSpace?.spaceId else {
|
||||
guard let session = mainSession, let spaceId = dataSource?.currentSpace?.spaceId else {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -646,7 +645,7 @@ class AllChatsViewController: HomeViewController {
|
||||
}
|
||||
|
||||
private func showLeaveSpace() {
|
||||
guard let session = mainSession, let spaceSummary = dataSource.currentSpace?.summary else {
|
||||
guard let session = mainSession, let spaceSummary = dataSource?.currentSpace?.summary else {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -684,20 +683,6 @@ class AllChatsViewController: HomeViewController {
|
||||
self.navigationController?.pushViewController(invitesViewController, animated: true)
|
||||
}
|
||||
|
||||
private func showAllChatsOnboardingScreen() {
|
||||
let allChatsOnboardingCoordinatorBridgePresenter = AllChatsOnboardingCoordinatorBridgePresenter()
|
||||
allChatsOnboardingCoordinatorBridgePresenter.completion = { [weak self] in
|
||||
RiotSettings.shared.allChatsOnboardingHasBeenDisplayed = true
|
||||
|
||||
guard let self = self else { return }
|
||||
self.allChatsOnboardingCoordinatorBridgePresenter?.dismiss(animated: true, completion: {
|
||||
self.allChatsOnboardingCoordinatorBridgePresenter = nil
|
||||
})
|
||||
}
|
||||
|
||||
allChatsOnboardingCoordinatorBridgePresenter.present(from: self, animated: true)
|
||||
self.allChatsOnboardingCoordinatorBridgePresenter = allChatsOnboardingCoordinatorBridgePresenter
|
||||
}
|
||||
}
|
||||
|
||||
private extension AllChatsViewController {
|
||||
@@ -744,11 +729,11 @@ extension AllChatsViewController: SpaceSelectorBottomSheetCoordinatorBridgePrese
|
||||
extension AllChatsViewController: UISearchResultsUpdating {
|
||||
func updateSearchResults(for searchController: UISearchController) {
|
||||
guard let searchText = searchController.searchBar.text, !searchText.isEmpty else {
|
||||
self.dataSource.search(withPatterns: nil)
|
||||
self.dataSource?.search(withPatterns: nil)
|
||||
return
|
||||
}
|
||||
|
||||
self.dataSource.search(withPatterns: [searchText])
|
||||
self.dataSource?.search(withPatterns: [searchText])
|
||||
}
|
||||
}
|
||||
|
||||
@@ -784,7 +769,7 @@ extension AllChatsViewController: AllChatsEditActionProviderDelegate {
|
||||
case .startChat:
|
||||
startChat()
|
||||
case .createSpace:
|
||||
showCreateSpace(parentSpaceId: dataSource.currentSpace?.spaceId)
|
||||
showCreateSpace(parentSpaceId: dataSource?.currentSpace?.spaceId)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -895,10 +880,12 @@ extension AllChatsViewController: SplitViewMasterViewControllerProtocol {
|
||||
return
|
||||
}
|
||||
|
||||
let devices = mainSession.crypto.devices(forUser: mainSession.myUserId).values
|
||||
let userHasOneUnverifiedDevice = devices.contains(where: {!$0.trustLevel.isCrossSigningVerified})
|
||||
if userHasOneUnverifiedDevice {
|
||||
presentReviewUnverifiedSessionsAlert(with: session)
|
||||
if let userId = mainSession.myUserId, let crypto = mainSession.crypto {
|
||||
let devices = crypto.devices(forUser: userId).values
|
||||
let userHasOneUnverifiedDevice = devices.contains(where: {!$0.trustLevel.isCrossSigningVerified})
|
||||
if userHasOneUnverifiedDevice {
|
||||
presentReviewUnverifiedSessionsAlert(with: session)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,25 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="cb6-oF-e0m">
|
||||
<device id="retina4_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="cb6-oF-e0m">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Key Backup Recover Data Loading View Controller-->
|
||||
<!--Key Backup Recover From Private Key View Controller-->
|
||||
<scene sceneID="JIv-4y-eqa">
|
||||
<objects>
|
||||
<viewController extendedLayoutIncludesOpaqueBars="YES" automaticallyAdjustsScrollViewInsets="NO" id="cb6-oF-e0m" customClass="KeyBackupRecoverFromPrivateKeyViewController" customModule="Riot" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<viewController extendedLayoutIncludesOpaqueBars="YES" automaticallyAdjustsScrollViewInsets="NO" id="cb6-oF-e0m" customClass="KeyBackupRecoverFromPrivateKeyViewController" customModule="Element" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="JOd-8G-rga">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cUL-rS-rfi">
|
||||
<rect key="frame" x="0.0" y="20" width="375" height="647"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="a4s-VR-9rG">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="239"/>
|
||||
@@ -40,15 +38,24 @@
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0% complete" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bMp-hX-C4X">
|
||||
<rect key="frame" x="20" y="160" width="335" height="20.5"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="c3s-XT-wGy" firstAttribute="top" secondItem="AA6-5y-aKB" secondAttribute="top" constant="35" id="2hk-29-LeR"/>
|
||||
<constraint firstItem="1dN-Ld-mvf" firstAttribute="top" secondItem="c3s-XT-wGy" secondAttribute="bottom" constant="30" id="7oJ-n1-Vec"/>
|
||||
<constraint firstAttribute="trailing" secondItem="bMp-hX-C4X" secondAttribute="trailing" constant="20" id="BLV-CI-4bJ"/>
|
||||
<constraint firstAttribute="trailing" secondItem="1dN-Ld-mvf" secondAttribute="trailing" constant="20" id="RRJ-XS-DKi"/>
|
||||
<constraint firstItem="1dN-Ld-mvf" firstAttribute="leading" secondItem="AA6-5y-aKB" secondAttribute="leading" constant="20" id="bgC-6o-Qd3"/>
|
||||
<constraint firstItem="bMp-hX-C4X" firstAttribute="leading" secondItem="AA6-5y-aKB" secondAttribute="leading" constant="20" id="ePA-YY-3Bd"/>
|
||||
<constraint firstItem="c3s-XT-wGy" firstAttribute="centerX" secondItem="AA6-5y-aKB" secondAttribute="centerX" id="hhx-MR-Ssb"/>
|
||||
<constraint firstAttribute="width" priority="750" constant="500" id="qn9-3x-Vus"/>
|
||||
<constraint firstItem="bMp-hX-C4X" firstAttribute="top" secondItem="1dN-Ld-mvf" secondAttribute="bottom" constant="31" id="zle-dL-YQn"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
@@ -72,6 +79,7 @@
|
||||
</constraints>
|
||||
</scrollView>
|
||||
</subviews>
|
||||
<viewLayoutGuide key="safeArea" id="Y3k-2C-Pek"/>
|
||||
<color key="backgroundColor" red="0.94509803920000002" green="0.96078431369999995" blue="0.97254901959999995" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="cUL-rS-rfi" firstAttribute="leading" secondItem="Y3k-2C-Pek" secondAttribute="leading" id="9ZI-Gm-3DT"/>
|
||||
@@ -79,10 +87,10 @@
|
||||
<constraint firstItem="Y3k-2C-Pek" firstAttribute="top" secondItem="cUL-rS-rfi" secondAttribute="top" id="ffm-HV-RhA"/>
|
||||
<constraint firstAttribute="bottom" secondItem="cUL-rS-rfi" secondAttribute="bottom" id="rib-a1-j68"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="Y3k-2C-Pek"/>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="informationLabel" destination="1dN-Ld-mvf" id="RAQ-9H-hXQ"/>
|
||||
<outlet property="progressLabel" destination="bMp-hX-C4X" id="Hhf-4p-YYP"/>
|
||||
<outlet property="shieldImageView" destination="c3s-XT-wGy" id="jVg-AC-PGB"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
|
||||
@@ -29,6 +29,7 @@ final class KeyBackupRecoverFromPrivateKeyViewController: UIViewController {
|
||||
@IBOutlet private weak var shieldImageView: UIImageView!
|
||||
|
||||
@IBOutlet private weak var informationLabel: UILabel!
|
||||
@IBOutlet private weak var progressLabel: UILabel!
|
||||
|
||||
// MARK: Private
|
||||
|
||||
@@ -118,8 +119,8 @@ final class KeyBackupRecoverFromPrivateKeyViewController: UIViewController {
|
||||
|
||||
private func render(viewState: KeyBackupRecoverFromPrivateKeyViewState) {
|
||||
switch viewState {
|
||||
case .loading:
|
||||
self.renderLoading()
|
||||
case .loading(let progress):
|
||||
self.renderLoading(progress: progress)
|
||||
case .loaded:
|
||||
self.renderLoaded()
|
||||
case .error(let error):
|
||||
@@ -127,8 +128,11 @@ final class KeyBackupRecoverFromPrivateKeyViewController: UIViewController {
|
||||
}
|
||||
}
|
||||
|
||||
private func renderLoading() {
|
||||
private func renderLoading(progress: Double) {
|
||||
self.activityPresenter.presentActivityIndicator(on: self.view, animated: true)
|
||||
|
||||
let percent = Int(round(progress * 100))
|
||||
self.progressLabel.text = VectorL10n.keyBackupRecoverFromPrivateKeyProgress("\(percent)")
|
||||
}
|
||||
|
||||
private func renderLoaded() {
|
||||
|
||||
@@ -27,6 +27,7 @@ final class KeyBackupRecoverFromPrivateKeyViewModel: KeyBackupRecoverFromPrivate
|
||||
private let keyBackup: MXKeyBackup
|
||||
private var currentHTTPOperation: MXHTTPOperation?
|
||||
private let keyBackupVersion: MXKeyBackupVersion
|
||||
private var progressUpdateTimer: Timer?
|
||||
|
||||
// MARK: Public
|
||||
|
||||
@@ -56,7 +57,14 @@ final class KeyBackupRecoverFromPrivateKeyViewModel: KeyBackupRecoverFromPrivate
|
||||
|
||||
private func recoverWithPrivateKey() {
|
||||
|
||||
self.update(viewState: .loading)
|
||||
self.update(viewState: .loading(0))
|
||||
|
||||
// Update loading progress every second until no longer loading
|
||||
progressUpdateTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in
|
||||
if let progress = self?.keyBackup.importProgress {
|
||||
self?.update(viewState: .loading(progress.fractionCompleted))
|
||||
}
|
||||
}
|
||||
|
||||
self.currentHTTPOperation = keyBackup.restore(usingPrivateKeyKeyBackup: keyBackupVersion, room: nil, session: nil, success: { [weak self] (_, _) in
|
||||
guard let self = self else {
|
||||
@@ -91,6 +99,11 @@ final class KeyBackupRecoverFromPrivateKeyViewModel: KeyBackupRecoverFromPrivate
|
||||
}
|
||||
|
||||
private func update(viewState: KeyBackupRecoverFromPrivateKeyViewState) {
|
||||
if case .loading = viewState {} else {
|
||||
progressUpdateTimer?.invalidate()
|
||||
progressUpdateTimer = nil
|
||||
}
|
||||
|
||||
self.viewDelegate?.keyBackupRecoverFromPrivateKeyViewModel(self, didUpdateViewState: viewState)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ import Foundation
|
||||
|
||||
/// KeyBackupRecoverFromPrivateKeyViewController view state
|
||||
enum KeyBackupRecoverFromPrivateKeyViewState {
|
||||
case loading
|
||||
case loading(Double)
|
||||
case loaded
|
||||
case error(Error)
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@ final class KeyVerificationSelfVerifyWaitCoordinator: KeyVerificationSelfVerifyW
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private let session: MXSession
|
||||
private var keyVerificationSelfVerifyWaitViewModel: KeyVerificationSelfVerifyWaitViewModelType
|
||||
private let keyVerificationSelfVerifyWaitViewController: KeyVerificationSelfVerifyWaitViewController
|
||||
private let cancellable: Bool
|
||||
@@ -41,9 +40,7 @@ final class KeyVerificationSelfVerifyWaitCoordinator: KeyVerificationSelfVerifyW
|
||||
// MARK: - Setup
|
||||
|
||||
init(session: MXSession, isNewSignIn: Bool, cancellable: Bool) {
|
||||
self.session = session
|
||||
|
||||
let keyVerificationSelfVerifyWaitViewModel = KeyVerificationSelfVerifyWaitViewModel(session: self.session, isNewSignIn: isNewSignIn)
|
||||
let keyVerificationSelfVerifyWaitViewModel = KeyVerificationSelfVerifyWaitViewModel(session: session, isNewSignIn: isNewSignIn)
|
||||
let keyVerificationSelfVerifyWaitViewController = KeyVerificationSelfVerifyWaitViewController.instantiate(with: keyVerificationSelfVerifyWaitViewModel, cancellable: cancellable)
|
||||
self.keyVerificationSelfVerifyWaitViewModel = keyVerificationSelfVerifyWaitViewModel
|
||||
self.keyVerificationSelfVerifyWaitViewController = keyVerificationSelfVerifyWaitViewController
|
||||
|
||||
@@ -26,11 +26,19 @@ final class KeyVerificationSelfVerifyWaitViewModel: KeyVerificationSelfVerifyWai
|
||||
|
||||
private let session: MXSession
|
||||
private let keyVerificationService: KeyVerificationService
|
||||
private let verificationManager: MXKeyVerificationManager
|
||||
private let verificationManager: MXKeyVerificationManager?
|
||||
private let isNewSignIn: Bool
|
||||
private var secretsRecoveryAvailability: SecretsRecoveryAvailability
|
||||
private var secretsRecoveryAvailability: SecretsRecoveryAvailability?
|
||||
private var keyVerificationRequest: MXKeyVerificationRequest?
|
||||
|
||||
private var myUserId: String {
|
||||
guard let userId = session.myUserId else {
|
||||
MXLog.error("[KeyVerificationSelfVerifyWaitViewModel] userId is missing")
|
||||
return ""
|
||||
}
|
||||
return userId
|
||||
}
|
||||
|
||||
// MARK: Public
|
||||
|
||||
weak var viewDelegate: KeyVerificationSelfVerifyWaitViewModelViewDelegate?
|
||||
@@ -40,10 +48,10 @@ final class KeyVerificationSelfVerifyWaitViewModel: KeyVerificationSelfVerifyWai
|
||||
|
||||
init(session: MXSession, isNewSignIn: Bool) {
|
||||
self.session = session
|
||||
self.verificationManager = session.crypto.keyVerificationManager
|
||||
self.verificationManager = session.crypto?.keyVerificationManager
|
||||
self.keyVerificationService = KeyVerificationService()
|
||||
self.isNewSignIn = isNewSignIn
|
||||
self.secretsRecoveryAvailability = session.crypto.recoveryService.vc_availability
|
||||
self.secretsRecoveryAvailability = session.crypto?.recoveryService.vc_availability
|
||||
}
|
||||
|
||||
deinit {
|
||||
@@ -59,9 +67,16 @@ final class KeyVerificationSelfVerifyWaitViewModel: KeyVerificationSelfVerifyWai
|
||||
case .cancel:
|
||||
self.cancel()
|
||||
case .recoverSecrets:
|
||||
switch self.secretsRecoveryAvailability {
|
||||
guard let availability = secretsRecoveryAvailability else {
|
||||
MXLog.error("[KeyVerificationSelfVerifyWaitViewModel] process: secretsRecoveryAvailability not set")
|
||||
self.cancel()
|
||||
return
|
||||
}
|
||||
|
||||
switch availability {
|
||||
case .notAvailable:
|
||||
fatalError("Should not happen: When recovery is not available button is hidden")
|
||||
MXLog.error("Should not happen: When recovery is not available button is hidden")
|
||||
self.cancel()
|
||||
case .available(let secretsRecoveryMode):
|
||||
self.coordinatorDelegate?.keyVerificationSelfVerifyWaitViewModel(self, wantsToRecoverSecretsWith: secretsRecoveryMode)
|
||||
}
|
||||
@@ -71,12 +86,16 @@ final class KeyVerificationSelfVerifyWaitViewModel: KeyVerificationSelfVerifyWai
|
||||
// MARK: - Private
|
||||
|
||||
private func loadData() {
|
||||
guard let verificationManager = verificationManager else {
|
||||
MXLog.failure("Verification manager is not set")
|
||||
return
|
||||
}
|
||||
|
||||
if !self.isNewSignIn {
|
||||
MXLog.debug("[KeyVerificationSelfVerifyWaitViewModel] loadData: Send a verification request to all devices")
|
||||
|
||||
let keyVerificationService = KeyVerificationService()
|
||||
self.verificationManager.requestVerificationByToDevice(withUserId: self.session.myUserId, deviceIds: nil, methods: keyVerificationService.supportedKeyVerificationMethods(), success: { [weak self] (keyVerificationRequest) in
|
||||
verificationManager.requestVerificationByToDevice(withUserId: self.myUserId, deviceIds: nil, methods: keyVerificationService.supportedKeyVerificationMethods(), success: { [weak self] (keyVerificationRequest) in
|
||||
guard let self = self else {
|
||||
return
|
||||
}
|
||||
@@ -103,7 +122,7 @@ final class KeyVerificationSelfVerifyWaitViewModel: KeyVerificationSelfVerifyWai
|
||||
MXLog.debug("[KeyVerificationSelfVerifyWaitViewModel] loadData: Send a verification request to all devices instead of waiting")
|
||||
|
||||
let keyVerificationService = KeyVerificationService()
|
||||
self.verificationManager.requestVerificationByToDevice(withUserId: self.session.myUserId, deviceIds: nil, methods: keyVerificationService.supportedKeyVerificationMethods(), success: { [weak self] (keyVerificationRequest) in
|
||||
verificationManager.requestVerificationByToDevice(withUserId: self.myUserId, deviceIds: nil, methods: keyVerificationService.supportedKeyVerificationMethods(), success: { [weak self] (keyVerificationRequest) in
|
||||
guard let self = self else {
|
||||
return
|
||||
}
|
||||
@@ -132,12 +151,18 @@ final class KeyVerificationSelfVerifyWaitViewModel: KeyVerificationSelfVerifyWai
|
||||
}
|
||||
|
||||
private func continueLoadData() {
|
||||
guard let verificationManager = verificationManager, let recoveryService = session.crypto?.recoveryService else {
|
||||
MXLog.error("[KeyVerificationSelfVerifyWaitViewModel] continueLoadData: Missing dependencies")
|
||||
return
|
||||
}
|
||||
|
||||
// update availability again
|
||||
self.secretsRecoveryAvailability = session.crypto.recoveryService.vc_availability
|
||||
let availability = recoveryService.vc_availability
|
||||
self.secretsRecoveryAvailability = availability
|
||||
|
||||
let viewData = KeyVerificationSelfVerifyWaitViewData(isNewSignIn: self.isNewSignIn, secretsRecoveryAvailability: self.secretsRecoveryAvailability)
|
||||
let viewData = KeyVerificationSelfVerifyWaitViewData(isNewSignIn: self.isNewSignIn, secretsRecoveryAvailability: availability)
|
||||
|
||||
self.registerKeyVerificationManagerNewRequestNotification(for: self.verificationManager)
|
||||
self.registerKeyVerificationManagerNewRequestNotification(for: verificationManager)
|
||||
self.update(viewState: .loaded(viewData))
|
||||
self.registerTransactionDidStateChangeNotification()
|
||||
self.registerKeyVerificationRequestChangeNotification()
|
||||
@@ -251,7 +276,7 @@ final class KeyVerificationSelfVerifyWaitViewModel: KeyVerificationSelfVerifyWai
|
||||
|
||||
@objc private func transactionDidStateChange(notification: Notification) {
|
||||
guard let sasTransaction = notification.object as? MXSASTransaction,
|
||||
sasTransaction.isIncoming, sasTransaction.otherUserId == self.session.myUserId else {
|
||||
sasTransaction.isIncoming, sasTransaction.otherUserId == self.myUserId else {
|
||||
return
|
||||
}
|
||||
self.sasTransactionDidStateChange(sasTransaction)
|
||||
|
||||
@@ -41,9 +41,9 @@ final class LaunchLoadingView: UIView, NibLoadable, Themable {
|
||||
|
||||
// MARK: - Setup
|
||||
|
||||
static func instantiate(syncProgress: MXSessionSyncProgress?) -> LaunchLoadingView {
|
||||
static func instantiate(startupProgress: MXSessionStartupProgress?) -> LaunchLoadingView {
|
||||
let view = LaunchLoadingView.loadFromNib()
|
||||
syncProgress?.delegate = view
|
||||
startupProgress?.delegate = view
|
||||
return view
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ final class LaunchLoadingView: UIView, NibLoadable, Themable {
|
||||
animationTimeline.play()
|
||||
self.animationTimeline = animationTimeline
|
||||
|
||||
self.statusLabel.isHidden = !MXSDKOptions.sharedInstance().enableSyncProgress
|
||||
self.statusLabel.isHidden = !MXSDKOptions.sharedInstance().enableStartupProgress
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
@@ -65,21 +65,35 @@ final class LaunchLoadingView: UIView, NibLoadable, Themable {
|
||||
}
|
||||
}
|
||||
|
||||
extension LaunchLoadingView: MXSessionSyncProgressDelegate {
|
||||
func sessionDidUpdateSyncState(_ state: MXSessionSyncState) {
|
||||
guard MXSDKOptions.sharedInstance().enableSyncProgress else {
|
||||
extension LaunchLoadingView: MXSessionStartupProgressDelegate {
|
||||
func sessionDidUpdateStartupStage(_ stage: MXSessionStartupStage) {
|
||||
guard MXSDKOptions.sharedInstance().enableStartupProgress else {
|
||||
return
|
||||
}
|
||||
updateStatusText(for: stage)
|
||||
|
||||
}
|
||||
|
||||
private func updateStatusText(for stage: MXSessionStartupStage) {
|
||||
guard Thread.isMainThread else {
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
self?.updateStatusText(for: stage)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Sync may be doing a lot of heavy work on the main thread and the status text
|
||||
// does not update reliably enough without explicitly refreshing
|
||||
CATransaction.begin()
|
||||
statusLabel.text = statusText(for: state)
|
||||
statusLabel.text = statusText(for: stage)
|
||||
CATransaction.commit()
|
||||
}
|
||||
|
||||
private func statusText(for state: MXSessionSyncState) -> String {
|
||||
switch state {
|
||||
private func statusText(for stage: MXSessionStartupStage) -> String {
|
||||
switch stage {
|
||||
case .migratingData(let progress):
|
||||
let percent = Int(floor(progress * 100))
|
||||
return VectorL10n.launchLoadingMigratingData("\(percent)")
|
||||
case .serverSyncing(let attempts):
|
||||
if attempts > 1, let nth = numberFormatter.string(from: NSNumber(value: attempts)) {
|
||||
return VectorL10n.launchLoadingServerSyncingNthAttempt(nth)
|
||||
|
||||
@@ -21,10 +21,10 @@ class LaunchLoadingViewController: UIViewController, Reusable {
|
||||
|
||||
required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
|
||||
|
||||
init(syncProgress: MXSessionSyncProgress?) {
|
||||
init(startupProgress: MXSessionStartupProgress?) {
|
||||
super.init(nibName: "LaunchLoadingViewController", bundle: nil)
|
||||
|
||||
let launchLoadingView = LaunchLoadingView.instantiate(syncProgress: syncProgress)
|
||||
let launchLoadingView = LaunchLoadingView.instantiate(startupProgress: startupProgress)
|
||||
launchLoadingView.update(theme: ThemeService.shared().theme)
|
||||
view.vc_addSubViewMatchingParent(launchLoadingView)
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@ class LocationManager: NSObject {
|
||||
|
||||
private let locationManager: CLLocationManager
|
||||
private var authorizationHandler: LocationAuthorizationHandler?
|
||||
private var authorizationReturnedSinceRequestingAlways = false
|
||||
|
||||
// MARK: Public
|
||||
|
||||
@@ -144,14 +145,16 @@ class LocationManager: NSObject {
|
||||
// See https://developer.apple.com/documentation/corelocation/cllocationmanager/1620551-requestalwaysauthorization?changes=_6_6
|
||||
private func tryToRequestAlwaysAuthorization(handler: @escaping LocationAuthorizationHandler) {
|
||||
self.authorizationHandler = handler
|
||||
self.authorizationReturnedSinceRequestingAlways = false
|
||||
self.locationManager.delegate = self
|
||||
self.locationManager.requestAlwaysAuthorization()
|
||||
|
||||
Timer.scheduledTimer(withTimeInterval: Constants.waitForAuthorizationStatusDelay, repeats: false) { [weak self] _ in
|
||||
guard let self = self else {
|
||||
guard let self = self, !self.authorizationReturnedSinceRequestingAlways else {
|
||||
return
|
||||
}
|
||||
|
||||
self.authorizationRequestDidComplete(with: self.locationManager.authorizationStatus)
|
||||
self.authorizationAlwaysRequestDidComplete(with: self.locationManager.authorizationStatus)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,8 +177,7 @@ class LocationManager: NSObject {
|
||||
|
||||
return status
|
||||
}
|
||||
|
||||
private func authorizationRequestDidComplete(with status: CLAuthorizationStatus) {
|
||||
private func authorizationAlwaysRequestDidComplete(with status: CLAuthorizationStatus) {
|
||||
guard let authorizationHandler = self.authorizationHandler else {
|
||||
return
|
||||
}
|
||||
@@ -191,7 +193,14 @@ extension LocationManager: CLLocationManagerDelegate {
|
||||
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
|
||||
|
||||
let status = self.locationManager.authorizationStatus
|
||||
self.authorizationRequestDidComplete(with: status)
|
||||
authorizationReturnedSinceRequestingAlways = true
|
||||
if status == .authorizedAlways {
|
||||
// LocationManager can call locationManagerDidChangeAuthorization multiple times.
|
||||
// For example it calls it at initialisation of LocationManager manager and we are also seeing it called
|
||||
// after requestAlwaysAuthorization but before the user has actually selected on option on the prompt.
|
||||
// Therefore we should only call `authorizationAlwaysRequestDidComplete` once on the success of authorizedAlways being granted.
|
||||
self.authorizationAlwaysRequestDidComplete(with: status)
|
||||
}
|
||||
}
|
||||
|
||||
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
MXPushRule *pushRule = [_mxAccount.mxSession.notificationCenter ruleById:kMXNotificationCenterDisableAllNotificationsRuleID];
|
||||
if (pushRule)
|
||||
{
|
||||
[_mxAccount.mxSession.notificationCenter enableRule:pushRule isEnabled:!areAllDisabled];
|
||||
[_mxAccount.mxSession.notificationCenter enableRule:pushRule isEnabled:!areAllDisabled completion:nil];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||