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:
Evgeny Poberezkin
2022-09-21 15:11:52 +01:00
committed by GitHub
parent 59b4ce2474
commit df329d305b
12 changed files with 143 additions and 344 deletions

View File

@@ -763,8 +763,6 @@ func startChat() throws {
withAnimation {
m.onboardingStage = m.onboardingStage == .step2_CreateProfile
? .step3_SetNotificationsMode
: m.chats.isEmpty
? .step4_MakeConnection
: .onboardingComplete
}
}

View File

@@ -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:")
}

View File

@@ -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 {

View File

@@ -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))
}
}

View File

@@ -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)
}
}

View File

@@ -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
}

View File

@@ -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")

View File

@@ -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)
}
}

View File

@@ -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">

View File

@@ -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">

View File

@@ -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 */,

View File

@@ -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." = "Пароль не сохранен на устройстве — вы будете должны ввести его при каждом запуске чата.";