ios: replace "make connection" screen with two buttons (#1084)
* ios: replace "make connection" screen with two buttons * add "no chats", update translations
This commit is contained in:
committed by
GitHub
parent
59b4ce2474
commit
df329d305b
@@ -763,8 +763,6 @@ func startChat() throws {
|
||||
withAnimation {
|
||||
m.onboardingStage = m.onboardingStage == .step2_CreateProfile
|
||||
? .step3_SetNotificationsMode
|
||||
: m.chats.isEmpty
|
||||
? .step4_MakeConnection
|
||||
: .onboardingComplete
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import SwiftUI
|
||||
struct ChatHelp: View {
|
||||
@EnvironmentObject var chatModel: ChatModel
|
||||
@Binding var showSettings: Bool
|
||||
@State private var showAddChat = false
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading, spacing: 10) {
|
||||
@@ -34,7 +35,7 @@ struct ChatHelp: View {
|
||||
|
||||
HStack(spacing: 8) {
|
||||
Text("Tap button ")
|
||||
NewChatButton()
|
||||
NewChatButton(showAddChat: $showAddChat)
|
||||
Text("above, then choose:")
|
||||
}
|
||||
|
||||
|
||||
@@ -15,65 +15,16 @@ struct ChatListView: View {
|
||||
@State private var showSettings = false
|
||||
@State private var searchText = ""
|
||||
@State private var selectedChat: ChatId?
|
||||
@State private var showAddChat = false
|
||||
|
||||
var body: some View {
|
||||
let v = NavigationView {
|
||||
List {
|
||||
ForEach(filteredChats(), id: \.viewId) { chat in
|
||||
ChatListNavLink(chat: chat)
|
||||
.padding(.trailing, -16)
|
||||
.disabled(chatModel.chatRunning != true)
|
||||
VStack {
|
||||
if chatModel.chats.isEmpty {
|
||||
onboardingButtons()
|
||||
}
|
||||
chatList
|
||||
}
|
||||
.onChange(of: chatModel.chatId) { _ in
|
||||
selectedChat = chatModel.chatId
|
||||
if chatModel.chatId == nil, let chatId = chatModel.chatToTop {
|
||||
chatModel.chatToTop = nil
|
||||
chatModel.popChat(chatId)
|
||||
}
|
||||
}
|
||||
.onChange(of: chatModel.chats.isEmpty) { empty in
|
||||
if !empty { return }
|
||||
withAnimation { chatModel.onboardingStage = .step4_MakeConnection }
|
||||
}
|
||||
.onChange(of: chatModel.appOpenUrl) { _ in connectViaUrl() }
|
||||
.onAppear() { connectViaUrl() }
|
||||
.offset(x: -8)
|
||||
.listStyle(.plain)
|
||||
.navigationTitle("Your chats")
|
||||
.navigationBarTitleDisplayMode(chatModel.chats.count > 8 ? .inline : .large)
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .navigationBarLeading) {
|
||||
SettingsButton()
|
||||
}
|
||||
ToolbarItem(placement: .principal) {
|
||||
if (chatModel.incognito) {
|
||||
HStack {
|
||||
if (chatModel.chats.count > 8) {
|
||||
Text("Your chats").font(.headline)
|
||||
Spacer().frame(width: 16)
|
||||
}
|
||||
Image(systemName: "theatermasks").frame(maxWidth: 24, maxHeight: 24, alignment: .center).foregroundColor(.indigo)
|
||||
}
|
||||
}
|
||||
}
|
||||
ToolbarItem(placement: .navigationBarTrailing) {
|
||||
switch chatModel.chatRunning {
|
||||
case .some(true): NewChatButton()
|
||||
case .some(false): chatStoppedIcon()
|
||||
case .none: EmptyView()
|
||||
}
|
||||
}
|
||||
}
|
||||
.background(
|
||||
NavigationLink(
|
||||
destination: chatView(selectedChat),
|
||||
isActive: Binding(
|
||||
get: { selectedChat != nil },
|
||||
set: { _, _ in selectedChat = nil }
|
||||
)
|
||||
) { EmptyView() }
|
||||
)
|
||||
}
|
||||
.navigationViewStyle(.stack)
|
||||
|
||||
@@ -84,6 +35,104 @@ struct ChatListView: View {
|
||||
}
|
||||
}
|
||||
|
||||
var chatList: some View {
|
||||
List {
|
||||
ForEach(filteredChats(), id: \.viewId) { chat in
|
||||
ChatListNavLink(chat: chat)
|
||||
.padding(.trailing, -16)
|
||||
.disabled(chatModel.chatRunning != true)
|
||||
}
|
||||
}
|
||||
.onChange(of: chatModel.chatId) { _ in
|
||||
selectedChat = chatModel.chatId
|
||||
if chatModel.chatId == nil, let chatId = chatModel.chatToTop {
|
||||
chatModel.chatToTop = nil
|
||||
chatModel.popChat(chatId)
|
||||
}
|
||||
}
|
||||
.onChange(of: chatModel.appOpenUrl) { _ in connectViaUrl() }
|
||||
.onAppear() { connectViaUrl() }
|
||||
.offset(x: -8)
|
||||
.listStyle(.plain)
|
||||
.navigationTitle("Your chats")
|
||||
.navigationBarTitleDisplayMode(.inline)
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .navigationBarLeading) {
|
||||
SettingsButton()
|
||||
}
|
||||
ToolbarItem(placement: .principal) {
|
||||
if (chatModel.incognito) {
|
||||
HStack {
|
||||
if (chatModel.chats.count > 8) {
|
||||
Text("Your chats").font(.headline)
|
||||
Spacer().frame(width: 16)
|
||||
}
|
||||
Image(systemName: "theatermasks").frame(maxWidth: 24, maxHeight: 24, alignment: .center).foregroundColor(.indigo)
|
||||
}
|
||||
}
|
||||
}
|
||||
ToolbarItem(placement: .navigationBarTrailing) {
|
||||
switch chatModel.chatRunning {
|
||||
case .some(true): NewChatButton(showAddChat: $showAddChat)
|
||||
case .some(false): chatStoppedIcon()
|
||||
case .none: EmptyView()
|
||||
}
|
||||
}
|
||||
}
|
||||
.background(
|
||||
NavigationLink(
|
||||
destination: chatView(selectedChat),
|
||||
isActive: Binding(
|
||||
get: { selectedChat != nil },
|
||||
set: { _, _ in selectedChat = nil }
|
||||
)
|
||||
) { EmptyView() }
|
||||
)
|
||||
}
|
||||
|
||||
private func onboardingButtons() -> some View {
|
||||
VStack(alignment: .trailing, spacing: 0) {
|
||||
Path { p in
|
||||
p.move(to: CGPoint(x: 8, y: 0))
|
||||
p.addLine(to: CGPoint(x: 16, y: 10))
|
||||
p.addLine(to: CGPoint(x: 0, y: 10))
|
||||
p.addLine(to: CGPoint(x: 8, y: 0))
|
||||
}
|
||||
.fill(Color.accentColor)
|
||||
.frame(width: 20, height: 10)
|
||||
.padding(.trailing, 12)
|
||||
|
||||
connectButton("Tap to start a new chat") {
|
||||
showAddChat = true
|
||||
}
|
||||
|
||||
connectButton("or chat with the developers") {
|
||||
DispatchQueue.main.async {
|
||||
UIApplication.shared.open(simplexTeamURL)
|
||||
}
|
||||
}
|
||||
.padding(.top, 10)
|
||||
|
||||
Spacer()
|
||||
Text("You have no chats")
|
||||
.foregroundColor(.secondary)
|
||||
.frame(maxWidth: .infinity)
|
||||
}
|
||||
.padding(.trailing, 6)
|
||||
.frame(maxHeight: .infinity)
|
||||
}
|
||||
|
||||
private func connectButton(_ label: LocalizedStringKey, action: @escaping () -> Void) -> some View {
|
||||
Button(action: action) {
|
||||
Text(label)
|
||||
.padding(.vertical, 10)
|
||||
.padding(.horizontal, 20)
|
||||
}
|
||||
.background(Color.accentColor)
|
||||
.foregroundColor(.white)
|
||||
.clipShape(RoundedRectangle(cornerRadius: 16))
|
||||
}
|
||||
|
||||
@ViewBuilder private func chatView(_ chatId: ChatId?) -> some View {
|
||||
if let chatId = chatId, let chat = chatModel.getChat(chatId) {
|
||||
ChatView(chat: chat).onAppear {
|
||||
|
||||
@@ -19,13 +19,13 @@ enum NewChatAction: Identifiable {
|
||||
}
|
||||
|
||||
struct NewChatButton: View {
|
||||
@State private var showAddChat = false
|
||||
@Binding var showAddChat: Bool
|
||||
@State private var connReq: String = ""
|
||||
@State private var actionSheet: NewChatAction?
|
||||
|
||||
var body: some View {
|
||||
Button { showAddChat = true } label: {
|
||||
Image(systemName: "plus.circle.fill")
|
||||
Image(systemName: "square.and.pencil")
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(width: 24, height: 24)
|
||||
@@ -85,6 +85,6 @@ func connectionReqSentAlert(_ type: ConnReqType) {
|
||||
|
||||
struct NewChatButton_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
NewChatButton()
|
||||
NewChatButton(showAddChat: Binding.constant(false))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,150 +0,0 @@
|
||||
//
|
||||
// MakeConnection.swift
|
||||
// SimpleX (iOS)
|
||||
//
|
||||
// Created by Evgeny on 07/05/2022.
|
||||
// Copyright © 2022 SimpleX Chat. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import SimpleXChat
|
||||
|
||||
struct MakeConnection: View {
|
||||
@EnvironmentObject var m: ChatModel
|
||||
@State private var connReq: String = ""
|
||||
@State private var actionSheet: NewChatAction?
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading) {
|
||||
HStack {
|
||||
SettingsButton()
|
||||
if m.chatRunning == false {
|
||||
Spacer()
|
||||
chatStoppedIcon()
|
||||
}
|
||||
}
|
||||
.padding(.bottom, 1)
|
||||
|
||||
if let user = m.currentUser {
|
||||
Text("Welcome \(user.displayName)!")
|
||||
.font(.largeTitle)
|
||||
.multilineTextAlignment(.leading)
|
||||
.padding(.bottom, 8)
|
||||
} else {
|
||||
Text("Make a private connection")
|
||||
.font(.largeTitle)
|
||||
.padding(.bottom)
|
||||
}
|
||||
|
||||
ScrollView {
|
||||
VStack(alignment: .leading) {
|
||||
Text("To make your first private connection, choose **one of the following**:")
|
||||
.padding(.bottom)
|
||||
|
||||
actionRow(
|
||||
icon: "link.badge.plus",
|
||||
title: "Create 1-time link / QR code",
|
||||
text: "It's secure to share - only one contact can use it."
|
||||
) { addContactAction() }
|
||||
|
||||
actionRow(
|
||||
icon: "doc.plaintext",
|
||||
title: "Paste the link you received",
|
||||
text: "Or open the link in the browser and tap **Open in mobile**."
|
||||
) { actionSheet = .pasteLink }
|
||||
|
||||
actionRow(
|
||||
icon: "qrcode.viewfinder",
|
||||
title: "Scan contact's QR code",
|
||||
text: "In person or via a video call – the most secure way to connect."
|
||||
) { actionSheet = .scanQRCode }
|
||||
|
||||
Text("or")
|
||||
.padding(.bottom)
|
||||
.frame(maxWidth: .infinity)
|
||||
|
||||
actionRow(
|
||||
icon: "number",
|
||||
title: "Connect with the developers",
|
||||
text: "To ask any questions and to receive SimpleX Chat updates."
|
||||
) {
|
||||
DispatchQueue.main.async {
|
||||
UIApplication.shared.open(simplexTeamURL)
|
||||
}
|
||||
}
|
||||
}
|
||||
.disabled(m.chatRunning != true)
|
||||
}
|
||||
|
||||
Spacer()
|
||||
|
||||
Button {
|
||||
withAnimation { m.onboardingStage = .step1_SimpleXInfo }
|
||||
} label: {
|
||||
HStack {
|
||||
Image(systemName: "lessthan")
|
||||
Text("About SimpleX")
|
||||
}
|
||||
}
|
||||
.padding(.bottom, 8)
|
||||
.padding(.bottom)
|
||||
}
|
||||
.sheet(item: $actionSheet) { sheet in
|
||||
switch sheet {
|
||||
case .createLink: AddContactView(connReqInvitation: connReq)
|
||||
case .pasteLink: PasteToConnectView()
|
||||
case .scanQRCode: ScanToConnectView()
|
||||
case .createGroup: EmptyView() // TODO refactor / show during onboarding?
|
||||
}
|
||||
}
|
||||
.onChange(of: actionSheet) { _ in checkOnboarding() }
|
||||
.onChange(of: m.chats.isEmpty) { _ in checkOnboarding() }
|
||||
.onChange(of: m.appOpenUrl) { _ in connectViaUrl() }
|
||||
.onAppear() { connectViaUrl() }
|
||||
.padding(.horizontal)
|
||||
.frame(maxHeight: .infinity, alignment: .top)
|
||||
}
|
||||
|
||||
private func checkOnboarding() {
|
||||
if actionSheet == nil && !m.chats.isEmpty {
|
||||
withAnimation { m.onboardingStage = .onboardingComplete }
|
||||
}
|
||||
}
|
||||
|
||||
private func addContactAction() {
|
||||
if let cReq = apiAddContact() {
|
||||
connReq = cReq
|
||||
actionSheet = .createLink
|
||||
}
|
||||
}
|
||||
|
||||
private func actionRow(icon: String, title: LocalizedStringKey, text: LocalizedStringKey, action: @escaping () -> Void) -> some View {
|
||||
Button(action: action, label: {
|
||||
HStack(alignment: .top, spacing: 20) {
|
||||
Image(systemName: icon)
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(width: 30, height: 30)
|
||||
.padding(.leading, 4)
|
||||
.padding(.top, 6)
|
||||
VStack(alignment: .leading) {
|
||||
Group {
|
||||
Text(title).font(.headline)
|
||||
Text(text).foregroundColor(.primary)
|
||||
}
|
||||
.multilineTextAlignment(.leading)
|
||||
}
|
||||
}
|
||||
})
|
||||
.padding(.bottom)
|
||||
}
|
||||
}
|
||||
|
||||
struct MakeConnection_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
let chatModel = ChatModel()
|
||||
chatModel.currentUser = User.sampleData
|
||||
return MakeConnection()
|
||||
.environmentObject(chatModel)
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,6 @@ struct OnboardingView: View {
|
||||
case .step1_SimpleXInfo: SimpleXInfo(onboarding: true)
|
||||
case .step2_CreateProfile: CreateProfile()
|
||||
case .step3_SetNotificationsMode: SetNotificationsMode()
|
||||
case .step4_MakeConnection: MakeConnection()
|
||||
case .onboardingComplete: EmptyView()
|
||||
}
|
||||
}
|
||||
@@ -26,7 +25,6 @@ enum OnboardingStage {
|
||||
case step1_SimpleXInfo
|
||||
case step2_CreateProfile
|
||||
case step3_SetNotificationsMode
|
||||
case step4_MakeConnection
|
||||
case onboardingComplete
|
||||
}
|
||||
|
||||
|
||||
@@ -32,9 +32,7 @@ struct SetNotificationsMode: View {
|
||||
} else {
|
||||
AlertManager.shared.showAlertMsg(title: "No device token!")
|
||||
}
|
||||
m.onboardingStage = m.chats.isEmpty
|
||||
? .step4_MakeConnection
|
||||
: .onboardingComplete
|
||||
m.onboardingStage = .onboardingComplete
|
||||
} label: {
|
||||
if case .off = notificationMode {
|
||||
Text("Use chat")
|
||||
|
||||
@@ -78,7 +78,7 @@ struct OnboardingActionButton: View {
|
||||
if m.currentUser == nil {
|
||||
actionButton("Create your profile", onboarding: .step2_CreateProfile)
|
||||
} else {
|
||||
actionButton("Make a private connection", onboarding: .step4_MakeConnection)
|
||||
actionButton("Make a private connection", onboarding: .onboardingComplete)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -463,11 +463,6 @@
|
||||
<target>Connect via relay</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Connect with the developers" xml:space="preserve">
|
||||
<source>Connect with the developers</source>
|
||||
<target>Connect with the developers</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||
<source>Connecting to server…</source>
|
||||
<target>Connecting to server…</target>
|
||||
@@ -553,11 +548,6 @@
|
||||
<target>Create</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Create 1-time link / QR code" xml:space="preserve">
|
||||
<source>Create 1-time link / QR code</source>
|
||||
<target>Create 1-time link / QR code</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Create address" xml:space="preserve">
|
||||
<source>Create address</source>
|
||||
<target>Create address</target>
|
||||
@@ -1251,11 +1241,6 @@
|
||||
<target>Import database</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="In person or via a video call – the most secure way to connect." xml:space="preserve">
|
||||
<source>In person or via a video call – the most secure way to connect.</source>
|
||||
<target>In person or via a video call – the most secure way to connect.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incognito" xml:space="preserve">
|
||||
<source>Incognito</source>
|
||||
<target>Incognito</target>
|
||||
@@ -1353,11 +1338,6 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>It seems like you are already connected via this link. If it is not the case, there was an error (%@).</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="It's secure to share - only one contact can use it." xml:space="preserve">
|
||||
<source>It's secure to share - only one contact can use it.</source>
|
||||
<target>It's secure to share - only one contact can use it.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Join" xml:space="preserve">
|
||||
<source>Join</source>
|
||||
<target>Join</target>
|
||||
@@ -1653,11 +1633,6 @@ 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="Or open the link in the browser and tap **Open in mobile**." xml:space="preserve">
|
||||
<source>Or open the link in the browser and tap **Open in mobile**.</source>
|
||||
<target>Or open the link in the browser and tap **Open in mobile**.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="PING interval" xml:space="preserve">
|
||||
<source>PING interval</source>
|
||||
<target>PING interval</target>
|
||||
@@ -1678,11 +1653,6 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>Paste received link</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Paste the link you received" xml:space="preserve">
|
||||
<source>Paste the link you received</source>
|
||||
<target>Paste the link you received</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Paste the link you received into the box below to connect with your contact." xml:space="preserve">
|
||||
<source>Paste the link you received into the box below to connect with your contact.</source>
|
||||
<target>Paste the link you received into the box below to connect with your contact.</target>
|
||||
@@ -1943,11 +1913,6 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>Scan QR code</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Scan contact's QR code" xml:space="preserve">
|
||||
<source>Scan contact's QR code</source>
|
||||
<target>Scan contact's QR code</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Search" xml:space="preserve">
|
||||
<source>Search</source>
|
||||
<target>Search</target>
|
||||
@@ -2148,6 +2113,11 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>Tap to join incognito</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap to start a new chat" xml:space="preserve">
|
||||
<source>Tap to start a new chat</source>
|
||||
<target>Tap to start a new chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Thank you for installing SimpleX Chat!" xml:space="preserve">
|
||||
<source>Thank you for installing SimpleX Chat!</source>
|
||||
<target>Thank you for installing SimpleX Chat!</target>
|
||||
@@ -2233,11 +2203,6 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>This group no longer exists.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To ask any questions and to receive SimpleX Chat updates." xml:space="preserve">
|
||||
<source>To ask any questions and to receive SimpleX Chat updates.</source>
|
||||
<target>To ask any questions and to receive SimpleX Chat updates.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To ask any questions and to receive updates:" xml:space="preserve">
|
||||
<source>To ask any questions and to receive updates:</source>
|
||||
<target>To ask any questions and to receive updates:</target>
|
||||
@@ -2253,11 +2218,6 @@ We will be adding server redundancy to prevent lost messages.</target>
|
||||
<target>To make a new connection</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To make your first private connection, choose **one of the following**:" xml:space="preserve">
|
||||
<source>To make your first private connection, choose **one of the following**:</source>
|
||||
<target>To make your first private connection, choose **one of the following**:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To prevent the call interruption, enable Do Not Disturb mode." xml:space="preserve">
|
||||
<source>To prevent the call interruption, enable Do Not Disturb mode.</source>
|
||||
<target>To prevent the call interruption, enable Do Not Disturb mode.</target>
|
||||
@@ -2507,6 +2467,11 @@ To connect, please ask your contact to create another connection link and check
|
||||
<target>You could not be verified; please try again.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You have no chats" xml:space="preserve">
|
||||
<source>You have no chats</source>
|
||||
<target>You have no chats</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
|
||||
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
|
||||
<target>You have to enter passphrase every time the app starts - it is not stored on the device.</target>
|
||||
@@ -2966,9 +2931,9 @@ SimpleX servers cannot see your profile.</target>
|
||||
<target>no e2e encryption</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="or" xml:space="preserve">
|
||||
<source>or</source>
|
||||
<target>or</target>
|
||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
||||
<source>or chat with the developers</source>
|
||||
<target>or chat with the developers</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="owner" xml:space="preserve">
|
||||
|
||||
@@ -463,11 +463,6 @@
|
||||
<target>Соединяться через сервер (relay)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Connect with the developers" xml:space="preserve">
|
||||
<source>Connect with the developers</source>
|
||||
<target>Соединиться с разработчиками</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||
<source>Connecting to server…</source>
|
||||
<target>Устанавливается соединение с сервером…</target>
|
||||
@@ -553,11 +548,6 @@
|
||||
<target>Создать</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Create 1-time link / QR code" xml:space="preserve">
|
||||
<source>Create 1-time link / QR code</source>
|
||||
<target>Создать ссылку / QR код</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Create address" xml:space="preserve">
|
||||
<source>Create address</source>
|
||||
<target>Создать адрес</target>
|
||||
@@ -1251,11 +1241,6 @@
|
||||
<target>Импорт архива чата</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="In person or via a video call – the most secure way to connect." xml:space="preserve">
|
||||
<source>In person or via a video call – the most secure way to connect.</source>
|
||||
<target>При встрече или в видеозвонке – самый безопасный способ установить соединение</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Incognito" xml:space="preserve">
|
||||
<source>Incognito</source>
|
||||
<target>Инкогнито</target>
|
||||
@@ -1353,11 +1338,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="It's secure to share - only one contact can use it." xml:space="preserve">
|
||||
<source>It's secure to share - only one contact can use it.</source>
|
||||
<target>Ей безопасно поделиться - только один контакт может использовать её.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Join" xml:space="preserve">
|
||||
<source>Join</source>
|
||||
<target>Вступить</target>
|
||||
@@ -1653,11 +1633,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="Or open the link in the browser and tap **Open in mobile**." xml:space="preserve">
|
||||
<source>Or open the link in the browser and tap **Open in mobile**.</source>
|
||||
<target>Или откройте ссылку в браузере и нажмите **Open in mobile**.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="PING interval" xml:space="preserve">
|
||||
<source>PING interval</source>
|
||||
<target>Интервал PING</target>
|
||||
@@ -1678,11 +1653,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="Paste the link you received" xml:space="preserve">
|
||||
<source>Paste the link you received</source>
|
||||
<target>Вставьте полученную ссылку</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Paste the link you received into the box below to connect with your contact." xml:space="preserve">
|
||||
<source>Paste the link you received into the box below to connect with your contact.</source>
|
||||
<target>Чтобы соединиться, вставьте ссылку, полученную от вашего контакта.</target>
|
||||
@@ -1943,11 +1913,6 @@ We will be adding server redundancy to prevent lost messages.</source>
|
||||
<target>Сканировать QR код</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Scan contact's QR code" xml:space="preserve">
|
||||
<source>Scan contact's QR code</source>
|
||||
<target>Сосканировать QR код контакта</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Search" xml:space="preserve">
|
||||
<source>Search</source>
|
||||
<target>Поиск</target>
|
||||
@@ -2148,6 +2113,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="Tap to start a new chat" xml:space="preserve">
|
||||
<source>Tap to start a new chat</source>
|
||||
<target>Нажмите, чтобы начать чат</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Thank you for installing SimpleX Chat!" xml:space="preserve">
|
||||
<source>Thank you for installing SimpleX Chat!</source>
|
||||
<target>Спасибо, что установили SimpleX Chat!</target>
|
||||
@@ -2233,11 +2203,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="To ask any questions and to receive SimpleX Chat updates." xml:space="preserve">
|
||||
<source>To ask any questions and to receive SimpleX Chat updates.</source>
|
||||
<target>Чтобы задать вопросы и получать уведомления о SimpleX Chat.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To ask any questions and to receive updates:" xml:space="preserve">
|
||||
<source>To ask any questions and to receive updates:</source>
|
||||
<target>Чтобы задать вопросы и получать уведомления о новых версиях,</target>
|
||||
@@ -2253,11 +2218,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="To make your first private connection, choose **one of the following**:" xml:space="preserve">
|
||||
<source>To make your first private connection, choose **one of the following**:</source>
|
||||
<target>Чтобы добавить ваш первый контакт, выберите **одно из**:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To prevent the call interruption, enable Do Not Disturb mode." xml:space="preserve">
|
||||
<source>To prevent the call interruption, enable Do Not Disturb mode.</source>
|
||||
<target>Чтобы избежать прерывания звонков, включите режим Не Беспокоить.</target>
|
||||
@@ -2507,6 +2467,11 @@ To connect, please ask your contact to create another connection link and check
|
||||
<target>Верификация не удалась; пожалуйста, попробуйте ещё раз.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You have no chats" xml:space="preserve">
|
||||
<source>You have no chats</source>
|
||||
<target>У вас нет чатов</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You have to enter passphrase every time the app starts - it is not stored on the device." xml:space="preserve">
|
||||
<source>You have to enter passphrase every time the app starts - it is not stored on the device.</source>
|
||||
<target>Пароль не сохранен на устройстве — вы будете должны ввести его при каждом запуске чата.</target>
|
||||
@@ -2966,9 +2931,9 @@ SimpleX серверы не могут получить доступ к ваше
|
||||
<target>нет e2e шифрования</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="or" xml:space="preserve">
|
||||
<source>or</source>
|
||||
<target>или</target>
|
||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
||||
<source>or chat with the developers</source>
|
||||
<target>или соединитесь с разработчиками</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="owner" xml:space="preserve">
|
||||
|
||||
@@ -76,7 +76,6 @@
|
||||
5CB0BA8E2827126500B3292C /* OnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB0BA8D2827126500B3292C /* OnboardingView.swift */; };
|
||||
5CB0BA90282713D900B3292C /* SimpleXInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB0BA8F282713D900B3292C /* SimpleXInfo.swift */; };
|
||||
5CB0BA92282713FD00B3292C /* CreateProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB0BA91282713FD00B3292C /* CreateProfile.swift */; };
|
||||
5CB0BA962827143500B3292C /* MakeConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB0BA952827143500B3292C /* MakeConnection.swift */; };
|
||||
5CB0BA9A2827FD8800B3292C /* HowItWorks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB0BA992827FD8800B3292C /* HowItWorks.swift */; };
|
||||
5CB2084F28DA4B4800D024EC /* RTCServers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB2084E28DA4B4800D024EC /* RTCServers.swift */; };
|
||||
5CB346E52868AA7F001FD2EF /* SuspendChat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB346E42868AA7F001FD2EF /* SuspendChat.swift */; };
|
||||
@@ -270,7 +269,6 @@
|
||||
5CB0BA8D2827126500B3292C /* OnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingView.swift; sourceTree = "<group>"; };
|
||||
5CB0BA8F282713D900B3292C /* SimpleXInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleXInfo.swift; sourceTree = "<group>"; };
|
||||
5CB0BA91282713FD00B3292C /* CreateProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateProfile.swift; sourceTree = "<group>"; };
|
||||
5CB0BA952827143500B3292C /* MakeConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MakeConnection.swift; sourceTree = "<group>"; };
|
||||
5CB0BA992827FD8800B3292C /* HowItWorks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HowItWorks.swift; sourceTree = "<group>"; };
|
||||
5CB2084E28DA4B4800D024EC /* RTCServers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RTCServers.swift; sourceTree = "<group>"; };
|
||||
5CB346E42868AA7F001FD2EF /* SuspendChat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuspendChat.swift; sourceTree = "<group>"; };
|
||||
@@ -530,7 +528,6 @@
|
||||
5CB0BA992827FD8800B3292C /* HowItWorks.swift */,
|
||||
5CB0BA91282713FD00B3292C /* CreateProfile.swift */,
|
||||
5C9A5BDA2871E05400A5B906 /* SetNotificationsMode.swift */,
|
||||
5CB0BA952827143500B3292C /* MakeConnection.swift */,
|
||||
);
|
||||
path = Onboarding;
|
||||
sourceTree = "<group>";
|
||||
@@ -908,7 +905,6 @@
|
||||
5C05DF532840AA1D00C683F9 /* CallSettings.swift in Sources */,
|
||||
5CFE0921282EEAF60002594B /* ZoomableScrollView.swift in Sources */,
|
||||
5C3A88CE27DF50170060F1C2 /* DetermineWidth.swift in Sources */,
|
||||
5CB0BA962827143500B3292C /* MakeConnection.swift in Sources */,
|
||||
5C7505A527B679EE00BE3227 /* NavLinkPlain.swift in Sources */,
|
||||
5CB346E72868D76D001FD2EF /* NotificationsView.swift in Sources */,
|
||||
647F090E288EA27B00644C40 /* GroupMemberInfoView.swift in Sources */,
|
||||
|
||||
@@ -323,9 +323,6 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Connect via relay" = "Соединяться через сервер (relay)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Connect with the developers" = "Соединиться с разработчиками";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"connected" = "соединение установлено";
|
||||
|
||||
@@ -413,9 +410,6 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Create" = "Создать";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Create 1-time link / QR code" = "Создать ссылку / QR код";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Create address" = "Создать адрес";
|
||||
|
||||
@@ -860,9 +854,6 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Import database" = "Импорт архива чата";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"In person or via a video call – the most secure way to connect." = "При встрече или в видеозвонке – самый безопасный способ установить соединение";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Incognito" = "Инкогнито";
|
||||
|
||||
@@ -941,9 +932,6 @@
|
||||
/* No comment provided by engineer. */
|
||||
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Возможно, вы уже соединились через эту ссылку. Если это не так, то это ошибка (%@).";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"It's secure to share - only one contact can use it." = "Ей безопасно поделиться - только один контакт может использовать её.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"italic" = "курсив";
|
||||
|
||||
@@ -1149,10 +1137,7 @@
|
||||
"Open-source protocol and code – anybody can run the servers." = "Открытый протокол и код - кто угодно может запустить сервер.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"or" = "или";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or open the link in the browser and tap **Open in mobile**." = "Или откройте ссылку в браузере и нажмите **Open in mobile**.";
|
||||
"or chat with the developers" = "или соединитесь с разработчиками";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"owner" = "владелец";
|
||||
@@ -1166,9 +1151,6 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Paste received link" = "Вставить полученную ссылку";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Paste the link you received" = "Вставьте полученную ссылку";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Paste the link you received into the box below to connect with your contact." = "Чтобы соединиться, вставьте ссылку, полученную от вашего контакта.";
|
||||
|
||||
@@ -1340,9 +1322,6 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Saved WebRTC ICE servers will be removed" = "Сохраненные WebRTC ICE серверы будут удалены";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Scan contact's QR code" = "Сосканировать QR код контакта";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Scan QR code" = "Сканировать QR код";
|
||||
|
||||
@@ -1472,6 +1451,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Tap to join incognito" = "Нажмите, чтобы вступить инкогнито";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Tap to start a new chat" = "Нажмите, чтобы начать чат";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"TCP connection timeout" = "Таймаут TCP соединения";
|
||||
|
||||
@@ -1538,9 +1520,6 @@
|
||||
/* No comment provided by engineer. */
|
||||
"This group no longer exists." = "Эта группа больше не существует.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To ask any questions and to receive SimpleX Chat updates." = "Чтобы задать вопросы и получать уведомления о SimpleX Chat.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To ask any questions and to receive updates:" = "Чтобы задать вопросы и получать уведомления о новых версиях,";
|
||||
|
||||
@@ -1550,9 +1529,6 @@
|
||||
/* No comment provided by engineer. */
|
||||
"To make a new connection" = "Чтобы соединиться";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To make your first private connection, choose **one of the following**:" = "Чтобы добавить ваш первый контакт, выберите **одно из**:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To prevent the call interruption, enable Do Not Disturb mode." = "Чтобы избежать прерывания звонков, включите режим Не Беспокоить.";
|
||||
|
||||
@@ -1733,6 +1709,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"You could not be verified; please try again." = "Верификация не удалась; пожалуйста, попробуйте ещё раз.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You have no chats" = "У вас нет чатов";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You have to enter passphrase every time the app starts - it is not stored on the device." = "Пароль не сохранен на устройстве — вы будете должны ввести его при каждом запуске чата.";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user