ios: protect screen (#1420)
* ios: protect screen * AppSheet * translations * correction Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com> Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
18b772a80b
commit
87d306383c
@@ -17,6 +17,7 @@ struct ContentView: View {
|
||||
@AppStorage(DEFAULT_SHOW_LA_NOTICE) private var prefShowLANotice = false
|
||||
@AppStorage(DEFAULT_LA_NOTICE_SHOWN) private var prefLANoticeShown = false
|
||||
@AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false
|
||||
@AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = true
|
||||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
@@ -29,7 +30,7 @@ struct ContentView: View {
|
||||
} else if let step = chatModel.onboardingStage {
|
||||
if case .onboardingComplete = step,
|
||||
chatModel.currentUser != nil {
|
||||
mainView()
|
||||
mainView().privacySensitive(protectScreen)
|
||||
} else {
|
||||
OnboardingView(onboarding: step)
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ struct ChatView: View {
|
||||
} label: {
|
||||
ChatInfoToolbar(chat: chat)
|
||||
}
|
||||
.sheet(isPresented: $showChatInfoSheet, onDismiss: {
|
||||
.appSheet(isPresented: $showChatInfoSheet, onDismiss: {
|
||||
connectionStats = nil
|
||||
customUserProfile = nil
|
||||
}) {
|
||||
@@ -121,7 +121,7 @@ struct ChatView: View {
|
||||
} label: {
|
||||
ChatInfoToolbar(chat: chat)
|
||||
}
|
||||
.sheet(isPresented: $showChatInfoSheet) {
|
||||
.appSheet(isPresented: $showChatInfoSheet) {
|
||||
GroupChatInfoView(chat: chat, groupInfo: groupInfo)
|
||||
}
|
||||
}
|
||||
@@ -152,7 +152,7 @@ struct ChatView: View {
|
||||
.onTapGesture { AlertManager.shared.showAlert(cantInviteIncognitoAlert()) }
|
||||
} else {
|
||||
addMembersButton()
|
||||
.sheet(isPresented: $showAddMembersSheet) {
|
||||
.appSheet(isPresented: $showAddMembersSheet) {
|
||||
AddGroupMembersView(chat: chat, groupInfo: groupInfo)
|
||||
}
|
||||
}
|
||||
@@ -392,7 +392,7 @@ struct ChatView: View {
|
||||
await MainActor.run { selectedMember = member }
|
||||
}
|
||||
}
|
||||
.sheet(item: $selectedMember, onDismiss: {
|
||||
.appSheet(item: $selectedMember, onDismiss: {
|
||||
selectedMember = nil
|
||||
memberConnectionStats = nil
|
||||
}) { _ in
|
||||
|
||||
@@ -240,7 +240,7 @@ struct ComposeView: View {
|
||||
CameraImageListPicker(images: $chosenImages)
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $showImagePicker) {
|
||||
.appSheet(isPresented: $showImagePicker) {
|
||||
LibraryImageListPicker(images: $chosenImages, selectionLimit: 10) { itemsSelected in
|
||||
showImagePicker = false
|
||||
if itemsSelected {
|
||||
|
||||
@@ -78,10 +78,10 @@ struct GroupChatInfoView: View {
|
||||
} label: { memberView(member) }
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $showAddMembersSheet) {
|
||||
.appSheet(isPresented: $showAddMembersSheet) {
|
||||
AddGroupMembersView(chat: chat, groupInfo: groupInfo)
|
||||
}
|
||||
.sheet(item: $selectedMember, onDismiss: {
|
||||
.appSheet(item: $selectedMember, onDismiss: {
|
||||
selectedMember = nil
|
||||
connectionStats = nil
|
||||
}) { _ in
|
||||
|
||||
@@ -82,7 +82,7 @@ struct GroupProfileView: View {
|
||||
CameraImagePicker(image: $chosenImage)
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $showImagePicker) {
|
||||
.appSheet(isPresented: $showImagePicker) {
|
||||
LibraryImagePicker(image: $chosenImage) {
|
||||
didSelectItem in showImagePicker = false
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ struct ContactConnectionView: View {
|
||||
Spacer()
|
||||
}
|
||||
.frame(maxHeight: .infinity)
|
||||
.sheet(isPresented: $showContactConnectionInfo) {
|
||||
.appSheet(isPresented: $showContactConnectionInfo) {
|
||||
ContactConnectionInfo(contactConnection: contactConnection)
|
||||
}
|
||||
}
|
||||
|
||||
66
apps/ios/Shared/Views/Helpers/AppSheet.swift
Normal file
66
apps/ios/Shared/Views/Helpers/AppSheet.swift
Normal file
@@ -0,0 +1,66 @@
|
||||
//
|
||||
// AppSheet.swift
|
||||
// SimpleX (iOS)
|
||||
//
|
||||
// Created by Evgeny on 24/11/2022.
|
||||
// Copyright © 2022 SimpleX Chat. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
private struct SheetIsPresented<C>: ViewModifier where C: View {
|
||||
var isPresented: Binding<Bool>
|
||||
var onDismiss: (() -> Void)?
|
||||
var sheetContent: () -> C
|
||||
@Environment(\.scenePhase) var scenePhase
|
||||
|
||||
func body(content: Content) -> some View {
|
||||
content.sheet(isPresented: isPresented, onDismiss: onDismiss) {
|
||||
sheetContent().modifier(PrivacySensitive())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private struct SheetForItem<T, C>: ViewModifier where T: Identifiable, C: View {
|
||||
var item: Binding<T?>
|
||||
var onDismiss: (() -> Void)?
|
||||
var sheetContent: (T) -> C
|
||||
@Environment(\.scenePhase) var scenePhase
|
||||
|
||||
func body(content: Content) -> some View {
|
||||
content.sheet(item: item, onDismiss: onDismiss) { it in
|
||||
sheetContent(it).modifier(PrivacySensitive())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private struct PrivacySensitive: ViewModifier {
|
||||
@AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = true
|
||||
@Environment(\.scenePhase) var scenePhase
|
||||
|
||||
func body(content: Content) -> some View {
|
||||
if case .active = scenePhase {
|
||||
content
|
||||
} else {
|
||||
content.privacySensitive(protectScreen).redacted(reason: .privacy)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension View {
|
||||
func appSheet<Content>(
|
||||
isPresented: Binding<Bool>,
|
||||
onDismiss: (() -> Void)? = nil,
|
||||
content: @escaping () -> Content
|
||||
) -> some View where Content: View {
|
||||
modifier(SheetIsPresented(isPresented: isPresented, onDismiss: onDismiss, sheetContent: content))
|
||||
}
|
||||
|
||||
func appSheet<T, Content>(
|
||||
item: Binding<T?>,
|
||||
onDismiss: (() -> Void)? = nil,
|
||||
content: @escaping (T) -> Content
|
||||
) -> some View where T: Identifiable, Content: View {
|
||||
modifier(SheetForItem(item: item, onDismiss: onDismiss, sheetContent: content))
|
||||
}
|
||||
}
|
||||
@@ -136,7 +136,7 @@ struct AddGroupView: View {
|
||||
CameraImagePicker(image: $chosenImage)
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $showImagePicker) {
|
||||
.appSheet(isPresented: $showImagePicker) {
|
||||
LibraryImagePicker(image: $chosenImage) {
|
||||
didSelectItem in showImagePicker = false
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ struct SimpleXInfo: View {
|
||||
.padding(.bottom, 8)
|
||||
.frame(maxWidth: .infinity)
|
||||
}
|
||||
.sheet(isPresented: $showHowItWorks) {
|
||||
.appSheet(isPresented: $showHowItWorks) {
|
||||
HowItWorks(onboarding: onboarding)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,12 +15,16 @@ struct PrivacySettings: View {
|
||||
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
||||
@AppStorage(GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE, store: groupDefaults) private var transferImagesInline = false
|
||||
@State private var simplexLinkMode = privacySimplexLinkModeDefault.get()
|
||||
@AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = true
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
List {
|
||||
Section("Device") {
|
||||
SimplexLockSetting()
|
||||
settingsRow("eye.slash") {
|
||||
Toggle("Protect app screen", isOn: $protectScreen)
|
||||
}
|
||||
}
|
||||
|
||||
Section {
|
||||
|
||||
@@ -79,7 +79,7 @@ struct SMPServersView: View {
|
||||
Button("Add preset servers", action: addAllPresets)
|
||||
.disabled(hasAllPresets())
|
||||
}
|
||||
.sheet(isPresented: $showScanSMPServer) {
|
||||
.appSheet(isPresented: $showScanSMPServer) {
|
||||
ScanSMPServer(servers: $servers)
|
||||
}
|
||||
.alert(item: $alert) { a in
|
||||
|
||||
@@ -16,7 +16,7 @@ struct SettingsButton: View {
|
||||
Button { showSettings = true } label: {
|
||||
Image(systemName: "gearshape")
|
||||
}
|
||||
.sheet(isPresented: $showSettings, content: {
|
||||
.appSheet(isPresented: $showSettings, content: {
|
||||
SettingsView(showSettings: $showSettings)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ let DEFAULT_WEBRTC_ICE_SERVERS = "webrtcICEServers"
|
||||
let DEFAULT_PRIVACY_ACCEPT_IMAGES = "privacyAcceptImages"
|
||||
let DEFAULT_PRIVACY_LINK_PREVIEWS = "privacyLinkPreviews"
|
||||
let DEFAULT_PRIVACY_SIMPLEX_LINK_MODE = "privacySimplexLinkMode"
|
||||
let DEFAULT_PRIVACY_PROTECT_SCREEN = "privacyProtectScreen"
|
||||
let DEFAULT_EXPERIMENTAL_CALLS = "experimentalCalls"
|
||||
let DEFAULT_CHAT_ARCHIVE_NAME = "chatArchiveName"
|
||||
let DEFAULT_CHAT_ARCHIVE_TIME = "chatArchiveTime"
|
||||
@@ -45,6 +46,7 @@ let appDefaults: [String: Any] = [
|
||||
DEFAULT_PRIVACY_ACCEPT_IMAGES: true,
|
||||
DEFAULT_PRIVACY_LINK_PREVIEWS: true,
|
||||
DEFAULT_PRIVACY_SIMPLEX_LINK_MODE: "description",
|
||||
DEFAULT_PRIVACY_PROTECT_SCREEN: true,
|
||||
DEFAULT_EXPERIMENTAL_CALLS: false,
|
||||
DEFAULT_CHAT_V3_DB_MIGRATION: "offer",
|
||||
DEFAULT_DEVELOPER_TOOLS: false,
|
||||
|
||||
@@ -100,7 +100,7 @@ struct UserProfile: View {
|
||||
CameraImagePicker(image: $chosenImage)
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $showImagePicker) {
|
||||
.appSheet(isPresented: $showImagePicker) {
|
||||
LibraryImagePicker(image: $chosenImage) {
|
||||
didSelectItem in showImagePicker = false
|
||||
}
|
||||
|
||||
@@ -1843,6 +1843,11 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
<target>Die Gruppe wurde nicht gefunden!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="No permission to record voice message" xml:space="preserve">
|
||||
<source>No permission to record voice message</source>
|
||||
<target>***No permission to record voice message</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="No received or sent files" xml:space="preserve">
|
||||
<source>No received or sent files</source>
|
||||
<target>Keine empfangenen oder gesendeten Dateien</target>
|
||||
@@ -1948,9 +1953,9 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
<target>Open-Source-Protokoll und -Code – Jede Person kann ihre eigenen Server aufsetzen und nutzen.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security." xml:space="preserve">
|
||||
<source>Opening the link in the browser may reduce connection privacy and security.</source>
|
||||
<target>***Opening the link in the browser may reduce connection privacy and security.</target>
|
||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
||||
<target>***Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="PING interval" xml:space="preserve">
|
||||
@@ -2063,6 +2068,11 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
<target>***Prohibit sending voice messages.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Protect app screen" xml:space="preserve">
|
||||
<source>Protect app screen</source>
|
||||
<target>***Protect app screen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Protocol timeout" xml:space="preserve">
|
||||
<source>Protocol timeout</source>
|
||||
<target>Protokollzeitüberschreitung</target>
|
||||
@@ -2398,11 +2408,6 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
<target>Vorschau anzeigen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
|
||||
<source>SimpleX one-time invitation</source>
|
||||
<target>SimpleX Einmal-Link</target>
|
||||
<note>simplex link type</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX Lock" xml:space="preserve">
|
||||
<source>SimpleX Lock</source>
|
||||
<target>SimpleX Sperre</target>
|
||||
@@ -2433,6 +2438,11 @@ Wir werden Serverredundanzen hinzufügen, um verloren gegangene Nachrichten zu v
|
||||
<target>***SimpleX links</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
|
||||
<source>SimpleX one-time invitation</source>
|
||||
<target>SimpleX Einmal-Link</target>
|
||||
<note>simplex link type</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Skip" xml:space="preserve">
|
||||
<source>Skip</source>
|
||||
<target>Überspringen</target>
|
||||
@@ -2690,6 +2700,11 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funktion aktiviert wird.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
|
||||
<source>To record voice message please grant permission to use Microphone.</source>
|
||||
<target>***To record voice message please grant permission to use Microphone.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Um sofortige Push-Benachrichtigungen zu unterstützen, muss die Chat-Datenbank migriert werden.</target>
|
||||
@@ -2725,6 +2740,11 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
|
||||
<target>Einschalten</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unable to record voice message" xml:space="preserve">
|
||||
<source>Unable to record voice message</source>
|
||||
<target>***Unable to record voice message</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||
<source>Unexpected error: %@</source>
|
||||
<target>Unerwarteter Fehler: %@</target>
|
||||
|
||||
@@ -1843,6 +1843,11 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>Group not found!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="No permission to record voice message" xml:space="preserve">
|
||||
<source>No permission to record voice message</source>
|
||||
<target>No permission to record voice message</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="No received or sent files" xml:space="preserve">
|
||||
<source>No received or sent files</source>
|
||||
<target>No received or sent files</target>
|
||||
@@ -1948,9 +1953,9 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>Open-source protocol and code – anybody can run the servers.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security." xml:space="preserve">
|
||||
<source>Opening the link in the browser may reduce connection privacy and security.</source>
|
||||
<target>Opening the link in the browser may reduce connection privacy and security.</target>
|
||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
||||
<target>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="PING interval" xml:space="preserve">
|
||||
@@ -2063,6 +2068,11 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>Prohibit sending voice messages.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Protect app screen" xml:space="preserve">
|
||||
<source>Protect app screen</source>
|
||||
<target>Protect app screen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Protocol timeout" xml:space="preserve">
|
||||
<source>Protocol timeout</source>
|
||||
<target>Protocol timeout</target>
|
||||
@@ -2398,11 +2408,6 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>Show preview</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
|
||||
<source>SimpleX one-time invitation</source>
|
||||
<target>SimpleX one-time invitation</target>
|
||||
<note>simplex link type</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX Lock" xml:space="preserve">
|
||||
<source>SimpleX Lock</source>
|
||||
<target>SimpleX Lock</target>
|
||||
@@ -2433,6 +2438,11 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>SimpleX links</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
|
||||
<source>SimpleX one-time invitation</source>
|
||||
<target>SimpleX one-time invitation</target>
|
||||
<note>simplex link type</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Skip" xml:space="preserve">
|
||||
<source>Skip</source>
|
||||
<target>Skip</target>
|
||||
@@ -2690,6 +2700,11 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
You will be prompted to complete authentication before this feature is enabled.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
|
||||
<source>To record voice message please grant permission to use Microphone.</source>
|
||||
<target>To record voice message please grant permission to use Microphone.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>To support instant push notifications the chat database has to be migrated.</target>
|
||||
@@ -2725,6 +2740,11 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
<target>Turn on</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unable to record voice message" xml:space="preserve">
|
||||
<source>Unable to record voice message</source>
|
||||
<target>Unable to record voice message</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||
<source>Unexpected error: %@</source>
|
||||
<target>Unexpected error: %@</target>
|
||||
|
||||
@@ -1843,6 +1843,11 @@ We will be adding server redundancy to prevent lost messages.</source>
|
||||
<target>Группа не найдена!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="No permission to record voice message" xml:space="preserve">
|
||||
<source>No permission to record voice message</source>
|
||||
<target>Нет разрешения для записи голосового сообщения</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="No received or sent files" xml:space="preserve">
|
||||
<source>No received or sent files</source>
|
||||
<target>Нет полученных или отправленных файлов</target>
|
||||
@@ -1948,9 +1953,9 @@ We will be adding server redundancy to prevent lost messages.</source>
|
||||
<target>Открытый протокол и код - кто угодно может запустить сервер.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security." xml:space="preserve">
|
||||
<source>Opening the link in the browser may reduce connection privacy and security.</source>
|
||||
<target>Использование ссылки в браузере может уменьшить конфиденциальность и безопасность соединения.</target>
|
||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
||||
<target>Использование ссылки в браузере может уменьшить конфиденциальность и безопасность соединения. Ссылки на неизвестные сайты будут красными.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="PING interval" xml:space="preserve">
|
||||
@@ -2063,6 +2068,11 @@ We will be adding server redundancy to prevent lost messages.</source>
|
||||
<target>Запретить отправлять голосовые сообщений.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Protect app screen" xml:space="preserve">
|
||||
<source>Protect app screen</source>
|
||||
<target>Защитить экран приложения</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Protocol timeout" xml:space="preserve">
|
||||
<source>Protocol timeout</source>
|
||||
<target>Таймаут протокола</target>
|
||||
@@ -2398,11 +2408,6 @@ We will be adding server redundancy to prevent lost messages.</source>
|
||||
<target>Показывать уведомления</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
|
||||
<source>SimpleX one-time invitation</source>
|
||||
<target>SimpleX одноразовая ссылка</target>
|
||||
<note>simplex link type</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX Lock" xml:space="preserve">
|
||||
<source>SimpleX Lock</source>
|
||||
<target>Блокировка SimpleX</target>
|
||||
@@ -2433,6 +2438,11 @@ We will be adding server redundancy to prevent lost messages.</source>
|
||||
<target>SimpleX ссылки</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
|
||||
<source>SimpleX one-time invitation</source>
|
||||
<target>SimpleX одноразовая ссылка</target>
|
||||
<note>simplex link type</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Skip" xml:space="preserve">
|
||||
<source>Skip</source>
|
||||
<target>Пропустить</target>
|
||||
@@ -2690,6 +2700,11 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
Вам будет нужно пройти аутентификацию для включения блокировки.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
|
||||
<source>To record voice message please grant permission to use Microphone.</source>
|
||||
<target>Для записи голосового сообщения, пожалуйста разрешите доступ к микрофону.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Для поддержки мгновенный доставки уведомлений данные чата должны быть перемещены.</target>
|
||||
@@ -2725,6 +2740,11 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
<target>Включить</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unable to record voice message" xml:space="preserve">
|
||||
<source>Unable to record voice message</source>
|
||||
<target>Невозможно записать голосовое сообщение</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||
<source>Unexpected error: %@</source>
|
||||
<target>Неожиданная ошибка: %@</target>
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
5CA059EB279559F40002BEB4 /* SimpleXApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059C3279559F40002BEB4 /* SimpleXApp.swift */; };
|
||||
5CA059ED279559F40002BEB4 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059C4279559F40002BEB4 /* ContentView.swift */; };
|
||||
5CA059EF279559F40002BEB4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5CA059C5279559F40002BEB4 /* Assets.xcassets */; };
|
||||
5CA7DFC329302AF000F7FDDE /* AppSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA7DFC229302AF000F7FDDE /* AppSheet.swift */; };
|
||||
5CADE79A29211BB900072E13 /* PreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CADE79929211BB900072E13 /* PreferencesView.swift */; };
|
||||
5CADE79C292131E900072E13 /* ContactPreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CADE79B292131E900072E13 /* ContactPreferencesView.swift */; };
|
||||
5CB0BA882826CB3A00B3292C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CB0BA862826CB3A00B3292C /* InfoPlist.strings */; };
|
||||
@@ -287,6 +288,7 @@
|
||||
5CA059D7279559F40002BEB4 /* Tests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
5CA059DB279559F40002BEB4 /* Tests_iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOS.swift; sourceTree = "<group>"; };
|
||||
5CA059DD279559F40002BEB4 /* Tests_iOSLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOSLaunchTests.swift; sourceTree = "<group>"; };
|
||||
5CA7DFC229302AF000F7FDDE /* AppSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSheet.swift; sourceTree = "<group>"; };
|
||||
5CADE79929211BB900072E13 /* PreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesView.swift; sourceTree = "<group>"; };
|
||||
5CADE79B292131E900072E13 /* ContactPreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactPreferencesView.swift; sourceTree = "<group>"; };
|
||||
5CB0BA872826CB3A00B3292C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
@@ -502,6 +504,7 @@
|
||||
646BB38D283FDB6D001CE359 /* LocalAuthenticationUtils.swift */,
|
||||
5C6BA666289BD954009B8ECC /* DismissSheets.swift */,
|
||||
5C00164328A26FBC0094D739 /* ContextMenu.swift */,
|
||||
5CA7DFC229302AF000F7FDDE /* AppSheet.swift */,
|
||||
);
|
||||
path = Helpers;
|
||||
sourceTree = "<group>";
|
||||
@@ -956,6 +959,7 @@
|
||||
5C2E261227A30FEA00F70299 /* TerminalView.swift in Sources */,
|
||||
5CB2085128DB64CA00D024EC /* CreateLinkView.swift in Sources */,
|
||||
5C9FD96E27A5D6ED0075386C /* SendMessageView.swift in Sources */,
|
||||
5CA7DFC329302AF000F7FDDE /* AppSheet.swift in Sources */,
|
||||
64E972072881BB22008DBC02 /* CIGroupInvitationView.swift in Sources */,
|
||||
5CC1C99227A6C7F5000D9FF6 /* QRCode.swift in Sources */,
|
||||
5C116CDC27AABE0400E66D01 /* ContactRequestView.swift in Sources */,
|
||||
|
||||
@@ -1310,6 +1310,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"No group!" = "Die Gruppe wurde nicht gefunden!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"No permission to record voice message" = "***No permission to record voice message";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"No received or sent files" = "Keine empfangenen oder gesendeten Dateien";
|
||||
|
||||
@@ -1381,7 +1384,7 @@
|
||||
"Open-source protocol and code – anybody can run the servers." = "Open-Source-Protokoll und -Code – Jede Person kann ihre eigenen Server aufsetzen und nutzen.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Opening the link in the browser may reduce connection privacy and security." = "***Opening the link in the browser may reduce connection privacy and security.";
|
||||
"Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." = "***Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"or chat with the developers" = "oder chatten Sie mit den Entwicklern";
|
||||
@@ -1458,6 +1461,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Prohibit sending voice messages." = "***Prohibit sending voice messages.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Protect app screen" = "***Protect app screen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Protocol timeout" = "Protokollzeitüberschreitung";
|
||||
|
||||
@@ -1866,6 +1872,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Um Ihre Informationen zu schützen, schalten Sie die SimpleX Sperre ein.\nSie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funktion aktiviert wird.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To record voice message please grant permission to use Microphone." = "***To record voice message please grant permission to use Microphone.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To support instant push notifications the chat database has to be migrated." = "Um sofortige Push-Benachrichtigungen zu unterstützen, muss die Chat-Datenbank migriert werden.";
|
||||
|
||||
@@ -1887,6 +1896,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Turn on" = "Einschalten";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unable to record voice message" = "***Unable to record voice message";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unexpected error: %@" = "Unerwarteter Fehler: %@";
|
||||
|
||||
|
||||
@@ -1310,6 +1310,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"No group!" = "Группа не найдена!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"No permission to record voice message" = "Нет разрешения на запись голоса";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"No received or sent files" = "Нет полученных или отправленных файлов";
|
||||
|
||||
@@ -1381,7 +1384,7 @@
|
||||
"Open-source protocol and code – anybody can run the servers." = "Открытый протокол и код - кто угодно может запустить сервер.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Opening the link in the browser may reduce connection privacy and security." = "Использование ссылки в браузере может уменьшить конфиденциальность и безопасность соединения.";
|
||||
"Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." = "Использование ссылки в браузере может уменьшить конфиденциальность и безопасность соединения. Ссылки на неизвестные сайты будут красными.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"or chat with the developers" = "или соединитесь с разработчиками";
|
||||
@@ -1458,6 +1461,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Prohibit sending voice messages." = "Запретить отправлять голосовые сообщений.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Protect app screen" = "Защитить экран приложения";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Protocol timeout" = "Таймаут протокола";
|
||||
|
||||
@@ -1866,6 +1872,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Чтобы защитить вашу информацию, включите блокировку SimpleX Chat.\nВам будет нужно пройти аутентификацию для включения блокировки.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To record voice message please grant permission to use Microphone." = "Для записи голосового сообщения, пожалуйста разрешите доступ к микрофону.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To support instant push notifications the chat database has to be migrated." = "Для поддержки мгновенный доставки уведомлений данные чата должны быть перемещены.";
|
||||
|
||||
@@ -1887,6 +1896,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Turn on" = "Включить";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unable to record voice message" = "Невозможно записать голосовое сообщение";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unexpected error: %@" = "Неожиданная ошибка: %@";
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"NSFaceIDUsageDescription" = "SimpleX использует Face ID для аутентификации";
|
||||
|
||||
/* Privacy - Microphone Usage Description */
|
||||
"NSMicrophoneUsageDescription" = "SimpleX использует микрофон для аудио и видео звонков.";
|
||||
"NSMicrophoneUsageDescription" = "SimpleX использует микрофон для аудио и видео звонков, и для записи голосовых сообщений.";
|
||||
|
||||
/* Privacy - Photo Library Additions Usage Description */
|
||||
"NSPhotoLibraryAddUsageDescription" = "SimpleX использует доступ к Photo Library для сохранения сделанных и полученных фотографий";
|
||||
|
||||
Reference in New Issue
Block a user