From 7343e4a51aa3fb8078d518ec02641f45712390fd Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Mon, 29 Aug 2022 14:47:29 +0400 Subject: [PATCH] ios: simplify incognito feature (#979) --- apps/ios/Shared/Model/SimpleXAPI.swift | 4 +- .../Chat/ChatItem/CIGroupInvitationView.swift | 19 +-- apps/ios/Shared/Views/Chat/ChatView.swift | 29 ++-- .../Chat/Group/AddGroupMembersView.swift | 49 ++----- .../Views/Chat/Group/GroupChatInfoView.swift | 33 +++-- .../Chat/Group/GroupMemberInfoView.swift | 18 --- .../Views/ChatList/ChatListNavLink.swift | 37 +---- .../Views/ChatList/ChatPreviewView.swift | 17 ++- .../Shared/Views/NewChat/AddGroupView.swift | 13 +- .../Views/UserSettings/IncognitoHelp.swift | 29 +--- .../en.xcloc/Localized Contents/en.xliff | 130 ++++------------- .../ru.xcloc/Localized Contents/ru.xliff | 132 ++++-------------- apps/ios/SimpleXChat/APITypes.swift | 4 +- apps/ios/SimpleXChat/ChatTypes.swift | 14 +- apps/ios/ru.lproj/Localizable.strings | 70 ++-------- 15 files changed, 165 insertions(+), 433 deletions(-) diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index ea5df407da..9f17dc8737 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -324,9 +324,9 @@ func apiContactInfo(contactId: Int64) async throws -> (ConnectionStats?, Profile throw r } -func apiGroupMemberInfo(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (ConnectionStats?, LocalProfile?) { +func apiGroupMemberInfo(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (ConnectionStats?) { let r = await chatSendCmd(.apiGroupMemberInfo(groupId: groupId, groupMemberId: groupMemberId)) - if case let .groupMemberInfo(_, _, connStats_, localMainProfile) = r { return (connStats_, localMainProfile) } + if case let .groupMemberInfo(_, _, connStats_) = r { return (connStats_) } throw r } diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIGroupInvitationView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIGroupInvitationView.swift index 8fc5421f52..c7ec3ca713 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/CIGroupInvitationView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIGroupInvitationView.swift @@ -20,7 +20,6 @@ struct CIGroupInvitationView: View { var body: some View { let action = !chatItem.chatDir.sent && groupInvitation.status == .pending - let unsafeToJoinIncognito = interactiveIncognito && !chatIncognito let v = ZStack(alignment: .bottomTrailing) { VStack(alignment: .leading) { groupInfoView(action) @@ -34,8 +33,8 @@ struct CIGroupInvitationView: View { if action { groupInvitationText() .overlay(DetermineWidth()) - Text(interactiveIncognito ? "Tap to join incognito" : "Tap to join") - .foregroundColor(interactiveIncognito ? .indigo : .accentColor) + Text(chatIncognito ? "Tap to join incognito" : "Tap to join") + .foregroundColor(chatIncognito ? .indigo : .accentColor) .font(.callout) .padding(.trailing, 60) .overlay(DetermineWidth()) @@ -59,25 +58,17 @@ struct CIGroupInvitationView: View { if action { v.onTapGesture { - if unsafeToJoinIncognito { - AlertManager.shared.showAlert(unsafeToJoinIncognitoAlert(groupInvitation.groupId)) - } else { - joinGroup(groupInvitation.groupId) - } + joinGroup(groupInvitation.groupId) } } else { v } } - private var interactiveIncognito: Bool { - (groupInvitation.invitedIncognito ?? false) || chatModel.incognito - } - private func groupInfoView(_ action: Bool) -> some View { var color: Color if action { - color = interactiveIncognito ? .indigo : .accentColor + color = chatIncognito ? .indigo : .accentColor } else { color = Color(uiColor: .tertiaryLabel) } @@ -107,7 +98,7 @@ struct CIGroupInvitationView: View { private func groupInvitationStr() -> LocalizedStringKey { if chatItem.chatDir.sent { - return (groupInvitation.invitedIncognito ?? false) ? "You sent group invitation incognito" : "You sent group invitation" + return "You sent group invitation" } else { switch groupInvitation.status { case .pending: return "You are invited to group" diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 42dfb7b676..5251617021 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -34,7 +34,6 @@ struct ChatView: View { // opening GroupMemberInfoView on member icon @State private var selectedMember: GroupMember? = nil @State private var memberConnectionStats: ConnectionStats? - @State private var memberMainProfile: LocalProfile? var body: some View { let cInfo = chat.chatInfo @@ -137,10 +136,16 @@ struct ChatView: View { case let .group(groupInfo): HStack { if groupInfo.canAddMembers { - addMembersButton() - .sheet(isPresented: $showAddMembersSheet) { - AddGroupMembersView(chat: chat, groupInfo: groupInfo) - } + if (chat.chatInfo.incognito) { + Image(systemName: "person.crop.circle.badge.plus") + .foregroundColor(Color(uiColor: .tertiaryLabel)) + .onTapGesture { AlertManager.shared.showAlert(cantInviteIncognitoAlert()) } + } else { + addMembersButton() + .sheet(isPresented: $showAddMembersSheet) { + AddGroupMembersView(chat: chat, groupInfo: groupInfo) + } + } } Menu { searchButton() @@ -360,22 +365,16 @@ struct ChatView: View { .onTapGesture { Task { do { - let (stats, profile) = try await apiGroupMemberInfo(member.groupId, member.groupMemberId) - await MainActor.run { - memberConnectionStats = stats - memberMainProfile = profile - } + let stats = try await apiGroupMemberInfo(member.groupId, member.groupMemberId) + await MainActor.run { memberConnectionStats = stats } } catch let error { logger.error("apiGroupMemberInfo error: \(responseError(error))") } await MainActor.run { selectedMember = member } } } - .sheet(item: $selectedMember, onDismiss: { - memberConnectionStats = nil - memberMainProfile = nil - }) { member in - GroupMemberInfoView(groupInfo: groupInfo, member: member, connectionStats: memberConnectionStats, mainProfile: memberMainProfile) + .sheet(item: $selectedMember, onDismiss: { memberConnectionStats = nil }) { member in + GroupMemberInfoView(groupInfo: groupInfo, member: member, connectionStats: memberConnectionStats) } } else { Rectangle().fill(.clear) diff --git a/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift b/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift index 6a75758e02..2ab0fc5161 100644 --- a/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift +++ b/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift @@ -15,6 +15,7 @@ struct AddGroupMembersView: View { var chat: Chat var groupInfo: GroupInfo var showSkip: Bool = false + var showFooterCounter: Bool = true var addedMembersCb: ((Set) -> Void)? = nil @State private var selectedContacts = Set() @State private var selectedRole: GroupMemberRole = .admin @@ -22,13 +23,11 @@ struct AddGroupMembersView: View { private enum AddGroupMembersAlert: Identifiable { case prohibitedToInviteIncognito - case warnUnsafeToInviteIncognito case error(title: LocalizedStringKey, error: String = "") var id: String { switch self { case .prohibitedToInviteIncognito: return "prohibitedToInviteIncognito" - case .warnUnsafeToInviteIncognito: return "warnUnsafeToInviteIncognito" case let .error(title, _): return "error \(title)" } } @@ -37,10 +36,6 @@ struct AddGroupMembersView: View { var body: some View { NavigationView { let membersToAdd = filterMembersToAdd(chatModel.groupMembers) - let nonIncognitoConnectionsSelected = membersToAdd - .filter{ selectedContacts.contains($0.apiId) } - .contains(where: { !$0.contactConnIncognito }) - let unsafeToInviteIncognito = chat.chatInfo.incognito && nonIncognitoConnectionsSelected let v = List { ChatInfoToolbar(chat: chat, imageSize: 48) @@ -58,18 +53,20 @@ struct AddGroupMembersView: View { let count = selectedContacts.count Section { rolePicker() - inviteMembersButton(unsafeToInviteIncognito) + inviteMembersButton() .disabled(count < 1) } footer: { - if (count >= 1) { - HStack { - Button { selectedContacts.removeAll() } label: { Text("Clear") } - Spacer() - Text("\(count) contact(s) selected") + if showFooterCounter { + if (count >= 1) { + HStack { + Button { selectedContacts.removeAll() } label: { Text("Clear") } + Spacer() + Text("\(count) contact(s) selected") + } + } else { + Text("No contacts selected") + .frame(maxWidth: .infinity, alignment: .trailing) } - } else { - Text("No contacts selected") - .frame(maxWidth: .infinity, alignment: .trailing) } } @@ -103,27 +100,15 @@ struct AddGroupMembersView: View { title: Text("Can't invite contact!"), message: Text("You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile") ) - case .warnUnsafeToInviteIncognito: - return Alert( - title: Text("Your main profile may be shared"), - message: Text("Some selected contacts have your main profile. If they use SimpleX app older than v3.2 or some other client, they may share your main profile instead of a random incognito profile with other members."), - primaryButton: .destructive(Text("Invite anyway")) { - inviteMembers() - }, secondaryButton: .cancel() - ) case let .error(title, error): return Alert(title: Text(title), message: Text("\(error)")) } } } - private func inviteMembersButton(_ unsafeToInviteIncognito: Bool) -> some View { + private func inviteMembersButton() -> some View { Button { - if unsafeToInviteIncognito { - alert = .warnUnsafeToInviteIncognito - } else { - inviteMembers() - } + inviteMembers() } label: { HStack { Text("Invite to group") @@ -161,7 +146,6 @@ struct AddGroupMembersView: View { private func contactCheckView(_ contact: Contact) -> some View { let checked = selectedContacts.contains(contact.apiId) let prohibitedToInviteIncognito = !chat.chatInfo.incognito && contact.contactConnIncognito - let safeToInviteIncognito = chat.chatInfo.incognito && contact.contactConnIncognito var icon: String var iconColor: Color if prohibitedToInviteIncognito { @@ -195,11 +179,6 @@ struct AddGroupMembersView: View { .foregroundColor(prohibitedToInviteIncognito ? .secondary : .primary) .lineLimit(1) Spacer() - if safeToInviteIncognito { - Image(systemName: "theatermasks") - .foregroundColor(.indigo) - .font(.footnote) - } Image(systemName: icon) .foregroundColor(iconColor) } diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift index 1ce709881e..25b9cff0e7 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift @@ -20,13 +20,13 @@ struct GroupChatInfoView: View { @State private var selectedMember: GroupMember? = nil @State private var showGroupProfile: Bool = false @State private var connectionStats: ConnectionStats? - @State private var memberMainProfile: LocalProfile? @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false enum GroupChatInfoViewAlert: Identifiable { case deleteGroupAlert case clearChatAlert case leaveGroupAlert + case cantInviteIncognitoAlert var id: GroupChatInfoViewAlert { get { self } } } @@ -43,18 +43,21 @@ struct GroupChatInfoView: View { Section("\(members.count + 1) members") { if groupInfo.canAddMembers { - addMembersButton() + if (chat.chatInfo.incognito) { + Label("Invite members", systemImage: "plus") + .foregroundColor(Color(uiColor: .tertiaryLabel)) + .onTapGesture { alert = .cantInviteIncognitoAlert } + } else { + addMembersButton() + } } memberView(groupInfo.membership, user: true) ForEach(members) { member in Button { Task { do { - let (stats, profile) = try await apiGroupMemberInfo(groupInfo.apiId, member.groupMemberId) - await MainActor.run { - connectionStats = stats - memberMainProfile = profile - } + let stats = try await apiGroupMemberInfo(groupInfo.apiId, member.groupMemberId) + await MainActor.run { connectionStats = stats } } catch let error { logger.error("apiGroupMemberInfo error: \(responseError(error))") } @@ -66,11 +69,8 @@ struct GroupChatInfoView: View { .sheet(isPresented: $showAddMembersSheet) { AddGroupMembersView(chat: chat, groupInfo: groupInfo) } - .sheet(item: $selectedMember, onDismiss: { - connectionStats = nil - memberMainProfile = nil - }) { member in - GroupMemberInfoView(groupInfo: groupInfo, member: member, connectionStats: connectionStats, mainProfile: memberMainProfile) + .sheet(item: $selectedMember, onDismiss: { connectionStats = nil }) { member in + GroupMemberInfoView(groupInfo: groupInfo, member: member, connectionStats: connectionStats) } .sheet(isPresented: $showGroupProfile) { GroupProfileView(groupId: groupInfo.apiId, groupProfile: groupInfo.groupProfile) @@ -104,6 +104,8 @@ struct GroupChatInfoView: View { case .deleteGroupAlert: return deleteGroupAlert() case .clearChatAlert: return clearChatAlert() case .leaveGroupAlert: return leaveGroupAlert() + case .cantInviteIncognitoAlert: return cantInviteIncognitoAlert() + } } } @@ -259,6 +261,13 @@ struct GroupChatInfoView: View { } } +func cantInviteIncognitoAlert() -> Alert { + Alert( + title: Text("Can't invite contacts!"), + message: Text("You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed") + ) +} + struct GroupChatInfoView_Previews: PreviewProvider { static var previews: some View { GroupChatInfoView(chat: Chat(chatInfo: ChatInfo.sampleData.group, chatItems: []), groupInfo: GroupInfo.sampleData) diff --git a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift index 5fa144bd75..3a315bb3e6 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift @@ -15,7 +15,6 @@ struct GroupMemberInfoView: View { var groupInfo: GroupInfo var member: GroupMember var connectionStats: ConnectionStats? - var mainProfile: LocalProfile? @State private var alert: GroupMemberInfoViewAlert? @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false @@ -39,9 +38,6 @@ struct GroupMemberInfoView: View { Section("Member") { infoRow("Group", groupInfo.displayName) - if let mainProfile = mainProfile { - mainProfileRow(mainProfile) - } // TODO change role // localizedInfoRow("Role", member.memberRole.text) // TODO invited by - need to get contact by contact id @@ -99,20 +95,6 @@ struct GroupMemberInfoView: View { } } - private func mainProfileRow(_ mainProfile: LocalProfile) -> some View { - HStack { - Text("Known main profile") - Spacer() - if (mainProfile.image != nil) { - ProfileImage(imageStr: member.image) - .frame(width: 38, height: 38) - .padding(.trailing, 2) - } - Text(mainProfile.chatViewName) - .foregroundColor(.secondary) - } - } - private func groupMemberInfoHeader() -> some View { VStack { ProfileImage(imageStr: member.image, color: Color(uiColor: .tertiarySystemFill)) diff --git a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift index 416a7ca82d..6cfef1a403 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift @@ -82,12 +82,8 @@ struct ChatListNavLink: View { } .onTapGesture { showJoinGroupDialog = true } .confirmationDialog("Group invitation", isPresented: $showJoinGroupDialog, titleVisibility: .visible) { - Button(interactiveIncognito ? "Join incognito" : "Join group") { - if unsafeToJoinIncognito(groupInfo.hostConnCustomUserProfileId) { - AlertManager.shared.showAlert(unsafeToJoinIncognitoAlert(chat.chatInfo.apiId)) - } else { - joinGroup(groupInfo.groupId) - } + Button(chat.chatInfo.incognito ? "Join incognito" : "Join group") { + joinGroup(groupInfo.groupId) } Button("Delete invitation", role: .destructive) { Task { await deleteChat(chat) } } } @@ -130,25 +126,13 @@ struct ChatListNavLink: View { } } - private var interactiveIncognito: Bool { - chat.chatInfo.incognito || chatModel.incognito - } - private func joinGroupButton(_ hostConnCustomUserProfileId: Int64?) -> some View { Button { - if unsafeToJoinIncognito(hostConnCustomUserProfileId) { - AlertManager.shared.showAlert(unsafeToJoinIncognitoAlert(chat.chatInfo.apiId)) - } else { - joinGroup(chat.chatInfo.apiId) - } + joinGroup(chat.chatInfo.apiId) } label: { - Label("Join", systemImage: interactiveIncognito ? "theatermasks" : "ipad.and.arrow.forward") + Label("Join", systemImage: chat.chatInfo.incognito ? "theatermasks" : "ipad.and.arrow.forward") } - .tint(interactiveIncognito ? .indigo : .accentColor) - } - - private func unsafeToJoinIncognito(_ hostConnCustomUserProfileId: Int64?) -> Bool { - interactiveIncognito && hostConnCustomUserProfileId == nil + .tint(chat.chatInfo.incognito ? .indigo : .accentColor) } private func markReadButton() -> some View { @@ -344,17 +328,6 @@ struct ChatListNavLink: View { } } -func unsafeToJoinIncognitoAlert(_ groupId: Int64) -> Alert { - Alert( - title: Text("Your main profile may be shared"), - message: Text("The contact who invited you has your main profile. If they use SimpleX app older than v3.2 or some other client, they may share your main profile instead of a random incognito profile with other members."), - primaryButton: .destructive(Text("Join anyway")) { - joinGroup(groupId) - }, - secondaryButton: .cancel() - ) -} - func joinGroup(_ groupId: Int64) { Task { logger.debug("joinGroup") diff --git a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift index 8d591bfc83..dd2e5a1469 100644 --- a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift @@ -89,7 +89,7 @@ struct ChatPreviewView: View { case .group(groupInfo: let groupInfo): switch (groupInfo.membership.memberStatus) { case .memInvited: - interactiveIncognito ? v.foregroundColor(.indigo) : v.foregroundColor(.accentColor) + chat.chatInfo.incognito ? v.foregroundColor(.indigo) : v.foregroundColor(.accentColor) case .memAccepted: v.foregroundColor(.secondary) default: v @@ -98,10 +98,6 @@ struct ChatPreviewView: View { } } - private var interactiveIncognito: Bool { - chat.chatInfo.incognito || chatModel.incognito - } - @ViewBuilder private func chatPreviewText(_ cItem: ChatItem?, _ unread: Int) -> some View { if let cItem = cItem { ZStack(alignment: .topTrailing) { @@ -131,7 +127,7 @@ struct ChatPreviewView: View { } case let .group(groupInfo): switch (groupInfo.membership.memberStatus) { - case .memInvited: chatPreviewInfoText(groupInfo.membership.memberIncognito ? "you are invited to group incognito" : "you are invited to group") + case .memInvited: groupInvitationPreviewText(groupInfo) case .memAccepted: chatPreviewInfoText("connecting…") default: EmptyView() } @@ -140,6 +136,15 @@ struct ChatPreviewView: View { } } + @ViewBuilder private func groupInvitationPreviewText(_ groupInfo: GroupInfo) -> some View { + groupInfo.membership.memberIncognito + ? chatPreviewInfoText("join as \(groupInfo.membership.memberProfile.displayName)") + : (chatModel.incognito + ? chatPreviewInfoText("join as \(chatModel.currentUser?.profile.displayName ?? "yourself")") + : chatPreviewInfoText("you are invited to group") + ) + } + @ViewBuilder private func chatPreviewInfoText(_ text: LocalizedStringKey) -> some View { Text(text) .frame(maxWidth: .infinity, minHeight: 44, maxHeight: 44, alignment: .topLeading) diff --git a/apps/ios/Shared/Views/NewChat/AddGroupView.swift b/apps/ios/Shared/Views/NewChat/AddGroupView.swift index 11e6948672..ed4e82c0e0 100644 --- a/apps/ios/Shared/Views/NewChat/AddGroupView.swift +++ b/apps/ios/Shared/Views/NewChat/AddGroupView.swift @@ -24,9 +24,12 @@ struct AddGroupView: View { var body: some View { if let chat = chat, let groupInfo = groupInfo { - AddGroupMembersView(chat: chat, - groupInfo: groupInfo, - showSkip: true) { _ in + AddGroupMembersView( + chat: chat, + groupInfo: groupInfo, + showSkip: true, + showFooterCounter: false + ) { _ in dismiss() DispatchQueue.main.async { m.chatId = groupInfo.id @@ -46,9 +49,9 @@ struct AddGroupView: View { .padding(.bottom, 4) if (m.incognito) { HStack { - Image(systemName: "theatermasks").foregroundColor(.indigo).font(.footnote) + Image(systemName: "info.circle").foregroundColor(.orange).font(.footnote) Spacer().frame(width: 8) - Text("You will use a random profile for this group").font(.footnote) + Text("Incognito mode is not supported here - your main profile will be sent to group members").font(.footnote) } .padding(.bottom) } else { diff --git a/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift b/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift index 32c548ed47..92f0f8c201 100644 --- a/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift +++ b/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift @@ -15,34 +15,15 @@ struct IncognitoHelp: View { .font(.largeTitle) .padding(.vertical) ScrollView { - VStack(alignment: .leading, spacing: 24) { - Text("Incognito mode protects the privacy of your main profile name and image — for each new contact and group a new random profile is created.") + VStack(alignment: .leading) { + Group { + Text("Incognito mode protects the privacy of your main profile name and image — for each new contact a new random profile is created.") Text("It allows having many anonymous connections without any shared data between them in a single chat profile.") + Text("When you share an incognito profile with somebody, this profile will be used for the groups they invite you to.") Text("To find the profile used for an incognito connection, tap the contact or group name on top of the chat.") - } - .padding(.bottom) - - VStack(alignment: .leading, spacing: 8) { - Text("Incognito groups") - .font(.title2) - .padding(.top) - Text("When you join a group incognito, your new member profile is created and shared with all members.") - Group { - Text("Your are incognito in a group when:") - .padding(.top) - textListItem("•", "the group is created in Incognito mode,") - textListItem("•", "you or the member who invited you joined in Incognito mode,") - textListItem("•", "you have an incognito connection with the member who invited you.") - } - Group { - Text("Risks and limitations:") - .padding(.top) - textListItem("•", "It is not allowed to invite contacts with whom you have an incognito connection to a group where you use your main profile – otherwise they might find out your main profile.") - textListItem("•", "There is a risk to have your main profile shared, if you have contacts who know your main profile in an incognito group. Before you invite or join group with such contacts a warning will be shown.") - } + .padding(.bottom) } - .padding(.bottom) } } .frame(maxWidth: .infinity) diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index 54abdd9d69..7ef483a497 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -293,6 +293,11 @@ Can't invite contact! No comment provided by engineer. + + Can't invite contacts! + Can't invite contacts! + No comment provided by engineer. + Cancel Cancel @@ -1008,19 +1013,19 @@ Incognito No comment provided by engineer. - - Incognito groups - Incognito groups - No comment provided by engineer. - Incognito mode Incognito mode No comment provided by engineer. - - Incognito mode protects the privacy of your main profile name and image — for each new contact and group a new random profile is created. - Incognito mode protects the privacy of your main profile name and image — for each new contact and group a new random profile is created. + + Incognito mode is not supported here - your main profile will be sent to group members + Incognito mode is not supported here - your main profile will be sent to group members + No comment provided by engineer. + + + Incognito mode protects the privacy of your main profile name and image — for each new contact a new random profile is created. + Incognito mode protects the privacy of your main profile name and image — for each new contact a new random profile is created. No comment provided by engineer. @@ -1058,11 +1063,6 @@ Invitation expired! No comment provided by engineer. - - Invite anyway - Invite anyway - No comment provided by engineer. - Invite members Invite members @@ -1093,11 +1093,6 @@ Please connect to the developers via Settings to receive the updates about the s We will be adding server redundancy to prevent lost messages. No comment provided by engineer. - - It is not allowed to invite contacts with whom you have an incognito connection to a group where you use your main profile – otherwise they might find out your main profile. - It is not allowed to invite contacts with whom you have an incognito connection to a group where you use your main profile – otherwise they might find out your main profile. - 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 (%@). It seems like you are already connected via this link. If it is not the case, there was an error (%@). @@ -1113,11 +1108,6 @@ We will be adding server redundancy to prevent lost messages. Join No comment provided by engineer. - - Join anyway - Join anyway - No comment provided by engineer. - Join group Join group @@ -1133,11 +1123,6 @@ We will be adding server redundancy to prevent lost messages. Joining group No comment provided by engineer. - - Known main profile - Known main profile - No comment provided by engineer. - Large file! Large file! @@ -1558,11 +1543,6 @@ We will be adding server redundancy to prevent lost messages. Revert No comment provided by engineer. - - Risks and limitations: - Risks and limitations: - No comment provided by engineer. - Run chat Run chat @@ -1618,6 +1598,11 @@ We will be adding server redundancy to prevent lost messages. Search No comment provided by engineer. + + Send direct message + Send direct message + No comment provided by engineer. + Send link previews Send link previews @@ -1708,11 +1693,6 @@ We will be adding server redundancy to prevent lost messages. Skipped messages No comment provided by engineer. - - Some selected contacts have your main profile. If they use SimpleX app older than v3.2 or some other client, they may share your main profile instead of a random incognito profile with other members. - Some selected contacts have your main profile. If they use SimpleX app older than v3.2 or some other client, they may share your main profile instead of a random incognito profile with other members. - No comment provided by engineer. - Somebody Somebody @@ -1808,11 +1788,6 @@ We will be adding server redundancy to prevent lost messages. The connection you accepted will be cancelled! No comment provided by engineer. - - The contact who invited you has your main profile. If they use SimpleX app older than v3.2 or some other client, they may share your main profile instead of a random incognito profile with other members. - The contact who invited you has your main profile. If they use SimpleX app older than v3.2 or some other client, they may share your main profile instead of a random incognito profile with other members. - No comment provided by engineer. - The contact you shared this link with will NOT be able to connect! The contact you shared this link with will NOT be able to connect! @@ -1853,11 +1828,6 @@ We will be adding server redundancy to prevent lost messages. The sender will NOT be notified No comment provided by engineer. - - There is a risk to have your main profile shared, if you have contacts who know your main profile in an incognito group. Before you invite or join group with such contacts a warning will be shown. - There is a risk to have your main profile shared, if you have contacts who know your main profile in an incognito group. Before you invite or join group with such contacts a warning will be shown. - No comment provided by engineer. - This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost. This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost. @@ -2037,9 +2007,9 @@ To connect, please ask your contact to create another connection link and check When available No comment provided by engineer. - - When you join a group incognito, your new member profile is created and shared with all members. - When you join a group incognito, your new member profile is created and shared with all members. + + When you share an incognito profile with somebody, this profile will be used for the groups they invite you to. + When you share an incognito profile with somebody, this profile will be used for the groups they invite you to. No comment provided by engineer. @@ -2137,11 +2107,6 @@ To connect, please ask your contact to create another connection link and check You sent group invitation No comment provided by engineer. - - You sent group invitation incognito - You sent group invitation incognito - No comment provided by engineer. - You will be connected when your connection request is accepted, please wait or check later! You will be connected when your connection request is accepted, please wait or check later! @@ -2162,16 +2127,16 @@ To connect, please ask your contact to create another connection link and check You will stop receiving messages from this group. Chat history will be preserved. No comment provided by engineer. - - You will use a random profile for this group - You will use a random profile for this group - No comment provided by engineer. - You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile No comment provided by engineer. + + You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed + You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed + No comment provided by engineer. + Your SMP servers Your SMP servers @@ -2182,11 +2147,6 @@ To connect, please ask your contact to create another connection link and check Your SimpleX contact address No comment provided by engineer. - - Your are incognito in a group when: - Your are incognito in a group when: - No comment provided by engineer. - Your calls Your calls @@ -2244,11 +2204,6 @@ You can cancel this connection and remove the contact (and try later with a new Your current chat database will be DELETED and REPLACED with the imported one. No comment provided by engineer. - - Your main profile may be shared - Your main profile may be shared - No comment provided by engineer. - Your privacy Your privacy @@ -2476,11 +2431,6 @@ SimpleX servers cannot see your profile. group profile updated snd group event chat item - - incognito invitation to group %@ - incognito invitation to group %@ - group name - incognito via contact address link incognito via contact address link @@ -2521,10 +2471,10 @@ SimpleX servers cannot see your profile. italic No comment provided by engineer. - - known to you as %@ connected incognito - known to you as %@ connected incognito - rcv group event chat item + + join as %@ + join as %@ + No comment provided by engineer. left @@ -2626,11 +2576,6 @@ SimpleX servers cannot see your profile. strike No comment provided by engineer. - - the group is created in Incognito mode, - the group is created in Incognito mode, - No comment provided by engineer. - this contact this contact @@ -2691,26 +2636,11 @@ SimpleX servers cannot see your profile. you are invited to group No comment provided by engineer. - - you are invited to group incognito - you are invited to group incognito - No comment provided by engineer. - - - you have an incognito connection with the member who invited you. - you have an incognito connection with the member who invited you. - No comment provided by engineer. - you left you left snd group event chat item - - you or the member who invited you joined in Incognito mode, - you or the member who invited you joined in Incognito mode, - No comment provided by engineer. - you removed %@ you removed %@ diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff index 7902c5b90c..a759506256 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -293,6 +293,11 @@ Нельзя пригласить контакт! No comment provided by engineer. + + Can't invite contacts! + Нельзя пригласить контакты! + No comment provided by engineer. + Cancel Отменить @@ -1008,19 +1013,19 @@ Инкогнито No comment provided by engineer. - - Incognito groups - Инкогнито группы - No comment provided by engineer. - Incognito mode Режим Инкогнито No comment provided by engineer. - - Incognito mode protects the privacy of your main profile name and image — for each new contact and group a new random profile is created. - Режим Инкогнито защищает конфиденциальность имени и изображения вашего основного профиля — для каждого нового контакта и группы создается новый случайный профиль. + + Incognito mode is not supported here - your main profile will be sent to group members + Режим Инкогнито здесь не поддерживается - ваш основной профиль будет отправлен членам группы + No comment provided by engineer. + + + Incognito mode protects the privacy of your main profile name and image — for each new contact a new random profile is created. + Режим Инкогнито защищает конфиденциальность имени и изображения вашего основного профиля — для каждого нового контакта создается новый случайный профиль. No comment provided by engineer. @@ -1058,11 +1063,6 @@ Приглашение истекло! No comment provided by engineer. - - Invite anyway - Пригласить - No comment provided by engineer. - Invite members Пригласить членов группы @@ -1093,11 +1093,6 @@ We will be adding server redundancy to prevent lost messages. Мы планируем добавить избыточную доставку сообщений, чтобы не терять сообщения. No comment provided by engineer. - - It is not allowed to invite contacts with whom you have an incognito connection to a group where you use your main profile – otherwise they might find out your main profile. - Нельзя приглашать контакты, с которыми у вас установлено инкогнито соединение, в группу, где вы используете свой основной профиль — иначе они могут узнать ваш основной профиль. - 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 (%@). Возможно, вы уже соединились через эту ссылку. Если это не так, то это ошибка (%@). @@ -1113,11 +1108,6 @@ We will be adding server redundancy to prevent lost messages. Вступить No comment provided by engineer. - - Join anyway - Вступить - No comment provided by engineer. - Join group Вступить в группу @@ -1133,11 +1123,6 @@ We will be adding server redundancy to prevent lost messages. Вступление в группу No comment provided by engineer. - - Known main profile - Известный основной профиль - No comment provided by engineer. - Large file! Большой файл! @@ -1558,11 +1543,6 @@ We will be adding server redundancy to prevent lost messages. Отменить изменения No comment provided by engineer. - - Risks and limitations: - Риски и ограничения: - No comment provided by engineer. - Run chat Запустить chat @@ -1618,6 +1598,11 @@ We will be adding server redundancy to prevent lost messages. Поиск No comment provided by engineer. + + Send direct message + Отправить сообщение + No comment provided by engineer. + Send link previews Отправлять картинки ссылок @@ -1708,11 +1693,6 @@ We will be adding server redundancy to prevent lost messages. Пропущенные сообщения No comment provided by engineer. - - Some selected contacts have your main profile. If they use SimpleX app older than v3.2 or some other client, they may share your main profile instead of a random incognito profile with other members. - У некоторых выбранных контактов есть ваш основной профиль. Если они используют приложение SimpleX версии раньше чем 3.2 или другой клиент, они могут поделиться с другими участниками вашим основным профилем вместо случайного инкогнито профиля. - No comment provided by engineer. - Somebody Контакт @@ -1808,11 +1788,6 @@ We will be adding server redundancy to prevent lost messages. Подтвержденное соединение будет отменено! No comment provided by engineer. - - The contact who invited you has your main profile. If they use SimpleX app older than v3.2 or some other client, they may share your main profile instead of a random incognito profile with other members. - У контакта есть ваш основной профиль. Если он использует приложение SimpleX версии раньше чем 3.2 или другой клиент, он может поделиться с другими членами группы вашим основным профилем вместо случайного инкогнито профиля. - No comment provided by engineer. - The contact you shared this link with will NOT be able to connect! Контакт, которому вы отправили эту ссылку, не сможет соединиться! @@ -1853,11 +1828,6 @@ We will be adding server redundancy to prevent lost messages. Отправитель не будет уведомлён No comment provided by engineer. - - There is a risk to have your main profile shared, if you have contacts who know your main profile in an incognito group. Before you invite or join group with such contacts a warning will be shown. - Если в инкогнито группе есть члены, которые знают ваш основной профиль, существует риск его раскрытия. Перед тем, как вы пригласите ваши контакты или вступите в такую группу, будет показано предупреждение. - No comment provided by engineer. - This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost. Это действие нельзя отменить — ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны. @@ -2037,9 +2007,9 @@ To connect, please ask your contact to create another connection link and check Когда возможно No comment provided by engineer. - - When you join a group incognito, your new member profile is created and shared with all members. - Когда вы вступаете в группу инкогнито, создается новый случайный профиль, который отправляется другим членам группы. + + When you share an incognito profile with somebody, this profile will be used for the groups they invite you to. + Когда вы соединены с контактом инкогнито, тот же самый инкогнито профиль будет использоваться для групп с этим контактом. No comment provided by engineer. @@ -2137,11 +2107,6 @@ To connect, please ask your contact to create another connection link and check Вы отправили приглашение в группу No comment provided by engineer. - - You sent group invitation incognito - Вы отправили приглашение в группу инкогнито - No comment provided by engineer. - You will be connected when your connection request is accepted, please wait or check later! Соединение будет установлено, когда ваш запрос будет принят. Пожалуйста, подождите или проверьте позже! @@ -2162,16 +2127,16 @@ To connect, please ask your contact to create another connection link and check Вы перестанете получать сообщения от этой группы. История чата будет сохранена. No comment provided by engineer. - - You will use a random profile for this group - Вы будете использовать случайный профиль для этой группы - No comment provided by engineer. - You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile Вы пытаетесь пригласить инкогнито контакт в группу, где вы используете свой основной профиль No comment provided by engineer. + + You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed + Вы используете инкогнито профиль для этой группы - чтобы предотвратить раскрытие вашего основного профиля, приглашать контакты не разрешено + No comment provided by engineer. + Your SMP servers Ваши SMP серверы @@ -2182,11 +2147,6 @@ To connect, please ask your contact to create another connection link and check Ваш SimpleX адрес No comment provided by engineer. - - Your are incognito in a group when: - Вы инкогнито в группе, когда: - No comment provided by engineer. - Your calls Ваши звонки @@ -2209,7 +2169,7 @@ To connect, please ask your contact to create another connection link and check Your chat profile will be sent to group members - Ваш профиль чата будет отправлен участникам группы + Ваш профиль чата будет отправлен членам группы No comment provided by engineer. @@ -2244,11 +2204,6 @@ You can cancel this connection and remove the contact (and try later with a new Текущие данные вашего чата будет УДАЛЕНЫ и ЗАМЕНЕНЫ импортированными. No comment provided by engineer. - - Your main profile may be shared - Вашим основным профилем могут поделиться - No comment provided by engineer. - Your privacy Конфиденциальность @@ -2476,11 +2431,6 @@ SimpleX серверы не могут получить доступ к ваше профиль группы обновлен snd group event chat item - - incognito invitation to group %@ - инкогнито приглашение в группу %@ - group name - incognito via contact address link инкогнито через ссылку-контакт @@ -2521,10 +2471,10 @@ SimpleX серверы не могут получить доступ к ваше курсив No comment provided by engineer. - - known to you as %@ connected incognito - известный(ая) вам как %@ соединен(а) инкогнито - rcv group event chat item + + join as %@ + вступить как %@ + No comment provided by engineer. left @@ -2626,11 +2576,6 @@ SimpleX серверы не могут получить доступ к ваше зачеркнуть No comment provided by engineer. - - the group is created in Incognito mode, - группа создана в режиме Инкогнито, - No comment provided by engineer. - this contact этот контакт @@ -2691,26 +2636,11 @@ SimpleX серверы не могут получить доступ к ваше вы приглашены в группу No comment provided by engineer. - - you are invited to group incognito - вы приглашены в группу инкогнито - No comment provided by engineer. - - - you have an incognito connection with the member who invited you. - вы соединены инкогнито с членом группы, который вас пригласил. - No comment provided by engineer. - you left вы покинули группу snd group event chat item - - you or the member who invited you joined in Incognito mode, - вы или пригласивший вас член группы вступили в группу в режиме Инкогнито, - No comment provided by engineer. - you removed %@ вы удалили %@ diff --git a/apps/ios/SimpleXChat/APITypes.swift b/apps/ios/SimpleXChat/APITypes.swift index 060c55ccd0..2299bd899a 100644 --- a/apps/ios/SimpleXChat/APITypes.swift +++ b/apps/ios/SimpleXChat/APITypes.swift @@ -232,7 +232,7 @@ public enum ChatResponse: Decodable, Error { case userSMPServers(smpServers: [String]) case networkConfig(networkConfig: NetCfg) case contactInfo(contact: Contact, connectionStats: ConnectionStats, customUserProfile: Profile?) - case groupMemberInfo(groupInfo: GroupInfo, member: GroupMember, connectionStats_: ConnectionStats?, localMainProfile: LocalProfile?) + case groupMemberInfo(groupInfo: GroupInfo, member: GroupMember, connectionStats_: ConnectionStats?) case invitation(connReqInvitation: String) case sentConfirmation case sentInvitation @@ -416,7 +416,7 @@ public enum ChatResponse: Decodable, Error { case let .userSMPServers(smpServers): return String(describing: smpServers) case let .networkConfig(networkConfig): return String(describing: networkConfig) case let .contactInfo(contact, connectionStats, customUserProfile): return "contact: \(String(describing: contact))\nconnectionStats: \(String(describing: connectionStats))\ncustomUserProfile: \(String(describing: customUserProfile))" - case let .groupMemberInfo(groupInfo, member, connectionStats_, localMainProfile): return "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))\nconnectionStats_: \(String(describing: connectionStats_))\nlocalMainProfile: \(String(describing: localMainProfile))" + case let .groupMemberInfo(groupInfo, member, connectionStats_): return "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))\nconnectionStats_: \(String(describing: connectionStats_)))" case let .invitation(connReqInvitation): return connReqInvitation case .sentConfirmation: return noDetails case .sentInvitation: return noDetails diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index 72664dabd3..1808c0d5e7 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -1390,12 +1390,9 @@ public struct CIGroupInvitation: Decodable { public var localDisplayName: GroupName public var groupProfile: GroupProfile public var status: CIGroupInvitationStatus - public var invitedIncognito: Bool? var text: String { - (invitedIncognito ?? false) ? - String.localizedStringWithFormat(NSLocalizedString("incognito invitation to group %@", comment: "group name"), groupProfile.displayName) - : String.localizedStringWithFormat(NSLocalizedString("invitation to group %@", comment: "group name"), groupProfile.displayName) + String.localizedStringWithFormat(NSLocalizedString("invitation to group %@", comment: "group name"), groupProfile.displayName) } public static func getSample(groupId: Int64 = 1, groupMemberId: Int64 = 1, localDisplayName: GroupName = "team", groupProfile: GroupProfile = GroupProfile.sampleData, status: CIGroupInvitationStatus = .pending) -> CIGroupInvitation { @@ -1412,7 +1409,7 @@ public enum CIGroupInvitationStatus: String, Decodable { public enum RcvGroupEvent: Decodable { case memberAdded(groupMemberId: Int64, profile: Profile) - case memberConnected(contactMainProfile: Profile?) + case memberConnected case memberLeft case memberDeleted(groupMemberId: Int64, profile: Profile) case userDeleted @@ -1423,12 +1420,7 @@ public enum RcvGroupEvent: Decodable { switch self { case let .memberAdded(_, profile): return String.localizedStringWithFormat(NSLocalizedString("invited %@", comment: "rcv group event chat item"), profile.profileViewName) - case let .memberConnected(contactMainProfile): - if let contactMainProfile = contactMainProfile { - return String.localizedStringWithFormat(NSLocalizedString("known to you as %@ connected incognito", comment: "rcv group event chat item"), contactMainProfile.profileViewName) - } else { - return NSLocalizedString("member connected", comment: "rcv group event chat item") - } + case .memberConnected: return NSLocalizedString("member connected", comment: "rcv group event chat item") case .memberLeft: return NSLocalizedString("left", comment: "rcv group event chat item") case let .memberDeleted(_, profile): return String.localizedStringWithFormat(NSLocalizedString("removed %@", comment: "rcv group event chat item"), profile.profileViewName) diff --git a/apps/ios/ru.lproj/Localizable.strings b/apps/ios/ru.lproj/Localizable.strings index 23da2d5727..64a8b5b201 100644 --- a/apps/ios/ru.lproj/Localizable.strings +++ b/apps/ios/ru.lproj/Localizable.strings @@ -212,6 +212,9 @@ /* No comment provided by engineer. */ "Can't invite contact!" = "Нельзя пригласить контакт!"; +/* No comment provided by engineer. */ +"Can't invite contacts!" = "Нельзя пригласить контакты!"; + /* No comment provided by engineer. */ "Cancel" = "Отменить"; @@ -719,17 +722,14 @@ /* No comment provided by engineer. */ "Incognito" = "Инкогнито"; -/* No comment provided by engineer. */ -"Incognito groups" = "Инкогнито группы"; - -/* group name */ -"incognito invitation to group %@" = "инкогнито приглашение в группу %@"; - /* No comment provided by engineer. */ "Incognito mode" = "Режим Инкогнито"; /* No comment provided by engineer. */ -"Incognito mode protects the privacy of your main profile name and image — for each new contact and group a new random profile is created." = "Режим Инкогнито защищает конфиденциальность имени и изображения вашего основного профиля — для каждого нового контакта и группы создается новый случайный профиль."; +"Incognito mode is not supported here - your main profile will be sent to group members" = "Режим Инкогнито здесь не поддерживается - ваш основной профиль будет отправлен членам группы"; + +/* No comment provided by engineer. */ +"Incognito mode protects the privacy of your main profile name and image — for each new contact a new random profile is created." = "Режим Инкогнито защищает конфиденциальность имени и изображения вашего основного профиля — для каждого нового контакта создается новый случайный профиль."; /* chat list item description */ "incognito via contact address link" = "инкогнито через ссылку-контакт"; @@ -764,9 +764,6 @@ /* group name */ "invitation to group %@" = "приглашение в группу %@"; -/* No comment provided by engineer. */ -"Invite anyway" = "Пригласить"; - /* No comment provided by engineer. */ "Invite members" = "Пригласить членов группы"; @@ -788,9 +785,6 @@ /* No comment provided by engineer. */ "It can happen when:\n1. The messages expire on the server if they were not received for 30 days,\n2. The server you use to receive the messages from this contact was updated and restarted.\n3. The connection is compromised.\nPlease connect to the developers via Settings to receive the updates about the servers.\nWe will be adding server redundancy to prevent lost messages." = "Это может случится, когда:\n1. Сервер удалил сообщения, если они не были доставлены в течение 30 дней.\n2. Сервер, через который вы получаете сообщения от контакта, был обновлён и перезапущен.\n3. Соединение компроментировано.\nПожалуйста, соединитесь с девелоперами через Настройки, чтобы получать уведомления о серверах.\nМы планируем добавить избыточную доставку сообщений, чтобы не терять сообщения."; -/* No comment provided by engineer. */ -"It is not allowed to invite contacts with whom you have an incognito connection to a group where you use your main profile – otherwise they might find out your main profile." = "Нельзя приглашать контакты, с которыми у вас установлено инкогнито соединение, в группу, где вы используете свой основной профиль — иначе они могут узнать ваш основной профиль."; - /* 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 (%@)." = "Возможно, вы уже соединились через эту ссылку. Если это не так, то это ошибка (%@)."; @@ -804,7 +798,7 @@ "Join" = "Вступить"; /* No comment provided by engineer. */ -"Join anyway" = "Вступить"; +"join as %@" = "вступить как %@"; /* No comment provided by engineer. */ "Join group" = "Вступить в группу"; @@ -815,12 +809,6 @@ /* No comment provided by engineer. */ "Joining group" = "Вступление в группу"; -/* No comment provided by engineer. */ -"Known main profile" = "Известный основной профиль"; - -/* rcv group event chat item */ -"known to you as %@ connected incognito" = "известный(ая) вам как %@ соединен(а) инкогнито"; - /* No comment provided by engineer. */ "Large file!" = "Большой файл!"; @@ -1121,9 +1109,6 @@ /* No comment provided by engineer. */ "Revert" = "Отменить изменения"; -/* No comment provided by engineer. */ -"Risks and limitations:" = "Риски и ограничения:"; - /* No comment provided by engineer. */ "Run chat" = "Запустить chat"; @@ -1157,6 +1142,9 @@ /* No comment provided by engineer. */ "secret" = "секрет"; +/* No comment provided by engineer. */ +"Send direct message" = "Отправить сообщение"; + /* No comment provided by engineer. */ "Send link previews" = "Отправлять картинки ссылок"; @@ -1217,9 +1205,6 @@ /* No comment provided by engineer. */ "SMP servers (one per line)" = "SMP серверы (один на строке)"; -/* No comment provided by engineer. */ -"Some selected contacts have your main profile. If they use SimpleX app older than v3.2 or some other client, they may share your main profile instead of a random incognito profile with other members." = "У некоторых выбранных контактов есть ваш основной профиль. Если они используют приложение SimpleX версии раньше чем 3.2 или другой клиент, они могут поделиться с другими участниками вашим основным профилем вместо случайного инкогнито профиля."; - /* notification title */ "Somebody" = "Контакт"; @@ -1283,18 +1268,12 @@ /* No comment provided by engineer. */ "The connection you accepted will be cancelled!" = "Подтвержденное соединение будет отменено!"; -/* No comment provided by engineer. */ -"The contact who invited you has your main profile. If they use SimpleX app older than v3.2 or some other client, they may share your main profile instead of a random incognito profile with other members." = "У контакта есть ваш основной профиль. Если он использует приложение SimpleX версии раньше чем 3.2 или другой клиент, он может поделиться с другими членами группы вашим основным профилем вместо случайного инкогнито профиля."; - /* No comment provided by engineer. */ "The contact you shared this link with will NOT be able to connect!" = "Контакт, которому вы отправили эту ссылку, не сможет соединиться!"; /* No comment provided by engineer. */ "The created archive is available via app Settings / Database / Old database archive." = "Созданный архив доступен через Настройки приложения."; -/* No comment provided by engineer. */ -"the group is created in Incognito mode," = "группа создана в режиме Инкогнито,"; - /* No comment provided by engineer. */ "The group is fully decentralized – it is visible only to the members." = "Группа полностью децентрализована — она видна только членам."; @@ -1313,9 +1292,6 @@ /* No comment provided by engineer. */ "The sender will NOT be notified" = "Отправитель не будет уведомлён"; -/* No comment provided by engineer. */ -"There is a risk to have your main profile shared, if you have contacts who know your main profile in an incognito group. Before you invite or join group with such contacts a warning will be shown." = "Если в инкогнито группе есть члены, которые знают ваш основной профиль, существует риск его раскрытия. Перед тем, как вы пригласите ваши контакты или вступите в такую группу, будет показано предупреждение."; - /* No comment provided by engineer. */ "This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Это действие нельзя отменить — ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны."; @@ -1455,7 +1431,7 @@ "When available" = "Когда возможно"; /* No comment provided by engineer. */ -"When you join a group incognito, your new member profile is created and shared with all members." = "Когда вы вступаете в группу инкогнито, создается новый случайный профиль, который отправляется другим членам группы."; +"When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." = "Когда вы соединены с контактом инкогнито, тот же самый инкогнито профиль будет использоваться для групп с этим контактом."; /* No comment provided by engineer. */ "You" = "Вы"; @@ -1475,9 +1451,6 @@ /* No comment provided by engineer. */ "You are invited to group" = "Вы приглашены в группу"; -/* No comment provided by engineer. */ -"you are invited to group incognito" = "вы приглашены в группу инкогнито"; - /* No comment provided by engineer. */ "You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button." = "Вы также можете соединиться, открыв ссылку. Если ссылка откроется в браузере, нажмите кнопку **Open in mobile app**."; @@ -1502,9 +1475,6 @@ /* No comment provided by engineer. */ "You could not be verified; please try again." = "Верификация не удалась; пожалуйста, попробуйте ещё раз."; -/* No comment provided by engineer. */ -"you have an incognito connection with the member who invited you." = "вы соединены инкогнито с членом группы, который вас пригласил."; - /* No comment provided by engineer. */ "You invited your contact" = "Вы пригласили ваш контакт"; @@ -1520,9 +1490,6 @@ /* No comment provided by engineer. */ "You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." = "Вы должны всегда использовать самую новую версию данных чата, ТОЛЬКО на одном устройстве, инача вы можете перестать получать сообщения от каких то контактов."; -/* No comment provided by engineer. */ -"you or the member who invited you joined in Incognito mode," = "вы или пригласивший вас член группы вступили в группу в режиме Инкогнито,"; - /* No comment provided by engineer. */ "You rejected group invitation" = "Вы отклонили приглашение в группу"; @@ -1532,9 +1499,6 @@ /* No comment provided by engineer. */ "You sent group invitation" = "Вы отправили приглашение в группу"; -/* No comment provided by engineer. */ -"You sent group invitation incognito" = "Вы отправили приглашение в группу инкогнито"; - /* chat list item description */ "you shared one-time link" = "вы создали ссылку"; @@ -1553,9 +1517,6 @@ /* No comment provided by engineer. */ "You will stop receiving messages from this group. Chat history will be preserved." = "Вы перестанете получать сообщения от этой группы. История чата будет сохранена."; -/* No comment provided by engineer. */ -"You will use a random profile for this group" = "Вы будете использовать случайный профиль для этой группы"; - /* No comment provided by engineer. */ "you: " = "вы: "; @@ -1563,7 +1524,7 @@ "You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile" = "Вы пытаетесь пригласить инкогнито контакт в группу, где вы используете свой основной профиль"; /* No comment provided by engineer. */ -"Your are incognito in a group when:" = "Вы инкогнито в группе, когда:"; +"You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed" = "Вы используете инкогнито профиль для этой группы - чтобы предотвратить раскрытие вашего основного профиля, приглашать контакты не разрешено"; /* No comment provided by engineer. */ "Your calls" = "Ваши звонки"; @@ -1578,7 +1539,7 @@ "Your chat profile" = "Ваш профиль"; /* No comment provided by engineer. */ -"Your chat profile will be sent to group members" = "Ваш профиль чата будет отправлен участникам группы"; +"Your chat profile will be sent to group members" = "Ваш профиль чата будет отправлен членам группы"; /* No comment provided by engineer. */ "Your chat profile will be sent to your contact" = "Ваш профиль будет отправлен вашему контакту"; @@ -1598,9 +1559,6 @@ /* No comment provided by engineer. */ "Your current chat database will be DELETED and REPLACED with the imported one." = "Текущие данные вашего чата будет УДАЛЕНЫ и ЗАМЕНЕНЫ импортированными."; -/* No comment provided by engineer. */ -"Your main profile may be shared" = "Вашим основным профилем могут поделиться"; - /* No comment provided by engineer. */ "Your privacy" = "Конфиденциальность";