diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index d973ada34e..2e79c7b8ed 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -333,8 +333,7 @@ final class ChatModel: ObservableObject { [cItem] } if case .rcvNew = cItem.meta.itemStatus { - chats[i].chatStats.unreadCount = chats[i].chatStats.unreadCount + 1 - increaseUnreadCounter(user: currentUser!) + unreadCollector.changeUnreadCounter(cInfo.id, by: 1) } popChatCollector.addChat(cInfo.id) } else { @@ -414,8 +413,8 @@ final class ChatModel: ObservableObject { } func removeChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem) { - if cItem.isRcvNew, let chatIndex = getChatIndex(cInfo.id) { - decreaseUnreadCounter(chatIndex) + if cItem.isRcvNew { + unreadCollector.changeUnreadCounter(cInfo.id, by: -1) } // update previews if let chat = getChat(cInfo.id) { @@ -570,7 +569,7 @@ final class ChatModel: ObservableObject { // update current chat markChatItemRead_(itemIndex) // update preview - unreadCollector.decreaseUnreadCounter(cInfo.id) + unreadCollector.changeUnreadCounter(cInfo.id, by: -1) } } } @@ -590,17 +589,18 @@ final class ChatModel: ObservableObject { let m = ChatModel.shared for (chatId, count) in self.unreadCounts { if let i = m.getChatIndex(chatId) { - m.decreaseUnreadCounter(i, by: count) + m.changeUnreadCounter(i, by: count) } } self.unreadCounts = [:] } .store(in: &bag) } - - // Only call from main thread - func decreaseUnreadCounter(_ chatId: ChatId) { - unreadCounts[chatId] = (unreadCounts[chatId] ?? 0) + 1 + + func changeUnreadCounter(_ chatId: ChatId, by count: Int) { + DispatchQueue.main.async { + self.unreadCounts[chatId] = (self.unreadCounts[chatId] ?? 0) + count + } subject.send() } } @@ -646,25 +646,24 @@ final class ChatModel: ObservableObject { } } - func decreaseUnreadCounter(_ chatIndex: Int, by count: Int = 1) { - chats[chatIndex].chatStats.unreadCount = chats[chatIndex].chatStats.unreadCount - count - decreaseUnreadCounter(user: currentUser!, by: count) + func changeUnreadCounter(_ chatIndex: Int, by count: Int) { + chats[chatIndex].chatStats.unreadCount = chats[chatIndex].chatStats.unreadCount + count + changeUnreadCounter(user: currentUser!, by: count) } func increaseUnreadCounter(user: any UserLike) { changeUnreadCounter(user: user, by: 1) - NtfManager.shared.incNtfBadgeCount() } func decreaseUnreadCounter(user: any UserLike, by: Int = 1) { changeUnreadCounter(user: user, by: -by) - NtfManager.shared.decNtfBadgeCount(by: by) } private func changeUnreadCounter(user: any UserLike, by: Int) { if let i = users.firstIndex(where: { $0.user.userId == user.userId }) { users[i].unreadCount += by } + NtfManager.shared.changeNtfBadgeCount(by: by) } func totalUnreadCountForAllUsers() -> Int { diff --git a/apps/ios/Shared/Model/NtfManager.swift b/apps/ios/Shared/Model/NtfManager.swift index f1fdcc018e..bb938cd231 100644 --- a/apps/ios/Shared/Model/NtfManager.swift +++ b/apps/ios/Shared/Model/NtfManager.swift @@ -238,12 +238,8 @@ class NtfManager: NSObject, UNUserNotificationCenterDelegate, ObservableObject { ntfBadgeCountGroupDefault.set(count) } - func decNtfBadgeCount(by count: Int = 1) { - setNtfBadgeCount(max(0, UIApplication.shared.applicationIconBadgeNumber - count)) - } - - func incNtfBadgeCount(by count: Int = 1) { - setNtfBadgeCount(UIApplication.shared.applicationIconBadgeNumber + count) + func changeNtfBadgeCount(by count: Int = 1) { + setNtfBadgeCount(max(0, UIApplication.shared.applicationIconBadgeNumber + count)) } private func addNotification(_ content: UNMutableNotificationContent) { diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index e33df24e06..247e83c419 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -137,8 +137,8 @@ func apiGetActiveUser(ctrl: chat_ctrl? = nil) throws -> User? { } } -func apiCreateActiveUser(_ p: Profile?, sameServers: Bool = false, pastTimestamp: Bool = false, ctrl: chat_ctrl? = nil) throws -> User { - let r = chatSendCmdSync(.createActiveUser(profile: p, sameServers: sameServers, pastTimestamp: pastTimestamp), ctrl) +func apiCreateActiveUser(_ p: Profile?, pastTimestamp: Bool = false, ctrl: chat_ctrl? = nil) throws -> User { + let r = chatSendCmdSync(.createActiveUser(profile: p, pastTimestamp: pastTimestamp), ctrl) if case let .activeUser(user) = r { return user } throw r } @@ -340,7 +340,13 @@ func loadChat(chat: Chat, search: String = "") { m.chatItemStatuses = [:] im.reversedChatItems = [] let chat = try apiGetChat(type: cInfo.chatType, id: cInfo.apiId, search: search) - m.updateChatInfo(chat.chatInfo) + if case let .direct(contact) = chat.chatInfo, !cInfo.chatDeleted, chat.chatInfo.chatDeleted { + var updatedContact = contact + updatedContact.chatDeleted = false + m.updateContact(updatedContact) + } else { + m.updateChatInfo(chat.chatInfo) + } im.reversedChatItems = chat.chatItems.reversed() } catch let error { logger.error("loadChat error: \(responseError(error))") @@ -761,22 +767,38 @@ func apiConnectContactViaAddress(incognito: Bool, contactId: Int64) async -> (Co return (nil, alert) } -func apiDeleteChat(type: ChatType, id: Int64, notify: Bool? = nil) async throws { +func apiDeleteChat(type: ChatType, id: Int64, chatDeleteMode: ChatDeleteMode = .full(notify: true)) async throws { let chatId = type.rawValue + id.description DispatchQueue.main.async { ChatModel.shared.deletedChats.insert(chatId) } defer { DispatchQueue.main.async { ChatModel.shared.deletedChats.remove(chatId) } } - let r = await chatSendCmd(.apiDeleteChat(type: type, id: id, notify: notify), bgTask: false) + let r = await chatSendCmd(.apiDeleteChat(type: type, id: id, chatDeleteMode: chatDeleteMode), bgTask: false) if case .direct = type, case .contactDeleted = r { return } if case .contactConnection = type, case .contactConnectionDeleted = r { return } if case .group = type, case .groupDeletedUser = r { return } throw r } -func deleteChat(_ chat: Chat, notify: Bool? = nil) async { +func apiDeleteContact(id: Int64, chatDeleteMode: ChatDeleteMode = .full(notify: true)) async throws -> Contact { + let type: ChatType = .direct + let chatId = type.rawValue + id.description + if case .full = chatDeleteMode { + DispatchQueue.main.async { ChatModel.shared.deletedChats.insert(chatId) } + } + defer { + if case .full = chatDeleteMode { + DispatchQueue.main.async { ChatModel.shared.deletedChats.remove(chatId) } + } + } + let r = await chatSendCmd(.apiDeleteChat(type: type, id: id, chatDeleteMode: chatDeleteMode), bgTask: false) + if case let .contactDeleted(_, contact) = r { return contact } + throw r +} + +func deleteChat(_ chat: Chat, chatDeleteMode: ChatDeleteMode = .full(notify: true)) async { do { let cInfo = chat.chatInfo - try await apiDeleteChat(type: cInfo.chatType, id: cInfo.apiId, notify: notify) - DispatchQueue.main.async { ChatModel.shared.removeChat(cInfo.id) } + try await apiDeleteChat(type: cInfo.chatType, id: cInfo.apiId, chatDeleteMode: chatDeleteMode) + await MainActor.run { ChatModel.shared.removeChat(cInfo.id) } } catch let error { logger.error("deleteChat apiDeleteChat error: \(responseError(error))") AlertManager.shared.showAlertMsg( @@ -786,6 +808,39 @@ func deleteChat(_ chat: Chat, notify: Bool? = nil) async { } } +func deleteContactChat(_ chat: Chat, chatDeleteMode: ChatDeleteMode = .full(notify: true)) async -> Alert? { + do { + let cInfo = chat.chatInfo + let ct = try await apiDeleteContact(id: cInfo.apiId, chatDeleteMode: chatDeleteMode) + await MainActor.run { + switch chatDeleteMode { + case .full: + ChatModel.shared.removeChat(cInfo.id) + case .entity: + ChatModel.shared.removeChat(cInfo.id) + ChatModel.shared.addChat(Chat( + chatInfo: .direct(contact: ct), + chatItems: chat.chatItems + )) + case .messages: + ChatModel.shared.removeChat(cInfo.id) + ChatModel.shared.addChat(Chat( + chatInfo: .direct(contact: ct), + chatItems: [] + )) + } + } + } catch let error { + logger.error("deleteContactChat apiDeleteContact error: \(responseError(error))") + return mkAlert( + title: "Error deleting chat!", + message: "Error: \(responseError(error))" + ) + } + return nil +} + + func apiClearChat(type: ChatType, id: Int64) async throws -> ChatInfo { let r = await chatSendCmd(.apiClearChat(type: type, id: id), bgTask: false) if case let .chatCleared(_, updatedChatInfo) = r { return updatedChatInfo } @@ -1114,10 +1169,17 @@ func networkErrorAlert(_ r: ChatResponse) -> Alert? { func acceptContactRequest(incognito: Bool, contactRequest: UserContactRequest) async { if let contact = await apiAcceptContactRequest(incognito: incognito, contactReqId: contactRequest.apiId) { let chat = Chat(chatInfo: ChatInfo.direct(contact: contact), chatItems: []) - DispatchQueue.main.async { + await MainActor.run { ChatModel.shared.replaceChat(contactRequest.id, chat) ChatModel.shared.setContactNetworkStatus(contact, .connected) } + if contact.sndReady { + DispatchQueue.main.async { + dismissAllSheets(animated: true) { + ChatModel.shared.chatId = chat.id + } + } + } } } @@ -1713,6 +1775,11 @@ func processReceivedMsg(_ res: ChatResponse) async { let cItem = aChatItem.chatItem await MainActor.run { if active(user) { + if case let .direct(contact) = cInfo, contact.chatDeleted { + var updatedContact = contact + updatedContact.chatDeleted = false + m.updateContact(updatedContact) + } m.addChatItem(cInfo, cItem) } else if cItem.isRcvNew && cInfo.ntfsEnabled { m.increaseUnreadCounter(user: user) diff --git a/apps/ios/Shared/Views/Chat/ChatInfoView.swift b/apps/ios/Shared/Views/Chat/ChatInfoView.swift index 4d45db4700..0986b58d9c 100644 --- a/apps/ios/Shared/Views/Chat/ChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/ChatInfoView.swift @@ -94,17 +94,20 @@ struct ChatInfoView: View { @Environment(\.dismiss) var dismiss: DismissAction @ObservedObject var chat: Chat @State var contact: Contact - @Binding var connectionStats: ConnectionStats? - @Binding var customUserProfile: Profile? @State var localAlias: String - @Binding var connectionCode: String? + var onSearch: () -> Void + @State private var connectionStats: ConnectionStats? = nil + @State private var customUserProfile: Profile? = nil + @State private var connectionCode: String? = nil @FocusState private var aliasTextFieldFocused: Bool @State private var alert: ChatInfoViewAlert? = nil - @State private var showDeleteContactActionSheet = false + @State private var actionSheet: SomeActionSheet? = nil + @State private var sheet: SomeSheet? = nil + @State private var showConnectContactViaAddressDialog = false @State private var sendReceipts = SendReceipts.userDefault(true) @State private var sendReceiptsUserDefault = true @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false - + enum ChatInfoViewAlert: Identifiable { case clearChatAlert case networkStatusAlert @@ -112,6 +115,7 @@ struct ChatInfoView: View { case abortSwitchAddressAlert case syncConnectionForceAlert case queueInfo(info: String) + case someAlert(alert: SomeAlert) case error(title: LocalizedStringKey, error: LocalizedStringKey?) var id: String { @@ -122,11 +126,12 @@ struct ChatInfoView: View { case .abortSwitchAddressAlert: return "abortSwitchAddressAlert" case .syncConnectionForceAlert: return "syncConnectionForceAlert" case let .queueInfo(info): return "queueInfo \(info)" + case let .someAlert(alert): return "chatInfoSomeAlert \(alert.id)" case let .error(title, _): return "error \(title)" } } } - + var body: some View { NavigationView { List { @@ -136,12 +141,29 @@ struct ChatInfoView: View { .onTapGesture { aliasTextFieldFocused = false } - + Group { localAliasTextEdit() } .listRowBackground(Color.clear) .listRowSeparator(.hidden) + .padding(.bottom, 18) + + GeometryReader { g in + HStack(alignment: .center, spacing: 8) { + let buttonWidth = g.size.width / 4 + searchButton(width: buttonWidth) + AudioCallButton(chat: chat, contact: contact, width: buttonWidth) { alert = .someAlert(alert: $0) } + VideoButton(chat: chat, contact: contact, width: buttonWidth) { alert = .someAlert(alert: $0) } + muteButton(width: buttonWidth) + } + } + .padding(.trailing) + .frame(maxWidth: .infinity) + .frame(height: infoViewActionButtonHeight) + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 8)) if let customUserProfile = customUserProfile { Section(header: Text("Incognito").foregroundColor(theme.colors.secondary)) { @@ -153,7 +175,7 @@ struct ChatInfoView: View { } } } - + Section { Group { if let code = connectionCode { verifyCodeButton(code) } @@ -173,14 +195,18 @@ struct ChatInfoView: View { } label: { Label("Chat theme", systemImage: "photo") } + // } else if developerTools { + // synchronizeConnectionButtonForce() + // } } - + .disabled(!contact.ready || !contact.active) + if let conn = contact.activeConn { Section { infoRow(Text(String("E2E encryption")), conn.connPQEnabled ? "Quantum resistant" : "Standard") } } - + if let contactLink = contact.contactLink { Section { SimpleXLinkQRCode(uri: contactLink) @@ -197,7 +223,7 @@ struct ChatInfoView: View { .foregroundColor(theme.colors.secondary) } } - + if contact.ready && contact.active { Section(header: Text("Servers").foregroundColor(theme.colors.secondary)) { networkStatusRow() @@ -226,12 +252,12 @@ struct ChatInfoView: View { } } } - + Section { clearChatButton() deleteContactButton() } - + if developerTools { Section(header: Text("For console").foregroundColor(theme.colors.secondary)) { infoRow("Local name", chat.chatInfo.localDisplayName) @@ -260,6 +286,24 @@ struct ChatInfoView: View { sendReceiptsUserDefault = currentUser.sendRcptsContacts } sendReceipts = SendReceipts.fromBool(contact.chatSettings.sendRcpts, userDefault: sendReceiptsUserDefault) + + + Task { + do { + let (stats, profile) = try await apiContactInfo(chat.chatInfo.apiId) + let (ct, code) = try await apiGetContactCode(chat.chatInfo.apiId) + await MainActor.run { + connectionStats = stats + customUserProfile = profile + connectionCode = code + if contact.activeConn?.connectionCode != ct.activeConn?.connectionCode { + chat.chatInfo = .direct(contact: ct) + } + } + } catch let error { + logger.error("apiContactInfo or apiGetContactCode error: \(responseError(error))") + } + } } .alert(item: $alert) { alertItem in switch(alertItem) { @@ -269,37 +313,26 @@ struct ChatInfoView: View { case .abortSwitchAddressAlert: return abortSwitchAddressAlert(abortSwitchContactAddress) case .syncConnectionForceAlert: return syncConnectionForceAlert({ syncContactConnection(force: true) }) case let .queueInfo(info): return queueInfoAlert(info) + case let .someAlert(a): return a.alert case let .error(title, error): return mkAlert(title: title, message: error) } } - .actionSheet(isPresented: $showDeleteContactActionSheet) { - if contact.sndReady && contact.active { - return ActionSheet( - title: Text("Delete contact?\nThis cannot be undone!"), - buttons: [ - .destructive(Text("Delete and notify contact")) { deleteContact(notify: true) }, - .destructive(Text("Delete")) { deleteContact(notify: false) }, - .cancel() - ] - ) + .actionSheet(item: $actionSheet) { $0.actionSheet } + .sheet(item: $sheet) { + if #available(iOS 16.0, *) { + $0.content + .presentationDetents([.fraction(0.4)]) } else { - return ActionSheet( - title: Text("Delete contact?\nThis cannot be undone!"), - buttons: [ - .destructive(Text("Delete")) { deleteContact() }, - .cancel() - ] - ) + $0.content } } } - + private func contactInfoHeader() -> some View { - VStack { + VStack(spacing: 8) { let cInfo = chat.chatInfo ChatInfoImage(chat: chat, size: 192, color: Color(uiColor: .tertiarySystemFill)) - .padding(.top, 12) - .padding() + .padding(.vertical, 12) if contact.verified { ( Text(Image(systemName: "checkmark.shield")) @@ -328,7 +361,7 @@ struct ChatInfoView: View { } .frame(maxWidth: .infinity, alignment: .center) } - + private func localAliasTextEdit() -> some View { TextField("Set contact name…", text: $localAlias) .disableAutocorrection(true) @@ -345,7 +378,7 @@ struct ChatInfoView: View { .multilineTextAlignment(.center) .foregroundColor(theme.colors.secondary) } - + private func setContactAlias() { Task { do { @@ -360,6 +393,25 @@ struct ChatInfoView: View { } } + private func searchButton(width: CGFloat) -> some View { + InfoViewButton(image: "magnifyingglass", title: "search", width: width) { + dismiss() + onSearch() + } + .disabled(!contact.ready || chat.chatItems.isEmpty) + } + + private func muteButton(width: CGFloat) -> some View { + InfoViewButton( + image: chat.chatInfo.ntfsEnabled ? "speaker.slash.fill" : "speaker.wave.2.fill", + title: chat.chatInfo.ntfsEnabled ? "mute" : "unmute", + width: width + ) { + toggleNotifications(chat, enableNtfs: !chat.chatInfo.ntfsEnabled) + } + .disabled(!contact.ready || !contact.active) + } + private func verifyCodeButton(_ code: String) -> some View { NavigationLink { VerifyCodeView( @@ -389,7 +441,7 @@ struct ChatInfoView: View { ) } } - + private func contactPreferencesButton() -> some View { NavigationLink { ContactPreferencesView( @@ -404,7 +456,7 @@ struct ChatInfoView: View { Label("Contact preferences", systemImage: "switch.2") } } - + private func sendReceiptsOption() -> some View { Picker(selection: $sendReceipts) { ForEach([.yes, .no, .userDefault(sendReceiptsUserDefault)]) { (opt: SendReceipts) in @@ -418,13 +470,13 @@ struct ChatInfoView: View { setSendReceipts() } } - + private func setSendReceipts() { var chatSettings = chat.chatInfo.chatSettings ?? ChatSettings.defaults chatSettings.sendRcpts = sendReceipts.bool() updateChatSettings(chat, chatSettings: chatSettings) } - + private func synchronizeConnectionButton() -> some View { Button { syncContactConnection(force: false) @@ -433,7 +485,7 @@ struct ChatInfoView: View { .foregroundColor(.orange) } } - + private func synchronizeConnectionButtonForce() -> some View { Button { alert = .syncConnectionForceAlert @@ -442,7 +494,7 @@ struct ChatInfoView: View { .foregroundColor(.red) } } - + private func networkStatusRow() -> some View { HStack { Text("Network status") @@ -455,23 +507,30 @@ struct ChatInfoView: View { serverImage() } } - + private func serverImage() -> some View { let status = chatModel.contactNetworkStatus(contact) return Image(systemName: status.imageName) .foregroundColor(status == .connected ? .green : theme.colors.secondary) .font(.system(size: 12)) } - + private func deleteContactButton() -> some View { Button(role: .destructive) { - showDeleteContactActionSheet = true + deleteContactDialog( + chat, + contact, + dismissToChatList: true, + showAlert: { alert = .someAlert(alert: $0) }, + showActionSheet: { actionSheet = $0 }, + showSheetContent: { sheet = $0 } + ) } label: { - Label("Delete contact", systemImage: "trash") + Label("Delete contact", systemImage: "person.badge.minus") .foregroundColor(Color.red) } } - + private func clearChatButton() -> some View { Button() { alert = .clearChatAlert @@ -480,26 +539,7 @@ struct ChatInfoView: View { .foregroundColor(Color.orange) } } - - private func deleteContact(notify: Bool? = nil) { - Task { - do { - try await apiDeleteChat(type: chat.chatInfo.chatType, id: chat.chatInfo.apiId, notify: notify) - await MainActor.run { - dismiss() - chatModel.chatId = nil - chatModel.removeChat(chat.chatInfo.id) - } - } catch let error { - logger.error("deleteContactAlert apiDeleteChat error: \(responseError(error))") - let a = getErrorAlert(error, "Error deleting contact") - await MainActor.run { - alert = .error(title: a.title, error: a.message) - } - } - } - } - + private func clearChatAlert() -> Alert { Alert( title: Text("Clear conversation?"), @@ -513,14 +553,14 @@ struct ChatInfoView: View { secondaryButton: .cancel() ) } - + private func networkStatusAlert() -> Alert { Alert( title: Text("Network status"), message: Text(chatModel.contactNetworkStatus(contact).statusExplanation) ) } - + private func switchContactAddress() { Task { do { @@ -539,7 +579,7 @@ struct ChatInfoView: View { } } } - + private func abortSwitchContactAddress() { Task { do { @@ -557,7 +597,7 @@ struct ChatInfoView: View { } } } - + private func syncContactConnection(force: Bool) { Task { do { @@ -578,6 +618,153 @@ struct ChatInfoView: View { } } +struct AudioCallButton: View { + var chat: Chat + var contact: Contact + var width: CGFloat + var showAlert: (SomeAlert) -> Void + + var body: some View { + CallButton( + chat: chat, + contact: contact, + image: "phone.fill", + title: "call", + mediaType: .audio, + width: width, + showAlert: showAlert + ) + } +} + +struct VideoButton: View { + var chat: Chat + var contact: Contact + var width: CGFloat + var showAlert: (SomeAlert) -> Void + + var body: some View { + CallButton( + chat: chat, + contact: contact, + image: "video.fill", + title: "video", + mediaType: .video, + width: width, + showAlert: showAlert + ) + } +} + +private struct CallButton: View { + var chat: Chat + var contact: Contact + var image: String + var title: LocalizedStringKey + var mediaType: CallMediaType + var width: CGFloat + var showAlert: (SomeAlert) -> Void + + var body: some View { + let canCall = contact.ready && contact.active && chat.chatInfo.featureEnabled(.calls) && ChatModel.shared.activeCall == nil + + InfoViewButton(image: image, title: title, disabledLook: !canCall, width: width) { + if canCall { + CallController.shared.startCall(contact, mediaType) + } else if contact.nextSendGrpInv { + showAlert(SomeAlert( + alert: mkAlert( + title: "Can't call contact", + message: "Send message to enable calls." + ), + id: "can't call contact, send message" + )) + } else if !contact.active { + showAlert(SomeAlert( + alert: mkAlert( + title: "Can't call contact", + message: "Contact is deleted." + ), + id: "can't call contact, contact deleted" + )) + } else if !contact.ready { + showAlert(SomeAlert( + alert: mkAlert( + title: "Can't call contact", + message: "Connecting to contact, please wait or check later!" + ), + id: "can't call contact, contact not ready" + )) + } else if !chat.chatInfo.featureEnabled(.calls) { + switch chat.chatInfo.showEnableCallsAlert { + case .userEnable: + showAlert(SomeAlert( + alert: Alert( + title: Text("Allow calls?"), + message: Text("You need to allow your contact to call to be able to call them."), + primaryButton: .default(Text("Allow")) { + allowFeatureToContact(contact, .calls) + }, + secondaryButton: .cancel() + ), + id: "allow calls" + )) + case .askContact: + showAlert(SomeAlert( + alert: mkAlert( + title: "Calls prohibited!", + message: "Please ask your contact to enable calls." + ), + id: "calls prohibited, ask contact" + )) + case .other: + showAlert(SomeAlert( + alert: mkAlert( + title: "Calls prohibited!", + message: "Please check yours and your contact preferences." + ) + , id: "calls prohibited, other" + )) + } + } else { + showAlert(SomeAlert( + alert: mkAlert(title: "Can't call contact"), + id: "can't call contact" + )) + } + } + .disabled(ChatModel.shared.activeCall != nil) + } +} + +let infoViewActionButtonHeight: CGFloat = 60 + +struct InfoViewButton: View { + var image: String + var title: LocalizedStringKey + var disabledLook: Bool = false + var width: CGFloat + var action: () -> Void + + var body: some View { + VStack(spacing: 4) { + Image(systemName: image) + .resizable() + .scaledToFit() + .frame(width: 20, height: 20) + Text(title) + .font(.caption) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .foregroundColor(.accentColor) + .background(Color(.secondarySystemGroupedBackground)) + .cornerRadius(10.0) + .frame(width: width, height: infoViewActionButtonHeight) + .disabled(disabledLook) + .onTapGesture(perform: action) + } +} + struct ChatWallpaperEditorSheet: View { @Environment(\.dismiss) var dismiss @EnvironmentObject var theme: AppTheme @@ -763,15 +950,222 @@ func queueInfoAlert(_ info: String) -> Alert { ) } +func deleteContactDialog( + _ chat: Chat, + _ contact: Contact, + dismissToChatList: Bool, + showAlert: @escaping (SomeAlert) -> Void, + showActionSheet: @escaping (SomeActionSheet) -> Void, + showSheetContent: @escaping (SomeSheet) -> Void +) { + if contact.sndReady && contact.active && !contact.chatDeleted { + deleteContactOrConversationDialog(chat, contact, dismissToChatList, showAlert, showActionSheet, showSheetContent) + } else if contact.sndReady && contact.active && contact.chatDeleted { + deleteContactWithoutConversation(chat, contact, dismissToChatList, showAlert, showActionSheet) + } else { // !(contact.sndReady && contact.active) + deleteNotReadyContact(chat, contact, dismissToChatList, showAlert, showActionSheet) + } +} + +private func deleteContactOrConversationDialog( + _ chat: Chat, + _ contact: Contact, + _ dismissToChatList: Bool, + _ showAlert: @escaping (SomeAlert) -> Void, + _ showActionSheet: @escaping (SomeActionSheet) -> Void, + _ showSheetContent: @escaping (SomeSheet) -> Void +) { + showActionSheet(SomeActionSheet( + actionSheet: ActionSheet( + title: Text("Delete contact?"), + buttons: [ + .destructive(Text("Only delete conversation")) { + deleteContactMaybeErrorAlert(chat, contact, chatDeleteMode: .messages, dismissToChatList, showAlert) + }, + .destructive(Text("Delete contact")) { + showSheetContent(SomeSheet( + content: { AnyView( + DeleteActiveContactDialog( + chat: chat, + contact: contact, + dismissToChatList: dismissToChatList, + showAlert: showAlert + ) + ) }, + id: "DeleteActiveContactDialog" + )) + }, + .cancel() + ] + ), + id: "deleteContactOrConversationDialog" + )) +} + +private func deleteContactMaybeErrorAlert( + _ chat: Chat, + _ contact: Contact, + chatDeleteMode: ChatDeleteMode, + _ dismissToChatList: Bool, + _ showAlert: @escaping (SomeAlert) -> Void +) { + Task { + let alert_ = await deleteContactChat(chat, chatDeleteMode: chatDeleteMode) + if let alert = alert_ { + showAlert(SomeAlert(alert: alert, id: "deleteContactMaybeErrorAlert, error")) + } else { + if dismissToChatList { + await MainActor.run { + ChatModel.shared.chatId = nil + } + DispatchQueue.main.async { + dismissAllSheets(animated: true) { + if case .messages = chatDeleteMode, showDeleteConversationNoticeDefault.get() { + AlertManager.shared.showAlert(deleteConversationNotice(contact)) + } else if chatDeleteMode.isEntity, showDeleteContactNoticeDefault.get() { + AlertManager.shared.showAlert(deleteContactNotice(contact)) + } + } + } + } else { + if case .messages = chatDeleteMode, showDeleteConversationNoticeDefault.get() { + showAlert(SomeAlert(alert: deleteConversationNotice(contact), id: "deleteContactMaybeErrorAlert, deleteConversationNotice")) + } else if chatDeleteMode.isEntity, showDeleteContactNoticeDefault.get() { + showAlert(SomeAlert(alert: deleteContactNotice(contact), id: "deleteContactMaybeErrorAlert, deleteContactNotice")) + } + } + } + } +} + +private func deleteConversationNotice(_ contact: Contact) -> Alert { + return Alert( + title: Text("Conversation deleted!"), + message: Text("You can send messages to \(contact.displayName) from Archived contacts."), + primaryButton: .default(Text("Don't show again")) { + showDeleteConversationNoticeDefault.set(false) + }, + secondaryButton: .default(Text("Ok")) + ) +} + +private func deleteContactNotice(_ contact: Contact) -> Alert { + return Alert( + title: Text("Contact deleted!"), + message: Text("You can still view conversation with \(contact.displayName) in the list of chats."), + primaryButton: .default(Text("Don't show again")) { + showDeleteContactNoticeDefault.set(false) + }, + secondaryButton: .default(Text("Ok")) + ) +} + +enum ContactDeleteMode { + case full + case entity + + public func toChatDeleteMode(notify: Bool) -> ChatDeleteMode { + switch self { + case .full: .full(notify: notify) + case .entity: .entity(notify: notify) + } + } +} + +struct DeleteActiveContactDialog: View { + @Environment(\.dismiss) var dismiss + @EnvironmentObject var theme: AppTheme + var chat: Chat + var contact: Contact + var dismissToChatList: Bool + var showAlert: (SomeAlert) -> Void + @State private var keepConversation = false + + var body: some View { + NavigationView { + List { + Section { + Toggle("Keep conversation", isOn: $keepConversation) + + Button(role: .destructive) { + dismiss() + deleteContactMaybeErrorAlert(chat, contact, chatDeleteMode: contactDeleteMode.toChatDeleteMode(notify: false), dismissToChatList, showAlert) + } label: { + Text("Delete without notification") + } + + Button(role: .destructive) { + dismiss() + deleteContactMaybeErrorAlert(chat, contact, chatDeleteMode: contactDeleteMode.toChatDeleteMode(notify: true), dismissToChatList, showAlert) + } label: { + Text("Delete and notify contact") + } + } footer: { + Text("Contact will be deleted - this cannot be undone!") + .foregroundColor(theme.colors.secondary) + } + } + .modifier(ThemedBackground(grouped: true)) + } + } + + var contactDeleteMode: ContactDeleteMode { + keepConversation ? .entity : .full + } +} + +private func deleteContactWithoutConversation( + _ chat: Chat, + _ contact: Contact, + _ dismissToChatList: Bool, + _ showAlert: @escaping (SomeAlert) -> Void, + _ showActionSheet: @escaping (SomeActionSheet) -> Void +) { + showActionSheet(SomeActionSheet( + actionSheet: ActionSheet( + title: Text("Confirm contact deletion?"), + buttons: [ + .destructive(Text("Delete and notify contact")) { + deleteContactMaybeErrorAlert(chat, contact, chatDeleteMode: .full(notify: true), dismissToChatList, showAlert) + }, + .destructive(Text("Delete without notification")) { + deleteContactMaybeErrorAlert(chat, contact, chatDeleteMode: .full(notify: false), dismissToChatList, showAlert) + }, + .cancel() + ] + ), + id: "deleteContactWithoutConversation" + )) +} + +private func deleteNotReadyContact( + _ chat: Chat, + _ contact: Contact, + _ dismissToChatList: Bool, + _ showAlert: @escaping (SomeAlert) -> Void, + _ showActionSheet: @escaping (SomeActionSheet) -> Void +) { + showActionSheet(SomeActionSheet( + actionSheet: ActionSheet( + title: Text("Confirm contact deletion?"), + buttons: [ + .destructive(Text("Confirm")) { + deleteContactMaybeErrorAlert(chat, contact, chatDeleteMode: .full(notify: false), dismissToChatList, showAlert) + }, + .cancel() + ] + ), + id: "deleteNotReadyContact" + )) +} + struct ChatInfoView_Previews: PreviewProvider { static var previews: some View { ChatInfoView( chat: Chat(chatInfo: ChatInfo.sampleData.direct, chatItems: []), contact: Contact.sampleData, - connectionStats: Binding.constant(nil), - customUserProfile: Binding.constant(nil), localAlias: "", - connectionCode: Binding.constant(nil) + onSearch: {} ) } } diff --git a/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift b/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift index a46cf03bdf..dc917e7427 100644 --- a/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift @@ -440,7 +440,7 @@ struct ChatItemInfoView: View { private func memberDeliveryStatusView(_ member: GroupMember, _ status: GroupSndStatus, _ sentViaProxy: Bool?) -> some View { HStack{ - ProfileImage(imageStr: member.image, size: 30) + MemberProfileImage(member, size: 30) .padding(.trailing, 2) Text(member.chatViewName) .lineLimit(1) diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index aa033203dc..b047451991 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -179,32 +179,18 @@ struct ChatView: View { } else if case let .direct(contact) = cInfo { Button { Task { - do { - let (stats, profile) = try await apiContactInfo(chat.chatInfo.apiId) - let (ct, code) = try await apiGetContactCode(chat.chatInfo.apiId) - await MainActor.run { - connectionStats = stats - customUserProfile = profile - connectionCode = code - if contact.activeConn?.connectionCode != ct.activeConn?.connectionCode { - chat.chatInfo = .direct(contact: ct) - } - } - } catch let error { - logger.error("apiContactInfo or apiGetContactCode error: \(responseError(error))") - } - await MainActor.run { showChatInfoSheet = true } + showChatInfoSheet = true } } label: { ChatInfoToolbar(chat: chat) } - .appSheet(isPresented: $showChatInfoSheet, onDismiss: { - connectionStats = nil - customUserProfile = nil - connectionCode = nil - theme = buildTheme() - }) { - ChatInfoView(chat: chat, contact: contact, connectionStats: $connectionStats, customUserProfile: $customUserProfile, localAlias: chat.chatInfo.localAlias, connectionCode: $connectionCode) + .appSheet(isPresented: $showChatInfoSheet) { + ChatInfoView( + chat: chat, + contact: contact, + localAlias: chat.chatInfo.localAlias, + onSearch: { focusSearch() } + ) } } else if case let .group(groupInfo) = cInfo { Button { @@ -222,7 +208,8 @@ struct ChatView: View { chat.chatInfo = .group(groupInfo: gInfo) chat.created = Date.now } - ) + ), + onSearch: { focusSearch() } ) } } else if case .local = cInfo { @@ -376,7 +363,7 @@ struct ChatView: View { reversedChatItems .enumerated() .filter { (index, chatItem) in - if let mergeCategory = chatItem.mergeCategory, index > .zero { + if let mergeCategory = chatItem.mergeCategory, index > 0 { mergeCategory != reversedChatItems[index - 1].mergeCategory } else { true @@ -456,7 +443,7 @@ struct ChatView: View { init() { unreadChatItemCounts = UnreadChatItemCounts( isNearBottom: true, - unreadBelow: .zero + unreadBelow: 0 ) events .receive(on: DispatchQueue.global(qos: .background)) @@ -564,14 +551,18 @@ struct ChatView: View { private func searchButton() -> some View { Button { - searchMode = true - searchFocussed = true - searchText = "" + focusSearch() } label: { Label("Search", systemImage: "magnifyingglass") } } + private func focusSearch() { + searchMode = true + searchFocussed = true + searchText = "" + } + private func addMembersButton() -> some View { Button { if case let .group(gInfo) = chat.chatInfo { @@ -813,7 +804,7 @@ struct ChatView: View { .padding(.trailing, 12) } HStack(alignment: .top, spacing: 8) { - ProfileImage(imageStr: member.memberProfile.image, size: memberImageSize, backgroundColor: theme.colors.background) + MemberProfileImage(member, size: memberImageSize, backgroundColor: theme.colors.background) .onTapGesture { if m.membersLoaded { selectedMember = m.getGroupMember(member.groupMemberId) @@ -1098,7 +1089,7 @@ struct ChatView: View { } func reactions(from: Int? = nil, till: Int? = nil) -> some View { - ForEach(availableReactions[(from ?? .zero)..<(till ?? availableReactions.count)]) { reaction in + ForEach(availableReactions[(from ?? 0)..<(till ?? availableReactions.count)]) { reaction in Button(reaction.text) { setReaction(chatItem, add: true, reaction: reaction) } diff --git a/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift b/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift index dc867b026f..189ab95494 100644 --- a/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift +++ b/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift @@ -47,14 +47,13 @@ struct AddGroupMembersViewCommon: View { var body: some View { if creatingGroup { - NavigationView { - addGroupMembersView() - .toolbar { - ToolbarItem(placement: .navigationBarTrailing) { - Button ("Skip") { addedMembersCb(selectedContacts) } - } + addGroupMembersView() + .navigationBarBackButtonHidden() + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button ("Skip") { addedMembersCb(selectedContacts) } } - } + } } else { addGroupMembersView() } diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift index f89009f93f..50eb883e92 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift @@ -17,10 +17,12 @@ struct GroupChatInfoView: View { @Environment(\.dismiss) var dismiss: DismissAction @ObservedObject var chat: Chat @Binding var groupInfo: GroupInfo + var onSearch: () -> Void @State private var alert: GroupChatInfoViewAlert? = nil @State private var groupLink: String? @State private var groupLinkMemberRole: GroupMemberRole = .member - @State private var showAddMembersSheet: Bool = false + @State private var groupLinkNavLinkActive: Bool = false + @State private var addMembersNavLinkActive: Bool = false @State private var connectionStats: ConnectionStats? @State private var connectionCode: String? @State private var sendReceipts = SendReceipts.userDefault(true) @@ -68,6 +70,15 @@ struct GroupChatInfoView: View { List { groupInfoHeader() .listRowBackground(Color.clear) + .padding(.bottom, 18) + + infoActionButtons() + .padding(.horizontal) + .frame(maxWidth: .infinity) + .frame(height: infoViewActionButtonHeight) + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) Section { if groupInfo.canEdit { @@ -198,24 +209,95 @@ struct GroupChatInfoView: View { .frame(maxWidth: .infinity, alignment: .center) } + func infoActionButtons() -> some View { + GeometryReader { g in + let buttonWidth = g.size.width / 4 + HStack(alignment: .center, spacing: 8) { + searchButton(width: buttonWidth) + if groupInfo.canAddMembers { + addMembersActionButton(width: buttonWidth) + } + muteButton(width: buttonWidth) + } + .frame(maxWidth: .infinity, alignment: .center) + } + } + + private func searchButton(width: CGFloat) -> some View { + InfoViewButton(image: "magnifyingglass", title: "search", width: width) { + dismiss() + onSearch() + } + .disabled(!groupInfo.ready || chat.chatItems.isEmpty) + } + + @ViewBuilder private func addMembersActionButton(width: CGFloat) -> some View { + if chat.chatInfo.incognito { + ZStack { + InfoViewButton(image: "link.badge.plus", title: "invite", width: width) { + groupLinkNavLinkActive = true + } + + NavigationLink(isActive: $groupLinkNavLinkActive) { + groupLinkDestinationView() + } label: { + EmptyView() + } + .frame(width: 1, height: 1) + .hidden() + } + .disabled(!groupInfo.ready) + } else { + ZStack { + InfoViewButton(image: "person.fill.badge.plus", title: "invite", width: width) { + addMembersNavLinkActive = true + } + + NavigationLink(isActive: $addMembersNavLinkActive) { + addMembersDestinationView() + } label: { + EmptyView() + } + .frame(width: 1, height: 1) + .hidden() + } + .disabled(!groupInfo.ready) + } + } + + private func muteButton(width: CGFloat) -> some View { + InfoViewButton( + image: chat.chatInfo.ntfsEnabled ? "speaker.slash.fill" : "speaker.wave.2.fill", + title: chat.chatInfo.ntfsEnabled ? "mute" : "unmute", + width: width + ) { + toggleNotifications(chat, enableNtfs: !chat.chatInfo.ntfsEnabled) + } + .disabled(!groupInfo.ready) + } + private func addMembersButton() -> some View { NavigationLink { - AddGroupMembersView(chat: chat, groupInfo: groupInfo) - .onAppear { - searchFocussed = false - Task { - let groupMembers = await apiListMembers(groupInfo.groupId) - await MainActor.run { - chatModel.groupMembers = groupMembers.map { GMember.init($0) } - chatModel.populateGroupMembersIndexes() - } - } - } + addMembersDestinationView() } label: { Label("Invite members", systemImage: "plus") } } + private func addMembersDestinationView() -> some View { + AddGroupMembersView(chat: chat, groupInfo: groupInfo) + .onAppear { + searchFocussed = false + Task { + let groupMembers = await apiListMembers(groupInfo.groupId) + await MainActor.run { + chatModel.groupMembers = groupMembers.map { GMember.init($0) } + chatModel.populateGroupMembersIndexes() + } + } + } + } + private struct MemberRowView: View { var groupInfo: GroupInfo @ObservedObject var groupMember: GMember @@ -226,7 +308,7 @@ struct GroupChatInfoView: View { var body: some View { let member = groupMember.wrapped let v = HStack{ - ProfileImage(imageStr: member.image, size: 38) + MemberProfileImage(member, size: 38) .padding(.trailing, 2) // TODO server connection status VStack(alignment: .leading) { @@ -352,16 +434,7 @@ struct GroupChatInfoView: View { private func groupLinkButton() -> some View { NavigationLink { - GroupLinkView( - groupId: groupInfo.groupId, - groupLink: $groupLink, - groupLinkMemberRole: $groupLinkMemberRole, - showTitle: false, - creatingGroup: false - ) - .navigationBarTitle("Group link") - .modifier(ThemedBackground(grouped: true)) - .navigationBarTitleDisplayMode(.large) + groupLinkDestinationView() } label: { if groupLink == nil { Label("Create group link", systemImage: "link.badge.plus") @@ -371,6 +444,19 @@ struct GroupChatInfoView: View { } } + private func groupLinkDestinationView() -> some View { + GroupLinkView( + groupId: groupInfo.groupId, + groupLink: $groupLink, + groupLinkMemberRole: $groupLinkMemberRole, + showTitle: false, + creatingGroup: false + ) + .navigationBarTitle("Group link") + .modifier(ThemedBackground(grouped: true)) + .navigationBarTitleDisplayMode(.large) + } + private func editGroupButton() -> some View { NavigationLink { GroupProfileView( @@ -577,7 +663,8 @@ struct GroupChatInfoView_Previews: PreviewProvider { static var previews: some View { GroupChatInfoView( chat: Chat(chatInfo: ChatInfo.sampleData.group, chatItems: []), - groupInfo: Binding.constant(GroupInfo.sampleData) + groupInfo: Binding.constant(GroupInfo.sampleData), + onSearch: {} ) } } diff --git a/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift b/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift index 93a8be04f4..39288e2d52 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift @@ -34,14 +34,13 @@ struct GroupLinkView: View { var body: some View { if creatingGroup { - NavigationView { - groupLinkView() - .toolbar { - ToolbarItem(placement: .navigationBarTrailing) { - Button ("Continue") { linkCreatedCb?() } - } + groupLinkView() + .navigationBarBackButtonHidden() + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button ("Continue") { linkCreatedCb?() } } - } + } } else { groupLinkView() } diff --git a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift index 12b5bd5a98..c9f34a61c0 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift @@ -37,6 +37,7 @@ struct GroupMemberInfoView: View { case syncConnectionForceAlert case planAndConnectAlert(alert: PlanAndConnectAlert) case queueInfo(info: String) + case someAlert(alert: SomeAlert) case error(title: LocalizedStringKey, error: LocalizedStringKey?) var id: String { @@ -52,6 +53,7 @@ struct GroupMemberInfoView: View { case .syncConnectionForceAlert: return "syncConnectionForceAlert" case let .planAndConnectAlert(alert): return "planAndConnectAlert \(alert.id)" case let .queueInfo(info): return "queueInfo \(info)" + case let .someAlert(alert): return "someAlert \(alert.id)" case let .error(title, _): return "error \(title)" } } @@ -65,10 +67,11 @@ struct GroupMemberInfoView: View { } } - private func knownDirectChat(_ contactId: Int64) -> Chat? { + private func knownDirectChat(_ contactId: Int64) -> (Chat, Contact)? { if let chat = chatModel.getContactChat(contactId), - chat.chatInfo.contact?.directOrUsed == true { - return chat + let contact = chat.chatInfo.contact, + contact.directOrUsed == true { + return (chat, contact) } else { return nil } @@ -80,21 +83,22 @@ struct GroupMemberInfoView: View { List { groupMemberInfoHeader(member) .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .padding(.bottom, 18) + + infoActionButtons(member) + .padding(.horizontal) + .frame(maxWidth: .infinity) + .frame(height: infoViewActionButtonHeight) + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) if member.memberActive { Section { - if let contactId = member.memberContactId, let chat = knownDirectChat(contactId) { - knownDirectChatButton(chat) - } else if groupInfo.fullGroupPreferences.directMessages.on(for: groupInfo.membership) { - if let contactId = member.memberContactId { - newDirectChatButton(contactId) - } else if member.activeConn?.peerChatVRange.isCompatibleRange(CREATE_MEMBER_CONTACT_VRANGE) ?? false { - createMemberContactButton() - } - } if let code = connectionCode { verifyCodeButton(code) } if let connStats = connectionStats, - connStats.ratchetSyncAllowed { + connStats.ratchetSyncAllowed { synchronizeConnectionButton() } // } else if developerTools { @@ -237,6 +241,7 @@ struct GroupMemberInfoView: View { case .syncConnectionForceAlert: return syncConnectionForceAlert({ syncMemberConnection(force: true) }) case let .planAndConnectAlert(alert): return planAndConnectAlert(alert, dismiss: true) case let .queueInfo(info): return queueInfoAlert(info) + case let .someAlert(a): return a.alert case let .error(title, error): return mkAlert(title: title, message: error) } } @@ -249,6 +254,57 @@ struct GroupMemberInfoView: View { .modifier(ThemedBackground(grouped: true)) } + func infoActionButtons(_ member: GroupMember) -> some View { + GeometryReader { g in + let buttonWidth = g.size.width / 4 + HStack(alignment: .center, spacing: 8) { + if let contactId = member.memberContactId, let (chat, contact) = knownDirectChat(contactId) { + knownDirectChatButton(chat, width: buttonWidth) + AudioCallButton(chat: chat, contact: contact, width: buttonWidth) { alert = .someAlert(alert: $0) } + VideoButton(chat: chat, contact: contact, width: buttonWidth) { alert = .someAlert(alert: $0) } + } else if groupInfo.fullGroupPreferences.directMessages.on(for: groupInfo.membership) { + if let contactId = member.memberContactId { + newDirectChatButton(contactId, width: buttonWidth) + } else if member.activeConn?.peerChatVRange.isCompatibleRange(CREATE_MEMBER_CONTACT_VRANGE) ?? false { + createMemberContactButton(width: buttonWidth) + } + InfoViewButton(image: "phone.fill", title: "call", disabledLook: true, width: buttonWidth) { showSendMessageToEnableCallsAlert() + } + InfoViewButton(image: "video.fill", title: "video", disabledLook: true, width: buttonWidth) { showSendMessageToEnableCallsAlert() + } + } else { // no known contact chat && directMessages are off + InfoViewButton(image: "message.fill", title: "message", disabledLook: true, width: buttonWidth) { showDirectMessagesProhibitedAlert("Can't message member") + } + InfoViewButton(image: "phone.fill", title: "call", disabledLook: true, width: buttonWidth) { showDirectMessagesProhibitedAlert("Can't call member") + } + InfoViewButton(image: "video.fill", title: "video", disabledLook: true, width: buttonWidth) { showDirectMessagesProhibitedAlert("Can't call member") + } + } + } + .frame(maxWidth: .infinity, alignment: .center) + } + } + + func showSendMessageToEnableCallsAlert() { + alert = .someAlert(alert: SomeAlert( + alert: mkAlert( + title: "Can't call member", + message: "Send message to enable calls." + ), + id: "can't call member, send message" + )) + } + + func showDirectMessagesProhibitedAlert(_ title: LocalizedStringKey) { + alert = .someAlert(alert: SomeAlert( + alert: mkAlert( + title: title, + message: "Direct messages between members are prohibited in this group." + ), + id: "can't message member, direct messages prohibited" + )) + } + func connectViaAddressButton(_ contactLink: String) -> some View { Button { planAndConnect( @@ -263,19 +319,17 @@ struct GroupMemberInfoView: View { } } - func knownDirectChatButton(_ chat: Chat) -> some View { - Button { + func knownDirectChatButton(_ chat: Chat, width: CGFloat) -> some View { + InfoViewButton(image: "message.fill", title: "message", width: width) { dismissAllSheets(animated: true) DispatchQueue.main.async { chatModel.chatId = chat.id } - } label: { - Label("Send direct message", systemImage: "message") } } - func newDirectChatButton(_ contactId: Int64) -> some View { - Button { + func newDirectChatButton(_ contactId: Int64, width: CGFloat) -> some View { + InfoViewButton(image: "message.fill", title: "message", width: width) { do { let chat = try apiGetChat(type: .direct, id: contactId) chatModel.addChat(chat) @@ -286,13 +340,11 @@ struct GroupMemberInfoView: View { } catch let error { logger.error("openDirectChatButton apiGetChat error: \(responseError(error))") } - } label: { - Label("Send direct message", systemImage: "message") } } - func createMemberContactButton() -> some View { - Button { + func createMemberContactButton(width: CGFloat) -> some View { + InfoViewButton(image: "message.fill", title: "message", width: width) { progressIndicator = true Task { do { @@ -313,14 +365,12 @@ struct GroupMemberInfoView: View { } } } - } label: { - Label("Send direct message", systemImage: "message") } } private func groupMemberInfoHeader(_ mem: GroupMember) -> some View { VStack { - ProfileImage(imageStr: mem.image, size: 192, color: Color(uiColor: .tertiarySystemFill)) + MemberProfileImage(mem, size: 192, color: Color(uiColor: .tertiarySystemFill)) .padding(.top, 12) .padding() if mem.verified { @@ -582,6 +632,21 @@ struct GroupMemberInfoView: View { } } +func MemberProfileImage( + _ mem: GroupMember, + size: CGFloat, + color: Color = Color(uiColor: .tertiarySystemGroupedBackground), + backgroundColor: Color? = nil +) -> some View { + ProfileImage( + imageStr: mem.image, + size: size, + color: color, + backgroundColor: backgroundColor, + blurred: mem.blocked + ) +} + func blockMemberAlert(_ gInfo: GroupInfo, _ mem: GroupMember) -> Alert { Alert( title: Text("Block member?"), diff --git a/apps/ios/Shared/Views/Chat/ReverseList.swift b/apps/ios/Shared/Views/Chat/ReverseList.swift index a3f485cb5e..1f504fb5c1 100644 --- a/apps/ios/Shared/Views/Chat/ReverseList.swift +++ b/apps/ios/Shared/Views/Chat/ReverseList.swift @@ -33,7 +33,7 @@ struct ReverseList: UIV case let .item(id): controller.scroll(to: items.firstIndex(where: { $0.id == id }), position: .bottom) case .bottom: - controller.scroll(to: .zero, position: .top) + controller.scroll(to: 0, position: .top) } } else { controller.update(items: items) @@ -45,7 +45,7 @@ struct ReverseList: UIV private enum Section { case main } private let representer: ReverseList private var dataSource: UITableViewDiffableDataSource! - private var itemCount: Int = .zero + private var itemCount: Int = 0 private var bag = Set() init(representer: ReverseList) { @@ -80,7 +80,7 @@ struct ReverseList: UIV let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseId, for: indexPath) if #available(iOS 16.0, *) { cell.contentConfiguration = UIHostingConfiguration { self.representer.content(item) } - .margins(.all, .zero) + .margins(.all, 0) .minSize(height: 1) // Passing zero will result in system default of 44 points being used } else { if let cell = cell as? HostingCell { @@ -153,7 +153,7 @@ struct ReverseList: UIV animated = true } tableView.scrollToRow( - at: IndexPath(row: index, section: .zero), + at: IndexPath(row: index, section: 0), at: position, animated: animated ) @@ -168,7 +168,7 @@ struct ReverseList: UIV dataSource.defaultRowAnimation = .none dataSource.apply( snapshot, - animatingDifferences: itemCount != .zero && abs(items.count - itemCount) == 1 + animatingDifferences: itemCount != 0 && abs(items.count - itemCount) == 1 ) itemCount = items.count } diff --git a/apps/ios/Shared/Views/ChatList/ChatHelp.swift b/apps/ios/Shared/Views/ChatList/ChatHelp.swift index 2435c9a4f5..c84cdb0b97 100644 --- a/apps/ios/Shared/Views/ChatList/ChatHelp.swift +++ b/apps/ios/Shared/Views/ChatList/ChatHelp.swift @@ -11,7 +11,6 @@ import SwiftUI struct ChatHelp: View { @EnvironmentObject var chatModel: ChatModel @Binding var showSettings: Bool - @State private var newChatMenuOption: NewChatMenuOption? = nil var body: some View { ScrollView { chatHelp() } @@ -39,7 +38,7 @@ struct ChatHelp: View { HStack(spacing: 8) { Text("Tap button ") - NewChatMenuButton(newChatMenuOption: $newChatMenuOption) + NewChatMenuButton() Text("above, then choose:") } diff --git a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift index add364d9c9..0668d64441 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift @@ -49,7 +49,9 @@ struct ChatListNavLink: View { @State private var showJoinGroupDialog = false @State private var showContactConnectionInfo = false @State private var showInvalidJSON = false - @State private var showDeleteContactActionSheet = false + @State private var alert: SomeAlert? = nil + @State private var actionSheet: SomeActionSheet? = nil + @State private var sheet: SomeSheet? = nil @State private var showConnectContactViaAddressDialog = false @State private var inProgress = false @State private var progressByTimeout = false @@ -83,15 +85,22 @@ struct ChatListNavLink: View { } } } - + @ViewBuilder private func contactNavLink(_ contact: Contact) -> some View { Group { - if contact.activeConn == nil && contact.profile.contactLink != nil { + if contact.activeConn == nil && contact.profile.contactLink != nil && contact.active { ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) .frame(height: dynamicRowHeight) .swipeActions(edge: .trailing, allowsFullSwipe: true) { Button { - showDeleteContactActionSheet = true + deleteContactDialog( + chat, + contact, + dismissToChatList: false, + showAlert: { alert = $0 }, + showActionSheet: { actionSheet = $0 }, + showSheetContent: { sheet = $0 } + ) } label: { Label("Delete", systemImage: "trash") } @@ -118,11 +127,14 @@ struct ChatListNavLink: View { clearChatButton() } Button { - if contact.sndReady || !contact.active { - showDeleteContactActionSheet = true - } else { - AlertManager.shared.showAlert(deletePendingContactAlert(chat, contact)) - } + deleteContactDialog( + chat, + contact, + dismissToChatList: false, + showAlert: { alert = $0 }, + showActionSheet: { actionSheet = $0 }, + showSheetContent: { sheet = $0 } + ) } label: { Label("Delete", systemImage: "trash") } @@ -131,24 +143,14 @@ struct ChatListNavLink: View { .frame(height: dynamicRowHeight) } } - .actionSheet(isPresented: $showDeleteContactActionSheet) { - if contact.sndReady && contact.active { - return ActionSheet( - title: Text("Delete contact?\nThis cannot be undone!"), - buttons: [ - .destructive(Text("Delete and notify contact")) { Task { await deleteChat(chat, notify: true) } }, - .destructive(Text("Delete")) { Task { await deleteChat(chat, notify: false) } }, - .cancel() - ] - ) + .alert(item: $alert) { $0.alert } + .actionSheet(item: $actionSheet) { $0.actionSheet } + .sheet(item: $sheet) { + if #available(iOS 16.0, *) { + $0.content + .presentationDetents([.fraction(0.4)]) } else { - return ActionSheet( - title: Text("Delete contact?\nThis cannot be undone!"), - buttons: [ - .destructive(Text("Delete")) { Task { await deleteChat(chat) } }, - .cancel() - ] - ) + $0.content } } } @@ -430,28 +432,6 @@ struct ChatListNavLink: View { ) } - private func rejectContactRequestAlert(_ contactRequest: UserContactRequest) -> Alert { - Alert( - title: Text("Reject contact request"), - message: Text("The sender will NOT be notified"), - primaryButton: .destructive(Text("Reject")) { - Task { await rejectContactRequest(contactRequest) } - }, - secondaryButton: .cancel() - ) - } - - private func pendingContactAlert(_ chat: Chat, _ contact: Contact) -> Alert { - Alert( - title: Text("Contact is not connected yet!"), - message: Text("Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)."), - primaryButton: .cancel(), - secondaryButton: .destructive(Text("Delete Contact")) { - removePendingContact(chat, contact) - } - ) - } - private func groupInvitationAcceptedAlert() -> Alert { Alert( title: Text("Joining group"), @@ -459,30 +439,6 @@ struct ChatListNavLink: View { ) } - private func deletePendingContactAlert(_ chat: Chat, _ contact: Contact) -> Alert { - Alert( - title: Text("Delete pending connection"), - message: Text("Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)."), - primaryButton: .destructive(Text("Delete")) { - removePendingContact(chat, contact) - }, - secondaryButton: .cancel() - ) - } - - private func removePendingContact(_ chat: Chat, _ contact: Contact) { - Task { - do { - try await apiDeleteChat(type: chat.chatInfo.chatType, id: chat.chatInfo.apiId) - DispatchQueue.main.async { - chatModel.removeChat(contact.id) - } - } catch let error { - logger.error("ChatListNavLink.removePendingContact apiDeleteChat error: \(responseError(error))") - } - } - } - private func invalidJSONPreview(_ json: String) -> some View { Text("invalid chat data") .foregroundColor(.red) @@ -497,16 +453,28 @@ struct ChatListNavLink: View { private func connectContactViaAddress_(_ contact: Contact, _ incognito: Bool) { Task { - let ok = await connectContactViaAddress(contact.contactId, incognito) + let ok = await connectContactViaAddress(contact.contactId, incognito, showAlert: { AlertManager.shared.showAlert($0) }) if ok { await MainActor.run { chatModel.chatId = contact.id } + AlertManager.shared.showAlert(connReqSentAlert(.contact)) } } } } +func rejectContactRequestAlert(_ contactRequest: UserContactRequest) -> Alert { + Alert( + title: Text("Reject contact request"), + message: Text("The sender will NOT be notified"), + primaryButton: .destructive(Text("Reject")) { + Task { await rejectContactRequest(contactRequest) } + }, + secondaryButton: .cancel() + ) +} + func deleteContactConnectionAlert(_ contactConnection: PendingContactConnection, showError: @escaping (ErrorAlert) -> Void, success: @escaping () -> Void = {}) -> Alert { Alert( title: Text("Delete pending connection?"), @@ -533,15 +501,14 @@ func deleteContactConnectionAlert(_ contactConnection: PendingContactConnection, ) } -func connectContactViaAddress(_ contactId: Int64, _ incognito: Bool) async -> Bool { +func connectContactViaAddress(_ contactId: Int64, _ incognito: Bool, showAlert: (Alert) -> Void) async -> Bool { let (contact, alert) = await apiConnectContactViaAddress(incognito: incognito, contactId: contactId) if let alert = alert { - AlertManager.shared.showAlert(alert) + showAlert(alert) return false } else if let contact = contact { await MainActor.run { ChatModel.shared.updateContact(contact) - AlertManager.shared.showAlert(connReqSentAlert(.contact)) } return true } diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index dfaaf1f192..7f5a36adac 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -18,12 +18,12 @@ struct ChatListView: View { @State private var searchText = "" @State private var searchShowingSimplexLink = false @State private var searchChatFilteredBySimplexLink: String? = nil - @State private var newChatMenuOption: NewChatMenuOption? = nil @State private var userPickerVisible = false @State private var showConnectDesktop = false @AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false - + @AppStorage(DEFAULT_ONE_HAND_UI) private var oneHandUI = false + var body: some View { if #available(iOS 16.0, *) { viewBody.scrollDismissesKeyboard(.immediately) @@ -42,9 +42,6 @@ struct ChatListView: View { destination: chatView ) { VStack { - if chatModel.chats.isEmpty { - onboardingButtons() - } chatListView } } @@ -69,7 +66,9 @@ struct ChatListView: View { private var chatListView: some View { VStack { chatList + toolbar } + .scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center) .onDisappear() { withAnimation { userPickerVisible = false } } .refreshable { AlertManager.shared.showAlert(Alert( @@ -91,7 +90,10 @@ struct ChatListView: View { .background(theme.colors.background) .navigationBarTitleDisplayMode(.inline) .navigationBarHidden(searchMode) - .toolbar { + } + + @ViewBuilder private var toolbar: some View { + let t = VStack{}.toolbar { ToolbarItem(placement: .navigationBarLeading) { let user = chatModel.currentUser ?? User.sampleData ZStack(alignment: .topTrailing) { @@ -124,12 +126,20 @@ struct ChatListView: View { } ToolbarItem(placement: .navigationBarTrailing) { switch chatModel.chatRunning { - case .some(true): NewChatMenuButton(newChatMenuOption: $newChatMenuOption) + case .some(true): NewChatMenuButton() case .some(false): chatStoppedIcon() case .none: EmptyView() } } } + + if #unavailable(iOS 16) { + t + } else if oneHandUI { + t.toolbarBackground(.visible, for: .navigationBar) + } else { + t.toolbarBackground(.visible, for: .bottomBar) + } } @ViewBuilder private var chatList: some View { @@ -145,12 +155,14 @@ struct ChatListView: View { searchShowingSimplexLink: $searchShowingSimplexLink, searchChatFilteredBySimplexLink: $searchChatFilteredBySimplexLink ) + .scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center) .listRowSeparator(.hidden) .listRowBackground(Color.clear) .frame(maxWidth: .infinity) } ForEach(cs, id: \.viewId) { chat in ChatListNavLink(chat: chat) + .scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center) .padding(.trailing, -16) .disabled(chatModel.chatRunning != true || chatModel.deletedChats.contains(chat.chatInfo.id)) .listRowBackground(Color.clear) @@ -169,7 +181,9 @@ struct ChatListView: View { stopAudioPlayer() } if cs.isEmpty && !chatModel.chats.isEmpty { - Text("No filtered chats").foregroundColor(theme.colors.secondary) + Text("No filtered chats") + .scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center) + .foregroundColor(.secondary) } } } @@ -180,42 +194,6 @@ struct ChatListView: View { .foregroundColor(theme.colors.primary) } - 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(theme.colors.primary) - .frame(width: 20, height: 10) - .padding(.trailing, 12) - - connectButton("Tap to start a new chat") { - newChatMenuOption = .newContact - } - - Spacer() - Text("You have no chats") - .foregroundColor(theme.colors.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(theme.colors.primary) - .foregroundColor(.white) - .clipShape(RoundedRectangle(cornerRadius: 16)) - } - @ViewBuilder private func chatView() -> some View { if let chatId = chatModel.chatId, let chat = chatModel.getChat(chatId) { ChatView(chat: chat) @@ -233,16 +211,20 @@ struct ChatListView: View { } else { let s = searchString() return s == "" && !showUnreadAndFavorites - ? chatModel.chats + ? chatModel.chats.filter { chat in + !chat.chatInfo.chatDeleted && chatContactType(chat: chat) != ContactType.card + } : chatModel.chats.filter { chat in let cInfo = chat.chatInfo switch cInfo { case let .direct(contact): - return s == "" - ? filtered(chat) - : (viewNameContains(cInfo, s) || - contact.profile.displayName.localizedLowercase.contains(s) || - contact.fullName.localizedLowercase.contains(s)) + return !contact.chatDeleted && chatContactType(chat: chat) != ContactType.card && ( + s == "" + ? filtered(chat) + : (viewNameContains(cInfo, s) || + contact.profile.displayName.localizedLowercase.contains(s) || + contact.fullName.localizedLowercase.contains(s)) + ) case let .group(gInfo): return s == "" ? (filtered(chat) || gInfo.membership.memberStatus == .memInvited) @@ -300,8 +282,9 @@ struct SubsStatusIndicator: View { .onDisappear { stopTimer() } - .sheet(isPresented: $showServersSummary) { + .appSheet(isPresented: $showServersSummary) { ServersSummaryView() + .environment(\EnvironmentValues.refresh as! WritableKeyPath, nil) } } diff --git a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift index 6db89cd8d2..a6000e90f1 100644 --- a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift @@ -275,7 +275,7 @@ struct ChatPreviewView: View { } else { switch (chat.chatInfo) { case let .direct(contact): - if contact.activeConn == nil && contact.profile.contactLink != nil { + if contact.activeConn == nil && contact.profile.contactLink != nil && contact.active { chatPreviewInfoText("Tap to Connect") .foregroundColor(theme.colors.primary) } else if !contact.sndReady && contact.activeConn != nil { diff --git a/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift b/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift index 2e0dd9d9e4..477a78e36d 100644 --- a/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift +++ b/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift @@ -448,19 +448,23 @@ func subscriptionStatusColorAndPercentage(_ online: Bool, _ onionHosts: OnionHos let noConnColorAndPercent: (Color, Double, Double, Double) = (Color(uiColor: .tertiaryLabel), 1, 1, 0) let activeSubsRounded = roundedToQuarter(subs.shareOfActive) - return online && subs.total > 0 - ? ( - subs.ssActive == 0 - ? ( - hasSess ? (activeColor, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) : noConnColorAndPercent + return !online + ? noConnColorAndPercent + : ( + subs.total == 0 && !hasSess + ? (activeColor, 0, 0.33, 0) // On freshly installed app (without chats) and on app start + : ( + subs.ssActive == 0 + ? ( + hasSess ? (activeColor, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) : noConnColorAndPercent + ) + : ( // ssActive > 0 + hasSess + ? (activeColor, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) + : (.orange, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) // This would mean implementation error + ) ) - : ( // ssActive > 0 - hasSess - ? (activeColor, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) - : (.orange, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) // This would mean implementation error - ) ) - : noConnColorAndPercent } struct SMPServerSummaryView: View { diff --git a/apps/ios/Shared/Views/Contacts/ContactListNavLink.swift b/apps/ios/Shared/Views/Contacts/ContactListNavLink.swift new file mode 100644 index 0000000000..4079e1474a --- /dev/null +++ b/apps/ios/Shared/Views/Contacts/ContactListNavLink.swift @@ -0,0 +1,272 @@ +// +// ContactListNavLink.swift +// SimpleX (iOS) +// +// Created by Diogo Cunha on 01/08/2024. +// Copyright © 2024 SimpleX Chat. All rights reserved. +// + +import SwiftUI +import SimpleXChat + +struct ContactListNavLink: View { + @EnvironmentObject var theme: AppTheme + @ObservedObject var chat: Chat + var showDeletedChatIcon: Bool + @State private var alert: SomeAlert? = nil + @State private var actionSheet: SomeActionSheet? = nil + @State private var sheet: SomeSheet? = nil + @State private var showConnectContactViaAddressDialog = false + @State private var showContactRequestDialog = false + + var body: some View { + let contactType = chatContactType(chat: chat) + + Group { + switch (chat.chatInfo) { + case let .direct(contact): + switch contactType { + case .recent: + recentContactNavLink(contact) + case .chatDeleted: + deletedChatNavLink(contact) + case .card: + contactCardNavLink(contact) + default: + EmptyView() + } + case let .contactRequest(contactRequest): + contactRequestNavLink(contactRequest) + default: + EmptyView() + } + } + .alert(item: $alert) { $0.alert } + .actionSheet(item: $actionSheet) { $0.actionSheet } + .sheet(item: $sheet) { + if #available(iOS 16.0, *) { + $0.content + .presentationDetents([.fraction(0.4)]) + } else { + $0.content + } + } + } + + func recentContactNavLink(_ contact: Contact) -> some View { + Button { + dismissAllSheets(animated: true) { + ChatModel.shared.chatId = contact.id + } + } label: { + contactPreview(contact, titleColor: theme.colors.onBackground) + } + .swipeActions(edge: .trailing, allowsFullSwipe: true) { + Button { + deleteContactDialog( + chat, + contact, + dismissToChatList: false, + showAlert: { alert = $0 }, + showActionSheet: { actionSheet = $0 }, + showSheetContent: { sheet = $0 } + ) + } label: { + Label("Delete", systemImage: "trash") + } + .tint(.red) + } + } + + func deletedChatNavLink(_ contact: Contact) -> some View { + Button { + Task { + await MainActor.run { + var updatedContact = contact + updatedContact.chatDeleted = false + ChatModel.shared.updateContact(updatedContact) + dismissAllSheets(animated: true) { + ChatModel.shared.chatId = contact.id + } + } + } + } label: { + contactPreview(contact, titleColor: theme.colors.onBackground) + } + .swipeActions(edge: .trailing, allowsFullSwipe: true) { + Button { + deleteContactDialog( + chat, + contact, + dismissToChatList: false, + showAlert: { alert = $0 }, + showActionSheet: { actionSheet = $0 }, + showSheetContent: { sheet = $0 } + ) + } label: { + Label("Delete", systemImage: "trash") + } + .tint(.red) + } + } + + func contactPreview(_ contact: Contact, titleColor: Color) -> some View { + HStack{ + ProfileImage(imageStr: contact.image, size: 30) + + previewTitle(contact, titleColor: titleColor) + + Spacer() + + HStack { + if showDeletedChatIcon && contact.chatDeleted { + Image(systemName: "archivebox") + .resizable() + .scaledToFit() + .frame(width: 18, height: 18) + .foregroundColor(.secondary.opacity(0.65)) + } else if chat.chatInfo.chatSettings?.favorite ?? false { + Image(systemName: "star.fill") + .resizable() + .scaledToFill() + .frame(width: 18, height: 18) + .foregroundColor(.secondary.opacity(0.65)) + } + if contact.contactConnIncognito { + Image(systemName: "theatermasks") + .resizable() + .scaledToFit() + .frame(width: 22, height: 22) + .foregroundColor(.secondary) + } + } + } + } + + @ViewBuilder private func previewTitle(_ contact: Contact, titleColor: Color) -> some View { + let t = Text(chat.chatInfo.chatViewName).foregroundColor(titleColor) + ( + contact.verified == true + ? verifiedIcon + t + : t + ) + .lineLimit(1) + } + + private var verifiedIcon: Text { + (Text(Image(systemName: "checkmark.shield")) + Text(" ")) + .foregroundColor(.secondary) + .baselineOffset(1) + .kerning(-2) + } + + func contactCardNavLink(_ contact: Contact) -> some View { + Button { + showConnectContactViaAddressDialog = true + } label: { + contactCardPreview(contact) + } + .swipeActions(edge: .trailing, allowsFullSwipe: true) { + Button { + deleteContactDialog( + chat, + contact, + dismissToChatList: false, + showAlert: { alert = $0 }, + showActionSheet: { actionSheet = $0 }, + showSheetContent: { sheet = $0 } + ) + } label: { + Label("Delete", systemImage: "trash") + } + .tint(.red) + } + .confirmationDialog("Connect with \(contact.chatViewName)", isPresented: $showConnectContactViaAddressDialog, titleVisibility: .visible) { + Button("Use current profile") { connectContactViaAddress_(contact, false) } + Button("Use new incognito profile") { connectContactViaAddress_(contact, true) } + } + } + + private func connectContactViaAddress_(_ contact: Contact, _ incognito: Bool) { + Task { + let ok = await connectContactViaAddress(contact.contactId, incognito, showAlert: { alert = SomeAlert(alert: $0, id: "ContactListNavLink connectContactViaAddress") }) + if ok { + await MainActor.run { + ChatModel.shared.chatId = contact.id + } + DispatchQueue.main.async { + dismissAllSheets(animated: true) { + AlertManager.shared.showAlert(connReqSentAlert(.contact)) + } + } + } + } + } + + func contactCardPreview(_ contact: Contact) -> some View { + HStack{ + ProfileImage(imageStr: contact.image, size: 30) + + Text(chat.chatInfo.chatViewName) + .foregroundColor(.accentColor) + .lineLimit(1) + + Spacer() + + Image(systemName: "envelope") + .resizable() + .scaledToFill() + .frame(width: 14, height: 14) + .foregroundColor(.accentColor) + } + } + + func contactRequestNavLink(_ contactRequest: UserContactRequest) -> some View { + Button { + showContactRequestDialog = true + } label: { + contactRequestPreview(contactRequest) + } + .swipeActions(edge: .trailing, allowsFullSwipe: true) { + Button { + Task { await acceptContactRequest(incognito: false, contactRequest: contactRequest) } + } label: { Label("Accept", systemImage: "checkmark") } + .tint(theme.colors.primary) + Button { + Task { await acceptContactRequest(incognito: true, contactRequest: contactRequest) } + } label: { + Label("Accept incognito", systemImage: "theatermasks") + } + .tint(.indigo) + Button { + alert = SomeAlert(alert: rejectContactRequestAlert(contactRequest), id: "rejectContactRequestAlert") + } label: { + Label("Reject", systemImage: "multiply") + } + .tint(.red) + } + .confirmationDialog("Accept connection request?", isPresented: $showContactRequestDialog, titleVisibility: .visible) { + Button("Accept") { Task { await acceptContactRequest(incognito: false, contactRequest: contactRequest) } } + Button("Accept incognito") { Task { await acceptContactRequest(incognito: true, contactRequest: contactRequest) } } + Button("Reject (sender NOT notified)", role: .destructive) { Task { await rejectContactRequest(contactRequest) } } + } + } + + func contactRequestPreview(_ contactRequest: UserContactRequest) -> some View { + HStack{ + ProfileImage(imageStr: contactRequest.image, size: 30) + + Text(chat.chatInfo.chatViewName) + .foregroundColor(.accentColor) + .lineLimit(1) + + Spacer() + + Image(systemName: "checkmark") + .resizable() + .scaledToFill() + .frame(width: 14, height: 14) + .foregroundColor(.accentColor) + } + } +} diff --git a/apps/ios/Shared/Views/Helpers/ProfileImage.swift b/apps/ios/Shared/Views/Helpers/ProfileImage.swift index 4e6d63ffe0..248504c59b 100644 --- a/apps/ios/Shared/Views/Helpers/ProfileImage.swift +++ b/apps/ios/Shared/Views/Helpers/ProfileImage.swift @@ -16,11 +16,12 @@ struct ProfileImage: View { var size: CGFloat var color = Color(uiColor: .tertiarySystemGroupedBackground) var backgroundColor: Color? = nil + var blurred = false @AppStorage(DEFAULT_PROFILE_IMAGE_CORNER_RADIUS) private var radius = defaultProfileImageCorner var body: some View { if let uiImage = UIImage(base64Encoded: imageStr) { - clipProfileImage(Image(uiImage: uiImage), size: size, radius: radius) + clipProfileImage(Image(uiImage: uiImage), size: size, radius: radius, blurred: blurred) } else { let c = color.asAnotherColorFromSecondaryVariant(theme) Image(systemName: iconName) diff --git a/apps/ios/Shared/Views/Helpers/ViewModifiers.swift b/apps/ios/Shared/Views/Helpers/ViewModifiers.swift index fee0f262cb..c790b9cff2 100644 --- a/apps/ios/Shared/Views/Helpers/ViewModifiers.swift +++ b/apps/ios/Shared/Views/Helpers/ViewModifiers.swift @@ -9,8 +9,8 @@ import SwiftUI extension View { - @ViewBuilder func `if`(_ condition: @autoclosure () -> Bool, transform: (Self) -> Content) -> some View { - if condition() { + @ViewBuilder func `if`(_ condition: Bool, transform: (Self) -> Content) -> some View { + if condition { transform(self) } else { self diff --git a/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift b/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift index 5e6d44f686..6001dff790 100644 --- a/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift +++ b/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift @@ -30,7 +30,7 @@ struct AddContactLearnMore: View { } .listRowBackground(Color.clear) } - .modifier(ThemedBackground()) + .modifier(ThemedBackground(grouped: true)) } } diff --git a/apps/ios/Shared/Views/NewChat/AddGroupView.swift b/apps/ios/Shared/Views/NewChat/AddGroupView.swift index 42428dfb55..7e7944f984 100644 --- a/apps/ios/Shared/Views/NewChat/AddGroupView.swift +++ b/apps/ios/Shared/Views/NewChat/AddGroupView.swift @@ -35,24 +35,28 @@ struct AddGroupView: View { creatingGroup: true, showFooterCounter: false ) { _ in - dismiss() DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - m.chatId = groupInfo.id + dismissAllSheets(animated: true) { + m.chatId = groupInfo.id + } } } + .navigationBarTitleDisplayMode(.inline) } else { GroupLinkView( groupId: groupInfo.groupId, groupLink: $groupLink, groupLinkMemberRole: $groupLinkMemberRole, - showTitle: true, + showTitle: false, creatingGroup: true ) { - dismiss() DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - m.chatId = groupInfo.id + dismissAllSheets(animated: true) { + m.chatId = groupInfo.id + } } } + .navigationBarTitle("Group link") } } else { createGroupView().keyboardPadding() @@ -62,13 +66,6 @@ struct AddGroupView: View { func createGroupView() -> some View { List { Group { - Text("Create secret group") - .font(.largeTitle) - .bold() - .fixedSize(horizontal: false, vertical: true) - .padding(.bottom, 24) - .onTapGesture(perform: hideKeyboard) - ZStack(alignment: .center) { ZStack(alignment: .topTrailing) { ProfileImage(imageStr: profile.image, size: 128) @@ -204,13 +201,14 @@ struct AddGroupView: View { chat = c } } catch { - dismiss() - AlertManager.shared.showAlert( - Alert( - title: Text("Error creating group"), - message: Text(responseError(error)) + dismissAllSheets(animated: true) { + AlertManager.shared.showAlert( + Alert( + title: Text("Error creating group"), + message: Text(responseError(error)) + ) ) - ) + } } } diff --git a/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift b/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift index 3be1095bfd..ee447efdd9 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift @@ -7,53 +7,454 @@ // import SwiftUI +import SimpleXChat -enum NewChatMenuOption: Identifiable { - case newContact - case scanPaste - case newGroup - - var id: Self { self } +enum ContactType: Int { + case card, request, recent, chatDeleted, unlisted } struct NewChatMenuButton: View { - @Binding var newChatMenuOption: NewChatMenuOption? + @State private var showNewChatSheet = false + @State private var alert: SomeAlert? = nil + @State private var globalAlert: SomeAlert? = nil var body: some View { - Menu { Button { - newChatMenuOption = .newContact - } label: { - Text("Add contact") - } - Button { - newChatMenuOption = .scanPaste - } label: { - Text("Scan / Paste link") - } - Button { - newChatMenuOption = .newGroup - } label: { - Text("Create group") - } + showNewChatSheet = true } label: { Image(systemName: "square.and.pencil") .resizable() .scaledToFit() .frame(width: 24, height: 24) } - .sheet(item: $newChatMenuOption) { opt in - switch opt { - case .newContact: NewChatView(selection: .invite) - case .scanPaste: NewChatView(selection: .connect, showQRCodeScanner: true) - case .newGroup: AddGroupView() + .appSheet(isPresented: $showNewChatSheet) { + NewChatSheet(alert: $alert) + .environment(\EnvironmentValues.refresh as! WritableKeyPath, nil) + .alert(item: $alert) { a in + return a.alert + } + } + // This is a workaround to show "Keep unused invitation" alert in both following cases: + // - on going back from NewChatView to NewChatSheet, + // - on dismissing NewChatMenuButton sheet while on NewChatView (skipping NewChatSheet) + .onChange(of: alert?.id) { a in + if !showNewChatSheet && alert != nil { + globalAlert = alert + alert = nil } } + .alert(item: $globalAlert) { a in + return a.alert + } } } -#Preview { - NewChatMenuButton( - newChatMenuOption: Binding.constant(nil) - ) +private var indent: CGFloat = 36 + +struct NewChatSheet: View { + @EnvironmentObject var theme: AppTheme + @State private var baseContactTypes: [ContactType] = [.card, .request, .recent] + @EnvironmentObject var chatModel: ChatModel + @State private var searchMode = false + @FocusState var searchFocussed: Bool + @State private var searchText = "" + @State private var searchShowingSimplexLink = false + @State private var searchChatFilteredBySimplexLink: String? = nil + @Binding var alert: SomeAlert? + + var body: some View { + NavigationView { + viewBody() + .navigationTitle("New Chat") + .navigationBarTitleDisplayMode(.large) + .navigationBarHidden(searchMode) + .modifier(ThemedBackground(grouped: true)) + } + } + + @ViewBuilder private func viewBody() -> some View { + List { + HStack { + ContactsListSearchBar( + searchMode: $searchMode, + searchFocussed: $searchFocussed, + searchText: $searchText, + searchShowingSimplexLink: $searchShowingSimplexLink, + searchChatFilteredBySimplexLink: $searchChatFilteredBySimplexLink + ) + .frame(maxWidth: .infinity) + } + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + + if (searchText.isEmpty) { + Section { + NavigationLink { + NewChatView(selection: .invite, parentAlert: $alert) + .navigationTitle("New chat") + .modifier(ThemedBackground(grouped: true)) + .navigationBarTitleDisplayMode(.large) + } label: { + Label("Add contact", systemImage: "link.badge.plus") + } + NavigationLink { + NewChatView(selection: .connect, showQRCodeScanner: true, parentAlert: $alert) + .navigationTitle("New chat") + .modifier(ThemedBackground(grouped: true)) + .navigationBarTitleDisplayMode(.large) + } label: { + Label("Scan / Paste link", systemImage: "qrcode") + } + NavigationLink { + AddGroupView() + .navigationTitle("Create secret group") + .modifier(ThemedBackground(grouped: true)) + .navigationBarTitleDisplayMode(.large) + } label: { + Label("Create group", systemImage: "person.2") + } + } + + if (!filterContactTypes(chats: chatModel.chats, contactTypes: [.chatDeleted]).isEmpty) { + Section { + NavigationLink { + DeletedChats() + } label: { + newChatActionButton("archivebox", color: theme.colors.secondary) { Text("Archived contacts") } + } + } + } + } + + ContactsList( + baseContactTypes: $baseContactTypes, + searchMode: $searchMode, + searchText: $searchText, + header: "Your Contacts", + searchFocussed: $searchFocussed, + searchShowingSimplexLink: $searchShowingSimplexLink, + searchChatFilteredBySimplexLink: $searchChatFilteredBySimplexLink, + showDeletedChatIcon: true + ) + } + } + + func newChatActionButton(_ icon: String, color: Color/* = .secondary*/, content: @escaping () -> Content) -> some View { + ZStack(alignment: .leading) { + Image(systemName: icon).frame(maxWidth: 24, maxHeight: 24, alignment: .center) + .symbolRenderingMode(.monochrome) + .foregroundColor(color) + content().foregroundColor(theme.colors.onBackground).padding(.leading, indent) + } + } +} + +func chatContactType(chat: Chat) -> ContactType { + switch chat.chatInfo { + case .contactRequest: + return .request + case let .direct(contact): + if contact.activeConn == nil && contact.profile.contactLink != nil { + return .card + } else if contact.chatDeleted { + return .chatDeleted + } else if contact.contactStatus == .active { + return .recent + } else { + return .unlisted + } + default: + return .unlisted + } +} + +private func filterContactTypes(chats: [Chat], contactTypes: [ContactType]) -> [Chat] { + return chats.filter { chat in + contactTypes.contains(chatContactType(chat: chat)) + } +} + +struct ContactsList: View { + @EnvironmentObject var theme: AppTheme + @EnvironmentObject var chatModel: ChatModel + @Binding var baseContactTypes: [ContactType] + @Binding var searchMode: Bool + @Binding var searchText: String + var header: String? = nil + @FocusState.Binding var searchFocussed: Bool + @Binding var searchShowingSimplexLink: Bool + @Binding var searchChatFilteredBySimplexLink: String? + var showDeletedChatIcon: Bool + @AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false + + var body: some View { + let contactTypes = contactTypesSearchTargets(baseContactTypes: baseContactTypes, searchEmpty: searchText.isEmpty) + let contactChats = filterContactTypes(chats: chatModel.chats, contactTypes: contactTypes) + let filteredContactChats = filteredContactChats( + showUnreadAndFavorites: showUnreadAndFavorites, + searchShowingSimplexLink: searchShowingSimplexLink, + searchChatFilteredBySimplexLink: searchChatFilteredBySimplexLink, + searchText: searchText, + contactChats: contactChats + ) + + if !filteredContactChats.isEmpty { + Section(header: Group { + if let header = header { + Text(header) + .textCase(.uppercase) + .foregroundColor(theme.colors.secondary) + } + } + ) { + ForEach(filteredContactChats, id: \.viewId) { chat in + ContactListNavLink(chat: chat, showDeletedChatIcon: showDeletedChatIcon) + .disabled(chatModel.chatRunning != true) + } + } + } + + if filteredContactChats.isEmpty && !contactChats.isEmpty { + noResultSection(text: "No filtered contacts") + } else if contactChats.isEmpty { + noResultSection(text: "No contacts") + } + } + + @ViewBuilder private func noResultSection(text: String) -> some View { + Section { + Text(text) + .foregroundColor(theme.colors.secondary) + .frame(maxWidth: .infinity, alignment: .center) + + } + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) + .listRowInsets(EdgeInsets(top: 7, leading: 0, bottom: 7, trailing: 0)) + } + + private func contactTypesSearchTargets(baseContactTypes: [ContactType], searchEmpty: Bool) -> [ContactType] { + if baseContactTypes.contains(.chatDeleted) || searchEmpty { + return baseContactTypes + } else { + return baseContactTypes + [.chatDeleted] + } + } + + private func chatsByTypeComparator(chat1: Chat, chat2: Chat) -> Bool { + let chat1Type = chatContactType(chat: chat1) + let chat2Type = chatContactType(chat: chat2) + + if chat1Type.rawValue < chat2Type.rawValue { + return true + } else if chat1Type.rawValue > chat2Type.rawValue { + return false + } else { + return chat2.chatInfo.chatTs < chat1.chatInfo.chatTs + } + } + + private func filterChat(chat: Chat, searchText: String, showUnreadAndFavorites: Bool) -> Bool { + var meetsPredicate = true + let s = searchText.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() + let cInfo = chat.chatInfo + + if !searchText.isEmpty { + if (!cInfo.chatViewName.lowercased().contains(searchText.lowercased())) { + if case let .direct(contact) = cInfo { + meetsPredicate = contact.profile.displayName.lowercased().contains(s) || contact.fullName.lowercased().contains(s) + } else { + meetsPredicate = false + } + } + } + + if showUnreadAndFavorites { + meetsPredicate = meetsPredicate && (cInfo.chatSettings?.favorite ?? false) + } + + return meetsPredicate + } + + func filteredContactChats( + showUnreadAndFavorites: Bool, + searchShowingSimplexLink: Bool, + searchChatFilteredBySimplexLink: String?, + searchText: String, + contactChats: [Chat] + ) -> [Chat] { + let linkChatId = searchChatFilteredBySimplexLink + let s = searchShowingSimplexLink ? "" : searchText.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() + + let filteredChats: [Chat] + + if let linkChatId = linkChatId { + filteredChats = contactChats.filter { $0.id == linkChatId } + } else { + filteredChats = contactChats.filter { chat in + filterChat(chat: chat, searchText: s, showUnreadAndFavorites: showUnreadAndFavorites) + } + } + + return filteredChats.sorted(by: chatsByTypeComparator) + } +} + +struct ContactsListSearchBar: View { + @EnvironmentObject var m: ChatModel + @EnvironmentObject var theme: AppTheme + @Binding var searchMode: Bool + @FocusState.Binding var searchFocussed: Bool + @Binding var searchText: String + @Binding var searchShowingSimplexLink: Bool + @Binding var searchChatFilteredBySimplexLink: String? + @State private var ignoreSearchTextChange = false + @State private var alert: PlanAndConnectAlert? + @State private var sheet: PlanAndConnectActionSheet? + @AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false + + var body: some View { + HStack(spacing: 12) { + HStack(spacing: 4) { + Spacer() + .frame(width: 8) + Image(systemName: "magnifyingglass") + .resizable() + .scaledToFit() + .frame(width: 16, height: 16) + TextField("Search or paste SimpleX link", text: $searchText) + .foregroundColor(searchShowingSimplexLink ? theme.colors.secondary : theme.colors.onBackground) + .disabled(searchShowingSimplexLink) + .focused($searchFocussed) + .frame(maxWidth: .infinity) + if !searchText.isEmpty { + Image(systemName: "xmark.circle.fill") + .resizable() + .scaledToFit() + .frame(width: 16, height: 16) + .onTapGesture { + searchText = "" + } + } + } + .padding(EdgeInsets(top: 7, leading: 7, bottom: 7, trailing: 7)) + .foregroundColor(theme.colors.secondary) + .background(theme.colors.isLight ? theme.colors.background : theme.colors.secondaryVariant) + .cornerRadius(10.0) + + if searchFocussed { + Text("Cancel") + .foregroundColor(theme.colors.primary) + .onTapGesture { + searchText = "" + searchFocussed = false + } + } else if m.chats.count > 0 { + toggleFilterButton() + } + } + .onChange(of: searchFocussed) { sf in + withAnimation { searchMode = sf } + } + .onChange(of: searchText) { t in + if ignoreSearchTextChange { + ignoreSearchTextChange = false + } else { + if let link = strHasSingleSimplexLink(t.trimmingCharacters(in: .whitespaces)) { // if SimpleX link is pasted, show connection dialogue + searchFocussed = false + if case let .simplexLink(linkType, _, smpHosts) = link.format { + ignoreSearchTextChange = true + searchText = simplexLinkText(linkType, smpHosts) + } + searchShowingSimplexLink = true + searchChatFilteredBySimplexLink = nil + connect(link.text) + } else { + if t != "" { // if some other text is pasted, enter search mode + searchFocussed = true + } + searchShowingSimplexLink = false + searchChatFilteredBySimplexLink = nil + } + } + } + .alert(item: $alert) { a in + planAndConnectAlert(a, dismiss: true, cleanup: { searchText = "" }) + } + .actionSheet(item: $sheet) { s in + planAndConnectActionSheet(s, dismiss: true, cleanup: { searchText = "" }) + } + } + + private func toggleFilterButton() -> some View { + ZStack { + Color.clear + .frame(width: 22, height: 22) + Image(systemName: showUnreadAndFavorites ? "line.3.horizontal.decrease.circle.fill" : "line.3.horizontal.decrease") + .resizable() + .scaledToFit() + .foregroundColor(showUnreadAndFavorites ? theme.colors.primary : theme.colors.secondary) + .frame(width: showUnreadAndFavorites ? 22 : 16, height: showUnreadAndFavorites ? 22 : 16) + .onTapGesture { + showUnreadAndFavorites = !showUnreadAndFavorites + } + } + } + + private func connect(_ link: String) { + planAndConnect( + link, + showAlert: { alert = $0 }, + showActionSheet: { sheet = $0 }, + dismiss: true, + incognito: nil, + filterKnownContact: { searchChatFilteredBySimplexLink = $0.id } + ) + } +} + + +struct DeletedChats: View { + @State private var baseContactTypes: [ContactType] = [.chatDeleted] + @State private var searchMode = false + @FocusState var searchFocussed: Bool + @State private var searchText = "" + @State private var searchShowingSimplexLink = false + @State private var searchChatFilteredBySimplexLink: String? = nil + + var body: some View { + List { + ContactsListSearchBar( + searchMode: $searchMode, + searchFocussed: $searchFocussed, + searchText: $searchText, + searchShowingSimplexLink: $searchShowingSimplexLink, + searchChatFilteredBySimplexLink: $searchChatFilteredBySimplexLink + ) + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + .frame(maxWidth: .infinity) + + ContactsList( + baseContactTypes: $baseContactTypes, + searchMode: $searchMode, + searchText: $searchText, + searchFocussed: $searchFocussed, + searchShowingSimplexLink: $searchShowingSimplexLink, + searchChatFilteredBySimplexLink: $searchChatFilteredBySimplexLink, + showDeletedChatIcon: false + ) + } + .navigationTitle("Deleted chats") + .navigationBarTitleDisplayMode(.inline) + .navigationBarHidden(searchMode) + .modifier(ThemedBackground(grouped: true)) + + } +} + +#Preview { + NewChatMenuButton() } diff --git a/apps/ios/Shared/Views/NewChat/NewChatView.swift b/apps/ios/Shared/Views/NewChat/NewChatView.swift index df50bf9df2..cfe3dbb654 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatView.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatView.swift @@ -17,10 +17,19 @@ struct SomeAlert: Identifiable { var id: String } +struct SomeActionSheet: Identifiable { + var actionSheet: ActionSheet + var id: String +} + +struct SomeSheet: Identifiable { + @ViewBuilder var content: Content + var id: String +} + private enum NewChatViewAlert: Identifiable { case planAndConnectAlert(alert: PlanAndConnectAlert) case newChatSomeAlert(alert: SomeAlert) - var id: String { switch self { case let .planAndConnectAlert(alert): return "planAndConnectAlert \(alert.id)" @@ -47,22 +56,10 @@ struct NewChatView: View { @State private var creatingConnReq = false @State private var pastedLink: String = "" @State private var alert: NewChatViewAlert? + @Binding var parentAlert: SomeAlert? var body: some View { VStack(alignment: .leading) { - HStack { - Text("New chat") - .font(.largeTitle) - .bold() - .fixedSize(horizontal: false, vertical: true) - Spacer() - InfoSheetButton { - AddContactLearnMore(showTitle: true) - } - } - .padding() - .padding(.top) - Picker("New chat", selection: $selection) { Label("Add contact", systemImage: "link") .tag(NewChatOption.invite) @@ -88,6 +85,7 @@ struct NewChatView: View { } } .frame(maxWidth: .infinity, maxHeight: .infinity) + .modifier(ThemedBackground(grouped: true)) .background( // Rectangle is needed for swipe gesture to work on mostly empty views (creatingLinkProgressView and retryButton) Rectangle() @@ -110,6 +108,13 @@ struct NewChatView: View { } ) } + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + InfoSheetButton { + AddContactLearnMore(showTitle: true) + } + } + } .modifier(ThemedBackground(grouped: true)) .onChange(of: invitationUsed) { used in if used && !(m.showingInvitation?.connChatUsed ?? true) { @@ -119,19 +124,22 @@ struct NewChatView: View { .onDisappear { if !(m.showingInvitation?.connChatUsed ?? true), let conn = contactConnection { - AlertManager.shared.showAlert(Alert( - title: Text("Keep unused invitation?"), - message: Text("You can view invitation link again in connection details."), - primaryButton: .default(Text("Keep")) {}, - secondaryButton: .destructive(Text("Delete")) { - Task { - await deleteChat(Chat( - chatInfo: .contactConnection(contactConnection: conn), - chatItems: [] - )) + parentAlert = SomeAlert( + alert: Alert( + title: Text("Keep unused invitation?"), + message: Text("You can view invitation link again in connection details."), + primaryButton: .default(Text("Keep")) {}, + secondaryButton: .destructive(Text("Delete")) { + Task { + await deleteChat(Chat( + chatInfo: .contactConnection(contactConnection: conn), + chatItems: [] + )) + } } - } - )) + ), + id: "keepUnusedInvitation" + ) } m.showingInvitation = nil } @@ -837,7 +845,10 @@ private func connectContactViaAddress_(_ contact: Contact, dismiss: Bool, incogn dismissAllSheets(animated: true) } } - _ = await connectContactViaAddress(contact.contactId, incognito) + let ok = await connectContactViaAddress(contact.contactId, incognito, showAlert: { AlertManager.shared.showAlert($0) }) + if ok { + AlertManager.shared.showAlert(connReqSentAlert(.contact)) + } cleanup?() } } @@ -961,8 +972,13 @@ func connReqSentAlert(_ type: ConnReqType) -> Alert { ) } -#Preview { - NewChatView( - selection: .invite - ) +struct NewChatView_Previews: PreviewProvider { + static var previews: some View { + @State var parentAlert: SomeAlert? + + NewChatView( + selection: .invite, + parentAlert: $parentAlert + ) + } } diff --git a/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift b/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift index 74390c97e1..47ac706e15 100644 --- a/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift +++ b/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift @@ -428,6 +428,42 @@ private let versionDescriptions: [VersionDescription] = [ ) ] ), + VersionDescription( + version: "v6.0", + post: URL(string: "https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html"), + features: [ + FeatureDescription( + icon: "arrow.forward", + title: "Private message routing 🚀", + description: "It protects your IP address and connections." + ), + FeatureDescription( + icon: "person.text.rectangle", + title: "Your contacts your way", + description: "- Search contacts when starting chat.\n- Archive contacts to chat later." + ), + FeatureDescription( + icon: "platter.filled.bottom.iphone", + title: "Reachable chat toolbar 👋", + description: "Use the app with one hand." + ), + FeatureDescription( + icon: "link", + title: "Connect to your friends faster", + description: "Even when they are offline." + ), + FeatureDescription( + icon: "trash", + title: "Moderate like a pro ✋", + description: "Delete up to 20 messages at once." + ), + FeatureDescription( + icon: "network", + title: "Control your network", + description: "Connection and servers status." + ) + ] + ), ] private let lastVersion = versionDescriptions.last!.version diff --git a/apps/ios/Shared/Views/UserSettings/AdvancedNetworkSettings.swift b/apps/ios/Shared/Views/UserSettings/AdvancedNetworkSettings.swift index 6dda7bf799..99c0a588eb 100644 --- a/apps/ios/Shared/Views/UserSettings/AdvancedNetworkSettings.swift +++ b/apps/ios/Shared/Views/UserSettings/AdvancedNetworkSettings.swift @@ -24,34 +24,114 @@ enum NetworkSettingsAlert: Identifiable { } struct AdvancedNetworkSettings: View { + @Environment(\.dismiss) var dismiss: DismissAction @EnvironmentObject var theme: AppTheme + @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false + @AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false @State private var netCfg = NetCfg.defaults @State private var currentNetCfg = NetCfg.defaults @State private var cfgLoaded = false @State private var enableKeepAlive = true @State private var keepAliveOpts = KeepAliveOpts.defaults @State private var showSettingsAlert: NetworkSettingsAlert? + @State private var onionHosts: OnionHosts = .no + @State private var showSaveDialog = false var body: some View { VStack { List { Section { - Button { - updateNetCfgView(NetCfg.defaults) - showSettingsAlert = .update + NavigationLink { + List { + Section { + SelectionListView(list: SMPProxyMode.values, selection: $netCfg.smpProxyMode) { mode in + netCfg.smpProxyMode = mode + } + } footer: { + Text(proxyModeInfo(netCfg.smpProxyMode)) + .font(.callout) + .foregroundColor(theme.colors.secondary) + } + } + .navigationTitle("Private routing") + .modifier(ThemedBackground(grouped: true)) + .navigationBarTitleDisplayMode(.inline) } label: { - Text("Reset to defaults") + HStack { + Text("Private routing") + Spacer() + Text(netCfg.smpProxyMode.label) + } } - .disabled(currentNetCfg == NetCfg.defaults) - - Button { - updateNetCfgView(NetCfg.proxyDefaults) - showSettingsAlert = .update + + NavigationLink { + List { + Section { + SelectionListView(list: SMPProxyFallback.values, selection: $netCfg.smpProxyFallback) { mode in + netCfg.smpProxyFallback = mode + } + .disabled(netCfg.smpProxyMode == .never) + } footer: { + Text(proxyFallbackInfo(netCfg.smpProxyFallback)) + .font(.callout) + .foregroundColor(theme.colors.secondary) + } + } + .navigationTitle("Allow downgrade") + .modifier(ThemedBackground(grouped: true)) + .navigationBarTitleDisplayMode(.inline) } label: { - Text("Set timeouts for proxy/VPN") + HStack { + Text("Allow downgrade") + Spacer() + Text(netCfg.smpProxyFallback.label) + } } - .disabled(currentNetCfg == NetCfg.proxyDefaults) + Toggle("Show message status", isOn: $showSentViaProxy) + } header: { + Text("Private message routing") + .foregroundColor(theme.colors.secondary) + } footer: { + VStack(alignment: .leading) { + Text("To protect your IP address, private routing uses your SMP servers to deliver messages.") + if showSentViaProxy { + Text("Show → on messages sent via private routing.") + } + } + .foregroundColor(theme.colors.secondary) + } + + Section { + Picker("Use .onion hosts", selection: $onionHosts) { + ForEach(OnionHosts.values, id: \.self) { Text($0.text) } + } + .frame(height: 36) + } footer: { + Text(onionHostsInfo(onionHosts)) + .foregroundColor(theme.colors.secondary) + } + .onChange(of: onionHosts) { hosts in + if hosts != OnionHosts(netCfg: currentNetCfg) { + let (hostMode, requiredHostMode) = hosts.hostMode + netCfg.hostMode = hostMode + netCfg.requiredHostMode = requiredHostMode + } + } + + if developerTools { + Section { + Picker("Transport isolation", selection: $netCfg.sessionMode) { + ForEach(TransportSessionMode.values, id: \.self) { Text($0.text) } + } + .frame(height: 36) + } footer: { + Text(sessionModeInfo(netCfg.sessionMode)) + .foregroundColor(theme.colors.secondary) + } + } + + Section("TCP connection") { timeoutSettingPicker("TCP connection timeout", selection: $netCfg.tcpConnectTimeout, values: [10_000000, 15_000000, 20_000000, 30_000000, 45_000000, 60_000000, 90_000000], label: secondsLabel) timeoutSettingPicker("Protocol timeout", selection: $netCfg.tcpTimeout, values: [5_000000, 7_000000, 10_000000, 15_000000, 20_000000, 30_000000], label: secondsLabel) timeoutSettingPicker("Protocol timeout per KB", selection: $netCfg.tcpTimeoutPerKb, values: [2_500, 5_000, 10_000, 15_000, 20_000, 30_000], label: secondsLabel) @@ -72,24 +152,21 @@ struct AdvancedNetworkSettings: View { } .foregroundColor(theme.colors.secondary) } - } header: { - Text("") - .foregroundColor(theme.colors.secondary) - } footer: { - HStack { - Button { - updateNetCfgView(currentNetCfg) - } label: { - Label("Revert", systemImage: "arrow.counterclockwise").font(.callout) - } + } + + Section { + Button("Reset to defaults") { + updateNetCfgView(NetCfg.defaults) + } + .disabled(netCfg == NetCfg.defaults) - Spacer() - - Button { - showSettingsAlert = .update - } label: { - Label("Save", systemImage: "checkmark").font(.callout) - } + Button("Set timeouts for proxy/VPN") { + updateNetCfgView(netCfg.withProxyTimeouts) + } + .disabled(netCfg.hasProxyTimeouts) + + Button("Save and reconnect") { + showSettingsAlert = .update } .disabled(netCfg == currentNetCfg) } @@ -111,10 +188,10 @@ struct AdvancedNetworkSettings: View { switch a { case .update: return Alert( - title: Text("Update network settings?"), + title: Text("Update settings?"), message: Text("Updating settings will re-connect the client to all servers."), primaryButton: .default(Text("Ok")) { - saveNetCfg() + _ = saveNetCfg() }, secondaryButton: .cancel() ) @@ -125,23 +202,43 @@ struct AdvancedNetworkSettings: View { ) } } + .modifier(BackButton(disabled: Binding.constant(false)) { + if netCfg == currentNetCfg { + dismiss() + cfgLoaded = false + } else { + showSaveDialog = true + } + }) + .confirmationDialog("Update network settings?", isPresented: $showSaveDialog, titleVisibility: .visible) { + Button("Save and reconnect") { + if saveNetCfg() { + dismiss() + cfgLoaded = false + } + } + Button("Exit without saving") { dismiss() } + } } private func updateNetCfgView(_ cfg: NetCfg) { netCfg = cfg + onionHosts = OnionHosts(netCfg: netCfg) enableKeepAlive = netCfg.enableKeepAlive keepAliveOpts = netCfg.tcpKeepAlive ?? KeepAliveOpts.defaults } - private func saveNetCfg() { + private func saveNetCfg() -> Bool { do { try setNetworkConfig(netCfg) currentNetCfg = netCfg setNetCfg(netCfg) + return true } catch let error { let err = responseError(error) showSettingsAlert = .error(err: err) logger.error("\(err)") + return false } } @@ -164,6 +261,38 @@ struct AdvancedNetworkSettings: View { } .frame(height: 36) } + + private func onionHostsInfo(_ hosts: OnionHosts) -> LocalizedStringKey { + switch hosts { + case .no: return "Onion hosts will not be used." + case .prefer: return "Onion hosts will be used when available.\nRequires compatible VPN." + case .require: return "Onion hosts will be **required** for connection.\nRequires compatible VPN." + } + } + + private func sessionModeInfo(_ mode: TransportSessionMode) -> LocalizedStringKey { + switch mode { + case .user: return "A separate TCP connection will be used **for each chat profile you have in the app**." + case .entity: return "A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail." + } + } + + private func proxyModeInfo(_ mode: SMPProxyMode) -> LocalizedStringKey { + switch mode { + case .always: return "Always use private routing." + case .unknown: return "Use private routing with unknown servers." + case .unprotected: return "Use private routing with unknown servers when IP address is not protected." + case .never: return "Do NOT use private routing." + } + } + + private func proxyFallbackInfo(_ proxyFallback: SMPProxyFallback) -> LocalizedStringKey { + switch proxyFallback { + case .allow: return "Send messages directly when your or destination server does not support private routing." + case .allowProtected: return "Send messages directly when IP address is protected and your or destination server does not support private routing." + case .prohibit: return "Do NOT send messages directly, even if your or destination server does not support private routing." + } + } } struct AdvancedNetworkSettings_Previews: PreviewProvider { diff --git a/apps/ios/Shared/Views/UserSettings/AppSettings.swift b/apps/ios/Shared/Views/UserSettings/AppSettings.swift index ab5da53a9c..66cb41a57d 100644 --- a/apps/ios/Shared/Views/UserSettings/AppSettings.swift +++ b/apps/ios/Shared/Views/UserSettings/AppSettings.swift @@ -50,6 +50,7 @@ extension AppSettings { if let val = uiDarkColorScheme { def.setValue(val, forKey: DEFAULT_SYSTEM_DARK_THEME) } if let val = uiCurrentThemeIds { def.setValue(val, forKey: DEFAULT_CURRENT_THEME_IDS) } if let val = uiThemes { def.setValue(val.skipDuplicates(), forKey: DEFAULT_THEME_OVERRIDES) } + if let val = oneHandUI { def.setValue(val, forKey: DEFAULT_ONE_HAND_UI) } } public static var current: AppSettings { @@ -81,6 +82,7 @@ extension AppSettings { c.uiDarkColorScheme = systemDarkThemeDefault.get() c.uiCurrentThemeIds = currentThemeIdsDefault.get() c.uiThemes = themeOverridesDefault.get() + c.oneHandUI = def.bool(forKey: DEFAULT_ONE_HAND_UI) return c } } diff --git a/apps/ios/Shared/Views/UserSettings/AppearanceSettings.swift b/apps/ios/Shared/Views/UserSettings/AppearanceSettings.swift index 5d667655e3..7f18d43a5e 100644 --- a/apps/ios/Shared/Views/UserSettings/AppearanceSettings.swift +++ b/apps/ios/Shared/Views/UserSettings/AppearanceSettings.swift @@ -33,6 +33,7 @@ struct AppearanceSettings: View { }() @State private var darkModeTheme: String = UserDefaults.standard.string(forKey: DEFAULT_SYSTEM_DARK_THEME) ?? DefaultTheme.DARK.themeName @AppStorage(DEFAULT_PROFILE_IMAGE_CORNER_RADIUS) private var profileImageCornerRadius = defaultProfileImageCorner + @AppStorage(DEFAULT_ONE_HAND_UI) private var oneHandUI = false @State var themeUserDestination: (Int64, ThemeModeOverrides?)? = { if let currentUser = ChatModel.shared.currentUser, let uiThemes = currentUser.uiThemes, uiThemes.preferredMode(!CurrentColors.colors.isLight) != nil { diff --git a/apps/ios/Shared/Views/UserSettings/DeveloperView.swift b/apps/ios/Shared/Views/UserSettings/DeveloperView.swift index e55ff5cfb6..41a580496f 100644 --- a/apps/ios/Shared/Views/UserSettings/DeveloperView.swift +++ b/apps/ios/Shared/Views/UserSettings/DeveloperView.swift @@ -13,6 +13,7 @@ struct DeveloperView: View { @EnvironmentObject var theme: AppTheme @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false @AppStorage(GROUP_DEFAULT_CONFIRM_DB_UPGRADES, store: groupDefaults) private var confirmDatabaseUpgrades = false + @AppStorage(DEFAULT_ONE_HAND_UI) private var oneHandUI = false @Environment(\.colorScheme) var colorScheme var body: some View { @@ -33,9 +34,6 @@ struct DeveloperView: View { } label: { settingsRow("terminal", color: theme.colors.secondary) { Text("Chat console") } } - settingsRow("internaldrive", color: theme.colors.secondary) { - Toggle("Confirm database upgrades", isOn: $confirmDatabaseUpgrades) - } settingsRow("chevron.left.forwardslash.chevron.right", color: theme.colors.secondary) { Toggle("Show developer options", isOn: $developerTools) } @@ -45,6 +43,19 @@ struct DeveloperView: View { ((developerTools ? Text("Show:") : Text("Hide:")) + Text(" ") + Text("Database IDs and Transport isolation option.")) .foregroundColor(theme.colors.secondary) } + + if developerTools { + Section { + settingsRow("internaldrive", color: theme.colors.secondary) { + Toggle("Confirm database upgrades", isOn: $confirmDatabaseUpgrades) + } + settingsRow("hand.wave", color: theme.colors.secondary) { + Toggle("One-hand UI", isOn: $oneHandUI) + } + } header: { + Text("Developer options") + } + } } } } diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers.swift index 3d93a92e08..155a3956be 100644 --- a/apps/ios/Shared/Views/UserSettings/NetworkAndServers.swift +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers.swift @@ -10,18 +10,10 @@ import SwiftUI import SimpleXChat private enum NetworkAlert: Identifiable { - case updateOnionHosts(hosts: OnionHosts) - case updateSessionMode(mode: TransportSessionMode) - case updateSMPProxyMode(proxyMode: SMPProxyMode) - case updateSMPProxyFallback(proxyFallback: SMPProxyFallback) case error(err: String) var id: String { switch self { - case let .updateOnionHosts(hosts): return "updateOnionHosts \(hosts)" - case let .updateSessionMode(mode): return "updateSessionMode \(mode)" - case let .updateSMPProxyMode(proxyMode): return "updateSMPProxyMode \(proxyMode)" - case let .updateSMPProxyFallback(proxyFallback): return "updateSMPProxyFallback \(proxyFallback)" case let .error(err): return "error \(err)" } } @@ -30,16 +22,6 @@ private enum NetworkAlert: Identifiable { struct NetworkAndServers: View { @EnvironmentObject var m: ChatModel @EnvironmentObject var theme: AppTheme - @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false - @AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false - @State private var cfgLoaded = false - @State private var currentNetCfg = NetCfg.defaults - @State private var netCfg = NetCfg.defaults - @State private var onionHosts: OnionHosts = .no - @State private var sessionMode: TransportSessionMode = .user - @State private var proxyMode: SMPProxyMode = .never - @State private var proxyFallback: SMPProxyFallback = .allow - @State private var alert: NetworkAlert? var body: some View { VStack { @@ -50,7 +32,7 @@ struct NetworkAndServers: View { .navigationTitle("Your SMP servers") .modifier(ThemedBackground(grouped: true)) } label: { - Text("SMP servers") + Text("Message servers") } NavigationLink { @@ -58,24 +40,12 @@ struct NetworkAndServers: View { .navigationTitle("Your XFTP servers") .modifier(ThemedBackground(grouped: true)) } label: { - Text("XFTP servers") - } - - Picker("Use .onion hosts", selection: $onionHosts) { - ForEach(OnionHosts.values, id: \.self) { Text($0.text) } - } - .frame(height: 36) - - if developerTools { - Picker("Transport isolation", selection: $sessionMode) { - ForEach(TransportSessionMode.values, id: \.self) { Text($0.text) } - } - .frame(height: 36) + Text("Media & file servers") } NavigationLink { AdvancedNetworkSettings() - .navigationTitle("Network settings") + .navigationTitle("Advanced settings") .modifier(ThemedBackground(grouped: true)) } label: { Text("Advanced network settings") @@ -83,35 +53,6 @@ struct NetworkAndServers: View { } header: { Text("Messages & files") .foregroundColor(theme.colors.secondary) - } footer: { - Text("Using .onion hosts requires compatible VPN provider.") - .foregroundColor(theme.colors.secondary) - } - - Section { - Picker("Private routing", selection: $proxyMode) { - ForEach(SMPProxyMode.values, id: \.self) { Text($0.text) } - } - .frame(height: 36) - - Picker("Allow downgrade", selection: $proxyFallback) { - ForEach(SMPProxyFallback.values, id: \.self) { Text($0.text) } - } - .disabled(proxyMode == .never) - .frame(height: 36) - - Toggle("Show message status", isOn: $showSentViaProxy) - } header: { - Text("Private message routing") - .foregroundColor(theme.colors.secondary) - } footer: { - VStack(alignment: .leading) { - Text("To protect your IP address, private routing uses your SMP servers to deliver messages.") - if showSentViaProxy { - Text("Show → on messages sent via private routing.") - } - } - .foregroundColor(theme.colors.secondary) } Section(header: Text("Calls").foregroundColor(theme.colors.secondary)) { @@ -133,147 +74,6 @@ struct NetworkAndServers: View { } } } - .onAppear { - if cfgLoaded { return } - cfgLoaded = true - currentNetCfg = getNetCfg() - resetNetCfgView() - } - .onChange(of: onionHosts) { hosts in - if hosts != OnionHosts(netCfg: currentNetCfg) { - alert = .updateOnionHosts(hosts: hosts) - } - } - .onChange(of: sessionMode) { mode in - if mode != netCfg.sessionMode { - alert = .updateSessionMode(mode: mode) - } - } - .onChange(of: proxyMode) { mode in - if mode != netCfg.smpProxyMode { - alert = .updateSMPProxyMode(proxyMode: mode) - } - } - .onChange(of: proxyFallback) { fallbackMode in - if fallbackMode != netCfg.smpProxyFallback { - alert = .updateSMPProxyFallback(proxyFallback: fallbackMode) - } - } - .alert(item: $alert) { a in - switch a { - case let .updateOnionHosts(hosts): - return Alert( - title: Text("Update .onion hosts setting?"), - message: Text(onionHostsInfo(hosts)) + Text("\n") + Text("Updating this setting will re-connect the client to all servers."), - primaryButton: .default(Text("Ok")) { - let (hostMode, requiredHostMode) = hosts.hostMode - netCfg.hostMode = hostMode - netCfg.requiredHostMode = requiredHostMode - saveNetCfg() - }, - secondaryButton: .cancel() { - resetNetCfgView() - } - ) - case let .updateSessionMode(mode): - return Alert( - title: Text("Update transport isolation mode?"), - message: Text(sessionModeInfo(mode)) + Text("\n") + Text("Updating this setting will re-connect the client to all servers."), - primaryButton: .default(Text("Ok")) { - netCfg.sessionMode = mode - saveNetCfg() - }, - secondaryButton: .cancel() { - resetNetCfgView() - } - ) - case let .updateSMPProxyMode(proxyMode): - return Alert( - title: Text("Message routing mode"), - message: Text(proxyModeInfo(proxyMode)) + Text("\n") + Text("Updating this setting will re-connect the client to all servers."), - primaryButton: .default(Text("Ok")) { - netCfg.smpProxyMode = proxyMode - saveNetCfg() - }, - secondaryButton: .cancel() { - resetNetCfgView() - } - ) - case let .updateSMPProxyFallback(proxyFallback): - return Alert( - title: Text("Message routing fallback"), - message: Text(proxyFallbackInfo(proxyFallback)) + Text("\n") + Text("Updating this setting will re-connect the client to all servers."), - primaryButton: .default(Text("Ok")) { - netCfg.smpProxyFallback = proxyFallback - saveNetCfg() - }, - secondaryButton: .cancel() { - resetNetCfgView() - } - ) - case let .error(err): - return Alert( - title: Text("Error updating settings"), - message: Text(err) - ) - } - } - } - - private func saveNetCfg() { - do { - let def = netCfg.hostMode == .onionHost ? NetCfg.proxyDefaults : NetCfg.defaults - netCfg.tcpConnectTimeout = def.tcpConnectTimeout - netCfg.tcpTimeout = def.tcpTimeout - try setNetworkConfig(netCfg) - currentNetCfg = netCfg - setNetCfg(netCfg) - } catch let error { - let err = responseError(error) - resetNetCfgView() - alert = .error(err: err) - logger.error("\(err)") - } - } - - private func resetNetCfgView() { - netCfg = currentNetCfg - onionHosts = OnionHosts(netCfg: netCfg) - sessionMode = netCfg.sessionMode - proxyMode = netCfg.smpProxyMode - proxyFallback = netCfg.smpProxyFallback - } - - private func onionHostsInfo(_ hosts: OnionHosts) -> LocalizedStringKey { - switch hosts { - case .no: return "Onion hosts will not be used." - case .prefer: return "Onion hosts will be used when available. Requires enabling VPN." - case .require: return "Onion hosts will be required for connection. Requires enabling VPN." - } - } - - private func sessionModeInfo(_ mode: TransportSessionMode) -> LocalizedStringKey { - switch mode { - case .user: return "A separate TCP connection will be used **for each chat profile you have in the app**." - case .entity: return "A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail." - } - } - - private func proxyModeInfo(_ mode: SMPProxyMode) -> LocalizedStringKey { - switch mode { - case .always: return "Always use private routing." - case .unknown: return "Use private routing with unknown servers." - case .unprotected: return "Use private routing with unknown servers when IP address is not protected." - case .never: return "Do NOT use private routing." - } - } - - private func proxyFallbackInfo(_ proxyFallback: SMPProxyFallback) -> LocalizedStringKey { - switch proxyFallback { - case .allow: return "Send messages directly when your or destination server does not support private routing." - case .allowProtected: return "Send messages directly when IP address is protected and your or destination server does not support private routing." - case .prohibit: return "Do NOT send messages directly, even if your or destination server does not support private routing." - } } } diff --git a/apps/ios/Shared/Views/UserSettings/ProtocolServersView.swift b/apps/ios/Shared/Views/UserSettings/ProtocolServersView.swift index ea1953e4ac..0fb37d5c49 100644 --- a/apps/ios/Shared/Views/UserSettings/ProtocolServersView.swift +++ b/apps/ios/Shared/Views/UserSettings/ProtocolServersView.swift @@ -130,7 +130,7 @@ struct ProtocolServersView: View { showSaveDialog = true } }) - .confirmationDialog("Save servers?", isPresented: $showSaveDialog) { + .confirmationDialog("Save servers?", isPresented: $showSaveDialog, titleVisibility: .visible) { Button("Save") { saveServers() dismiss() diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift index fcbef61888..59e4f8af35 100644 --- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift +++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift @@ -47,6 +47,7 @@ let DEFAULT_ACCENT_COLOR_GREEN = "accentColorGreen" // deprecated, only used for let DEFAULT_ACCENT_COLOR_BLUE = "accentColorBlue" // deprecated, only used for migration let DEFAULT_USER_INTERFACE_STYLE = "userInterfaceStyle" // deprecated, only used for migration let DEFAULT_PROFILE_IMAGE_CORNER_RADIUS = "profileImageCornerRadius" +let DEFAULT_ONE_HAND_UI = "oneHandUI" let DEFAULT_CONNECT_VIA_LINK_TAB = "connectViaLinkTab" let DEFAULT_LIVE_MESSAGE_ALERT_SHOWN = "liveMessageAlertShown" let DEFAULT_SHOW_HIDDEN_PROFILES_NOTICE = "showHiddenProfilesNotice" @@ -61,6 +62,8 @@ let DEFAULT_DEVICE_NAME_FOR_REMOTE_ACCESS = "deviceNameForRemoteAccess" let DEFAULT_CONFIRM_REMOTE_SESSIONS = "confirmRemoteSessions" let DEFAULT_CONNECT_REMOTE_VIA_MULTICAST = "connectRemoteViaMulticast" let DEFAULT_CONNECT_REMOTE_VIA_MULTICAST_AUTO = "connectRemoteViaMulticastAuto" +let DEFAULT_SHOW_DELETE_CONVERSATION_NOTICE = "showDeleteConversationNotice" +let DEFAULT_SHOW_DELETE_CONTACT_NOTICE = "showDeleteContactNotice" let DEFAULT_SHOW_SENT_VIA_RPOXY = "showSentViaProxy" let DEFAULT_SHOW_SUBSCRIPTION_PERCENTAGE = "showSubscriptionPercentage" @@ -94,6 +97,7 @@ let appDefaults: [String: Any] = [ DEFAULT_DEVELOPER_TOOLS: false, DEFAULT_ENCRYPTION_STARTED: false, DEFAULT_PROFILE_IMAGE_CORNER_RADIUS: defaultProfileImageCorner, + DEFAULT_ONE_HAND_UI: false, DEFAULT_CONNECT_VIA_LINK_TAB: ConnectViaLinkTab.scan.rawValue, DEFAULT_LIVE_MESSAGE_ALERT_SHOWN: false, DEFAULT_SHOW_HIDDEN_PROFILES_NOTICE: true, @@ -104,6 +108,8 @@ let appDefaults: [String: Any] = [ DEFAULT_CONFIRM_REMOTE_SESSIONS: false, DEFAULT_CONNECT_REMOTE_VIA_MULTICAST: true, DEFAULT_CONNECT_REMOTE_VIA_MULTICAST_AUTO: true, + DEFAULT_SHOW_DELETE_CONVERSATION_NOTICE: true, + DEFAULT_SHOW_DELETE_CONTACT_NOTICE: true, DEFAULT_SHOW_SENT_VIA_RPOXY: false, DEFAULT_SHOW_SUBSCRIPTION_PERCENTAGE: false, ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN: AppSettingsLockScreenCalls.show.rawValue, @@ -158,6 +164,9 @@ let onboardingStageDefault = EnumDefault(defaults: UserDefaults let customDisappearingMessageTimeDefault = IntDefault(defaults: UserDefaults.standard, forKey: DEFAULT_CUSTOM_DISAPPEARING_MESSAGE_TIME) +let showDeleteConversationNoticeDefault = BoolDefault(defaults: UserDefaults.standard, forKey: DEFAULT_SHOW_DELETE_CONVERSATION_NOTICE) +let showDeleteContactNoticeDefault = BoolDefault(defaults: UserDefaults.standard, forKey: DEFAULT_SHOW_DELETE_CONTACT_NOTICE) + let currentThemeDefault = StringDefault(defaults: UserDefaults.standard, forKey: DEFAULT_CURRENT_THEME, withDefault: DefaultTheme.SYSTEM_THEME_NAME) let systemDarkThemeDefault = StringDefault(defaults: UserDefaults.standard, forKey: DEFAULT_SYSTEM_DARK_THEME, withDefault: DefaultTheme.DARK.themeName) let currentThemeIdsDefault = CodableDefault<[String: String]>(defaults: UserDefaults.standard, forKey: DEFAULT_CURRENT_THEME_IDS, withDefault: [:] ) diff --git a/apps/ios/SimpleX Localizations/ar.xcloc/Localized Contents/ar.xliff b/apps/ios/SimpleX Localizations/ar.xcloc/Localized Contents/ar.xliff index 7098e470bb..40481d81f1 100644 --- a/apps/ios/SimpleX Localizations/ar.xcloc/Localized Contents/ar.xliff +++ b/apps/ios/SimpleX Localizations/ar.xcloc/Localized Contents/ar.xliff @@ -39,7 +39,7 @@ !1 colored! - ! 1 ملون! + ! 1 مُلوَّن! No comment provided by engineer. @@ -69,7 +69,7 @@ %@ is not verified - %@ لم يتم التحقق منها + %@ لم يتم التحقق منه No comment provided by engineer. @@ -107,8 +107,9 @@ %d ثانية message ttl - + %d skipped message(s) + %d الرسائل المتخطية integrity error chat item @@ -121,12 +122,14 @@ %lld %@ No comment provided by engineer. - + %lld contact(s) selected + %lld تم اختيار جهات الاتصال No comment provided by engineer. - + %lld file(s) with total size of %@ + %lld الملفات ذات الحجم الإجمالي %@ No comment provided by engineer. @@ -134,8 +137,9 @@ %lld أعضاء No comment provided by engineer. - + %lld second(s) + %lld ثوانى No comment provided by engineer. @@ -185,7 +189,7 @@ **Add new contact**: to create your one-time QR Code or link for your contact. - ** إضافة جهة اتصال جديدة **: لإنشاء رمز QR لمرة واحدة أو رابط جهة الاتصال الخاصة بك. + ** إضافة جهة اتصال جديدة **: لإنشاء رمز QR لمرة واحدة أو رابط جهة الاتصال الخاصة بكم. No comment provided by engineer. @@ -195,12 +199,12 @@ **More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have. - ** المزيد من الخصوصية **: تحقق من الرسائل الجديدة كل 20 دقيقة. تتم مشاركة رمز الجهاز مع خادم SimpleX Chat ، ولكن ليس عدد جهات الاتصال أو الرسائل لديك. + ** المزيد من الخصوصية **: تحققوا من الرسائل الجديدة كل 20 دقيقة. تتم مشاركة رمز الجهاز مع خادم SimpleX Chat ، ولكن ليس عدد جهات الاتصال أو الرسائل لديكم. No comment provided by engineer. **Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app). - ** الأكثر خصوصية **: لا تستخدم خادم إشعارات SimpleX Chat ، وتحقق من الرسائل بشكل دوري في الخلفية (يعتمد على عدد مرات استخدامك للتطبيق). + ** الأكثر خصوصية **: لا تستخدم خادم إشعارات SimpleX Chat ، وتحقق من الرسائل بشكل دوري في الخلفية (يعتمد على عدد مرات استخدامكم للتطبيق). No comment provided by engineer. @@ -210,7 +214,7 @@ **Please note**: you will NOT be able to recover or change passphrase if you lose it. - ** يرجى ملاحظة **: لن تتمكن من استعادة أو تغيير عبارة المرور إذا فقدتها. + ** يرجى ملاحظة **: لن تتمكنوا من استعادة أو تغيير عبارة المرور إذا فقدتموها. No comment provided by engineer. @@ -305,7 +309,7 @@ A separate TCP connection will be used **for each chat profile you have in the app**. - سيتم استخدام اتصال TCP منفصل ** لكل ملف تعريف دردشة لديك في التطبيق **. + سيتم استخدام اتصال TCP منفصل ** لكل ملف تعريف دردشة لديكم في التطبيق **. No comment provided by engineer. @@ -355,24 +359,29 @@ Accept requests No comment provided by engineer. - + Add preset servers + إضافة خوادم محددة مسبقا No comment provided by engineer. - + Add profile + إضافة الملف الشخصي No comment provided by engineer. - + Add servers by scanning QR codes. + إضافة خوادم عن طريق مسح رموز QR. No comment provided by engineer. - + Add server + أضف الخادم No comment provided by engineer. - + Add to another device + أضف إلى جهاز آخر No comment provided by engineer. @@ -3667,7 +3676,7 @@ SimpleX servers cannot see your profile. ## In reply to - ## ردًا على + ## ردًّا على copied message info @@ -3675,6 +3684,208 @@ SimpleX servers cannot see your profile. %@ و %@ متصل No comment provided by engineer. + + %@ downloaded + %@ تم التنزيل + + + %@ and %@ + %@ و %@ + + + %@ connected + %@ متصل + + + %lld minutes + %lld دقائق + + + %@, %@ and %lld members + %@, %@ و %lld أعضاء + + + %d weeks + %d أسابيع + + + %@ uploaded + %@ تم الرفع + + + %@, %@ and %lld other members connected + %@, %@ و %lld أعضاء آخرين متصلين + + + %lld seconds + %lld ثواني + + + %u messages failed to decrypt. + %u فشلت عملية فك تشفير الرسائل. + + + %lld messages marked deleted + %lld الرسائل معلمه بالحذف + + + %lld messages moderated by %@ + %lld رسائل تمت إدارتها بواسطة %@ + + + %lld new interface languages + %lld لغات واجهة جديدة + + + %lld group events + %lld أحداث المجموعة + + + %lld messages blocked by admin + %lld رسائل محظورة بواسطه المسؤول + + + %lld messages blocked + %lld رسائل تم حظرها + + + %u messages skipped. + %u تم تخطي الرسائل. + + + **Add contact**: to create a new invitation link, or connect via a link you received. + **إضافة جهة اتصال**: لإنشاء رابط دعوة جديد، أو الاتصال عبر الرابط الذي تلقيتوهم. + + + **Create group**: to create a new group. + **إنشاء مجموعة**: لإنشاء مجموعة جديدة. + + + (this device v%@) + (هذا الجهاز v%@) + + + (new) + (جديد) + + + **Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection. + **يرجى الملاحظة**: سيؤدي استخدام نفس قاعدة البيانات على جهازين إلى كسر فك تشفير الرسائل من اتصالاتكم كحماية أمنية. + + + A new random profile will be shared. + سيتم مشاركة ملف تعريفي عشوائي جديد. + + + 30 seconds + 30 ثانيه + + + - more stable message delivery. +- a bit better groups. +- and more! + - تسليم رسائل أكثر استقرارًا. +- مجموعات أفضل قليلاً. +- والمزيد! + + + 0 sec + 0 ثانيه + + + 1 minute + 1 دقيقة + + + 5 minutes + 5 دقائق + + + <p>Hi!</p> +<p><a href="%@">Connect to me via SimpleX Chat</a></p> + <p>مرحبا!</p> +<p><a href="%@">أتصل بى من خلال SimpleX Chat</a></p> + + + 0s + 0 ث + + + A few more things + بعض الأشياء الأخرى + + + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! +- delivery receipts (up to 20 members). +- faster and more stable. + - أتصل بـ [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! +- delivery receipts (up to 20 members). +- أسرع و أكثر اسْتِقْرارًا. + + + **Warning**: the archive will be removed. + **تحذير**: سيتم إزالة الأرشيف. + + + - optionally notify deleted contacts. +- profile names with spaces. +- and more! + - إخطار جهات الاتصال المحذوفة بشكل اختياري. +- أسماء الملفات الشخصية مع المسافات. +- والمزيد! + + + - voice messages up to 5 minutes. +- custom time to disappear. +- editing history. + - رسائل صوتية تصل مدتها إلى 5 دقائق. +- وقت مخصص للاختفاء. +- تعديل السجل. + + + Add welcome message + إضافة رسالة ترحيب + + + Abort changing address? + هل تريد إلغاء تغيير العنوان؟ + + + Add contact + إضافة جهة اتصال + + + Abort + إحباط + + + About SimpleX address + حول عنوان SimpleX + + + Accept connection request? + قبول طلب الاتصال؟ + + + Acknowledged + معترف به + + + Acknowledgement errors + أخطاء الإقرار + + + Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts. + أضف عنوانًا إلى ملفكم الشخصي، حتى تتمكن جهات الاتصال الخاصة بكم من مشاركته مع أشخاص اخرين. سيتم إرسال تحديث الملف الشخصي إلى جهات الاتصال الخاصة بكم. + + + Abort changing address + إحباط تغيير العنوان + + + Active connections + اتصالات نشطة + diff --git a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff index 6f1ed52623..51f6c9c975 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -392,6 +392,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -738,6 +743,10 @@ Позволи обаждания само ако вашият контакт ги разрешава. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Позволи изчезващи съобщения само ако вашият контакт ги разрешава. @@ -924,6 +933,10 @@ Архивиране и качване No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database Архивиране на база данни @@ -1111,11 +1124,23 @@ Обаждания No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available Камерата е неодстъпна No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Не може да покани контакта! @@ -1126,6 +1151,10 @@ Не може да поканят контактите! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Отказ @@ -1234,6 +1263,10 @@ Базата данни на чата е изтрита No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported Базата данни на чат е импортирана @@ -1372,6 +1405,10 @@ Потвърди kодa за достъп No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Потвърди актуализаациите на базата данни @@ -1426,6 +1463,10 @@ Свързване с настолно устройство No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? Свърване със себе си? @@ -1497,6 +1538,10 @@ This is your own one-time link! Свързване със сървър…(грешка: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Свързване с настолно устройство @@ -1507,6 +1552,10 @@ This is your own one-time link! Връзка No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Грешка при свързване @@ -1554,6 +1603,10 @@ This is your own one-time link! Контактът вече съществува No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Контактът е скрит: @@ -1564,9 +1617,8 @@ This is your own one-time link! Контактът е свързан notification - - Contact is not connected yet! - Контактът все още не е свързан! + + Contact is deleted. No comment provided by engineer. @@ -1579,6 +1631,10 @@ This is your own one-time link! Настройки за контакт No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Контакти @@ -1594,6 +1650,14 @@ This is your own one-time link! Продължи No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Копирай @@ -1870,11 +1934,6 @@ This is your own one-time link! Изтриване на %lld съобщения? No comment provided by engineer. - - Delete Contact - Изтрий контакт - No comment provided by engineer. - Delete address Изтрий адрес @@ -1930,11 +1989,8 @@ This is your own one-time link! Изтрий контакт No comment provided by engineer. - - Delete contact? -This cannot be undone! - Изтрий контакт? -Това не може да бъде отменено! + + Delete contact? No comment provided by engineer. @@ -2027,11 +2083,6 @@ This cannot be undone! Изтрий старата база данни? No comment provided by engineer. - - Delete pending connection - Изтрий предстоящата връзка - No comment provided by engineer. - Delete pending connection? Изтрий предстоящата връзка? @@ -2047,11 +2098,19 @@ This cannot be undone! Изтрий опашка server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Изтрий потребителския профил? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted No comment provided by engineer. @@ -2066,6 +2125,10 @@ This cannot be undone! Изтрито на: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors No comment provided by engineer. @@ -2130,6 +2193,10 @@ This cannot be undone! Разработване No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Инструменти за разработчици @@ -2632,11 +2699,6 @@ This cannot be undone! Грешка при изтриване на връзката No comment provided by engineer. - - Error deleting contact - Грешка при изтриване на контакт - No comment provided by engineer. - Error deleting database Грешка при изтриване на базата данни @@ -2868,6 +2930,10 @@ This cannot be undone! Дори когато е деактивиран в разговора. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Изход без запазване @@ -3662,6 +3728,10 @@ Error: %2$@ 3. Връзката е била компрометирана. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Изглежда, че вече сте свързани чрез този линк. Ако не е така, има грешка (%@). @@ -3724,6 +3794,10 @@ This is your link for group %@! Запази No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop Дръжте приложението отворено, за да го използвате от настолното устройство @@ -3899,6 +3973,10 @@ This is your link for group %@! Макс. 30 секунди, получено незабавно. No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium blur media @@ -3981,12 +4059,8 @@ This is your link for group %@! Message reception No comment provided by engineer. - - Message routing fallback - No comment provided by engineer. - - - Message routing mode + + Message servers No comment provided by engineer. @@ -4110,6 +4184,10 @@ This is your link for group %@! Модерирай chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Модерирано в @@ -4184,6 +4262,10 @@ This is your link for group %@! Състояние на мрежата No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Нов kод за достъп @@ -4360,19 +4442,27 @@ This is your link for group %@! Стар архив на база данни No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Линк за еднократна покана No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - За свързване ще са необходими Onion хостове. Изисква се активиране на VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + За свързване ще са **необходими** Onion хостове. +Изисква се активиране на VPN. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Ще се използват Onion хостове, когато са налични. Изисква се активиране на VPN. + + Onion hosts will be used when available. +Requires compatible VPN. + Ще се използват Onion хостове, когато са налични. +Изисква се активиране на VPN. No comment provided by engineer. @@ -4385,6 +4475,10 @@ This is your link for group %@! Само потребителските устройства съхраняват потребителски профили, контакти, групи и съобщения, изпратени с **двуслойно криптиране от край до край**. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Само собствениците на групата могат да променят груповите настройки. @@ -4617,6 +4711,10 @@ This is your link for group %@! Обаждания "картина в картина" No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Моля, попитайте вашия контакт, за да активирате изпращане на гласови съобщения. @@ -4905,6 +5003,10 @@ Enable in *Network & servers* settings. Оценете приложението No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Реагирай… @@ -5231,11 +5333,6 @@ Enable in *Network & servers* settings. Покажи chat item action - - Revert - Отмени промените - No comment provided by engineer. - Revoke Отзови @@ -5265,11 +5362,6 @@ Enable in *Network & servers* settings. SMP server No comment provided by engineer. - - SMP servers - SMP сървъри - No comment provided by engineer. - Safely receive files No comment provided by engineer. @@ -5299,6 +5391,10 @@ Enable in *Network & servers* settings. Запази и уведоми членовете на групата No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile Запази и актуализирай профила на групата @@ -5498,11 +5594,6 @@ Enable in *Network & servers* settings. Изпращайте потвърждениe за доставка на No comment provided by engineer. - - Send direct message - Изпрати лично съобщение - No comment provided by engineer. - Send direct message to connect Изпрати лично съобщение за свързване @@ -5527,6 +5618,10 @@ Enable in *Network & servers* settings. Изпрати съобщение на живо No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. No comment provided by engineer. @@ -5959,11 +6054,19 @@ Enable in *Network & servers* settings. Soft blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Някои не-фатални грешки са възникнали по време на импортиране - може да видите конзолата за повече подробности. No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody Някой @@ -6093,6 +6196,10 @@ Enable in *Network & servers* settings. Системна идентификация No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout Времето на изчакване за установяване на TCP връзка @@ -6153,11 +6260,6 @@ Enable in *Network & servers* settings. Докосни за сканиране No comment provided by engineer. - - Tap to start a new chat - Докосни за започване на нов чат - No comment provided by engineer. - Temporary file error No comment provided by engineer. @@ -6623,11 +6725,6 @@ To connect, please ask your contact to create another connection link and check Актуализация No comment provided by engineer. - - Update .onion hosts setting? - Актуализиране на настройката за .onion хостове? - No comment provided by engineer. - Update database passphrase Актуализирай паролата на базата данни @@ -6638,9 +6735,8 @@ To connect, please ask your contact to create another connection link and check Актуализиране на мрежовите настройки? No comment provided by engineer. - - Update transport isolation mode? - Актуализиране на режима на изолация на транспорта? + + Update settings? No comment provided by engineer. @@ -6648,11 +6744,6 @@ To connect, please ask your contact to create another connection link and check Актуализирането на настройките ще свърже отново клиента към всички сървъри. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - Актуализирането на тази настройка ще свърже повторно клиента към всички сървъри. - No comment provided by engineer. - Upgrade and open chat Актуализирай и отвори чата @@ -6748,6 +6839,10 @@ To connect, please ask your contact to create another connection link and check Използвайте приложението по време на разговора. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Потребителски профил @@ -6757,11 +6852,6 @@ To connect, please ask your contact to create another connection link and check User selection No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - Използването на .onion хостове изисква съвместим VPN доставчик. - No comment provided by engineer. - Using SimpleX Chat servers. Използват се сървърите на SimpleX Chat. @@ -7015,11 +7105,6 @@ To connect, please ask your contact to create another connection link and check XFTP server No comment provided by engineer. - - XFTP servers - XFTP сървъри - No comment provided by engineer. - You Вие @@ -7141,6 +7226,10 @@ Repeat join request? Вече можете да изпращате съобщения до %@ notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. Можете да зададете визуализация на известията на заключен екран през настройките. @@ -7166,6 +7255,10 @@ Repeat join request? Можете да започнете чат през Настройки на приложението / База данни или като рестартирате приложението No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. Можете да включите SimpleX заключване през Настройки. @@ -7208,11 +7301,6 @@ Repeat connection request? Изпрати отново заявката за свързване? 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. Трябва да въвеждате парола при всяко стартиране на приложението - тя не се съхранява на устройството. @@ -7233,11 +7321,23 @@ Repeat connection request? Вие се присъединихте към тази група. Свързване с поканващия член на групата. No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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 need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Трябва да разрешите на вашия контакт да изпраща гласови съобщения, за да можете да ги изпращате. @@ -7353,13 +7453,6 @@ Repeat connection request? Вашите чат профили No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Вашият контакт трябва да бъде онлайн, за да осъществите връзката. -Можете да откажете тази връзка и да премахнете контакта (и да опитате по -късно с нов линк). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Вашият контакт изпрати файл, който е по-голям от поддържания в момента максимален размер (%@). @@ -7375,6 +7468,10 @@ You can cancel this connection and remove the contact (and try later with a new Вашите контакти ще останат свързани. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Вашата текуща чат база данни ще бъде ИЗТРИТА и ЗАМЕНЕНА с импортираната. @@ -7551,6 +7648,10 @@ SimpleX сървърите не могат да видят вашия профи удебелен No comment provided by engineer. + + call + No comment provided by engineer. + call error грешка при повикване @@ -7917,6 +8018,10 @@ SimpleX сървърите не могат да видят вашия профи покана за група %@ group name + + invite + No comment provided by engineer. + invited поканен @@ -7972,6 +8077,10 @@ SimpleX сървърите не могат да видят вашия профи свързан rcv group event chat item + + message + No comment provided by engineer. + message received получено съобщение @@ -8002,6 +8111,10 @@ SimpleX сървърите не могат да видят вашия профи месеци time unit + + mute + No comment provided by engineer. + never никога @@ -8132,6 +8245,10 @@ SimpleX сървърите не могат да видят вашия профи запазено от %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec сек. @@ -8203,8 +8320,8 @@ last received msg: %2$@ неизвестен connection info - - unknown relays + + unknown servers No comment provided by engineer. @@ -8212,6 +8329,10 @@ last received msg: %2$@ неизвестен статус No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected No comment provided by engineer. @@ -8256,6 +8377,10 @@ last received msg: %2$@ чрез реле No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) видео разговор (не е e2e криптиран) @@ -8502,10 +8627,6 @@ last received msg: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - No comment provided by engineer. - Error preparing file No comment provided by engineer. @@ -8530,10 +8651,6 @@ last received msg: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - No comment provided by engineer. - Keychain error No comment provided by engineer. @@ -8546,10 +8663,6 @@ last received msg: %2$@ No active profile No comment provided by engineer. - - No network connection - No comment provided by engineer. - Ok No comment provided by engineer. @@ -8574,14 +8687,22 @@ last received msg: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. Share No comment provided by engineer. + + Slow network? + No comment provided by engineer. + Unknown database error: %@ No comment provided by engineer. @@ -8590,6 +8711,10 @@ last received msg: %2$@ Unsupported format No comment provided by engineer. + + Wait + No comment provided by engineer. + Wrong database passphrase No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff index 15d80de7b5..ef54e8786e 100644 --- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff +++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff @@ -378,6 +378,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -715,6 +720,10 @@ Povolte hovory, pouze pokud je váš kontakt povolí. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Povolte mizící zprávy, pouze pokud vám to váš kontakt dovolí. @@ -895,6 +904,10 @@ Archive and upload No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database No comment provided by engineer. @@ -1072,10 +1085,22 @@ Hovory No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Nelze pozvat kontakt! @@ -1086,6 +1111,10 @@ Nelze pozvat kontakty! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Zrušit @@ -1192,6 +1221,10 @@ Databáze chatu odstraněna No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported Importovaná databáze chatu @@ -1326,6 +1359,10 @@ Potvrdit heslo No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Potvrdit aktualizaci databáze @@ -1375,6 +1412,10 @@ Connect to desktop No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? No comment provided by engineer. @@ -1437,6 +1478,10 @@ This is your own one-time link! Připojování k serveru... (chyba: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop No comment provided by engineer. @@ -1446,6 +1491,10 @@ This is your own one-time link! Připojení No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Chyba připojení @@ -1492,6 +1541,10 @@ This is your own one-time link! Kontakt již existuje No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Skrytý kontakt: @@ -1502,9 +1555,8 @@ This is your own one-time link! Kontakt je připojen notification - - Contact is not connected yet! - Kontakt ještě není připojen! + + Contact is deleted. No comment provided by engineer. @@ -1517,6 +1569,10 @@ This is your own one-time link! Předvolby kontaktů No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Kontakty @@ -1532,6 +1588,14 @@ This is your own one-time link! Pokračovat No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Kopírovat @@ -1799,11 +1863,6 @@ This is your own one-time link! Delete %lld messages? No comment provided by engineer. - - Delete Contact - Smazat kontakt - No comment provided by engineer. - Delete address Odstranit adresu @@ -1858,9 +1917,8 @@ This is your own one-time link! Smazat kontakt No comment provided by engineer. - - Delete contact? -This cannot be undone! + + Delete contact? No comment provided by engineer. @@ -1952,11 +2010,6 @@ This cannot be undone! Smazat starou databázi? No comment provided by engineer. - - Delete pending connection - Smazat čekající připojení - No comment provided by engineer. - Delete pending connection? Smazat čekající připojení? @@ -1972,11 +2025,19 @@ This cannot be undone! Odstranit frontu server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Smazat uživatelský profil? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted No comment provided by engineer. @@ -1991,6 +2052,10 @@ This cannot be undone! Smazáno v: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors No comment provided by engineer. @@ -2052,6 +2117,10 @@ This cannot be undone! Vyvinout No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Nástroje pro vývojáře @@ -2536,11 +2605,6 @@ This cannot be undone! Chyba při mazání připojení No comment provided by engineer. - - Error deleting contact - Chyba mazání kontaktu - No comment provided by engineer. - Error deleting database Chyba při mazání databáze @@ -2766,6 +2830,10 @@ This cannot be undone! I při vypnutí v konverzaci. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Ukončit bez uložení @@ -3530,6 +3598,10 @@ Error: %2$@ 3. Spojení je kompromitováno. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Zdá se, že jste již připojeni prostřednictvím tohoto odkazu. Pokud tomu tak není, došlo k chybě (%@). @@ -3586,6 +3658,10 @@ This is your link for group %@! Keep No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. @@ -3756,6 +3832,10 @@ This is your link for group %@! Max 30 vteřin, přijato okamžitě. No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium blur media @@ -3838,12 +3918,8 @@ This is your link for group %@! Message reception No comment provided by engineer. - - Message routing fallback - No comment provided by engineer. - - - Message routing mode + + Message servers No comment provided by engineer. @@ -3955,6 +4031,10 @@ This is your link for group %@! Moderovat chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Upraveno v @@ -4026,6 +4106,10 @@ This is your link for group %@! Stav sítě No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Nové heslo @@ -4198,19 +4282,27 @@ This is your link for group %@! Archiv staré databáze No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Jednorázový zvací odkaz No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Pro připojení budou vyžadováni Onion hostitelé. Vyžaduje povolení sítě VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Pro připojení budou vyžadováni Onion hostitelé. +Vyžaduje povolení sítě VPN. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Onion hostitelé budou použiti, pokud jsou k dispozici. Vyžaduje povolení sítě VPN. + + Onion hosts will be used when available. +Requires compatible VPN. + Onion hostitelé budou použiti, pokud jsou k dispozici. +Vyžaduje povolení sítě VPN. No comment provided by engineer. @@ -4223,6 +4315,10 @@ This is your link for group %@! Pouze klientská zařízení ukládají uživatelské profily, kontakty, skupiny a zprávy odeslané s **2vrstvým šifrováním typu end-to-end**. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Předvolby skupiny mohou měnit pouze vlastníci skupiny. @@ -4442,6 +4538,10 @@ This is your link for group %@! Picture-in-picture calls No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Prosím, požádejte kontaktní osobu, aby umožnila odesílání hlasových zpráv. @@ -4720,6 +4820,10 @@ Enable in *Network & servers* settings. Ohodnoťte aplikaci No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Reagovat… @@ -5037,11 +5141,6 @@ Enable in *Network & servers* settings. Odhalit chat item action - - Revert - Vrátit - No comment provided by engineer. - Revoke Odvolat @@ -5071,11 +5170,6 @@ Enable in *Network & servers* settings. SMP server No comment provided by engineer. - - SMP servers - SMP servery - No comment provided by engineer. - Safely receive files No comment provided by engineer. @@ -5104,6 +5198,10 @@ Enable in *Network & servers* settings. Uložit a upozornit členy skupiny No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile Uložit a aktualizovat profil skupiny @@ -5297,11 +5395,6 @@ Enable in *Network & servers* settings. Potvrzení o doručení zasílat na No comment provided by engineer. - - Send direct message - Odeslat přímou zprávu - No comment provided by engineer. - Send direct message to connect Odeslat přímou zprávu pro připojení @@ -5326,6 +5419,10 @@ Enable in *Network & servers* settings. Odeslat živou zprávu No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. No comment provided by engineer. @@ -5750,11 +5847,19 @@ Enable in *Network & servers* settings. Soft blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Během importu došlo k nezávažným chybám - podrobnosti naleznete v chat konzoli. No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody Někdo @@ -5880,6 +5985,10 @@ Enable in *Network & servers* settings. Ověření systému No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout Časový limit připojení TCP @@ -5937,11 +6046,6 @@ Enable in *Network & servers* settings. Tap to scan No comment provided by engineer. - - Tap to start a new chat - Klepnutím na zahájíte nový chat - No comment provided by engineer. - Temporary file error No comment provided by engineer. @@ -6389,11 +6493,6 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu Aktualizovat No comment provided by engineer. - - Update .onion hosts setting? - Aktualizovat nastavení hostitelů .onion? - No comment provided by engineer. - Update database passphrase Aktualizovat přístupovou frázi databáze @@ -6404,9 +6503,8 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu Aktualizovat nastavení sítě? No comment provided by engineer. - - Update transport isolation mode? - Aktualizovat režim dopravní izolace? + + Update settings? No comment provided by engineer. @@ -6414,11 +6512,6 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu Aktualizací nastavení se klient znovu připojí ke všem serverům. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - Aktualizace tohoto nastavení znovu připojí klienta ke všem serverům. - No comment provided by engineer. - Upgrade and open chat Zvýšit a otevřít chat @@ -6509,6 +6602,10 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu Use the app while in the call. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Profil uživatele @@ -6518,11 +6615,6 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu User selection No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - Použití hostitelů .onion vyžaduje kompatibilního poskytovatele VPN. - No comment provided by engineer. - Using SimpleX Chat servers. Používat servery SimpleX Chat. @@ -6759,11 +6851,6 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu XFTP server No comment provided by engineer. - - XFTP servers - XFTP servery - No comment provided by engineer. - You Vy @@ -6874,6 +6961,10 @@ Repeat join request? Nyní můžete posílat zprávy %@ notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. Náhled oznámení na zamykací obrazovce můžete změnit v nastavení. @@ -6899,6 +6990,10 @@ Repeat join request? Chat můžete zahájit prostřednictvím aplikace Nastavení / Databáze nebo restartováním aplikace No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. Zámek SimpleX můžete zapnout v Nastavení. @@ -6937,11 +7032,6 @@ Repeat join request? Repeat connection request? No comment provided by engineer. - - You have no chats - Nemáte žádné konverzace - No comment provided by engineer. - You have to enter passphrase every time the app starts - it is not stored on the device. Musíte zadat přístupovou frázi při každém spuštění aplikace - není uložena v zařízení. @@ -6962,11 +7052,23 @@ Repeat connection request? Připojili jste se k této skupině. Připojení k pozvání člena skupiny. No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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. Nejnovější verzi databáze chatu musíte používat POUZE v jednom zařízení, jinak se může stát, že přestanete přijímat zprávy od některých kontaktů. No comment provided by engineer. + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Abyste mohli odesílat hlasové zprávy, musíte je povolit svému kontaktu. @@ -7080,13 +7182,6 @@ Repeat connection request? Vaše chat profily No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - K dokončení připojení, musí být váš kontakt online. -Toto připojení můžete zrušit a kontakt odebrat (a zkusit to později s novým odkazem). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Kontakt odeslal soubor, který je větší než aktuálně podporovaná maximální velikost (%@). @@ -7102,6 +7197,10 @@ Toto připojení můžete zrušit a kontakt odebrat (a zkusit to později s nov Vaše kontakty zůstanou připojeny. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Vaše aktuální chat databáze bude ODSTRANĚNA a NAHRAZENA importovanou. @@ -7270,6 +7369,10 @@ Servery SimpleX nevidí váš profil. tučně No comment provided by engineer. + + call + No comment provided by engineer. + call error chyba volání @@ -7632,6 +7735,10 @@ Servery SimpleX nevidí váš profil. pozvánka do skupiny %@ group name + + invite + No comment provided by engineer. + invited pozvánka @@ -7686,6 +7793,10 @@ Servery SimpleX nevidí váš profil. připojeno rcv group event chat item + + message + No comment provided by engineer. + message received zpráva přijata @@ -7716,6 +7827,10 @@ Servery SimpleX nevidí váš profil. měsíců time unit + + mute + No comment provided by engineer. + never nikdy @@ -7840,6 +7955,10 @@ Servery SimpleX nevidí váš profil. saved from %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec sek @@ -7907,14 +8026,18 @@ last received msg: %2$@ neznámý connection info - - unknown relays + + unknown servers No comment provided by engineer. unknown status No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected No comment provided by engineer. @@ -7957,6 +8080,10 @@ last received msg: %2$@ přes relé No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) videohovoru (nešifrovaného e2e) @@ -8199,10 +8326,6 @@ last received msg: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - No comment provided by engineer. - Error preparing file No comment provided by engineer. @@ -8227,10 +8350,6 @@ last received msg: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - No comment provided by engineer. - Keychain error No comment provided by engineer. @@ -8243,10 +8362,6 @@ last received msg: %2$@ No active profile No comment provided by engineer. - - No network connection - No comment provided by engineer. - Ok No comment provided by engineer. @@ -8271,14 +8386,22 @@ last received msg: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. Share No comment provided by engineer. + + Slow network? + No comment provided by engineer. + Unknown database error: %@ No comment provided by engineer. @@ -8287,6 +8410,10 @@ last received msg: %2$@ Unsupported format No comment provided by engineer. + + Wait + No comment provided by engineer. + Wrong database passphrase No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff index 95df9edf6d..394d3b23a7 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -392,6 +392,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -748,6 +753,10 @@ Erlauben Sie Anrufe nur dann, wenn es Ihr Kontakt ebenfalls erlaubt. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Erlauben Sie verschwindende Nachrichten nur dann, wenn es Ihr Kontakt ebenfalls erlaubt. @@ -785,6 +794,7 @@ Allow sharing + Teilen erlauben No comment provided by engineer. @@ -937,6 +947,10 @@ Archivieren und Hochladen No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database Datenbank wird archiviert @@ -1079,6 +1093,7 @@ Blur media + Medium unscharf machen No comment provided by engineer. @@ -1126,11 +1141,23 @@ Anrufe No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available Kamera nicht verfügbar No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Kontakt kann nicht eingeladen werden! @@ -1141,6 +1168,10 @@ Kontakte können nicht eingeladen werden! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Abbrechen @@ -1252,6 +1283,11 @@ Chat-Datenbank gelöscht No comment provided by engineer. + + Chat database exported + Chat-Datenbank wurde exportiert + No comment provided by engineer. + Chat database imported Chat-Datenbank importiert @@ -1397,6 +1433,10 @@ Zugangscode bestätigen No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Datenbank-Aktualisierungen bestätigen @@ -1452,6 +1492,10 @@ Mit dem Desktop verbinden No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? Mit Ihnen selbst verbinden? @@ -1526,6 +1570,10 @@ Das ist Ihr eigener Einmal-Link! Mit dem Server verbinden… (Fehler: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Mit dem Desktop verbinden @@ -1536,6 +1584,10 @@ Das ist Ihr eigener Einmal-Link! Verbindung No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Verbindungsfehler @@ -1548,6 +1600,7 @@ Das ist Ihr eigener Einmal-Link! Connection notifications + Verbindungsbenachrichtigungen No comment provided by engineer. @@ -1585,6 +1638,10 @@ Das ist Ihr eigener Einmal-Link! Der Kontakt ist bereits vorhanden No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Kontakt verborgen: @@ -1595,9 +1652,8 @@ Das ist Ihr eigener Einmal-Link! Mit Ihrem Kontakt verbunden notification - - Contact is not connected yet! - Ihr Kontakt ist noch nicht verbunden! + + Contact is deleted. No comment provided by engineer. @@ -1610,6 +1666,10 @@ Das ist Ihr eigener Einmal-Link! Kontakt-Präferenzen No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Kontakte @@ -1625,6 +1685,14 @@ Das ist Ihr eigener Einmal-Link! Weiter No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Kopieren @@ -1900,6 +1968,7 @@ Das ist Ihr eigener Einmal-Link! Delete %lld messages of members? + %lld Nachrichten der Mitglieder löschen? No comment provided by engineer. @@ -1907,11 +1976,6 @@ Das ist Ihr eigener Einmal-Link! %lld Nachrichten löschen? No comment provided by engineer. - - Delete Contact - Kontakt löschen - No comment provided by engineer. - Delete address Adresse löschen @@ -1967,11 +2031,8 @@ Das ist Ihr eigener Einmal-Link! Kontakt löschen No comment provided by engineer. - - Delete contact? -This cannot be undone! - Kontakt löschen? -Dies kann nicht rückgängig gemacht werden! + + Delete contact? No comment provided by engineer. @@ -2064,11 +2125,6 @@ Dies kann nicht rückgängig gemacht werden! Alte Datenbank löschen? No comment provided by engineer. - - Delete pending connection - Ausstehende Verbindung löschen - No comment provided by engineer. - Delete pending connection? Ausstehende Verbindung löschen? @@ -2084,11 +2140,19 @@ Dies kann nicht rückgängig gemacht werden! Lösche Warteschlange server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Benutzerprofil löschen? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted Gelöscht @@ -2104,6 +2168,10 @@ Dies kann nicht rückgängig gemacht werden! Gelöscht um: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors Fehler beim Löschen @@ -2146,6 +2214,7 @@ Dies kann nicht rückgängig gemacht werden! Destination server address of %@ is incompatible with forwarding server %@ settings. + Adresse des Zielservers von %@ ist nicht kompatibel mit den Einstellungen des Weiterleitungsservers %@. No comment provided by engineer. @@ -2155,6 +2224,7 @@ Dies kann nicht rückgängig gemacht werden! Destination server version of %@ is incompatible with forwarding server %@. + Die Version des Zielservers %@ ist nicht kompatibel mit dem Weiterleitungsserver %@. No comment provided by engineer. @@ -2172,6 +2242,10 @@ Dies kann nicht rückgängig gemacht werden! Entwicklung No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Entwicklertools @@ -2224,6 +2298,7 @@ Dies kann nicht rückgängig gemacht werden! Disabled + Deaktiviert No comment provided by engineer. @@ -2453,6 +2528,7 @@ Dies kann nicht rückgängig gemacht werden! Enabled + Aktiviert No comment provided by engineer. @@ -2627,6 +2703,7 @@ Dies kann nicht rückgängig gemacht werden! Error connecting to forwarding server %@. Please try later. + Fehler beim Verbinden mit dem Weiterleitungsserver %@. Bitte versuchen Sie es später erneut. No comment provided by engineer. @@ -2679,11 +2756,6 @@ Dies kann nicht rückgängig gemacht werden! Fehler beim Löschen der Verbindung No comment provided by engineer. - - Error deleting contact - Fehler beim Löschen des Kontakts - No comment provided by engineer. - Error deleting database Fehler beim Löschen der Datenbank @@ -2920,6 +2992,10 @@ Dies kann nicht rückgängig gemacht werden! Auch wenn sie im Chat deaktiviert sind. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Beenden ohne Speichern @@ -3137,14 +3213,17 @@ Dies kann nicht rückgängig gemacht werden! Forwarding server %@ failed to connect to destination server %@. Please try later. + Weiterleitungsserver %@ konnte sich nicht mit dem Zielserver %@ verbinden. Bitte versuchen Sie es später erneut. No comment provided by engineer. Forwarding server address is incompatible with network settings: %@. + Adresse des Weiterleitungsservers ist nicht kompatibel mit den Netzwerkeinstellungen: %@. No comment provided by engineer. Forwarding server version is incompatible with network settings: %@. + Version des Weiterleitungsservers ist nicht kompatibel mit den Netzwerkeinstellungen: %@. No comment provided by engineer. @@ -3729,6 +3808,10 @@ Fehler: %2$@ 3. Die Verbindung wurde kompromittiert. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Es sieht so aus, als ob Sie bereits über diesen Link verbunden sind. Wenn das nicht der Fall ist, gab es einen Fehler (%@). @@ -3791,6 +3874,10 @@ Das ist Ihr Link für die Gruppe %@! Behalten No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop Die App muss geöffnet bleiben, um sie vom Desktop aus nutzen zu können @@ -3966,8 +4053,14 @@ Das ist Ihr Link für die Gruppe %@! Max. 30 Sekunden, sofort erhalten. No comment provided by engineer. + + Media & file servers + Medien- und Datei-Server + No comment provided by engineer. + Medium + Medium blur media @@ -4055,14 +4148,9 @@ Das ist Ihr Link für die Gruppe %@! Nachrichtenempfang No comment provided by engineer. - - Message routing fallback - Fallback für das Nachrichten-Routing - No comment provided by engineer. - - - Message routing mode - Modus für das Nachrichten-Routing + + Message servers + Nachrichten-Server No comment provided by engineer. @@ -4190,6 +4278,10 @@ Das ist Ihr Link für die Gruppe %@! Moderieren chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Moderiert um @@ -4265,6 +4357,10 @@ Das ist Ihr Link für die Gruppe %@! Netzwerkstatus No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Neuer Zugangscode @@ -4397,6 +4493,7 @@ Das ist Ihr Link für die Gruppe %@! Nothing selected + Nichts ausgewählt No comment provided by engineer. @@ -4443,19 +4540,27 @@ Das ist Ihr Link für die Gruppe %@! Altes Datenbankarchiv No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Einmal-Einladungslink No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Für diese Verbindung werden Onion-Hosts benötigt. Dies erfordert die Aktivierung eines VPNs. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Für diese Verbindung werden Onion-Hosts benötigt. +Dies erfordert die Aktivierung eines VPNs. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Wenn Onion-Hosts verfügbar sind, werden sie verwendet. Dies erfordert die Aktivierung eines VPNs. + + Onion hosts will be used when available. +Requires compatible VPN. + Wenn Onion-Hosts verfügbar sind, werden sie verwendet. +Dies erfordert die Aktivierung eines VPNs. No comment provided by engineer. @@ -4468,6 +4573,10 @@ Das ist Ihr Link für die Gruppe %@! Nur die Endgeräte speichern die Benutzerprofile, Kontakte, Gruppen und Nachrichten, welche über eine **2-Schichten Ende-zu-Ende-Verschlüsselung** gesendet werden. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Gruppen-Präferenzen können nur von Gruppen-Eigentümern geändert werden. @@ -4703,6 +4812,10 @@ Das ist Ihr Link für die Gruppe %@! Bild-in-Bild-Anrufe No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Bitten Sie Ihren Kontakt darum, das Senden von Sprachnachrichten zu aktivieren. @@ -5004,6 +5117,10 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Bewerten Sie die App No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Reagiere… @@ -5344,11 +5461,6 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Aufdecken chat item action - - Revert - Zurückkehren - No comment provided by engineer. - Revoke Widerrufen @@ -5379,11 +5491,6 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. SMP-Server No comment provided by engineer. - - SMP servers - SMP-Server - No comment provided by engineer. - Safely receive files Dateien sicher empfangen @@ -5414,6 +5521,11 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Speichern und Gruppenmitglieder benachrichtigen No comment provided by engineer. + + Save and reconnect + Speichern und neu verbinden + No comment provided by engineer. + Save and update group profile Gruppen-Profil sichern und aktualisieren @@ -5576,6 +5688,7 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Selected %lld + %lld ausgewählt No comment provided by engineer. @@ -5618,11 +5731,6 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Empfangsbestätigungen senden an No comment provided by engineer. - - Send direct message - Direktnachricht senden - No comment provided by engineer. - Send direct message to connect Eine Direktnachricht zum Verbinden senden @@ -5648,6 +5756,10 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Live Nachricht senden No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. Nachrichten werden direkt versendet, wenn die IP-Adresse geschützt ist, und Ihr oder der Zielserver kein privates Routing unterstützt. @@ -5945,6 +6057,7 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Share to SimpleX + Mit SimpleX teilen No comment provided by engineer. @@ -6099,13 +6212,24 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Soft + Weich blur media + + Some file(s) were not exported: + Einzelne Datei(en) wurde(n) nicht exportiert: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Während des Imports sind einige nicht schwerwiegende Fehler aufgetreten - in der Chat-Konsole finden Sie weitere Einzelheiten. No comment provided by engineer. + + Some non-fatal errors occurred during import: + Während des Imports traten ein paar nicht schwerwiegende Fehler auf: + No comment provided by engineer. + Somebody Jemand @@ -6203,6 +6327,7 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Strong + Hart blur media @@ -6240,6 +6365,11 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. System-Authentifizierung No comment provided by engineer. + + TCP connection + TCP-Verbindung + No comment provided by engineer. + TCP connection timeout Timeout der TCP-Verbindung @@ -6300,11 +6430,6 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Zum Scannen tippen No comment provided by engineer. - - Tap to start a new chat - Zum Starten eines neuen Chats tippen - No comment provided by engineer. - Temporary file error Temporärer Datei-Fehler @@ -6414,10 +6539,12 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro The messages will be deleted for all members. + Die Nachrichten werden für alle Mitglieder gelöscht werden. No comment provided by engineer. The messages will be marked as moderated for all members. + Die Nachrichten werden für alle Mitglieder als moderiert gekennzeichnet werden. No comment provided by engineer. @@ -6779,11 +6906,6 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s Aktualisieren No comment provided by engineer. - - Update .onion hosts setting? - Einstellung für .onion-Hosts aktualisieren? - No comment provided by engineer. - Update database passphrase Datenbank-Passwort aktualisieren @@ -6794,9 +6916,9 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s Netzwerkeinstellungen aktualisieren? No comment provided by engineer. - - Update transport isolation mode? - Transport-Isolations-Modus aktualisieren? + + Update settings? + Einstellungen aktualisieren? No comment provided by engineer. @@ -6804,11 +6926,6 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s Die Aktualisierung der Einstellungen wird den Client wieder mit allen Servern verbinden. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - Die Aktualisierung dieser Einstellung wird den Client wieder mit allen Servern verbinden. - No comment provided by engineer. - Upgrade and open chat Aktualisieren und den Chat öffnen @@ -6909,6 +7026,10 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s Die App kann während eines Anrufs genutzt werden. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Benutzerprofil @@ -6919,11 +7040,6 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s Benutzer-Auswahl No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - Für die Nutzung von .onion-Hosts sind kompatible VPN-Anbieter erforderlich. - No comment provided by engineer. - Using SimpleX Chat servers. Verwendung von SimpleX-Chat-Servern. @@ -7184,11 +7300,6 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s XFTP-Server No comment provided by engineer. - - XFTP servers - XFTP-Server - No comment provided by engineer. - You Profil @@ -7311,6 +7422,10 @@ Verbindungsanfrage wiederholen? Sie können nun Nachrichten an %@ versenden notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. Über die Geräte-Einstellungen können Sie die Benachrichtigungsvorschau im Sperrbildschirm erlauben. @@ -7336,6 +7451,10 @@ Verbindungsanfrage wiederholen? Sie können den Chat über die App-Einstellungen / Datenbank oder durch Neustart der App starten No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. Sie können die SimpleX-Sperre über die Einstellungen aktivieren. @@ -7378,11 +7497,6 @@ Repeat connection request? Verbindungsanfrage wiederholen? No comment provided by engineer. - - You have no chats - Sie haben keine Chats - No comment provided by engineer. - You have to enter passphrase every time the app starts - it is not stored on the device. Sie müssen das Passwort jedes Mal eingeben, wenn die App startet. Es wird nicht auf dem Gerät gespeichert. @@ -7403,11 +7517,25 @@ Verbindungsanfrage wiederholen? Sie sind dieser Gruppe beigetreten. Sie werden mit dem einladenden Gruppenmitglied verbunden. No comment provided by engineer. + + You may migrate the exported database. + Sie können die exportierte Datenbank migrieren. + No comment provided by engineer. + + + You may save the exported archive. + Sie können das exportierte Archiv speichern. + 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. Sie dürfen die neueste Version Ihrer Chat-Datenbank NUR auf einem Gerät verwenden, andernfalls erhalten Sie möglicherweise keine Nachrichten mehr von einigen Ihrer Kontakte. No comment provided by engineer. + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Sie müssen Ihrem Kontakt das Senden von Sprachnachrichten erlauben, um diese senden zu können. @@ -7523,13 +7651,6 @@ Verbindungsanfrage wiederholen? Ihre Chat-Profile No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Damit die Verbindung hergestellt werden kann, muss Ihr Kontakt online sein. -Sie können diese Verbindung abbrechen und den Kontakt entfernen (und es später nochmals mit einem neuen Link versuchen). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Ihr Kontakt hat eine Datei gesendet, die größer ist als die derzeit unterstützte maximale Größe (%@). @@ -7545,6 +7666,10 @@ Sie können diese Verbindung abbrechen und den Kontakt entfernen (und es später Ihre Kontakte bleiben weiterhin verbunden. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Ihre aktuelle Chat-Datenbank wird GELÖSCHT und durch die Importierte ERSETZT. @@ -7722,6 +7847,10 @@ SimpleX-Server können Ihr Profil nicht einsehen. fett No comment provided by engineer. + + call + No comment provided by engineer. + call error Fehler bei Anruf @@ -8092,6 +8221,10 @@ SimpleX-Server können Ihr Profil nicht einsehen. Einladung zur Gruppe %@ group name + + invite + No comment provided by engineer. + invited eingeladen @@ -8147,6 +8280,10 @@ SimpleX-Server können Ihr Profil nicht einsehen. ist der Gruppe beigetreten rcv group event chat item + + message + No comment provided by engineer. + message received Nachricht empfangen @@ -8177,6 +8314,10 @@ SimpleX-Server können Ihr Profil nicht einsehen. Monate time unit + + mute + No comment provided by engineer. + never nie @@ -8309,6 +8450,10 @@ SimpleX-Server können Ihr Profil nicht einsehen. abgespeichert von %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec sek @@ -8383,8 +8528,8 @@ Zuletzt empfangene Nachricht: %2$@ Unbekannt connection info - - unknown relays + + unknown servers Unbekannte Relais No comment provided by engineer. @@ -8393,6 +8538,10 @@ Zuletzt empfangene Nachricht: %2$@ unbekannter Gruppenmitglieds-Status No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected Ungeschützt @@ -8438,6 +8587,10 @@ Zuletzt empfangene Nachricht: %2$@ über Relais No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) Videoanruf (nicht E2E verschlüsselt) @@ -8616,14 +8769,17 @@ Zuletzt empfangene Nachricht: %2$@ SimpleX SE + SimpleX SE Bundle display name SimpleX SE + SimpleX SE Bundle name Copyright © 2024 SimpleX Chat. All rights reserved. + Copyright © 2024 SimpleX Chat. Alle Rechte vorbehalten. Copyright (human-readable) @@ -8635,150 +8791,187 @@ Zuletzt empfangene Nachricht: %2$@ %@ + %@ No comment provided by engineer. App is locked! + Die App ist gesperrt! No comment provided by engineer. Cancel + Abbrechen No comment provided by engineer. Cannot access keychain to save database password + Es ist nicht möglich, auf den Schlüsselbund zuzugreifen, um das Datenbankpasswort zu speichern No comment provided by engineer. Cannot forward message + Nachricht kann nicht weitergeleitet werden No comment provided by engineer. Comment + Kommentieren No comment provided by engineer. Currently maximum supported file size is %@. + Die maximale erlaubte Dateigröße beträgt aktuell %@. No comment provided by engineer. Database downgrade required + Datenbank-Herabstufung erforderlich No comment provided by engineer. Database encrypted! + Datenbank verschlüsselt! No comment provided by engineer. Database error + Datenbankfehler No comment provided by engineer. Database passphrase is different from saved in the keychain. + Das Datenbank-Passwort unterscheidet sich vom im Schlüsselbund gespeicherten. No comment provided by engineer. Database passphrase is required to open chat. + Ein Datenbank-Passwort ist erforderlich, um den Chat zu öffnen. No comment provided by engineer. Database upgrade required - No comment provided by engineer. - - - Dismiss Sheet + Datenbank-Aktualisierung erforderlich No comment provided by engineer. Error preparing file + Fehler beim Vorbereiten der Datei No comment provided by engineer. Error preparing message + Fehler beim Vorbereiten der Nachricht No comment provided by engineer. Error: %@ + Fehler: %@ No comment provided by engineer. File error + Dateifehler No comment provided by engineer. Incompatible database version + Datenbank-Version nicht kompatibel No comment provided by engineer. Invalid migration confirmation - No comment provided by engineer. - - - Keep Trying + Migrations-Bestätigung ungültig No comment provided by engineer. Keychain error + Schlüsselbund-Fehler No comment provided by engineer. Large file! + Große Datei! No comment provided by engineer. No active profile - No comment provided by engineer. - - - No network connection + Kein aktives Profil No comment provided by engineer. Ok + OK No comment provided by engineer. Open the app to downgrade the database. + Öffne die App, um die Datenbank herabzustufen. No comment provided by engineer. Open the app to upgrade the database. + Öffne die App, um die Datenbank zu aktualisieren. No comment provided by engineer. Passphrase + Passwort No comment provided by engineer. Please create a profile in the SimpleX app + Bitte erstelle ein Profil in der SimpleX-App No comment provided by engineer. Selected chat preferences prohibit this message. + Diese Nachricht ist wegen der gewählten Chat-Einstellungen nicht erlaubt. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + Das Senden einer Nachricht dauert länger als erwartet. + No comment provided by engineer. + + + Sending message… + Nachricht wird gesendet… No comment provided by engineer. Share + Teilen + No comment provided by engineer. + + + Slow network? + Langsames Netzwerk? No comment provided by engineer. Unknown database error: %@ + Unbekannter Datenbankfehler: %@ No comment provided by engineer. Unsupported format + Nicht unterstütztes Format + No comment provided by engineer. + + + Wait + Warten No comment provided by engineer. Wrong database passphrase + Falsches Datenbank-Passwort No comment provided by engineer. You can allow sharing in Privacy & Security / SimpleX Lock settings. + Du kannst das Teilen in den Einstellungen zu Datenschutz & Sicherheit bzw. SimpleX-Sperre erlauben. No comment provided by engineer. 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 3fc3e6037b..66f17165b5 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -392,6 +392,13 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -748,6 +755,11 @@ Allow calls only if your contact allows them. No comment provided by engineer. + + Allow calls? + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Allow disappearing messages only if your contact allows it to you. @@ -938,6 +950,11 @@ Archive and upload No comment provided by engineer. + + Archived contacts + Archived contacts + No comment provided by engineer. + Archiving database Archiving database @@ -1128,11 +1145,26 @@ Calls No comment provided by engineer. + + Calls prohibited! + Calls prohibited! + No comment provided by engineer. + Camera not available Camera not available No comment provided by engineer. + + Can't call contact + Can't call contact + No comment provided by engineer. + + + Can't call member + Can't call member + No comment provided by engineer. + Can't invite contact! Can't invite contact! @@ -1143,6 +1175,11 @@ Can't invite contacts! No comment provided by engineer. + + Can't message member + Can't message member + No comment provided by engineer. + Cancel Cancel @@ -1254,6 +1291,11 @@ Chat database deleted No comment provided by engineer. + + Chat database exported + Chat database exported + No comment provided by engineer. + Chat database imported Chat database imported @@ -1399,6 +1441,11 @@ Confirm Passcode No comment provided by engineer. + + Confirm contact deletion? + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Confirm database upgrades @@ -1454,6 +1501,11 @@ Connect to desktop No comment provided by engineer. + + Connect to your friends faster + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? Connect to yourself? @@ -1528,6 +1580,11 @@ This is your own one-time link! Connecting to server… (error: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Connecting to desktop @@ -1538,6 +1595,11 @@ This is your own one-time link! Connection No comment provided by engineer. + + Connection and servers status. + Connection and servers status. + No comment provided by engineer. + Connection error Connection error @@ -1588,6 +1650,11 @@ This is your own one-time link! Contact already exists No comment provided by engineer. + + Contact deleted! + Contact deleted! + No comment provided by engineer. + Contact hidden: Contact hidden: @@ -1598,9 +1665,9 @@ This is your own one-time link! Contact is connected notification - - Contact is not connected yet! - Contact is not connected yet! + + Contact is deleted. + Contact is deleted. No comment provided by engineer. @@ -1613,6 +1680,11 @@ This is your own one-time link! Contact preferences No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Contacts @@ -1628,6 +1700,16 @@ This is your own one-time link! Continue No comment provided by engineer. + + Control your network + Control your network + No comment provided by engineer. + + + Conversation deleted! + Conversation deleted! + No comment provided by engineer. + Copy Copy @@ -1911,11 +1993,6 @@ This is your own one-time link! Delete %lld messages? No comment provided by engineer. - - Delete Contact - Delete Contact - No comment provided by engineer. - Delete address Delete address @@ -1971,11 +2048,9 @@ This is your own one-time link! Delete contact No comment provided by engineer. - - Delete contact? -This cannot be undone! - Delete contact? -This cannot be undone! + + Delete contact? + Delete contact? No comment provided by engineer. @@ -2068,11 +2143,6 @@ This cannot be undone! Delete old database? No comment provided by engineer. - - Delete pending connection - Delete pending connection - No comment provided by engineer. - Delete pending connection? Delete pending connection? @@ -2088,11 +2158,21 @@ This cannot be undone! Delete queue server test step + + Delete up to 20 messages at once. + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Delete user profile? No comment provided by engineer. + + Delete without notification + Delete without notification + No comment provided by engineer. + Deleted Deleted @@ -2108,6 +2188,11 @@ This cannot be undone! Deleted at: %@ copied message info + + Deleted chats + Deleted chats + No comment provided by engineer. + Deletion errors Deletion errors @@ -2178,6 +2263,11 @@ This cannot be undone! Develop No comment provided by engineer. + + Developer options + Developer options + No comment provided by engineer. + Developer tools Developer tools @@ -2688,11 +2778,6 @@ This cannot be undone! Error deleting connection No comment provided by engineer. - - Error deleting contact - Error deleting contact - No comment provided by engineer. - Error deleting database Error deleting database @@ -2929,6 +3014,11 @@ This cannot be undone! Even when disabled in the conversation. No comment provided by engineer. + + Even when they are offline. + Even when they are offline. + No comment provided by engineer. + Exit without saving Exit without saving @@ -3741,6 +3831,11 @@ Error: %2$@ 3. The connection was compromised. No comment provided by engineer. + + It protects your IP address and connections. + It protects your IP address and connections. + 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 (%@). @@ -3803,6 +3898,11 @@ This is your link for group %@! Keep No comment provided by engineer. + + Keep conversation + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop Keep the app open to use it from desktop @@ -3978,6 +4078,11 @@ This is your link for group %@! Max 30 seconds, received instantly. No comment provided by engineer. + + Media & file servers + Media & file servers + No comment provided by engineer. + Medium Medium @@ -4068,14 +4173,9 @@ This is your link for group %@! Message reception No comment provided by engineer. - - Message routing fallback - Message routing fallback - No comment provided by engineer. - - - Message routing mode - Message routing mode + + Message servers + Message servers No comment provided by engineer. @@ -4203,6 +4303,11 @@ This is your link for group %@! Moderate chat item action + + Moderate like a pro ✋ + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Moderated at @@ -4278,6 +4383,11 @@ This is your link for group %@! Network status No comment provided by engineer. + + New Chat + New Chat + No comment provided by engineer. + New Passcode New Passcode @@ -4457,19 +4567,28 @@ This is your link for group %@! Old database archive No comment provided by engineer. + + One-hand UI + One-hand UI + No comment provided by engineer. + One-time invitation link One-time invitation link No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Onion hosts will be required for connection. Requires enabling VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Onion hosts will be **required** for connection. +Requires compatible VPN. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Onion hosts will be used when available. Requires enabling VPN. + + Onion hosts will be used when available. +Requires compatible VPN. + Onion hosts will be used when available. +Requires compatible VPN. No comment provided by engineer. @@ -4482,6 +4601,11 @@ This is your link for group %@! Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**. No comment provided by engineer. + + Only delete conversation + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Only group owners can change group preferences. @@ -4717,6 +4841,11 @@ This is your link for group %@! Picture-in-picture calls No comment provided by engineer. + + Please ask your contact to enable calls. + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Please ask your contact to enable sending voice messages. @@ -5018,6 +5147,11 @@ Enable in *Network & servers* settings. Rate the app No comment provided by engineer. + + Reachable chat toolbar 👋 + Reachable chat toolbar 👋 + No comment provided by engineer. + React… React… @@ -5358,11 +5492,6 @@ Enable in *Network & servers* settings. Reveal chat item action - - Revert - Revert - No comment provided by engineer. - Revoke Revoke @@ -5393,11 +5522,6 @@ Enable in *Network & servers* settings. SMP server No comment provided by engineer. - - SMP servers - SMP servers - No comment provided by engineer. - Safely receive files Safely receive files @@ -5428,6 +5552,11 @@ Enable in *Network & servers* settings. Save and notify group members No comment provided by engineer. + + Save and reconnect + Save and reconnect + No comment provided by engineer. + Save and update group profile Save and update group profile @@ -5633,11 +5762,6 @@ Enable in *Network & servers* settings. Send delivery receipts to No comment provided by engineer. - - Send direct message - Send direct message - No comment provided by engineer. - Send direct message to connect Send direct message to connect @@ -5663,6 +5787,11 @@ Enable in *Network & servers* settings. Send live message No comment provided by engineer. + + Send message to enable calls. + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. Send messages directly when IP address is protected and your or destination server does not support private routing. @@ -6118,11 +6247,21 @@ Enable in *Network & servers* settings. Soft blur media + + Some file(s) were not exported: + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Some non-fatal errors occurred during import - you may see Chat console for more details. No comment provided by engineer. + + Some non-fatal errors occurred during import: + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody Somebody @@ -6258,6 +6397,11 @@ Enable in *Network & servers* settings. System authentication No comment provided by engineer. + + TCP connection + TCP connection + No comment provided by engineer. + TCP connection timeout TCP connection timeout @@ -6318,11 +6462,6 @@ Enable in *Network & servers* settings. Tap to scan No comment provided by engineer. - - Tap to start a new chat - Tap to start a new chat - No comment provided by engineer. - Temporary file error Temporary file error @@ -6799,11 +6938,6 @@ To connect, please ask your contact to create another connection link and check Update No comment provided by engineer. - - Update .onion hosts setting? - Update .onion hosts setting? - No comment provided by engineer. - Update database passphrase Update database passphrase @@ -6814,9 +6948,9 @@ To connect, please ask your contact to create another connection link and check Update network settings? No comment provided by engineer. - - Update transport isolation mode? - Update transport isolation mode? + + Update settings? + Update settings? No comment provided by engineer. @@ -6824,11 +6958,6 @@ To connect, please ask your contact to create another connection link and check Updating settings will re-connect the client to all servers. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - Updating this setting will re-connect the client to all servers. - No comment provided by engineer. - Upgrade and open chat Upgrade and open chat @@ -6929,6 +7058,11 @@ To connect, please ask your contact to create another connection link and check Use the app while in the call. No comment provided by engineer. + + Use the app with one hand. + Use the app with one hand. + No comment provided by engineer. + User profile User profile @@ -6939,11 +7073,6 @@ To connect, please ask your contact to create another connection link and check User selection No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - Using .onion hosts requires compatible VPN provider. - No comment provided by engineer. - Using SimpleX Chat servers. Using SimpleX Chat servers. @@ -7204,11 +7333,6 @@ To connect, please ask your contact to create another connection link and check XFTP server No comment provided by engineer. - - XFTP servers - XFTP servers - No comment provided by engineer. - You You @@ -7331,6 +7455,11 @@ Repeat join request? You can now chat with %@ notification body + + You can send messages to %@ from Archived contacts. + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. You can set lock screen notification preview via settings. @@ -7356,6 +7485,11 @@ Repeat join request? You can start chat via app Settings / Database or by restarting the app No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. You can turn on SimpleX Lock via Settings. @@ -7398,11 +7532,6 @@ Repeat connection request? Repeat connection request? No comment provided by engineer. - - You have no chats - 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. You have to enter passphrase every time the app starts - it is not stored on the device. @@ -7423,11 +7552,26 @@ Repeat connection request? You joined this group. Connecting to inviting group member. No comment provided by engineer. + + You may migrate the exported database. + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + You may save the exported archive. + 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. 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 need to allow your contact to call to be able to call them. + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. You need to allow your contact to send voice messages to be able to send them. @@ -7543,13 +7687,6 @@ Repeat connection request? Your chat profiles No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Your contact sent a file that is larger than currently supported maximum size (%@). @@ -7565,6 +7702,11 @@ You can cancel this connection and remove the contact (and try later with a new Your contacts will remain connected. No comment provided by engineer. + + Your contacts your way + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Your current chat database will be DELETED and REPLACED with the imported one. @@ -7742,6 +7884,11 @@ SimpleX servers cannot see your profile. bold No comment provided by engineer. + + call + call + No comment provided by engineer. + call error call error @@ -8112,6 +8259,11 @@ SimpleX servers cannot see your profile. invitation to group %@ group name + + invite + invite + No comment provided by engineer. + invited invited @@ -8167,6 +8319,11 @@ SimpleX servers cannot see your profile. connected rcv group event chat item + + message + message + No comment provided by engineer. + message received message received @@ -8197,6 +8354,11 @@ SimpleX servers cannot see your profile. months time unit + + mute + mute + No comment provided by engineer. + never never @@ -8329,6 +8491,11 @@ SimpleX servers cannot see your profile. saved from %@ No comment provided by engineer. + + search + search + No comment provided by engineer. + sec sec @@ -8403,9 +8570,9 @@ last received msg: %2$@ unknown connection info - - unknown relays - unknown relays + + unknown servers + unknown servers No comment provided by engineer. @@ -8413,6 +8580,11 @@ last received msg: %2$@ unknown status No comment provided by engineer. + + unmute + unmute + No comment provided by engineer. + unprotected unprotected @@ -8458,6 +8630,11 @@ last received msg: %2$@ via relay No comment provided by engineer. + + video + video + No comment provided by engineer. + video call (not e2e encrypted) video call (not e2e encrypted) @@ -8721,11 +8898,6 @@ last received msg: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - Dismiss Sheet - No comment provided by engineer. - Error preparing file Error preparing file @@ -8756,11 +8928,6 @@ last received msg: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - Keep Trying - No comment provided by engineer. - Keychain error Keychain error @@ -8776,11 +8943,6 @@ last received msg: %2$@ No active profile No comment provided by engineer. - - No network connection - No network connection - No comment provided by engineer. - Ok Ok @@ -8811,9 +8973,14 @@ last received msg: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File - Sending File + + Sending a message takes longer than expected. + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… + Sending message… No comment provided by engineer. @@ -8821,6 +8988,11 @@ last received msg: %2$@ Share No comment provided by engineer. + + Slow network? + Slow network? + No comment provided by engineer. + Unknown database error: %@ Unknown database error: %@ @@ -8831,6 +9003,11 @@ last received msg: %2$@ Unsupported format No comment provided by engineer. + + Wait + Wait + No comment provided by engineer. + Wrong database passphrase Wrong database passphrase diff --git a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff index 3e33bb5d39..0636082aa1 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -392,6 +392,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -748,6 +753,10 @@ Se permiten las llamadas pero sólo si tu contacto también las permite. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Se permiten los mensajes temporales pero sólo si tu contacto también los permite para tí. @@ -937,6 +946,10 @@ Archivar y subir No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database Archivando base de datos @@ -1126,11 +1139,23 @@ Llamadas No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available Cámara no disponible No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! ¡No se puede invitar el contacto! @@ -1141,6 +1166,10 @@ ¡No se pueden invitar contactos! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Cancelar @@ -1252,6 +1281,10 @@ Base de datos eliminada No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported Base de datos importada @@ -1397,6 +1430,10 @@ Confirma Código No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Confirmar actualizaciones de la bases de datos @@ -1452,6 +1489,10 @@ Conectar con ordenador No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? ¿Conectarte a tí mismo? @@ -1526,6 +1567,10 @@ This is your own one-time link! Conectando con el servidor... (error: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Conectando con ordenador @@ -1536,6 +1581,10 @@ This is your own one-time link! Conexión No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Error conexión @@ -1585,6 +1634,10 @@ This is your own one-time link! El contácto ya existe No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Contacto oculto: @@ -1595,9 +1648,8 @@ This is your own one-time link! El contacto está en línea notification - - Contact is not connected yet! - ¡El contacto aun no se ha conectado! + + Contact is deleted. No comment provided by engineer. @@ -1610,6 +1662,10 @@ This is your own one-time link! Preferencias de contacto No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Contactos @@ -1625,6 +1681,14 @@ This is your own one-time link! Continuar No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Copiar @@ -1907,11 +1971,6 @@ This is your own one-time link! ¿Elimina %lld mensajes? No comment provided by engineer. - - Delete Contact - Eliminar contacto - No comment provided by engineer. - Delete address Eliminar dirección @@ -1967,11 +2026,8 @@ This is your own one-time link! Eliminar contacto No comment provided by engineer. - - Delete contact? -This cannot be undone! - ¿Eliminar contacto? -¡No podrá deshacerse! + + Delete contact? No comment provided by engineer. @@ -2064,11 +2120,6 @@ This cannot be undone! ¿Eliminar base de datos antigua? No comment provided by engineer. - - Delete pending connection - Eliminar conexión pendiente - No comment provided by engineer. - Delete pending connection? ¿Eliminar conexión pendiente? @@ -2084,11 +2135,19 @@ This cannot be undone! Eliminar cola server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? ¿Eliminar perfil de usuario? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted Eliminado @@ -2104,6 +2163,10 @@ This cannot be undone! Eliminado: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors Errores de borrado @@ -2172,6 +2235,10 @@ This cannot be undone! Desarrollo No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Herramientas desarrollo @@ -2679,11 +2746,6 @@ This cannot be undone! Error al eliminar conexión No comment provided by engineer. - - Error deleting contact - Error al eliminar contacto - No comment provided by engineer. - Error deleting database Error al eliminar base de datos @@ -2920,6 +2982,10 @@ This cannot be undone! Incluso si está desactivado para la conversación. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Salir sin guardar @@ -3729,6 +3795,10 @@ Error: %2$@ 3. La conexión ha sido comprometida. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Parece que ya estás conectado mediante este enlace. Si no es así ha habido un error (%@). @@ -3791,6 +3861,10 @@ This is your link for group %@! Guardar No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop Mantén la aplicación abierta para usarla desde el ordenador @@ -3966,6 +4040,10 @@ This is your link for group %@! Máximo 30 segundos, recibido al instante. No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium blur media @@ -4055,14 +4133,8 @@ This is your link for group %@! Recepción de mensaje No comment provided by engineer. - - Message routing fallback - Enrutamiento de mensajes alternativo - No comment provided by engineer. - - - Message routing mode - Modo de enrutamiento de mensajes + + Message servers No comment provided by engineer. @@ -4190,6 +4262,10 @@ This is your link for group %@! Moderar chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Moderado @@ -4265,6 +4341,10 @@ This is your link for group %@! Estado de la red No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Código Nuevo @@ -4443,19 +4523,27 @@ This is your link for group %@! Archivo de bases de datos antiguas No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Enlace de invitación de un solo uso No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Se requieren hosts .onion para la conexión. Requiere activación de la VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Se **requieren** hosts .onion para la conexión. +Requiere activación de la VPN. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Se usarán hosts .onion si están disponibles. Requiere activación de la VPN. + + Onion hosts will be used when available. +Requires compatible VPN. + Se usarán hosts .onion si están disponibles. +Requiere activación de la VPN. No comment provided by engineer. @@ -4468,6 +4556,10 @@ This is your link for group %@! Sólo los dispositivos cliente almacenan perfiles de usuario, contactos, grupos y mensajes enviados con **cifrado de extremo a extremo de 2 capas**. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Sólo los propietarios pueden modificar las preferencias del grupo. @@ -4703,6 +4795,10 @@ This is your link for group %@! Llamadas picture-in-picture No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Solicita que tu contacto habilite el envío de mensajes de voz. @@ -5004,6 +5100,10 @@ Actívalo en ajustes de *Servidores y Redes*. Valora la aplicación No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Reacciona… @@ -5344,11 +5444,6 @@ Actívalo en ajustes de *Servidores y Redes*. Revelar chat item action - - Revert - Revertir - No comment provided by engineer. - Revoke Revocar @@ -5379,11 +5474,6 @@ Actívalo en ajustes de *Servidores y Redes*. Servidor SMP No comment provided by engineer. - - SMP servers - Servidores SMP - No comment provided by engineer. - Safely receive files Recibe archivos de forma segura @@ -5414,6 +5504,10 @@ Actívalo en ajustes de *Servidores y Redes*. Guardar y notificar grupo No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile Guardar y actualizar perfil del grupo @@ -5618,11 +5712,6 @@ Actívalo en ajustes de *Servidores y Redes*. Enviar confirmaciones de entrega a No comment provided by engineer. - - Send direct message - Enviar mensaje directo - No comment provided by engineer. - Send direct message to connect Envia un mensaje para conectar @@ -5648,6 +5737,10 @@ Actívalo en ajustes de *Servidores y Redes*. Mensaje en vivo No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. Enviar mensajes directamente cuando tu dirección IP está protegida y tu servidor o el de destino no admitan enrutamiento privado. @@ -6101,11 +6194,19 @@ Actívalo en ajustes de *Servidores y Redes*. Soft blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Algunos errores no críticos ocurrieron durante la importación - para más detalles puedes ver la consola de Chat. No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody Alguien @@ -6240,6 +6341,10 @@ Actívalo en ajustes de *Servidores y Redes*. Autenticación del sistema No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout Timeout de la conexión TCP @@ -6300,11 +6405,6 @@ Actívalo en ajustes de *Servidores y Redes*. Pulsa para escanear No comment provided by engineer. - - Tap to start a new chat - Pulsa para iniciar chat nuevo - No comment provided by engineer. - Temporary file error Error en archivo temporal @@ -6779,11 +6879,6 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión Actualizar No comment provided by engineer. - - Update .onion hosts setting? - ¿Actualizar la configuración de los hosts .onion? - No comment provided by engineer. - Update database passphrase Actualizar contraseña de la base de datos @@ -6794,9 +6889,8 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión ¿Actualizar la configuración de red? No comment provided by engineer. - - Update transport isolation mode? - ¿Actualizar el modo de aislamiento de transporte? + + Update settings? No comment provided by engineer. @@ -6804,11 +6898,6 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión Al actualizar la configuración el cliente se reconectará a todos los servidores. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - Al actualizar esta configuración el cliente se reconectará a todos los servidores. - No comment provided by engineer. - Upgrade and open chat Actualizar y abrir Chat @@ -6909,6 +6998,10 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión Usar la aplicación durante la llamada. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Perfil de usuario @@ -6919,11 +7012,6 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión Selección de usuarios No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - Usar hosts .onion requiere un proveedor VPN compatible. - No comment provided by engineer. - Using SimpleX Chat servers. Usar servidores SimpleX Chat. @@ -7184,11 +7272,6 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión Servidor XFTP No comment provided by engineer. - - XFTP servers - Servidores XFTP - No comment provided by engineer. - You @@ -7311,6 +7394,10 @@ Repeat join request? Ya puedes chatear con %@ notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. Puedes configurar las notificaciones de la pantalla de bloqueo desde Configuración. @@ -7336,6 +7423,10 @@ Repeat join request? Puede iniciar Chat a través de la Configuración / Base de datos de la aplicación o reiniciando la aplicación No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. Puedes activar el Bloqueo SimpleX a través de Configuración. @@ -7378,11 +7469,6 @@ Repeat connection request? ¿Repetir solicitud? No comment provided by engineer. - - You have no chats - No tienes chats - No comment provided by engineer. - You have to enter passphrase every time the app starts - it is not stored on the device. La contraseña no se almacena en el dispositivo, tienes que introducirla cada vez que inicies la aplicación. @@ -7403,11 +7489,23 @@ Repeat connection request? Te has unido a este grupo. Conectando con el emisor de la invitacíon. No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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. Debes usar la versión más reciente de tu base de datos ÚNICAMENTE en un dispositivo, de lo contrario podrías dejar de recibir mensajes de algunos contactos. No comment provided by engineer. + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Para poder enviar mensajes de voz antes debes permitir que tu contacto pueda enviarlos. @@ -7523,13 +7621,6 @@ Repeat connection request? Mis perfiles No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - El contacto debe estar en línea para completar la conexión. -Puedes cancelarla y eliminar el contacto (e intentarlo más tarde con un enlace nuevo). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). El contacto ha enviado un archivo mayor al máximo admitido (%@). @@ -7545,6 +7636,10 @@ Puedes cancelarla y eliminar el contacto (e intentarlo más tarde con un enlace Tus contactos permanecerán conectados. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. La base de datos actual será ELIMINADA y SUSTITUIDA por la importada. @@ -7722,6 +7817,10 @@ Los servidores SimpleX no pueden ver tu perfil. negrita No comment provided by engineer. + + call + No comment provided by engineer. + call error error en llamada @@ -8092,6 +8191,10 @@ Los servidores SimpleX no pueden ver tu perfil. invitación al grupo %@ group name + + invite + No comment provided by engineer. + invited ha sido invitado @@ -8147,6 +8250,10 @@ Los servidores SimpleX no pueden ver tu perfil. conectado rcv group event chat item + + message + No comment provided by engineer. + message received mensaje recibido @@ -8177,6 +8284,10 @@ Los servidores SimpleX no pueden ver tu perfil. meses time unit + + mute + No comment provided by engineer. + never nunca @@ -8309,6 +8420,10 @@ Los servidores SimpleX no pueden ver tu perfil. Guardado desde %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec seg @@ -8383,8 +8498,8 @@ last received msg: %2$@ desconocido connection info - - unknown relays + + unknown servers con servidores desconocidos No comment provided by engineer. @@ -8393,6 +8508,10 @@ last received msg: %2$@ estado desconocido No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected con IP desprotegida @@ -8438,6 +8557,10 @@ last received msg: %2$@ mediante retransmisor No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) videollamada (sin cifrar) @@ -8685,10 +8808,6 @@ last received msg: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - No comment provided by engineer. - Error preparing file No comment provided by engineer. @@ -8713,10 +8832,6 @@ last received msg: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - No comment provided by engineer. - Keychain error No comment provided by engineer. @@ -8729,10 +8844,6 @@ last received msg: %2$@ No active profile No comment provided by engineer. - - No network connection - No comment provided by engineer. - Ok No comment provided by engineer. @@ -8757,14 +8868,22 @@ last received msg: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. Share No comment provided by engineer. + + Slow network? + No comment provided by engineer. + Unknown database error: %@ No comment provided by engineer. @@ -8773,6 +8892,10 @@ last received msg: %2$@ Unsupported format No comment provided by engineer. + + Wait + No comment provided by engineer. + Wrong database passphrase No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff index 5b6a1fab80..a980b93a79 100644 --- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff +++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff @@ -376,6 +376,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -710,6 +715,10 @@ Salli puhelut vain, jos kontaktisi sallii ne. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Salli katoavat viestit vain, jos kontaktisi sallii sen sinulle. @@ -889,6 +898,10 @@ Archive and upload No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database No comment provided by engineer. @@ -1065,10 +1078,22 @@ Puhelut No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Kontaktia ei voi kutsua! @@ -1079,6 +1104,10 @@ Kontakteja ei voi kutsua! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Peruuta @@ -1185,6 +1214,10 @@ Chat-tietokanta poistettu No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported Chat-tietokanta tuotu @@ -1319,6 +1352,10 @@ Vahvista pääsykoodi No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Vahvista tietokannan päivitykset @@ -1368,6 +1405,10 @@ Connect to desktop No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? No comment provided by engineer. @@ -1430,6 +1471,10 @@ This is your own one-time link! Yhteyden muodostaminen palvelimeen... (virhe: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop No comment provided by engineer. @@ -1439,6 +1484,10 @@ This is your own one-time link! Yhteys No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Yhteysvirhe @@ -1485,6 +1534,10 @@ This is your own one-time link! Kontakti on jo olemassa No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Kontakti piilotettu: @@ -1495,9 +1548,8 @@ This is your own one-time link! Kontakti on yhdistetty notification - - Contact is not connected yet! - Kontaktia ei ole vielä yhdistetty! + + Contact is deleted. No comment provided by engineer. @@ -1510,6 +1562,10 @@ This is your own one-time link! Kontaktin asetukset No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Kontaktit @@ -1525,6 +1581,14 @@ This is your own one-time link! Jatka No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Kopioi @@ -1792,11 +1856,6 @@ This is your own one-time link! Delete %lld messages? No comment provided by engineer. - - Delete Contact - Poista kontakti - No comment provided by engineer. - Delete address Poista osoite @@ -1851,9 +1910,8 @@ This is your own one-time link! Poista kontakti No comment provided by engineer. - - Delete contact? -This cannot be undone! + + Delete contact? No comment provided by engineer. @@ -1945,11 +2003,6 @@ This cannot be undone! Poista vanha tietokanta? No comment provided by engineer. - - Delete pending connection - Poista vireillä oleva yhteys - No comment provided by engineer. - Delete pending connection? Poistetaanko odottava yhteys? @@ -1965,11 +2018,19 @@ This cannot be undone! Poista jono server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Poista käyttäjäprofiili? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted No comment provided by engineer. @@ -1984,6 +2045,10 @@ This cannot be undone! Poistettu klo: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors No comment provided by engineer. @@ -2045,6 +2110,10 @@ This cannot be undone! Kehitä No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Kehittäjätyökalut @@ -2527,11 +2596,6 @@ This cannot be undone! Virhe yhteyden poistamisessa No comment provided by engineer. - - Error deleting contact - Virhe kontaktin poistamisessa - No comment provided by engineer. - Error deleting database Virhe tietokannan poistamisessa @@ -2756,6 +2820,10 @@ This cannot be undone! Jopa kun ei käytössä keskustelussa. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Poistu tallentamatta @@ -3520,6 +3588,10 @@ Error: %2$@ 3. Yhteys vaarantui. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Näyttäisi, että olet jo yhteydessä tämän linkin kautta. Jos näin ei ole, tapahtui virhe (%@). @@ -3576,6 +3648,10 @@ This is your link for group %@! Keep No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. @@ -3746,6 +3822,10 @@ This is your link for group %@! Enintään 30 sekuntia, vastaanotetaan välittömästi. No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium blur media @@ -3828,12 +3908,8 @@ This is your link for group %@! Message reception No comment provided by engineer. - - Message routing fallback - No comment provided by engineer. - - - Message routing mode + + Message servers No comment provided by engineer. @@ -3945,6 +4021,10 @@ This is your link for group %@! Moderoi chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Moderoitu klo @@ -4016,6 +4096,10 @@ This is your link for group %@! Verkon tila No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Uusi pääsykoodi @@ -4187,19 +4271,27 @@ This is your link for group %@! Vanha tietokanta-arkisto No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Kertakutsulinkki No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Yhteyden muodostamiseen tarvitaan Onion-isäntiä. Edellyttää VPN:n sallimista. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Yhteyden muodostamiseen tarvitaan Onion-isäntiä. +Edellyttää VPN:n sallimista. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Onion-isäntiä käytetään, kun niitä on saatavilla. Edellyttää VPN:n sallimista. + + Onion hosts will be used when available. +Requires compatible VPN. + Onion-isäntiä käytetään, kun niitä on saatavilla. +Edellyttää VPN:n sallimista. No comment provided by engineer. @@ -4212,6 +4304,10 @@ This is your link for group %@! Vain asiakaslaitteet tallentavat käyttäjäprofiileja, yhteystietoja, ryhmiä ja viestejä, jotka on lähetetty **kaksinkertaisella päästä päähän -salauksella**. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Vain ryhmän omistajat voivat muuttaa ryhmän asetuksia. @@ -4430,6 +4526,10 @@ This is your link for group %@! Picture-in-picture calls No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Pyydä kontaktiasi sallimaan ääniviestien lähettäminen. @@ -4708,6 +4808,10 @@ Enable in *Network & servers* settings. Arvioi sovellus No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Reagoi… @@ -5025,11 +5129,6 @@ Enable in *Network & servers* settings. Paljasta chat item action - - Revert - Palauta - No comment provided by engineer. - Revoke Peruuta @@ -5059,11 +5158,6 @@ Enable in *Network & servers* settings. SMP server No comment provided by engineer. - - SMP servers - SMP-palvelimet - No comment provided by engineer. - Safely receive files No comment provided by engineer. @@ -5092,6 +5186,10 @@ Enable in *Network & servers* settings. Tallenna ja ilmoita ryhmän jäsenille No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile Tallenna ja päivitä ryhmäprofiili @@ -5285,11 +5383,6 @@ Enable in *Network & servers* settings. Lähetä toimituskuittaukset vastaanottajalle No comment provided by engineer. - - Send direct message - Lähetä yksityisviesti - No comment provided by engineer. - Send direct message to connect No comment provided by engineer. @@ -5313,6 +5406,10 @@ Enable in *Network & servers* settings. Lähetä live-viesti No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. No comment provided by engineer. @@ -5736,11 +5833,19 @@ Enable in *Network & servers* settings. Soft blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Tuonnin aikana tapahtui joitakin ei-vakavia virheitä – saatat nähdä Chat-konsolissa lisätietoja. No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody Joku @@ -5866,6 +5971,10 @@ Enable in *Network & servers* settings. Järjestelmän todennus No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout TCP-yhteyden aikakatkaisu @@ -5923,11 +6032,6 @@ Enable in *Network & servers* settings. Tap to scan No comment provided by engineer. - - Tap to start a new chat - Aloita uusi keskustelu napauttamalla - No comment provided by engineer. - Temporary file error No comment provided by engineer. @@ -6374,11 +6478,6 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja Päivitä No comment provided by engineer. - - Update .onion hosts setting? - Päivitä .onion-isäntien asetus? - No comment provided by engineer. - Update database passphrase Päivitä tietokannan tunnuslause @@ -6389,9 +6488,8 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja Päivitä verkkoasetukset? No comment provided by engineer. - - Update transport isolation mode? - Päivitä kuljetuksen eristystila? + + Update settings? No comment provided by engineer. @@ -6399,11 +6497,6 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja Asetusten päivittäminen yhdistää asiakkaan uudelleen kaikkiin palvelimiin. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - Tämän asetuksen päivittäminen yhdistää asiakkaan uudelleen kaikkiin palvelimiin. - No comment provided by engineer. - Upgrade and open chat Päivitä ja avaa keskustelu @@ -6494,6 +6587,10 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja Use the app while in the call. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Käyttäjäprofiili @@ -6503,11 +6600,6 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja User selection No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - .onion-isäntien käyttäminen vaatii yhteensopivan VPN-palveluntarjoajan. - No comment provided by engineer. - Using SimpleX Chat servers. Käyttää SimpleX Chat -palvelimia. @@ -6744,11 +6836,6 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja XFTP server No comment provided by engineer. - - XFTP servers - XFTP-palvelimet - No comment provided by engineer. - You Sinä @@ -6859,6 +6946,10 @@ Repeat join request? Voit nyt lähettää viestejä %@:lle notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. Voit määrittää lukitusnäytön ilmoituksen esikatselun asetuksista. @@ -6884,6 +6975,10 @@ Repeat join request? Voit aloittaa keskustelun sovelluksen Asetukset / Tietokanta kautta tai käynnistämällä sovelluksen uudelleen No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. Voit ottaa SimpleX Lockin käyttöön Asetusten kautta. @@ -6922,11 +7017,6 @@ Repeat join request? Repeat connection request? No comment provided by engineer. - - You have no chats - Sinulla ei ole keskusteluja - No comment provided by engineer. - You have to enter passphrase every time the app starts - it is not stored on the device. Sinun on annettava tunnuslause aina, kun sovellus käynnistyy - sitä ei tallenneta laitteeseen. @@ -6947,11 +7037,23 @@ Repeat connection request? Liityit tähän ryhmään. Muodostetaan yhteyttä ryhmän jäsenten kutsumiseksi. No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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. Sinun tulee käyttää keskustelujen-tietokannan uusinta versiota AINOSTAAN yhdessä laitteessa, muuten saatat lakata vastaanottamasta viestejä joiltakin kontakteilta. No comment provided by engineer. + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Sinun on sallittava kontaktiesi lähettää ääniviestejä, jotta voit lähettää niitä. @@ -7065,13 +7167,6 @@ Repeat connection request? Keskusteluprofiilisi No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Kontaktin tulee olla online-tilassa, jotta yhteys voidaan muodostaa. -Voit peruuttaa tämän yhteyden ja poistaa kontaktin (ja yrittää myöhemmin uudella linkillä). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Yhteyshenkilösi lähetti tiedoston, joka on suurempi kuin tällä hetkellä tuettu enimmäiskoko (%@). @@ -7087,6 +7182,10 @@ Voit peruuttaa tämän yhteyden ja poistaa kontaktin (ja yrittää myöhemmin uu Kontaktisi pysyvät yhdistettyinä. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Nykyinen keskustelut-tietokantasi poistetaan ja korvataan tuodulla tietokannalla. @@ -7255,6 +7354,10 @@ SimpleX-palvelimet eivät näe profiiliasi. lihavoitu No comment provided by engineer. + + call + No comment provided by engineer. + call error soittovirhe @@ -7617,6 +7720,10 @@ SimpleX-palvelimet eivät näe profiiliasi. kutsu ryhmään %@ group name + + invite + No comment provided by engineer. + invited kutsuttu @@ -7671,6 +7778,10 @@ SimpleX-palvelimet eivät näe profiiliasi. yhdistetty rcv group event chat item + + message + No comment provided by engineer. + message received viesti vastaanotettu @@ -7701,6 +7812,10 @@ SimpleX-palvelimet eivät näe profiiliasi. kuukautta time unit + + mute + No comment provided by engineer. + never ei koskaan @@ -7825,6 +7940,10 @@ SimpleX-palvelimet eivät näe profiiliasi. saved from %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec sek @@ -7891,14 +8010,18 @@ last received msg: %2$@ tuntematon connection info - - unknown relays + + unknown servers No comment provided by engineer. unknown status No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected No comment provided by engineer. @@ -7941,6 +8064,10 @@ last received msg: %2$@ releellä No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) videopuhelu (ei e2e-salattu) @@ -8183,10 +8310,6 @@ last received msg: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - No comment provided by engineer. - Error preparing file No comment provided by engineer. @@ -8211,10 +8334,6 @@ last received msg: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - No comment provided by engineer. - Keychain error No comment provided by engineer. @@ -8227,10 +8346,6 @@ last received msg: %2$@ No active profile No comment provided by engineer. - - No network connection - No comment provided by engineer. - Ok No comment provided by engineer. @@ -8255,14 +8370,22 @@ last received msg: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. Share No comment provided by engineer. + + Slow network? + No comment provided by engineer. + Unknown database error: %@ No comment provided by engineer. @@ -8271,6 +8394,10 @@ last received msg: %2$@ Unsupported format No comment provided by engineer. + + Wait + No comment provided by engineer. + Wrong database passphrase No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff index e3c45aeebf..82eb9384e9 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -392,6 +392,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -748,6 +753,10 @@ Autoriser les appels que si votre contact les autorise. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Autorise les messages éphémères seulement si votre contact vous l’autorise. @@ -785,6 +794,7 @@ Allow sharing + Autoriser le partage No comment provided by engineer. @@ -937,6 +947,10 @@ Archiver et transférer No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database Archivage de la base de données @@ -1079,6 +1093,7 @@ Blur media + Flouter les médias No comment provided by engineer. @@ -1126,11 +1141,23 @@ Appels No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available Caméra non disponible No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Impossible d'inviter le contact ! @@ -1141,6 +1168,10 @@ Impossible d'inviter les contacts ! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Annuler @@ -1252,6 +1283,10 @@ Base de données du chat supprimée No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported Base de données du chat importée @@ -1397,6 +1432,10 @@ Confirmer le code d'accès No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Confirmer la mise à niveau de la base de données @@ -1452,6 +1491,10 @@ Connexion au bureau No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? Se connecter à soi-même ? @@ -1526,6 +1569,10 @@ Il s'agit de votre propre lien unique ! Connexion au serveur… (erreur : %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Connexion au bureau @@ -1536,6 +1583,10 @@ Il s'agit de votre propre lien unique ! Connexion No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Erreur de connexion @@ -1548,6 +1599,7 @@ Il s'agit de votre propre lien unique ! Connection notifications + Notifications de connexion No comment provided by engineer. @@ -1585,6 +1637,10 @@ Il s'agit de votre propre lien unique ! Contact déjà existant No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Contact masqué : @@ -1595,9 +1651,8 @@ Il s'agit de votre propre lien unique ! Le contact est connecté notification - - Contact is not connected yet! - Le contact n'est pas encore connecté ! + + Contact is deleted. No comment provided by engineer. @@ -1610,6 +1665,10 @@ Il s'agit de votre propre lien unique ! Préférences de contact No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Contacts @@ -1625,6 +1684,14 @@ Il s'agit de votre propre lien unique ! Continuer No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Copier @@ -1900,6 +1967,7 @@ Il s'agit de votre propre lien unique ! Delete %lld messages of members? + Supprimer %lld messages de membres ? No comment provided by engineer. @@ -1907,11 +1975,6 @@ Il s'agit de votre propre lien unique ! Supprimer %lld messages ? No comment provided by engineer. - - Delete Contact - Supprimer le contact - No comment provided by engineer. - Delete address Supprimer l'adresse @@ -1967,11 +2030,8 @@ Il s'agit de votre propre lien unique ! Supprimer le contact No comment provided by engineer. - - Delete contact? -This cannot be undone! - Supprimer le contact ? -Cette opération ne peut être annulée ! + + Delete contact? No comment provided by engineer. @@ -2064,11 +2124,6 @@ Cette opération ne peut être annulée ! Supprimer l'ancienne base de données ? No comment provided by engineer. - - Delete pending connection - Supprimer la connexion en attente - No comment provided by engineer. - Delete pending connection? Supprimer la connexion en attente ? @@ -2084,11 +2139,19 @@ Cette opération ne peut être annulée ! Supprimer la file d'attente server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Supprimer le profil utilisateur ? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted Supprimé @@ -2104,6 +2167,10 @@ Cette opération ne peut être annulée ! Supprimé à : %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors Erreurs de suppression @@ -2146,6 +2213,7 @@ Cette opération ne peut être annulée ! Destination server address of %@ is incompatible with forwarding server %@ settings. + L'adresse du serveur de destination %@ est incompatible avec les paramètres du serveur de redirection %@. No comment provided by engineer. @@ -2155,6 +2223,7 @@ Cette opération ne peut être annulée ! Destination server version of %@ is incompatible with forwarding server %@. + La version du serveur de destination %@ est incompatible avec le serveur de redirection %@. No comment provided by engineer. @@ -2172,6 +2241,10 @@ Cette opération ne peut être annulée ! Développer No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Outils du développeur @@ -2224,6 +2297,7 @@ Cette opération ne peut être annulée ! Disabled + Désactivé No comment provided by engineer. @@ -2453,6 +2527,7 @@ Cette opération ne peut être annulée ! Enabled + Activé No comment provided by engineer. @@ -2627,6 +2702,7 @@ Cette opération ne peut être annulée ! Error connecting to forwarding server %@. Please try later. + Erreur de connexion au serveur de redirection %@. Veuillez réessayer plus tard. No comment provided by engineer. @@ -2679,11 +2755,6 @@ Cette opération ne peut être annulée ! Erreur lors de la suppression de la connexion No comment provided by engineer. - - Error deleting contact - Erreur lors de la suppression du contact - No comment provided by engineer. - Error deleting database Erreur lors de la suppression de la base de données @@ -2920,6 +2991,10 @@ Cette opération ne peut être annulée ! Même s'il est désactivé dans la conversation. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Quitter sans enregistrer @@ -3137,14 +3212,17 @@ Cette opération ne peut être annulée ! Forwarding server %@ failed to connect to destination server %@. Please try later. + Le serveur de redirection %@ n'a pas réussi à se connecter au serveur de destination %@. Veuillez réessayer plus tard. No comment provided by engineer. Forwarding server address is incompatible with network settings: %@. + L'adresse du serveur de redirection est incompatible avec les paramètres du réseau : %@. No comment provided by engineer. Forwarding server version is incompatible with network settings: %@. + La version du serveur de redirection est incompatible avec les paramètres du réseau : %@. No comment provided by engineer. @@ -3729,6 +3807,10 @@ Erreur : %2$@ 3. La connexion a été compromise. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Il semblerait que vous êtes déjà connecté via ce lien. Si ce n'est pas le cas, il y a eu une erreur (%@). @@ -3791,6 +3873,10 @@ Voici votre lien pour le groupe %@ ! Conserver No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop Garder l'application ouverte pour l'utiliser depuis le bureau @@ -3966,8 +4052,13 @@ Voici votre lien pour le groupe %@ ! Max 30 secondes, réception immédiate. No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium + Modéré blur media @@ -4055,14 +4146,8 @@ Voici votre lien pour le groupe %@ ! Réception de message No comment provided by engineer. - - Message routing fallback - Rabattement du routage des messages - No comment provided by engineer. - - - Message routing mode - Mode de routage des messages + + Message servers No comment provided by engineer. @@ -4190,6 +4275,10 @@ Voici votre lien pour le groupe %@ ! Modérer chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Modéré à @@ -4265,6 +4354,10 @@ Voici votre lien pour le groupe %@ ! État du réseau No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Nouveau code d'accès @@ -4397,6 +4490,7 @@ Voici votre lien pour le groupe %@ ! Nothing selected + Aucune sélection No comment provided by engineer. @@ -4443,19 +4537,27 @@ Voici votre lien pour le groupe %@ ! Archives de l'ancienne base de données No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Lien d'invitation unique No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Les hôtes .onion seront nécessaires pour la connexion. Nécessite l'activation d'un VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Les hôtes .onion seront **nécessaires** pour la connexion. +Nécessite l'activation d'un VPN. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Les hôtes .onion seront utilisés dès que possible. Nécessite l'activation d'un VPN. + + Onion hosts will be used when available. +Requires compatible VPN. + Les hôtes .onion seront utilisés dès que possible. +Nécessite l'activation d'un VPN. No comment provided by engineer. @@ -4468,6 +4570,10 @@ Voici votre lien pour le groupe %@ ! Seuls les appareils clients stockent les profils des utilisateurs, les contacts, les groupes et les messages envoyés avec un **chiffrement de bout en bout à deux couches**. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Seuls les propriétaires du groupe peuvent modifier les préférences du groupe. @@ -4703,6 +4809,10 @@ Voici votre lien pour le groupe %@ ! Appels picture-in-picture No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Veuillez demander à votre contact de permettre l'envoi de messages vocaux. @@ -5004,6 +5114,10 @@ Activez-le dans les paramètres *Réseau et serveurs*. Évaluer l'app No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Réagissez… @@ -5344,11 +5458,6 @@ Activez-le dans les paramètres *Réseau et serveurs*. Révéler chat item action - - Revert - Revenir en arrière - No comment provided by engineer. - Revoke Révoquer @@ -5379,11 +5488,6 @@ Activez-le dans les paramètres *Réseau et serveurs*. Serveur SMP No comment provided by engineer. - - SMP servers - Serveurs SMP - No comment provided by engineer. - Safely receive files Réception de fichiers en toute sécurité @@ -5414,6 +5518,10 @@ Activez-le dans les paramètres *Réseau et serveurs*. Enregistrer et en informer les membres du groupe No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile Enregistrer et mettre à jour le profil du groupe @@ -5576,6 +5684,7 @@ Activez-le dans les paramètres *Réseau et serveurs*. Selected %lld + %lld sélectionné(s) No comment provided by engineer. @@ -5618,11 +5727,6 @@ Activez-le dans les paramètres *Réseau et serveurs*. Envoyer les accusés de réception à No comment provided by engineer. - - Send direct message - Envoyer un message direct - No comment provided by engineer. - Send direct message to connect Envoyer un message direct pour vous connecter @@ -5648,6 +5752,10 @@ Activez-le dans les paramètres *Réseau et serveurs*. Envoyer un message dynamique No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. Envoyer les messages de manière directe lorsque l'adresse IP est protégée et que votre serveur ou le serveur de destination ne prend pas en charge le routage privé. @@ -5945,6 +6053,7 @@ Activez-le dans les paramètres *Réseau et serveurs*. Share to SimpleX + Partager sur SimpleX No comment provided by engineer. @@ -5999,6 +6108,7 @@ Activez-le dans les paramètres *Réseau et serveurs*. SimpleX + SimpleX No comment provided by engineer. @@ -6098,13 +6208,22 @@ Activez-le dans les paramètres *Réseau et serveurs*. Soft + Léger blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Des erreurs non fatales se sont produites lors de l'importation - vous pouvez consulter la console de chat pour plus de détails. No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody Quelqu'un @@ -6202,6 +6321,7 @@ Activez-le dans les paramètres *Réseau et serveurs*. Strong + Fort blur media @@ -6239,6 +6359,10 @@ Activez-le dans les paramètres *Réseau et serveurs*. Authentification du système No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout Délai de connexion TCP @@ -6299,11 +6423,6 @@ Activez-le dans les paramètres *Réseau et serveurs*. Appuyez pour scanner No comment provided by engineer. - - Tap to start a new chat - Appuyez ici pour démarrer une nouvelle discussion - No comment provided by engineer. - Temporary file error Erreur de fichier temporaire @@ -6413,10 +6532,12 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise. The messages will be deleted for all members. + Les messages seront supprimés pour tous les membres. No comment provided by engineer. The messages will be marked as moderated for all members. + Les messages seront marqués comme modérés pour tous les membres. No comment provided by engineer. @@ -6778,11 +6899,6 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien Mise à jour No comment provided by engineer. - - Update .onion hosts setting? - Mettre à jour le paramètre des hôtes .onion ? - No comment provided by engineer. - Update database passphrase Mise à jour de la phrase secrète de la base de données @@ -6793,9 +6909,8 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien Mettre à jour les paramètres réseau ? No comment provided by engineer. - - Update transport isolation mode? - Mettre à jour le mode d'isolement du transport ? + + Update settings? No comment provided by engineer. @@ -6803,11 +6918,6 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien La mise à jour des ces paramètres reconnectera le client à tous les serveurs. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - La mise à jour de ce paramètre reconnectera le client à tous les serveurs. - No comment provided by engineer. - Upgrade and open chat Mettre à niveau et ouvrir le chat @@ -6908,6 +7018,10 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien Utiliser l'application pendant l'appel. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Profil d'utilisateur @@ -6918,11 +7032,6 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien Sélection de l'utilisateur No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - L'utilisation des hôtes .onion nécessite un fournisseur VPN compatible. - No comment provided by engineer. - Using SimpleX Chat servers. Vous utilisez les serveurs SimpleX. @@ -7183,11 +7292,6 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien Serveur XFTP No comment provided by engineer. - - XFTP servers - Serveurs XFTP - No comment provided by engineer. - You Vous @@ -7310,6 +7414,10 @@ Répéter la demande d'adhésion ? Vous pouvez maintenant envoyer des messages à %@ notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. Vous pouvez configurer l'aperçu des notifications sur l'écran de verrouillage via les paramètres. @@ -7335,6 +7443,10 @@ Répéter la demande d'adhésion ? Vous pouvez lancer le chat via Paramètres / Base de données ou en redémarrant l'app No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. Vous pouvez activer SimpleX Lock dans les Paramètres. @@ -7377,11 +7489,6 @@ Repeat connection request? Répéter la demande de connexion ? No comment provided by engineer. - - You have no chats - Vous n'avez aucune discussion - No comment provided by engineer. - You have to enter passphrase every time the app starts - it is not stored on the device. Vous devez saisir la phrase secrète à chaque fois que l'application démarre - elle n'est pas stockée sur l'appareil. @@ -7402,11 +7509,23 @@ Répéter la demande de connexion ? Vous avez rejoint ce groupe. Connexion à l'invitation d'un membre du groupe. No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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. Vous devez utiliser la version la plus récente de votre base de données de chat sur un seul appareil UNIQUEMENT, sinon vous risquez de ne plus recevoir les messages de certains contacts. No comment provided by engineer. + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Vous devez autoriser votre contact à envoyer des messages vocaux pour pouvoir en envoyer. @@ -7522,13 +7641,6 @@ Répéter la demande de connexion ? Vos profils de chat No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Votre contact a besoin d'être en ligne pour completer la connexion. -Vous pouvez annuler la connexion et supprimer le contact (et réessayer plus tard avec un autre lien). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Votre contact a envoyé un fichier plus grand que la taille maximale supportée actuellement(%@). @@ -7544,6 +7656,10 @@ Vous pouvez annuler la connexion et supprimer le contact (et réessayer plus tar Vos contacts resteront connectés. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Votre base de données de chat actuelle va être SUPPRIMEE et REMPLACEE par celle importée. @@ -7721,6 +7837,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil. gras No comment provided by engineer. + + call + No comment provided by engineer. + call error erreur d'appel @@ -8091,6 +8211,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil. invitation au groupe %@ group name + + invite + No comment provided by engineer. + invited invité·e @@ -8146,6 +8270,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil. est connecté·e rcv group event chat item + + message + No comment provided by engineer. + message received message reçu @@ -8176,6 +8304,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil. mois time unit + + mute + No comment provided by engineer. + never jamais @@ -8308,6 +8440,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil. enregistré à partir de %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec sec @@ -8382,8 +8518,8 @@ dernier message reçu : %2$@ inconnu connection info - - unknown relays + + unknown servers relais inconnus No comment provided by engineer. @@ -8392,6 +8528,10 @@ dernier message reçu : %2$@ statut inconnu No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected non protégé @@ -8437,6 +8577,10 @@ dernier message reçu : %2$@ via relais No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) appel vidéo (sans chiffrement) @@ -8615,14 +8759,17 @@ dernier message reçu : %2$@ SimpleX SE + SimpleX SE Bundle display name SimpleX SE + SimpleX SE Bundle name Copyright © 2024 SimpleX Chat. All rights reserved. + Copyright © 2024 SimpleX Chat. Tous droits réservés. Copyright (human-readable) @@ -8634,150 +8781,183 @@ dernier message reçu : %2$@ %@ + %@ No comment provided by engineer. App is locked! + L'app est verrouillée ! No comment provided by engineer. Cancel + Annuler No comment provided by engineer. Cannot access keychain to save database password + Impossible d'accéder à la keychain pour enregistrer le mot de passe de la base de données No comment provided by engineer. Cannot forward message + Impossible de transférer le message No comment provided by engineer. Comment + Commenter No comment provided by engineer. Currently maximum supported file size is %@. + Actuellement, la taille maximale des fichiers supportés est de %@. No comment provided by engineer. Database downgrade required + Mise à jour de la base de données nécessaire No comment provided by engineer. Database encrypted! + Base de données chiffrée ! No comment provided by engineer. Database error + Erreur de base de données No comment provided by engineer. Database passphrase is different from saved in the keychain. + La phrase secrète de la base de données est différente de celle enregistrée dans la keychain. No comment provided by engineer. Database passphrase is required to open chat. + La phrase secrète de la base de données est nécessaire pour ouvrir le chat. No comment provided by engineer. Database upgrade required - No comment provided by engineer. - - - Dismiss Sheet + Mise à niveau de la base de données nécessaire No comment provided by engineer. Error preparing file + Erreur lors de la préparation du fichier No comment provided by engineer. Error preparing message + Erreur lors de la préparation du message No comment provided by engineer. Error: %@ + Erreur : %@ No comment provided by engineer. File error + Erreur de fichier No comment provided by engineer. Incompatible database version + Version de la base de données incompatible No comment provided by engineer. Invalid migration confirmation - No comment provided by engineer. - - - Keep Trying + Confirmation de migration invalide No comment provided by engineer. Keychain error + Erreur de la keychain No comment provided by engineer. Large file! + Fichier trop lourd ! No comment provided by engineer. No active profile - No comment provided by engineer. - - - No network connection + Pas de profil actif No comment provided by engineer. Ok + Ok No comment provided by engineer. Open the app to downgrade the database. + Ouvrez l'app pour rétrograder la base de données. No comment provided by engineer. Open the app to upgrade the database. + Ouvrez l'app pour mettre à jour la base de données. No comment provided by engineer. Passphrase + Phrase secrète No comment provided by engineer. Please create a profile in the SimpleX app + Veuillez créer un profil dans l'app SimpleX No comment provided by engineer. Selected chat preferences prohibit this message. + Les paramètres de chat sélectionnés ne permettent pas l'envoi de ce message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. Share + Partager + No comment provided by engineer. + + + Slow network? No comment provided by engineer. Unknown database error: %@ + Erreur inconnue de la base de données : %@ No comment provided by engineer. Unsupported format + Format non pris en charge + No comment provided by engineer. + + + Wait No comment provided by engineer. Wrong database passphrase + Mauvaise phrase secrète pour la base de données No comment provided by engineer. You can allow sharing in Privacy & Security / SimpleX Lock settings. + Vous pouvez autoriser le partage dans les paramètres Confidentialité et sécurité / SimpleX Lock. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/he.xcloc/Localized Contents/he.xliff b/apps/ios/SimpleX Localizations/he.xcloc/Localized Contents/he.xliff index ee628c7935..928a01dead 100644 --- a/apps/ios/SimpleX Localizations/he.xcloc/Localized Contents/he.xliff +++ b/apps/ios/SimpleX Localizations/he.xcloc/Localized Contents/he.xliff @@ -5316,6 +5316,278 @@ SimpleX servers cannot see your profile. %@ ו-%@ No comment provided by engineer. + + Connect automatically + התבר אוטומטי + + + Create profile + צור פרופיל + + + Created at: %@ + נוצר ב:%@ + + + Desktop devices + מכשירי מחשב + + + Discover via local network + גלה באמצעות הרשת המקומית + + + Forward + העבר + + + Group already exists + קבוצה כבר קיימת + + + Connected to desktop + מחובר למחשב + + + Group already exists! + קבוצה כבר קיימת! + + + Confirm upload + אשר ההעלאה + + + Block for all + חסום לכולם + + + Blocked by admin + נחסם ע"י מנהל + + + Block member for all? + לחסום את החבר לכולם? + + + Camera not available + מצלמה לא זמינה + + + Connect to desktop + חבר למחשב + + + Created at + נוצר ב + + + (new) + (חדש) + + + Block member + חבר חסום + + + Block member? + לחסום חבר? + + + Creating link… + יוצר קישור… + + + Files + קבצים + + + Disabled + מושבת + + + Enter passphrase + הכנס סיסמא + + + Apply + החל + + + Apply to + החל ל + + + Background + ברקע + + + Black + שחור + + + Blur media + טשטש מדיה + + + Chat theme + צבע ערכת נושא + + + Completed + הושלם + + + Connected + מחובר + + + Connection notifications + התראות חיבור + + + Connections + חיבורים + + + Current profile + פרופיל נוכחי + + + Disconnect desktop? + להתנתק מהמחשב? + + + Discover and join groups + גלה והצטרף לקבוצות + + + Enabled + מופעל + + + Error opening chat + שגיאה בפתיחת הצ'אט + + + Good morning! + בוקר טוב! + + + Connect to yourself? +This is your own SimpleX address! + להתחבר אליך? +זו כתובת הSimpleX שלך! + + + Connect to yourself? + להתחבר אליך? + + + Connect to yourself? +This is your own one-time link! + להתחבר אליך? +זו כתובת ההזמנה החד-פעמי שלך! + + + Connected desktop + מחשב מחובר + + + Connected servers + שרתים מחוברים + + + Enter group name… + הכנס שם לקבוצה… + + + Enter this device name… + הכנס שם למכשיר הזה… + + + Enter your name… + הכנס את השם שלך… + + + Error decrypting file + שגיאה בפענוח הקובץ + + + Errors + שגיאות + + + File status + מצב הקובץ + + + Connecting + מתחבר + + + Connecting to desktop + מתחבר למחשב + + + Deleted + נמחק + + + Deletion errors + שגיאות במחיקה + + + Details + פרטים + + + Forwarded + הועבר + + + Found desktop + נמצא מחשב + + + Good afternoon! + אחר צהריים טובים! + + + Desktop address + כתובת מחשב + + + Forwarded from + הועבר מ + + + History is not sent to new members. + היסטוריה לא נשלחת לחברים חדשים. + + + Created + נוצר + + + Copy error + שגיאת העתקה + + + Create group + צור קבוצה + + + Enabled for + מופעל עבור + + + Error creating message + שגיאה ביצירת הודעה + + + File error + שגיאה בקובץ + diff --git a/apps/ios/SimpleX Localizations/hi.xcloc/Localized Contents/hi.xliff b/apps/ios/SimpleX Localizations/hi.xcloc/Localized Contents/hi.xliff deleted file mode 100644 index a4ed3b39d8..0000000000 --- a/apps/ios/SimpleX Localizations/hi.xcloc/Localized Contents/hi.xliff +++ /dev/null @@ -1,3554 +0,0 @@ - - - -
- -
- - - - - No comment provided by engineer. - - - - No comment provided by engineer. - - - - No comment provided by engineer. - - - - No comment provided by engineer. - - - ( - No comment provided by engineer. - - - (can be copied) - No comment provided by engineer. - - - !1 colored! - No comment provided by engineer. - - - #secret# - No comment provided by engineer. - - - %@ - No comment provided by engineer. - - - %@ %@ - No comment provided by engineer. - - - %@ / %@ - No comment provided by engineer. - - - %@ is connected! - notification title - - - %@ is not verified - No comment provided by engineer. - - - %@ is verified - No comment provided by engineer. - - - %@ wants to connect! - notification title - - - %d days - message ttl - - - %d hours - message ttl - - - %d min - message ttl - - - %d months - message ttl - - - %d sec - message ttl - - - %d skipped message(s) - integrity error chat item - - - %lld - No comment provided by engineer. - - - %lld %@ - No comment provided by engineer. - - - %lld contact(s) selected - No comment provided by engineer. - - - %lld file(s) with total size of %@ - No comment provided by engineer. - - - %lld members - No comment provided by engineer. - - - %lld second(s) - No comment provided by engineer. - - - %lldd - No comment provided by engineer. - - - %lldh - No comment provided by engineer. - - - %lldk - No comment provided by engineer. - - - %lldm - No comment provided by engineer. - - - %lldmth - No comment provided by engineer. - - - %llds - No comment provided by engineer. - - - %lldw - No comment provided by engineer. - - - ( - No comment provided by engineer. - - - ) - No comment provided by engineer. - - - **Add new contact**: to create your one-time QR Code or link for your contact. - No comment provided by engineer. - - - **Create link / QR code** for your contact to use. - No comment provided by engineer. - - - **More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have. - No comment provided by engineer. - - - **Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app). - No comment provided by engineer. - - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - No comment provided by engineer. - - - **Please note**: you will NOT be able to recover or change passphrase if you lose it. - No comment provided by engineer. - - - **Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from. - No comment provided by engineer. - - - **Scan QR code**: to connect to your contact in person or via video call. - No comment provided by engineer. - - - **Warning**: Instant push notifications require passphrase saved in Keychain. - No comment provided by engineer. - - - **e2e encrypted** audio call - No comment provided by engineer. - - - **e2e encrypted** video call - No comment provided by engineer. - - - \*bold* - No comment provided by engineer. - - - , - No comment provided by engineer. - - - . - No comment provided by engineer. - - - 1 day - message ttl - - - 1 hour - message ttl - - - 1 month - message ttl - - - 1 week - message ttl - - - 2 weeks - message ttl - - - 6 - No comment provided by engineer. - - - : - No comment provided by engineer. - - - A new contact - notification title - - - A random profile will be sent to the contact that you received this link from - No comment provided by engineer. - - - A random profile will be sent to your contact - No comment provided by engineer. - - - A separate TCP connection will be used **for each chat profile you have in the app**. - No comment provided by engineer. - - - A separate TCP connection will be used **for each contact and group member**. -**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail. - No comment provided by engineer. - - - About SimpleX - No comment provided by engineer. - - - About SimpleX Chat - No comment provided by engineer. - - - Accent color - No comment provided by engineer. - - - Accept - accept contact request via notification - accept incoming call via notification - - - Accept contact - No comment provided by engineer. - - - Accept contact request from %@? - notification body - - - Accept incognito - No comment provided by engineer. - - - Accept requests - No comment provided by engineer. - - - Add preset servers - No comment provided by engineer. - - - Add profile - No comment provided by engineer. - - - Add servers by scanning QR codes. - No comment provided by engineer. - - - Add server - No comment provided by engineer. - - - Add to another device - No comment provided by engineer. - - - Admins can create the links to join groups. - No comment provided by engineer. - - - Advanced network settings - No comment provided by engineer. - - - All chats and messages will be deleted - this cannot be undone! - No comment provided by engineer. - - - All group members will remain connected. - No comment provided by engineer. - - - All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you. - No comment provided by engineer. - - - All your contacts will remain connected - No comment provided by engineer. - - - Allow - No comment provided by engineer. - - - Allow disappearing messages only if your contact allows it to you. - No comment provided by engineer. - - - Allow irreversible message deletion only if your contact allows it to you. - No comment provided by engineer. - - - Allow sending direct messages to members. - No comment provided by engineer. - - - Allow sending disappearing messages. - No comment provided by engineer. - - - Allow to irreversibly delete sent messages. - No comment provided by engineer. - - - Allow to send voice messages. - No comment provided by engineer. - - - Allow voice messages only if your contact allows them. - No comment provided by engineer. - - - Allow voice messages? - No comment provided by engineer. - - - Allow your contacts to irreversibly delete sent messages. - No comment provided by engineer. - - - Allow your contacts to send disappearing messages. - No comment provided by engineer. - - - Allow your contacts to send voice messages. - No comment provided by engineer. - - - Already connected? - No comment provided by engineer. - - - Answer call - No comment provided by engineer. - - - App build: %@ - No comment provided by engineer. - - - App icon - No comment provided by engineer. - - - App version - No comment provided by engineer. - - - App version: v%@ - No comment provided by engineer. - - - Appearance - No comment provided by engineer. - - - Attach - No comment provided by engineer. - - - Audio & video calls - No comment provided by engineer. - - - Authentication failed - No comment provided by engineer. - - - Authentication unavailable - No comment provided by engineer. - - - Auto-accept contact requests - No comment provided by engineer. - - - Auto-accept images - No comment provided by engineer. - - - Automatically - No comment provided by engineer. - - - Back - No comment provided by engineer. - - - Both you and your contact can irreversibly delete sent messages. - No comment provided by engineer. - - - Both you and your contact can send disappearing messages. - No comment provided by engineer. - - - Both you and your contact can send voice messages. - No comment provided by engineer. - - - Call already ended! - No comment provided by engineer. - - - Calls - No comment provided by engineer. - - - Can't invite contact! - No comment provided by engineer. - - - Can't invite contacts! - No comment provided by engineer. - - - Cancel - No comment provided by engineer. - - - Cannot access keychain to save database password - No comment provided by engineer. - - - Cannot receive file - No comment provided by engineer. - - - Change - No comment provided by engineer. - - - Change database passphrase? - No comment provided by engineer. - - - Change member role? - No comment provided by engineer. - - - Change receiving address - No comment provided by engineer. - - - Change receiving address? - No comment provided by engineer. - - - Change role - No comment provided by engineer. - - - Chat archive - No comment provided by engineer. - - - Chat console - No comment provided by engineer. - - - Chat database - No comment provided by engineer. - - - Chat database deleted - No comment provided by engineer. - - - Chat database imported - No comment provided by engineer. - - - Chat is running - No comment provided by engineer. - - - Chat is stopped - No comment provided by engineer. - - - Chat preferences - No comment provided by engineer. - - - Chats - No comment provided by engineer. - - - Check server address and try again. - No comment provided by engineer. - - - Choose file - No comment provided by engineer. - - - Choose from library - No comment provided by engineer. - - - Clear - No comment provided by engineer. - - - Clear conversation - No comment provided by engineer. - - - Clear conversation? - No comment provided by engineer. - - - Clear verification - No comment provided by engineer. - - - Colors - No comment provided by engineer. - - - Compare security codes with your contacts. - No comment provided by engineer. - - - Configure ICE servers - No comment provided by engineer. - - - Confirm - No comment provided by engineer. - - - Confirm new passphrase… - No comment provided by engineer. - - - Connect - server test step - - - Connect via contact link? - No comment provided by engineer. - - - Connect via group link? - No comment provided by engineer. - - - Connect via link - No comment provided by engineer. - - - Connect via link / QR code - No comment provided by engineer. - - - Connect via one-time link? - No comment provided by engineer. - - - Connect via relay - No comment provided by engineer. - - - Connecting to server… - No comment provided by engineer. - - - Connecting to server… (error: %@) - No comment provided by engineer. - - - Connection - No comment provided by engineer. - - - Connection error - No comment provided by engineer. - - - Connection error (AUTH) - No comment provided by engineer. - - - Connection request - No comment provided by engineer. - - - Connection request sent! - No comment provided by engineer. - - - Connection timeout - No comment provided by engineer. - - - Contact allows - No comment provided by engineer. - - - Contact already exists - No comment provided by engineer. - - - Contact and all messages will be deleted - this cannot be undone! - No comment provided by engineer. - - - Contact hidden: - notification - - - Contact is connected - notification - - - Contact is not connected yet! - No comment provided by engineer. - - - Contact name - No comment provided by engineer. - - - Contact preferences - No comment provided by engineer. - - - Contact requests - No comment provided by engineer. - - - Contacts can mark messages for deletion; you will be able to view them. - No comment provided by engineer. - - - Copy - chat item action - - - Core built at: %@ - No comment provided by engineer. - - - Core version: v%@ - No comment provided by engineer. - - - Create - No comment provided by engineer. - - - Create address - No comment provided by engineer. - - - Create group link - No comment provided by engineer. - - - Create link - No comment provided by engineer. - - - Create one-time invitation link - No comment provided by engineer. - - - Create queue - server test step - - - Create secret group - No comment provided by engineer. - - - Create your profile - No comment provided by engineer. - - - Created on %@ - No comment provided by engineer. - - - Current passphrase… - No comment provided by engineer. - - - Currently maximum supported file size is %@. - No comment provided by engineer. - - - Dark - No comment provided by engineer. - - - Data - No comment provided by engineer. - - - Database ID - No comment provided by engineer. - - - Database encrypted! - No comment provided by engineer. - - - Database encryption passphrase will be updated and stored in the keychain. - - No comment provided by engineer. - - - Database encryption passphrase will be updated. - - No comment provided by engineer. - - - Database error - No comment provided by engineer. - - - Database is encrypted using a random passphrase, you can change it. - No comment provided by engineer. - - - Database is encrypted using a random passphrase. Please change it before exporting. - No comment provided by engineer. - - - Database passphrase - No comment provided by engineer. - - - Database passphrase & export - No comment provided by engineer. - - - Database passphrase is different from saved in the keychain. - No comment provided by engineer. - - - Database passphrase is required to open chat. - No comment provided by engineer. - - - Database will be encrypted and the passphrase stored in the keychain. - - No comment provided by engineer. - - - Database will be encrypted. - - No comment provided by engineer. - - - Database will be migrated when the app restarts - No comment provided by engineer. - - - Decentralized - No comment provided by engineer. - - - Delete - chat item action - - - Delete Contact - No comment provided by engineer. - - - Delete address - No comment provided by engineer. - - - Delete address? - No comment provided by engineer. - - - Delete after - No comment provided by engineer. - - - Delete all files - No comment provided by engineer. - - - Delete archive - No comment provided by engineer. - - - Delete chat archive? - No comment provided by engineer. - - - Delete chat profile? - No comment provided by engineer. - - - Delete connection - No comment provided by engineer. - - - Delete contact - No comment provided by engineer. - - - Delete contact? - No comment provided by engineer. - - - Delete database - No comment provided by engineer. - - - Delete files & media - No comment provided by engineer. - - - Delete files and media? - No comment provided by engineer. - - - Delete files for all chat profiles - No comment provided by engineer. - - - Delete for everyone - chat feature - - - Delete for me - No comment provided by engineer. - - - Delete group - No comment provided by engineer. - - - Delete group? - No comment provided by engineer. - - - Delete invitation - No comment provided by engineer. - - - Delete link - No comment provided by engineer. - - - Delete link? - No comment provided by engineer. - - - Delete message? - No comment provided by engineer. - - - Delete messages - No comment provided by engineer. - - - Delete messages after - No comment provided by engineer. - - - Delete old database - No comment provided by engineer. - - - Delete old database? - No comment provided by engineer. - - - Delete pending connection - No comment provided by engineer. - - - Delete pending connection? - No comment provided by engineer. - - - Delete queue - server test step - - - Delete user profile? - No comment provided by engineer. - - - Description - No comment provided by engineer. - - - Develop - No comment provided by engineer. - - - Developer tools - No comment provided by engineer. - - - Device - No comment provided by engineer. - - - Device authentication is disabled. Turning off SimpleX Lock. - No comment provided by engineer. - - - Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication. - No comment provided by engineer. - - - Direct messages - chat feature - - - Direct messages between members are prohibited in this group. - No comment provided by engineer. - - - Disable SimpleX Lock - authentication reason - - - Disappearing messages - chat feature - - - Disappearing messages are prohibited in this chat. - No comment provided by engineer. - - - Disappearing messages are prohibited in this group. - No comment provided by engineer. - - - Disconnect - server test step - - - Display name - No comment provided by engineer. - - - Display name: - No comment provided by engineer. - - - Do NOT use SimpleX for emergency calls. - No comment provided by engineer. - - - Do it later - No comment provided by engineer. - - - Edit - chat item action - - - Edit group profile - No comment provided by engineer. - - - Enable - No comment provided by engineer. - - - Enable SimpleX Lock - authentication reason - - - Enable TCP keep-alive - No comment provided by engineer. - - - Enable automatic message deletion? - No comment provided by engineer. - - - Enable instant notifications? - No comment provided by engineer. - - - Enable notifications - No comment provided by engineer. - - - Enable periodic notifications? - No comment provided by engineer. - - - Encrypt - No comment provided by engineer. - - - Encrypt database? - No comment provided by engineer. - - - Encrypted database - No comment provided by engineer. - - - Encrypted message or another event - notification - - - Encrypted message: database error - notification - - - Encrypted message: keychain error - notification - - - Encrypted message: no passphrase - notification - - - Encrypted message: unexpected error - notification - - - Enter correct passphrase. - No comment provided by engineer. - - - Enter passphrase… - No comment provided by engineer. - - - Enter server manually - No comment provided by engineer. - - - Error - No comment provided by engineer. - - - Error accepting contact request - No comment provided by engineer. - - - Error accessing database file - No comment provided by engineer. - - - Error adding member(s) - No comment provided by engineer. - - - Error changing address - No comment provided by engineer. - - - Error changing role - No comment provided by engineer. - - - Error changing setting - No comment provided by engineer. - - - Error creating address - No comment provided by engineer. - - - Error creating group - No comment provided by engineer. - - - Error creating group link - No comment provided by engineer. - - - Error deleting chat database - No comment provided by engineer. - - - Error deleting chat! - No comment provided by engineer. - - - Error deleting connection - No comment provided by engineer. - - - Error deleting contact - No comment provided by engineer. - - - Error deleting database - No comment provided by engineer. - - - Error deleting old database - No comment provided by engineer. - - - Error deleting token - No comment provided by engineer. - - - Error deleting user profile - No comment provided by engineer. - - - Error enabling notifications - No comment provided by engineer. - - - Error encrypting database - No comment provided by engineer. - - - Error exporting chat database - No comment provided by engineer. - - - Error importing chat database - No comment provided by engineer. - - - Error joining group - No comment provided by engineer. - - - Error receiving file - No comment provided by engineer. - - - Error removing member - No comment provided by engineer. - - - Error saving ICE servers - No comment provided by engineer. - - - Error saving SMP servers - No comment provided by engineer. - - - Error saving group profile - No comment provided by engineer. - - - Error saving passphrase to keychain - No comment provided by engineer. - - - Error sending message - No comment provided by engineer. - - - Error starting chat - No comment provided by engineer. - - - Error stopping chat - No comment provided by engineer. - - - Error updating message - No comment provided by engineer. - - - Error updating settings - No comment provided by engineer. - - - Error: %@ - No comment provided by engineer. - - - Error: URL is invalid - No comment provided by engineer. - - - Error: no database file - No comment provided by engineer. - - - Exit without saving - No comment provided by engineer. - - - Export database - No comment provided by engineer. - - - Export error: - No comment provided by engineer. - - - Exported database archive. - No comment provided by engineer. - - - Exporting database archive... - No comment provided by engineer. - - - Failed to remove passphrase - No comment provided by engineer. - - - File will be received when your contact is online, please wait or check later! - No comment provided by engineer. - - - File: %@ - No comment provided by engineer. - - - Files & media - No comment provided by engineer. - - - For console - No comment provided by engineer. - - - Full link - No comment provided by engineer. - - - Full name (optional) - No comment provided by engineer. - - - Full name: - No comment provided by engineer. - - - GIFs and stickers - No comment provided by engineer. - - - Group - No comment provided by engineer. - - - Group display name - No comment provided by engineer. - - - Group full name (optional) - No comment provided by engineer. - - - Group image - No comment provided by engineer. - - - Group invitation - No comment provided by engineer. - - - Group invitation expired - No comment provided by engineer. - - - Group invitation is no longer valid, it was removed by sender. - No comment provided by engineer. - - - Group link - No comment provided by engineer. - - - Group links - No comment provided by engineer. - - - Group members can irreversibly delete sent messages. - No comment provided by engineer. - - - Group members can send direct messages. - No comment provided by engineer. - - - Group members can send disappearing messages. - No comment provided by engineer. - - - Group members can send voice messages. - No comment provided by engineer. - - - Group message: - notification - - - Group preferences - No comment provided by engineer. - - - Group profile - No comment provided by engineer. - - - Group profile is stored on members' devices, not on the servers. - No comment provided by engineer. - - - Group will be deleted for all members - this cannot be undone! - No comment provided by engineer. - - - Group will be deleted for you - this cannot be undone! - No comment provided by engineer. - - - Help - No comment provided by engineer. - - - Hidden - No comment provided by engineer. - - - Hide - chat item action - - - Hide app screen in the recent apps. - No comment provided by engineer. - - - How SimpleX works - No comment provided by engineer. - - - How it works - No comment provided by engineer. - - - How to - No comment provided by engineer. - - - How to use it - No comment provided by engineer. - - - How to use your servers - No comment provided by engineer. - - - ICE servers (one per line) - No comment provided by engineer. - - - If the video fails to connect, flip the camera to resolve it. - No comment provided by engineer. - - - If you can't meet in person, **show QR code in the video call**, or share the link. - No comment provided by engineer. - - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - No comment provided by engineer. - - - If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app). - No comment provided by engineer. - - - Ignore - No comment provided by engineer. - - - Image will be received when your contact is online, please wait or check later! - No comment provided by engineer. - - - Immune to spam and abuse - No comment provided by engineer. - - - Import - No comment provided by engineer. - - - Import chat database? - No comment provided by engineer. - - - Import database - No comment provided by engineer. - - - Improved privacy and security - No comment provided by engineer. - - - Improved server configuration - No comment provided by engineer. - - - Incognito - No comment provided by engineer. - - - Incognito mode - No comment provided by engineer. - - - 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. - - - Incoming audio call - notification - - - Incoming call - notification - - - Incoming video call - notification - - - Incorrect security code! - No comment provided by engineer. - - - Install [SimpleX Chat for terminal](https://github.com/simplex-chat/simplex-chat) - No comment provided by engineer. - - - Instant push notifications will be hidden! - - No comment provided by engineer. - - - Instantly - No comment provided by engineer. - - - Invalid connection link - No comment provided by engineer. - - - Invalid server address! - No comment provided by engineer. - - - Invitation expired! - No comment provided by engineer. - - - Invite members - No comment provided by engineer. - - - Invite to group - No comment provided by engineer. - - - Irreversible message deletion - No comment provided by engineer. - - - Irreversible message deletion is prohibited in this chat. - No comment provided by engineer. - - - Irreversible message deletion is prohibited in this group. - No comment provided by engineer. - - - It allows having many anonymous connections without any shared data between them in a single chat profile. - No comment provided by engineer. - - - It can happen when: -1. The messages expire on the server if they were not received for 30 days, -2. The server you use to receive the messages from this contact was updated and restarted. -3. The connection is compromised. -Please connect to the developers via Settings to receive the updates about the servers. -We will be adding server redundancy to prevent lost messages. - 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. - - - Join - No comment provided by engineer. - - - Join group - No comment provided by engineer. - - - Join incognito - No comment provided by engineer. - - - Joining group - No comment provided by engineer. - - - Keychain error - No comment provided by engineer. - - - LIVE - No comment provided by engineer. - - - Large file! - No comment provided by engineer. - - - Leave - No comment provided by engineer. - - - Leave group - No comment provided by engineer. - - - Leave group? - No comment provided by engineer. - - - Light - No comment provided by engineer. - - - Limitations - No comment provided by engineer. - - - Live message! - No comment provided by engineer. - - - Live messages - No comment provided by engineer. - - - Local name - No comment provided by engineer. - - - Local profile data only - No comment provided by engineer. - - - Make a private connection - No comment provided by engineer. - - - Make sure SMP server addresses are in correct format, line separated and are not duplicated (%@). - No comment provided by engineer. - - - Make sure WebRTC ICE server addresses are in correct format, line separated and are not duplicated. - No comment provided by engineer. - - - Many people asked: *if SimpleX has no user identifiers, how can it deliver messages?* - No comment provided by engineer. - - - Mark deleted for everyone - No comment provided by engineer. - - - Mark read - No comment provided by engineer. - - - Mark verified - No comment provided by engineer. - - - Markdown in messages - No comment provided by engineer. - - - Max 30 seconds, received instantly. - No comment provided by engineer. - - - Member - No comment provided by engineer. - - - Member role will be changed to "%@". All group members will be notified. - No comment provided by engineer. - - - Member role will be changed to "%@". The member will receive a new invitation. - No comment provided by engineer. - - - Member will be removed from group - this cannot be undone! - No comment provided by engineer. - - - Message delivery error - No comment provided by engineer. - - - Message text - No comment provided by engineer. - - - Messages - No comment provided by engineer. - - - Migrating database archive... - No comment provided by engineer. - - - Migration error: - No comment provided by engineer. - - - Migration failed. Tap **Skip** below to continue using the current database. Please report the issue to the app developers via chat or email [chat@simplex.chat](mailto:chat@simplex.chat). - No comment provided by engineer. - - - Migration is completed - No comment provided by engineer. - - - Most likely this contact has deleted the connection with you. - No comment provided by engineer. - - - Mute - No comment provided by engineer. - - - Name - No comment provided by engineer. - - - Network & servers - No comment provided by engineer. - - - Network settings - No comment provided by engineer. - - - Network status - No comment provided by engineer. - - - New contact request - notification - - - New contact: - notification - - - New database archive - No comment provided by engineer. - - - New in %@ - No comment provided by engineer. - - - New member role - No comment provided by engineer. - - - New message - notification - - - New passphrase… - No comment provided by engineer. - - - No - No comment provided by engineer. - - - No contacts selected - No comment provided by engineer. - - - No contacts to add - No comment provided by engineer. - - - No device token! - No comment provided by engineer. - - - Group not found! - No comment provided by engineer. - - - No permission to record voice message - No comment provided by engineer. - - - No received or sent files - No comment provided by engineer. - - - Notifications - No comment provided by engineer. - - - Notifications are disabled! - No comment provided by engineer. - - - Off (Local) - No comment provided by engineer. - - - Ok - No comment provided by engineer. - - - Old database - No comment provided by engineer. - - - Old database archive - No comment provided by engineer. - - - One-time invitation link - No comment provided by engineer. - - - Onion hosts will be required for connection. Requires enabling VPN. - No comment provided by engineer. - - - Onion hosts will be used when available. Requires enabling VPN. - No comment provided by engineer. - - - Onion hosts will not be used. - No comment provided by engineer. - - - Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**. - No comment provided by engineer. - - - Only group owners can change group preferences. - No comment provided by engineer. - - - Only group owners can enable voice messages. - No comment provided by engineer. - - - Only you can irreversibly delete messages (your contact can mark them for deletion). - No comment provided by engineer. - - - Only you can send disappearing messages. - No comment provided by engineer. - - - Only you can send voice messages. - No comment provided by engineer. - - - Only your contact can irreversibly delete messages (you can mark them for deletion). - No comment provided by engineer. - - - Only your contact can send disappearing messages. - No comment provided by engineer. - - - Only your contact can send voice messages. - No comment provided by engineer. - - - Open Settings - No comment provided by engineer. - - - Open chat - No comment provided by engineer. - - - Open chat console - authentication reason - - - Open-source protocol and code – anybody can run the servers. - No comment provided by engineer. - - - Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red. - No comment provided by engineer. - - - PING count - No comment provided by engineer. - - - PING interval - No comment provided by engineer. - - - Paste - No comment provided by engineer. - - - Paste image - No comment provided by engineer. - - - Paste received link - No comment provided by engineer. - - - Paste the link you received into the box below to connect with your contact. - No comment provided by engineer. - - - People can connect to you only via the links you share. - No comment provided by engineer. - - - Periodically - No comment provided by engineer. - - - Please ask your contact to enable sending voice messages. - No comment provided by engineer. - - - Please check that you used the correct link or ask your contact to send you another one. - No comment provided by engineer. - - - Please check your network connection with %@ and try again. - No comment provided by engineer. - - - Please check yours and your contact preferences. - No comment provided by engineer. - - - Please enter correct current passphrase. - No comment provided by engineer. - - - Please enter the previous password after restoring database backup. This action can not be undone. - No comment provided by engineer. - - - Please restart the app and migrate the database to enable push notifications. - No comment provided by engineer. - - - Please store passphrase securely, you will NOT be able to access chat if you lose it. - No comment provided by engineer. - - - Please store passphrase securely, you will NOT be able to change it if you lose it. - No comment provided by engineer. - - - Possibly, certificate fingerprint in server address is incorrect - server test error - - - Preset server - No comment provided by engineer. - - - Preset server address - No comment provided by engineer. - - - Privacy & security - No comment provided by engineer. - - - Privacy redefined - No comment provided by engineer. - - - Profile and server connections - No comment provided by engineer. - - - Profile image - No comment provided by engineer. - - - Prohibit irreversible message deletion. - No comment provided by engineer. - - - Prohibit sending direct messages to members. - No comment provided by engineer. - - - Prohibit sending disappearing messages. - No comment provided by engineer. - - - Prohibit sending voice messages. - No comment provided by engineer. - - - Protect app screen - No comment provided by engineer. - - - Protocol timeout - No comment provided by engineer. - - - Push notifications - No comment provided by engineer. - - - Rate the app - No comment provided by engineer. - - - Read - No comment provided by engineer. - - - Read more in our GitHub repository. - No comment provided by engineer. - - - Read more in our [GitHub repository](https://github.com/simplex-chat/simplex-chat#readme). - No comment provided by engineer. - - - Received file event - notification - - - Receiving via - No comment provided by engineer. - - - Recipients see updates as you type them. - No comment provided by engineer. - - - Reject - reject incoming call via notification - - - Reject contact (sender NOT notified) - No comment provided by engineer. - - - Reject contact request - No comment provided by engineer. - - - Relay server is only used if necessary. Another party can observe your IP address. - No comment provided by engineer. - - - Relay server protects your IP address, but it can observe the duration of the call. - No comment provided by engineer. - - - Remove - No comment provided by engineer. - - - Remove member - No comment provided by engineer. - - - Remove member? - No comment provided by engineer. - - - Remove passphrase from keychain? - No comment provided by engineer. - - - Reply - chat item action - - - Required - No comment provided by engineer. - - - Reset - No comment provided by engineer. - - - Reset colors - No comment provided by engineer. - - - Reset to defaults - No comment provided by engineer. - - - Restart the app to create a new chat profile - No comment provided by engineer. - - - Restart the app to use imported chat database - No comment provided by engineer. - - - Restore - No comment provided by engineer. - - - Restore database backup - No comment provided by engineer. - - - Restore database backup? - No comment provided by engineer. - - - Restore database error - No comment provided by engineer. - - - Reveal - chat item action - - - Revert - No comment provided by engineer. - - - Role - No comment provided by engineer. - - - Run chat - No comment provided by engineer. - - - SMP servers - No comment provided by engineer. - - - Save - chat item action - - - Save (and notify contacts) - No comment provided by engineer. - - - Save and notify contact - No comment provided by engineer. - - - Save and notify group members - No comment provided by engineer. - - - Save archive - No comment provided by engineer. - - - Save group profile - No comment provided by engineer. - - - Save passphrase and open chat - No comment provided by engineer. - - - Save passphrase in Keychain - No comment provided by engineer. - - - Save preferences? - No comment provided by engineer. - - - Save servers - No comment provided by engineer. - - - Saved WebRTC ICE servers will be removed - No comment provided by engineer. - - - Scan QR code - No comment provided by engineer. - - - Scan code - No comment provided by engineer. - - - Scan security code from your contact's app. - No comment provided by engineer. - - - Scan server QR code - No comment provided by engineer. - - - Search - No comment provided by engineer. - - - Secure queue - server test step - - - Security assessment - No comment provided by engineer. - - - Security code - No comment provided by engineer. - - - Send - No comment provided by engineer. - - - Send a live message - it will update for the recipient(s) as you type it - No comment provided by engineer. - - - Send direct message - No comment provided by engineer. - - - Send link previews - No comment provided by engineer. - - - Send live message - No comment provided by engineer. - - - Send notifications - No comment provided by engineer. - - - Send notifications: - No comment provided by engineer. - - - Send questions and ideas - No comment provided by engineer. - - - Send them from gallery or custom keyboards. - No comment provided by engineer. - - - Sender cancelled file transfer. - No comment provided by engineer. - - - Sender may have deleted the connection request. - No comment provided by engineer. - - - Sending via - No comment provided by engineer. - - - Sent file event - notification - - - Sent messages will be deleted after set time. - No comment provided by engineer. - - - Server requires authorization to create queues, check password - server test error - - - Server test failed! - No comment provided by engineer. - - - Servers - No comment provided by engineer. - - - Set 1 day - No comment provided by engineer. - - - Set contact name… - No comment provided by engineer. - - - Set group preferences - No comment provided by engineer. - - - Set passphrase to export - No comment provided by engineer. - - - Set timeouts for proxy/VPN - No comment provided by engineer. - - - Settings - No comment provided by engineer. - - - Share - chat item action - - - Share invitation link - No comment provided by engineer. - - - Share link - No comment provided by engineer. - - - Share one-time invitation link - No comment provided by engineer. - - - Show QR code - No comment provided by engineer. - - - Show preview - No comment provided by engineer. - - - SimpleX Chat security was audited by Trail of Bits. - No comment provided by engineer. - - - SimpleX Lock - No comment provided by engineer. - - - SimpleX Lock turned on - No comment provided by engineer. - - - SimpleX contact address - simplex link type - - - SimpleX encrypted message or connection event - notification - - - SimpleX group link - simplex link type - - - SimpleX links - No comment provided by engineer. - - - SimpleX one-time invitation - simplex link type - - - Skip - No comment provided by engineer. - - - Skipped messages - No comment provided by engineer. - - - Somebody - notification title - - - Start a new chat - No comment provided by engineer. - - - Start chat - No comment provided by engineer. - - - Start migration - No comment provided by engineer. - - - Stop - No comment provided by engineer. - - - Stop SimpleX - authentication reason - - - Stop chat to enable database actions - No comment provided by engineer. - - - Stop chat to export, import or delete chat database. You will not be able to receive and send messages while the chat is stopped. - No comment provided by engineer. - - - Stop chat? - No comment provided by engineer. - - - Support SimpleX Chat - No comment provided by engineer. - - - System - No comment provided by engineer. - - - TCP connection timeout - No comment provided by engineer. - - - TCP_KEEPCNT - No comment provided by engineer. - - - TCP_KEEPIDLE - No comment provided by engineer. - - - TCP_KEEPINTVL - No comment provided by engineer. - - - Take picture - No comment provided by engineer. - - - Tap button - No comment provided by engineer. - - - Tap to join - 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. - - - Test failed at step %@. - server test failure - - - Test server - No comment provided by engineer. - - - Test servers - No comment provided by engineer. - - - Tests failed! - No comment provided by engineer. - - - Thank you for installing SimpleX Chat! - No comment provided by engineer. - - - The 1st platform without any user identifiers – private by design. - No comment provided by engineer. - - - The app can notify you when you receive messages or contact requests - please open settings to enable. - No comment provided by engineer. - - - The attempt to change database passphrase was not completed. - No comment provided by engineer. - - - The connection you accepted will be cancelled! - 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 fully decentralized – it is visible only to the members. - No comment provided by engineer. - - - The microphone does not work when the app is in the background. - No comment provided by engineer. - - - The next generation of private messaging - No comment provided by engineer. - - - The old database was not removed during the migration, it can be deleted. - No comment provided by engineer. - - - The profile is only shared with your contacts. - No comment provided by engineer. - - - The sender will NOT be notified - No comment provided by engineer. - - - The servers for new connections of your current chat profile **%@**. - No comment provided by engineer. - - - Theme - No comment provided by engineer. - - - This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain. - No comment provided by engineer. - - - This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes. - No comment provided by engineer. - - - This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost. - No comment provided by engineer. - - - This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed – please check that you can still receive messages from this contact (or group member). - No comment provided by engineer. - - - This group no longer exists. - No comment provided by engineer. - - - This setting applies to messages in your current chat profile **%@**. - No comment provided by engineer. - - - To ask any questions and to receive updates: - No comment provided by engineer. - - - To find the profile used for an incognito connection, tap the contact or group name on top of the chat. - No comment provided by engineer. - - - To make a new connection - No comment provided by engineer. - - - To prevent the call interruption, enable Do Not Disturb mode. - No comment provided by engineer. - - - To protect privacy, instead of user IDs used by all other platforms, SimpleX has identifiers for message queues, separate for each of your contacts. - No comment provided by engineer. - - - To protect your information, turn on SimpleX Lock. -You will be prompted to complete authentication before this feature is enabled. - No comment provided by engineer. - - - To record voice message please grant permission to use Microphone. - No comment provided by engineer. - - - To support instant push notifications the chat database has to be migrated. - No comment provided by engineer. - - - To verify end-to-end encryption with your contact compare (or scan) the code on your devices. - No comment provided by engineer. - - - Transfer images faster - No comment provided by engineer. - - - Transport isolation - No comment provided by engineer. - - - Trying to connect to the server used to receive messages from this contact (error: %@). - No comment provided by engineer. - - - Trying to connect to the server used to receive messages from this contact. - No comment provided by engineer. - - - Turn off - No comment provided by engineer. - - - Turn off notifications? - No comment provided by engineer. - - - Turn on - No comment provided by engineer. - - - Unable to record voice message - No comment provided by engineer. - - - Unexpected error: %@ - No comment provided by engineer. - - - Unexpected migration state - No comment provided by engineer. - - - Unknown database error: %@ - No comment provided by engineer. - - - Unknown error - No comment provided by engineer. - - - Unless your contact deleted the connection or this link was already used, it might be a bug - please report it. -To connect, please ask your contact to create another connection link and check that you have a stable network connection. - No comment provided by engineer. - - - Unlock - authentication reason - - - Unmute - No comment provided by engineer. - - - Unread - No comment provided by engineer. - - - Update - No comment provided by engineer. - - - Update .onion hosts setting? - No comment provided by engineer. - - - Update database passphrase - No comment provided by engineer. - - - Update network settings? - No comment provided by engineer. - - - Update transport isolation mode? - No comment provided by engineer. - - - Updating settings will re-connect the client to all servers. - No comment provided by engineer. - - - Updating this setting will re-connect the client to all servers. - No comment provided by engineer. - - - Use .onion hosts - No comment provided by engineer. - - - Use SimpleX Chat servers? - No comment provided by engineer. - - - Use chat - No comment provided by engineer. - - - Use for new connections - No comment provided by engineer. - - - Use server - No comment provided by engineer. - - - User profile - No comment provided by engineer. - - - Using .onion hosts requires compatible VPN provider. - No comment provided by engineer. - - - Using SimpleX Chat servers. - No comment provided by engineer. - - - Verify connection security - No comment provided by engineer. - - - Verify security code - No comment provided by engineer. - - - Via browser - No comment provided by engineer. - - - Video call - No comment provided by engineer. - - - View security code - No comment provided by engineer. - - - Voice messages - chat feature - - - Voice messages are prohibited in this chat. - No comment provided by engineer. - - - Voice messages are prohibited in this group. - No comment provided by engineer. - - - Voice messages prohibited! - No comment provided by engineer. - - - Voice message… - No comment provided by engineer. - - - Waiting for file - No comment provided by engineer. - - - Waiting for image - No comment provided by engineer. - - - WebRTC ICE servers - No comment provided by engineer. - - - Welcome %@! - No comment provided by engineer. - - - Welcome message - No comment provided by engineer. - - - What's new - No comment provided by engineer. - - - When available - No comment provided by engineer. - - - 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. - - - With optional welcome message. - No comment provided by engineer. - - - Wrong database passphrase - No comment provided by engineer. - - - Wrong passphrase! - No comment provided by engineer. - - - You - No comment provided by engineer. - - - You accepted connection - No comment provided by engineer. - - - You allow - No comment provided by engineer. - - - You are already connected to %@. - No comment provided by engineer. - - - You are connected to the server used to receive messages from this contact. - No comment provided by engineer. - - - You are invited to group - 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. - No comment provided by engineer. - - - You can now send messages to %@ - notification body - - - You can set lock screen notification preview via settings. - No comment provided by engineer. - - - You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. - No comment provided by engineer. - - - You can share your address as a link or as a QR code - anybody will be able to connect to you. You won't lose your contacts if you later delete it. - No comment provided by engineer. - - - You can start chat via app Settings / Database or by restarting the app - No comment provided by engineer. - - - You can use markdown to format messages: - No comment provided by engineer. - - - You control through which server(s) **to receive** the messages, your contacts – the servers you use to message them. - 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. - No comment provided by engineer. - - - You invited your contact - No comment provided by engineer. - - - You joined this group - No comment provided by engineer. - - - You joined this group. Connecting to inviting group member. - 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 need to allow your contact to send voice messages to be able to send them. - No comment provided by engineer. - - - You rejected group invitation - No comment provided by engineer. - - - You sent group invitation - No comment provided by engineer. - - - You will be connected to group when the group host's device is online, please wait or check later! - No comment provided by engineer. - - - You will be connected when your connection request is accepted, please wait or check later! - No comment provided by engineer. - - - You will be connected when your contact's device is online, please wait or check later! - No comment provided by engineer. - - - You will be required to authenticate when you start or resume the app after 30 seconds in background. - No comment provided by engineer. - - - You will join a group this link refers to and connect to its group members. - No comment provided by engineer. - - - You will stop receiving messages from this group. Chat history will be preserved. - 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 ICE servers - No comment provided by engineer. - - - Your SMP servers - No comment provided by engineer. - - - Your SimpleX contact address - No comment provided by engineer. - - - Your calls - No comment provided by engineer. - - - Your chat database - No comment provided by engineer. - - - Your chat database is not encrypted - set passphrase to encrypt it. - No comment provided by engineer. - - - Your chat profile - No comment provided by engineer. - - - Your chat profile will be sent to group members - No comment provided by engineer. - - - Your chat profile will be sent to your contact - No comment provided by engineer. - - - Your chat profiles - No comment provided by engineer. - - - Your chat profiles are stored locally, only on your device. - No comment provided by engineer. - - - Your chats - No comment provided by engineer. - - - Your contact address - No comment provided by engineer. - - - Your contact can scan it from the app. - No comment provided by engineer. - - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - No comment provided by engineer. - - - Your contact sent a file that is larger than currently supported maximum size (%@). - No comment provided by engineer. - - - Your contacts can allow full message deletion. - No comment provided by engineer. - - - Your current chat database will be DELETED and REPLACED with the imported one. - No comment provided by engineer. - - - Your current profile - No comment provided by engineer. - - - Your preferences - No comment provided by engineer. - - - Your privacy - No comment provided by engineer. - - - Your profile is stored on your device and shared only with your contacts. -SimpleX servers cannot see your profile. - No comment provided by engineer. - - - Your profile will be sent to the contact that you received this link from - No comment provided by engineer. - - - Your profile, contacts and delivered messages are stored on your device. - No comment provided by engineer. - - - Your random profile - No comment provided by engineer. - - - Your server - No comment provided by engineer. - - - Your server address - No comment provided by engineer. - - - Your settings - No comment provided by engineer. - - - [Contribute](https://github.com/simplex-chat/simplex-chat#contribute) - No comment provided by engineer. - - - [Send us email](mailto:chat@simplex.chat) - No comment provided by engineer. - - - [Star on GitHub](https://github.com/simplex-chat/simplex-chat) - No comment provided by engineer. - - - \_italic_ - No comment provided by engineer. - - - \`a + b` - No comment provided by engineer. - - - above, then choose: - No comment provided by engineer. - - - accepted call - call status - - - admin - member role - - - always - pref value - - - audio call (not e2e encrypted) - No comment provided by engineer. - - - bad message ID - integrity error chat item - - - bad message hash - integrity error chat item - - - bold - No comment provided by engineer. - - - call error - call status - - - call in progress - call status - - - calling… - call status - - - cancelled %@ - feature offered item - - - changed address for you - chat item text - - - changed role of %1$@ to %2$@ - rcv group event chat item - - - changed your role to %@ - rcv group event chat item - - - changing address for %@... - chat item text - - - changing address... - chat item text - - - colored - No comment provided by engineer. - - - complete - No comment provided by engineer. - - - connect to SimpleX Chat developers. - No comment provided by engineer. - - - connected - No comment provided by engineer. - - - connecting - No comment provided by engineer. - - - connecting (accepted) - No comment provided by engineer. - - - connecting (announced) - No comment provided by engineer. - - - connecting (introduced) - No comment provided by engineer. - - - connecting (introduction invitation) - No comment provided by engineer. - - - connecting call… - call status - - - connecting… - chat list item title - - - connection established - chat list item title (it should not be shown - - - connection:%@ - connection information - - - contact has e2e encryption - No comment provided by engineer. - - - contact has no e2e encryption - No comment provided by engineer. - - - creator - No comment provided by engineer. - - - default (%@) - pref value - - - deleted - deleted chat item - - - deleted group - rcv group event chat item - - - direct - connection level description - - - duplicate message - integrity error chat item - - - e2e encrypted - No comment provided by engineer. - - - enabled - enabled status - - - enabled for contact - enabled status - - - enabled for you - enabled status - - - ended - No comment provided by engineer. - - - ended call %@ - call status - - - error - No comment provided by engineer. - - - group deleted - No comment provided by engineer. - - - group profile updated - snd group event chat item - - - iOS Keychain is used to securely store passphrase - it allows receiving push notifications. - No comment provided by engineer. - - - iOS Keychain will be used to securely store passphrase after you restart the app or change passphrase - it will allow receiving push notifications. - No comment provided by engineer. - - - incognito via contact address link - chat list item description - - - incognito via group link - chat list item description - - - incognito via one-time link - chat list item description - - - indirect (%d) - connection level description - - - invalid chat - invalid chat data - - - invalid chat data - No comment provided by engineer. - - - invalid data - invalid chat item - - - invitation to group %@ - group name - - - invited - No comment provided by engineer. - - - invited %@ - rcv group event chat item - - - invited to connect - chat list item title - - - invited via your group link - rcv group event chat item - - - italic - No comment provided by engineer. - - - join as %@ - No comment provided by engineer. - - - left - rcv group event chat item - - - marked deleted - marked deleted chat item preview text - - - member - member role - - - connected - rcv group event chat item - - - message received - notification - - - missed call - call status - - - never - No comment provided by engineer. - - - new message - notification - - - no - pref value - - - no e2e encryption - No comment provided by engineer. - - - off - enabled status - group pref value - - - offered %@ - feature offered item - - - offered %1$@: %2$@ - feature offered item - - - on - group pref value - - - or chat with the developers - No comment provided by engineer. - - - owner - member role - - - peer-to-peer - No comment provided by engineer. - - - received answer… - No comment provided by engineer. - - - received confirmation… - No comment provided by engineer. - - - rejected call - call status - - - removed - No comment provided by engineer. - - - removed %@ - rcv group event chat item - - - removed you - rcv group event chat item - - - sec - network option - - - secret - No comment provided by engineer. - - - starting… - No comment provided by engineer. - - - strike - No comment provided by engineer. - - - this contact - notification title - - - unknown - connection info - - - updated group profile - rcv group event chat item - - - v%@ (%@) - No comment provided by engineer. - - - via contact address link - chat list item description - - - via group link - chat list item description - - - via one-time link - chat list item description - - - via relay - No comment provided by engineer. - - - video call (not e2e encrypted) - No comment provided by engineer. - - - waiting for answer… - No comment provided by engineer. - - - waiting for confirmation… - No comment provided by engineer. - - - wants to connect to you! - No comment provided by engineer. - - - yes - pref value - - - you are invited to group - No comment provided by engineer. - - - you changed address - chat item text - - - you changed address for %@ - chat item text - - - you changed role for yourself to %@ - snd group event chat item - - - you changed role of %1$@ to %2$@ - snd group event chat item - - - you left - snd group event chat item - - - you removed %@ - snd group event chat item - - - you shared one-time link - chat list item description - - - you shared one-time link incognito - chat list item description - - - you: - No comment provided by engineer. - - - \~strike~ - No comment provided by engineer. - - -
- -
- -
- - - SimpleX - Bundle name - - - SimpleX needs camera access to scan QR codes to connect to other users and for video calls. - Privacy - Camera Usage Description - - - SimpleX uses Face ID for local authentication - Privacy - Face ID Usage Description - - - SimpleX needs microphone access for audio and video calls, and to record voice messages. - Privacy - Microphone Usage Description - - - SimpleX needs access to Photo Library for saving captured and received media - Privacy - Photo Library Additions Usage Description - - -
- -
- -
- - - SimpleX NSE - Bundle display name - - - SimpleX NSE - Bundle name - - - Copyright © 2022 SimpleX Chat. All rights reserved. - Copyright (human-readable) - - -
-
diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff index d6ac48d974..8d932c6a01 100644 --- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff +++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff @@ -364,7 +364,7 @@
**Warning**: Instant push notifications require passphrase saved in Keychain. - **Figyelmeztetés**: Az azonnali push-értesítésekhez a kulcstárolóban tárolt jelmondat megadása szükséges. + **Figyelmeztetés**: Az azonnali push-értesítésekhez a kulcstartóban tárolt jelmondat megadása szükséges. No comment provided by engineer. @@ -392,6 +392,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -748,6 +753,10 @@ A hívások kezdeményezése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Az eltűnő üzenetek küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi az ön számára. @@ -755,7 +764,7 @@ Allow downgrade - Korábbi verzióra történő visszatérés engedélyezése + Visszafejlesztés engedélyezése No comment provided by engineer. @@ -785,6 +794,7 @@ Allow sharing + Megosztás engedélyezése No comment provided by engineer. @@ -937,6 +947,10 @@ Archiválás és feltöltés No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database Adatbázis archiválása @@ -1079,6 +1093,7 @@ Blur media + Média elhomályosítása No comment provided by engineer. @@ -1126,11 +1141,23 @@ Hívások No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available A kamera nem elérhető No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Ismerősök meghívása le van tiltva! @@ -1141,6 +1168,10 @@ Ismerősök meghívása nem lehetséges! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Mégse @@ -1252,6 +1283,11 @@ Csevegési adatbázis törölve No comment provided by engineer. + + Chat database exported + Csevegési adatbázis exportálva + No comment provided by engineer. + Chat database imported Csevegési adatbázis importálva @@ -1397,9 +1433,13 @@ Jelkód megerősítése No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades - Adatbázis frissítés megerősítése + Adatbázis fejlesztésének megerősítése No comment provided by engineer. @@ -1452,6 +1492,10 @@ Kapcsolódás számítógéphez No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? Kapcsolódás saját magához? @@ -1526,6 +1570,10 @@ Ez az egyszer használatos hivatkozása! Kapcsolódás a kiszolgálóhoz... (hiba: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Kapcsolódás a számítógéphez @@ -1536,6 +1584,10 @@ Ez az egyszer használatos hivatkozása! Kapcsolat No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Kapcsolódási hiba @@ -1548,6 +1600,7 @@ Ez az egyszer használatos hivatkozása! Connection notifications + Kapcsolódási értesítések No comment provided by engineer. @@ -1585,6 +1638,10 @@ Ez az egyszer használatos hivatkozása! Létező ismerős No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Ismerős elrejtve: @@ -1595,9 +1652,8 @@ Ez az egyszer használatos hivatkozása! Ismerőse kapcsolódott notification - - Contact is not connected yet! - Az ismerőse még nem kapcsolódott! + + Contact is deleted. No comment provided by engineer. @@ -1610,6 +1666,10 @@ Ez az egyszer használatos hivatkozása! Ismerős beállításai No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Ismerősök @@ -1625,6 +1685,14 @@ Ez az egyszer használatos hivatkozása! Folytatás No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Másolás @@ -1797,7 +1865,7 @@ Ez az egyszer használatos hivatkozása! Database downgrade - Visszatérés a korábbi adatbázis verzióra + Adatbázis visszafejlesztése No comment provided by engineer. @@ -1808,7 +1876,7 @@ Ez az egyszer használatos hivatkozása! Database encryption passphrase will be updated and stored in the keychain. - Az adatbázis titkosítási jelmondata frissül és tárolódik a kulcstárolóban. + Az adatbázis titkosítási jelmondata frissül és tárolódik a kulcstartóban. No comment provided by engineer. @@ -1846,12 +1914,12 @@ Ez az egyszer használatos hivatkozása! Database passphrase is different from saved in the keychain. - Az adatbázis jelmondata eltér a kulcstárlóban mentettől. + Az adatbázis jelmondata eltér a kulcstartóban mentettől. No comment provided by engineer. Database passphrase is required to open chat. - Adatbázis jelmondat szükséges a csevegés megnyitásához. + A csevegés megnyitásához adja meg az adatbázis jelmondatát. No comment provided by engineer. @@ -1862,7 +1930,7 @@ Ez az egyszer használatos hivatkozása! Database will be encrypted and the passphrase stored in the keychain. - Az adatbázis titkosítva lesz, a jelmondat pedig a kulcstárolóban lesz tárolva. + Az adatbázis titkosítva lesz, a jelmondat pedig a kulcstartóban lesz tárolva. No comment provided by engineer. @@ -1900,6 +1968,7 @@ Ez az egyszer használatos hivatkozása! Delete %lld messages of members? + Tagok %lld üzenetének törlése? No comment provided by engineer. @@ -1907,11 +1976,6 @@ Ez az egyszer használatos hivatkozása! Töröl %lld üzenetet? No comment provided by engineer. - - Delete Contact - Ismerős törlése - No comment provided by engineer. - Delete address Cím törlése @@ -1967,11 +2031,8 @@ Ez az egyszer használatos hivatkozása! Ismerős törlése No comment provided by engineer. - - Delete contact? -This cannot be undone! - Ismerős törlése? -Ez a művelet nem vonható vissza! + + Delete contact? No comment provided by engineer. @@ -2064,11 +2125,6 @@ Ez a művelet nem vonható vissza! Régi adatbázis törlése? No comment provided by engineer. - - Delete pending connection - Függőben lévő kapcsolat törlése - No comment provided by engineer. - Delete pending connection? Függő kapcsolatfelvételi kérések törlése? @@ -2084,11 +2140,19 @@ Ez a művelet nem vonható vissza! Várólista törlése server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Felhasználói profil törlése? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted Törölve @@ -2104,6 +2168,10 @@ Ez a művelet nem vonható vissza! Törölve ekkor: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors Törlési hibák @@ -2146,6 +2214,7 @@ Ez a művelet nem vonható vissza! Destination server address of %@ is incompatible with forwarding server %@ settings. + A(z) %@ célkiszolgáló címe nem kompatibilis a(z) %@ továbbító kiszolgáló beállításaival. No comment provided by engineer. @@ -2155,6 +2224,7 @@ Ez a művelet nem vonható vissza! Destination server version of %@ is incompatible with forwarding server %@. + A(z) %@ célkiszolgáló verziója nem kompatibilis a(z) %@ továbbító kiszolgálóval. No comment provided by engineer. @@ -2172,6 +2242,10 @@ Ez a művelet nem vonható vissza! Fejlesztés No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Fejlesztői eszközök @@ -2224,6 +2298,7 @@ Ez a művelet nem vonható vissza! Disabled + Letiltva No comment provided by engineer. @@ -2318,7 +2393,7 @@ Ez a művelet nem vonható vissza! Downgrade and open chat - Visszatérés a korábbi verzióra és a csevegés megnyitása + Visszafejlesztés és a csevegés megnyitása No comment provided by engineer. @@ -2453,6 +2528,7 @@ Ez a művelet nem vonható vissza! Enabled + Engedélyezve No comment provided by engineer. @@ -2507,7 +2583,7 @@ Ez a művelet nem vonható vissza! Encrypted message: keychain error - Titkosított üzenet: kulcstároló hiba + Titkosított üzenet: kulcstartó hiba notification @@ -2627,6 +2703,7 @@ Ez a művelet nem vonható vissza! Error connecting to forwarding server %@. Please try later. + Hiba a(z) %@ továbbító kiszolgálóhoz való kapcsolódáskor. Próbálja meg később. No comment provided by engineer. @@ -2679,11 +2756,6 @@ Ez a művelet nem vonható vissza! Hiba a kapcsolat törlésekor No comment provided by engineer. - - Error deleting contact - Hiba az ismerős törlésekor - No comment provided by engineer. - Error deleting database Hiba az adatbázis törlésekor @@ -2801,7 +2873,7 @@ Ez a művelet nem vonható vissza! Error saving passphrase to keychain - Hiba a jelmondat kulcstárolóba történő mentésekor + Hiba a jelmondat kulcstartóba történő mentésekor No comment provided by engineer. @@ -2920,6 +2992,10 @@ Ez a művelet nem vonható vissza! Akkor is, ha le van tiltva a beszélgetésben. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Kilépés mentés nélkül @@ -3137,14 +3213,17 @@ Ez a művelet nem vonható vissza! Forwarding server %@ failed to connect to destination server %@. Please try later. + A(z) %@ továbbító kiszolgáló nem tudott csatlakozni a(z) %@ célkiszolgálóhoz. Próbálja meg később. No comment provided by engineer. Forwarding server address is incompatible with network settings: %@. + A továbbító kiszolgáló címe nem kompatibilis a hálózati beállításokkal: %@. No comment provided by engineer. Forwarding server version is incompatible with network settings: %@. + A továbbító kiszolgáló verziója nem kompatibilis a hálózati beállításokkal: %@. No comment provided by engineer. @@ -3729,6 +3808,10 @@ Hiba: %2$@ 3. A kapcsolat sérült. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Úgy tűnik, már kapcsolódott ezen a hivatkozáson keresztül. Ha ez nem így van, akkor hiba történt (%@). @@ -3791,6 +3874,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz! Megtart No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop A számítógépről való használathoz tartsd nyitva az alkalmazást @@ -3808,12 +3895,12 @@ Ez az ön hivatkozása a(z) %@ csoporthoz! KeyChain error - Kulcstároló hiba + Kulcstartó hiba No comment provided by engineer. Keychain error - Kulcstároló hiba + Kulcstartó hiba No comment provided by engineer. @@ -3966,8 +4053,14 @@ Ez az ön hivatkozása a(z) %@ csoporthoz! Max. 30 másodperc, azonnal érkezett. No comment provided by engineer. + + Media & file servers + Média és fájlkiszolgálók + No comment provided by engineer. + Medium + Közepes blur media @@ -4055,14 +4148,9 @@ Ez az ön hivatkozása a(z) %@ csoporthoz! Üzenetjelentés No comment provided by engineer. - - Message routing fallback - Üzenet útválasztási tartalék - No comment provided by engineer. - - - Message routing mode - Üzenet útválasztási mód + + Message servers + Üzenetkiszolgálók No comment provided by engineer. @@ -4190,6 +4278,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz! Moderálás chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Moderálva lett ekkor: @@ -4265,6 +4357,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz! Hálózat állapota No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Új jelkód @@ -4397,6 +4493,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz! Nothing selected + Semmi sincs kiválasztva No comment provided by engineer. @@ -4443,19 +4540,27 @@ Ez az ön hivatkozása a(z) %@ csoporthoz! Régi adatbázis archívum No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Egyszer használatos meghívó hivatkozás No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - A kapcsolódáshoz Onion kiszolgálókra lesz szükség. VPN engedélyezése szükséges. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + A kapcsolódáshoz Onion kiszolgálókra lesz szükség. +VPN engedélyezése szükséges. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Onion kiszolgálók használata, ha azok rendelkezésre állnak. VPN engedélyezése szükséges. + + Onion hosts will be used when available. +Requires compatible VPN. + Onion kiszolgálók használata, ha azok rendelkezésre állnak. +VPN engedélyezése szükséges. No comment provided by engineer. @@ -4468,6 +4573,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz! Csak a klienseszközök tárolják a felhasználói profilokat, névjegyeket, csoportokat és a **2 rétegű végponttól-végpontig titkosítással** küldött üzeneteket. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Csak a csoporttulajdonosok módosíthatják a csoportbeállításokat. @@ -4703,6 +4812,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz! Kép a képben hívások No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Ismerős felkérése, hogy engedélyezze a hangüzenetek küldését. @@ -5004,6 +5117,10 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Értékelje az alkalmazást No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Reagálj… @@ -5216,7 +5333,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Remove passphrase from keychain? - Jelmondat eltávolítása a kulcstárolóból? + Jelmondat eltávolítása a kulcstartóból? No comment provided by engineer. @@ -5266,7 +5383,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Required - Megkövetelt + Szükséges No comment provided by engineer. @@ -5344,11 +5461,6 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Felfedés chat item action - - Revert - Visszaállítás - No comment provided by engineer. - Revoke Visszavonás @@ -5379,11 +5491,6 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< SMP-kiszolgáló No comment provided by engineer. - - SMP servers - SMP kiszolgálók - No comment provided by engineer. - Safely receive files Fájlok biztonságos fogadása @@ -5414,6 +5521,11 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Mentés és a csoporttagok értesítése No comment provided by engineer. + + Save and reconnect + Mentés és újrakapcsolódás + No comment provided by engineer. + Save and update group profile Mentés és csoportprofil frissítése @@ -5441,7 +5553,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Save passphrase in Keychain - Jelmondat mentése a kulcstárban + Jelmondat mentése a kulcstartóba No comment provided by engineer. @@ -5576,6 +5688,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Selected %lld + %lld kiválasztva No comment provided by engineer. @@ -5618,11 +5731,6 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< A kézbesítési jelentéseket a következő címre kell küldeni No comment provided by engineer. - - Send direct message - Közvetlen üzenet küldése - No comment provided by engineer. - Send direct message to connect Közvetlen üzenet küldése a kapcsolódáshoz @@ -5648,6 +5756,10 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Élő üzenet küldése No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. Közvetlen üzenetküldés, ha az IP-cím védett és az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást. @@ -5945,11 +6057,12 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Share to SimpleX + Megosztás a SimpleX-ben No comment provided by engineer. Share with contacts - Megosztás ismerősökkel + Megosztás az ismerősökkel No comment provided by engineer. @@ -6099,13 +6212,24 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Soft + Enyhe blur media + + Some file(s) were not exported: + Néhány fájl nem került exportálásra: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Néhány nem végzetes hiba történt az importálás során – további részletekért a csevegési konzolban olvashat. No comment provided by engineer. + + Some non-fatal errors occurred during import: + Néhány nem végzetes hiba történt az importálás során: + No comment provided by engineer. + Somebody Valaki @@ -6203,6 +6327,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Strong + Erős blur media @@ -6240,6 +6365,11 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Rendszerhitelesítés No comment provided by engineer. + + TCP connection + TCP kapcsolat + No comment provided by engineer. + TCP connection timeout TCP kapcsolat időtúllépés @@ -6300,11 +6430,6 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.< Koppintson a beolvasáshoz No comment provided by engineer. - - Tap to start a new chat - Koppintson az új csevegés indításához - No comment provided by engineer. - Temporary file error Ideiglenes fájlhiba @@ -6414,10 +6539,12 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő. The messages will be deleted for all members. + Az üzenetek minden tag számára törlésre kerülnek. No comment provided by engineer. The messages will be marked as moderated for all members. + Az üzenetek moderáltként lesznek megjelölve minden tag számára. No comment provided by engineer. @@ -6779,11 +6906,6 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol Frissítés No comment provided by engineer. - - Update .onion hosts setting? - Tor .onion kiszolgálók beállításainak frissítése? - No comment provided by engineer. - Update database passphrase Adatbázis jelmondat megváltoztatása @@ -6794,9 +6916,9 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol Hálózati beállítások megváltoztatása? No comment provided by engineer. - - Update transport isolation mode? - Kapcsolat izolációs mód frissítése? + + Update settings? + Beállítások frissítése? No comment provided by engineer. @@ -6804,14 +6926,9 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol A beállítások frissítése a kiszolgálókhoz való újra kapcsolódással jár. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - A beállítás frissítésével a kliens újrakapcsolódik az összes kiszolgálóhoz. - No comment provided by engineer. - Upgrade and open chat - A csevegés frissítése és megnyitása + Fejlesztés és a csevegés megnyitása No comment provided by engineer. @@ -6909,6 +7026,10 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol Használja az alkalmazást hívás közben. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Felhasználói profil @@ -6919,11 +7040,6 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol Felhasználó kiválasztása No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - A .onion kiszolgálók használatához kompatibilis VPN szolgáltatóra van szükség. - No comment provided by engineer. - Using SimpleX Chat servers. SimpleX Chat kiszolgálók használatban. @@ -7161,12 +7277,12 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol Wrong database passphrase - Téves adatbázis jelmondat + Hibás adatbázis jelmondat No comment provided by engineer. Wrong key or unknown connection - most likely this connection is deleted. - Rossz kulcs vagy ismeretlen kapcsolat - valószínűleg ez a kapcsolat törlődött. + Hibás kulcs vagy ismeretlen kapcsolat - valószínűleg ez a kapcsolat törlődött. snd error text @@ -7176,7 +7292,7 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol Wrong passphrase! - Téves jelmondat! + Hibás jelmondat! No comment provided by engineer. @@ -7184,11 +7300,6 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol XFTP-kiszolgáló No comment provided by engineer. - - XFTP servers - XFTP kiszolgálók - No comment provided by engineer. - You Ön @@ -7311,6 +7422,10 @@ Csatlakozási kérés megismétlése? Mostantól küldhet üzeneteket %@ számára notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. A beállításokon keresztül beállíthatja a lezárási képernyő értesítési előnézetét. @@ -7336,6 +7451,10 @@ Csatlakozási kérés megismétlése? A csevegést az alkalmazás Beállítások / Adatbázis menü segítségével vagy az alkalmazás újraindításával indíthatja el No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. A SimpleX zár az „Adatvédelem és biztonság” menüben kapcsolható be. @@ -7378,11 +7497,6 @@ Repeat connection request? Kapcsolódási kérés megismétlése? No comment provided by engineer. - - You have no chats - Nincsenek csevegési üzenetek - No comment provided by engineer. - You have to enter passphrase every time the app starts - it is not stored on the device. A jelmondatot minden alkalommal meg kell adnia, amikor az alkalmazás elindul - nem az eszközön kerül tárolásra. @@ -7403,11 +7517,25 @@ Kapcsolódási kérés megismétlése? Csatlakozott ehhez a csoporthoz. Kapcsolódás a meghívó csoporttaghoz. No comment provided by engineer. + + You may migrate the exported database. + Az exportált adatbázist átköltöztetheti. + No comment provided by engineer. + + + You may save the exported archive. + Az exportált archívumot elmentheti. + 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. A csevegési adatbázis legfrissebb verzióját CSAK egy eszközön kell használnia, ellenkező esetben előfordulhat, hogy az üzeneteket nem fogja megkapni valamennyi ismerőstől. No comment provided by engineer. + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Hangüzeneteket küldéséhez engedélyeznie kell azok küldését az ismerősök számára. @@ -7523,13 +7651,6 @@ Kapcsolódási kérés megismétlése? Csevegési profilok No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Az ismerősének online kell lennie ahhoz, hogy a kapcsolat létrejöjjön. -Visszavonhatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Ismerőse olyan fájlt küldött, amely meghaladja a jelenleg támogatott maximális méretet (%@). @@ -7545,6 +7666,10 @@ Visszavonhatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt kés Az ismerősei továbbra is kapcsolódva maradnak. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. A jelenlegi csevegési adatbázis TÖRLŐDNI FOG, és a HELYÉRE az importált adatbázis kerül. @@ -7722,6 +7847,10 @@ A SimpleX kiszolgálók nem látjhatják profilját. félkövér No comment provided by engineer. + + call + No comment provided by engineer. + call error hiba a hívásban @@ -8039,12 +8168,12 @@ A SimpleX kiszolgálók nem látjhatják profilját. iOS Keychain is used to securely store passphrase - it allows receiving push notifications. - Az iOS kulcstár a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását. + Az iOS kulcstartó a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását. No comment provided by engineer. iOS Keychain will be used to securely store passphrase after you restart the app or change passphrase - it will allow receiving push notifications. - Az iOS kulcstár az alkalmazás újraindítása, vagy a jelmondat módosítása után a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását. + Az iOS kulcstartó az alkalmazás újraindítása, vagy a jelmondat módosítása után a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását. No comment provided by engineer. @@ -8092,6 +8221,10 @@ A SimpleX kiszolgálók nem látjhatják profilját. meghívás a(z) %@ csoportba group name + + invite + No comment provided by engineer. + invited meghíva @@ -8147,6 +8280,10 @@ A SimpleX kiszolgálók nem látjhatják profilját. kapcsolódott rcv group event chat item + + message + No comment provided by engineer. + message received üzenet érkezett @@ -8177,6 +8314,10 @@ A SimpleX kiszolgálók nem látjhatják profilját. hónap time unit + + mute + No comment provided by engineer. + never soha @@ -8309,6 +8450,10 @@ A SimpleX kiszolgálók nem látjhatják profilját. mentve innen: %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec mp @@ -8383,8 +8528,8 @@ utoljára fogadott üzenet: %2$@ ismeretlen connection info - - unknown relays + + unknown servers ismeretlen átjátszók No comment provided by engineer. @@ -8393,6 +8538,10 @@ utoljára fogadott üzenet: %2$@ ismeretlen státusz No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected nem védett @@ -8438,6 +8587,10 @@ utoljára fogadott üzenet: %2$@ átjátszón keresztül No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) videóhívás (nem e2e titkosított) @@ -8616,14 +8769,17 @@ utoljára fogadott üzenet: %2$@ SimpleX SE + SimpleX SE Bundle display name SimpleX SE + SimpleX SE Bundle name Copyright © 2024 SimpleX Chat. All rights reserved. + Copyright © 2024 SimpleX Chat. Minden jog fenntartva. Copyright (human-readable) @@ -8635,150 +8791,187 @@ utoljára fogadott üzenet: %2$@ %@ + %@ No comment provided by engineer. App is locked! + Az alkalmazás zárolva! No comment provided by engineer. Cancel + Mégse No comment provided by engineer. Cannot access keychain to save database password + Nem lehet hozzáférni a kulcstartóhoz az adatbázis jelszavának mentéséhez No comment provided by engineer. Cannot forward message + Nem lehet továbbítani az üzenetet No comment provided by engineer. Comment + Hozzászólás No comment provided by engineer. Currently maximum supported file size is %@. + Jelenleg a maximális támogatott fájlméret %@. No comment provided by engineer. Database downgrade required + Adatbázis visszafejlesztése szükséges No comment provided by engineer. Database encrypted! + Adatbázis titkosítva! No comment provided by engineer. Database error + Adatbázis hiba No comment provided by engineer. Database passphrase is different from saved in the keychain. + Az adatbázis jelmondata eltér a kulcstartóban lévőtől. No comment provided by engineer. Database passphrase is required to open chat. + Adatbázis jelmondat szükséges a csevegés megnyitásához. No comment provided by engineer. Database upgrade required - No comment provided by engineer. - - - Dismiss Sheet + Adatbázis fejlesztése szükséges No comment provided by engineer. Error preparing file + Hiba a fájl előkészítésekor No comment provided by engineer. Error preparing message + Hiba az üzenet előkészítésekor No comment provided by engineer. Error: %@ + Hiba: %@ No comment provided by engineer. File error + Fájlhiba No comment provided by engineer. Incompatible database version + Nem kompatibilis adatbázis verzió No comment provided by engineer. Invalid migration confirmation - No comment provided by engineer. - - - Keep Trying + Érvénytelen átköltöztetési visszaigazolás No comment provided by engineer. Keychain error + Kulcstartó hiba No comment provided by engineer. Large file! + Nagy fájl! No comment provided by engineer. No active profile - No comment provided by engineer. - - - No network connection + Nincs aktív profil No comment provided by engineer. Ok + Rendben No comment provided by engineer. Open the app to downgrade the database. + Nyissa meg az alkalmazást az adatbázis visszafejlesztéséhez. No comment provided by engineer. Open the app to upgrade the database. + Nyissa meg az alkalmazást az adatbázis fejlesztéséhez. No comment provided by engineer. Passphrase + Jelmondat No comment provided by engineer. Please create a profile in the SimpleX app + Hozzon létre egy profilt a SimpleX alkalmazásban No comment provided by engineer. Selected chat preferences prohibit this message. + A kiválasztott csevegési beállítások tiltják ezt az üzenetet. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + Az üzenet elküldése a vártnál tovább tart. + No comment provided by engineer. + + + Sending message… + Üzenet küldése… No comment provided by engineer. Share + Megosztás + No comment provided by engineer. + + + Slow network? + Lassú internetkapcsolat? No comment provided by engineer. Unknown database error: %@ + Ismeretlen adatbázis hiba: %@ No comment provided by engineer. Unsupported format + Nem támogatott formátum + No comment provided by engineer. + + + Wait + Várjon No comment provided by engineer. Wrong database passphrase + Hibás adatbázis jelmondat No comment provided by engineer. You can allow sharing in Privacy & Security / SimpleX Lock settings. + A megosztást az Adatvédelem és biztonság / SimpleX zár menüpontban engedélyezheti. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff index e196830ac4..2049816358 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -392,6 +392,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -748,6 +753,10 @@ Consenti le chiamate solo se il tuo contatto le consente. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Consenti i messaggi a tempo solo se il contatto li consente a te. @@ -785,6 +794,7 @@ Allow sharing + Consenti la condivisione No comment provided by engineer. @@ -937,6 +947,10 @@ Archivia e carica No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database Archiviazione del database @@ -1079,6 +1093,7 @@ Blur media + Sfocatura file multimediali No comment provided by engineer. @@ -1126,11 +1141,23 @@ Chiamate No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available Fotocamera non disponibile No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Impossibile invitare il contatto! @@ -1141,6 +1168,10 @@ Impossibile invitare i contatti! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Annulla @@ -1252,6 +1283,11 @@ Database della chat eliminato No comment provided by engineer. + + Chat database exported + Database della chat esportato + No comment provided by engineer. + Chat database imported Database della chat importato @@ -1397,6 +1433,10 @@ Conferma il codice di accesso No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Conferma aggiornamenti database @@ -1452,6 +1492,10 @@ Connetti al desktop No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? Connettersi a te stesso? @@ -1526,6 +1570,10 @@ Questo è il tuo link una tantum! Connessione al server… (errore: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Connessione al desktop @@ -1536,6 +1584,10 @@ Questo è il tuo link una tantum! Connessione No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Errore di connessione @@ -1548,6 +1600,7 @@ Questo è il tuo link una tantum! Connection notifications + Notifiche di connessione No comment provided by engineer. @@ -1585,6 +1638,10 @@ Questo è il tuo link una tantum! Il contatto esiste già No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Contatto nascosto: @@ -1595,9 +1652,8 @@ Questo è il tuo link una tantum! Il contatto è connesso notification - - Contact is not connected yet! - Il contatto non è ancora connesso! + + Contact is deleted. No comment provided by engineer. @@ -1610,6 +1666,10 @@ Questo è il tuo link una tantum! Preferenze del contatto No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Contatti @@ -1625,6 +1685,14 @@ Questo è il tuo link una tantum! Continua No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Copia @@ -1900,6 +1968,7 @@ Questo è il tuo link una tantum! Delete %lld messages of members? + Eliminare %lld messaggi dei membri? No comment provided by engineer. @@ -1907,11 +1976,6 @@ Questo è il tuo link una tantum! Eliminare %lld messaggi? No comment provided by engineer. - - Delete Contact - Elimina contatto - No comment provided by engineer. - Delete address Elimina indirizzo @@ -1967,11 +2031,8 @@ Questo è il tuo link una tantum! Elimina contatto No comment provided by engineer. - - Delete contact? -This cannot be undone! - Eliminare il contatto? -Non è reversibile! + + Delete contact? No comment provided by engineer. @@ -2064,11 +2125,6 @@ Non è reversibile! Eliminare il database vecchio? No comment provided by engineer. - - Delete pending connection - Elimina connessione in attesa - No comment provided by engineer. - Delete pending connection? Eliminare la connessione in attesa? @@ -2084,11 +2140,19 @@ Non è reversibile! Elimina coda server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Eliminare il profilo utente? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted Eliminato @@ -2104,6 +2168,10 @@ Non è reversibile! Eliminato il: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors Errori di eliminazione @@ -2146,6 +2214,7 @@ Non è reversibile! Destination server address of %@ is incompatible with forwarding server %@ settings. + L'indirizzo del server di destinazione di %@ è incompatibile con le impostazioni del server di inoltro %@. No comment provided by engineer. @@ -2155,6 +2224,7 @@ Non è reversibile! Destination server version of %@ is incompatible with forwarding server %@. + La versione del server di destinazione di %@ è incompatibile con il server di inoltro %@. No comment provided by engineer. @@ -2172,6 +2242,10 @@ Non è reversibile! Sviluppa No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Strumenti di sviluppo @@ -2224,6 +2298,7 @@ Non è reversibile! Disabled + Disattivato No comment provided by engineer. @@ -2453,6 +2528,7 @@ Non è reversibile! Enabled + Attivato No comment provided by engineer. @@ -2627,6 +2703,7 @@ Non è reversibile! Error connecting to forwarding server %@. Please try later. + Errore di connessione al server di inoltro %@. Riprova più tardi. No comment provided by engineer. @@ -2679,11 +2756,6 @@ Non è reversibile! Errore nell'eliminazione della connessione No comment provided by engineer. - - Error deleting contact - Errore nell'eliminazione del contatto - No comment provided by engineer. - Error deleting database Errore nell'eliminazione del database @@ -2920,6 +2992,10 @@ Non è reversibile! Anche quando disattivato nella conversazione. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Esci senza salvare @@ -3137,14 +3213,17 @@ Non è reversibile! Forwarding server %@ failed to connect to destination server %@. Please try later. + Il server di inoltro %@ non è riuscito a connettersi al server di destinazione %@. Riprova più tardi. No comment provided by engineer. Forwarding server address is incompatible with network settings: %@. + L'indirizzo del server di inoltro è incompatibile con le impostazioni di rete: %@. No comment provided by engineer. Forwarding server version is incompatible with network settings: %@. + La versione del server di inoltro è incompatibile con le impostazioni di rete: %@. No comment provided by engineer. @@ -3729,6 +3808,10 @@ Errore: %2$@ 3. La connessione è stata compromessa. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Sembra che tu sia già connesso tramite questo link. In caso contrario, c'è stato un errore (%@). @@ -3791,6 +3874,10 @@ Questo è il tuo link per il gruppo %@! Tieni No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop Tieni aperta l'app per usarla dal desktop @@ -3966,8 +4053,14 @@ Questo è il tuo link per il gruppo %@! Max 30 secondi, ricevuto istantaneamente. No comment provided by engineer. + + Media & file servers + Server di multimediali e file + No comment provided by engineer. + Medium + Media blur media @@ -4055,14 +4148,9 @@ Questo è il tuo link per il gruppo %@! Ricezione messaggi No comment provided by engineer. - - Message routing fallback - Ripiego instradamento messaggio - No comment provided by engineer. - - - Message routing mode - Modalità instradamento messaggio + + Message servers + Server dei messaggi No comment provided by engineer. @@ -4190,6 +4278,10 @@ Questo è il tuo link per il gruppo %@! Modera chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Moderato il @@ -4265,6 +4357,10 @@ Questo è il tuo link per il gruppo %@! Stato della rete No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Nuovo codice di accesso @@ -4397,6 +4493,7 @@ Questo è il tuo link per il gruppo %@! Nothing selected + Nessuna selezione No comment provided by engineer. @@ -4443,19 +4540,27 @@ Questo è il tuo link per il gruppo %@! Vecchio archivio del database No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Link di invito una tantum No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Gli host Onion saranno necessari per la connessione. Richiede l'attivazione della VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Gli host Onion saranno **necessari** per la connessione. +Richiede l'attivazione della VPN. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Gli host Onion verranno usati quando disponibili. Richiede l'attivazione della VPN. + + Onion hosts will be used when available. +Requires compatible VPN. + Gli host Onion verranno usati quando disponibili. +Richiede l'attivazione della VPN. No comment provided by engineer. @@ -4468,6 +4573,10 @@ Questo è il tuo link per il gruppo %@! Solo i dispositivi client archiviano profili utente, i contatti, i gruppi e i messaggi inviati con la **crittografia end-to-end a 2 livelli**. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Solo i proprietari del gruppo possono modificarne le preferenze. @@ -4703,6 +4812,10 @@ Questo è il tuo link per il gruppo %@! Chiamate picture-in-picture No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Chiedi al tuo contatto di attivare l'invio dei messaggi vocali. @@ -5004,6 +5117,10 @@ Attivalo nelle impostazioni *Rete e server*. Valuta l'app No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Reagisci… @@ -5344,11 +5461,6 @@ Attivalo nelle impostazioni *Rete e server*. Rivela chat item action - - Revert - Ripristina - No comment provided by engineer. - Revoke Revoca @@ -5379,11 +5491,6 @@ Attivalo nelle impostazioni *Rete e server*. Server SMP No comment provided by engineer. - - SMP servers - Server SMP - No comment provided by engineer. - Safely receive files Ricevi i file in sicurezza @@ -5414,6 +5521,11 @@ Attivalo nelle impostazioni *Rete e server*. Salva e avvisa i membri del gruppo No comment provided by engineer. + + Save and reconnect + Salva e riconnetti + No comment provided by engineer. + Save and update group profile Salva e aggiorna il profilo del gruppo @@ -5576,6 +5688,7 @@ Attivalo nelle impostazioni *Rete e server*. Selected %lld + %lld selezionato No comment provided by engineer. @@ -5618,11 +5731,6 @@ Attivalo nelle impostazioni *Rete e server*. Invia ricevute di consegna a No comment provided by engineer. - - Send direct message - Invia messaggio diretto - No comment provided by engineer. - Send direct message to connect Invia messaggio diretto per connetterti @@ -5648,6 +5756,10 @@ Attivalo nelle impostazioni *Rete e server*. Invia messaggio in diretta No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. Invia messaggi direttamente quando l'indirizzo IP è protetto e il tuo server o quello di destinazione non supporta l'instradamento privato. @@ -5945,6 +6057,7 @@ Attivalo nelle impostazioni *Rete e server*. Share to SimpleX + Condividi in SimpleX No comment provided by engineer. @@ -6099,13 +6212,24 @@ Attivalo nelle impostazioni *Rete e server*. Soft + Leggera blur media + + Some file(s) were not exported: + Alcuni file non sono stati esportati: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Si sono verificati alcuni errori non gravi durante l'importazione: vedi la console della chat per i dettagli. No comment provided by engineer. + + Some non-fatal errors occurred during import: + Si sono verificati alcuni errori non fatali durante l'importazione: + No comment provided by engineer. + Somebody Qualcuno @@ -6203,6 +6327,7 @@ Attivalo nelle impostazioni *Rete e server*. Strong + Forte blur media @@ -6240,6 +6365,11 @@ Attivalo nelle impostazioni *Rete e server*. Autenticazione di sistema No comment provided by engineer. + + TCP connection + Connessione TCP + No comment provided by engineer. + TCP connection timeout Scadenza connessione TCP @@ -6300,11 +6430,6 @@ Attivalo nelle impostazioni *Rete e server*. Tocca per scansionare No comment provided by engineer. - - Tap to start a new chat - Tocca per iniziare una chat - No comment provided by engineer. - Temporary file error Errore del file temporaneo @@ -6414,10 +6539,12 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa. The messages will be deleted for all members. + I messaggi verranno eliminati per tutti i membri. No comment provided by engineer. The messages will be marked as moderated for all members. + I messaggi verranno contrassegnati come moderati per tutti i membri. No comment provided by engineer. @@ -6779,11 +6906,6 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Aggiorna No comment provided by engineer. - - Update .onion hosts setting? - Aggiornare l'impostazione degli host .onion? - No comment provided by engineer. - Update database passphrase Aggiorna la password del database @@ -6794,9 +6916,9 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Aggiornare le impostazioni di rete? No comment provided by engineer. - - Update transport isolation mode? - Aggiornare la modalità di isolamento del trasporto? + + Update settings? + Aggiornare le impostazioni? No comment provided by engineer. @@ -6804,11 +6926,6 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e L'aggiornamento delle impostazioni riconnetterà il client a tutti i server. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - L'aggiornamento di questa impostazione riconnetterà il client a tutti i server. - No comment provided by engineer. - Upgrade and open chat Aggiorna e apri chat @@ -6909,6 +7026,10 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Usa l'app mentre sei in chiamata. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Profilo utente @@ -6919,11 +7040,6 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Selezione utente No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - L'uso di host .onion richiede un fornitore di VPN compatibile. - No comment provided by engineer. - Using SimpleX Chat servers. Utilizzo dei server SimpleX Chat. @@ -7184,11 +7300,6 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Server XFTP No comment provided by engineer. - - XFTP servers - Server XFTP - No comment provided by engineer. - You Tu @@ -7311,6 +7422,10 @@ Ripetere la richiesta di ingresso? Ora puoi inviare messaggi a %@ notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. Puoi impostare l'anteprima della notifica nella schermata di blocco tramite le impostazioni. @@ -7336,6 +7451,10 @@ Ripetere la richiesta di ingresso? Puoi avviare la chat via Impostazioni / Database o riavviando l'app No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. Puoi attivare SimpleX Lock tramite le impostazioni. @@ -7378,11 +7497,6 @@ Repeat connection request? Ripetere la richiesta di connessione? No comment provided by engineer. - - You have no chats - Non hai chat - No comment provided by engineer. - You have to enter passphrase every time the app starts - it is not stored on the device. Devi inserire la password ogni volta che si avvia l'app: non viene memorizzata sul dispositivo. @@ -7403,11 +7517,25 @@ Ripetere la richiesta di connessione? Sei entrato/a in questo gruppo. Connessione al membro del gruppo invitante. No comment provided by engineer. + + You may migrate the exported database. + Puoi migrare il database esportato. + No comment provided by engineer. + + + You may save the exported archive. + Puoi salvare l'archivio esportato. + 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. Devi usare la versione più recente del tuo database della chat SOLO su un dispositivo, altrimenti potresti non ricevere più i messaggi da alcuni contatti. No comment provided by engineer. + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Devi consentire al tuo contatto di inviare messaggi vocali per poterli inviare anche tu. @@ -7523,13 +7651,6 @@ Ripetere la richiesta di connessione? I tuoi profili di chat No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Il tuo contatto deve essere in linea per completare la connessione. -Puoi annullare questa connessione e rimuovere il contatto (e riprovare più tardi con un link nuovo). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Il tuo contatto ha inviato un file più grande della dimensione massima attualmente supportata (%@). @@ -7545,6 +7666,10 @@ Puoi annullare questa connessione e rimuovere il contatto (e riprovare più tard I tuoi contatti resteranno connessi. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Il tuo attuale database della chat verrà ELIMINATO e SOSTITUITO con quello importato. @@ -7722,6 +7847,10 @@ I server di SimpleX non possono vedere il tuo profilo. grassetto No comment provided by engineer. + + call + No comment provided by engineer. + call error errore di chiamata @@ -8092,6 +8221,10 @@ I server di SimpleX non possono vedere il tuo profilo. invito al gruppo %@ group name + + invite + No comment provided by engineer. + invited ha invitato @@ -8147,6 +8280,10 @@ I server di SimpleX non possono vedere il tuo profilo. si è connesso/a rcv group event chat item + + message + No comment provided by engineer. + message received messaggio ricevuto @@ -8177,6 +8314,10 @@ I server di SimpleX non possono vedere il tuo profilo. mesi time unit + + mute + No comment provided by engineer. + never mai @@ -8309,6 +8450,10 @@ I server di SimpleX non possono vedere il tuo profilo. salvato da %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec sec @@ -8383,8 +8528,8 @@ ultimo msg ricevuto: %2$@ sconosciuto connection info - - unknown relays + + unknown servers relay sconosciuti No comment provided by engineer. @@ -8393,6 +8538,10 @@ ultimo msg ricevuto: %2$@ stato sconosciuto No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected non protetto @@ -8438,6 +8587,10 @@ ultimo msg ricevuto: %2$@ via relay No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) videochiamata (non crittografata e2e) @@ -8616,14 +8769,17 @@ ultimo msg ricevuto: %2$@ SimpleX SE + SimpleX SE Bundle display name SimpleX SE + SimpleX SE Bundle name Copyright © 2024 SimpleX Chat. All rights reserved. + Copyright © 2024 SimpleX Chat. Tutti i diritti riservati. Copyright (human-readable) @@ -8635,150 +8791,187 @@ ultimo msg ricevuto: %2$@ %@ + %@ No comment provided by engineer. App is locked! + L'app è bloccata! No comment provided by engineer. Cancel + Annulla No comment provided by engineer. Cannot access keychain to save database password + Impossibile accedere al portachiavi per salvare la password del database No comment provided by engineer. Cannot forward message + Impossibile inoltrare il messaggio No comment provided by engineer. Comment + Commento No comment provided by engineer. Currently maximum supported file size is %@. + Attualmente la dimensione massima supportata è di %@. No comment provided by engineer. Database downgrade required + Downgrade del database necessario No comment provided by engineer. Database encrypted! + Database crittografato! No comment provided by engineer. Database error + Errore del database No comment provided by engineer. Database passphrase is different from saved in the keychain. + La password del database è diversa da quella salvata nel portachiavi. No comment provided by engineer. Database passphrase is required to open chat. + La password del database è necessaria per aprire la chat. No comment provided by engineer. Database upgrade required - No comment provided by engineer. - - - Dismiss Sheet + Aggiornamento del database necessario No comment provided by engineer. Error preparing file + Errore nella preparazione del file No comment provided by engineer. Error preparing message + Errore nella preparazione del messaggio No comment provided by engineer. Error: %@ + Errore: %@ No comment provided by engineer. File error + Errore del file No comment provided by engineer. Incompatible database version + Versione del database incompatibile No comment provided by engineer. Invalid migration confirmation - No comment provided by engineer. - - - Keep Trying + Conferma di migrazione non valida No comment provided by engineer. Keychain error + Errore del portachiavi No comment provided by engineer. Large file! + File grande! No comment provided by engineer. No active profile - No comment provided by engineer. - - - No network connection + Nessun profilo attivo No comment provided by engineer. Ok + Ok No comment provided by engineer. Open the app to downgrade the database. + Apri l'app per eseguire il downgrade del database. No comment provided by engineer. Open the app to upgrade the database. + Apri l'app per aggiornare il database. No comment provided by engineer. Passphrase + Password No comment provided by engineer. Please create a profile in the SimpleX app + Crea un profilo nell'app SimpleX No comment provided by engineer. Selected chat preferences prohibit this message. + Le preferenze della chat selezionata vietano questo messaggio. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + L'invio di un messaggio richiede più tempo del previsto. + No comment provided by engineer. + + + Sending message… + Invio messaggio… No comment provided by engineer. Share + Condividi + No comment provided by engineer. + + + Slow network? + Rete lenta? No comment provided by engineer. Unknown database error: %@ + Errore del database sconosciuto: %@ No comment provided by engineer. Unsupported format + Formato non supportato + No comment provided by engineer. + + + Wait + Attendi No comment provided by engineer. Wrong database passphrase + Password del database sbagliata No comment provided by engineer. You can allow sharing in Privacy & Security / SimpleX Lock settings. + Puoi consentire la condivisione in Privacy e sicurezza / impostazioni di SimpleX Lock. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff index 46ef837f9f..9d34262316 100644 --- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff +++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff @@ -392,6 +392,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -728,6 +733,10 @@ 連絡先が通話を許可している場合のみ通話を許可する。 No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. 連絡先が許可している場合のみ消えるメッセージを許可する。 @@ -912,6 +921,10 @@ Archive and upload No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database No comment provided by engineer. @@ -1089,10 +1102,22 @@ 通話 No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! 連絡先を招待できません! @@ -1103,6 +1128,10 @@ 連絡先を招待できません! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel 中止 @@ -1209,6 +1238,10 @@ チャットのデータベースが削除されました No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported チャットのデータベースが読み込まれました @@ -1343,6 +1376,10 @@ パスコードを確認 No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades データベースのアップグレードを確認 @@ -1392,6 +1429,10 @@ Connect to desktop No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? No comment provided by engineer. @@ -1454,6 +1495,10 @@ This is your own one-time link! サーバーに接続中… (エラー: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop No comment provided by engineer. @@ -1463,6 +1508,10 @@ This is your own one-time link! 接続 No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error 接続エラー @@ -1509,6 +1558,10 @@ This is your own one-time link! 連絡先に既に存在します No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: 連絡先が非表示: @@ -1519,9 +1572,8 @@ This is your own one-time link! 連絡先は接続中 notification - - Contact is not connected yet! - 連絡先がまだ繋がってません! + + Contact is deleted. No comment provided by engineer. @@ -1534,6 +1586,10 @@ This is your own one-time link! 連絡先の設定 No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts 連絡先 @@ -1549,6 +1605,14 @@ This is your own one-time link! 続ける No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy コピー @@ -1816,11 +1880,6 @@ This is your own one-time link! Delete %lld messages? No comment provided by engineer. - - Delete Contact - 連絡先を削除 - No comment provided by engineer. - Delete address アドレスを削除 @@ -1875,9 +1934,8 @@ This is your own one-time link! 連絡先を削除 No comment provided by engineer. - - Delete contact? -This cannot be undone! + + Delete contact? No comment provided by engineer. @@ -1969,11 +2027,6 @@ This cannot be undone! 古いデータベースを削除しますか? No comment provided by engineer. - - Delete pending connection - 確認待ちの接続を削除 - No comment provided by engineer. - Delete pending connection? 接続待ちの接続を削除しますか? @@ -1989,11 +2042,19 @@ This cannot be undone! 待ち行列を削除 server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? ユーザープロフィールを削除しますか? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted No comment provided by engineer. @@ -2008,6 +2069,10 @@ This cannot be undone! 削除完了: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors No comment provided by engineer. @@ -2069,6 +2134,10 @@ This cannot be undone! 開発 No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools 開発ツール @@ -2553,11 +2622,6 @@ This cannot be undone! 接続の削除エラー No comment provided by engineer. - - Error deleting contact - 連絡先の削除にエラー発生 - No comment provided by engineer. - Error deleting database データベースの削除にエラー発生 @@ -2781,6 +2845,10 @@ This cannot be undone! 会話中に無効になっている場合でも。 No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving 保存せずに閉じる @@ -3545,6 +3613,10 @@ Error: %2$@ 3. 接続に問題があった。 No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). このリンクからすでに接続されているようです。そうでない場合は、エラー(%@)が発生しました。 @@ -3601,6 +3673,10 @@ This is your link for group %@! Keep No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. @@ -3771,6 +3847,10 @@ This is your link for group %@! 最大 30 秒で即時受信します。 No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium blur media @@ -3852,12 +3932,8 @@ This is your link for group %@! Message reception No comment provided by engineer. - - Message routing fallback - No comment provided by engineer. - - - Message routing mode + + Message servers No comment provided by engineer. @@ -3969,6 +4045,10 @@ This is your link for group %@! モデレート chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at モデレーターによって介入済み @@ -4040,6 +4120,10 @@ This is your link for group %@! ネットワーク状況 No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode 新しいパスコード @@ -4212,19 +4296,27 @@ This is your link for group %@! 過去のデータベースアーカイブ No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link 使い捨ての招待リンク No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - 接続にオニオンのホストが必要となります。VPN を有効にする必要があります。 + + Onion hosts will be **required** for connection. +Requires compatible VPN. + 接続にオニオンのホストが必要となります。 +VPN を有効にする必要があります。 No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - オニオンのホストが利用可能時に使われます。VPN を有効にする必要があります。 + + Onion hosts will be used when available. +Requires compatible VPN. + オニオンのホストが利用可能時に使われます。 +VPN を有効にする必要があります。 No comment provided by engineer. @@ -4237,6 +4329,10 @@ This is your link for group %@! **2 レイヤーのエンドツーエンド暗号化**を使用して送信されたユーザー プロファイル、連絡先、グループ、メッセージを保存できるのはクライアント デバイスのみです。 No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. グループ設定を変えられるのはグループのオーナーだけです。 @@ -4456,6 +4552,10 @@ This is your link for group %@! Picture-in-picture calls No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. 音声メッセージを有効にするように連絡相手に要求してください。 @@ -4734,6 +4834,10 @@ Enable in *Network & servers* settings. アプリを評価 No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… 反応する… @@ -5050,11 +5154,6 @@ Enable in *Network & servers* settings. 開示する chat item action - - Revert - 元に戻す - No comment provided by engineer. - Revoke 取り消す @@ -5084,11 +5183,6 @@ Enable in *Network & servers* settings. SMP server No comment provided by engineer. - - SMP servers - SMPサーバ - No comment provided by engineer. - Safely receive files No comment provided by engineer. @@ -5117,6 +5211,10 @@ Enable in *Network & servers* settings. 保存して、グループのメンバーにに知らせる No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile グループプロファイルの保存と更新 @@ -5309,11 +5407,6 @@ Enable in *Network & servers* settings. Send delivery receipts to No comment provided by engineer. - - Send direct message - ダイレクトメッセージを送信 - No comment provided by engineer. - Send direct message to connect ダイレクトメッセージを送信して接続する @@ -5338,6 +5431,10 @@ Enable in *Network & servers* settings. ライブメッセージを送信 No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. No comment provided by engineer. @@ -5755,11 +5852,19 @@ Enable in *Network & servers* settings. Soft blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. インポート中に致命的でないエラーが発生しました - 詳細はチャットコンソールを参照してください。 No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody 誰か @@ -5885,6 +5990,10 @@ Enable in *Network & servers* settings. システム認証 No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout TCP接続タイムアウト @@ -5942,11 +6051,6 @@ Enable in *Network & servers* settings. Tap to scan No comment provided by engineer. - - Tap to start a new chat - タップして新しいチャットを始める - No comment provided by engineer. - Temporary file error No comment provided by engineer. @@ -6392,11 +6496,6 @@ To connect, please ask your contact to create another connection link and check 更新 No comment provided by engineer. - - Update .onion hosts setting? - .onionのホスト設定を更新しますか? - No comment provided by engineer. - Update database passphrase データベースのパスフレーズを更新 @@ -6407,9 +6506,8 @@ To connect, please ask your contact to create another connection link and check ネットワーク設定を更新しますか? No comment provided by engineer. - - Update transport isolation mode? - トランスポート隔離モードを更新しますか? + + Update settings? No comment provided by engineer. @@ -6417,11 +6515,6 @@ To connect, please ask your contact to create another connection link and check 設定を更新すると、全サーバにクライントの再接続が行われます。 No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - 設定を更新すると、全サーバにクライントの再接続が行われます。 - No comment provided by engineer. - Upgrade and open chat アップグレードしてチャットを開く @@ -6512,6 +6605,10 @@ To connect, please ask your contact to create another connection link and check Use the app while in the call. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile ユーザープロフィール @@ -6521,11 +6618,6 @@ To connect, please ask your contact to create another connection link and check User selection No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - .onionホストを使用するには、互換性のあるVPNプロバイダーが必要です。 - No comment provided by engineer. - Using SimpleX Chat servers. SimpleX チャット サーバーを使用する。 @@ -6762,11 +6854,6 @@ To connect, please ask your contact to create another connection link and check XFTP server No comment provided by engineer. - - XFTP servers - XFTPサーバ - No comment provided by engineer. - You あなた @@ -6877,6 +6964,10 @@ Repeat join request? %@ にメッセージを送信できるようになりました notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. 設定からロック画面の通知プレビューを設定できます。 @@ -6902,6 +6993,10 @@ Repeat join request? アプリの設定/データベースから、またはアプリを再起動することでチャットを開始できます No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. 設定からSimpleXのロックをオンにすることができます。 @@ -6940,11 +7035,6 @@ Repeat join request? Repeat connection request? 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. アプリ起動時にパスフレーズを入力しなければなりません。端末に保存されてません。 @@ -6965,11 +7055,23 @@ Repeat connection request? グループに参加しました。招待をくれたメンバーに接続してます。 No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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. あなたの最新データベースを1つの端末にしか使わなければ、一部の連絡先からメッセージが届きかねます。 No comment provided by engineer. + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. 音声メッセージを送るには、連絡相手からの音声メッセージを許可しなければなりません。 @@ -7083,13 +7185,6 @@ Repeat connection request? あなたのチャットプロフィール No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - 接続を完了するには、連絡相手がオンラインになる必要があります。 -この接続をキャンセルして、連絡先を削除をすることもできます (後でやり直すこともできます)。 - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). 連絡先が現在サポートされている最大サイズ (%@) より大きいファイルを送信しました。 @@ -7105,6 +7200,10 @@ You can cancel this connection and remove the contact (and try later with a new 連絡先は接続されたままになります。 No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. 現在のチャット データベースは削除され、インポートされたデータベースに置き換えられます。 @@ -7273,6 +7372,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。 太文字 No comment provided by engineer. + + call + No comment provided by engineer. + call error 通話エラー @@ -7635,6 +7738,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。 グループ %@ への招待 group name + + invite + No comment provided by engineer. + invited 招待済み @@ -7689,6 +7796,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。 接続中 rcv group event chat item + + message + No comment provided by engineer. + message received メッセージを受信 @@ -7719,6 +7830,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。 time unit + + mute + No comment provided by engineer. + never 一度も @@ -7843,6 +7958,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。 saved from %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec @@ -7909,14 +8028,18 @@ last received msg: %2$@ 不明 connection info - - unknown relays + + unknown servers No comment provided by engineer. unknown status No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected No comment provided by engineer. @@ -7959,6 +8082,10 @@ last received msg: %2$@ リレー経由 No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) ビデオ通話 (非エンドツーエンド暗号化) @@ -8201,10 +8328,6 @@ last received msg: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - No comment provided by engineer. - Error preparing file No comment provided by engineer. @@ -8229,10 +8352,6 @@ last received msg: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - No comment provided by engineer. - Keychain error No comment provided by engineer. @@ -8245,10 +8364,6 @@ last received msg: %2$@ No active profile No comment provided by engineer. - - No network connection - No comment provided by engineer. - Ok No comment provided by engineer. @@ -8273,14 +8388,22 @@ last received msg: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. Share No comment provided by engineer. + + Slow network? + No comment provided by engineer. + Unknown database error: %@ No comment provided by engineer. @@ -8289,6 +8412,10 @@ last received msg: %2$@ Unsupported format No comment provided by engineer. + + Wait + No comment provided by engineer. + Wrong database passphrase No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/ml.xcloc/Localized Contents/ml.xliff b/apps/ios/SimpleX Localizations/ml.xcloc/Localized Contents/ml.xliff deleted file mode 100644 index 1726f2ea77..0000000000 --- a/apps/ios/SimpleX Localizations/ml.xcloc/Localized Contents/ml.xliff +++ /dev/null @@ -1,4624 +0,0 @@ - - - -
- -
- - - - - No comment provided by engineer. - - - - No comment provided by engineer. - - - - No comment provided by engineer. - - - - No comment provided by engineer. - - - ( - No comment provided by engineer. - - - (can be copied) - No comment provided by engineer. - - - !1 colored! - No comment provided by engineer. - - - #secret# - No comment provided by engineer. - - - %@ - No comment provided by engineer. - - - %@ %@ - No comment provided by engineer. - - - %@ (current) - No comment provided by engineer. - - - %@ (current): - copied message info - - - %@ / %@ - No comment provided by engineer. - - - %@ is connected! - notification title - - - %@ is not verified - No comment provided by engineer. - - - %@ is verified - No comment provided by engineer. - - - %@ servers - No comment provided by engineer. - - - %@ wants to connect! - notification title - - - %@: - copied message info - - - %d days - time interval - - - %d hours - time interval - - - %d min - time interval - - - %d months - time interval - - - %d sec - time interval - - - %d skipped message(s) - integrity error chat item - - - %d weeks - time interval - - - %lld - No comment provided by engineer. - - - %lld %@ - No comment provided by engineer. - - - %lld contact(s) selected - No comment provided by engineer. - - - %lld file(s) with total size of %@ - No comment provided by engineer. - - - %lld members - No comment provided by engineer. - - - %lld minutes - No comment provided by engineer. - - - %lld second(s) - No comment provided by engineer. - - - %lld seconds - No comment provided by engineer. - - - %lldd - No comment provided by engineer. - - - %lldh - No comment provided by engineer. - - - %lldk - No comment provided by engineer. - - - %lldm - No comment provided by engineer. - - - %lldmth - No comment provided by engineer. - - - %llds - No comment provided by engineer. - - - %lldw - No comment provided by engineer. - - - %u messages failed to decrypt. - No comment provided by engineer. - - - %u messages skipped. - No comment provided by engineer. - - - ( - No comment provided by engineer. - - - ) - No comment provided by engineer. - - - **Add new contact**: to create your one-time QR Code or link for your contact. - No comment provided by engineer. - - - **Create link / QR code** for your contact to use. - No comment provided by engineer. - - - **More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have. - No comment provided by engineer. - - - **Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app). - No comment provided by engineer. - - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - No comment provided by engineer. - - - **Please note**: you will NOT be able to recover or change passphrase if you lose it. - No comment provided by engineer. - - - **Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from. - No comment provided by engineer. - - - **Scan QR code**: to connect to your contact in person or via video call. - No comment provided by engineer. - - - **Warning**: Instant push notifications require passphrase saved in Keychain. - No comment provided by engineer. - - - **e2e encrypted** audio call - No comment provided by engineer. - - - **e2e encrypted** video call - No comment provided by engineer. - - - \*bold* - No comment provided by engineer. - - - , - No comment provided by engineer. - - - - voice messages up to 5 minutes. -- custom time to disappear. -- editing history. - No comment provided by engineer. - - - . - No comment provided by engineer. - - - 0s - No comment provided by engineer. - - - 1 day - time interval - - - 1 hour - time interval - - - 1 minute - No comment provided by engineer. - - - 1 month - time interval - - - 1 week - time interval - - - 1-time link - No comment provided by engineer. - - - 5 minutes - No comment provided by engineer. - - - 6 - No comment provided by engineer. - - - 30 seconds - No comment provided by engineer. - - - : - No comment provided by engineer. - - - <p>Hi!</p> -<p><a href="%@">Connect to me via SimpleX Chat</a></p> - email text - - - A new contact - notification title - - - A random profile will be sent to the contact that you received this link from - No comment provided by engineer. - - - A random profile will be sent to your contact - No comment provided by engineer. - - - A separate TCP connection will be used **for each chat profile you have in the app**. - No comment provided by engineer. - - - A separate TCP connection will be used **for each contact and group member**. -**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail. - No comment provided by engineer. - - - About SimpleX - No comment provided by engineer. - - - About SimpleX Chat - No comment provided by engineer. - - - About SimpleX address - No comment provided by engineer. - - - Accent color - No comment provided by engineer. - - - Accept - accept contact request via notification - accept incoming call via notification - - - Accept contact - No comment provided by engineer. - - - Accept contact request from %@? - notification body - - - Accept incognito - No comment provided by engineer. - - - Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts. - No comment provided by engineer. - - - Add preset servers - No comment provided by engineer. - - - Add profile - No comment provided by engineer. - - - Add servers by scanning QR codes. - No comment provided by engineer. - - - Add server - No comment provided by engineer. - - - Add to another device - No comment provided by engineer. - - - Add welcome message - No comment provided by engineer. - - - Address - No comment provided by engineer. - - - Admins can create the links to join groups. - No comment provided by engineer. - - - Advanced network settings - No comment provided by engineer. - - - All app data is deleted. - No comment provided by engineer. - - - All chats and messages will be deleted - this cannot be undone! - No comment provided by engineer. - - - All data is erased when it is entered. - No comment provided by engineer. - - - All group members will remain connected. - No comment provided by engineer. - - - All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you. - No comment provided by engineer. - - - All your contacts will remain connected. - No comment provided by engineer. - - - All your contacts will remain connected. Profile update will be sent to your contacts. - No comment provided by engineer. - - - Allow - No comment provided by engineer. - - - Allow calls only if your contact allows them. - No comment provided by engineer. - - - Allow disappearing messages only if your contact allows it to you. - No comment provided by engineer. - - - Allow irreversible message deletion only if your contact allows it to you. - No comment provided by engineer. - - - Allow message reactions only if your contact allows them. - No comment provided by engineer. - - - Allow message reactions. - No comment provided by engineer. - - - Allow sending direct messages to members. - No comment provided by engineer. - - - Allow sending disappearing messages. - No comment provided by engineer. - - - Allow to irreversibly delete sent messages. - No comment provided by engineer. - - - Allow to send voice messages. - No comment provided by engineer. - - - Allow voice messages only if your contact allows them. - No comment provided by engineer. - - - Allow voice messages? - No comment provided by engineer. - - - Allow your contacts adding message reactions. - No comment provided by engineer. - - - Allow your contacts to call you. - No comment provided by engineer. - - - Allow your contacts to irreversibly delete sent messages. - No comment provided by engineer. - - - Allow your contacts to send disappearing messages. - No comment provided by engineer. - - - Allow your contacts to send voice messages. - No comment provided by engineer. - - - Already connected? - No comment provided by engineer. - - - Always use relay - No comment provided by engineer. - - - An empty chat profile with the provided name is created, and the app opens as usual. - No comment provided by engineer. - - - Answer call - No comment provided by engineer. - - - App build: %@ - No comment provided by engineer. - - - App icon - No comment provided by engineer. - - - App passcode - No comment provided by engineer. - - - App passcode is replaced with self-destruct passcode. - No comment provided by engineer. - - - App version - No comment provided by engineer. - - - App version: v%@ - No comment provided by engineer. - - - Appearance - No comment provided by engineer. - - - Attach - No comment provided by engineer. - - - Audio & video calls - No comment provided by engineer. - - - Audio and video calls - No comment provided by engineer. - - - Audio/video calls - chat feature - - - Audio/video calls are prohibited. - No comment provided by engineer. - - - Authentication cancelled - PIN entry - - - Authentication failed - No comment provided by engineer. - - - Authentication is required before the call is connected, but you may miss calls. - No comment provided by engineer. - - - Authentication unavailable - No comment provided by engineer. - - - Auto-accept - No comment provided by engineer. - - - Auto-accept contact requests - No comment provided by engineer. - - - Auto-accept images - No comment provided by engineer. - - - Back - No comment provided by engineer. - - - Bad message ID - No comment provided by engineer. - - - Bad message hash - No comment provided by engineer. - - - Better messages - No comment provided by engineer. - - - Both you and your contact can add message reactions. - No comment provided by engineer. - - - Both you and your contact can irreversibly delete sent messages. - No comment provided by engineer. - - - Both you and your contact can make calls. - No comment provided by engineer. - - - Both you and your contact can send disappearing messages. - No comment provided by engineer. - - - Both you and your contact can send voice messages. - No comment provided by engineer. - - - By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA). - No comment provided by engineer. - - - Call already ended! - No comment provided by engineer. - - - Calls - No comment provided by engineer. - - - Can't delete user profile! - No comment provided by engineer. - - - Can't invite contact! - No comment provided by engineer. - - - Can't invite contacts! - No comment provided by engineer. - - - Cancel - No comment provided by engineer. - - - Cannot access keychain to save database password - No comment provided by engineer. - - - Cannot receive file - No comment provided by engineer. - - - Change - No comment provided by engineer. - - - Change database passphrase? - No comment provided by engineer. - - - Change lock mode - authentication reason - - - Change member role? - No comment provided by engineer. - - - Change passcode - authentication reason - - - Change receiving address - No comment provided by engineer. - - - Change receiving address? - No comment provided by engineer. - - - Change role - No comment provided by engineer. - - - Change self-destruct mode - authentication reason - - - Change self-destruct passcode - authentication reason - set passcode view - - - Chat archive - No comment provided by engineer. - - - Chat console - No comment provided by engineer. - - - Chat database - No comment provided by engineer. - - - Chat database deleted - No comment provided by engineer. - - - Chat database imported - No comment provided by engineer. - - - Chat is running - No comment provided by engineer. - - - Chat is stopped - No comment provided by engineer. - - - Chat preferences - No comment provided by engineer. - - - Chats - No comment provided by engineer. - - - Check server address and try again. - No comment provided by engineer. - - - Chinese and Spanish interface - No comment provided by engineer. - - - Choose file - No comment provided by engineer. - - - Choose from library - No comment provided by engineer. - - - Clear - No comment provided by engineer. - - - Clear conversation - No comment provided by engineer. - - - Clear conversation? - No comment provided by engineer. - - - Clear verification - No comment provided by engineer. - - - Colors - No comment provided by engineer. - - - Compare file - server test step - - - Compare security codes with your contacts. - No comment provided by engineer. - - - Configure ICE servers - No comment provided by engineer. - - - Confirm - No comment provided by engineer. - - - Confirm Passcode - No comment provided by engineer. - - - Confirm database upgrades - No comment provided by engineer. - - - Confirm new passphrase… - No comment provided by engineer. - - - Confirm password - No comment provided by engineer. - - - Connect - server test step - - - Connect via contact link? - No comment provided by engineer. - - - Connect via group link? - No comment provided by engineer. - - - Connect via link - No comment provided by engineer. - - - Connect via link / QR code - No comment provided by engineer. - - - Connect via one-time link? - No comment provided by engineer. - - - Connecting to server… - No comment provided by engineer. - - - Connecting to server… (error: %@) - No comment provided by engineer. - - - Connection - No comment provided by engineer. - - - Connection error - No comment provided by engineer. - - - Connection error (AUTH) - No comment provided by engineer. - - - Connection request - No comment provided by engineer. - - - Connection request sent! - No comment provided by engineer. - - - Connection timeout - No comment provided by engineer. - - - Contact allows - No comment provided by engineer. - - - Contact already exists - No comment provided by engineer. - - - Contact and all messages will be deleted - this cannot be undone! - No comment provided by engineer. - - - Contact hidden: - notification - - - Contact is connected - notification - - - Contact is not connected yet! - No comment provided by engineer. - - - Contact name - No comment provided by engineer. - - - Contact preferences - No comment provided by engineer. - - - Contacts can mark messages for deletion; you will be able to view them. - No comment provided by engineer. - - - Continue - No comment provided by engineer. - - - Copy - chat item action - - - Core version: v%@ - No comment provided by engineer. - - - Create - No comment provided by engineer. - - - Create SimpleX address - No comment provided by engineer. - - - Create an address to let people connect with you. - No comment provided by engineer. - - - Create file - server test step - - - Create group link - No comment provided by engineer. - - - Create link - No comment provided by engineer. - - - Create one-time invitation link - No comment provided by engineer. - - - Create queue - server test step - - - Create secret group - No comment provided by engineer. - - - Create your profile - No comment provided by engineer. - - - Created on %@ - No comment provided by engineer. - - - Current Passcode - No comment provided by engineer. - - - Current passphrase… - No comment provided by engineer. - - - Currently maximum supported file size is %@. - No comment provided by engineer. - - - Custom time - No comment provided by engineer. - - - Dark - No comment provided by engineer. - - - Database ID - No comment provided by engineer. - - - Database ID: %d - copied message info - - - Database IDs and Transport isolation option. - No comment provided by engineer. - - - Database downgrade - No comment provided by engineer. - - - Database encrypted! - No comment provided by engineer. - - - Database encryption passphrase will be updated and stored in the keychain. - - No comment provided by engineer. - - - Database encryption passphrase will be updated. - - No comment provided by engineer. - - - Database error - No comment provided by engineer. - - - Database is encrypted using a random passphrase, you can change it. - No comment provided by engineer. - - - Database is encrypted using a random passphrase. Please change it before exporting. - No comment provided by engineer. - - - Database passphrase - No comment provided by engineer. - - - Database passphrase & export - No comment provided by engineer. - - - Database passphrase is different from saved in the keychain. - No comment provided by engineer. - - - Database passphrase is required to open chat. - No comment provided by engineer. - - - Database upgrade - No comment provided by engineer. - - - Database will be encrypted and the passphrase stored in the keychain. - - No comment provided by engineer. - - - Database will be encrypted. - - No comment provided by engineer. - - - Database will be migrated when the app restarts - No comment provided by engineer. - - - Decentralized - No comment provided by engineer. - - - Decryption error - No comment provided by engineer. - - - Delete - chat item action - - - Delete Contact - No comment provided by engineer. - - - Delete address - No comment provided by engineer. - - - Delete address? - No comment provided by engineer. - - - Delete after - No comment provided by engineer. - - - Delete all files - No comment provided by engineer. - - - Delete archive - No comment provided by engineer. - - - Delete chat archive? - No comment provided by engineer. - - - Delete chat profile - No comment provided by engineer. - - - Delete chat profile? - No comment provided by engineer. - - - Delete connection - No comment provided by engineer. - - - Delete contact - No comment provided by engineer. - - - Delete contact? - No comment provided by engineer. - - - Delete database - No comment provided by engineer. - - - Delete file - server test step - - - Delete files and media? - No comment provided by engineer. - - - Delete files for all chat profiles - No comment provided by engineer. - - - Delete for everyone - chat feature - - - Delete for me - No comment provided by engineer. - - - Delete group - No comment provided by engineer. - - - Delete group? - No comment provided by engineer. - - - Delete invitation - No comment provided by engineer. - - - Delete link - No comment provided by engineer. - - - Delete link? - No comment provided by engineer. - - - Delete member message? - No comment provided by engineer. - - - Delete message? - No comment provided by engineer. - - - Delete messages - No comment provided by engineer. - - - Delete messages after - No comment provided by engineer. - - - Delete old database - No comment provided by engineer. - - - Delete old database? - No comment provided by engineer. - - - Delete pending connection - No comment provided by engineer. - - - Delete pending connection? - No comment provided by engineer. - - - Delete profile - No comment provided by engineer. - - - Delete queue - server test step - - - Delete user profile? - No comment provided by engineer. - - - Deleted at - No comment provided by engineer. - - - Deleted at: %@ - copied message info - - - Description - No comment provided by engineer. - - - Develop - No comment provided by engineer. - - - Developer tools - No comment provided by engineer. - - - Device - No comment provided by engineer. - - - Device authentication is disabled. Turning off SimpleX Lock. - No comment provided by engineer. - - - Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication. - No comment provided by engineer. - - - Different names, avatars and transport isolation. - No comment provided by engineer. - - - Direct messages - chat feature - - - Direct messages between members are prohibited in this group. - No comment provided by engineer. - - - Disable SimpleX Lock - authentication reason - - - Disappearing message - No comment provided by engineer. - - - Disappearing messages - chat feature - - - Disappearing messages are prohibited in this chat. - No comment provided by engineer. - - - Disappearing messages are prohibited in this group. - No comment provided by engineer. - - - Disappears at - No comment provided by engineer. - - - Disappears at: %@ - copied message info - - - Disconnect - server test step - - - Display name - No comment provided by engineer. - - - Display name: - No comment provided by engineer. - - - Do NOT use SimpleX for emergency calls. - No comment provided by engineer. - - - Do it later - No comment provided by engineer. - - - Don't create address - No comment provided by engineer. - - - Don't show again - No comment provided by engineer. - - - Downgrade and open chat - No comment provided by engineer. - - - Download file - server test step - - - Duplicate display name! - No comment provided by engineer. - - - Duration - No comment provided by engineer. - - - Edit - chat item action - - - Edit group profile - No comment provided by engineer. - - - Enable - No comment provided by engineer. - - - Enable SimpleX Lock - authentication reason - - - Enable TCP keep-alive - No comment provided by engineer. - - - Enable automatic message deletion? - No comment provided by engineer. - - - Enable instant notifications? - No comment provided by engineer. - - - Enable lock - No comment provided by engineer. - - - Enable notifications - No comment provided by engineer. - - - Enable periodic notifications? - No comment provided by engineer. - - - Enable self-destruct - No comment provided by engineer. - - - Enable self-destruct passcode - set passcode view - - - Encrypt - No comment provided by engineer. - - - Encrypt database? - No comment provided by engineer. - - - Encrypted database - No comment provided by engineer. - - - Encrypted message or another event - notification - - - Encrypted message: database error - notification - - - Encrypted message: database migration error - notification - - - Encrypted message: keychain error - notification - - - Encrypted message: no passphrase - notification - - - Encrypted message: unexpected error - notification - - - Enter Passcode - No comment provided by engineer. - - - Enter correct passphrase. - No comment provided by engineer. - - - Enter passphrase… - No comment provided by engineer. - - - Enter password above to show! - No comment provided by engineer. - - - Enter server manually - No comment provided by engineer. - - - Enter welcome message… - placeholder - - - Enter welcome message… (optional) - placeholder - - - Error - No comment provided by engineer. - - - Error accepting contact request - No comment provided by engineer. - - - Error accessing database file - No comment provided by engineer. - - - Error adding member(s) - No comment provided by engineer. - - - Error changing address - No comment provided by engineer. - - - Error changing role - No comment provided by engineer. - - - Error changing setting - No comment provided by engineer. - - - Error creating address - No comment provided by engineer. - - - Error creating group - No comment provided by engineer. - - - Error creating group link - No comment provided by engineer. - - - Error creating profile! - No comment provided by engineer. - - - Error deleting chat database - No comment provided by engineer. - - - Error deleting chat! - No comment provided by engineer. - - - Error deleting connection - No comment provided by engineer. - - - Error deleting contact - No comment provided by engineer. - - - Error deleting database - No comment provided by engineer. - - - Error deleting old database - No comment provided by engineer. - - - Error deleting token - No comment provided by engineer. - - - Error deleting user profile - No comment provided by engineer. - - - Error enabling notifications - No comment provided by engineer. - - - Error encrypting database - No comment provided by engineer. - - - Error exporting chat database - No comment provided by engineer. - - - Error importing chat database - No comment provided by engineer. - - - Error joining group - No comment provided by engineer. - - - Error loading %@ servers - No comment provided by engineer. - - - Error receiving file - No comment provided by engineer. - - - Error removing member - No comment provided by engineer. - - - Error saving %@ servers - No comment provided by engineer. - - - Error saving ICE servers - No comment provided by engineer. - - - Error saving group profile - No comment provided by engineer. - - - Error saving passcode - No comment provided by engineer. - - - Error saving passphrase to keychain - No comment provided by engineer. - - - Error saving user password - No comment provided by engineer. - - - Error sending email - No comment provided by engineer. - - - Error sending message - No comment provided by engineer. - - - Error starting chat - No comment provided by engineer. - - - Error stopping chat - No comment provided by engineer. - - - Error switching profile! - No comment provided by engineer. - - - Error updating group link - No comment provided by engineer. - - - Error updating message - No comment provided by engineer. - - - Error updating settings - No comment provided by engineer. - - - Error updating user privacy - No comment provided by engineer. - - - Error: - No comment provided by engineer. - - - Error: %@ - No comment provided by engineer. - - - Error: URL is invalid - No comment provided by engineer. - - - Error: no database file - No comment provided by engineer. - - - Exit without saving - No comment provided by engineer. - - - Export database - No comment provided by engineer. - - - Export error: - No comment provided by engineer. - - - Exported database archive. - No comment provided by engineer. - - - Exporting database archive... - No comment provided by engineer. - - - Failed to remove passphrase - No comment provided by engineer. - - - Fast and no wait until the sender is online! - No comment provided by engineer. - - - File will be deleted from servers. - No comment provided by engineer. - - - File will be received when your contact completes uploading it. - No comment provided by engineer. - - - File will be received when your contact is online, please wait or check later! - No comment provided by engineer. - - - File: %@ - No comment provided by engineer. - - - Files & media - No comment provided by engineer. - - - Finally, we have them! 🚀 - No comment provided by engineer. - - - For console - No comment provided by engineer. - - - French interface - No comment provided by engineer. - - - Full link - No comment provided by engineer. - - - Full name (optional) - No comment provided by engineer. - - - Full name: - No comment provided by engineer. - - - Fully re-implemented - work in background! - No comment provided by engineer. - - - Further reduced battery usage - No comment provided by engineer. - - - GIFs and stickers - No comment provided by engineer. - - - Group - No comment provided by engineer. - - - Group display name - No comment provided by engineer. - - - Group full name (optional) - No comment provided by engineer. - - - Group image - No comment provided by engineer. - - - Group invitation - No comment provided by engineer. - - - Group invitation expired - No comment provided by engineer. - - - Group invitation is no longer valid, it was removed by sender. - No comment provided by engineer. - - - Group link - No comment provided by engineer. - - - Group links - No comment provided by engineer. - - - Group members can add message reactions. - No comment provided by engineer. - - - Group members can irreversibly delete sent messages. - No comment provided by engineer. - - - Group members can send direct messages. - No comment provided by engineer. - - - Group members can send disappearing messages. - No comment provided by engineer. - - - Group members can send voice messages. - No comment provided by engineer. - - - Group message: - notification - - - Group moderation - No comment provided by engineer. - - - Group preferences - No comment provided by engineer. - - - Group profile - No comment provided by engineer. - - - Group profile is stored on members' devices, not on the servers. - No comment provided by engineer. - - - Group welcome message - No comment provided by engineer. - - - Group will be deleted for all members - this cannot be undone! - No comment provided by engineer. - - - Group will be deleted for you - this cannot be undone! - No comment provided by engineer. - - - Help - No comment provided by engineer. - - - Hidden - No comment provided by engineer. - - - Hidden chat profiles - No comment provided by engineer. - - - Hidden profile password - No comment provided by engineer. - - - Hide - chat item action - - - Hide app screen in the recent apps. - No comment provided by engineer. - - - Hide profile - No comment provided by engineer. - - - Hide: - No comment provided by engineer. - - - History - copied message info - - - How SimpleX works - No comment provided by engineer. - - - How it works - No comment provided by engineer. - - - How to - No comment provided by engineer. - - - How to use it - No comment provided by engineer. - - - How to use your servers - No comment provided by engineer. - - - ICE servers (one per line) - No comment provided by engineer. - - - If you can't meet in person, show QR code in a video call, or share the link. - No comment provided by engineer. - - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - No comment provided by engineer. - - - If you enter this passcode when opening the app, all app data will be irreversibly removed! - No comment provided by engineer. - - - If you enter your self-destruct passcode while opening the app: - No comment provided by engineer. - - - If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app). - No comment provided by engineer. - - - Ignore - No comment provided by engineer. - - - Image will be received when your contact completes uploading it. - No comment provided by engineer. - - - Image will be received when your contact is online, please wait or check later! - No comment provided by engineer. - - - Immediately - No comment provided by engineer. - - - Immune to spam and abuse - No comment provided by engineer. - - - Import - No comment provided by engineer. - - - Import chat database? - No comment provided by engineer. - - - Import database - No comment provided by engineer. - - - Improved privacy and security - No comment provided by engineer. - - - Improved server configuration - No comment provided by engineer. - - - Incognito - No comment provided by engineer. - - - Incognito mode - No comment provided by engineer. - - - 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. - - - Incoming audio call - notification - - - Incoming call - notification - - - Incoming video call - notification - - - Incompatible database version - No comment provided by engineer. - - - Incorrect passcode - PIN entry - - - Incorrect security code! - No comment provided by engineer. - - - Info - chat item action - - - Initial role - No comment provided by engineer. - - - Install [SimpleX Chat for terminal](https://github.com/simplex-chat/simplex-chat) - No comment provided by engineer. - - - Instant push notifications will be hidden! - - No comment provided by engineer. - - - Instantly - No comment provided by engineer. - - - Interface - No comment provided by engineer. - - - Invalid connection link - No comment provided by engineer. - - - Invalid server address! - No comment provided by engineer. - - - Invitation expired! - No comment provided by engineer. - - - Invite friends - No comment provided by engineer. - - - Invite members - No comment provided by engineer. - - - Invite to group - No comment provided by engineer. - - - Irreversible message deletion - No comment provided by engineer. - - - Irreversible message deletion is prohibited in this chat. - No comment provided by engineer. - - - Irreversible message deletion is prohibited in this group. - No comment provided by engineer. - - - It allows having many anonymous connections without any shared data between them in a single chat profile. - No comment provided by engineer. - - - It can happen when you or your connection used the old database backup. - No comment provided by engineer. - - - It can happen when: -1. The messages expired in the sending client after 2 days or on the server after 30 days. -2. Message decryption failed, because you or your contact used old database backup. -3. The connection was compromised. - 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. - - - Italian interface - No comment provided by engineer. - - - Japanese interface - No comment provided by engineer. - - - Join - No comment provided by engineer. - - - Join group - No comment provided by engineer. - - - Join incognito - No comment provided by engineer. - - - Joining group - No comment provided by engineer. - - - KeyChain error - No comment provided by engineer. - - - Keychain error - No comment provided by engineer. - - - LIVE - No comment provided by engineer. - - - Large file! - No comment provided by engineer. - - - Learn more - No comment provided by engineer. - - - Leave - No comment provided by engineer. - - - Leave group - No comment provided by engineer. - - - Leave group? - No comment provided by engineer. - - - Let's talk in SimpleX Chat - email subject - - - Light - No comment provided by engineer. - - - Limitations - No comment provided by engineer. - - - Live message! - No comment provided by engineer. - - - Live messages - No comment provided by engineer. - - - Local name - No comment provided by engineer. - - - Local profile data only - No comment provided by engineer. - - - Lock after - No comment provided by engineer. - - - Lock mode - No comment provided by engineer. - - - Make a private connection - No comment provided by engineer. - - - Make profile private! - No comment provided by engineer. - - - Make sure %@ server addresses are in correct format, line separated and are not duplicated (%@). - No comment provided by engineer. - - - Make sure WebRTC ICE server addresses are in correct format, line separated and are not duplicated. - No comment provided by engineer. - - - Many people asked: *if SimpleX has no user identifiers, how can it deliver messages?* - No comment provided by engineer. - - - Mark deleted for everyone - No comment provided by engineer. - - - Mark read - No comment provided by engineer. - - - Mark verified - No comment provided by engineer. - - - Markdown in messages - No comment provided by engineer. - - - Max 30 seconds, received instantly. - No comment provided by engineer. - - - Member - No comment provided by engineer. - - - Member role will be changed to "%@". All group members will be notified. - No comment provided by engineer. - - - Member role will be changed to "%@". The member will receive a new invitation. - No comment provided by engineer. - - - Member will be removed from group - this cannot be undone! - No comment provided by engineer. - - - Message delivery error - No comment provided by engineer. - - - Message draft - No comment provided by engineer. - - - Message reactions - chat feature - - - Message reactions are prohibited in this chat. - No comment provided by engineer. - - - Message reactions are prohibited in this group. - No comment provided by engineer. - - - Message text - No comment provided by engineer. - - - Messages - No comment provided by engineer. - - - Messages & files - No comment provided by engineer. - - - Migrating database archive... - No comment provided by engineer. - - - Migration error: - No comment provided by engineer. - - - Migration failed. Tap **Skip** below to continue using the current database. Please report the issue to the app developers via chat or email [chat@simplex.chat](mailto:chat@simplex.chat). - No comment provided by engineer. - - - Migration is completed - No comment provided by engineer. - - - Migrations: %@ - No comment provided by engineer. - - - Moderate - chat item action - - - Moderated at - No comment provided by engineer. - - - Moderated at: %@ - copied message info - - - More improvements are coming soon! - No comment provided by engineer. - - - Most likely this contact has deleted the connection with you. - No comment provided by engineer. - - - Multiple chat profiles - No comment provided by engineer. - - - Mute - No comment provided by engineer. - - - Muted when inactive! - No comment provided by engineer. - - - Name - No comment provided by engineer. - - - Network & servers - No comment provided by engineer. - - - Network settings - No comment provided by engineer. - - - Network status - No comment provided by engineer. - - - New Passcode - No comment provided by engineer. - - - New contact request - notification - - - New contact: - notification - - - New database archive - No comment provided by engineer. - - - New display name - No comment provided by engineer. - - - New in %@ - No comment provided by engineer. - - - New member role - No comment provided by engineer. - - - New message - notification - - - New passphrase… - No comment provided by engineer. - - - No - No comment provided by engineer. - - - No app password - Authentication unavailable - - - No contacts selected - No comment provided by engineer. - - - No contacts to add - No comment provided by engineer. - - - No device token! - No comment provided by engineer. - - - Group not found! - No comment provided by engineer. - - - No permission to record voice message - No comment provided by engineer. - - - No received or sent files - No comment provided by engineer. - - - Notifications - No comment provided by engineer. - - - Notifications are disabled! - No comment provided by engineer. - - - Now admins can: -- delete members' messages. -- disable members ("observer" role) - No comment provided by engineer. - - - Off - No comment provided by engineer. - - - Off (Local) - No comment provided by engineer. - - - Ok - No comment provided by engineer. - - - Old database - No comment provided by engineer. - - - Old database archive - No comment provided by engineer. - - - One-time invitation link - No comment provided by engineer. - - - Onion hosts will be required for connection. Requires enabling VPN. - No comment provided by engineer. - - - Onion hosts will be used when available. Requires enabling VPN. - No comment provided by engineer. - - - Onion hosts will not be used. - No comment provided by engineer. - - - Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**. - No comment provided by engineer. - - - Only group owners can change group preferences. - No comment provided by engineer. - - - Only group owners can enable voice messages. - No comment provided by engineer. - - - Only you can add message reactions. - No comment provided by engineer. - - - Only you can irreversibly delete messages (your contact can mark them for deletion). - No comment provided by engineer. - - - Only you can make calls. - No comment provided by engineer. - - - Only you can send disappearing messages. - No comment provided by engineer. - - - Only you can send voice messages. - No comment provided by engineer. - - - Only your contact can add message reactions. - No comment provided by engineer. - - - Only your contact can irreversibly delete messages (you can mark them for deletion). - No comment provided by engineer. - - - Only your contact can make calls. - No comment provided by engineer. - - - Only your contact can send disappearing messages. - No comment provided by engineer. - - - Only your contact can send voice messages. - No comment provided by engineer. - - - Open Settings - No comment provided by engineer. - - - Open chat - No comment provided by engineer. - - - Open chat console - authentication reason - - - Open user profiles - authentication reason - - - Open-source protocol and code – anybody can run the servers. - No comment provided by engineer. - - - Opening database… - No comment provided by engineer. - - - Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red. - No comment provided by engineer. - - - PING count - No comment provided by engineer. - - - PING interval - No comment provided by engineer. - - - Passcode - No comment provided by engineer. - - - Passcode changed! - No comment provided by engineer. - - - Passcode entry - No comment provided by engineer. - - - Passcode not changed! - No comment provided by engineer. - - - Passcode set! - No comment provided by engineer. - - - Password to show - No comment provided by engineer. - - - Paste - No comment provided by engineer. - - - Paste image - No comment provided by engineer. - - - Paste received link - No comment provided by engineer. - - - Paste the link you received into the box below to connect with your contact. - No comment provided by engineer. - - - People can connect to you only via the links you share. - No comment provided by engineer. - - - Periodically - No comment provided by engineer. - - - Permanent decryption error - message decrypt error item - - - Please ask your contact to enable sending voice messages. - No comment provided by engineer. - - - Please check that you used the correct link or ask your contact to send you another one. - No comment provided by engineer. - - - Please check your network connection with %@ and try again. - No comment provided by engineer. - - - Please check yours and your contact preferences. - No comment provided by engineer. - - - Please contact group admin. - No comment provided by engineer. - - - Please enter correct current passphrase. - No comment provided by engineer. - - - Please enter the previous password after restoring database backup. This action can not be undone. - No comment provided by engineer. - - - Please remember or store it securely - there is no way to recover a lost passcode! - No comment provided by engineer. - - - Please report it to the developers. - No comment provided by engineer. - - - Please restart the app and migrate the database to enable push notifications. - No comment provided by engineer. - - - Please store passphrase securely, you will NOT be able to access chat if you lose it. - No comment provided by engineer. - - - Please store passphrase securely, you will NOT be able to change it if you lose it. - No comment provided by engineer. - - - Polish interface - No comment provided by engineer. - - - Possibly, certificate fingerprint in server address is incorrect - server test error - - - Preserve the last message draft, with attachments. - No comment provided by engineer. - - - Preset server - No comment provided by engineer. - - - Preset server address - No comment provided by engineer. - - - Preview - No comment provided by engineer. - - - Privacy & security - No comment provided by engineer. - - - Privacy redefined - No comment provided by engineer. - - - Private filenames - No comment provided by engineer. - - - Profile and server connections - No comment provided by engineer. - - - Profile image - No comment provided by engineer. - - - Profile password - No comment provided by engineer. - - - Profile update will be sent to your contacts. - No comment provided by engineer. - - - Prohibit audio/video calls. - No comment provided by engineer. - - - Prohibit irreversible message deletion. - No comment provided by engineer. - - - Prohibit message reactions. - No comment provided by engineer. - - - Prohibit messages reactions. - No comment provided by engineer. - - - Prohibit sending direct messages to members. - No comment provided by engineer. - - - Prohibit sending disappearing messages. - No comment provided by engineer. - - - Prohibit sending voice messages. - No comment provided by engineer. - - - Protect app screen - No comment provided by engineer. - - - Protect your chat profiles with a password! - No comment provided by engineer. - - - Protocol timeout - No comment provided by engineer. - - - Push notifications - No comment provided by engineer. - - - Rate the app - No comment provided by engineer. - - - React... - chat item menu - - - Read - No comment provided by engineer. - - - Read more - No comment provided by engineer. - - - Read more in [User Guide](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address). - No comment provided by engineer. - - - Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). - No comment provided by engineer. - - - Read more in our GitHub repository. - No comment provided by engineer. - - - Read more in our [GitHub repository](https://github.com/simplex-chat/simplex-chat#readme). - No comment provided by engineer. - - - Received at - No comment provided by engineer. - - - Received at: %@ - copied message info - - - Received file event - notification - - - Received message - message info title - - - Receiving file will be stopped. - No comment provided by engineer. - - - Receiving via - No comment provided by engineer. - - - Recipients see updates as you type them. - No comment provided by engineer. - - - Record updated at - No comment provided by engineer. - - - Record updated at: %@ - copied message info - - - Reduced battery usage - No comment provided by engineer. - - - Reject - reject incoming call via notification - - - Reject contact (sender NOT notified) - No comment provided by engineer. - - - Reject contact request - No comment provided by engineer. - - - Relay server is only used if necessary. Another party can observe your IP address. - No comment provided by engineer. - - - Relay server protects your IP address, but it can observe the duration of the call. - No comment provided by engineer. - - - Remove - No comment provided by engineer. - - - Remove member - No comment provided by engineer. - - - Remove member? - No comment provided by engineer. - - - Remove passphrase from keychain? - No comment provided by engineer. - - - Reply - chat item action - - - Required - No comment provided by engineer. - - - Reset - No comment provided by engineer. - - - Reset colors - No comment provided by engineer. - - - Reset to defaults - No comment provided by engineer. - - - Restart the app to create a new chat profile - No comment provided by engineer. - - - Restart the app to use imported chat database - No comment provided by engineer. - - - Restore - No comment provided by engineer. - - - Restore database backup - No comment provided by engineer. - - - Restore database backup? - No comment provided by engineer. - - - Restore database error - No comment provided by engineer. - - - Reveal - chat item action - - - Revert - No comment provided by engineer. - - - Revoke - No comment provided by engineer. - - - Revoke file - cancel file action - - - Revoke file? - No comment provided by engineer. - - - Role - No comment provided by engineer. - - - Run chat - No comment provided by engineer. - - - SMP servers - No comment provided by engineer. - - - Save - chat item action - - - Save (and notify contacts) - No comment provided by engineer. - - - Save and notify contact - No comment provided by engineer. - - - Save and notify group members - No comment provided by engineer. - - - Save and update group profile - No comment provided by engineer. - - - Save archive - No comment provided by engineer. - - - Save auto-accept settings - No comment provided by engineer. - - - Save group profile - No comment provided by engineer. - - - Save passphrase and open chat - No comment provided by engineer. - - - Save passphrase in Keychain - No comment provided by engineer. - - - Save preferences? - No comment provided by engineer. - - - Save profile password - No comment provided by engineer. - - - Save servers - No comment provided by engineer. - - - Save servers? - No comment provided by engineer. - - - Save settings? - No comment provided by engineer. - - - Save welcome message? - No comment provided by engineer. - - - Saved WebRTC ICE servers will be removed - No comment provided by engineer. - - - Scan QR code - No comment provided by engineer. - - - Scan code - No comment provided by engineer. - - - Scan security code from your contact's app. - No comment provided by engineer. - - - Scan server QR code - No comment provided by engineer. - - - Search - No comment provided by engineer. - - - Secure queue - server test step - - - Security assessment - No comment provided by engineer. - - - Security code - No comment provided by engineer. - - - Select - No comment provided by engineer. - - - Self-destruct - No comment provided by engineer. - - - Self-destruct passcode - No comment provided by engineer. - - - Self-destruct passcode changed! - No comment provided by engineer. - - - Self-destruct passcode enabled! - No comment provided by engineer. - - - Send - No comment provided by engineer. - - - Send a live message - it will update for the recipient(s) as you type it - No comment provided by engineer. - - - Send direct message - No comment provided by engineer. - - - Send disappearing message - No comment provided by engineer. - - - Send link previews - No comment provided by engineer. - - - Send live message - No comment provided by engineer. - - - Send notifications - No comment provided by engineer. - - - Send notifications: - No comment provided by engineer. - - - Send questions and ideas - No comment provided by engineer. - - - Send them from gallery or custom keyboards. - No comment provided by engineer. - - - Sender cancelled file transfer. - No comment provided by engineer. - - - Sender may have deleted the connection request. - No comment provided by engineer. - - - Sending file will be stopped. - No comment provided by engineer. - - - Sending via - No comment provided by engineer. - - - Sent at - No comment provided by engineer. - - - Sent at: %@ - copied message info - - - Sent file event - notification - - - Sent message - message info title - - - Sent messages will be deleted after set time. - No comment provided by engineer. - - - Server requires authorization to create queues, check password - server test error - - - Server requires authorization to upload, check password - server test error - - - Server test failed! - No comment provided by engineer. - - - Servers - No comment provided by engineer. - - - Set 1 day - No comment provided by engineer. - - - Set contact name… - No comment provided by engineer. - - - Set group preferences - No comment provided by engineer. - - - Set it instead of system authentication. - No comment provided by engineer. - - - Set passcode - No comment provided by engineer. - - - Set passphrase to export - No comment provided by engineer. - - - Set the message shown to new members! - No comment provided by engineer. - - - Set timeouts for proxy/VPN - No comment provided by engineer. - - - Settings - No comment provided by engineer. - - - Share - chat item action - - - Share 1-time link - No comment provided by engineer. - - - Share address - No comment provided by engineer. - - - Share address with contacts? - No comment provided by engineer. - - - Share link - No comment provided by engineer. - - - Share one-time invitation link - No comment provided by engineer. - - - Share with contacts - No comment provided by engineer. - - - Show calls in phone history - No comment provided by engineer. - - - Show developer options - No comment provided by engineer. - - - Show preview - No comment provided by engineer. - - - Show: - No comment provided by engineer. - - - SimpleX Address - No comment provided by engineer. - - - SimpleX Chat security was audited by Trail of Bits. - No comment provided by engineer. - - - SimpleX Lock - No comment provided by engineer. - - - SimpleX Lock mode - No comment provided by engineer. - - - SimpleX Lock not enabled! - No comment provided by engineer. - - - SimpleX Lock turned on - No comment provided by engineer. - - - SimpleX address - No comment provided by engineer. - - - SimpleX contact address - simplex link type - - - SimpleX encrypted message or connection event - notification - - - SimpleX group link - simplex link type - - - SimpleX links - No comment provided by engineer. - - - SimpleX one-time invitation - simplex link type - - - Skip - No comment provided by engineer. - - - Skipped messages - No comment provided by engineer. - - - Some non-fatal errors occurred during import - you may see Chat console for more details. - No comment provided by engineer. - - - Somebody - notification title - - - Start a new chat - No comment provided by engineer. - - - Start chat - No comment provided by engineer. - - - Start migration - No comment provided by engineer. - - - Stop - No comment provided by engineer. - - - Stop SimpleX - authentication reason - - - Stop chat to enable database actions - No comment provided by engineer. - - - Stop chat to export, import or delete chat database. You will not be able to receive and send messages while the chat is stopped. - No comment provided by engineer. - - - Stop chat? - No comment provided by engineer. - - - Stop file - cancel file action - - - Stop receiving file? - No comment provided by engineer. - - - Stop sending file? - No comment provided by engineer. - - - Stop sharing - No comment provided by engineer. - - - Stop sharing address? - No comment provided by engineer. - - - Submit - No comment provided by engineer. - - - Support SimpleX Chat - No comment provided by engineer. - - - System - No comment provided by engineer. - - - System authentication - No comment provided by engineer. - - - TCP connection timeout - No comment provided by engineer. - - - TCP_KEEPCNT - No comment provided by engineer. - - - TCP_KEEPIDLE - No comment provided by engineer. - - - TCP_KEEPINTVL - No comment provided by engineer. - - - Take picture - No comment provided by engineer. - - - Tap button - No comment provided by engineer. - - - Tap to activate profile. - No comment provided by engineer. - - - Tap to join - 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. - - - Test failed at step %@. - server test failure - - - Test server - No comment provided by engineer. - - - Test servers - No comment provided by engineer. - - - Tests failed! - No comment provided by engineer. - - - Thank you for installing SimpleX Chat! - No comment provided by engineer. - - - Thanks to the users – [contribute via Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! - No comment provided by engineer. - - - Thanks to the users – contribute via Weblate! - No comment provided by engineer. - - - The 1st platform without any user identifiers – private by design. - No comment provided by engineer. - - - The ID of the next message is incorrect (less or equal to the previous). -It can happen because of some bug or when the connection is compromised. - No comment provided by engineer. - - - The app can notify you when you receive messages or contact requests - please open settings to enable. - No comment provided by engineer. - - - The attempt to change database passphrase was not completed. - No comment provided by engineer. - - - The connection you accepted will be cancelled! - 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 fully decentralized – it is visible only to the members. - No comment provided by engineer. - - - The hash of the previous message is different. - No comment provided by engineer. - - - The message will be deleted for all members. - No comment provided by engineer. - - - The message will be marked as moderated for all members. - No comment provided by engineer. - - - The next generation of private messaging - No comment provided by engineer. - - - The old database was not removed during the migration, it can be deleted. - No comment provided by engineer. - - - The profile is only shared with your contacts. - No comment provided by engineer. - - - The sender will NOT be notified - No comment provided by engineer. - - - The servers for new connections of your current chat profile **%@**. - No comment provided by engineer. - - - Theme - No comment provided by engineer. - - - There should be at least one user profile. - No comment provided by engineer. - - - There should be at least one visible user profile. - No comment provided by engineer. - - - This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain. - No comment provided by engineer. - - - This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes. - No comment provided by engineer. - - - This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost. - No comment provided by engineer. - - - This error is permanent for this connection, please re-connect. - No comment provided by engineer. - - - This feature is experimental! It will only work if the other client has version 4.2 installed. You should see the message in the conversation once the address change is completed – please check that you can still receive messages from this contact (or group member). - No comment provided by engineer. - - - This group no longer exists. - No comment provided by engineer. - - - This setting applies to messages in your current chat profile **%@**. - No comment provided by engineer. - - - To ask any questions and to receive updates: - No comment provided by engineer. - - - To connect, your contact can scan QR code or use the link in the app. - No comment provided by engineer. - - - To find the profile used for an incognito connection, tap the contact or group name on top of the chat. - No comment provided by engineer. - - - To make a new connection - No comment provided by engineer. - - - To protect privacy, instead of user IDs used by all other platforms, SimpleX has identifiers for message queues, separate for each of your contacts. - No comment provided by engineer. - - - To protect timezone, image/voice files use UTC. - No comment provided by engineer. - - - To protect your information, turn on SimpleX Lock. -You will be prompted to complete authentication before this feature is enabled. - No comment provided by engineer. - - - To record voice message please grant permission to use Microphone. - No comment provided by engineer. - - - To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page. - No comment provided by engineer. - - - To support instant push notifications the chat database has to be migrated. - No comment provided by engineer. - - - To verify end-to-end encryption with your contact compare (or scan) the code on your devices. - No comment provided by engineer. - - - Transport isolation - No comment provided by engineer. - - - Trying to connect to the server used to receive messages from this contact (error: %@). - No comment provided by engineer. - - - Trying to connect to the server used to receive messages from this contact. - No comment provided by engineer. - - - Turn off - No comment provided by engineer. - - - Turn off notifications? - No comment provided by engineer. - - - Turn on - No comment provided by engineer. - - - Unable to record voice message - No comment provided by engineer. - - - Unexpected error: %@ - No comment provided by engineer. - - - Unexpected migration state - No comment provided by engineer. - - - Unhide - No comment provided by engineer. - - - Unhide chat profile - No comment provided by engineer. - - - Unhide profile - No comment provided by engineer. - - - Unit - No comment provided by engineer. - - - Unknown caller - callkit banner - - - Unknown database error: %@ - No comment provided by engineer. - - - Unknown error - No comment provided by engineer. - - - Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions. - No comment provided by engineer. - - - Unless your contact deleted the connection or this link was already used, it might be a bug - please report it. -To connect, please ask your contact to create another connection link and check that you have a stable network connection. - No comment provided by engineer. - - - Unlock - No comment provided by engineer. - - - Unlock app - authentication reason - - - Unmute - No comment provided by engineer. - - - Unread - No comment provided by engineer. - - - Update - No comment provided by engineer. - - - Update .onion hosts setting? - No comment provided by engineer. - - - Update database passphrase - No comment provided by engineer. - - - Update network settings? - No comment provided by engineer. - - - Update transport isolation mode? - No comment provided by engineer. - - - Updating settings will re-connect the client to all servers. - No comment provided by engineer. - - - Updating this setting will re-connect the client to all servers. - No comment provided by engineer. - - - Upgrade and open chat - No comment provided by engineer. - - - Upload file - server test step - - - Use .onion hosts - No comment provided by engineer. - - - Use SimpleX Chat servers? - No comment provided by engineer. - - - Use chat - No comment provided by engineer. - - - Use for new connections - No comment provided by engineer. - - - Use iOS call interface - No comment provided by engineer. - - - Use server - No comment provided by engineer. - - - User profile - No comment provided by engineer. - - - Using .onion hosts requires compatible VPN provider. - No comment provided by engineer. - - - Using SimpleX Chat servers. - No comment provided by engineer. - - - Verify connection security - No comment provided by engineer. - - - Verify security code - No comment provided by engineer. - - - Via browser - No comment provided by engineer. - - - Video call - No comment provided by engineer. - - - Video will be received when your contact completes uploading it. - No comment provided by engineer. - - - Video will be received when your contact is online, please wait or check later! - No comment provided by engineer. - - - Videos and files up to 1gb - No comment provided by engineer. - - - View security code - No comment provided by engineer. - - - Voice messages - chat feature - - - Voice messages are prohibited in this chat. - No comment provided by engineer. - - - Voice messages are prohibited in this group. - No comment provided by engineer. - - - Voice messages prohibited! - No comment provided by engineer. - - - Voice message… - No comment provided by engineer. - - - Waiting for file - No comment provided by engineer. - - - Waiting for image - No comment provided by engineer. - - - Waiting for video - No comment provided by engineer. - - - Warning: you may lose some data! - No comment provided by engineer. - - - WebRTC ICE servers - No comment provided by engineer. - - - Welcome %@! - No comment provided by engineer. - - - Welcome message - No comment provided by engineer. - - - What's new - No comment provided by engineer. - - - When available - No comment provided by engineer. - - - When people request to connect, you can accept or reject it. - No comment provided by engineer. - - - 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. - - - With optional welcome message. - No comment provided by engineer. - - - Wrong database passphrase - No comment provided by engineer. - - - Wrong passphrase! - No comment provided by engineer. - - - XFTP servers - No comment provided by engineer. - - - You - No comment provided by engineer. - - - You accepted connection - No comment provided by engineer. - - - You allow - No comment provided by engineer. - - - You already have a chat profile with the same display name. Please choose another name. - No comment provided by engineer. - - - You are already connected to %@. - No comment provided by engineer. - - - You are connected to the server used to receive messages from this contact. - No comment provided by engineer. - - - You are invited to group - No comment provided by engineer. - - - You can accept calls from lock screen, without device and app authentication. - 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. - No comment provided by engineer. - - - You can create it later - No comment provided by engineer. - - - You can hide or mute a user profile - swipe it to the right. - No comment provided by engineer. - - - You can now send messages to %@ - notification body - - - You can set lock screen notification preview via settings. - No comment provided by engineer. - - - You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. - No comment provided by engineer. - - - You can share this address with your contacts to let them connect with **%@**. - No comment provided by engineer. - - - You can share your address as a link or QR code - anybody can connect to you. - No comment provided by engineer. - - - You can start chat via app Settings / Database or by restarting the app - No comment provided by engineer. - - - You can turn on SimpleX Lock via Settings. - No comment provided by engineer. - - - You can use markdown to format messages: - No comment provided by engineer. - - - You can't send messages! - No comment provided by engineer. - - - You control through which server(s) **to receive** the messages, your contacts – the servers you use to message them. - 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. - No comment provided by engineer. - - - You invited your contact - No comment provided by engineer. - - - You joined this group - No comment provided by engineer. - - - You joined this group. Connecting to inviting group member. - 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 need to allow your contact to send voice messages to be able to send them. - No comment provided by engineer. - - - You rejected group invitation - No comment provided by engineer. - - - You sent group invitation - No comment provided by engineer. - - - You will be connected to group when the group host's device is online, please wait or check later! - No comment provided by engineer. - - - You will be connected when your connection request is accepted, please wait or check later! - No comment provided by engineer. - - - You will be connected when your contact's device is online, please wait or check later! - No comment provided by engineer. - - - You will be required to authenticate when you start or resume the app after 30 seconds in background. - No comment provided by engineer. - - - You will join a group this link refers to and connect to its group members. - No comment provided by engineer. - - - You will still receive calls and notifications from muted profiles when they are active. - No comment provided by engineer. - - - You will stop receiving messages from this group. Chat history will be preserved. - No comment provided by engineer. - - - You won't lose your contacts if you later delete your address. - 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 %@ servers - No comment provided by engineer. - - - Your ICE servers - No comment provided by engineer. - - - Your SMP servers - No comment provided by engineer. - - - Your SimpleX address - No comment provided by engineer. - - - Your XFTP servers - No comment provided by engineer. - - - Your calls - No comment provided by engineer. - - - Your chat database - No comment provided by engineer. - - - Your chat database is not encrypted - set passphrase to encrypt it. - No comment provided by engineer. - - - Your chat profile will be sent to group members - No comment provided by engineer. - - - Your chat profile will be sent to your contact - No comment provided by engineer. - - - Your chat profiles - No comment provided by engineer. - - - Your chats - No comment provided by engineer. - - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - No comment provided by engineer. - - - Your contact sent a file that is larger than currently supported maximum size (%@). - No comment provided by engineer. - - - Your contacts can allow full message deletion. - No comment provided by engineer. - - - Your contacts in SimpleX will see it. -You can change it in Settings. - No comment provided by engineer. - - - Your contacts will remain connected. - No comment provided by engineer. - - - Your current chat database will be DELETED and REPLACED with the imported one. - No comment provided by engineer. - - - Your current profile - No comment provided by engineer. - - - Your preferences - No comment provided by engineer. - - - Your privacy - No comment provided by engineer. - - - Your profile is stored on your device and shared only with your contacts. -SimpleX servers cannot see your profile. - No comment provided by engineer. - - - Your profile will be sent to the contact that you received this link from - No comment provided by engineer. - - - Your profile, contacts and delivered messages are stored on your device. - No comment provided by engineer. - - - Your random profile - No comment provided by engineer. - - - Your server - No comment provided by engineer. - - - Your server address - No comment provided by engineer. - - - Your settings - No comment provided by engineer. - - - [Contribute](https://github.com/simplex-chat/simplex-chat#contribute) - No comment provided by engineer. - - - [Send us email](mailto:chat@simplex.chat) - No comment provided by engineer. - - - [Star on GitHub](https://github.com/simplex-chat/simplex-chat) - No comment provided by engineer. - - - \_italic_ - No comment provided by engineer. - - - \`a + b` - No comment provided by engineer. - - - above, then choose: - No comment provided by engineer. - - - accepted call - call status - - - admin - member role - - - always - pref value - - - audio call (not e2e encrypted) - No comment provided by engineer. - - - bad message ID - integrity error chat item - - - bad message hash - integrity error chat item - - - bold - No comment provided by engineer. - - - call error - call status - - - call in progress - call status - - - calling… - call status - - - cancelled %@ - feature offered item - - - changed address for you - chat item text - - - changed role of %1$@ to %2$@ - rcv group event chat item - - - changed your role to %@ - rcv group event chat item - - - changing address for %@... - chat item text - - - changing address... - chat item text - - - colored - No comment provided by engineer. - - - complete - No comment provided by engineer. - - - connect to SimpleX Chat developers. - No comment provided by engineer. - - - connected - No comment provided by engineer. - - - connecting - No comment provided by engineer. - - - connecting (accepted) - No comment provided by engineer. - - - connecting (announced) - No comment provided by engineer. - - - connecting (introduced) - No comment provided by engineer. - - - connecting (introduction invitation) - No comment provided by engineer. - - - connecting call… - call status - - - connecting… - chat list item title - - - connection established - chat list item title (it should not be shown - - - connection:%@ - connection information - - - contact has e2e encryption - No comment provided by engineer. - - - contact has no e2e encryption - No comment provided by engineer. - - - creator - No comment provided by engineer. - - - custom - dropdown time picker choice - - - database version is newer than the app, but no down migration for: %@ - No comment provided by engineer. - - - days - time unit - - - default (%@) - pref value - - - deleted - deleted chat item - - - deleted group - rcv group event chat item - - - different migration in the app/database: %@ / %@ - No comment provided by engineer. - - - direct - connection level description - - - duplicate message - integrity error chat item - - - e2e encrypted - No comment provided by engineer. - - - enabled - enabled status - - - enabled for contact - enabled status - - - enabled for you - enabled status - - - ended - No comment provided by engineer. - - - ended call %@ - call status - - - error - No comment provided by engineer. - - - group deleted - No comment provided by engineer. - - - group profile updated - snd group event chat item - - - hours - time unit - - - iOS Keychain is used to securely store passphrase - it allows receiving push notifications. - No comment provided by engineer. - - - iOS Keychain will be used to securely store passphrase after you restart the app or change passphrase - it will allow receiving push notifications. - No comment provided by engineer. - - - incognito via contact address link - chat list item description - - - incognito via group link - chat list item description - - - incognito via one-time link - chat list item description - - - indirect (%d) - connection level description - - - invalid chat - invalid chat data - - - invalid chat data - No comment provided by engineer. - - - invalid data - invalid chat item - - - invitation to group %@ - group name - - - invited - No comment provided by engineer. - - - invited %@ - rcv group event chat item - - - invited to connect - chat list item title - - - invited via your group link - rcv group event chat item - - - italic - No comment provided by engineer. - - - join as %@ - No comment provided by engineer. - - - left - rcv group event chat item - - - marked deleted - marked deleted chat item preview text - - - member - member role - - - connected - rcv group event chat item - - - message received - notification - - - minutes - time unit - - - missed call - call status - - - moderated - moderated chat item - - - moderated by %@ - No comment provided by engineer. - - - months - time unit - - - never - No comment provided by engineer. - - - new message - notification - - - no - pref value - - - no e2e encryption - No comment provided by engineer. - - - no text - copied message info in history - - - observer - member role - - - off - enabled status - group pref value - - - offered %@ - feature offered item - - - offered %1$@: %2$@ - feature offered item - - - on - group pref value - - - or chat with the developers - No comment provided by engineer. - - - owner - member role - - - peer-to-peer - No comment provided by engineer. - - - received answer… - No comment provided by engineer. - - - received confirmation… - No comment provided by engineer. - - - rejected call - call status - - - removed - No comment provided by engineer. - - - removed %@ - rcv group event chat item - - - removed you - rcv group event chat item - - - sec - network option - - - seconds - time unit - - - secret - No comment provided by engineer. - - - starting… - No comment provided by engineer. - - - strike - No comment provided by engineer. - - - this contact - notification title - - - unknown - connection info - - - updated group profile - rcv group event chat item - - - v%@ (%@) - No comment provided by engineer. - - - via contact address link - chat list item description - - - via group link - chat list item description - - - via one-time link - chat list item description - - - via relay - No comment provided by engineer. - - - video call (not e2e encrypted) - No comment provided by engineer. - - - waiting for answer… - No comment provided by engineer. - - - waiting for confirmation… - No comment provided by engineer. - - - wants to connect to you! - No comment provided by engineer. - - - weeks - time unit - - - yes - pref value - - - you are invited to group - No comment provided by engineer. - - - you are observer - No comment provided by engineer. - - - you changed address - chat item text - - - you changed address for %@ - chat item text - - - you changed role for yourself to %@ - snd group event chat item - - - you changed role of %1$@ to %2$@ - snd group event chat item - - - you left - snd group event chat item - - - you removed %@ - snd group event chat item - - - you shared one-time link - chat list item description - - - you shared one-time link incognito - chat list item description - - - you: - No comment provided by engineer. - - - \~strike~ - No comment provided by engineer. - - -
- -
- -
- - - SimpleX - Bundle name - - - SimpleX needs camera access to scan QR codes to connect to other users and for video calls. - Privacy - Camera Usage Description - - - SimpleX uses Face ID for local authentication - Privacy - Face ID Usage Description - - - SimpleX needs microphone access for audio and video calls, and to record voice messages. - Privacy - Microphone Usage Description - - - SimpleX needs access to Photo Library for saving captured and received media - Privacy - Photo Library Additions Usage Description - - -
- -
- -
- - - SimpleX NSE - Bundle display name - - - SimpleX NSE - Bundle name - - - Copyright © 2022 SimpleX Chat. All rights reserved. - Copyright (human-readable) - - -
-
diff --git a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff index 6a5eb34a47..e138a209de 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -392,6 +392,11 @@ , No comment provided by engineer.
+ + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -748,6 +753,10 @@ Sta oproepen alleen toe als uw contact dit toestaat. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Sta verdwijnende berichten alleen toe als uw contact dit toestaat. @@ -785,6 +794,7 @@ Allow sharing + Delen toestaan No comment provided by engineer. @@ -937,6 +947,10 @@ Archiveren en uploaden No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database Database archiveren @@ -1079,6 +1093,7 @@ Blur media + Vervaag media No comment provided by engineer. @@ -1126,11 +1141,23 @@ Oproepen No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available Camera niet beschikbaar No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Kan contact niet uitnodigen! @@ -1141,6 +1168,10 @@ Kan geen contacten uitnodigen! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Annuleren @@ -1252,6 +1283,11 @@ Chat database verwijderd No comment provided by engineer. + + Chat database exported + Chat database geëxporteerd + No comment provided by engineer. + Chat database imported Chat database geïmporteerd @@ -1397,6 +1433,10 @@ Bevestig toegangscode No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Bevestig database upgrades @@ -1452,6 +1492,10 @@ Verbinden met desktop No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? Verbinding maken met jezelf? @@ -1526,6 +1570,10 @@ Dit is uw eigen eenmalige link! Verbinden met server... (fout: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Verbinding maken met desktop @@ -1536,6 +1584,10 @@ Dit is uw eigen eenmalige link! Verbinding No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Verbindingsfout @@ -1548,6 +1600,7 @@ Dit is uw eigen eenmalige link! Connection notifications + Verbindingsmeldingen No comment provided by engineer. @@ -1585,6 +1638,10 @@ Dit is uw eigen eenmalige link! Contact bestaat al No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Contact verborgen: @@ -1595,9 +1652,8 @@ Dit is uw eigen eenmalige link! Contact is verbonden notification - - Contact is not connected yet! - Contact is nog niet verbonden! + + Contact is deleted. No comment provided by engineer. @@ -1610,6 +1666,10 @@ Dit is uw eigen eenmalige link! Contact voorkeuren No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Contacten @@ -1625,6 +1685,14 @@ Dit is uw eigen eenmalige link! Doorgaan No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Kopiëren @@ -1900,6 +1968,7 @@ Dit is uw eigen eenmalige link! Delete %lld messages of members? + %lld berichten van leden verwijderen? No comment provided by engineer. @@ -1907,11 +1976,6 @@ Dit is uw eigen eenmalige link! %lld berichten verwijderen? No comment provided by engineer. - - Delete Contact - Verwijder contact - No comment provided by engineer. - Delete address Adres verwijderen @@ -1967,11 +2031,8 @@ Dit is uw eigen eenmalige link! Verwijder contact No comment provided by engineer. - - Delete contact? -This cannot be undone! - Verwijder contact? -Dit kan niet ongedaan gemaakt worden! + + Delete contact? No comment provided by engineer. @@ -2064,11 +2125,6 @@ Dit kan niet ongedaan gemaakt worden! Oude database verwijderen? No comment provided by engineer. - - Delete pending connection - Wachtende verbinding verwijderen - No comment provided by engineer. - Delete pending connection? Wachtende verbinding verwijderen? @@ -2084,11 +2140,19 @@ Dit kan niet ongedaan gemaakt worden! Wachtrij verwijderen server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Gebruikers profiel verwijderen? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted Verwijderd @@ -2104,6 +2168,10 @@ Dit kan niet ongedaan gemaakt worden! Verwijderd om: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors Verwijderingsfouten @@ -2146,6 +2214,7 @@ Dit kan niet ongedaan gemaakt worden! Destination server address of %@ is incompatible with forwarding server %@ settings. + Het bestemmingsserveradres van %@ is niet compatibel met de doorstuurserverinstellingen %@. No comment provided by engineer. @@ -2155,6 +2224,7 @@ Dit kan niet ongedaan gemaakt worden! Destination server version of %@ is incompatible with forwarding server %@. + De versie van de bestemmingsserver %@ is niet compatibel met de doorstuurserver %@. No comment provided by engineer. @@ -2172,6 +2242,10 @@ Dit kan niet ongedaan gemaakt worden! Ontwikkelen No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Ontwikkel gereedschap @@ -2224,6 +2298,7 @@ Dit kan niet ongedaan gemaakt worden! Disabled + Uitgeschakeld No comment provided by engineer. @@ -2453,6 +2528,7 @@ Dit kan niet ongedaan gemaakt worden! Enabled + Ingeschakeld No comment provided by engineer. @@ -2627,6 +2703,7 @@ Dit kan niet ongedaan gemaakt worden! Error connecting to forwarding server %@. Please try later. + Fout bij het verbinden met doorstuurserver %@. Probeer het later opnieuw. No comment provided by engineer. @@ -2679,11 +2756,6 @@ Dit kan niet ongedaan gemaakt worden! Fout bij verwijderen van verbinding No comment provided by engineer. - - Error deleting contact - Fout bij het verwijderen van contact - No comment provided by engineer. - Error deleting database Fout bij het verwijderen van de database @@ -2920,6 +2992,10 @@ Dit kan niet ongedaan gemaakt worden! Zelfs wanneer uitgeschakeld in het gesprek. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Afsluiten zonder opslaan @@ -3137,14 +3213,17 @@ Dit kan niet ongedaan gemaakt worden! Forwarding server %@ failed to connect to destination server %@. Please try later. + De doorstuurserver %@ kon geen verbinding maken met de bestemmingsserver %@. Probeer het later opnieuw. No comment provided by engineer. Forwarding server address is incompatible with network settings: %@. + Het adres van de doorstuurserver is niet compatibel met de netwerkinstellingen: %@. No comment provided by engineer. Forwarding server version is incompatible with network settings: %@. + De doorstuurserverversie is niet compatibel met de netwerkinstellingen: %@. No comment provided by engineer. @@ -3729,6 +3808,10 @@ Fout: %2$@ 3. De verbinding is verbroken. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Het lijkt erop dat u al bent verbonden via deze link. Als dit niet het geval is, is er een fout opgetreden (%@). @@ -3791,6 +3874,10 @@ Dit is jouw link voor groep %@! Bewaar No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop Houd de app geopend om deze vanaf de desktop te gebruiken @@ -3966,8 +4053,14 @@ Dit is jouw link voor groep %@! Max 30 seconden, direct ontvangen. No comment provided by engineer. + + Media & file servers + Media- en bestandsservers + No comment provided by engineer. + Medium + Medium blur media @@ -4055,14 +4148,9 @@ Dit is jouw link voor groep %@! Bericht ontvangst No comment provided by engineer. - - Message routing fallback - Terugval op berichtroutering - No comment provided by engineer. - - - Message routing mode - Berichtrouteringsmodus + + Message servers + Berichtservers No comment provided by engineer. @@ -4190,6 +4278,10 @@ Dit is jouw link voor groep %@! Modereren chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Gemodereerd om @@ -4265,6 +4357,10 @@ Dit is jouw link voor groep %@! Netwerk status No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Nieuwe toegangscode @@ -4397,6 +4493,7 @@ Dit is jouw link voor groep %@! Nothing selected + Niets geselecteerd No comment provided by engineer. @@ -4443,19 +4540,27 @@ Dit is jouw link voor groep %@! Oud database archief No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Eenmalige uitnodiging link No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Onion hosts zullen nodig zijn voor verbinding. Vereist het inschakelen van VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Onion hosts zullen nodig zijn voor verbinding. +Vereist het inschakelen van VPN. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Onion hosts worden gebruikt indien beschikbaar. Vereist het inschakelen van VPN. + + Onion hosts will be used when available. +Requires compatible VPN. + Onion hosts worden gebruikt indien beschikbaar. +Vereist het inschakelen van VPN. No comment provided by engineer. @@ -4468,6 +4573,10 @@ Dit is jouw link voor groep %@! Alleen client apparaten slaan gebruikers profielen, contacten, groepen en berichten op die zijn verzonden met **2-laags end-to-end-codering**. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Alleen groep eigenaren kunnen groep voorkeuren wijzigen. @@ -4703,6 +4812,10 @@ Dit is jouw link voor groep %@! Beeld-in-beeld oproepen No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Vraag uw contact om het verzenden van spraak berichten in te schakelen. @@ -5004,6 +5117,10 @@ Schakel dit in in *Netwerk en servers*-instellingen. Beoordeel de app No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Reageer… @@ -5344,11 +5461,6 @@ Schakel dit in in *Netwerk en servers*-instellingen. Onthullen chat item action - - Revert - Terugdraaien - No comment provided by engineer. - Revoke Intrekken @@ -5379,11 +5491,6 @@ Schakel dit in in *Netwerk en servers*-instellingen. SMP server No comment provided by engineer. - - SMP servers - SMP servers - No comment provided by engineer. - Safely receive files Veilig bestanden ontvangen @@ -5414,6 +5521,11 @@ Schakel dit in in *Netwerk en servers*-instellingen. Opslaan en groep leden melden No comment provided by engineer. + + Save and reconnect + Opslaan en opnieuw verbinden + No comment provided by engineer. + Save and update group profile Groep profiel opslaan en bijwerken @@ -5576,6 +5688,7 @@ Schakel dit in in *Netwerk en servers*-instellingen. Selected %lld + %lld geselecteerd No comment provided by engineer. @@ -5618,11 +5731,6 @@ Schakel dit in in *Netwerk en servers*-instellingen. Stuur ontvangstbewijzen naar No comment provided by engineer. - - Send direct message - Direct bericht sturen - No comment provided by engineer. - Send direct message to connect Stuur een direct bericht om verbinding te maken @@ -5648,6 +5756,10 @@ Schakel dit in in *Netwerk en servers*-instellingen. Stuur een livebericht No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. Stuur berichten rechtstreeks als het IP-adres beschermd is en uw of bestemmingsserver geen privéroutering ondersteunt. @@ -5945,6 +6057,7 @@ Schakel dit in in *Netwerk en servers*-instellingen. Share to SimpleX + Delen op SimpleX No comment provided by engineer. @@ -6099,13 +6212,24 @@ Schakel dit in in *Netwerk en servers*-instellingen. Soft + Soft blur media + + Some file(s) were not exported: + Sommige bestanden zijn niet geëxporteerd: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Er zijn enkele niet-fatale fouten opgetreden tijdens het importeren - u kunt de Chat console raadplegen voor meer details. No comment provided by engineer. + + Some non-fatal errors occurred during import: + Er zijn enkele niet-fatale fouten opgetreden tijdens het importeren: + No comment provided by engineer. + Somebody Iemand @@ -6203,6 +6327,7 @@ Schakel dit in in *Netwerk en servers*-instellingen. Strong + Krachtig blur media @@ -6240,6 +6365,11 @@ Schakel dit in in *Netwerk en servers*-instellingen. Systeem authenticatie No comment provided by engineer. + + TCP connection + TCP verbinding + No comment provided by engineer. + TCP connection timeout Timeout van TCP-verbinding @@ -6300,11 +6430,6 @@ Schakel dit in in *Netwerk en servers*-instellingen. Tik om te scannen No comment provided by engineer. - - Tap to start a new chat - Tik om een nieuw gesprek te starten - No comment provided by engineer. - Temporary file error Tijdelijke bestandsfout @@ -6414,10 +6539,12 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast. The messages will be deleted for all members. + De berichten worden voor alle leden verwijderd. No comment provided by engineer. The messages will be marked as moderated for all members. + De berichten worden voor alle leden als gemodereerd gemarkeerd. No comment provided by engineer. @@ -6779,11 +6906,6 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak Update No comment provided by engineer. - - Update .onion hosts setting? - .onion hosts-instelling updaten? - No comment provided by engineer. - Update database passphrase Database wachtwoord bijwerken @@ -6794,9 +6916,9 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak Netwerk instellingen bijwerken? No comment provided by engineer. - - Update transport isolation mode? - Transportisolatiemodus updaten? + + Update settings? + Instellingen actualiseren? No comment provided by engineer. @@ -6804,11 +6926,6 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak Door de instellingen bij te werken, wordt de client opnieuw verbonden met alle servers. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - Als u deze instelling bijwerkt, wordt de client opnieuw verbonden met alle servers. - No comment provided by engineer. - Upgrade and open chat Upgrade en open chat @@ -6909,6 +7026,10 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak Gebruik de app tijdens het gesprek. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Gebruikers profiel @@ -6919,11 +7040,6 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak Gebruikersselectie No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - Het gebruik van .onion-hosts vereist een compatibele VPN-provider. - No comment provided by engineer. - Using SimpleX Chat servers. SimpleX Chat servers gebruiken. @@ -7184,11 +7300,6 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak XFTP server No comment provided by engineer. - - XFTP servers - XFTP servers - No comment provided by engineer. - You Jij @@ -7311,6 +7422,10 @@ Deelnameverzoek herhalen? Je kunt nu berichten sturen naar %@ notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. U kunt een voorbeeld van een melding op het vergrendeld scherm instellen via instellingen. @@ -7336,6 +7451,10 @@ Deelnameverzoek herhalen? U kunt de chat starten via app Instellingen / Database of door de app opnieuw op te starten No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. Je kunt SimpleX Vergrendeling aanzetten via Instellingen. @@ -7378,11 +7497,6 @@ Repeat connection request? Verbindingsverzoek herhalen? No comment provided by engineer. - - You have no chats - Je hebt geen gesprekken - No comment provided by engineer. - You have to enter passphrase every time the app starts - it is not stored on the device. U moet elke keer dat de app start het wachtwoord invoeren, deze wordt niet op het apparaat opgeslagen. @@ -7403,11 +7517,25 @@ Verbindingsverzoek herhalen? Je bent lid geworden van deze groep. Verbinding maken met uitnodigend groepslid. No comment provided by engineer. + + You may migrate the exported database. + U kunt de geëxporteerde database migreren. + No comment provided by engineer. + + + You may save the exported archive. + U kunt het geëxporteerde archief opslaan. + 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. U mag ALLEEN de meest recente versie van uw chat database op één apparaat gebruiken, anders ontvangt u mogelijk geen berichten meer van sommige contacten. No comment provided by engineer. + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. U moet uw contact toestemming geven om spraak berichten te verzenden om ze te kunnen verzenden. @@ -7523,13 +7651,6 @@ Verbindingsverzoek herhalen? Uw chat profielen No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Uw contact moet online zijn om de verbinding te voltooien. -U kunt deze verbinding verbreken en het contact verwijderen en later proberen met een nieuwe link. - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Uw contact heeft een bestand verzonden dat groter is dan de momenteel ondersteunde maximale grootte (%@). @@ -7545,6 +7666,10 @@ U kunt deze verbinding verbreken en het contact verwijderen en later proberen me Uw contacten blijven verbonden. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Uw huidige chat database wordt VERWIJDERD en VERVANGEN door de geïmporteerde. @@ -7722,6 +7847,10 @@ SimpleX servers kunnen uw profiel niet zien. vetgedrukt No comment provided by engineer. + + call + No comment provided by engineer. + call error oproepfout @@ -8092,6 +8221,10 @@ SimpleX servers kunnen uw profiel niet zien. uitnodiging voor groep %@ group name + + invite + No comment provided by engineer. + invited uitgenodigd @@ -8147,6 +8280,10 @@ SimpleX servers kunnen uw profiel niet zien. is toegetreden rcv group event chat item + + message + No comment provided by engineer. + message received bericht ontvangen @@ -8177,6 +8314,10 @@ SimpleX servers kunnen uw profiel niet zien. maanden time unit + + mute + No comment provided by engineer. + never nooit @@ -8309,6 +8450,10 @@ SimpleX servers kunnen uw profiel niet zien. opgeslagen van %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec sec @@ -8383,8 +8528,8 @@ laatst ontvangen bericht: %2$@ onbekend connection info - - unknown relays + + unknown servers onbekende relays No comment provided by engineer. @@ -8393,6 +8538,10 @@ laatst ontvangen bericht: %2$@ onbekende status No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected onbeschermd @@ -8438,6 +8587,10 @@ laatst ontvangen bericht: %2$@ via relay No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) video gesprek (niet e2e versleuteld) @@ -8616,14 +8769,17 @@ laatst ontvangen bericht: %2$@ SimpleX SE + SimpleX SE Bundle display name SimpleX SE + SimpleX SE Bundle name Copyright © 2024 SimpleX Chat. All rights reserved. + Copyright © 2024 SimpleX Chat. All rights reserved. Copyright (human-readable) @@ -8635,150 +8791,187 @@ laatst ontvangen bericht: %2$@ %@ + %@ No comment provided by engineer. App is locked! + App is vergrendeld! No comment provided by engineer. Cancel + Annuleren No comment provided by engineer. Cannot access keychain to save database password + Kan geen toegang krijgen tot de keychain om het database wachtwoord op te slaan No comment provided by engineer. Cannot forward message + Kan bericht niet doorsturen No comment provided by engineer. Comment + Opmerking No comment provided by engineer. Currently maximum supported file size is %@. + De momenteel maximaal ondersteunde bestandsgrootte is %@. No comment provided by engineer. Database downgrade required + Database downgrade vereist No comment provided by engineer. Database encrypted! + Database versleuteld! No comment provided by engineer. Database error + Database fout No comment provided by engineer. Database passphrase is different from saved in the keychain. + Het wachtwoord van de database verschilt van het wachtwoord die in de keychain is opgeslagen. No comment provided by engineer. Database passphrase is required to open chat. + Database wachtwoord is vereist om je gesprekken te openen. No comment provided by engineer. Database upgrade required - No comment provided by engineer. - - - Dismiss Sheet + Database upgrade vereist No comment provided by engineer. Error preparing file + Fout bij voorbereiden bestand No comment provided by engineer. Error preparing message + Fout bij het voorbereiden van bericht No comment provided by engineer. Error: %@ + Fout: %@ No comment provided by engineer. File error + Bestandsfout No comment provided by engineer. Incompatible database version + Incompatibele database versie No comment provided by engineer. Invalid migration confirmation - No comment provided by engineer. - - - Keep Trying + Ongeldige migratie bevestiging No comment provided by engineer. Keychain error + Keychain fout No comment provided by engineer. Large file! + Groot bestand! No comment provided by engineer. No active profile - No comment provided by engineer. - - - No network connection + Geen actief profiel No comment provided by engineer. Ok + Ok No comment provided by engineer. Open the app to downgrade the database. + Open de app om de database te downgraden. No comment provided by engineer. Open the app to upgrade the database. + Open de app om de database te upgraden. No comment provided by engineer. Passphrase + Wachtwoord No comment provided by engineer. Please create a profile in the SimpleX app + Maak een profiel aan in de SimpleX app No comment provided by engineer. Selected chat preferences prohibit this message. + Geselecteerde chat voorkeuren verbieden dit bericht. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + Het verzenden van een bericht duurt langer dan verwacht. + No comment provided by engineer. + + + Sending message… + Bericht versturen… No comment provided by engineer. Share + Deel + No comment provided by engineer. + + + Slow network? + Traag netwerk? No comment provided by engineer. Unknown database error: %@ + Onbekende database fout: %@ No comment provided by engineer. Unsupported format + Niet ondersteund formaat + No comment provided by engineer. + + + Wait + wachten No comment provided by engineer. Wrong database passphrase + Verkeerde database wachtwoord No comment provided by engineer. You can allow sharing in Privacy & Security / SimpleX Lock settings. + U kunt delen toestaan in de instellingen voor Privacy en beveiliging / SimpleX Lock. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff index a9d342d549..19bad71751 100644 --- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff +++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff @@ -392,6 +392,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -748,6 +753,10 @@ Zezwalaj na połączenia tylko wtedy, gdy Twój kontakt na to pozwala. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Zezwól na znikające wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli. @@ -937,6 +946,10 @@ Archiwizuj i prześlij No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database Archiwizowanie bazy danych @@ -1126,11 +1139,23 @@ Połączenia No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available Kamera nie dostępna No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Nie można zaprosić kontaktu! @@ -1141,6 +1166,10 @@ Nie można zaprosić kontaktów! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Anuluj @@ -1252,6 +1281,10 @@ Baza danych czatu usunięta No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported Zaimportowano bazę danych czatu @@ -1397,6 +1430,10 @@ Potwierdź Pin No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Potwierdź aktualizacje bazy danych @@ -1452,6 +1489,10 @@ Połącz do komputera No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? Połączyć się ze sobą? @@ -1526,6 +1567,10 @@ To jest twój jednorazowy link! Łączenie z serwerem... (błąd: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Łączenie z komputerem @@ -1536,6 +1581,10 @@ To jest twój jednorazowy link! Połączenie No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Błąd połączenia @@ -1585,6 +1634,10 @@ To jest twój jednorazowy link! Kontakt już istnieje No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Kontakt ukryty: @@ -1595,9 +1648,8 @@ To jest twój jednorazowy link! Kontakt jest połączony notification - - Contact is not connected yet! - Kontakt nie jest jeszcze połączony! + + Contact is deleted. No comment provided by engineer. @@ -1610,6 +1662,10 @@ To jest twój jednorazowy link! Preferencje kontaktu No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Kontakty @@ -1625,6 +1681,14 @@ To jest twój jednorazowy link! Kontynuuj No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Kopiuj @@ -1907,11 +1971,6 @@ To jest twój jednorazowy link! Usunąć %lld wiadomości? No comment provided by engineer. - - Delete Contact - Usuń Kontakt - No comment provided by engineer. - Delete address Usuń adres @@ -1967,11 +2026,8 @@ To jest twój jednorazowy link! Usuń kontakt No comment provided by engineer. - - Delete contact? -This cannot be undone! - Usunąć kontakt? -To nie może być cofnięte! + + Delete contact? No comment provided by engineer. @@ -2064,11 +2120,6 @@ To nie może być cofnięte! Usunąć starą bazę danych? No comment provided by engineer. - - Delete pending connection - Usuń oczekujące połączenie - No comment provided by engineer. - Delete pending connection? Usunąć oczekujące połączenie? @@ -2084,11 +2135,19 @@ To nie może być cofnięte! Usuń kolejkę server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Usunąć profil użytkownika? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted Usunięto @@ -2104,6 +2163,10 @@ To nie może być cofnięte! Usunięto o: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors Błędy usuwania @@ -2172,6 +2235,10 @@ To nie może być cofnięte! Deweloperskie No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Narzędzia deweloperskie @@ -2679,11 +2746,6 @@ To nie może być cofnięte! Błąd usuwania połączenia No comment provided by engineer. - - Error deleting contact - Błąd usuwania kontaktu - No comment provided by engineer. - Error deleting database Błąd usuwania bazy danych @@ -2920,6 +2982,10 @@ To nie może być cofnięte! Nawet po wyłączeniu w rozmowie. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Wyjdź bez zapisywania @@ -3729,6 +3795,10 @@ Błąd: %2$@ 3. Połączenie zostało skompromitowane. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Wygląda na to, że jesteś już połączony przez ten link. Jeśli tak nie jest, wystąpił błąd (%@). @@ -3791,6 +3861,10 @@ To jest twój link do grupy %@! Zachowaj No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop Zostaw aplikację otwartą i używaj ją z komputera @@ -3966,6 +4040,10 @@ To jest twój link do grupy %@! Maksymalnie 30 sekund, odbierane natychmiast. No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium blur media @@ -4055,14 +4133,8 @@ To jest twój link do grupy %@! Odebranie wiadomości No comment provided by engineer. - - Message routing fallback - Rezerwowe trasowania wiadomości - No comment provided by engineer. - - - Message routing mode - Tryb trasowania wiadomości + + Message servers No comment provided by engineer. @@ -4190,6 +4262,10 @@ To jest twój link do grupy %@! Moderowany chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Moderowany o @@ -4265,6 +4341,10 @@ To jest twój link do grupy %@! Status sieci No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Nowy Pin @@ -4443,19 +4523,27 @@ To jest twój link do grupy %@! Stare archiwum bazy danych No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Jednorazowy link zaproszenia No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Hosty onion będą wymagane do połączenia. Wymaga włączenia VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Hosty onion będą wymagane do połączenia. +Wymaga włączenia VPN. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Hosty onion będą używane, gdy będą dostępne. Wymaga włączenia VPN. + + Onion hosts will be used when available. +Requires compatible VPN. + Hosty onion będą używane, gdy będą dostępne. +Wymaga włączenia VPN. No comment provided by engineer. @@ -4468,6 +4556,10 @@ To jest twój link do grupy %@! Tylko urządzenia klienckie przechowują profile użytkowników, kontakty, grupy i wiadomości wysyłane za pomocą **2-warstwowego szyfrowania end-to-end**. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Tylko właściciele grup mogą zmieniać preferencje grupy. @@ -4703,6 +4795,10 @@ To jest twój link do grupy %@! Połączenia obraz-w-obrazie No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Poproś Twój kontakt o włączenie wysyłania wiadomości głosowych. @@ -5004,6 +5100,10 @@ Włącz w ustawianiach *Sieć i serwery* . Oceń aplikację No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Reaguj… @@ -5344,11 +5444,6 @@ Włącz w ustawianiach *Sieć i serwery* . Ujawnij chat item action - - Revert - Przywrócić - No comment provided by engineer. - Revoke Odwołaj @@ -5379,11 +5474,6 @@ Włącz w ustawianiach *Sieć i serwery* . Serwer SMP No comment provided by engineer. - - SMP servers - Serwery SMP - No comment provided by engineer. - Safely receive files Bezpiecznie otrzymuj pliki @@ -5414,6 +5504,10 @@ Włącz w ustawianiach *Sieć i serwery* . Zapisz i powiadom członków grupy No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile Zapisz i zaktualizuj profil grupowy @@ -5618,11 +5712,6 @@ Włącz w ustawianiach *Sieć i serwery* . Wyślij potwierdzenia dostawy do No comment provided by engineer. - - Send direct message - Wyślij wiadomość bezpośrednią - No comment provided by engineer. - Send direct message to connect Wyślij wiadomość bezpośrednią aby połączyć @@ -5648,6 +5737,10 @@ Włącz w ustawianiach *Sieć i serwery* . Wyślij wiadomość na żywo No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. Wysyłaj wiadomości bezpośrednio, gdy adres IP jest chroniony i Twój lub docelowy serwer nie obsługuje prywatnego trasowania. @@ -6101,11 +6194,19 @@ Włącz w ustawianiach *Sieć i serwery* . Soft blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Podczas importu wystąpiły niekrytyczne błędy - więcej szczegółów można znaleźć w konsoli czatu. No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody Ktoś @@ -6240,6 +6341,10 @@ Włącz w ustawianiach *Sieć i serwery* . Uwierzytelnianie systemu No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout Limit czasu połączenia TCP @@ -6300,11 +6405,6 @@ Włącz w ustawianiach *Sieć i serwery* . Dotknij, aby zeskanować No comment provided by engineer. - - Tap to start a new chat - Dotknij, aby rozpocząć nowy czat - No comment provided by engineer. - Temporary file error Tymczasowy błąd pliku @@ -6779,11 +6879,6 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc Aktualizuj No comment provided by engineer. - - Update .onion hosts setting? - Zaktualizować ustawienie hostów .onion? - No comment provided by engineer. - Update database passphrase Aktualizuj hasło do bazy danych @@ -6794,9 +6889,8 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc Zaktualizować ustawienia sieci? No comment provided by engineer. - - Update transport isolation mode? - Zaktualizować tryb izolacji transportu? + + Update settings? No comment provided by engineer. @@ -6804,11 +6898,6 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc Aktualizacja ustawień spowoduje ponowne połączenie klienta ze wszystkimi serwerami. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - Aktualizacja tych ustawień spowoduje ponowne połączenie klienta ze wszystkimi serwerami. - No comment provided by engineer. - Upgrade and open chat Zaktualizuj i otwórz czat @@ -6909,6 +6998,10 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc Używaj aplikacji podczas połączenia. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Profil użytkownika @@ -6919,11 +7012,6 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc Wybór użytkownika No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - Używanie hostów .onion wymaga kompatybilnego dostawcy VPN. - No comment provided by engineer. - Using SimpleX Chat servers. Używanie serwerów SimpleX Chat. @@ -7184,11 +7272,6 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc Serwer XFTP No comment provided by engineer. - - XFTP servers - Serwery XFTP - No comment provided by engineer. - You Ty @@ -7311,6 +7394,10 @@ Powtórzyć prośbę dołączenia? Możesz teraz wysyłać wiadomości do %@ notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. Podgląd powiadomień na ekranie blokady można ustawić w ustawieniach. @@ -7336,6 +7423,10 @@ Powtórzyć prośbę dołączenia? Możesz rozpocząć czat poprzez Ustawienia aplikacji / Baza danych lub poprzez ponowne uruchomienie aplikacji No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. Możesz włączyć blokadę SimpleX poprzez Ustawienia. @@ -7378,11 +7469,6 @@ Repeat connection request? Powtórzyć prośbę połączenia? No comment provided by engineer. - - You have no chats - Nie masz czatów - No comment provided by engineer. - You have to enter passphrase every time the app starts - it is not stored on the device. Musisz wprowadzić hasło przy każdym uruchomieniu aplikacji - nie jest one przechowywane na urządzeniu. @@ -7403,11 +7489,23 @@ Powtórzyć prośbę połączenia? Dołączyłeś do tej grupy. Łączenie z zapraszającym członkiem grupy. No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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. Musisz używać najnowszej wersji bazy danych czatu TYLKO na jednym urządzeniu, w przeciwnym razie możesz przestać otrzymywać wiadomości od niektórych kontaktów. No comment provided by engineer. + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Musisz zezwolić Twojemu kontaktowi na wysyłanie wiadomości głosowych, aby móc je wysyłać. @@ -7523,13 +7621,6 @@ Powtórzyć prośbę połączenia? Twoje profile czatu No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Twój kontakt musi być online, aby połączenie zostało zakończone. -Możesz anulować to połączenie i usunąć kontakt (i spróbować później z nowym linkiem). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Twój kontakt wysłał plik, który jest większy niż obecnie obsługiwany maksymalny rozmiar (%@). @@ -7545,6 +7636,10 @@ Możesz anulować to połączenie i usunąć kontakt (i spróbować później z Twoje kontakty pozostaną połączone. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Twoja obecna baza danych czatu zostanie usunięta i zastąpiona zaimportowaną. @@ -7722,6 +7817,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu. pogrubiona No comment provided by engineer. + + call + No comment provided by engineer. + call error błąd połączenia @@ -8092,6 +8191,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu. zaproszenie do grupy %@ group name + + invite + No comment provided by engineer. + invited zaproszony @@ -8147,6 +8250,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu. połączony rcv group event chat item + + message + No comment provided by engineer. + message received wiadomość otrzymana @@ -8177,6 +8284,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu. miesiące time unit + + mute + No comment provided by engineer. + never nigdy @@ -8309,6 +8420,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu. zapisane od %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec sek @@ -8383,8 +8498,8 @@ ostatnia otrzymana wiadomość: %2$@ nieznany connection info - - unknown relays + + unknown servers nieznane przekaźniki No comment provided by engineer. @@ -8393,6 +8508,10 @@ ostatnia otrzymana wiadomość: %2$@ nieznany status No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected niezabezpieczony @@ -8438,6 +8557,10 @@ ostatnia otrzymana wiadomość: %2$@ przez przekaźnik No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) połączenie wideo (bez szyfrowania e2e) @@ -8685,10 +8808,6 @@ ostatnia otrzymana wiadomość: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - No comment provided by engineer. - Error preparing file No comment provided by engineer. @@ -8713,10 +8832,6 @@ ostatnia otrzymana wiadomość: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - No comment provided by engineer. - Keychain error No comment provided by engineer. @@ -8729,10 +8844,6 @@ ostatnia otrzymana wiadomość: %2$@ No active profile No comment provided by engineer. - - No network connection - No comment provided by engineer. - Ok No comment provided by engineer. @@ -8757,14 +8868,22 @@ ostatnia otrzymana wiadomość: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. Share No comment provided by engineer. + + Slow network? + No comment provided by engineer. + Unknown database error: %@ No comment provided by engineer. @@ -8773,6 +8892,10 @@ ostatnia otrzymana wiadomość: %2$@ Unsupported format No comment provided by engineer. + + Wait + No comment provided by engineer. + Wrong database passphrase No comment provided by engineer. 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 7789f9ddcf..1a7578c908 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -392,6 +392,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -738,6 +743,10 @@ Разрешить звонки, только если их разрешает Ваш контакт. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Разрешить исчезающие сообщения, только если Ваш контакт разрешает их Вам. @@ -926,6 +935,10 @@ Архивировать и загрузить No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database Подготовка архива @@ -1113,11 +1126,23 @@ Звонки No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available Камера недоступна No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Нельзя пригласить контакт! @@ -1128,6 +1153,10 @@ Нельзя пригласить контакты! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Отменить @@ -1237,6 +1266,10 @@ Данные чата удалены No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported Архив чата импортирован @@ -1375,6 +1408,10 @@ Подтвердить Код No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Подтвердить обновление базы данных @@ -1430,6 +1467,10 @@ Подключиться к компьютеру No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? Соединиться с самим собой? @@ -1501,6 +1542,10 @@ This is your own one-time link! Устанавливается соединение с сервером… (ошибка: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Подключение к компьютеру @@ -1511,6 +1556,10 @@ This is your own one-time link! Соединение No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Ошибка соединения @@ -1558,6 +1607,10 @@ This is your own one-time link! Существующий контакт No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Контакт скрыт: @@ -1568,9 +1621,8 @@ This is your own one-time link! Соединение с контактом установлено notification - - Contact is not connected yet! - Соединение еще не установлено! + + Contact is deleted. No comment provided by engineer. @@ -1583,6 +1635,10 @@ This is your own one-time link! Предпочтения контакта No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Контакты @@ -1598,6 +1654,14 @@ This is your own one-time link! Продолжить No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Скопировать @@ -1874,11 +1938,6 @@ This is your own one-time link! Удалить %lld сообщений? No comment provided by engineer. - - Delete Contact - Удалить контакт - No comment provided by engineer. - Delete address Удалить адрес @@ -1934,11 +1993,8 @@ This is your own one-time link! Удалить контакт No comment provided by engineer. - - Delete contact? -This cannot be undone! - Удалить контакт? -Это не может быть отменено! + + Delete contact? No comment provided by engineer. @@ -2031,11 +2087,6 @@ This cannot be undone! Удалить предыдущую версию данных? No comment provided by engineer. - - Delete pending connection - Удалить соединение - No comment provided by engineer. - Delete pending connection? Удалить ожидаемое соединение? @@ -2051,11 +2102,19 @@ This cannot be undone! Удаление очереди server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Удалить профиль пользователя? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted No comment provided by engineer. @@ -2070,6 +2129,10 @@ This cannot be undone! Удалено: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors No comment provided by engineer. @@ -2135,6 +2198,10 @@ This cannot be undone! Для разработчиков No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Инструменты разработчика @@ -2639,11 +2706,6 @@ This cannot be undone! Ошибка при удалении соединения No comment provided by engineer. - - Error deleting contact - Ошибка при удалении контакта - No comment provided by engineer. - Error deleting database Ошибка при удалении данных чата @@ -2875,6 +2937,10 @@ This cannot be undone! Даже когда они выключены в разговоре. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Выйти без сохранения @@ -3674,6 +3740,10 @@ Error: %2$@ 3. Соединение компроментировано. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Возможно, Вы уже соединились через эту ссылку. Если это не так, то это ошибка (%@). @@ -3736,6 +3806,10 @@ This is your link for group %@! Оставить No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop Оставьте приложение открытым, чтобы использовать его с компьютера @@ -3911,6 +3985,10 @@ This is your link for group %@! Макс. 30 секунд, доставляются мгновенно. No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium blur media @@ -3994,14 +4072,8 @@ This is your link for group %@! Message reception No comment provided by engineer. - - Message routing fallback - Прямая доставка сообщений - No comment provided by engineer. - - - Message routing mode - Режим доставки сообщений + + Message servers No comment provided by engineer. @@ -4125,6 +4197,10 @@ This is your link for group %@! Модерировать chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Модерировано @@ -4200,6 +4276,10 @@ This is your link for group %@! Состояние сети No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Новый Код @@ -4376,19 +4456,27 @@ This is your link for group %@! Старый архив чата No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Одноразовая ссылка No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Подключаться только к onion хостам. Требуется включенный VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Подключаться только к **onion** хостам. +Требуется совместимый VPN. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Onion хосты используются, если возможно. Требуется включенный VPN. + + Onion hosts will be used when available. +Requires compatible VPN. + Onion хосты используются, если возможно. +Требуется совместимый VPN. No comment provided by engineer. @@ -4401,6 +4489,10 @@ This is your link for group %@! Только пользовательские устройства хранят контакты, группы и сообщения, которые отправляются **с двухуровневым end-to-end шифрованием**. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Только владельцы группы могут изменять предпочтения группы. @@ -4633,6 +4725,10 @@ This is your link for group %@! Звонки с картинкой-в-картинке No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Попросите у Вашего контакта разрешить отправку голосовых сообщений. @@ -4927,6 +5023,10 @@ Enable in *Network & servers* settings. Оценить приложение No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Реакция… @@ -5253,11 +5353,6 @@ Enable in *Network & servers* settings. Показать chat item action - - Revert - Отменить изменения - No comment provided by engineer. - Revoke Отозвать @@ -5287,11 +5382,6 @@ Enable in *Network & servers* settings. SMP server No comment provided by engineer. - - SMP servers - SMP серверы - No comment provided by engineer. - Safely receive files Получайте файлы безопасно @@ -5322,6 +5412,10 @@ Enable in *Network & servers* settings. Сохранить и уведомить членов группы No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile Сохранить сообщение и обновить группу @@ -5521,11 +5615,6 @@ Enable in *Network & servers* settings. Отправка отчётов о доставке No comment provided by engineer. - - Send direct message - Отправить сообщение - No comment provided by engineer. - Send direct message to connect Отправьте сообщение чтобы соединиться @@ -5550,6 +5639,10 @@ Enable in *Network & servers* settings. Отправить живое сообщение No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. Отправлять сообщения напрямую, когда IP адрес защищен, и Ваш сервер или сервер получателя не поддерживает конфиденциальную доставку. @@ -5988,11 +6081,19 @@ Enable in *Network & servers* settings. Soft blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Во время импорта произошли некоторые ошибки - для получения более подробной информации вы можете обратиться к консоли. No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody Контакт @@ -6122,6 +6223,10 @@ Enable in *Network & servers* settings. Системная аутентификация No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout Таймаут TCP соединения @@ -6182,11 +6287,6 @@ Enable in *Network & servers* settings. Нажмите, чтобы сканировать No comment provided by engineer. - - Tap to start a new chat - Нажмите, чтобы начать чат - No comment provided by engineer. - Temporary file error No comment provided by engineer. @@ -6655,11 +6755,6 @@ To connect, please ask your contact to create another connection link and check Обновить No comment provided by engineer. - - Update .onion hosts setting? - Обновить настройки .onion хостов? - No comment provided by engineer. - Update database passphrase Поменять пароль @@ -6670,9 +6765,8 @@ To connect, please ask your contact to create another connection link and check Обновить настройки сети? No comment provided by engineer. - - Update transport isolation mode? - Обновить режим отдельных сессий? + + Update settings? No comment provided by engineer. @@ -6680,11 +6774,6 @@ To connect, please ask your contact to create another connection link and check Обновление настроек приведет к сбросу и установке нового соединения со всеми серверами. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - Обновление этих настроек приведет к сбросу и установке нового соединения со всеми серверами. - No comment provided by engineer. - Upgrade and open chat Обновить и открыть чат @@ -6782,6 +6871,10 @@ To connect, please ask your contact to create another connection link and check Используйте приложение во время звонка. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Профиль чата @@ -6791,11 +6884,6 @@ To connect, please ask your contact to create another connection link and check User selection No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - Для использования .onion хостов требуется совместимый VPN провайдер. - No comment provided by engineer. - Using SimpleX Chat servers. Используются серверы, предоставленные SimpleX Chat. @@ -7052,11 +7140,6 @@ To connect, please ask your contact to create another connection link and check XFTP server No comment provided by engineer. - - XFTP servers - XFTP серверы - No comment provided by engineer. - You Вы @@ -7178,6 +7261,10 @@ Repeat join request? Вы теперь можете общаться с %@ notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. Вы можете установить просмотр уведомлений на экране блокировки в настройках. @@ -7203,6 +7290,10 @@ Repeat join request? Вы можете запустить чат через Настройки приложения или перезапустив приложение. No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. Вы можете включить Блокировку SimpleX через Настройки. @@ -7245,11 +7336,6 @@ Repeat connection request? Повторить запрос? 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. Пароль не сохранен на устройстве — Вы будете должны ввести его при каждом запуске чата. @@ -7270,11 +7356,23 @@ Repeat connection request? Вы вступили в эту группу. Устанавливается соединение с пригласившим членом группы. No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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 need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Чтобы включить отправку голосовых сообщений, разрешите их Вашему контакту. @@ -7390,13 +7488,6 @@ Repeat connection request? Ваши профили чата No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Ваш контакт должен быть в сети чтобы установить соединение. -Вы можете отменить соединение и удалить контакт (и попробовать позже с другой ссылкой). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Ваш контакт отправил файл, размер которого превышает максимальный размер (%@). @@ -7412,6 +7503,10 @@ You can cancel this connection and remove the contact (and try later with a new Ваши контакты сохранятся. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Текущие данные Вашего чата будет УДАЛЕНЫ и ЗАМЕНЕНЫ импортированными. @@ -7588,6 +7683,10 @@ SimpleX серверы не могут получить доступ к Ваше жирный No comment provided by engineer. + + call + No comment provided by engineer. + call error ошибка звонка @@ -7954,6 +8053,10 @@ SimpleX серверы не могут получить доступ к Ваше приглашение в группу %@ group name + + invite + No comment provided by engineer. + invited приглашен(а) @@ -8009,6 +8112,10 @@ SimpleX серверы не могут получить доступ к Ваше соединен(а) rcv group event chat item + + message + No comment provided by engineer. + message received получено сообщение @@ -8039,6 +8146,10 @@ SimpleX серверы не могут получить доступ к Ваше месяцев time unit + + mute + No comment provided by engineer. + never никогда @@ -8169,6 +8280,10 @@ SimpleX серверы не могут получить доступ к Ваше сохранено из %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec сек @@ -8240,8 +8355,8 @@ last received msg: %2$@ неизвестно connection info - - unknown relays + + unknown servers неизвестные серверы No comment provided by engineer. @@ -8250,6 +8365,10 @@ last received msg: %2$@ неизвестный статус No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected незащищённый @@ -8295,6 +8414,10 @@ last received msg: %2$@ через relay сервер No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) видеозвонок (не e2e зашифрованный) @@ -8542,10 +8665,6 @@ last received msg: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - No comment provided by engineer. - Error preparing file No comment provided by engineer. @@ -8570,10 +8689,6 @@ last received msg: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - No comment provided by engineer. - Keychain error No comment provided by engineer. @@ -8586,10 +8701,6 @@ last received msg: %2$@ No active profile No comment provided by engineer. - - No network connection - No comment provided by engineer. - Ok No comment provided by engineer. @@ -8614,8 +8725,12 @@ last received msg: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. @@ -8623,6 +8738,10 @@ last received msg: %2$@ Поделиться No comment provided by engineer. + + Slow network? + No comment provided by engineer. + Unknown database error: %@ No comment provided by engineer. @@ -8631,6 +8750,10 @@ last received msg: %2$@ Unsupported format No comment provided by engineer. + + Wait + No comment provided by engineer. + Wrong database passphrase No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff index 0735f1b288..6958c185e6 100644 --- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff +++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff @@ -370,6 +370,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -702,6 +707,10 @@ อนุญาตการโทรเฉพาะเมื่อผู้ติดต่อของคุณอนุญาตเท่านั้น. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. อนุญาตให้ข้อความที่หายไปเฉพาะในกรณีที่ผู้ติดต่อของคุณอนุญาตเท่านั้น. @@ -881,6 +890,10 @@ Archive and upload No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database No comment provided by engineer. @@ -1057,10 +1070,22 @@ โทร No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! ไม่สามารถเชิญผู้ติดต่อได้! @@ -1071,6 +1096,10 @@ ไม่สามารถเชิญผู้ติดต่อได้! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel ยกเลิก @@ -1177,6 +1206,10 @@ ลบฐานข้อมูลแชทแล้ว No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported นำฐานข้อมูลแชทเข้าแล้ว @@ -1311,6 +1344,10 @@ ยืนยันรหัสผ่าน No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades ยืนยันการอัพเกรดฐานข้อมูล @@ -1359,6 +1396,10 @@ Connect to desktop No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? No comment provided by engineer. @@ -1420,6 +1461,10 @@ This is your own one-time link! กำลังเชื่อมต่อกับเซิร์ฟเวอร์... (ข้อผิดพลาด: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop No comment provided by engineer. @@ -1429,6 +1474,10 @@ This is your own one-time link! การเชื่อมต่อ No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error การเชื่อมต่อผิดพลาด @@ -1475,6 +1524,10 @@ This is your own one-time link! ผู้ติดต่อรายนี้มีอยู่แล้ว No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: ผู้ติดต่อถูกซ่อน: @@ -1485,9 +1538,8 @@ This is your own one-time link! เชื่อมต่อกับผู้ติดต่อแล้ว notification - - Contact is not connected yet! - ผู้ติดต่อยังไม่ได้เชื่อมต่อ! + + Contact is deleted. No comment provided by engineer. @@ -1500,6 +1552,10 @@ This is your own one-time link! การกําหนดลักษณะการติดต่อ No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts ติดต่อ @@ -1515,6 +1571,14 @@ This is your own one-time link! ดำเนินการต่อ No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy คัดลอก @@ -1781,11 +1845,6 @@ This is your own one-time link! Delete %lld messages? No comment provided by engineer. - - Delete Contact - ลบผู้ติดต่อ - No comment provided by engineer. - Delete address ลบที่อยู่ @@ -1840,9 +1899,8 @@ This is your own one-time link! ลบผู้ติดต่อ No comment provided by engineer. - - Delete contact? -This cannot be undone! + + Delete contact? No comment provided by engineer. @@ -1934,11 +1992,6 @@ This cannot be undone! ลบฐานข้อมูลเก่า? No comment provided by engineer. - - Delete pending connection - ลบการเชื่อมต่อที่รอดำเนินการ - No comment provided by engineer. - Delete pending connection? ลบการเชื่อมต่อที่รอดำเนินการหรือไม่? @@ -1954,11 +2007,19 @@ This cannot be undone! ลบคิว server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? ลบโปรไฟล์ผู้ใช้? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted No comment provided by engineer. @@ -1973,6 +2034,10 @@ This cannot be undone! ลบที่: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors No comment provided by engineer. @@ -2033,6 +2098,10 @@ This cannot be undone! พัฒนา No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools เครื่องมือสำหรับนักพัฒนา @@ -2512,11 +2581,6 @@ This cannot be undone! เกิดข้อผิดพลาดในการลบการเชื่อมต่อ No comment provided by engineer. - - Error deleting contact - เกิดข้อผิดพลาดในการลบผู้ติดต่อ - No comment provided by engineer. - Error deleting database เกิดข้อผิดพลาดในการลบฐานข้อมูล @@ -2741,6 +2805,10 @@ This cannot be undone! แม้ในขณะที่ปิดใช้งานในการสนทนา No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving ออกโดยไม่บันทึก @@ -3503,6 +3571,10 @@ Error: %2$@ 3. การเชื่อมต่อถูกบุกรุก No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). ดูเหมือนว่าคุณได้เชื่อมต่อผ่านลิงก์นี้แล้ว หากไม่เป็นเช่นนั้น แสดงว่ามีข้อผิดพลาด (%@). @@ -3559,6 +3631,10 @@ This is your link for group %@! Keep No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. @@ -3729,6 +3805,10 @@ This is your link for group %@! สูงสุด 30 วินาที รับทันที No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium blur media @@ -3811,12 +3891,8 @@ This is your link for group %@! Message reception No comment provided by engineer. - - Message routing fallback - No comment provided by engineer. - - - Message routing mode + + Message servers No comment provided by engineer. @@ -3928,6 +4004,10 @@ This is your link for group %@! กลั่นกรอง chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at กลั่นกรองที่ @@ -3998,6 +4078,10 @@ This is your link for group %@! สถานะเครือข่าย No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode รหัสผ่านใหม่ @@ -4168,18 +4252,24 @@ This is your link for group %@! คลังฐานข้อมูลเก่า No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link ลิงก์คำเชิญแบบใช้ครั้งเดียว No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. จำเป็นต้องมีโฮสต์หัวหอมสำหรับการเชื่อมต่อ ต้องเปิดใช้งาน VPN สำหรับการเชื่อมต่อ No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. + + Onion hosts will be used when available. +Requires compatible VPN. จำเป็นต้องมีโฮสต์หัวหอมสำหรับการเชื่อมต่อ ต้องเปิดใช้งาน VPN สำหรับการเชื่อมต่อ No comment provided by engineer. @@ -4193,6 +4283,10 @@ This is your link for group %@! เฉพาะอุปกรณ์ไคลเอนต์เท่านั้นที่จัดเก็บโปรไฟล์ผู้ใช้ ผู้ติดต่อ กลุ่ม และข้อความที่ส่งด้วย **การเข้ารหัส encrypt แบบ 2 ชั้น** No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. เฉพาะเจ้าของกลุ่มเท่านั้นที่สามารถเปลี่ยนค่ากําหนดลักษณะกลุ่มได้ @@ -4411,6 +4505,10 @@ This is your link for group %@! Picture-in-picture calls No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. โปรดขอให้ผู้ติดต่อของคุณเปิดใช้งานการส่งข้อความเสียง @@ -4689,6 +4787,10 @@ Enable in *Network & servers* settings. ให้คะแนนแอป No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… ตอบสนอง… @@ -5004,11 +5106,6 @@ Enable in *Network & servers* settings. เปิดเผย chat item action - - Revert - เปลี่ยนกลับ - No comment provided by engineer. - Revoke ถอน @@ -5038,11 +5135,6 @@ Enable in *Network & servers* settings. SMP server No comment provided by engineer. - - SMP servers - เซิร์ฟเวอร์ SMP - No comment provided by engineer. - Safely receive files No comment provided by engineer. @@ -5071,6 +5163,10 @@ Enable in *Network & servers* settings. บันทึกและแจ้งให้สมาชิกในกลุ่มทราบ No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile บันทึกและอัปเดตโปรไฟล์กลุ่ม @@ -5264,11 +5360,6 @@ Enable in *Network & servers* settings. ส่งใบเสร็จรับการจัดส่งข้อความไปที่ No comment provided by engineer. - - Send direct message - ส่งข้อความโดยตรง - No comment provided by engineer. - Send direct message to connect No comment provided by engineer. @@ -5292,6 +5383,10 @@ Enable in *Network & servers* settings. ส่งข้อความสด No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. No comment provided by engineer. @@ -5711,11 +5806,19 @@ Enable in *Network & servers* settings. Soft blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. ข้อผิดพลาดที่ไม่ร้ายแรงบางอย่างเกิดขึ้นระหว่างการนำเข้า - คุณอาจดูรายละเอียดเพิ่มเติมได้ที่คอนโซล Chat No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody ใครบางคน @@ -5841,6 +5944,10 @@ Enable in *Network & servers* settings. การรับรองความถูกต้องของระบบ No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout หมดเวลาการเชื่อมต่อ TCP @@ -5898,11 +6005,6 @@ Enable in *Network & servers* settings. Tap to scan No comment provided by engineer. - - Tap to start a new chat - แตะเพื่อเริ่มแชทใหม่ - No comment provided by engineer. - Temporary file error No comment provided by engineer. @@ -6348,11 +6450,6 @@ To connect, please ask your contact to create another connection link and check อัปเดต No comment provided by engineer. - - Update .onion hosts setting? - อัปเดตการตั้งค่าโฮสต์ .onion ไหม? - No comment provided by engineer. - Update database passphrase อัปเดตรหัสผ่านของฐานข้อมูล @@ -6363,9 +6460,8 @@ To connect, please ask your contact to create another connection link and check อัปเดตการตั้งค่าเครือข่ายไหม? No comment provided by engineer. - - Update transport isolation mode? - อัปเดตโหมดการแยกการขนส่งไหม? + + Update settings? No comment provided by engineer. @@ -6373,11 +6469,6 @@ To connect, please ask your contact to create another connection link and check การอัปเดตการตั้งค่าจะเชื่อมต่อไคลเอนต์กับเซิร์ฟเวอร์ทั้งหมดอีกครั้ง No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - การอัปเดตการตั้งค่านี้จะเชื่อมต่อไคลเอนต์กับเซิร์ฟเวอร์ทั้งหมดอีกครั้ง - No comment provided by engineer. - Upgrade and open chat อัปเกรดและเปิดการแชท @@ -6466,6 +6557,10 @@ To connect, please ask your contact to create another connection link and check Use the app while in the call. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile โปรไฟล์ผู้ใช้ @@ -6475,11 +6570,6 @@ To connect, please ask your contact to create another connection link and check User selection No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - การใช้โฮสต์ .onion ต้องการผู้ให้บริการ VPN ที่เข้ากันได้ - No comment provided by engineer. - Using SimpleX Chat servers. กำลังใช้เซิร์ฟเวอร์ SimpleX Chat อยู่ @@ -6716,11 +6806,6 @@ To connect, please ask your contact to create another connection link and check XFTP server No comment provided by engineer. - - XFTP servers - เซิร์ฟเวอร์ XFTP - No comment provided by engineer. - You คุณ @@ -6831,6 +6916,10 @@ Repeat join request? ตอนนี้คุณสามารถส่งข้อความถึง %@ notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. คุณสามารถตั้งค่าแสดงตัวอย่างการแจ้งเตือนบนหน้าจอล็อคผ่านการตั้งค่า @@ -6856,6 +6945,10 @@ Repeat join request? คุณสามารถเริ่มแชทผ่านการตั้งค่าแอป / ฐานข้อมูล หรือโดยการรีสตาร์ทแอป No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. คุณสามารถเปิด SimpleX Lock ผ่านการตั้งค่า @@ -6894,11 +6987,6 @@ Repeat join request? Repeat connection request? 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. คุณต้องใส่รหัสผ่านทุกครั้งที่เริ่มแอป - รหัสผ่านไม่ได้จัดเก็บไว้ในอุปกรณ์ @@ -6918,11 +7006,23 @@ Repeat connection request? คุณเข้าร่วมกลุ่มนี้แล้ว กำลังเชื่อมต่อเพื่อเชิญสมาชิกกลุ่ม No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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 need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. คุณต้องอนุญาตให้ผู้ติดต่อของคุณส่งข้อความเสียงจึงจะสามารถส่งได้ @@ -7036,13 +7136,6 @@ Repeat connection request? โปรไฟล์แชทของคุณ No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - ผู้ติดต่อของคุณจะต้องออนไลน์เพื่อให้การเชื่อมต่อเสร็จสมบูรณ์ -คุณสามารถยกเลิกการเชื่อมต่อนี้และลบผู้ติดต่อออก (และลองใหม่ในภายหลังด้วยลิงก์ใหม่) - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). ผู้ติดต่อของคุณส่งไฟล์ที่ใหญ่กว่าขนาดสูงสุดที่รองรับในปัจจุบัน (%@) @@ -7058,6 +7151,10 @@ You can cancel this connection and remove the contact (and try later with a new ผู้ติดต่อของคุณจะยังคงเชื่อมต่ออยู่ No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. ฐานข้อมูลแชทปัจจุบันของคุณจะถูกลบและแทนที่ด้วยฐานข้อมูลที่นำเข้า @@ -7225,6 +7322,10 @@ SimpleX servers cannot see your profile. ตัวหนา No comment provided by engineer. + + call + No comment provided by engineer. + call error การโทรผิดพลาด @@ -7585,6 +7686,10 @@ SimpleX servers cannot see your profile. คำเชิญเข้าร่วมกลุ่ม %@ group name + + invite + No comment provided by engineer. + invited เชิญ @@ -7639,6 +7744,10 @@ SimpleX servers cannot see your profile. เชื่อมต่อสำเร็จ rcv group event chat item + + message + No comment provided by engineer. + message received ข้อความที่ได้รับ @@ -7669,6 +7778,10 @@ SimpleX servers cannot see your profile. เดือน time unit + + mute + No comment provided by engineer. + never ไม่เคย @@ -7793,6 +7906,10 @@ SimpleX servers cannot see your profile. saved from %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec วินาที @@ -7859,14 +7976,18 @@ last received msg: %2$@ ไม่ทราบ connection info - - unknown relays + + unknown servers No comment provided by engineer. unknown status No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected No comment provided by engineer. @@ -7909,6 +8030,10 @@ last received msg: %2$@ ผ่านรีเลย์ No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) การสนทนาทางวิดีโอ (ไม่ได้ encrypt จากต้นจนจบ) @@ -8151,10 +8276,6 @@ last received msg: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - No comment provided by engineer. - Error preparing file No comment provided by engineer. @@ -8179,10 +8300,6 @@ last received msg: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - No comment provided by engineer. - Keychain error No comment provided by engineer. @@ -8195,10 +8312,6 @@ last received msg: %2$@ No active profile No comment provided by engineer. - - No network connection - No comment provided by engineer. - Ok No comment provided by engineer. @@ -8223,14 +8336,22 @@ last received msg: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. Share No comment provided by engineer. + + Slow network? + No comment provided by engineer. + Unknown database error: %@ No comment provided by engineer. @@ -8239,6 +8360,10 @@ last received msg: %2$@ Unsupported format No comment provided by engineer. + + Wait + No comment provided by engineer. + Wrong database passphrase No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff index 2781891aa6..c79f051d2c 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -392,6 +392,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -738,6 +743,10 @@ Yalnızca irtibat kişiniz izin veriyorsa aramalara izin verin. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Eğer kişide izin verirse kaybolan mesajlara izin ver. @@ -926,6 +935,10 @@ Arşivle ve yükle No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database Veritabanı arşivleniyor @@ -1113,11 +1126,23 @@ Aramalar No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available Kamera mevcut değil No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Kişi davet edilemiyor! @@ -1128,6 +1153,10 @@ Kişiler davet edilemiyor! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel İptal et @@ -1237,6 +1266,10 @@ Sohbet veritabanı silindi No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported Sohbet veritabanı içe aktarıldı @@ -1375,6 +1408,10 @@ Parolayı onayla No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Veritabanı geliştirmelerini onayla @@ -1430,6 +1467,10 @@ Bilgisayara bağlan No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? Kendine mi bağlanacaksın? @@ -1501,6 +1542,10 @@ Bu senin kendi tek kullanımlık bağlantın! Sunucuya bağlanıyor…(hata:%@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Bilgisayara bağlanıyor @@ -1511,6 +1556,10 @@ Bu senin kendi tek kullanımlık bağlantın! Bağlantı No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Bağlantı hatası @@ -1558,6 +1607,10 @@ Bu senin kendi tek kullanımlık bağlantın! Kişi zaten mevcut No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Kişi gizli: @@ -1568,9 +1621,8 @@ Bu senin kendi tek kullanımlık bağlantın! Kişi bağlandı notification - - Contact is not connected yet! - Kişi şuan bağlanmadı! + + Contact is deleted. No comment provided by engineer. @@ -1583,6 +1635,10 @@ Bu senin kendi tek kullanımlık bağlantın! Kişi tercihleri No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Kişiler @@ -1598,6 +1654,14 @@ Bu senin kendi tek kullanımlık bağlantın! Devam et No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Kopyala @@ -1875,11 +1939,6 @@ Bu senin kendi tek kullanımlık bağlantın! %lld mesaj silinsin mi? No comment provided by engineer. - - Delete Contact - Kişiyi sil - No comment provided by engineer. - Delete address Adresi sil @@ -1935,11 +1994,8 @@ Bu senin kendi tek kullanımlık bağlantın! Kişiyi sil No comment provided by engineer. - - Delete contact? -This cannot be undone! - Kişi silinsin mi? -Bu geri alınamaz! + + Delete contact? No comment provided by engineer. @@ -2032,11 +2088,6 @@ Bu geri alınamaz! Eski veritabanı silinsin mi? No comment provided by engineer. - - Delete pending connection - Bekleyen bağlantıyı sil - No comment provided by engineer. - Delete pending connection? Bekleyen bağlantı silinsin mi? @@ -2052,11 +2103,19 @@ Bu geri alınamaz! Sırayı sil server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Kullanıcı profili silinsin mi? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted No comment provided by engineer. @@ -2071,6 +2130,10 @@ Bu geri alınamaz! %@ de silindi copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors No comment provided by engineer. @@ -2136,6 +2199,10 @@ Bu geri alınamaz! Geliştir No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Geliştirici araçları @@ -2640,11 +2707,6 @@ Bu geri alınamaz! Bağlantı silinirken hata oluştu No comment provided by engineer. - - Error deleting contact - Kişi silinirken hata oluştu - No comment provided by engineer. - Error deleting database Veritabanı silinirken hata oluştu @@ -2876,6 +2938,10 @@ Bu geri alınamaz! Konuşma sırasında devre dışı bırakılsa bile. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Kaydetmeden çık @@ -3675,6 +3741,10 @@ Hata: %2$@ 3. Bağlantı tehlikeye girmiştir. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Bu bağlantı üzerinden zaten bağlanmışsınız gibi görünüyor. Eğer durum böyle değilse, bir hata oluştu (%@). @@ -3737,6 +3807,10 @@ Bu senin grup için bağlantın %@! Tut No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop Bilgisayardan kullanmak için uygulamayı açık tut @@ -3912,6 +3986,10 @@ Bu senin grup için bağlantın %@! Maksimum 30 saniye, anında alındı. No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium blur media @@ -3996,14 +4074,8 @@ Bu senin grup için bağlantın %@! Message reception No comment provided by engineer. - - Message routing fallback - Mesaj yönlendirme yedeklemesi - No comment provided by engineer. - - - Message routing mode - Mesaj yönlendirme modu + + Message servers No comment provided by engineer. @@ -4127,6 +4199,10 @@ Bu senin grup için bağlantın %@! Yönet chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at de yönetildi @@ -4202,6 +4278,10 @@ Bu senin grup için bağlantın %@! Ağ durumu No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Yeni şifre @@ -4378,19 +4458,27 @@ Bu senin grup için bağlantın %@! Eski veritabanı arşivi No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Tek zamanlı bağlantı daveti No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Bağlantı için Onion ana bilgisayarları gerekecektir. VPN'nin etkinleştirilmesi gerekir. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Bağlantı için Onion ana bilgisayarları gerekecektir. +VPN'nin etkinleştirilmesi gerekir. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Onion ana bilgisayarları mevcutsa kullanılacaktır. VPN'nin etkinleştirilmesi gerekir. + + Onion hosts will be used when available. +Requires compatible VPN. + Onion ana bilgisayarları mevcutsa kullanılacaktır. +VPN'nin etkinleştirilmesi gerekir. No comment provided by engineer. @@ -4403,6 +4491,10 @@ Bu senin grup için bağlantın %@! Yalnızca istemci cihazlar kullanıcı profillerini, kişileri, grupları ve **2 katmanlı uçtan uca şifreleme** ile gönderilen mesajları depolar. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Grup tercihlerini yalnızca grup sahipleri değiştirebilir. @@ -4635,6 +4727,10 @@ Bu senin grup için bağlantın %@! Resim içinde resim aramaları No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Lütfen konuştuğunuz kişiden sesli mesaj göndermeyi etkinleştirmesini isteyin. @@ -4929,6 +5025,10 @@ Enable in *Network & servers* settings. Uygulamayı değerlendir No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Tepki ver… @@ -5255,11 +5355,6 @@ Enable in *Network & servers* settings. Göster chat item action - - Revert - Geri al - No comment provided by engineer. - Revoke İptal et @@ -5289,11 +5384,6 @@ Enable in *Network & servers* settings. SMP server No comment provided by engineer. - - SMP servers - SMP sunucuları - No comment provided by engineer. - Safely receive files Dosyaları güvenle alın @@ -5324,6 +5414,10 @@ Enable in *Network & servers* settings. Kaydet ve grup üyelerine bildir No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile Kaydet ve grup profilini güncelle @@ -5523,11 +5617,6 @@ Enable in *Network & servers* settings. Görüldü bilgilerini şuraya gönder No comment provided by engineer. - - Send direct message - Doğrudan mesaj gönder - No comment provided by engineer. - Send direct message to connect Bağlanmak için doğrudan mesaj gönder @@ -5552,6 +5641,10 @@ Enable in *Network & servers* settings. Canlı mesaj gönder No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. IP adresi korumalı olduğunda ve sizin veya hedef sunucunun özel yönlendirmeyi desteklemediği durumlarda mesajları doğrudan gönderin. @@ -5990,11 +6083,19 @@ Enable in *Network & servers* settings. Soft blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. İçe aktarma sırasında bazı ölümcül olmayan hatalar oluştu - daha fazla ayrıntı için Sohbet konsoluna bakabilirsiniz. No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody Biri @@ -6124,6 +6225,10 @@ Enable in *Network & servers* settings. Sistem yetkilendirilmesi No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout TCP bağlantı zaman aşımı @@ -6184,11 +6289,6 @@ Enable in *Network & servers* settings. Taramak için tıkla No comment provided by engineer. - - Tap to start a new chat - Yeni bir sohbet başlatmak için tıkla - No comment provided by engineer. - Temporary file error No comment provided by engineer. @@ -6657,11 +6757,6 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Güncelle No comment provided by engineer. - - Update .onion hosts setting? - .onion ana bilgisayarların ayarı güncellensin mi? - No comment provided by engineer. - Update database passphrase Veritabanı parolasını güncelle @@ -6672,9 +6767,8 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Bağlantı ayarları güncellensin mi? No comment provided by engineer. - - Update transport isolation mode? - Taşıma izolasyon modu güncellensin mi? + + Update settings? No comment provided by engineer. @@ -6682,11 +6776,6 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Ayarların güncellenmesi, istemciyi tüm sunuculara yeniden bağlayacaktır. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - Bu ayarın güncellenmesi, istemciyi tüm sunuculara yeniden bağlayacaktır. - No comment provided by engineer. - Upgrade and open chat Yükselt ve sohbeti aç @@ -6784,6 +6873,10 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Görüşme sırasında uygulamayı kullanın. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Kullanıcı profili @@ -6793,11 +6886,6 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste User selection No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - .onion ana bilgisayarlarını kullanmak için uyumlu VPN sağlayıcısı gerekir. - No comment provided by engineer. - Using SimpleX Chat servers. SimpleX Chat sunucuları kullanılıyor. @@ -7054,11 +7142,6 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste XFTP server No comment provided by engineer. - - XFTP servers - XFTP sunucuları - No comment provided by engineer. - You Sen @@ -7180,6 +7263,10 @@ Katılma isteği tekrarlansın mı? Artık %@ adresine mesaj gönderebilirsin notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. Kilit ekranı bildirim önizlemesini ayarlar üzerinden ayarlayabilirsiniz. @@ -7205,6 +7292,10 @@ Katılma isteği tekrarlansın mı? Sohbeti uygulamada Ayarlar / Veritabanı üzerinden veya uygulamayı yeniden başlatarak başlatabilirsiniz No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. SimpleX Kilidini Ayarlar üzerinden açabilirsiniz. @@ -7247,11 +7338,6 @@ Repeat connection request? Bağlantı isteği tekrarlansın mı? No comment provided by engineer. - - You have no chats - Hiç sohbetiniz yok - No comment provided by engineer. - You have to enter passphrase every time the app starts - it is not stored on the device. Uygulama her başladığında parola girmeniz gerekir - parola cihazınızda saklanmaz. @@ -7272,11 +7358,23 @@ Bağlantı isteği tekrarlansın mı? Bu gruba katıldınız. Davet eden grup üyesine bağlanılıyor. No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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. Sohbet veritabanınızın en son sürümünü SADECE bir cihazda kullanmalısınız, aksi takdirde bazı kişilerden daha fazla mesaj alamayabilirsiniz. No comment provided by engineer. + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Sesli mesaj gönderebilmeniz için kişinizin de sesli mesaj göndermesine izin vermeniz gerekir. @@ -7392,13 +7490,6 @@ Bağlantı isteği tekrarlansın mı? Sohbet profillerin No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Bağlantının tamamlanması için kişinizin çevrimiçi olması gerekir. -Bu bağlantıyı iptal edebilir ve kişiyi kaldırabilirsiniz (ve daha sonra yeni bir bağlantıyla deneyebilirsiniz). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Kişiniz şu anda desteklenen maksimum boyuttan (%@) daha büyük bir dosya gönderdi. @@ -7414,6 +7505,10 @@ Bu bağlantıyı iptal edebilir ve kişiyi kaldırabilirsiniz (ve daha sonra yen Kişileriniz bağlı kalacaktır. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Mevcut sohbet veritabanınız SİLİNECEK ve içe aktarılan veritabanıyla DEĞİŞTİRİLECEKTİR. @@ -7590,6 +7685,10 @@ SimpleX sunucuları profilinizi göremez. kalın No comment provided by engineer. + + call + No comment provided by engineer. + call error arama hatası @@ -7956,6 +8055,10 @@ SimpleX sunucuları profilinizi göremez. %@ grubuna davet group name + + invite + No comment provided by engineer. + invited davet edildi @@ -8011,6 +8114,10 @@ SimpleX sunucuları profilinizi göremez. bağlanıldı rcv group event chat item + + message + No comment provided by engineer. + message received mesaj alındı @@ -8041,6 +8148,10 @@ SimpleX sunucuları profilinizi göremez. aylar time unit + + mute + No comment provided by engineer. + never asla @@ -8171,6 +8282,10 @@ SimpleX sunucuları profilinizi göremez. %@ tarafından kaydedildi No comment provided by engineer. + + search + No comment provided by engineer. + sec sn @@ -8245,8 +8360,8 @@ son alınan msj: %2$@ bilinmeyen connection info - - unknown relays + + unknown servers bilinmeyen yönlendiriciler No comment provided by engineer. @@ -8255,6 +8370,10 @@ son alınan msj: %2$@ bilinmeyen durum No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected korumasız @@ -8300,6 +8419,10 @@ son alınan msj: %2$@ yönlendirici aracılığıyla No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) Görüntülü arama (şifrelenmiş değil) @@ -8547,10 +8670,6 @@ son alınan msj: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - No comment provided by engineer. - Error preparing file No comment provided by engineer. @@ -8575,10 +8694,6 @@ son alınan msj: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - No comment provided by engineer. - Keychain error No comment provided by engineer. @@ -8591,10 +8706,6 @@ son alınan msj: %2$@ No active profile No comment provided by engineer. - - No network connection - No comment provided by engineer. - Ok No comment provided by engineer. @@ -8619,14 +8730,22 @@ son alınan msj: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. Share No comment provided by engineer. + + Slow network? + No comment provided by engineer. + Unknown database error: %@ No comment provided by engineer. @@ -8635,6 +8754,10 @@ son alınan msj: %2$@ Unsupported format No comment provided by engineer. + + Wait + No comment provided by engineer. + Wrong database passphrase No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff index 3d95496a67..7e505910ac 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -392,6 +392,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -738,6 +743,10 @@ Дозволяйте дзвінки, тільки якщо ваш контакт дозволяє їх. No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. Дозволяйте зникати повідомленням, тільки якщо контакт дозволяє вам це робити. @@ -926,6 +935,10 @@ Архівування та завантаження No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database Архівування бази даних @@ -1113,11 +1126,23 @@ Дзвінки No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available Камера недоступна No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! Не вдається запросити контакт! @@ -1128,6 +1153,10 @@ Неможливо запросити контакти! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel Скасувати @@ -1237,6 +1266,10 @@ Видалено базу даних чату No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported Імпорт бази даних чату @@ -1375,6 +1408,10 @@ Підтвердити пароль No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades Підтвердити оновлення бази даних @@ -1430,6 +1467,10 @@ Підключення до комп'ютера No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? З'єднатися з самим собою? @@ -1501,6 +1542,10 @@ This is your own one-time link! Підключення до сервера... (помилка: %@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop Підключення до ПК @@ -1511,6 +1556,10 @@ This is your own one-time link! Підключення No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error Помилка підключення @@ -1558,6 +1607,10 @@ This is your own one-time link! Контакт вже існує No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: Контакт приховано: @@ -1568,9 +1621,8 @@ This is your own one-time link! Контакт підключений notification - - Contact is not connected yet! - Контакт ще не підключено! + + Contact is deleted. No comment provided by engineer. @@ -1583,6 +1635,10 @@ This is your own one-time link! Налаштування контактів No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts Контакти @@ -1598,6 +1654,14 @@ This is your own one-time link! Продовжуйте No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy Копіювати @@ -1875,11 +1939,6 @@ This is your own one-time link! Видалити %lld повідомлень? No comment provided by engineer. - - Delete Contact - Видалити контакт - No comment provided by engineer. - Delete address Видалити адресу @@ -1935,11 +1994,8 @@ This is your own one-time link! Видалити контакт No comment provided by engineer. - - Delete contact? -This cannot be undone! - Видалити контакт? -Це не можна скасувати! + + Delete contact? No comment provided by engineer. @@ -2032,11 +2088,6 @@ This cannot be undone! Видалити стару базу даних? No comment provided by engineer. - - Delete pending connection - Видалити очікуване з'єднання - No comment provided by engineer. - Delete pending connection? Видалити очікуване з'єднання? @@ -2052,11 +2103,19 @@ This cannot be undone! Видалити чергу server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? Видалити профіль користувача? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted No comment provided by engineer. @@ -2071,6 +2130,10 @@ This cannot be undone! Видалено за: %@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors No comment provided by engineer. @@ -2136,6 +2199,10 @@ This cannot be undone! Розробник No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools Інструменти для розробників @@ -2640,11 +2707,6 @@ This cannot be undone! Помилка видалення з'єднання No comment provided by engineer. - - Error deleting contact - Помилка видалення контакту - No comment provided by engineer. - Error deleting database Помилка видалення бази даних @@ -2876,6 +2938,10 @@ This cannot be undone! Навіть коли вимкнений у розмові. No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving Вихід без збереження @@ -3675,6 +3741,10 @@ Error: %2$@ 3. З'єднання було скомпрометовано. No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). Схоже, що ви вже підключені за цим посиланням. Якщо це не так, сталася помилка (%@). @@ -3737,6 +3807,10 @@ This is your link for group %@! Тримай No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop Тримайте додаток відкритим, щоб використовувати його з робочого столу @@ -3912,6 +3986,10 @@ This is your link for group %@! Максимум 30 секунд, отримується миттєво. No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium blur media @@ -3996,14 +4074,8 @@ This is your link for group %@! Message reception No comment provided by engineer. - - Message routing fallback - Запасний варіант маршрутизації повідомлень - No comment provided by engineer. - - - Message routing mode - Режим маршрутизації повідомлень + + Message servers No comment provided by engineer. @@ -4127,6 +4199,10 @@ This is your link for group %@! Модерується chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at Модерується на @@ -4202,6 +4278,10 @@ This is your link for group %@! Стан мережі No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode Новий пароль @@ -4378,19 +4458,27 @@ This is your link for group %@! Старий архів бази даних No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link Посилання на одноразове запрошення No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. - Для підключення будуть потрібні хости onion. Потрібно увімкнути VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. + Для підключення будуть потрібні хости onion. +Потрібно увімкнути VPN. No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. - Onion хости будуть використовуватися, коли вони будуть доступні. Потрібно увімкнути VPN. + + Onion hosts will be used when available. +Requires compatible VPN. + Onion хости будуть використовуватися, коли вони будуть доступні. +Потрібно увімкнути VPN. No comment provided by engineer. @@ -4403,6 +4491,10 @@ This is your link for group %@! Тільки клієнтські пристрої зберігають профілі користувачів, контакти, групи та повідомлення, надіслані за допомогою **2-шарового наскрізного шифрування**. No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. Тільки власники груп можуть змінювати налаштування групи. @@ -4635,6 +4727,10 @@ This is your link for group %@! Дзвінки "картинка в картинці No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. Будь ласка, попросіть вашого контакту увімкнути відправку голосових повідомлень. @@ -4929,6 +5025,10 @@ Enable in *Network & servers* settings. Оцініть додаток No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… Реагуй… @@ -5255,11 +5355,6 @@ Enable in *Network & servers* settings. Показувати chat item action - - Revert - Повернутися - No comment provided by engineer. - Revoke Відкликати @@ -5289,11 +5384,6 @@ Enable in *Network & servers* settings. SMP server No comment provided by engineer. - - SMP servers - Сервери SMP - No comment provided by engineer. - Safely receive files Безпечне отримання файлів @@ -5324,6 +5414,10 @@ Enable in *Network & servers* settings. Зберегти та повідомити учасників групи No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile Збереження та оновлення профілю групи @@ -5523,11 +5617,6 @@ Enable in *Network & servers* settings. Надсилання звітів про доставку No comment provided by engineer. - - Send direct message - Надішліть пряме повідомлення - No comment provided by engineer. - Send direct message to connect Надішліть пряме повідомлення, щоб підключитися @@ -5552,6 +5641,10 @@ Enable in *Network & servers* settings. Надіслати живе повідомлення No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. Надсилайте повідомлення напряму, якщо IP-адреса захищена, а ваш сервер або сервер призначення не підтримує приватну маршрутизацію. @@ -5990,11 +6083,19 @@ Enable in *Network & servers* settings. Soft blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. Під час імпорту виникли деякі нефатальні помилки – ви можете переглянути консоль чату, щоб дізнатися більше. No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody Хтось @@ -6124,6 +6225,10 @@ Enable in *Network & servers* settings. Автентифікація системи No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout Тайм-аут TCP-з'єднання @@ -6184,11 +6289,6 @@ Enable in *Network & servers* settings. Натисніть, щоб сканувати No comment provided by engineer. - - Tap to start a new chat - Натисніть, щоб почати новий чат - No comment provided by engineer. - Temporary file error No comment provided by engineer. @@ -6657,11 +6757,6 @@ To connect, please ask your contact to create another connection link and check Оновлення No comment provided by engineer. - - Update .onion hosts setting? - Оновити налаштування хостів .onion? - No comment provided by engineer. - Update database passphrase Оновити парольну фразу бази даних @@ -6672,9 +6767,8 @@ To connect, please ask your contact to create another connection link and check Оновити налаштування мережі? No comment provided by engineer. - - Update transport isolation mode? - Оновити режим транспортної ізоляції? + + Update settings? No comment provided by engineer. @@ -6682,11 +6776,6 @@ To connect, please ask your contact to create another connection link and check Оновлення налаштувань призведе до перепідключення клієнта до всіх серверів. No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - Оновлення цього параметра призведе до перепідключення клієнта до всіх серверів. - No comment provided by engineer. - Upgrade and open chat Оновлення та відкритий чат @@ -6784,6 +6873,10 @@ To connect, please ask your contact to create another connection link and check Використовуйте додаток під час розмови. No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile Профіль користувача @@ -6793,11 +6886,6 @@ To connect, please ask your contact to create another connection link and check User selection No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - Для використання хостів .onion потрібен сумісний VPN-провайдер. - No comment provided by engineer. - Using SimpleX Chat servers. Використання серверів SimpleX Chat. @@ -7054,11 +7142,6 @@ To connect, please ask your contact to create another connection link and check XFTP server No comment provided by engineer. - - XFTP servers - Сервери XFTP - No comment provided by engineer. - You Ти @@ -7180,6 +7263,10 @@ Repeat join request? Тепер ви можете надсилати повідомлення на адресу %@ notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. Ви можете налаштувати попередній перегляд сповіщень на екрані блокування за допомогою налаштувань. @@ -7205,6 +7292,10 @@ Repeat join request? Запустити чат можна через Налаштування програми / База даних або перезапустивши програму No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. Увімкнути SimpleX Lock можна в Налаштуваннях. @@ -7247,11 +7338,6 @@ Repeat connection request? Повторити запит на підключення? 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. Вам доведеться вводити парольну фразу щоразу під час запуску програми - вона не зберігається на пристрої. @@ -7272,11 +7358,23 @@ Repeat connection request? Ви приєдналися до цієї групи. Підключення до запрошеного учасника групи. No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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 need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. Щоб мати змогу надсилати голосові повідомлення, вам потрібно дозволити контакту надсилати їх. @@ -7392,13 +7490,6 @@ Repeat connection request? Ваші профілі чату No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - Для завершення з'єднання ваш контакт має бути онлайн. -Ви можете скасувати це з'єднання і видалити контакт (і спробувати пізніше з новим посиланням). - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). Ваш контакт надіслав файл, розмір якого перевищує підтримуваний на цей момент максимальний розмір (%@). @@ -7414,6 +7505,10 @@ You can cancel this connection and remove the contact (and try later with a new Ваші контакти залишаться на зв'язку. No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. Ваша поточна база даних чату буде ВИДАЛЕНА і ЗАМІНЕНА імпортованою. @@ -7590,6 +7685,10 @@ SimpleX servers cannot see your profile. жирний No comment provided by engineer. + + call + No comment provided by engineer. + call error помилка дзвінка @@ -7956,6 +8055,10 @@ SimpleX servers cannot see your profile. запрошення до групи %@ group name + + invite + No comment provided by engineer. + invited запрошені @@ -8011,6 +8114,10 @@ SimpleX servers cannot see your profile. з'єднаний rcv group event chat item + + message + No comment provided by engineer. + message received повідомлення отримано @@ -8041,6 +8148,10 @@ SimpleX servers cannot see your profile. місяців time unit + + mute + No comment provided by engineer. + never ніколи @@ -8171,6 +8282,10 @@ SimpleX servers cannot see your profile. збережено з %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec сек @@ -8245,8 +8360,8 @@ last received msg: %2$@ невідомий connection info - - unknown relays + + unknown servers невідомі реле No comment provided by engineer. @@ -8255,6 +8370,10 @@ last received msg: %2$@ невідомий статус No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected незахищені @@ -8300,6 +8419,10 @@ last received msg: %2$@ за допомогою ретранслятора No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) відеодзвінок (без шифрування e2e) @@ -8547,10 +8670,6 @@ last received msg: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - No comment provided by engineer. - Error preparing file No comment provided by engineer. @@ -8575,10 +8694,6 @@ last received msg: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - No comment provided by engineer. - Keychain error No comment provided by engineer. @@ -8591,10 +8706,6 @@ last received msg: %2$@ No active profile No comment provided by engineer. - - No network connection - No comment provided by engineer. - Ok No comment provided by engineer. @@ -8619,14 +8730,22 @@ last received msg: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. Share No comment provided by engineer. + + Slow network? + No comment provided by engineer. + Unknown database error: %@ No comment provided by engineer. @@ -8635,6 +8754,10 @@ last received msg: %2$@ Unsupported format No comment provided by engineer. + + Wait + No comment provided by engineer. + Wrong database passphrase No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff index 097de15cb3..0dd69443f8 100644 --- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff @@ -381,6 +381,11 @@ , No comment provided by engineer. + + - Search contacts when starting chat. +- Archive contacts to chat later. + No comment provided by engineer. + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). @@ -725,6 +730,10 @@ 仅当您的联系人允许时才允许呼叫。 No comment provided by engineer. + + Allow calls? + No comment provided by engineer. + Allow disappearing messages only if your contact allows it to you. 仅当您的联系人允许时才允许限时消息。 @@ -911,6 +920,10 @@ 存档和上传 No comment provided by engineer. + + Archived contacts + No comment provided by engineer. + Archiving database 正在存档数据库 @@ -1098,11 +1111,23 @@ 通话 No comment provided by engineer. + + Calls prohibited! + No comment provided by engineer. + Camera not available 相机不可用 No comment provided by engineer. + + Can't call contact + No comment provided by engineer. + + + Can't call member + No comment provided by engineer. + Can't invite contact! 无法邀请联系人! @@ -1113,6 +1138,10 @@ 无法邀请联系人! No comment provided by engineer. + + Can't message member + No comment provided by engineer. + Cancel 取消 @@ -1221,6 +1250,10 @@ 聊天数据库已删除 No comment provided by engineer. + + Chat database exported + No comment provided by engineer. + Chat database imported 聊天数据库已导入 @@ -1358,6 +1391,10 @@ 确认密码 No comment provided by engineer. + + Confirm contact deletion? + No comment provided by engineer. + Confirm database upgrades 确认数据库升级 @@ -1412,6 +1449,10 @@ 连接到桌面 No comment provided by engineer. + + Connect to your friends faster + No comment provided by engineer. + Connect to yourself? 连接到你自己? @@ -1477,6 +1518,10 @@ This is your own one-time link! 连接服务器中……(错误:%@) No comment provided by engineer. + + Connecting to contact, please wait or check later! + No comment provided by engineer. + Connecting to desktop 正连接到桌面 @@ -1487,6 +1532,10 @@ This is your own one-time link! 连接 No comment provided by engineer. + + Connection and servers status. + No comment provided by engineer. + Connection error 连接错误 @@ -1534,6 +1583,10 @@ This is your own one-time link! 联系人已存在 No comment provided by engineer. + + Contact deleted! + No comment provided by engineer. + Contact hidden: 联系人已隐藏: @@ -1544,9 +1597,8 @@ This is your own one-time link! 联系已连接 notification - - Contact is not connected yet! - 联系人尚未连接! + + Contact is deleted. No comment provided by engineer. @@ -1559,6 +1611,10 @@ This is your own one-time link! 联系人偏好设置 No comment provided by engineer. + + Contact will be deleted - this cannot be undone! + No comment provided by engineer. + Contacts 联系人 @@ -1574,6 +1630,14 @@ This is your own one-time link! 继续 No comment provided by engineer. + + Control your network + No comment provided by engineer. + + + Conversation deleted! + No comment provided by engineer. + Copy 复制 @@ -1847,11 +1911,6 @@ This is your own one-time link! Delete %lld messages? No comment provided by engineer. - - Delete Contact - 删除联系人 - No comment provided by engineer. - Delete address 删除地址 @@ -1907,9 +1966,8 @@ This is your own one-time link! 删除联系人 No comment provided by engineer. - - Delete contact? -This cannot be undone! + + Delete contact? No comment provided by engineer. @@ -2002,11 +2060,6 @@ This cannot be undone! 删除旧数据库吗? No comment provided by engineer. - - Delete pending connection - 删除挂起连接 - No comment provided by engineer. - Delete pending connection? 删除待定连接? @@ -2022,11 +2075,19 @@ This cannot be undone! 删除队列 server test step + + Delete up to 20 messages at once. + No comment provided by engineer. + Delete user profile? 删除用户资料? No comment provided by engineer. + + Delete without notification + No comment provided by engineer. + Deleted No comment provided by engineer. @@ -2041,6 +2102,10 @@ This cannot be undone! 已删除于:%@ copied message info + + Deleted chats + No comment provided by engineer. + Deletion errors No comment provided by engineer. @@ -2104,6 +2169,10 @@ This cannot be undone! 开发 No comment provided by engineer. + + Developer options + No comment provided by engineer. + Developer tools 开发者工具 @@ -2603,11 +2672,6 @@ This cannot be undone! 删除连接错误 No comment provided by engineer. - - Error deleting contact - 删除联系人错误 - No comment provided by engineer. - Error deleting database 删除数据库错误 @@ -2837,6 +2901,10 @@ This cannot be undone! 即使在对话中被禁用。 No comment provided by engineer. + + Even when they are offline. + No comment provided by engineer. + Exit without saving 退出而不保存 @@ -3628,6 +3696,10 @@ Error: %2$@ 3.连接被破坏。 No comment provided by engineer. + + It protects your IP address and connections. + 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 (%@). 您似乎已经通过此链接连接。如果不是这样,则有一个错误 (%@)。 @@ -3687,6 +3759,10 @@ This is your link for group %@! 保留 No comment provided by engineer. + + Keep conversation + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. @@ -3861,6 +3937,10 @@ This is your link for group %@! 最长30秒,立即接收。 No comment provided by engineer. + + Media & file servers + No comment provided by engineer. + Medium blur media @@ -3943,12 +4023,8 @@ This is your link for group %@! Message reception No comment provided by engineer. - - Message routing fallback - No comment provided by engineer. - - - Message routing mode + + Message servers No comment provided by engineer. @@ -4069,6 +4145,10 @@ This is your link for group %@! 管理员移除 chat item action + + Moderate like a pro ✋ + No comment provided by engineer. + Moderated at 已被管理员移除于 @@ -4143,6 +4223,10 @@ This is your link for group %@! 网络状态 No comment provided by engineer. + + New Chat + No comment provided by engineer. + New Passcode 新密码 @@ -4319,18 +4403,24 @@ This is your link for group %@! 旧数据库存档 No comment provided by engineer. + + One-hand UI + No comment provided by engineer. + One-time invitation link 一次性邀请链接 No comment provided by engineer. - - Onion hosts will be required for connection. Requires enabling VPN. + + Onion hosts will be **required** for connection. +Requires compatible VPN. Onion 主机将用于连接。需要启用 VPN。 No comment provided by engineer. - - Onion hosts will be used when available. Requires enabling VPN. + + Onion hosts will be used when available. +Requires compatible VPN. 当可用时,将使用 Onion 主机。需要启用 VPN。 No comment provided by engineer. @@ -4344,6 +4434,10 @@ This is your link for group %@! 只有客户端设备存储用户资料、联系人、群组和**双层端到端加密**发送的消息。 No comment provided by engineer. + + Only delete conversation + No comment provided by engineer. + Only group owners can change group preferences. 只有群主可以改变群组偏好设置。 @@ -4573,6 +4667,10 @@ This is your link for group %@! 画中画通话 No comment provided by engineer. + + Please ask your contact to enable calls. + No comment provided by engineer. + Please ask your contact to enable sending voice messages. 请让您的联系人启用发送语音消息。 @@ -4856,6 +4954,10 @@ Enable in *Network & servers* settings. 评价此应用程序 No comment provided by engineer. + + Reachable chat toolbar 👋 + No comment provided by engineer. + React… 回应… @@ -5181,11 +5283,6 @@ Enable in *Network & servers* settings. 揭示 chat item action - - Revert - 恢复 - No comment provided by engineer. - Revoke 撤销 @@ -5215,11 +5312,6 @@ Enable in *Network & servers* settings. SMP server No comment provided by engineer. - - SMP servers - SMP 服务器 - No comment provided by engineer. - Safely receive files No comment provided by engineer. @@ -5249,6 +5341,10 @@ Enable in *Network & servers* settings. 保存并通知群组成员 No comment provided by engineer. + + Save and reconnect + No comment provided by engineer. + Save and update group profile 保存和更新组配置文件 @@ -5448,11 +5544,6 @@ Enable in *Network & servers* settings. 将送达回执发送给 No comment provided by engineer. - - Send direct message - 发送私信 - No comment provided by engineer. - Send direct message to connect 发送私信来连接 @@ -5477,6 +5568,10 @@ Enable in *Network & servers* settings. 发送实时消息 No comment provided by engineer. + + Send message to enable calls. + No comment provided by engineer. + Send messages directly when IP address is protected and your or destination server does not support private routing. No comment provided by engineer. @@ -5909,11 +6004,19 @@ Enable in *Network & servers* settings. Soft blur media + + Some file(s) were not exported: + No comment provided by engineer. + Some non-fatal errors occurred during import - you may see Chat console for more details. 导入过程中发生了一些非致命错误——您可以查看聊天控制台了解更多详细信息。 No comment provided by engineer. + + Some non-fatal errors occurred during import: + No comment provided by engineer. + Somebody 某人 @@ -6043,6 +6146,10 @@ Enable in *Network & servers* settings. 系统验证 No comment provided by engineer. + + TCP connection + No comment provided by engineer. + TCP connection timeout TCP 连接超时 @@ -6103,11 +6210,6 @@ Enable in *Network & servers* settings. 轻按扫描 No comment provided by engineer. - - Tap to start a new chat - 点击开始一个新聊天 - No comment provided by engineer. - Temporary file error No comment provided by engineer. @@ -6572,11 +6674,6 @@ To connect, please ask your contact to create another connection link and check 更新 No comment provided by engineer. - - Update .onion hosts setting? - 更新 .onion 主机设置? - No comment provided by engineer. - Update database passphrase 更新数据库密码 @@ -6587,9 +6684,8 @@ To connect, please ask your contact to create another connection link and check 更新网络设置? No comment provided by engineer. - - Update transport isolation mode? - 更新传输隔离模式? + + Update settings? No comment provided by engineer. @@ -6597,11 +6693,6 @@ To connect, please ask your contact to create another connection link and check 更新设置会将客户端重新连接到所有服务器。 No comment provided by engineer. - - Updating this setting will re-connect the client to all servers. - 更新此设置将重新连接客户端到所有服务器。 - No comment provided by engineer. - Upgrade and open chat 升级并打开聊天 @@ -6696,6 +6787,10 @@ To connect, please ask your contact to create another connection link and check 通话时使用本应用 No comment provided by engineer. + + Use the app with one hand. + No comment provided by engineer. + User profile 用户资料 @@ -6705,11 +6800,6 @@ To connect, please ask your contact to create another connection link and check User selection No comment provided by engineer. - - Using .onion hosts requires compatible VPN provider. - 使用 .onion 主机需要兼容的 VPN 提供商。 - No comment provided by engineer. - Using SimpleX Chat servers. 使用 SimpleX Chat 服务器。 @@ -6962,11 +7052,6 @@ To connect, please ask your contact to create another connection link and check XFTP server No comment provided by engineer. - - XFTP servers - XFTP 服务器 - No comment provided by engineer. - You @@ -7081,6 +7166,10 @@ Repeat join request? 您现在可以给 %@ 发送消息 notification body + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + You can set lock screen notification preview via settings. 您可以通过设置来设置锁屏通知预览。 @@ -7106,6 +7195,10 @@ Repeat join request? 您可以通过应用程序设置/数据库或重新启动应用程序开始聊天 No comment provided by engineer. + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + You can turn on SimpleX Lock via Settings. 您可以通过设置开启 SimpleX 锁定。 @@ -7146,11 +7239,6 @@ Repeat join request? Repeat connection request? 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. 您必须在每次应用程序启动时输入密码——它不存储在设备上。 @@ -7171,11 +7259,23 @@ Repeat connection request? 你加入了这个群组。连接到邀请组成员。 No comment provided by engineer. + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + 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 need to allow your contact to call to be able to call them. + No comment provided by engineer. + You need to allow your contact to send voice messages to be able to send them. 您需要允许您的联系人发送语音消息,以便您能够发送语音消息。 @@ -7290,13 +7390,6 @@ Repeat connection request? 您的聊天资料 No comment provided by engineer. - - Your contact needs to be online for the connection to complete. -You can cancel this connection and remove the contact (and try later with a new link). - 您的联系人需要在线才能完成连接。 -您可以取消此连接并删除联系人(然后尝试使用新链接)。 - No comment provided by engineer. - Your contact sent a file that is larger than currently supported maximum size (%@). 您的联系人发送的文件大于当前支持的最大大小 (%@)。 @@ -7312,6 +7405,10 @@ You can cancel this connection and remove the contact (and try later with a new 与您的联系人保持连接。 No comment provided by engineer. + + Your contacts your way + No comment provided by engineer. + Your current chat database will be DELETED and REPLACED with the imported one. 您当前的聊天数据库将被删除并替换为导入的数据库。 @@ -7486,6 +7583,10 @@ SimpleX 服务器无法看到您的资料。 加粗 No comment provided by engineer. + + call + No comment provided by engineer. + call error 通话错误 @@ -7851,6 +7952,10 @@ SimpleX 服务器无法看到您的资料。 邀请您加入群组 %@ group name + + invite + No comment provided by engineer. + invited 已邀请 @@ -7905,6 +8010,10 @@ SimpleX 服务器无法看到您的资料。 已连接 rcv group event chat item + + message + No comment provided by engineer. + message received 消息已收到 @@ -7935,6 +8044,10 @@ SimpleX 服务器无法看到您的资料。 time unit + + mute + No comment provided by engineer. + never 从不 @@ -8064,6 +8177,10 @@ SimpleX 服务器无法看到您的资料。 saved from %@ No comment provided by engineer. + + search + No comment provided by engineer. + sec @@ -8134,8 +8251,8 @@ last received msg: %2$@ 未知 connection info - - unknown relays + + unknown servers No comment provided by engineer. @@ -8143,6 +8260,10 @@ last received msg: %2$@ 未知状态 No comment provided by engineer. + + unmute + No comment provided by engineer. + unprotected No comment provided by engineer. @@ -8186,6 +8307,10 @@ last received msg: %2$@ 通过中继 No comment provided by engineer. + + video + No comment provided by engineer. + video call (not e2e encrypted) 视频通话(非端到端加密) @@ -8429,10 +8554,6 @@ last received msg: %2$@ Database upgrade required No comment provided by engineer. - - Dismiss Sheet - No comment provided by engineer. - Error preparing file No comment provided by engineer. @@ -8457,10 +8578,6 @@ last received msg: %2$@ Invalid migration confirmation No comment provided by engineer. - - Keep Trying - No comment provided by engineer. - Keychain error No comment provided by engineer. @@ -8473,10 +8590,6 @@ last received msg: %2$@ No active profile No comment provided by engineer. - - No network connection - No comment provided by engineer. - Ok No comment provided by engineer. @@ -8501,14 +8614,22 @@ last received msg: %2$@ Selected chat preferences prohibit this message. No comment provided by engineer. - - Sending File + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… No comment provided by engineer. Share No comment provided by engineer. + + Slow network? + No comment provided by engineer. + Unknown database error: %@ No comment provided by engineer. @@ -8517,6 +8638,10 @@ last received msg: %2$@ Unsupported format No comment provided by engineer. + + Wait + No comment provided by engineer. + Wrong database passphrase No comment provided by engineer. diff --git a/apps/ios/SimpleX SE/ShareModel.swift b/apps/ios/SimpleX SE/ShareModel.swift index 0297aa6557..f591de104f 100644 --- a/apps/ios/SimpleX SE/ShareModel.swift +++ b/apps/ios/SimpleX SE/ShareModel.swift @@ -29,6 +29,7 @@ class ShareModel: ObservableObject { @Published var errorAlert: ErrorAlert? @Published var hasSimplexLink = false @Published var alertRequiresPassword = false + var networkTimeout = CFAbsoluteTimeGetCurrent() enum BottomBar { case sendButton @@ -148,7 +149,7 @@ class ShareModel: ObservableObject { if selected.chatInfo.chatType == .local { completion() } else { - await MainActor.run { self.bottomBar = .loadingBar(progress: .zero) } + await MainActor.run { self.bottomBar = .loadingBar(progress: 0) } if let e = await handleEvents( isGroupChat: ci.chatInfo.chatType == .group, isWithoutFile: sharedContent.cryptoFile == nil, @@ -290,14 +291,13 @@ class ShareModel: ObservableObject { CompletionHandler.isEventLoopEnabled = true let ch = CompletionHandler() if isWithoutFile { await ch.completeFile() } - var networkTimeout = CFAbsoluteTimeGetCurrent() + networkTimeout = CFAbsoluteTimeGetCurrent() while await ch.isRunning { if CFAbsoluteTimeGetCurrent() - networkTimeout > 30 { - networkTimeout = CFAbsoluteTimeGetCurrent() await MainActor.run { - self.errorAlert = ErrorAlert(title: "No network connection") { - Button("Keep Trying", role: .cancel) { } - Button("Dismiss Sheet", role: .destructive) { self.completion() } + self.errorAlert = ErrorAlert(title: "Slow network?", message: "Sending a message takes longer than expected.") { + Button("Wait", role: .cancel) { self.networkTimeout = CFAbsoluteTimeGetCurrent() } + Button("Cancel", role: .destructive) { self.completion() } } } } diff --git a/apps/ios/SimpleX SE/ShareView.swift b/apps/ios/SimpleX SE/ShareView.swift index dcdeae2b82..51a2f1f3a4 100644 --- a/apps/ios/SimpleX SE/ShareView.swift +++ b/apps/ios/SimpleX SE/ShareView.swift @@ -85,7 +85,7 @@ struct ShareView: View { } private func compose(isLoading: Bool) -> some View { - VStack(spacing: .zero) { + VStack(spacing: 0) { Divider() if let content = model.sharedContent { itemPreview(content) @@ -179,7 +179,7 @@ struct ShareView: View { private func loadingBar(progress: Double) -> some View { VStack { - Text("Sending File") + Text("Sending message…") ProgressView(value: progress) } .padding() diff --git a/apps/ios/SimpleX SE/de.lproj/InfoPlist.strings b/apps/ios/SimpleX SE/de.lproj/InfoPlist.strings index 388ac01f7f..48f774742e 100644 --- a/apps/ios/SimpleX SE/de.lproj/InfoPlist.strings +++ b/apps/ios/SimpleX SE/de.lproj/InfoPlist.strings @@ -1,7 +1,9 @@ -/* - InfoPlist.strings - SimpleX +/* Bundle display name */ +"CFBundleDisplayName" = "SimpleX SE"; + +/* Bundle name */ +"CFBundleName" = "SimpleX SE"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 SimpleX Chat. Alle Rechte vorbehalten."; - Created by EP on 30/07/2024. - Copyright © 2024 SimpleX Chat. All rights reserved. -*/ diff --git a/apps/ios/SimpleX SE/de.lproj/Localizable.strings b/apps/ios/SimpleX SE/de.lproj/Localizable.strings index 5ef592ec70..6b905d3772 100644 --- a/apps/ios/SimpleX SE/de.lproj/Localizable.strings +++ b/apps/ios/SimpleX SE/de.lproj/Localizable.strings @@ -1,7 +1,111 @@ -/* - Localizable.strings - SimpleX +/* No comment provided by engineer. */ +"%@" = "%@"; + +/* No comment provided by engineer. */ +"App is locked!" = "Die App ist gesperrt!"; + +/* No comment provided by engineer. */ +"Cancel" = "Abbrechen"; + +/* No comment provided by engineer. */ +"Cannot access keychain to save database password" = "Es ist nicht möglich, auf den Schlüsselbund zuzugreifen, um das Datenbankpasswort zu speichern"; + +/* No comment provided by engineer. */ +"Cannot forward message" = "Nachricht kann nicht weitergeleitet werden"; + +/* No comment provided by engineer. */ +"Comment" = "Kommentieren"; + +/* No comment provided by engineer. */ +"Currently maximum supported file size is %@." = "Die maximale erlaubte Dateigröße beträgt aktuell %@."; + +/* No comment provided by engineer. */ +"Database downgrade required" = "Datenbank-Herabstufung erforderlich"; + +/* No comment provided by engineer. */ +"Database encrypted!" = "Datenbank verschlüsselt!"; + +/* No comment provided by engineer. */ +"Database error" = "Datenbankfehler"; + +/* No comment provided by engineer. */ +"Database passphrase is different from saved in the keychain." = "Das Datenbank-Passwort unterscheidet sich vom im Schlüsselbund gespeicherten."; + +/* No comment provided by engineer. */ +"Database passphrase is required to open chat." = "Ein Datenbank-Passwort ist erforderlich, um den Chat zu öffnen."; + +/* No comment provided by engineer. */ +"Database upgrade required" = "Datenbank-Aktualisierung erforderlich"; + +/* No comment provided by engineer. */ +"Error preparing file" = "Fehler beim Vorbereiten der Datei"; + +/* No comment provided by engineer. */ +"Error preparing message" = "Fehler beim Vorbereiten der Nachricht"; + +/* No comment provided by engineer. */ +"Error: %@" = "Fehler: %@"; + +/* No comment provided by engineer. */ +"File error" = "Dateifehler"; + +/* No comment provided by engineer. */ +"Incompatible database version" = "Datenbank-Version nicht kompatibel"; + +/* No comment provided by engineer. */ +"Invalid migration confirmation" = "Migrations-Bestätigung ungültig"; + +/* No comment provided by engineer. */ +"Keychain error" = "Schlüsselbund-Fehler"; + +/* No comment provided by engineer. */ +"Large file!" = "Große Datei!"; + +/* No comment provided by engineer. */ +"No active profile" = "Kein aktives Profil"; + +/* No comment provided by engineer. */ +"Ok" = "OK"; + +/* No comment provided by engineer. */ +"Open the app to downgrade the database." = "Öffne die App, um die Datenbank herabzustufen."; + +/* No comment provided by engineer. */ +"Open the app to upgrade the database." = "Öffne die App, um die Datenbank zu aktualisieren."; + +/* No comment provided by engineer. */ +"Passphrase" = "Passwort"; + +/* No comment provided by engineer. */ +"Please create a profile in the SimpleX app" = "Bitte erstelle ein Profil in der SimpleX-App"; + +/* No comment provided by engineer. */ +"Selected chat preferences prohibit this message." = "Diese Nachricht ist wegen der gewählten Chat-Einstellungen nicht erlaubt."; + +/* No comment provided by engineer. */ +"Sending a message takes longer than expected." = "Das Senden einer Nachricht dauert länger als erwartet."; + +/* No comment provided by engineer. */ +"Sending message…" = "Nachricht wird gesendet…"; + +/* No comment provided by engineer. */ +"Share" = "Teilen"; + +/* No comment provided by engineer. */ +"Slow network?" = "Langsames Netzwerk?"; + +/* No comment provided by engineer. */ +"Unknown database error: %@" = "Unbekannter Datenbankfehler: %@"; + +/* No comment provided by engineer. */ +"Unsupported format" = "Nicht unterstütztes Format"; + +/* No comment provided by engineer. */ +"Wait" = "Warten"; + +/* No comment provided by engineer. */ +"Wrong database passphrase" = "Falsches Datenbank-Passwort"; + +/* No comment provided by engineer. */ +"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "Du kannst das Teilen in den Einstellungen zu Datenschutz & Sicherheit bzw. SimpleX-Sperre erlauben."; - Created by EP on 30/07/2024. - Copyright © 2024 SimpleX Chat. All rights reserved. -*/ diff --git a/apps/ios/SimpleX SE/fr.lproj/InfoPlist.strings b/apps/ios/SimpleX SE/fr.lproj/InfoPlist.strings index 388ac01f7f..4f89e54128 100644 --- a/apps/ios/SimpleX SE/fr.lproj/InfoPlist.strings +++ b/apps/ios/SimpleX SE/fr.lproj/InfoPlist.strings @@ -1,7 +1,9 @@ -/* - InfoPlist.strings - SimpleX +/* Bundle display name */ +"CFBundleDisplayName" = "SimpleX SE"; + +/* Bundle name */ +"CFBundleName" = "SimpleX SE"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 SimpleX Chat. Tous droits réservés."; - Created by EP on 30/07/2024. - Copyright © 2024 SimpleX Chat. All rights reserved. -*/ diff --git a/apps/ios/SimpleX SE/fr.lproj/Localizable.strings b/apps/ios/SimpleX SE/fr.lproj/Localizable.strings index 5ef592ec70..41dda79fbd 100644 --- a/apps/ios/SimpleX SE/fr.lproj/Localizable.strings +++ b/apps/ios/SimpleX SE/fr.lproj/Localizable.strings @@ -1,7 +1,99 @@ -/* - Localizable.strings - SimpleX +/* No comment provided by engineer. */ +"%@" = "%@"; + +/* No comment provided by engineer. */ +"App is locked!" = "L'app est verrouillée !"; + +/* No comment provided by engineer. */ +"Cancel" = "Annuler"; + +/* No comment provided by engineer. */ +"Cannot access keychain to save database password" = "Impossible d'accéder à la keychain pour enregistrer le mot de passe de la base de données"; + +/* No comment provided by engineer. */ +"Cannot forward message" = "Impossible de transférer le message"; + +/* No comment provided by engineer. */ +"Comment" = "Commenter"; + +/* No comment provided by engineer. */ +"Currently maximum supported file size is %@." = "Actuellement, la taille maximale des fichiers supportés est de %@."; + +/* No comment provided by engineer. */ +"Database downgrade required" = "Mise à jour de la base de données nécessaire"; + +/* No comment provided by engineer. */ +"Database encrypted!" = "Base de données chiffrée !"; + +/* No comment provided by engineer. */ +"Database error" = "Erreur de base de données"; + +/* No comment provided by engineer. */ +"Database passphrase is different from saved in the keychain." = "La phrase secrète de la base de données est différente de celle enregistrée dans la keychain."; + +/* No comment provided by engineer. */ +"Database passphrase is required to open chat." = "La phrase secrète de la base de données est nécessaire pour ouvrir le chat."; + +/* No comment provided by engineer. */ +"Database upgrade required" = "Mise à niveau de la base de données nécessaire"; + +/* No comment provided by engineer. */ +"Error preparing file" = "Erreur lors de la préparation du fichier"; + +/* No comment provided by engineer. */ +"Error preparing message" = "Erreur lors de la préparation du message"; + +/* No comment provided by engineer. */ +"Error: %@" = "Erreur : %@"; + +/* No comment provided by engineer. */ +"File error" = "Erreur de fichier"; + +/* No comment provided by engineer. */ +"Incompatible database version" = "Version de la base de données incompatible"; + +/* No comment provided by engineer. */ +"Invalid migration confirmation" = "Confirmation de migration invalide"; + +/* No comment provided by engineer. */ +"Keychain error" = "Erreur de la keychain"; + +/* No comment provided by engineer. */ +"Large file!" = "Fichier trop lourd !"; + +/* No comment provided by engineer. */ +"No active profile" = "Pas de profil actif"; + +/* No comment provided by engineer. */ +"Ok" = "Ok"; + +/* No comment provided by engineer. */ +"Open the app to downgrade the database." = "Ouvrez l'app pour rétrograder la base de données."; + +/* No comment provided by engineer. */ +"Open the app to upgrade the database." = "Ouvrez l'app pour mettre à jour la base de données."; + +/* No comment provided by engineer. */ +"Passphrase" = "Phrase secrète"; + +/* No comment provided by engineer. */ +"Please create a profile in the SimpleX app" = "Veuillez créer un profil dans l'app SimpleX"; + +/* No comment provided by engineer. */ +"Selected chat preferences prohibit this message." = "Les paramètres de chat sélectionnés ne permettent pas l'envoi de ce message."; + +/* No comment provided by engineer. */ +"Share" = "Partager"; + +/* No comment provided by engineer. */ +"Unknown database error: %@" = "Erreur inconnue de la base de données : %@"; + +/* No comment provided by engineer. */ +"Unsupported format" = "Format non pris en charge"; + +/* No comment provided by engineer. */ +"Wrong database passphrase" = "Mauvaise phrase secrète pour la base de données"; + +/* No comment provided by engineer. */ +"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "Vous pouvez autoriser le partage dans les paramètres Confidentialité et sécurité / SimpleX Lock."; - Created by EP on 30/07/2024. - Copyright © 2024 SimpleX Chat. All rights reserved. -*/ diff --git a/apps/ios/SimpleX SE/hu.lproj/InfoPlist.strings b/apps/ios/SimpleX SE/hu.lproj/InfoPlist.strings index 388ac01f7f..e1979850d1 100644 --- a/apps/ios/SimpleX SE/hu.lproj/InfoPlist.strings +++ b/apps/ios/SimpleX SE/hu.lproj/InfoPlist.strings @@ -1,7 +1,9 @@ -/* - InfoPlist.strings - SimpleX +/* Bundle display name */ +"CFBundleDisplayName" = "SimpleX SE"; + +/* Bundle name */ +"CFBundleName" = "SimpleX SE"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 SimpleX Chat. Minden jog fenntartva."; - Created by EP on 30/07/2024. - Copyright © 2024 SimpleX Chat. All rights reserved. -*/ diff --git a/apps/ios/SimpleX SE/hu.lproj/Localizable.strings b/apps/ios/SimpleX SE/hu.lproj/Localizable.strings index 5ef592ec70..2bda7c51bb 100644 --- a/apps/ios/SimpleX SE/hu.lproj/Localizable.strings +++ b/apps/ios/SimpleX SE/hu.lproj/Localizable.strings @@ -1,7 +1,111 @@ -/* - Localizable.strings - SimpleX +/* No comment provided by engineer. */ +"%@" = "%@"; + +/* No comment provided by engineer. */ +"App is locked!" = "Az alkalmazás zárolva!"; + +/* No comment provided by engineer. */ +"Cancel" = "Mégse"; + +/* No comment provided by engineer. */ +"Cannot access keychain to save database password" = "Nem lehet hozzáférni a kulcstartóhoz az adatbázis jelszavának mentéséhez"; + +/* No comment provided by engineer. */ +"Cannot forward message" = "Nem lehet továbbítani az üzenetet"; + +/* No comment provided by engineer. */ +"Comment" = "Hozzászólás"; + +/* No comment provided by engineer. */ +"Currently maximum supported file size is %@." = "Jelenleg a maximális támogatott fájlméret %@."; + +/* No comment provided by engineer. */ +"Database downgrade required" = "Adatbázis visszafejlesztése szükséges"; + +/* No comment provided by engineer. */ +"Database encrypted!" = "Adatbázis titkosítva!"; + +/* No comment provided by engineer. */ +"Database error" = "Adatbázis hiba"; + +/* No comment provided by engineer. */ +"Database passphrase is different from saved in the keychain." = "Az adatbázis jelmondata eltér a kulcstartóban lévőtől."; + +/* No comment provided by engineer. */ +"Database passphrase is required to open chat." = "Adatbázis jelmondat szükséges a csevegés megnyitásához."; + +/* No comment provided by engineer. */ +"Database upgrade required" = "Adatbázis fejlesztése szükséges"; + +/* No comment provided by engineer. */ +"Error preparing file" = "Hiba a fájl előkészítésekor"; + +/* No comment provided by engineer. */ +"Error preparing message" = "Hiba az üzenet előkészítésekor"; + +/* No comment provided by engineer. */ +"Error: %@" = "Hiba: %@"; + +/* No comment provided by engineer. */ +"File error" = "Fájlhiba"; + +/* No comment provided by engineer. */ +"Incompatible database version" = "Nem kompatibilis adatbázis verzió"; + +/* No comment provided by engineer. */ +"Invalid migration confirmation" = "Érvénytelen átköltöztetési visszaigazolás"; + +/* No comment provided by engineer. */ +"Keychain error" = "Kulcstartó hiba"; + +/* No comment provided by engineer. */ +"Large file!" = "Nagy fájl!"; + +/* No comment provided by engineer. */ +"No active profile" = "Nincs aktív profil"; + +/* No comment provided by engineer. */ +"Ok" = "Rendben"; + +/* No comment provided by engineer. */ +"Open the app to downgrade the database." = "Nyissa meg az alkalmazást az adatbázis visszafejlesztéséhez."; + +/* No comment provided by engineer. */ +"Open the app to upgrade the database." = "Nyissa meg az alkalmazást az adatbázis fejlesztéséhez."; + +/* No comment provided by engineer. */ +"Passphrase" = "Jelmondat"; + +/* No comment provided by engineer. */ +"Please create a profile in the SimpleX app" = "Hozzon létre egy profilt a SimpleX alkalmazásban"; + +/* No comment provided by engineer. */ +"Selected chat preferences prohibit this message." = "A kiválasztott csevegési beállítások tiltják ezt az üzenetet."; + +/* No comment provided by engineer. */ +"Sending a message takes longer than expected." = "Az üzenet elküldése a vártnál tovább tart."; + +/* No comment provided by engineer. */ +"Sending message…" = "Üzenet küldése…"; + +/* No comment provided by engineer. */ +"Share" = "Megosztás"; + +/* No comment provided by engineer. */ +"Slow network?" = "Lassú internetkapcsolat?"; + +/* No comment provided by engineer. */ +"Unknown database error: %@" = "Ismeretlen adatbázis hiba: %@"; + +/* No comment provided by engineer. */ +"Unsupported format" = "Nem támogatott formátum"; + +/* No comment provided by engineer. */ +"Wait" = "Várjon"; + +/* No comment provided by engineer. */ +"Wrong database passphrase" = "Hibás adatbázis jelmondat"; + +/* No comment provided by engineer. */ +"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "A megosztást az Adatvédelem és biztonság / SimpleX zár menüpontban engedélyezheti."; - Created by EP on 30/07/2024. - Copyright © 2024 SimpleX Chat. All rights reserved. -*/ diff --git a/apps/ios/SimpleX SE/it.lproj/InfoPlist.strings b/apps/ios/SimpleX SE/it.lproj/InfoPlist.strings index 388ac01f7f..78145285c2 100644 --- a/apps/ios/SimpleX SE/it.lproj/InfoPlist.strings +++ b/apps/ios/SimpleX SE/it.lproj/InfoPlist.strings @@ -1,7 +1,9 @@ -/* - InfoPlist.strings - SimpleX +/* Bundle display name */ +"CFBundleDisplayName" = "SimpleX SE"; + +/* Bundle name */ +"CFBundleName" = "SimpleX SE"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 SimpleX Chat. Tutti i diritti riservati."; - Created by EP on 30/07/2024. - Copyright © 2024 SimpleX Chat. All rights reserved. -*/ diff --git a/apps/ios/SimpleX SE/it.lproj/Localizable.strings b/apps/ios/SimpleX SE/it.lproj/Localizable.strings index 5ef592ec70..e3d34650a3 100644 --- a/apps/ios/SimpleX SE/it.lproj/Localizable.strings +++ b/apps/ios/SimpleX SE/it.lproj/Localizable.strings @@ -1,7 +1,111 @@ -/* - Localizable.strings - SimpleX +/* No comment provided by engineer. */ +"%@" = "%@"; + +/* No comment provided by engineer. */ +"App is locked!" = "L'app è bloccata!"; + +/* No comment provided by engineer. */ +"Cancel" = "Annulla"; + +/* No comment provided by engineer. */ +"Cannot access keychain to save database password" = "Impossibile accedere al portachiavi per salvare la password del database"; + +/* No comment provided by engineer. */ +"Cannot forward message" = "Impossibile inoltrare il messaggio"; + +/* No comment provided by engineer. */ +"Comment" = "Commento"; + +/* No comment provided by engineer. */ +"Currently maximum supported file size is %@." = "Attualmente la dimensione massima supportata è di %@."; + +/* No comment provided by engineer. */ +"Database downgrade required" = "Downgrade del database necessario"; + +/* No comment provided by engineer. */ +"Database encrypted!" = "Database crittografato!"; + +/* No comment provided by engineer. */ +"Database error" = "Errore del database"; + +/* No comment provided by engineer. */ +"Database passphrase is different from saved in the keychain." = "La password del database è diversa da quella salvata nel portachiavi."; + +/* No comment provided by engineer. */ +"Database passphrase is required to open chat." = "La password del database è necessaria per aprire la chat."; + +/* No comment provided by engineer. */ +"Database upgrade required" = "Aggiornamento del database necessario"; + +/* No comment provided by engineer. */ +"Error preparing file" = "Errore nella preparazione del file"; + +/* No comment provided by engineer. */ +"Error preparing message" = "Errore nella preparazione del messaggio"; + +/* No comment provided by engineer. */ +"Error: %@" = "Errore: %@"; + +/* No comment provided by engineer. */ +"File error" = "Errore del file"; + +/* No comment provided by engineer. */ +"Incompatible database version" = "Versione del database incompatibile"; + +/* No comment provided by engineer. */ +"Invalid migration confirmation" = "Conferma di migrazione non valida"; + +/* No comment provided by engineer. */ +"Keychain error" = "Errore del portachiavi"; + +/* No comment provided by engineer. */ +"Large file!" = "File grande!"; + +/* No comment provided by engineer. */ +"No active profile" = "Nessun profilo attivo"; + +/* No comment provided by engineer. */ +"Ok" = "Ok"; + +/* No comment provided by engineer. */ +"Open the app to downgrade the database." = "Apri l'app per eseguire il downgrade del database."; + +/* No comment provided by engineer. */ +"Open the app to upgrade the database." = "Apri l'app per aggiornare il database."; + +/* No comment provided by engineer. */ +"Passphrase" = "Password"; + +/* No comment provided by engineer. */ +"Please create a profile in the SimpleX app" = "Crea un profilo nell'app SimpleX"; + +/* No comment provided by engineer. */ +"Selected chat preferences prohibit this message." = "Le preferenze della chat selezionata vietano questo messaggio."; + +/* No comment provided by engineer. */ +"Sending a message takes longer than expected." = "L'invio di un messaggio richiede più tempo del previsto."; + +/* No comment provided by engineer. */ +"Sending message…" = "Invio messaggio…"; + +/* No comment provided by engineer. */ +"Share" = "Condividi"; + +/* No comment provided by engineer. */ +"Slow network?" = "Rete lenta?"; + +/* No comment provided by engineer. */ +"Unknown database error: %@" = "Errore del database sconosciuto: %@"; + +/* No comment provided by engineer. */ +"Unsupported format" = "Formato non supportato"; + +/* No comment provided by engineer. */ +"Wait" = "Attendi"; + +/* No comment provided by engineer. */ +"Wrong database passphrase" = "Password del database sbagliata"; + +/* No comment provided by engineer. */ +"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "Puoi consentire la condivisione in Privacy e sicurezza / impostazioni di SimpleX Lock."; - Created by EP on 30/07/2024. - Copyright © 2024 SimpleX Chat. All rights reserved. -*/ diff --git a/apps/ios/SimpleX SE/nl.lproj/InfoPlist.strings b/apps/ios/SimpleX SE/nl.lproj/InfoPlist.strings index 388ac01f7f..c61e43a87f 100644 --- a/apps/ios/SimpleX SE/nl.lproj/InfoPlist.strings +++ b/apps/ios/SimpleX SE/nl.lproj/InfoPlist.strings @@ -1,7 +1,9 @@ -/* - InfoPlist.strings - SimpleX +/* Bundle display name */ +"CFBundleDisplayName" = "SimpleX SE"; + +/* Bundle name */ +"CFBundleName" = "SimpleX SE"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 SimpleX Chat. All rights reserved."; - Created by EP on 30/07/2024. - Copyright © 2024 SimpleX Chat. All rights reserved. -*/ diff --git a/apps/ios/SimpleX SE/nl.lproj/Localizable.strings b/apps/ios/SimpleX SE/nl.lproj/Localizable.strings index 5ef592ec70..8412c88ea6 100644 --- a/apps/ios/SimpleX SE/nl.lproj/Localizable.strings +++ b/apps/ios/SimpleX SE/nl.lproj/Localizable.strings @@ -1,7 +1,111 @@ -/* - Localizable.strings - SimpleX +/* No comment provided by engineer. */ +"%@" = "%@"; + +/* No comment provided by engineer. */ +"App is locked!" = "App is vergrendeld!"; + +/* No comment provided by engineer. */ +"Cancel" = "Annuleren"; + +/* No comment provided by engineer. */ +"Cannot access keychain to save database password" = "Kan geen toegang krijgen tot de keychain om het database wachtwoord op te slaan"; + +/* No comment provided by engineer. */ +"Cannot forward message" = "Kan bericht niet doorsturen"; + +/* No comment provided by engineer. */ +"Comment" = "Opmerking"; + +/* No comment provided by engineer. */ +"Currently maximum supported file size is %@." = "De momenteel maximaal ondersteunde bestandsgrootte is %@."; + +/* No comment provided by engineer. */ +"Database downgrade required" = "Database downgrade vereist"; + +/* No comment provided by engineer. */ +"Database encrypted!" = "Database versleuteld!"; + +/* No comment provided by engineer. */ +"Database error" = "Database fout"; + +/* No comment provided by engineer. */ +"Database passphrase is different from saved in the keychain." = "Het wachtwoord van de database verschilt van het wachtwoord die in de keychain is opgeslagen."; + +/* No comment provided by engineer. */ +"Database passphrase is required to open chat." = "Database wachtwoord is vereist om je gesprekken te openen."; + +/* No comment provided by engineer. */ +"Database upgrade required" = "Database upgrade vereist"; + +/* No comment provided by engineer. */ +"Error preparing file" = "Fout bij voorbereiden bestand"; + +/* No comment provided by engineer. */ +"Error preparing message" = "Fout bij het voorbereiden van bericht"; + +/* No comment provided by engineer. */ +"Error: %@" = "Fout: %@"; + +/* No comment provided by engineer. */ +"File error" = "Bestandsfout"; + +/* No comment provided by engineer. */ +"Incompatible database version" = "Incompatibele database versie"; + +/* No comment provided by engineer. */ +"Invalid migration confirmation" = "Ongeldige migratie bevestiging"; + +/* No comment provided by engineer. */ +"Keychain error" = "Keychain fout"; + +/* No comment provided by engineer. */ +"Large file!" = "Groot bestand!"; + +/* No comment provided by engineer. */ +"No active profile" = "Geen actief profiel"; + +/* No comment provided by engineer. */ +"Ok" = "Ok"; + +/* No comment provided by engineer. */ +"Open the app to downgrade the database." = "Open de app om de database te downgraden."; + +/* No comment provided by engineer. */ +"Open the app to upgrade the database." = "Open de app om de database te upgraden."; + +/* No comment provided by engineer. */ +"Passphrase" = "Wachtwoord"; + +/* No comment provided by engineer. */ +"Please create a profile in the SimpleX app" = "Maak een profiel aan in de SimpleX app"; + +/* No comment provided by engineer. */ +"Selected chat preferences prohibit this message." = "Geselecteerde chat voorkeuren verbieden dit bericht."; + +/* No comment provided by engineer. */ +"Sending a message takes longer than expected." = "Het verzenden van een bericht duurt langer dan verwacht."; + +/* No comment provided by engineer. */ +"Sending message…" = "Bericht versturen…"; + +/* No comment provided by engineer. */ +"Share" = "Deel"; + +/* No comment provided by engineer. */ +"Slow network?" = "Traag netwerk?"; + +/* No comment provided by engineer. */ +"Unknown database error: %@" = "Onbekende database fout: %@"; + +/* No comment provided by engineer. */ +"Unsupported format" = "Niet ondersteund formaat"; + +/* No comment provided by engineer. */ +"Wait" = "wachten"; + +/* No comment provided by engineer. */ +"Wrong database passphrase" = "Verkeerde database wachtwoord"; + +/* No comment provided by engineer. */ +"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "U kunt delen toestaan in de instellingen voor Privacy en beveiliging / SimpleX Lock."; - Created by EP on 30/07/2024. - Copyright © 2024 SimpleX Chat. All rights reserved. -*/ diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 1acd6a57dc..7a205455dd 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -199,6 +199,7 @@ 8CC4ED902BD7B8530078AEE8 /* CallAudioDeviceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CC4ED8F2BD7B8530078AEE8 /* CallAudioDeviceManager.swift */; }; 8CC956EE2BC0041000412A11 /* NetworkObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CC956ED2BC0041000412A11 /* NetworkObserver.swift */; }; 8CE848A32C5A0FA000D5C7C8 /* SelectableChatItemToolbars.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE848A22C5A0FA000D5C7C8 /* SelectableChatItemToolbars.swift */; }; + B76E6C312C5C41D900EC11AA /* ContactListNavLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = B76E6C302C5C41D900EC11AA /* ContactListNavLink.swift */; }; CE1EB0E42C459A660099D896 /* ShareAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1EB0E32C459A660099D896 /* ShareAPI.swift */; }; CE2AD9CE2C452A4D00E844E3 /* ChatUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE2AD9CD2C452A4D00E844E3 /* ChatUtils.swift */; }; CE3097FB2C4C0C9F00180898 /* ErrorAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3097FA2C4C0C9F00180898 /* ErrorAlert.swift */; }; @@ -541,6 +542,7 @@ 8CC4ED8F2BD7B8530078AEE8 /* CallAudioDeviceManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallAudioDeviceManager.swift; sourceTree = ""; }; 8CC956ED2BC0041000412A11 /* NetworkObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkObserver.swift; sourceTree = ""; }; 8CE848A22C5A0FA000D5C7C8 /* SelectableChatItemToolbars.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectableChatItemToolbars.swift; sourceTree = ""; }; + B76E6C302C5C41D900EC11AA /* ContactListNavLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactListNavLink.swift; sourceTree = ""; }; CE1EB0E32C459A660099D896 /* ShareAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareAPI.swift; sourceTree = ""; }; CE2AD9CD2C452A4D00E844E3 /* ChatUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatUtils.swift; sourceTree = ""; }; CE3097FA2C4C0C9F00180898 /* ErrorAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlert.swift; sourceTree = ""; }; @@ -695,6 +697,7 @@ 5C2E260D27A30E2400F70299 /* Views */ = { isa = PBXGroup; children = ( + B76E6C2F2C5C41C300EC11AA /* Contacts */, 5CB0BA8C282711BC00B3292C /* Onboarding */, 3C714775281C080100CB4D4B /* Call */, 5C971E1F27AEBF7000C8A3CE /* Helpers */, @@ -1086,6 +1089,14 @@ path = Theme; sourceTree = ""; }; + B76E6C2F2C5C41C300EC11AA /* Contacts */ = { + isa = PBXGroup; + children = ( + B76E6C302C5C41D900EC11AA /* ContactListNavLink.swift */, + ); + path = Contacts; + sourceTree = ""; + }; CEE723A82C3BD3D70009AE93 /* SimpleX SE */ = { isa = PBXGroup; children = ( @@ -1392,6 +1403,7 @@ 64466DC829FC2B3B00E3D48D /* CreateSimpleXAddress.swift in Sources */, 3CDBCF4827FF621E00354CDD /* CILinkView.swift in Sources */, 5C7505A827B6D34800BE3227 /* ChatInfoToolbar.swift in Sources */, + B76E6C312C5C41D900EC11AA /* ContactListNavLink.swift in Sources */, 5C10D88A28F187F300E58BF0 /* FullScreenMediaView.swift in Sources */, D72A9088294BD7A70047C86D /* NativeTextEditor.swift in Sources */, CE984D4B2C36C5D500E3AEFF /* ChatItemClipShape.swift in Sources */, diff --git a/apps/ios/SimpleXChat/APITypes.swift b/apps/ios/SimpleXChat/APITypes.swift index 17b4c2d6ad..7fb89be92e 100644 --- a/apps/ios/SimpleXChat/APITypes.swift +++ b/apps/ios/SimpleXChat/APITypes.swift @@ -15,7 +15,7 @@ public let jsonEncoder = getJSONEncoder() public enum ChatCommand { case showActiveUser - case createActiveUser(profile: Profile?, sameServers: Bool, pastTimestamp: Bool) + case createActiveUser(profile: Profile?, pastTimestamp: Bool) case listUsers case apiSetActiveUser(userId: Int64, viewPwd: String?) case setAllContactReceipts(enable: Bool) @@ -101,7 +101,7 @@ public enum ChatCommand { case apiConnectPlan(userId: Int64, connReq: String) case apiConnect(userId: Int64, incognito: Bool, connReq: String) case apiConnectContactViaAddress(userId: Int64, incognito: Bool, contactId: Int64) - case apiDeleteChat(type: ChatType, id: Int64, notify: Bool?) + case apiDeleteChat(type: ChatType, id: Int64, chatDeleteMode: ChatDeleteMode) case apiClearChat(type: ChatType, id: Int64) case apiListContacts(userId: Int64) case apiUpdateProfile(userId: Int64, profile: Profile) @@ -156,8 +156,8 @@ public enum ChatCommand { get { switch self { case .showActiveUser: return "/u" - case let .createActiveUser(profile, sameServers, pastTimestamp): - let user = NewUser(profile: profile, sameServers: sameServers, pastTimestamp: pastTimestamp) + case let .createActiveUser(profile, pastTimestamp): + let user = NewUser(profile: profile, pastTimestamp: pastTimestamp) return "/_create user \(encodeJSON(user))" case .listUsers: return "/users" case let .apiSetActiveUser(userId, viewPwd): return "/_user \(userId)\(maybePwd(viewPwd))" @@ -266,11 +266,7 @@ public enum ChatCommand { case let .apiConnectPlan(userId, connReq): return "/_connect plan \(userId) \(connReq)" case let .apiConnect(userId, incognito, connReq): return "/_connect \(userId) incognito=\(onOff(incognito)) \(connReq)" case let .apiConnectContactViaAddress(userId, incognito, contactId): return "/_connect contact \(userId) incognito=\(onOff(incognito)) \(contactId)" - case let .apiDeleteChat(type, id, notify): if let notify = notify { - return "/_delete \(ref(type, id)) notify=\(onOff(notify))" - } else { - return "/_delete \(ref(type, id))" - } + case let .apiDeleteChat(type, id, chatDeleteMode): return "/_delete \(ref(type, id)) \(chatDeleteMode.cmdString)" case let .apiClearChat(type, id): return "/_clear chat \(ref(type, id))" case let .apiListContacts(userId): return "/_contacts \(userId)" case let .apiUpdateProfile(userId, profile): return "/_profile \(userId) \(encodeJSON(profile))" @@ -505,10 +501,6 @@ public enum ChatCommand { return nil } - private func onOff(_ b: Bool) -> String { - b ? "on" : "off" - } - private func onOffParam(_ param: String, _ b: Bool?) -> String { if let b = b { return " \(param)=\(onOff(b))" @@ -521,6 +513,10 @@ public enum ChatCommand { } } +private func onOff(_ b: Bool) -> String { + b ? "on" : "off" +} + public struct APIResponse: Decodable { var resp: ChatResponse } @@ -1048,6 +1044,27 @@ public func chatError(_ chatResponse: ChatResponse) -> ChatErrorType? { } } +public enum ChatDeleteMode: Codable { + case full(notify: Bool) + case entity(notify: Bool) + case messages + + var cmdString: String { + switch self { + case let .full(notify): "full notify=\(onOff(notify))" + case let .entity(notify): "entity notify=\(onOff(notify))" + case .messages: "messages" + } + } + + public var isEntity: Bool { + switch self { + case .entity: return true + default: return false + } + } +} + public enum ConnectionPlan: Decodable, Hashable { case invitationLink(invitationLinkPlan: InvitationLinkPlan) case contactAddress(contactAddressPlan: ContactAddressPlan) @@ -1080,7 +1097,6 @@ public enum GroupLinkPlan: Decodable, Hashable { struct NewUser: Encodable, Hashable { var profile: Profile? - var sameServers: Bool var pastTimestamp: Bool } @@ -1325,13 +1341,31 @@ public struct NetCfg: Codable, Equatable, Hashable { smpPingInterval: 1200_000_000 ) - public static let proxyDefaults: NetCfg = NetCfg( + static let proxyDefaults: NetCfg = NetCfg( tcpConnectTimeout: 35_000_000, tcpTimeout: 20_000_000, tcpTimeoutPerKb: 15_000, rcvConcurrency: 8, smpPingInterval: 1200_000_000 ) + + public var withProxyTimeouts: NetCfg { + var cfg = self + cfg.tcpConnectTimeout = NetCfg.proxyDefaults.tcpConnectTimeout + cfg.tcpTimeout = NetCfg.proxyDefaults.tcpTimeout + cfg.tcpTimeoutPerKb = NetCfg.proxyDefaults.tcpTimeoutPerKb + cfg.rcvConcurrency = NetCfg.proxyDefaults.rcvConcurrency + cfg.smpPingInterval = NetCfg.proxyDefaults.smpPingInterval + return cfg + } + + public var hasProxyTimeouts: Bool { + tcpConnectTimeout == NetCfg.proxyDefaults.tcpConnectTimeout && + tcpTimeout == NetCfg.proxyDefaults.tcpTimeout && + tcpTimeoutPerKb == NetCfg.proxyDefaults.tcpTimeoutPerKb && + rcvConcurrency == NetCfg.proxyDefaults.rcvConcurrency && + smpPingInterval == NetCfg.proxyDefaults.smpPingInterval + } public var enableKeepAlive: Bool { tcpKeepAlive != nil } } @@ -1347,16 +1381,16 @@ public enum SocksMode: String, Codable, Hashable { case onion = "onion" } -public enum SMPProxyMode: String, Codable, Hashable { +public enum SMPProxyMode: String, Codable, Hashable, SelectableItem { case always = "always" case unknown = "unknown" case unprotected = "unprotected" case never = "never" - public var text: LocalizedStringKey { + public var label: LocalizedStringKey { switch self { case .always: return "always" - case .unknown: return "unknown relays" + case .unknown: return "unknown servers" case .unprotected: return "unprotected" case .never: return "never" } @@ -1367,12 +1401,12 @@ public enum SMPProxyMode: String, Codable, Hashable { public static let values: [SMPProxyMode] = [.always, .unknown, .unprotected, .never] } -public enum SMPProxyFallback: String, Codable, Hashable { +public enum SMPProxyFallback: String, Codable, Hashable, SelectableItem { case allow = "allow" case allowProtected = "allowProtected" case prohibit = "prohibit" - public var text: LocalizedStringKey { + public var label: LocalizedStringKey { switch self { case .allow: return "yes" case .allowProtected: return "when IP hidden" @@ -2123,7 +2157,8 @@ public struct AppSettings: Codable, Equatable, Hashable { public var uiDarkColorScheme: String? = nil public var uiCurrentThemeIds: [String: String]? = nil public var uiThemes: [ThemeOverrides]? = nil - + public var oneHandUI: Bool? = nil + public func prepareForExport() -> AppSettings { var empty = AppSettings() let def = AppSettings.defaults @@ -2153,6 +2188,7 @@ public struct AppSettings: Codable, Equatable, Hashable { if uiDarkColorScheme != def.uiDarkColorScheme { empty.uiDarkColorScheme = uiDarkColorScheme } if uiCurrentThemeIds != def.uiCurrentThemeIds { empty.uiCurrentThemeIds = uiCurrentThemeIds } if uiThemes != def.uiThemes { empty.uiThemes = uiThemes } + if oneHandUI != def.oneHandUI { empty.oneHandUI = oneHandUI } return empty } @@ -2183,7 +2219,8 @@ public struct AppSettings: Codable, Equatable, Hashable { uiColorScheme: DefaultTheme.SYSTEM_THEME_NAME, uiDarkColorScheme: DefaultTheme.SIMPLEX.themeName, uiCurrentThemeIds: nil as [String: String]?, - uiThemes: nil as [ThemeOverrides]? + uiThemes: nil as [ThemeOverrides]?, + oneHandUI: false ) } } diff --git a/apps/ios/SimpleXChat/AppGroup.swift b/apps/ios/SimpleXChat/AppGroup.swift index 1690c7bc73..933842e0cb 100644 --- a/apps/ios/SimpleXChat/AppGroup.swift +++ b/apps/ios/SimpleXChat/AppGroup.swift @@ -66,8 +66,8 @@ public func registerGroupDefaults() { GROUP_DEFAULT_NTF_ENABLE_PERIODIC: false, GROUP_DEFAULT_NETWORK_USE_ONION_HOSTS: OnionHosts.no.rawValue, GROUP_DEFAULT_NETWORK_SESSION_MODE: TransportSessionMode.user.rawValue, - GROUP_DEFAULT_NETWORK_SMP_PROXY_MODE: SMPProxyMode.never.rawValue, - GROUP_DEFAULT_NETWORK_SMP_PROXY_FALLBACK: SMPProxyFallback.allow.rawValue, + GROUP_DEFAULT_NETWORK_SMP_PROXY_MODE: SMPProxyMode.unknown.rawValue, + GROUP_DEFAULT_NETWORK_SMP_PROXY_FALLBACK: SMPProxyFallback.allowProtected.rawValue, GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT: NetCfg.defaults.tcpConnectTimeout, GROUP_DEFAULT_NETWORK_TCP_TIMEOUT: NetCfg.defaults.tcpTimeout, GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB: NetCfg.defaults.tcpTimeoutPerKb, @@ -235,13 +235,13 @@ public let networkSessionModeGroupDefault = EnumDefault( public let networkSMPProxyModeGroupDefault = EnumDefault( defaults: groupDefaults, forKey: GROUP_DEFAULT_NETWORK_SMP_PROXY_MODE, - withDefault: .never + withDefault: .unknown ) public let networkSMPProxyFallbackGroupDefault = EnumDefault( defaults: groupDefaults, forKey: GROUP_DEFAULT_NETWORK_SMP_PROXY_FALLBACK, - withDefault: .allow + withDefault: .allowProtected ) public let storeDBPassphraseGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_STORE_DB_PASSPHRASE) diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index f9eb0ed39e..233f4c19ee 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -1289,6 +1289,15 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable { } } } + + public var chatDeleted: Bool { + get { + switch self { + case let .direct(contact): return contact.chatDeleted + default: return false + } + } + } public var sendMsgEnabled: Bool { get { @@ -1401,6 +1410,27 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable { } } + public enum ShowEnableCallsAlert: Hashable { + case userEnable + case askContact + case other + } + + public var showEnableCallsAlert: ShowEnableCallsAlert { + switch self { + case let .direct(contact): + if contact.mergedPreferences.calls.userPreference.preference.allow == .no { + return .userEnable + } else if contact.mergedPreferences.calls.contactPreference.allow == .no { + return .askContact + } else { + return .other + } + default: + return .other + } + } + public var ntfsEnabled: Bool { self.chatSettings?.enableNtfs == .all } @@ -1508,7 +1538,8 @@ public struct Contact: Identifiable, Decodable, NamedChat, Hashable { var contactGroupMemberId: Int64? var contactGrpInvSent: Bool public var uiThemes: ThemeModeOverrides? - + public var chatDeleted: Bool + public var id: ChatId { get { "@\(contactId)" } } public var apiId: Int64 { get { contactId } } public var ready: Bool { get { activeConn?.connStatus == .ready } } @@ -1575,13 +1606,15 @@ public struct Contact: Identifiable, Decodable, NamedChat, Hashable { mergedPreferences: ContactUserPreferences.sampleData, createdAt: .now, updatedAt: .now, - contactGrpInvSent: false + contactGrpInvSent: false, + chatDeleted: false ) } public enum ContactStatus: String, Decodable, Hashable { case active = "active" case deleted = "deleted" + case deletedByUser = "deletedByUser" } public struct ContactRef: Decodable, Equatable, Hashable { diff --git a/apps/ios/SimpleXChat/ImageUtils.swift b/apps/ios/SimpleXChat/ImageUtils.swift index 7a62d863e6..67218a781e 100644 --- a/apps/ios/SimpleXChat/ImageUtils.swift +++ b/apps/ios/SimpleXChat/ImageUtils.swift @@ -174,7 +174,7 @@ public func downsampleImage(at url: URL, to size: Int64) -> UIImage? { if let source = CGImageSourceCreateWithURL(url as CFURL, nil) { CGImageSourceCreateThumbnailAtIndex( source, - Int.zero, + 0, [ kCGImageSourceCreateThumbnailFromImageAlways: true, kCGImageSourceShouldCacheImmediately: true, @@ -433,17 +433,25 @@ private let squareToCircleRatio = 0.935 private let radiusFactor = (1 - squareToCircleRatio) / 50 -@ViewBuilder public func clipProfileImage(_ img: Image, size: CGFloat, radius: Double) -> some View { - let v = img.resizable() +@ViewBuilder public func clipProfileImage(_ img: Image, size: CGFloat, radius: Double, blurred: Bool = false) -> some View { if radius >= 50 { - v.frame(width: size, height: size).clipShape(Circle()) + blurredFrame(img, size, blurred).clipShape(Circle()) } else if radius <= 0 { let sz = size * squareToCircleRatio - v.frame(width: sz, height: sz).padding((size - sz) / 2) + blurredFrame(img, sz, blurred).padding((size - sz) / 2) } else { let sz = size * (squareToCircleRatio + radius * radiusFactor) - v.frame(width: sz, height: sz) + blurredFrame(img, sz, blurred) .clipShape(RoundedRectangle(cornerRadius: sz * radius / 100, style: .continuous)) .padding((size - sz) / 2) } } + +@ViewBuilder private func blurredFrame(_ img: Image, _ size: CGFloat, _ blurred: Bool) -> some View { + let v = img.resizable().frame(width: size, height: size) + if blurred { + v.blur(radius: size / 4) + } else { + v + } +} diff --git a/apps/ios/bg.lproj/Localizable.strings b/apps/ios/bg.lproj/Localizable.strings index 1e7b7a6314..eb21f743dc 100644 --- a/apps/ios/bg.lproj/Localizable.strings +++ b/apps/ios/bg.lproj/Localizable.strings @@ -641,7 +641,7 @@ /* rcv group event chat item */ "blocked %@" = "блокиран %@"; -/* blocked chat item */ +/* marked deleted chat item preview text */ "blocked by admin" = "блокиран от админ"; /* No comment provided by engineer. */ @@ -984,9 +984,6 @@ /* notification */ "Contact is connected" = "Контактът е свързан"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Контактът все още не е свързан!"; - /* No comment provided by engineer. */ "Contact name" = "Име на контакт"; @@ -1200,12 +1197,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Изтрий контакт"; -/* No comment provided by engineer. */ -"Delete Contact" = "Изтрий контакт"; - -/* No comment provided by engineer. */ -"Delete contact?\nThis cannot be undone!" = "Изтрий контакт?\nТова не може да бъде отменено!"; - /* No comment provided by engineer. */ "Delete database" = "Изтрий базата данни"; @@ -1260,9 +1251,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Изтрий старата база данни?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Изтрий предстоящата връзка"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Изтрий предстоящата връзка?"; @@ -1653,9 +1641,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Грешка при изтриване на връзката"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Грешка при изтриване на контакт"; - /* No comment provided by engineer. */ "Error deleting database" = "Грешка при изтриване на базата данни"; @@ -2719,10 +2704,10 @@ "One-time invitation link" = "Линк за еднократна покана"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "За свързване ще са необходими Onion хостове. Изисква се активиране на VPN."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "За свързване ще са **необходими** Onion хостове.\nИзисква се активиране на VPN."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Ще се използват Onion хостове, когато са налични. Изисква се активиране на VPN."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Ще се използват Onion хостове, когато са налични.\nИзисква се активиране на VPN."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Няма се използват Onion хостове."; @@ -3204,9 +3189,6 @@ /* chat item action */ "Reveal" = "Покажи"; -/* No comment provided by engineer. */ -"Revert" = "Отмени промените"; - /* No comment provided by engineer. */ "Revoke" = "Отзови"; @@ -3336,7 +3318,7 @@ /* chat item text */ "security code changed" = "кодът за сигурност е променен"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Избери"; /* No comment provided by engineer. */ @@ -3363,9 +3345,6 @@ /* No comment provided by engineer. */ "send direct message" = "изпрати лично съобщение"; -/* No comment provided by engineer. */ -"Send direct message" = "Изпрати лично съобщение"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Изпрати лично съобщение за свързване"; @@ -3588,9 +3567,6 @@ /* No comment provided by engineer. */ "Small groups (max 20)" = "Малки групи (максимум 20)"; -/* No comment provided by engineer. */ -"SMP servers" = "SMP сървъри"; - /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Някои не-фатални грешки са възникнали по време на импортиране - може да видите конзолата за повече подробности."; @@ -3690,9 +3666,6 @@ /* No comment provided by engineer. */ "Tap to scan" = "Докосни за сканиране"; -/* No comment provided by engineer. */ -"Tap to start a new chat" = "Докосни за започване на нов чат"; - /* No comment provided by engineer. */ "TCP connection timeout" = "Времето на изчакване за установяване на TCP връзка"; @@ -3966,18 +3939,12 @@ /* No comment provided by engineer. */ "Update" = "Актуализация"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "Актуализиране на настройката за .onion хостове?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Актуализирай паролата на базата данни"; /* No comment provided by engineer. */ "Update network settings?" = "Актуализиране на мрежовите настройки?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "Актуализиране на режима на изолация на транспорта?"; - /* rcv group event chat item */ "updated group profile" = "актуализиран профил на групата"; @@ -3987,9 +3954,6 @@ /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "Актуализирането на настройките ще свърже отново клиента към всички сървъри."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "Актуализирането на тази настройка ще свърже повторно клиента към всички сървъри."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Актуализирай и отвори чата"; @@ -4038,9 +4002,6 @@ /* No comment provided by engineer. */ "User profile" = "Потребителски профил"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "Използването на .onion хостове изисква съвместим VPN доставчик."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "Използват се сървърите на SimpleX Chat."; @@ -4209,9 +4170,6 @@ /* No comment provided by engineer. */ "Wrong passphrase!" = "Грешна парола!"; -/* No comment provided by engineer. */ -"XFTP servers" = "XFTP сървъри"; - /* pref value */ "yes" = "да"; @@ -4347,9 +4305,6 @@ /* No comment provided by engineer. */ "You have already requested connection!\nRepeat connection request?" = "Вече сте направили заявката за връзка!\nИзпрати отново заявката за свързване?"; -/* 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." = "Трябва да въвеждате парола при всяко стартиране на приложението - тя не се съхранява на устройството."; @@ -4440,9 +4395,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Вашите чат профили"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Вашият контакт трябва да бъде онлайн, за да осъществите връзката.\nМожете да откажете тази връзка и да премахнете контакта (и да опитате по -късно с нов линк)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Вашият контакт изпрати файл, който е по-голям от поддържания в момента максимален размер (%@)."; diff --git a/apps/ios/cs.lproj/Localizable.strings b/apps/ios/cs.lproj/Localizable.strings index c7f916408f..91cd87a4c2 100644 --- a/apps/ios/cs.lproj/Localizable.strings +++ b/apps/ios/cs.lproj/Localizable.strings @@ -786,9 +786,6 @@ /* notification */ "Contact is connected" = "Kontakt je připojen"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Kontakt ještě není připojen!"; - /* No comment provided by engineer. */ "Contact name" = "Jméno kontaktu"; @@ -972,9 +969,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Smazat kontakt"; -/* No comment provided by engineer. */ -"Delete Contact" = "Smazat kontakt"; - /* No comment provided by engineer. */ "Delete database" = "Odstranění databáze"; @@ -1026,9 +1020,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Smazat starou databázi?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Smazat čekající připojení"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Smazat čekající připojení?"; @@ -1353,9 +1344,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Chyba při mazání připojení"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Chyba mazání kontaktu"; - /* No comment provided by engineer. */ "Error deleting database" = "Chyba při mazání databáze"; @@ -2215,10 +2203,10 @@ "One-time invitation link" = "Jednorázový zvací odkaz"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Pro připojení budou vyžadováni Onion hostitelé. Vyžaduje povolení sítě VPN."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Pro připojení budou vyžadováni Onion hostitelé.\nVyžaduje povolení sítě VPN."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Onion hostitelé budou použiti, pokud jsou k dispozici. Vyžaduje povolení sítě VPN."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Onion hostitelé budou použiti, pokud jsou k dispozici.\nVyžaduje povolení sítě VPN."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Onion hostitelé nebudou použiti."; @@ -2595,9 +2583,6 @@ /* chat item action */ "Reveal" = "Odhalit"; -/* No comment provided by engineer. */ -"Revert" = "Vrátit"; - /* No comment provided by engineer. */ "Revoke" = "Odvolat"; @@ -2700,7 +2685,7 @@ /* chat item text */ "security code changed" = "bezpečnostní kód změněn"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Vybrat"; /* No comment provided by engineer. */ @@ -2727,9 +2712,6 @@ /* No comment provided by engineer. */ "send direct message" = "odeslat přímou zprávu"; -/* No comment provided by engineer. */ -"Send direct message" = "Odeslat přímou zprávu"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Odeslat přímou zprávu pro připojení"; @@ -2922,9 +2904,6 @@ /* No comment provided by engineer. */ "Small groups (max 20)" = "Malé skupiny (max. 20)"; -/* No comment provided by engineer. */ -"SMP servers" = "SMP servery"; - /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Během importu došlo k nezávažným chybám - podrobnosti naleznete v chat konzoli."; @@ -3000,9 +2979,6 @@ /* No comment provided by engineer. */ "Tap to join incognito" = "Klepnutím se připojíte inkognito"; -/* No comment provided by engineer. */ -"Tap to start a new chat" = "Klepnutím na zahájíte nový chat"; - /* No comment provided by engineer. */ "TCP connection timeout" = "Časový limit připojení TCP"; @@ -3216,27 +3192,18 @@ /* No comment provided by engineer. */ "Update" = "Aktualizovat"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "Aktualizovat nastavení hostitelů .onion?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Aktualizovat přístupovou frázi databáze"; /* No comment provided by engineer. */ "Update network settings?" = "Aktualizovat nastavení sítě?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "Aktualizovat režim dopravní izolace?"; - /* rcv group event chat item */ "updated group profile" = "aktualizoval profil skupiny"; /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "Aktualizací nastavení se klient znovu připojí ke všem serverům."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "Aktualizace tohoto nastavení znovu připojí klienta ke všem serverům."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Zvýšit a otevřít chat"; @@ -3270,9 +3237,6 @@ /* No comment provided by engineer. */ "User profile" = "Profil uživatele"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "Použití hostitelů .onion vyžaduje kompatibilního poskytovatele VPN."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "Používat servery SimpleX Chat."; @@ -3387,9 +3351,6 @@ /* No comment provided by engineer. */ "Wrong passphrase!" = "Špatná přístupová fráze!"; -/* No comment provided by engineer. */ -"XFTP servers" = "XFTP servery"; - /* pref value */ "yes" = "ano"; @@ -3480,9 +3441,6 @@ /* No comment provided by engineer. */ "You could not be verified; please try again." = "Nemohli jste být ověřeni; Zkuste to prosím znovu."; -/* No comment provided by engineer. */ -"You have no chats" = "Nemáte žádné konverzace"; - /* No comment provided by engineer. */ "You have to enter passphrase every time the app starts - it is not stored on the device." = "Musíte zadat přístupovou frázi při každém spuštění aplikace - není uložena v zařízení."; @@ -3564,9 +3522,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Vaše chat profily"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "K dokončení připojení, musí být váš kontakt online.\nToto připojení můžete zrušit a kontakt odebrat (a zkusit to později s novým odkazem)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Kontakt odeslal soubor, který je větší než aktuálně podporovaná maximální velikost (%@)."; diff --git a/apps/ios/de.lproj/Localizable.strings b/apps/ios/de.lproj/Localizable.strings index b410f63f4c..736eb90442 100644 --- a/apps/ios/de.lproj/Localizable.strings +++ b/apps/ios/de.lproj/Localizable.strings @@ -491,6 +491,9 @@ /* No comment provided by engineer. */ "Allow sending disappearing messages." = "Das Senden von verschwindenden Nachrichten erlauben."; +/* No comment provided by engineer. */ +"Allow sharing" = "Teilen erlauben"; + /* No comment provided by engineer. */ "Allow to irreversibly delete sent messages. (24 hours)" = "Unwiederbringliches löschen von gesendeten Nachrichten erlauben. (24 Stunden)"; @@ -689,12 +692,15 @@ /* rcv group event chat item */ "blocked %@" = "%@ wurde blockiert"; -/* blocked chat item */ +/* marked deleted chat item preview text */ "blocked by admin" = "wurde vom Administrator blockiert"; /* No comment provided by engineer. */ "Blocked by admin" = "wurde vom Administrator blockiert"; +/* No comment provided by engineer. */ +"Blur media" = "Medium unscharf machen"; + /* No comment provided by engineer. */ "bold" = "fett"; @@ -828,6 +834,9 @@ /* No comment provided by engineer. */ "Chat database deleted" = "Chat-Datenbank gelöscht"; +/* No comment provided by engineer. */ +"Chat database exported" = "Chat-Datenbank wurde exportiert"; + /* No comment provided by engineer. */ "Chat database imported" = "Chat-Datenbank importiert"; @@ -1041,6 +1050,9 @@ /* chat list item title (it should not be shown */ "connection established" = "Verbindung hergestellt"; +/* No comment provided by engineer. */ +"Connection notifications" = "Verbindungsbenachrichtigungen"; + /* No comment provided by engineer. */ "Connection request sent!" = "Verbindungsanfrage wurde gesendet!"; @@ -1080,9 +1092,6 @@ /* notification */ "Contact is connected" = "Mit Ihrem Kontakt verbunden"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Ihr Kontakt ist noch nicht verbunden!"; - /* No comment provided by engineer. */ "Contact name" = "Kontaktname"; @@ -1281,6 +1290,9 @@ /* chat item action */ "Delete" = "Löschen"; +/* No comment provided by engineer. */ +"Delete %lld messages of members?" = "%lld Nachrichten der Mitglieder löschen?"; + /* No comment provided by engineer. */ "Delete %lld messages?" = "%lld Nachrichten löschen?"; @@ -1317,12 +1329,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Kontakt löschen"; -/* No comment provided by engineer. */ -"Delete Contact" = "Kontakt löschen"; - -/* No comment provided by engineer. */ -"Delete contact?\nThis cannot be undone!" = "Kontakt löschen?\nDies kann nicht rückgängig gemacht werden!"; - /* No comment provided by engineer. */ "Delete database" = "Datenbank löschen"; @@ -1377,9 +1383,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Alte Datenbank löschen?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Ausstehende Verbindung löschen"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Ausstehende Verbindung löschen?"; @@ -1434,9 +1437,15 @@ /* No comment provided by engineer. */ "Desktop devices" = "Desktop-Geräte"; +/* No comment provided by engineer. */ +"Destination server address of %@ is incompatible with forwarding server %@ settings." = "Adresse des Zielservers von %@ ist nicht kompatibel mit den Einstellungen des Weiterleitungsservers %@."; + /* snd error text */ "Destination server error: %@" = "Zielserver-Fehler: %@"; +/* No comment provided by engineer. */ +"Destination server version of %@ is incompatible with forwarding server %@." = "Die Version des Zielservers %@ ist nicht kompatibel mit dem Weiterleitungsserver %@."; + /* No comment provided by engineer. */ "Detailed statistics" = "Detaillierte Statistiken"; @@ -1485,6 +1494,9 @@ /* No comment provided by engineer. */ "disabled" = "deaktiviert"; +/* No comment provided by engineer. */ +"Disabled" = "Deaktiviert"; + /* No comment provided by engineer. */ "Disappearing message" = "Verschwindende Nachricht"; @@ -1632,6 +1644,9 @@ /* enabled status */ "enabled" = "Aktiviert"; +/* No comment provided by engineer. */ +"Enabled" = "Aktiviert"; + /* No comment provided by engineer. */ "Enabled for" = "Aktiviert für"; @@ -1773,6 +1788,9 @@ /* No comment provided by engineer. */ "Error changing setting" = "Fehler beim Ändern der Einstellung"; +/* No comment provided by engineer. */ +"Error connecting to forwarding server %@. Please try later." = "Fehler beim Verbinden mit dem Weiterleitungsserver %@. Bitte versuchen Sie es später erneut."; + /* No comment provided by engineer. */ "Error creating address" = "Fehler beim Erstellen der Adresse"; @@ -1803,9 +1821,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Fehler beim Löschen der Verbindung"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Fehler beim Löschen des Kontakts"; - /* No comment provided by engineer. */ "Error deleting database" = "Fehler beim Löschen der Datenbank"; @@ -2086,6 +2101,15 @@ /* No comment provided by engineer. */ "Forwarded from" = "Weitergeleitet aus"; +/* No comment provided by engineer. */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Weiterleitungsserver %@ konnte sich nicht mit dem Zielserver %@ verbinden. Bitte versuchen Sie es später erneut."; + +/* No comment provided by engineer. */ +"Forwarding server address is incompatible with network settings: %@." = "Adresse des Weiterleitungsservers ist nicht kompatibel mit den Netzwerkeinstellungen: %@."; + +/* No comment provided by engineer. */ +"Forwarding server version is incompatible with network settings: %@." = "Version des Weiterleitungsservers ist nicht kompatibel mit den Netzwerkeinstellungen: %@."; + /* snd error text */ "Forwarding server: %@\nDestination server error: %@" = "Weiterleitungsserver: %1$@\nZielserver Fehler: %2$@"; @@ -2635,6 +2659,12 @@ /* No comment provided by engineer. */ "Max 30 seconds, received instantly." = "Max. 30 Sekunden, sofort erhalten."; +/* No comment provided by engineer. */ +"Media & file servers" = "Medien- und Datei-Server"; + +/* blur media */ +"Medium" = "Medium"; + /* member role */ "member" = "Mitglied"; @@ -2699,10 +2729,7 @@ "Message reception" = "Nachrichtenempfang"; /* No comment provided by engineer. */ -"Message routing fallback" = "Fallback für das Nachrichten-Routing"; - -/* No comment provided by engineer. */ -"Message routing mode" = "Modus für das Nachrichten-Routing"; +"Message servers" = "Nachrichten-Server"; /* No comment provided by engineer. */ "Message source remains private." = "Die Nachrichtenquelle bleibt privat."; @@ -2932,6 +2959,9 @@ /* No comment provided by engineer. */ "Not compatible!" = "Nicht kompatibel!"; +/* No comment provided by engineer. */ +"Nothing selected" = "Nichts ausgewählt"; + /* No comment provided by engineer. */ "Notifications" = "Benachrichtigungen"; @@ -2977,10 +3007,10 @@ "One-time invitation link" = "Einmal-Einladungslink"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Für diese Verbindung werden Onion-Hosts benötigt. Dies erfordert die Aktivierung eines VPNs."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Für diese Verbindung werden Onion-Hosts benötigt.\nDies erfordert die Aktivierung eines VPNs."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Wenn Onion-Hosts verfügbar sind, werden sie verwendet. Dies erfordert die Aktivierung eines VPNs."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Wenn Onion-Hosts verfügbar sind, werden sie verwendet.\nDies erfordert die Aktivierung eines VPNs."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Onion-Hosts werden nicht verwendet."; @@ -3552,9 +3582,6 @@ /* chat item action */ "Reveal" = "Aufdecken"; -/* No comment provided by engineer. */ -"Revert" = "Zurückkehren"; - /* No comment provided by engineer. */ "Revoke" = "Widerrufen"; @@ -3588,6 +3615,9 @@ /* No comment provided by engineer. */ "Save and notify group members" = "Speichern und Gruppenmitglieder benachrichtigen"; +/* No comment provided by engineer. */ +"Save and reconnect" = "Speichern und neu verbinden"; + /* No comment provided by engineer. */ "Save and update group profile" = "Gruppen-Profil sichern und aktualisieren"; @@ -3699,9 +3729,12 @@ /* chat item text */ "security code changed" = "Sicherheitscode wurde geändert"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Auswählen"; +/* No comment provided by engineer. */ +"Selected %lld" = "%lld ausgewählt"; + /* No comment provided by engineer. */ "Selected chat preferences prohibit this message." = "Diese Nachricht ist wegen der gewählten Chat-Einstellungen nicht erlaubt."; @@ -3729,9 +3762,6 @@ /* No comment provided by engineer. */ "send direct message" = "Direktnachricht senden"; -/* No comment provided by engineer. */ -"Send direct message" = "Direktnachricht senden"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Eine Direktnachricht zum Verbinden senden"; @@ -3933,6 +3963,9 @@ /* No comment provided by engineer. */ "Share this 1-time invite link" = "Teilen Sie diesen Einmal-Einladungslink"; +/* No comment provided by engineer. */ +"Share to SimpleX" = "Mit SimpleX teilen"; + /* No comment provided by engineer. */ "Share with contacts" = "Mit Kontakten teilen"; @@ -4026,12 +4059,18 @@ /* No comment provided by engineer. */ "SMP server" = "SMP-Server"; +/* blur media */ +"Soft" = "Weich"; + /* No comment provided by engineer. */ -"SMP servers" = "SMP-Server"; +"Some file(s) were not exported:" = "Einzelne Datei(en) wurde(n) nicht exportiert:"; /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Während des Imports sind einige nicht schwerwiegende Fehler aufgetreten - in der Chat-Konsole finden Sie weitere Einzelheiten."; +/* No comment provided by engineer. */ +"Some non-fatal errors occurred during import:" = "Während des Imports traten ein paar nicht schwerwiegende Fehler auf:"; + /* notification title */ "Somebody" = "Jemand"; @@ -4098,6 +4137,9 @@ /* No comment provided by engineer. */ "strike" = "durchstreichen"; +/* blur media */ +"Strong" = "Hart"; + /* No comment provided by engineer. */ "Submit" = "Bestätigen"; @@ -4144,7 +4186,7 @@ "Tap to scan" = "Zum Scannen tippen"; /* No comment provided by engineer. */ -"Tap to start a new chat" = "Zum Starten eines neuen Chats tippen"; +"TCP connection" = "TCP-Verbindung"; /* No comment provided by engineer. */ "TCP connection timeout" = "Timeout der TCP-Verbindung"; @@ -4221,6 +4263,12 @@ /* No comment provided by engineer. */ "The message will be marked as moderated for all members." = "Diese Nachricht wird für alle Mitglieder als moderiert gekennzeichnet."; +/* No comment provided by engineer. */ +"The messages will be deleted for all members." = "Die Nachrichten werden für alle Mitglieder gelöscht werden."; + +/* No comment provided by engineer. */ +"The messages will be marked as moderated for all members." = "Die Nachrichten werden für alle Mitglieder als moderiert gekennzeichnet werden."; + /* No comment provided by engineer. */ "The next generation of private messaging" = "Die nächste Generation von privatem Messaging"; @@ -4411,7 +4459,7 @@ "Unknown error" = "Unbekannter Fehler"; /* No comment provided by engineer. */ -"unknown relays" = "Unbekannte Relais"; +"unknown servers" = "Unbekannte Relais"; /* No comment provided by engineer. */ "Unknown servers!" = "Unbekannte Server!"; @@ -4452,9 +4500,6 @@ /* No comment provided by engineer. */ "Update" = "Aktualisieren"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "Einstellung für .onion-Hosts aktualisieren?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Datenbank-Passwort aktualisieren"; @@ -4462,7 +4507,7 @@ "Update network settings?" = "Netzwerkeinstellungen aktualisieren?"; /* No comment provided by engineer. */ -"Update transport isolation mode?" = "Transport-Isolations-Modus aktualisieren?"; +"Update settings?" = "Einstellungen aktualisieren?"; /* rcv group event chat item */ "updated group profile" = "Aktualisiertes Gruppenprofil"; @@ -4473,9 +4518,6 @@ /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "Die Aktualisierung der Einstellungen wird den Client wieder mit allen Servern verbinden."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "Die Aktualisierung dieser Einstellung wird den Client wieder mit allen Servern verbinden."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Aktualisieren und den Chat öffnen"; @@ -4542,9 +4584,6 @@ /* No comment provided by engineer. */ "User selection" = "Benutzer-Auswahl"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "Für die Nutzung von .onion-Hosts sind kompatible VPN-Anbieter erforderlich."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "Verwendung von SimpleX-Chat-Servern."; @@ -4737,9 +4776,6 @@ /* No comment provided by engineer. */ "XFTP server" = "XFTP-Server"; -/* No comment provided by engineer. */ -"XFTP servers" = "XFTP-Server"; - /* pref value */ "yes" = "Ja"; @@ -4878,9 +4914,6 @@ /* No comment provided by engineer. */ "You have already requested connection!\nRepeat connection request?" = "Sie haben bereits ein Verbindungsanfrage beantragt!\nVerbindungsanfrage wiederholen?"; -/* No comment provided by engineer. */ -"You have no chats" = "Sie haben keine Chats"; - /* No comment provided by engineer. */ "You have to enter passphrase every time the app starts - it is not stored on the device." = "Sie müssen das Passwort jedes Mal eingeben, wenn die App startet. Es wird nicht auf dem Gerät gespeichert."; @@ -4896,6 +4929,12 @@ /* snd group event chat item */ "you left" = "Sie haben verlassen"; +/* No comment provided by engineer. */ +"You may migrate the exported database." = "Sie können die exportierte Datenbank migrieren."; + +/* No comment provided by engineer. */ +"You may save the exported archive." = "Sie können das exportierte Archiv speichern."; + /* 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." = "Sie dürfen die neueste Version Ihrer Chat-Datenbank NUR auf einem Gerät verwenden, andernfalls erhalten Sie möglicherweise keine Nachrichten mehr von einigen Ihrer Kontakte."; @@ -4971,9 +5010,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Ihre Chat-Profile"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Damit die Verbindung hergestellt werden kann, muss Ihr Kontakt online sein.\nSie können diese Verbindung abbrechen und den Kontakt entfernen (und es später nochmals mit einem neuen Link versuchen)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Ihr Kontakt hat eine Datei gesendet, die größer ist als die derzeit unterstützte maximale Größe (%@)."; diff --git a/apps/ios/es.lproj/Localizable.strings b/apps/ios/es.lproj/Localizable.strings index a84f8c0433..3f1e985df3 100644 --- a/apps/ios/es.lproj/Localizable.strings +++ b/apps/ios/es.lproj/Localizable.strings @@ -689,7 +689,7 @@ /* rcv group event chat item */ "blocked %@" = "ha bloqueado a %@"; -/* blocked chat item */ +/* marked deleted chat item preview text */ "blocked by admin" = "bloqueado por administrador"; /* No comment provided by engineer. */ @@ -1080,9 +1080,6 @@ /* notification */ "Contact is connected" = "El contacto está en línea"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "¡El contacto aun no se ha conectado!"; - /* No comment provided by engineer. */ "Contact name" = "Contacto"; @@ -1317,12 +1314,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Eliminar contacto"; -/* No comment provided by engineer. */ -"Delete Contact" = "Eliminar contacto"; - -/* No comment provided by engineer. */ -"Delete contact?\nThis cannot be undone!" = "¿Eliminar contacto?\n¡No podrá deshacerse!"; - /* No comment provided by engineer. */ "Delete database" = "Eliminar base de datos"; @@ -1377,9 +1368,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "¿Eliminar base de datos antigua?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Eliminar conexión pendiente"; - /* No comment provided by engineer. */ "Delete pending connection?" = "¿Eliminar conexión pendiente?"; @@ -1803,9 +1791,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Error al eliminar conexión"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Error al eliminar contacto"; - /* No comment provided by engineer. */ "Error deleting database" = "Error al eliminar base de datos"; @@ -2698,12 +2683,6 @@ /* No comment provided by engineer. */ "Message reception" = "Recepción de mensaje"; -/* No comment provided by engineer. */ -"Message routing fallback" = "Enrutamiento de mensajes alternativo"; - -/* No comment provided by engineer. */ -"Message routing mode" = "Modo de enrutamiento de mensajes"; - /* No comment provided by engineer. */ "Message source remains private." = "El autor del mensaje se mantiene privado."; @@ -2977,10 +2956,10 @@ "One-time invitation link" = "Enlace de invitación de un solo uso"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Se requieren hosts .onion para la conexión. Requiere activación de la VPN."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Se **requieren** hosts .onion para la conexión.\nRequiere activación de la VPN."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Se usarán hosts .onion si están disponibles. Requiere activación de la VPN."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Se usarán hosts .onion si están disponibles.\nRequiere activación de la VPN."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "No se usarán hosts .onion."; @@ -3552,9 +3531,6 @@ /* chat item action */ "Reveal" = "Revelar"; -/* No comment provided by engineer. */ -"Revert" = "Revertir"; - /* No comment provided by engineer. */ "Revoke" = "Revocar"; @@ -3699,7 +3675,7 @@ /* chat item text */ "security code changed" = "código de seguridad cambiado"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Seleccionar"; /* No comment provided by engineer. */ @@ -3729,9 +3705,6 @@ /* No comment provided by engineer. */ "send direct message" = "Enviar mensaje directo"; -/* No comment provided by engineer. */ -"Send direct message" = "Enviar mensaje directo"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Envia un mensaje para conectar"; @@ -4026,9 +3999,6 @@ /* No comment provided by engineer. */ "SMP server" = "Servidor SMP"; -/* No comment provided by engineer. */ -"SMP servers" = "Servidores SMP"; - /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Algunos errores no críticos ocurrieron durante la importación - para más detalles puedes ver la consola de Chat."; @@ -4143,9 +4113,6 @@ /* No comment provided by engineer. */ "Tap to scan" = "Pulsa para escanear"; -/* No comment provided by engineer. */ -"Tap to start a new chat" = "Pulsa para iniciar chat nuevo"; - /* No comment provided by engineer. */ "TCP connection timeout" = "Timeout de la conexión TCP"; @@ -4411,7 +4378,7 @@ "Unknown error" = "Error desconocido"; /* No comment provided by engineer. */ -"unknown relays" = "con servidores desconocidos"; +"unknown servers" = "con servidores desconocidos"; /* No comment provided by engineer. */ "Unknown servers!" = "¡Servidores desconocidos!"; @@ -4452,18 +4419,12 @@ /* No comment provided by engineer. */ "Update" = "Actualizar"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "¿Actualizar la configuración de los hosts .onion?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Actualizar contraseña de la base de datos"; /* No comment provided by engineer. */ "Update network settings?" = "¿Actualizar la configuración de red?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "¿Actualizar el modo de aislamiento de transporte?"; - /* rcv group event chat item */ "updated group profile" = "ha actualizado el perfil del grupo"; @@ -4473,9 +4434,6 @@ /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "Al actualizar la configuración el cliente se reconectará a todos los servidores."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "Al actualizar esta configuración el cliente se reconectará a todos los servidores."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Actualizar y abrir Chat"; @@ -4542,9 +4500,6 @@ /* No comment provided by engineer. */ "User selection" = "Selección de usuarios"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "Usar hosts .onion requiere un proveedor VPN compatible."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "Usar servidores SimpleX Chat."; @@ -4737,9 +4692,6 @@ /* No comment provided by engineer. */ "XFTP server" = "Servidor XFTP"; -/* No comment provided by engineer. */ -"XFTP servers" = "Servidores XFTP"; - /* pref value */ "yes" = "sí"; @@ -4878,9 +4830,6 @@ /* No comment provided by engineer. */ "You have already requested connection!\nRepeat connection request?" = "Ya has solicitado la conexión\n¿Repetir solicitud?"; -/* No comment provided by engineer. */ -"You have no chats" = "No tienes chats"; - /* No comment provided by engineer. */ "You have to enter passphrase every time the app starts - it is not stored on the device." = "La contraseña no se almacena en el dispositivo, tienes que introducirla cada vez que inicies la aplicación."; @@ -4971,9 +4920,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Mis perfiles"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "El contacto debe estar en línea para completar la conexión.\nPuedes cancelarla y eliminar el contacto (e intentarlo más tarde con un enlace nuevo)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "El contacto ha enviado un archivo mayor al máximo admitido (%@)."; diff --git a/apps/ios/fi.lproj/Localizable.strings b/apps/ios/fi.lproj/Localizable.strings index b9ea0024c5..55a2f0b7d0 100644 --- a/apps/ios/fi.lproj/Localizable.strings +++ b/apps/ios/fi.lproj/Localizable.strings @@ -768,9 +768,6 @@ /* notification */ "Contact is connected" = "Kontakti on yhdistetty"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Kontaktia ei ole vielä yhdistetty!"; - /* No comment provided by engineer. */ "Contact name" = "Kontaktin nimi"; @@ -954,9 +951,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Poista kontakti"; -/* No comment provided by engineer. */ -"Delete Contact" = "Poista kontakti"; - /* No comment provided by engineer. */ "Delete database" = "Poista tietokanta"; @@ -1008,9 +1002,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Poista vanha tietokanta?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Poista vireillä oleva yhteys"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Poistetaanko odottava yhteys?"; @@ -1329,9 +1320,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Virhe yhteyden poistamisessa"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Virhe kontaktin poistamisessa"; - /* No comment provided by engineer. */ "Error deleting database" = "Virhe tietokannan poistamisessa"; @@ -2188,10 +2176,10 @@ "One-time invitation link" = "Kertakutsulinkki"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Yhteyden muodostamiseen tarvitaan Onion-isäntiä. Edellyttää VPN:n sallimista."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Yhteyden muodostamiseen tarvitaan Onion-isäntiä.\nEdellyttää VPN:n sallimista."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Onion-isäntiä käytetään, kun niitä on saatavilla. Edellyttää VPN:n sallimista."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Onion-isäntiä käytetään, kun niitä on saatavilla.\nEdellyttää VPN:n sallimista."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Onion-isäntiä ei käytetä."; @@ -2565,9 +2553,6 @@ /* chat item action */ "Reveal" = "Paljasta"; -/* No comment provided by engineer. */ -"Revert" = "Palauta"; - /* No comment provided by engineer. */ "Revoke" = "Peruuta"; @@ -2670,7 +2655,7 @@ /* chat item text */ "security code changed" = "turvakoodi on muuttunut"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Valitse"; /* No comment provided by engineer. */ @@ -2694,9 +2679,6 @@ /* No comment provided by engineer. */ "Send delivery receipts to" = "Lähetä toimituskuittaukset vastaanottajalle"; -/* No comment provided by engineer. */ -"Send direct message" = "Lähetä yksityisviesti"; - /* No comment provided by engineer. */ "Send disappearing message" = "Lähetä katoava viesti"; @@ -2883,9 +2865,6 @@ /* No comment provided by engineer. */ "Small groups (max 20)" = "Pienryhmät (max 20)"; -/* No comment provided by engineer. */ -"SMP servers" = "SMP-palvelimet"; - /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Tuonnin aikana tapahtui joitakin ei-vakavia virheitä – saatat nähdä Chat-konsolissa lisätietoja."; @@ -2961,9 +2940,6 @@ /* No comment provided by engineer. */ "Tap to join incognito" = "Napauta liittyäksesi incognito-tilassa"; -/* No comment provided by engineer. */ -"Tap to start a new chat" = "Aloita uusi keskustelu napauttamalla"; - /* No comment provided by engineer. */ "TCP connection timeout" = "TCP-yhteyden aikakatkaisu"; @@ -3174,27 +3150,18 @@ /* No comment provided by engineer. */ "Update" = "Päivitä"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "Päivitä .onion-isäntien asetus?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Päivitä tietokannan tunnuslause"; /* No comment provided by engineer. */ "Update network settings?" = "Päivitä verkkoasetukset?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "Päivitä kuljetuksen eristystila?"; - /* rcv group event chat item */ "updated group profile" = "päivitetty ryhmäprofiili"; /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "Asetusten päivittäminen yhdistää asiakkaan uudelleen kaikkiin palvelimiin."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "Tämän asetuksen päivittäminen yhdistää asiakkaan uudelleen kaikkiin palvelimiin."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Päivitä ja avaa keskustelu"; @@ -3228,9 +3195,6 @@ /* No comment provided by engineer. */ "User profile" = "Käyttäjäprofiili"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = ".onion-isäntien käyttäminen vaatii yhteensopivan VPN-palveluntarjoajan."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "Käyttää SimpleX Chat -palvelimia."; @@ -3345,9 +3309,6 @@ /* No comment provided by engineer. */ "Wrong passphrase!" = "Väärä tunnuslause!"; -/* No comment provided by engineer. */ -"XFTP servers" = "XFTP-palvelimet"; - /* pref value */ "yes" = "kyllä"; @@ -3438,9 +3399,6 @@ /* No comment provided by engineer. */ "You could not be verified; please try again." = "Sinua ei voitu todentaa; yritä uudelleen."; -/* No comment provided by engineer. */ -"You have no chats" = "Sinulla ei ole keskusteluja"; - /* No comment provided by engineer. */ "You have to enter passphrase every time the app starts - it is not stored on the device." = "Sinun on annettava tunnuslause aina, kun sovellus käynnistyy - sitä ei tallenneta laitteeseen."; @@ -3522,9 +3480,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Keskusteluprofiilisi"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Kontaktin tulee olla online-tilassa, jotta yhteys voidaan muodostaa.\nVoit peruuttaa tämän yhteyden ja poistaa kontaktin (ja yrittää myöhemmin uudella linkillä)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Yhteyshenkilösi lähetti tiedoston, joka on suurempi kuin tällä hetkellä tuettu enimmäiskoko (%@)."; diff --git a/apps/ios/fr.lproj/Localizable.strings b/apps/ios/fr.lproj/Localizable.strings index 272c3bb410..9683af19ac 100644 --- a/apps/ios/fr.lproj/Localizable.strings +++ b/apps/ios/fr.lproj/Localizable.strings @@ -491,6 +491,9 @@ /* No comment provided by engineer. */ "Allow sending disappearing messages." = "Autorise l’envoi de messages éphémères."; +/* No comment provided by engineer. */ +"Allow sharing" = "Autoriser le partage"; + /* No comment provided by engineer. */ "Allow to irreversibly delete sent messages. (24 hours)" = "Autoriser la suppression irréversible de messages envoyés. (24 heures)"; @@ -689,12 +692,15 @@ /* rcv group event chat item */ "blocked %@" = "%@ bloqué"; -/* blocked chat item */ +/* marked deleted chat item preview text */ "blocked by admin" = "bloqué par l'administrateur"; /* No comment provided by engineer. */ "Blocked by admin" = "Bloqué par l'administrateur"; +/* No comment provided by engineer. */ +"Blur media" = "Flouter les médias"; + /* No comment provided by engineer. */ "bold" = "gras"; @@ -1041,6 +1047,9 @@ /* chat list item title (it should not be shown */ "connection established" = "connexion établie"; +/* No comment provided by engineer. */ +"Connection notifications" = "Notifications de connexion"; + /* No comment provided by engineer. */ "Connection request sent!" = "Demande de connexion envoyée !"; @@ -1080,9 +1089,6 @@ /* notification */ "Contact is connected" = "Le contact est connecté"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Le contact n'est pas encore connecté !"; - /* No comment provided by engineer. */ "Contact name" = "Nom du contact"; @@ -1281,6 +1287,9 @@ /* chat item action */ "Delete" = "Supprimer"; +/* No comment provided by engineer. */ +"Delete %lld messages of members?" = "Supprimer %lld messages de membres ?"; + /* No comment provided by engineer. */ "Delete %lld messages?" = "Supprimer %lld messages ?"; @@ -1317,12 +1326,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Supprimer le contact"; -/* No comment provided by engineer. */ -"Delete Contact" = "Supprimer le contact"; - -/* No comment provided by engineer. */ -"Delete contact?\nThis cannot be undone!" = "Supprimer le contact ?\nCette opération ne peut être annulée !"; - /* No comment provided by engineer. */ "Delete database" = "Supprimer la base de données"; @@ -1377,9 +1380,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Supprimer l'ancienne base de données ?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Supprimer la connexion en attente"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Supprimer la connexion en attente ?"; @@ -1434,9 +1434,15 @@ /* No comment provided by engineer. */ "Desktop devices" = "Appareils de bureau"; +/* No comment provided by engineer. */ +"Destination server address of %@ is incompatible with forwarding server %@ settings." = "L'adresse du serveur de destination %@ est incompatible avec les paramètres du serveur de redirection %@."; + /* snd error text */ "Destination server error: %@" = "Erreur du serveur de destination : %@"; +/* No comment provided by engineer. */ +"Destination server version of %@ is incompatible with forwarding server %@." = "La version du serveur de destination %@ est incompatible avec le serveur de redirection %@."; + /* No comment provided by engineer. */ "Detailed statistics" = "Statistiques détaillées"; @@ -1485,6 +1491,9 @@ /* No comment provided by engineer. */ "disabled" = "désactivé"; +/* No comment provided by engineer. */ +"Disabled" = "Désactivé"; + /* No comment provided by engineer. */ "Disappearing message" = "Message éphémère"; @@ -1632,6 +1641,9 @@ /* enabled status */ "enabled" = "activé"; +/* No comment provided by engineer. */ +"Enabled" = "Activé"; + /* No comment provided by engineer. */ "Enabled for" = "Activé pour"; @@ -1773,6 +1785,9 @@ /* No comment provided by engineer. */ "Error changing setting" = "Erreur de changement de paramètre"; +/* No comment provided by engineer. */ +"Error connecting to forwarding server %@. Please try later." = "Erreur de connexion au serveur de redirection %@. Veuillez réessayer plus tard."; + /* No comment provided by engineer. */ "Error creating address" = "Erreur lors de la création de l'adresse"; @@ -1803,9 +1818,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Erreur lors de la suppression de la connexion"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Erreur lors de la suppression du contact"; - /* No comment provided by engineer. */ "Error deleting database" = "Erreur lors de la suppression de la base de données"; @@ -2086,6 +2098,15 @@ /* No comment provided by engineer. */ "Forwarded from" = "Transféré depuis"; +/* No comment provided by engineer. */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Le serveur de redirection %@ n'a pas réussi à se connecter au serveur de destination %@. Veuillez réessayer plus tard."; + +/* No comment provided by engineer. */ +"Forwarding server address is incompatible with network settings: %@." = "L'adresse du serveur de redirection est incompatible avec les paramètres du réseau : %@."; + +/* No comment provided by engineer. */ +"Forwarding server version is incompatible with network settings: %@." = "La version du serveur de redirection est incompatible avec les paramètres du réseau : %@."; + /* snd error text */ "Forwarding server: %@\nDestination server error: %@" = "Serveur de transfert : %1$@\nErreur du serveur de destination : %2$@"; @@ -2635,6 +2656,9 @@ /* No comment provided by engineer. */ "Max 30 seconds, received instantly." = "Max 30 secondes, réception immédiate."; +/* blur media */ +"Medium" = "Modéré"; + /* member role */ "member" = "membre"; @@ -2698,12 +2722,6 @@ /* No comment provided by engineer. */ "Message reception" = "Réception de message"; -/* No comment provided by engineer. */ -"Message routing fallback" = "Rabattement du routage des messages"; - -/* No comment provided by engineer. */ -"Message routing mode" = "Mode de routage des messages"; - /* No comment provided by engineer. */ "Message source remains private." = "La source du message reste privée."; @@ -2932,6 +2950,9 @@ /* No comment provided by engineer. */ "Not compatible!" = "Non compatible !"; +/* No comment provided by engineer. */ +"Nothing selected" = "Aucune sélection"; + /* No comment provided by engineer. */ "Notifications" = "Notifications"; @@ -2977,10 +2998,10 @@ "One-time invitation link" = "Lien d'invitation unique"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Les hôtes .onion seront nécessaires pour la connexion. Nécessite l'activation d'un VPN."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Les hôtes .onion seront **nécessaires** pour la connexion.\nNécessite l'activation d'un VPN."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Les hôtes .onion seront utilisés dès que possible. Nécessite l'activation d'un VPN."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Les hôtes .onion seront utilisés dès que possible.\nNécessite l'activation d'un VPN."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Les hôtes .onion ne seront pas utilisés."; @@ -3552,9 +3573,6 @@ /* chat item action */ "Reveal" = "Révéler"; -/* No comment provided by engineer. */ -"Revert" = "Revenir en arrière"; - /* No comment provided by engineer. */ "Revoke" = "Révoquer"; @@ -3699,9 +3717,12 @@ /* chat item text */ "security code changed" = "code de sécurité modifié"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Choisir"; +/* No comment provided by engineer. */ +"Selected %lld" = "%lld sélectionné(s)"; + /* No comment provided by engineer. */ "Selected chat preferences prohibit this message." = "Les préférences de chat sélectionnées interdisent ce message."; @@ -3729,9 +3750,6 @@ /* No comment provided by engineer. */ "send direct message" = "envoyer un message direct"; -/* No comment provided by engineer. */ -"Send direct message" = "Envoyer un message direct"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Envoyer un message direct pour vous connecter"; @@ -3933,6 +3951,9 @@ /* No comment provided by engineer. */ "Share this 1-time invite link" = "Partager ce lien d'invitation unique"; +/* No comment provided by engineer. */ +"Share to SimpleX" = "Partager sur SimpleX"; + /* No comment provided by engineer. */ "Share with contacts" = "Partager avec vos contacts"; @@ -3963,6 +3984,9 @@ /* No comment provided by engineer. */ "Show:" = "Afficher :"; +/* No comment provided by engineer. */ +"SimpleX" = "SimpleX"; + /* No comment provided by engineer. */ "SimpleX address" = "Adresse SimpleX"; @@ -4023,8 +4047,8 @@ /* No comment provided by engineer. */ "SMP server" = "Serveur SMP"; -/* No comment provided by engineer. */ -"SMP servers" = "Serveurs SMP"; +/* blur media */ +"Soft" = "Léger"; /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Des erreurs non fatales se sont produites lors de l'importation - vous pouvez consulter la console de chat pour plus de détails."; @@ -4095,6 +4119,9 @@ /* No comment provided by engineer. */ "strike" = "barré"; +/* blur media */ +"Strong" = "Fort"; + /* No comment provided by engineer. */ "Submit" = "Soumettre"; @@ -4140,9 +4167,6 @@ /* No comment provided by engineer. */ "Tap to scan" = "Appuyez pour scanner"; -/* No comment provided by engineer. */ -"Tap to start a new chat" = "Appuyez ici pour démarrer une nouvelle discussion"; - /* No comment provided by engineer. */ "TCP connection timeout" = "Délai de connexion TCP"; @@ -4218,6 +4242,12 @@ /* No comment provided by engineer. */ "The message will be marked as moderated for all members." = "Le message sera marqué comme modéré pour tous les membres."; +/* No comment provided by engineer. */ +"The messages will be deleted for all members." = "Les messages seront supprimés pour tous les membres."; + +/* No comment provided by engineer. */ +"The messages will be marked as moderated for all members." = "Les messages seront marqués comme modérés pour tous les membres."; + /* No comment provided by engineer. */ "The next generation of private messaging" = "La nouvelle génération de messagerie privée"; @@ -4408,7 +4438,7 @@ "Unknown error" = "Erreur inconnue"; /* No comment provided by engineer. */ -"unknown relays" = "relais inconnus"; +"unknown servers" = "relais inconnus"; /* No comment provided by engineer. */ "Unknown servers!" = "Serveurs inconnus !"; @@ -4449,18 +4479,12 @@ /* No comment provided by engineer. */ "Update" = "Mise à jour"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "Mettre à jour le paramètre des hôtes .onion ?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Mise à jour de la phrase secrète de la base de données"; /* No comment provided by engineer. */ "Update network settings?" = "Mettre à jour les paramètres réseau ?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "Mettre à jour le mode d'isolement du transport ?"; - /* rcv group event chat item */ "updated group profile" = "mise à jour du profil de groupe"; @@ -4470,9 +4494,6 @@ /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "La mise à jour des ces paramètres reconnectera le client à tous les serveurs."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "La mise à jour de ce paramètre reconnectera le client à tous les serveurs."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Mettre à niveau et ouvrir le chat"; @@ -4539,9 +4560,6 @@ /* No comment provided by engineer. */ "User selection" = "Sélection de l'utilisateur"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "L'utilisation des hôtes .onion nécessite un fournisseur VPN compatible."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "Vous utilisez les serveurs SimpleX."; @@ -4734,9 +4752,6 @@ /* No comment provided by engineer. */ "XFTP server" = "Serveur XFTP"; -/* No comment provided by engineer. */ -"XFTP servers" = "Serveurs XFTP"; - /* pref value */ "yes" = "oui"; @@ -4875,9 +4890,6 @@ /* No comment provided by engineer. */ "You have already requested connection!\nRepeat connection request?" = "Vous avez déjà demandé une connexion !\nRépéter la demande de connexion ?"; -/* No comment provided by engineer. */ -"You have no chats" = "Vous n'avez aucune discussion"; - /* No comment provided by engineer. */ "You have to enter passphrase every time the app starts - it is not stored on the device." = "Vous devez saisir la phrase secrète à chaque fois que l'application démarre - elle n'est pas stockée sur l'appareil."; @@ -4968,9 +4980,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Vos profils de chat"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Votre contact a besoin d'être en ligne pour completer la connexion.\nVous pouvez annuler la connexion et supprimer le contact (et réessayer plus tard avec un autre lien)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Votre contact a envoyé un fichier plus grand que la taille maximale supportée actuellement(%@)."; diff --git a/apps/ios/hu.lproj/Localizable.strings b/apps/ios/hu.lproj/Localizable.strings index 3027e1df3f..9869693857 100644 --- a/apps/ios/hu.lproj/Localizable.strings +++ b/apps/ios/hu.lproj/Localizable.strings @@ -95,7 +95,7 @@ "**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." = "**Javasolt**: az eszköztoken és az értesítések elküldésre kerülnek a SimpleX Chat értesítési kiszolgálóra, kivéve az üzenet tartalma, mérete vagy az, hogy kitől származik."; /* No comment provided by engineer. */ -"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Figyelmeztetés**: Az azonnali push-értesítésekhez a kulcstárolóban tárolt jelmondat megadása szükséges."; +"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Figyelmeztetés**: Az azonnali push-értesítésekhez a kulcstartóban tárolt jelmondat megadása szükséges."; /* No comment provided by engineer. */ "**Warning**: the archive will be removed." = "**Figyelem**: az archívum törlésre kerül."; @@ -474,7 +474,7 @@ "Allow disappearing messages only if your contact allows it to you." = "Az eltűnő üzenetek küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi az ön számára."; /* No comment provided by engineer. */ -"Allow downgrade" = "Korábbi verzióra történő visszatérés engedélyezése"; +"Allow downgrade" = "Visszafejlesztés engedélyezése"; /* No comment provided by engineer. */ "Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Az üzenetek végleges törlése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi. (24 óra)"; @@ -491,6 +491,9 @@ /* No comment provided by engineer. */ "Allow sending disappearing messages." = "Az eltűnő üzenetek küldése engedélyezve van."; +/* No comment provided by engineer. */ +"Allow sharing" = "Megosztás engedélyezése"; + /* No comment provided by engineer. */ "Allow to irreversibly delete sent messages. (24 hours)" = "Elküldött üzenetek végleges törlésének engedélyezése. (24 óra)"; @@ -689,12 +692,15 @@ /* rcv group event chat item */ "blocked %@" = "letiltotta őt: %@"; -/* blocked chat item */ +/* marked deleted chat item preview text */ "blocked by admin" = "letiltva az admin által"; /* No comment provided by engineer. */ "Blocked by admin" = "Letiltva az admin által"; +/* No comment provided by engineer. */ +"Blur media" = "Média elhomályosítása"; + /* No comment provided by engineer. */ "bold" = "félkövér"; @@ -828,6 +834,9 @@ /* No comment provided by engineer. */ "Chat database deleted" = "Csevegési adatbázis törölve"; +/* No comment provided by engineer. */ +"Chat database exported" = "Csevegési adatbázis exportálva"; + /* No comment provided by engineer. */ "Chat database imported" = "Csevegési adatbázis importálva"; @@ -919,7 +928,7 @@ "Confirm" = "Megerősítés"; /* No comment provided by engineer. */ -"Confirm database upgrades" = "Adatbázis frissítés megerősítése"; +"Confirm database upgrades" = "Adatbázis fejlesztésének megerősítése"; /* No comment provided by engineer. */ "Confirm files from unknown servers." = "Ismeretlen kiszolgálókról származó fájlok jóváhagyása."; @@ -1041,6 +1050,9 @@ /* chat list item title (it should not be shown */ "connection established" = "kapcsolat létrehozva"; +/* No comment provided by engineer. */ +"Connection notifications" = "Kapcsolódási értesítések"; + /* No comment provided by engineer. */ "Connection request sent!" = "Kapcsolódási kérés elküldve!"; @@ -1080,9 +1092,6 @@ /* notification */ "Contact is connected" = "Ismerőse kapcsolódott"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Az ismerőse még nem kapcsolódott!"; - /* No comment provided by engineer. */ "Contact name" = "Ismerős neve"; @@ -1198,13 +1207,13 @@ "Dark mode colors" = "Sötét mód színei"; /* No comment provided by engineer. */ -"Database downgrade" = "Visszatérés a korábbi adatbázis verzióra"; +"Database downgrade" = "Adatbázis visszafejlesztése"; /* No comment provided by engineer. */ "Database encrypted!" = "Adatbázis titkosítva!"; /* No comment provided by engineer. */ -"Database encryption passphrase will be updated and stored in the keychain.\n" = "Az adatbázis titkosítási jelmondata frissül és tárolódik a kulcstárolóban.\n"; +"Database encryption passphrase will be updated and stored in the keychain.\n" = "Az adatbázis titkosítási jelmondata frissül és tárolódik a kulcstartóban.\n"; /* No comment provided by engineer. */ "Database encryption passphrase will be updated.\n" = "Adatbázis titkosítási jelmondat frissítve lesz.\n"; @@ -1234,10 +1243,10 @@ "Database passphrase & export" = "Adatbázis jelmondat és exportálás"; /* No comment provided by engineer. */ -"Database passphrase is different from saved in the keychain." = "Az adatbázis jelmondata eltér a kulcstárlóban mentettől."; +"Database passphrase is different from saved in the keychain." = "Az adatbázis jelmondata eltér a kulcstartóban mentettől."; /* No comment provided by engineer. */ -"Database passphrase is required to open chat." = "Adatbázis jelmondat szükséges a csevegés megnyitásához."; +"Database passphrase is required to open chat." = "A csevegés megnyitásához adja meg az adatbázis jelmondatát."; /* No comment provided by engineer. */ "Database upgrade" = "Adatbázis fejlesztése"; @@ -1246,7 +1255,7 @@ "database version is newer than the app, but no down migration for: %@" = "az adatbázis verziója újabb, mint az alkalmazásé, de nincs visszafelé átköltöztetés ehhez: %@"; /* No comment provided by engineer. */ -"Database will be encrypted and the passphrase stored in the keychain.\n" = "Az adatbázis titkosítva lesz, a jelmondat pedig a kulcstárolóban lesz tárolva.\n"; +"Database will be encrypted and the passphrase stored in the keychain.\n" = "Az adatbázis titkosítva lesz, a jelmondat pedig a kulcstartóban lesz tárolva.\n"; /* No comment provided by engineer. */ "Database will be encrypted.\n" = "Az adatbázis titkosításra kerül.\n"; @@ -1281,6 +1290,9 @@ /* chat item action */ "Delete" = "Törlés"; +/* No comment provided by engineer. */ +"Delete %lld messages of members?" = "Tagok %lld üzenetének törlése?"; + /* No comment provided by engineer. */ "Delete %lld messages?" = "Töröl %lld üzenetet?"; @@ -1317,12 +1329,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Ismerős törlése"; -/* No comment provided by engineer. */ -"Delete Contact" = "Ismerős törlése"; - -/* No comment provided by engineer. */ -"Delete contact?\nThis cannot be undone!" = "Ismerős törlése?\nEz a művelet nem vonható vissza!"; - /* No comment provided by engineer. */ "Delete database" = "Adatbázis törlése"; @@ -1377,9 +1383,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Régi adatbázis törlése?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Függőben lévő kapcsolat törlése"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Függő kapcsolatfelvételi kérések törlése?"; @@ -1434,9 +1437,15 @@ /* No comment provided by engineer. */ "Desktop devices" = "Számítógépek"; +/* No comment provided by engineer. */ +"Destination server address of %@ is incompatible with forwarding server %@ settings." = "A(z) %@ célkiszolgáló címe nem kompatibilis a(z) %@ továbbító kiszolgáló beállításaival."; + /* snd error text */ "Destination server error: %@" = "Célkiszolgáló hiba: %@"; +/* No comment provided by engineer. */ +"Destination server version of %@ is incompatible with forwarding server %@." = "A(z) %@ célkiszolgáló verziója nem kompatibilis a(z) %@ továbbító kiszolgálóval."; + /* No comment provided by engineer. */ "Detailed statistics" = "Részletes statisztikák"; @@ -1485,6 +1494,9 @@ /* No comment provided by engineer. */ "disabled" = "letiltva"; +/* No comment provided by engineer. */ +"Disabled" = "Letiltva"; + /* No comment provided by engineer. */ "Disappearing message" = "Eltűnő üzenet"; @@ -1540,7 +1552,7 @@ "Don't show again" = "Ne mutasd újra"; /* No comment provided by engineer. */ -"Downgrade and open chat" = "Visszatérés a korábbi verzióra és a csevegés megnyitása"; +"Downgrade and open chat" = "Visszafejlesztés és a csevegés megnyitása"; /* chat item action */ "Download" = "Letöltés"; @@ -1632,6 +1644,9 @@ /* enabled status */ "enabled" = "engedélyezve"; +/* No comment provided by engineer. */ +"Enabled" = "Engedélyezve"; + /* No comment provided by engineer. */ "Enabled for" = "Engedélyezve"; @@ -1669,7 +1684,7 @@ "Encrypted message: database migration error" = "Titkosított üzenet: adatbázis-átköltöztetés hiba"; /* notification */ -"Encrypted message: keychain error" = "Titkosított üzenet: kulcstároló hiba"; +"Encrypted message: keychain error" = "Titkosított üzenet: kulcstartó hiba"; /* notification */ "Encrypted message: no passphrase" = "Titkosított üzenet: nincs jelmondat"; @@ -1773,6 +1788,9 @@ /* No comment provided by engineer. */ "Error changing setting" = "Hiba a beállítás megváltoztatásakor"; +/* No comment provided by engineer. */ +"Error connecting to forwarding server %@. Please try later." = "Hiba a(z) %@ továbbító kiszolgálóhoz való kapcsolódáskor. Próbálja meg később."; + /* No comment provided by engineer. */ "Error creating address" = "Hiba a cím létrehozásakor"; @@ -1803,9 +1821,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Hiba a kapcsolat törlésekor"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Hiba az ismerős törlésekor"; - /* No comment provided by engineer. */ "Error deleting database" = "Hiba az adatbázis törlésekor"; @@ -1876,7 +1891,7 @@ "Error saving passcode" = "Hiba a jelkód mentése közben"; /* No comment provided by engineer. */ -"Error saving passphrase to keychain" = "Hiba a jelmondat kulcstárolóba történő mentésekor"; +"Error saving passphrase to keychain" = "Hiba a jelmondat kulcstartóba történő mentésekor"; /* when migrating */ "Error saving settings" = "Hiba a beállítások mentésekor"; @@ -2086,6 +2101,15 @@ /* No comment provided by engineer. */ "Forwarded from" = "Továbbítva innen:"; +/* No comment provided by engineer. */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "A(z) %@ továbbító kiszolgáló nem tudott csatlakozni a(z) %@ célkiszolgálóhoz. Próbálja meg később."; + +/* No comment provided by engineer. */ +"Forwarding server address is incompatible with network settings: %@." = "A továbbító kiszolgáló címe nem kompatibilis a hálózati beállításokkal: %@."; + +/* No comment provided by engineer. */ +"Forwarding server version is incompatible with network settings: %@." = "A továbbító kiszolgáló verziója nem kompatibilis a hálózati beállításokkal: %@."; + /* snd error text */ "Forwarding server: %@\nDestination server error: %@" = "Továbbító kiszolgáló: %1$@\nCélkiszolgáló hiba:%2$@"; @@ -2459,10 +2483,10 @@ "invited via your group link" = "meghíva az ön csoport hivatkozásán keresztül"; /* No comment provided by engineer. */ -"iOS Keychain is used to securely store passphrase - it allows receiving push notifications." = "Az iOS kulcstár a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását."; +"iOS Keychain is used to securely store passphrase - it allows receiving push notifications." = "Az iOS kulcstartó a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását."; /* No comment provided by engineer. */ -"iOS Keychain will be used to securely store passphrase after you restart the app or change passphrase - it will allow receiving push notifications." = "Az iOS kulcstár az alkalmazás újraindítása, vagy a jelmondat módosítása után a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását."; +"iOS Keychain will be used to securely store passphrase after you restart the app or change passphrase - it will allow receiving push notifications." = "Az iOS kulcstartó az alkalmazás újraindítása, vagy a jelmondat módosítása után a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását."; /* No comment provided by engineer. */ "Irreversible message deletion" = "Végleges üzenettörlés"; @@ -2534,10 +2558,10 @@ "Keep your connections" = "Kapcsolatok megtartása"; /* No comment provided by engineer. */ -"Keychain error" = "Kulcstároló hiba"; +"Keychain error" = "Kulcstartó hiba"; /* No comment provided by engineer. */ -"KeyChain error" = "Kulcstároló hiba"; +"KeyChain error" = "Kulcstartó hiba"; /* No comment provided by engineer. */ "Large file!" = "Nagy fájl!"; @@ -2635,6 +2659,12 @@ /* No comment provided by engineer. */ "Max 30 seconds, received instantly." = "Max. 30 másodperc, azonnal érkezett."; +/* No comment provided by engineer. */ +"Media & file servers" = "Média és fájlkiszolgálók"; + +/* blur media */ +"Medium" = "Közepes"; + /* member role */ "member" = "tag"; @@ -2699,10 +2729,7 @@ "Message reception" = "Üzenetjelentés"; /* No comment provided by engineer. */ -"Message routing fallback" = "Üzenet útválasztási tartalék"; - -/* No comment provided by engineer. */ -"Message routing mode" = "Üzenet útválasztási mód"; +"Message servers" = "Üzenetkiszolgálók"; /* No comment provided by engineer. */ "Message source remains private." = "Az üzenet forrása titokban marad."; @@ -2932,6 +2959,9 @@ /* No comment provided by engineer. */ "Not compatible!" = "Nem kompatibilis!"; +/* No comment provided by engineer. */ +"Nothing selected" = "Semmi sincs kiválasztva"; + /* No comment provided by engineer. */ "Notifications" = "Értesítések"; @@ -2977,10 +3007,10 @@ "One-time invitation link" = "Egyszer használatos meghívó hivatkozás"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "A kapcsolódáshoz Onion kiszolgálókra lesz szükség. VPN engedélyezése szükséges."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "A kapcsolódáshoz Onion kiszolgálókra lesz szükség.\nVPN engedélyezése szükséges."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Onion kiszolgálók használata, ha azok rendelkezésre állnak. VPN engedélyezése szükséges."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Onion kiszolgálók használata, ha azok rendelkezésre állnak.\nVPN engedélyezése szükséges."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Onion kiszolgálók nem lesznek használva."; @@ -3460,7 +3490,7 @@ "Remove member?" = "Biztosan eltávolítja?"; /* No comment provided by engineer. */ -"Remove passphrase from keychain?" = "Jelmondat eltávolítása a kulcstárolóból?"; +"Remove passphrase from keychain?" = "Jelmondat eltávolítása a kulcstartóból?"; /* No comment provided by engineer. */ "removed" = "eltávolítva"; @@ -3505,7 +3535,7 @@ "Reply" = "Válasz"; /* No comment provided by engineer. */ -"Required" = "Megkövetelt"; +"Required" = "Szükséges"; /* No comment provided by engineer. */ "Reset" = "Alaphelyzetbe állítás"; @@ -3552,9 +3582,6 @@ /* chat item action */ "Reveal" = "Felfedés"; -/* No comment provided by engineer. */ -"Revert" = "Visszaállítás"; - /* No comment provided by engineer. */ "Revoke" = "Visszavonás"; @@ -3588,6 +3615,9 @@ /* No comment provided by engineer. */ "Save and notify group members" = "Mentés és a csoporttagok értesítése"; +/* No comment provided by engineer. */ +"Save and reconnect" = "Mentés és újrakapcsolódás"; + /* No comment provided by engineer. */ "Save and update group profile" = "Mentés és csoportprofil frissítése"; @@ -3604,7 +3634,7 @@ "Save passphrase and open chat" = "Jelmondat elmentése és csevegés megnyitása"; /* No comment provided by engineer. */ -"Save passphrase in Keychain" = "Jelmondat mentése a kulcstárban"; +"Save passphrase in Keychain" = "Jelmondat mentése a kulcstartóba"; /* No comment provided by engineer. */ "Save preferences?" = "Beállítások mentése?"; @@ -3699,9 +3729,12 @@ /* chat item text */ "security code changed" = "a biztonsági kód megváltozott"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Választás"; +/* No comment provided by engineer. */ +"Selected %lld" = "%lld kiválasztva"; + /* No comment provided by engineer. */ "Selected chat preferences prohibit this message." = "A kiválasztott csevegési beállítások tiltják ezt az üzenetet."; @@ -3729,9 +3762,6 @@ /* No comment provided by engineer. */ "send direct message" = "közvetlen üzenet küldése"; -/* No comment provided by engineer. */ -"Send direct message" = "Közvetlen üzenet küldése"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Közvetlen üzenet küldése a kapcsolódáshoz"; @@ -3934,7 +3964,10 @@ "Share this 1-time invite link" = "Egyszer használatos meghívó hivatkozás megosztása"; /* No comment provided by engineer. */ -"Share with contacts" = "Megosztás ismerősökkel"; +"Share to SimpleX" = "Megosztás a SimpleX-ben"; + +/* No comment provided by engineer. */ +"Share with contacts" = "Megosztás az ismerősökkel"; /* No comment provided by engineer. */ "Show → on messages sent via private routing." = "Egy „→” jel megjelenítése a privát útválasztáson keresztül küldött üzeneteknél."; @@ -4026,12 +4059,18 @@ /* No comment provided by engineer. */ "SMP server" = "SMP-kiszolgáló"; +/* blur media */ +"Soft" = "Enyhe"; + /* No comment provided by engineer. */ -"SMP servers" = "SMP kiszolgálók"; +"Some file(s) were not exported:" = "Néhány fájl nem került exportálásra:"; /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Néhány nem végzetes hiba történt az importálás során – további részletekért a csevegési konzolban olvashat."; +/* No comment provided by engineer. */ +"Some non-fatal errors occurred during import:" = "Néhány nem végzetes hiba történt az importálás során:"; + /* notification title */ "Somebody" = "Valaki"; @@ -4098,6 +4137,9 @@ /* No comment provided by engineer. */ "strike" = "áthúzott"; +/* blur media */ +"Strong" = "Erős"; + /* No comment provided by engineer. */ "Submit" = "Elküldés"; @@ -4144,7 +4186,7 @@ "Tap to scan" = "Koppintson a beolvasáshoz"; /* No comment provided by engineer. */ -"Tap to start a new chat" = "Koppintson az új csevegés indításához"; +"TCP connection" = "TCP kapcsolat"; /* No comment provided by engineer. */ "TCP connection timeout" = "TCP kapcsolat időtúllépés"; @@ -4221,6 +4263,12 @@ /* No comment provided by engineer. */ "The message will be marked as moderated for all members." = "Az üzenet minden tag számára moderáltként lesz megjelölve."; +/* No comment provided by engineer. */ +"The messages will be deleted for all members." = "Az üzenetek minden tag számára törlésre kerülnek."; + +/* No comment provided by engineer. */ +"The messages will be marked as moderated for all members." = "Az üzenetek moderáltként lesznek megjelölve minden tag számára."; + /* No comment provided by engineer. */ "The next generation of private messaging" = "A privát üzenetküldés következő generációja"; @@ -4411,7 +4459,7 @@ "Unknown error" = "Ismeretlen hiba"; /* No comment provided by engineer. */ -"unknown relays" = "ismeretlen átjátszók"; +"unknown servers" = "ismeretlen átjátszók"; /* No comment provided by engineer. */ "Unknown servers!" = "Ismeretlen kiszolgálók!"; @@ -4452,9 +4500,6 @@ /* No comment provided by engineer. */ "Update" = "Frissítés"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "Tor .onion kiszolgálók beállításainak frissítése?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Adatbázis jelmondat megváltoztatása"; @@ -4462,7 +4507,7 @@ "Update network settings?" = "Hálózati beállítások megváltoztatása?"; /* No comment provided by engineer. */ -"Update transport isolation mode?" = "Kapcsolat izolációs mód frissítése?"; +"Update settings?" = "Beállítások frissítése?"; /* rcv group event chat item */ "updated group profile" = "frissítette a csoport profilját"; @@ -4474,10 +4519,7 @@ "Updating settings will re-connect the client to all servers." = "A beállítások frissítése a kiszolgálókhoz való újra kapcsolódással jár."; /* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "A beállítás frissítésével a kliens újrakapcsolódik az összes kiszolgálóhoz."; - -/* No comment provided by engineer. */ -"Upgrade and open chat" = "A csevegés frissítése és megnyitása"; +"Upgrade and open chat" = "Fejlesztés és a csevegés megnyitása"; /* No comment provided by engineer. */ "Upload errors" = "Feltöltési hibák"; @@ -4542,9 +4584,6 @@ /* No comment provided by engineer. */ "User selection" = "Felhasználó kiválasztása"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "A .onion kiszolgálók használatához kompatibilis VPN szolgáltatóra van szükség."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "SimpleX Chat kiszolgálók használatban."; @@ -4723,23 +4762,20 @@ "Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Tor vagy VPN nélkül az IP-címe látható lesz ezen XFTP átjátszók számára: %@."; /* No comment provided by engineer. */ -"Wrong database passphrase" = "Téves adatbázis jelmondat"; +"Wrong database passphrase" = "Hibás adatbázis jelmondat"; /* snd error text */ -"Wrong key or unknown connection - most likely this connection is deleted." = "Rossz kulcs vagy ismeretlen kapcsolat - valószínűleg ez a kapcsolat törlődött."; +"Wrong key or unknown connection - most likely this connection is deleted." = "Hibás kulcs vagy ismeretlen kapcsolat - valószínűleg ez a kapcsolat törlődött."; /* file error text */ "Wrong key or unknown file chunk address - most likely file is deleted." = "Hibás kulcs vagy ismeretlen fájltöredék cím - valószínűleg a fájl törlődött."; /* No comment provided by engineer. */ -"Wrong passphrase!" = "Téves jelmondat!"; +"Wrong passphrase!" = "Hibás jelmondat!"; /* No comment provided by engineer. */ "XFTP server" = "XFTP-kiszolgáló"; -/* No comment provided by engineer. */ -"XFTP servers" = "XFTP kiszolgálók"; - /* pref value */ "yes" = "igen"; @@ -4878,9 +4914,6 @@ /* No comment provided by engineer. */ "You have already requested connection!\nRepeat connection request?" = "Már kért egy kapcsolódási kérelmet!\nKapcsolódási kérés megismétlése?"; -/* No comment provided by engineer. */ -"You have no chats" = "Nincsenek csevegési üzenetek"; - /* No comment provided by engineer. */ "You have to enter passphrase every time the app starts - it is not stored on the device." = "A jelmondatot minden alkalommal meg kell adnia, amikor az alkalmazás elindul - nem az eszközön kerül tárolásra."; @@ -4896,6 +4929,12 @@ /* snd group event chat item */ "you left" = "elhagyta a csoportot"; +/* No comment provided by engineer. */ +"You may migrate the exported database." = "Az exportált adatbázist átköltöztetheti."; + +/* No comment provided by engineer. */ +"You may save the exported archive." = "Az exportált archívumot elmentheti."; + /* 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." = "A csevegési adatbázis legfrissebb verzióját CSAK egy eszközön kell használnia, ellenkező esetben előfordulhat, hogy az üzeneteket nem fogja megkapni valamennyi ismerőstől."; @@ -4971,9 +5010,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Csevegési profilok"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Az ismerősének online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.\nVisszavonhatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Ismerőse olyan fájlt küldött, amely meghaladja a jelenleg támogatott maximális méretet (%@)."; diff --git a/apps/ios/it.lproj/Localizable.strings b/apps/ios/it.lproj/Localizable.strings index 5854d28162..5249821670 100644 --- a/apps/ios/it.lproj/Localizable.strings +++ b/apps/ios/it.lproj/Localizable.strings @@ -491,6 +491,9 @@ /* No comment provided by engineer. */ "Allow sending disappearing messages." = "Permetti l'invio di messaggi a tempo."; +/* No comment provided by engineer. */ +"Allow sharing" = "Consenti la condivisione"; + /* No comment provided by engineer. */ "Allow to irreversibly delete sent messages. (24 hours)" = "Permetti di eliminare irreversibilmente i messaggi inviati. (24 ore)"; @@ -695,6 +698,9 @@ /* No comment provided by engineer. */ "Blocked by admin" = "Bloccato dall'amministratore"; +/* No comment provided by engineer. */ +"Blur media" = "Sfocatura file multimediali"; + /* No comment provided by engineer. */ "bold" = "grassetto"; @@ -828,6 +834,9 @@ /* No comment provided by engineer. */ "Chat database deleted" = "Database della chat eliminato"; +/* No comment provided by engineer. */ +"Chat database exported" = "Database della chat esportato"; + /* No comment provided by engineer. */ "Chat database imported" = "Database della chat importato"; @@ -1041,6 +1050,9 @@ /* chat list item title (it should not be shown */ "connection established" = "connessione stabilita"; +/* No comment provided by engineer. */ +"Connection notifications" = "Notifiche di connessione"; + /* No comment provided by engineer. */ "Connection request sent!" = "Richiesta di connessione inviata!"; @@ -1080,9 +1092,6 @@ /* notification */ "Contact is connected" = "Il contatto è connesso"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Il contatto non è ancora connesso!"; - /* No comment provided by engineer. */ "Contact name" = "Nome del contatto"; @@ -1281,6 +1290,9 @@ /* chat item action */ "Delete" = "Elimina"; +/* No comment provided by engineer. */ +"Delete %lld messages of members?" = "Eliminare %lld messaggi dei membri?"; + /* No comment provided by engineer. */ "Delete %lld messages?" = "Eliminare %lld messaggi?"; @@ -1317,12 +1329,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Elimina contatto"; -/* No comment provided by engineer. */ -"Delete Contact" = "Elimina contatto"; - -/* No comment provided by engineer. */ -"Delete contact?\nThis cannot be undone!" = "Eliminare il contatto?\nNon è reversibile!"; - /* No comment provided by engineer. */ "Delete database" = "Elimina database"; @@ -1377,9 +1383,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Eliminare il database vecchio?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Elimina connessione in attesa"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Eliminare la connessione in attesa?"; @@ -1434,9 +1437,15 @@ /* No comment provided by engineer. */ "Desktop devices" = "Dispositivi desktop"; +/* No comment provided by engineer. */ +"Destination server address of %@ is incompatible with forwarding server %@ settings." = "L'indirizzo del server di destinazione di %@ è incompatibile con le impostazioni del server di inoltro %@."; + /* snd error text */ "Destination server error: %@" = "Errore del server di destinazione: %@"; +/* No comment provided by engineer. */ +"Destination server version of %@ is incompatible with forwarding server %@." = "La versione del server di destinazione di %@ è incompatibile con il server di inoltro %@."; + /* No comment provided by engineer. */ "Detailed statistics" = "Statistiche dettagliate"; @@ -1485,6 +1494,9 @@ /* No comment provided by engineer. */ "disabled" = "disattivato"; +/* No comment provided by engineer. */ +"Disabled" = "Disattivato"; + /* No comment provided by engineer. */ "Disappearing message" = "Messaggio a tempo"; @@ -1632,6 +1644,9 @@ /* enabled status */ "enabled" = "attivato"; +/* No comment provided by engineer. */ +"Enabled" = "Attivato"; + /* No comment provided by engineer. */ "Enabled for" = "Attivo per"; @@ -1773,6 +1788,9 @@ /* No comment provided by engineer. */ "Error changing setting" = "Errore nella modifica dell'impostazione"; +/* No comment provided by engineer. */ +"Error connecting to forwarding server %@. Please try later." = "Errore di connessione al server di inoltro %@. Riprova più tardi."; + /* No comment provided by engineer. */ "Error creating address" = "Errore nella creazione dell'indirizzo"; @@ -1803,9 +1821,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Errore nell'eliminazione della connessione"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Errore nell'eliminazione del contatto"; - /* No comment provided by engineer. */ "Error deleting database" = "Errore nell'eliminazione del database"; @@ -2086,6 +2101,15 @@ /* No comment provided by engineer. */ "Forwarded from" = "Inoltrato da"; +/* No comment provided by engineer. */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Il server di inoltro %@ non è riuscito a connettersi al server di destinazione %@. Riprova più tardi."; + +/* No comment provided by engineer. */ +"Forwarding server address is incompatible with network settings: %@." = "L'indirizzo del server di inoltro è incompatibile con le impostazioni di rete: %@."; + +/* No comment provided by engineer. */ +"Forwarding server version is incompatible with network settings: %@." = "La versione del server di inoltro è incompatibile con le impostazioni di rete: %@."; + /* snd error text */ "Forwarding server: %@\nDestination server error: %@" = "Server di inoltro: %1$@\nErrore del server di destinazione: %2$@"; @@ -2635,6 +2659,12 @@ /* No comment provided by engineer. */ "Max 30 seconds, received instantly." = "Max 30 secondi, ricevuto istantaneamente."; +/* No comment provided by engineer. */ +"Media & file servers" = "Server di multimediali e file"; + +/* blur media */ +"Medium" = "Media"; + /* member role */ "member" = "membro"; @@ -2699,10 +2729,7 @@ "Message reception" = "Ricezione messaggi"; /* No comment provided by engineer. */ -"Message routing fallback" = "Ripiego instradamento messaggio"; - -/* No comment provided by engineer. */ -"Message routing mode" = "Modalità instradamento messaggio"; +"Message servers" = "Server dei messaggi"; /* No comment provided by engineer. */ "Message source remains private." = "La fonte del messaggio resta privata."; @@ -2932,6 +2959,9 @@ /* No comment provided by engineer. */ "Not compatible!" = "Non compatibile!"; +/* No comment provided by engineer. */ +"Nothing selected" = "Nessuna selezione"; + /* No comment provided by engineer. */ "Notifications" = "Notifiche"; @@ -2977,10 +3007,10 @@ "One-time invitation link" = "Link di invito una tantum"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Gli host Onion saranno necessari per la connessione. Richiede l'attivazione della VPN."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Gli host Onion saranno **necessari** per la connessione.\nRichiede l'attivazione della VPN."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Gli host Onion verranno usati quando disponibili. Richiede l'attivazione della VPN."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Gli host Onion verranno usati quando disponibili.\nRichiede l'attivazione della VPN."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Gli host Onion non verranno usati."; @@ -3552,9 +3582,6 @@ /* chat item action */ "Reveal" = "Rivela"; -/* No comment provided by engineer. */ -"Revert" = "Ripristina"; - /* No comment provided by engineer. */ "Revoke" = "Revoca"; @@ -3588,6 +3615,9 @@ /* No comment provided by engineer. */ "Save and notify group members" = "Salva e avvisa i membri del gruppo"; +/* No comment provided by engineer. */ +"Save and reconnect" = "Salva e riconnetti"; + /* No comment provided by engineer. */ "Save and update group profile" = "Salva e aggiorna il profilo del gruppo"; @@ -3699,9 +3729,12 @@ /* chat item text */ "security code changed" = "codice di sicurezza modificato"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Seleziona"; +/* No comment provided by engineer. */ +"Selected %lld" = "%lld selezionato"; + /* No comment provided by engineer. */ "Selected chat preferences prohibit this message." = "Le preferenze della chat selezionata vietano questo messaggio."; @@ -3729,9 +3762,6 @@ /* No comment provided by engineer. */ "send direct message" = "invia messaggio diretto"; -/* No comment provided by engineer. */ -"Send direct message" = "Invia messaggio diretto"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Invia messaggio diretto per connetterti"; @@ -3933,6 +3963,9 @@ /* No comment provided by engineer. */ "Share this 1-time invite link" = "Condividi questo link di invito una tantum"; +/* No comment provided by engineer. */ +"Share to SimpleX" = "Condividi in SimpleX"; + /* No comment provided by engineer. */ "Share with contacts" = "Condividi con i contatti"; @@ -4026,12 +4059,18 @@ /* No comment provided by engineer. */ "SMP server" = "Server SMP"; +/* blur media */ +"Soft" = "Leggera"; + /* No comment provided by engineer. */ -"SMP servers" = "Server SMP"; +"Some file(s) were not exported:" = "Alcuni file non sono stati esportati:"; /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Si sono verificati alcuni errori non gravi durante l'importazione: vedi la console della chat per i dettagli."; +/* No comment provided by engineer. */ +"Some non-fatal errors occurred during import:" = "Si sono verificati alcuni errori non fatali durante l'importazione:"; + /* notification title */ "Somebody" = "Qualcuno"; @@ -4098,6 +4137,9 @@ /* No comment provided by engineer. */ "strike" = "barrato"; +/* blur media */ +"Strong" = "Forte"; + /* No comment provided by engineer. */ "Submit" = "Invia"; @@ -4144,7 +4186,7 @@ "Tap to scan" = "Tocca per scansionare"; /* No comment provided by engineer. */ -"Tap to start a new chat" = "Tocca per iniziare una chat"; +"TCP connection" = "Connessione TCP"; /* No comment provided by engineer. */ "TCP connection timeout" = "Scadenza connessione TCP"; @@ -4221,6 +4263,12 @@ /* No comment provided by engineer. */ "The message will be marked as moderated for all members." = "Il messaggio sarà segnato come moderato per tutti i membri."; +/* No comment provided by engineer. */ +"The messages will be deleted for all members." = "I messaggi verranno eliminati per tutti i membri."; + +/* No comment provided by engineer. */ +"The messages will be marked as moderated for all members." = "I messaggi verranno contrassegnati come moderati per tutti i membri."; + /* No comment provided by engineer. */ "The next generation of private messaging" = "La nuova generazione di messaggistica privata"; @@ -4411,7 +4459,7 @@ "Unknown error" = "Errore sconosciuto"; /* No comment provided by engineer. */ -"unknown relays" = "relay sconosciuti"; +"unknown servers" = "relay sconosciuti"; /* No comment provided by engineer. */ "Unknown servers!" = "Server sconosciuti!"; @@ -4452,9 +4500,6 @@ /* No comment provided by engineer. */ "Update" = "Aggiorna"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "Aggiornare l'impostazione degli host .onion?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Aggiorna la password del database"; @@ -4462,7 +4507,7 @@ "Update network settings?" = "Aggiornare le impostazioni di rete?"; /* No comment provided by engineer. */ -"Update transport isolation mode?" = "Aggiornare la modalità di isolamento del trasporto?"; +"Update settings?" = "Aggiornare le impostazioni?"; /* rcv group event chat item */ "updated group profile" = "ha aggiornato il profilo del gruppo"; @@ -4473,9 +4518,6 @@ /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "L'aggiornamento delle impostazioni riconnetterà il client a tutti i server."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "L'aggiornamento di questa impostazione riconnetterà il client a tutti i server."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Aggiorna e apri chat"; @@ -4542,9 +4584,6 @@ /* No comment provided by engineer. */ "User selection" = "Selezione utente"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "L'uso di host .onion richiede un fornitore di VPN compatibile."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "Utilizzo dei server SimpleX Chat."; @@ -4737,9 +4776,6 @@ /* No comment provided by engineer. */ "XFTP server" = "Server XFTP"; -/* No comment provided by engineer. */ -"XFTP servers" = "Server XFTP"; - /* pref value */ "yes" = "sì"; @@ -4878,9 +4914,6 @@ /* No comment provided by engineer. */ "You have already requested connection!\nRepeat connection request?" = "Hai già richiesto la connessione!\nRipetere la richiesta di connessione?"; -/* No comment provided by engineer. */ -"You have no chats" = "Non hai chat"; - /* No comment provided by engineer. */ "You have to enter passphrase every time the app starts - it is not stored on the device." = "Devi inserire la password ogni volta che si avvia l'app: non viene memorizzata sul dispositivo."; @@ -4896,6 +4929,12 @@ /* snd group event chat item */ "you left" = "sei uscito/a"; +/* No comment provided by engineer. */ +"You may migrate the exported database." = "Puoi migrare il database esportato."; + +/* No comment provided by engineer. */ +"You may save the exported archive." = "Puoi salvare l'archivio esportato."; + /* 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." = "Devi usare la versione più recente del tuo database della chat SOLO su un dispositivo, altrimenti potresti non ricevere più i messaggi da alcuni contatti."; @@ -4971,9 +5010,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "I tuoi profili di chat"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Il tuo contatto deve essere in linea per completare la connessione.\nPuoi annullare questa connessione e rimuovere il contatto (e riprovare più tardi con un link nuovo)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Il tuo contatto ha inviato un file più grande della dimensione massima attualmente supportata (%@)."; diff --git a/apps/ios/ja.lproj/Localizable.strings b/apps/ios/ja.lproj/Localizable.strings index 7c8897e6cb..aab531a015 100644 --- a/apps/ios/ja.lproj/Localizable.strings +++ b/apps/ios/ja.lproj/Localizable.strings @@ -840,9 +840,6 @@ /* notification */ "Contact is connected" = "連絡先は接続中"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "連絡先がまだ繋がってません!"; - /* No comment provided by engineer. */ "Contact name" = "連絡先の名前"; @@ -1026,9 +1023,6 @@ /* No comment provided by engineer. */ "Delete contact" = "連絡先を削除"; -/* No comment provided by engineer. */ -"Delete Contact" = "連絡先を削除"; - /* No comment provided by engineer. */ "Delete database" = "データベースを削除"; @@ -1080,9 +1074,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "古いデータベースを削除しますか?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "確認待ちの接続を削除"; - /* No comment provided by engineer. */ "Delete pending connection?" = "接続待ちの接続を削除しますか?"; @@ -1407,9 +1398,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "接続の削除エラー"; -/* No comment provided by engineer. */ -"Error deleting contact" = "連絡先の削除にエラー発生"; - /* No comment provided by engineer. */ "Error deleting database" = "データベースの削除にエラー発生"; @@ -2263,10 +2251,10 @@ "One-time invitation link" = "使い捨ての招待リンク"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "接続にオニオンのホストが必要となります。VPN を有効にする必要があります。"; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "接続にオニオンのホストが必要となります。\nVPN を有効にする必要があります。"; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "オニオンのホストが利用可能時に使われます。VPN を有効にする必要があります。"; +"Onion hosts will be used when available.\nRequires compatible VPN." = "オニオンのホストが利用可能時に使われます。\nVPN を有効にする必要があります。"; /* No comment provided by engineer. */ "Onion hosts will not be used." = "オニオンのホストが使われません。"; @@ -2640,9 +2628,6 @@ /* chat item action */ "Reveal" = "開示する"; -/* No comment provided by engineer. */ -"Revert" = "元に戻す"; - /* No comment provided by engineer. */ "Revoke" = "取り消す"; @@ -2745,7 +2730,7 @@ /* chat item text */ "security code changed" = "セキュリティコードが変更されました"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "選択"; /* No comment provided by engineer. */ @@ -2766,9 +2751,6 @@ /* No comment provided by engineer. */ "Send a live message - it will update for the recipient(s) as you type it" = "ライブメッセージを送信 (入力しながら宛先の画面で更新される)"; -/* No comment provided by engineer. */ -"Send direct message" = "ダイレクトメッセージを送信"; - /* No comment provided by engineer. */ "Send direct message to connect" = "ダイレクトメッセージを送信して接続する"; @@ -2940,9 +2922,6 @@ /* No comment provided by engineer. */ "Small groups (max 20)" = "小グループ(最大20名)"; -/* No comment provided by engineer. */ -"SMP servers" = "SMPサーバ"; - /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "インポート中に致命的でないエラーが発生しました - 詳細はチャットコンソールを参照してください。"; @@ -3018,9 +2997,6 @@ /* 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接続タイムアウト"; @@ -3228,27 +3204,18 @@ /* No comment provided by engineer. */ "Update" = "更新"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = ".onionのホスト設定を更新しますか?"; - /* No comment provided by engineer. */ "Update database passphrase" = "データベースのパスフレーズを更新"; /* No comment provided by engineer. */ "Update network settings?" = "ネットワーク設定を更新しますか?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "トランスポート隔離モードを更新しますか?"; - /* rcv group event chat item */ "updated group profile" = "グループプロフィールを更新しました"; /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "設定を更新すると、全サーバにクライントの再接続が行われます。"; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "設定を更新すると、全サーバにクライントの再接続が行われます。"; - /* No comment provided by engineer. */ "Upgrade and open chat" = "アップグレードしてチャットを開く"; @@ -3282,9 +3249,6 @@ /* No comment provided by engineer. */ "User profile" = "ユーザープロフィール"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = ".onionホストを使用するには、互換性のあるVPNプロバイダーが必要です。"; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "SimpleX チャット サーバーを使用する。"; @@ -3399,9 +3363,6 @@ /* No comment provided by engineer. */ "Wrong passphrase!" = "パスフレーズが違います!"; -/* No comment provided by engineer. */ -"XFTP servers" = "XFTPサーバ"; - /* pref value */ "yes" = "はい"; @@ -3492,9 +3453,6 @@ /* 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." = "アプリ起動時にパスフレーズを入力しなければなりません。端末に保存されてません。"; @@ -3576,9 +3534,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "あなたのチャットプロフィール"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "接続を完了するには、連絡相手がオンラインになる必要があります。\nこの接続をキャンセルして、連絡先を削除をすることもできます (後でやり直すこともできます)。"; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "連絡先が現在サポートされている最大サイズ (%@) より大きいファイルを送信しました。"; diff --git a/apps/ios/nl.lproj/Localizable.strings b/apps/ios/nl.lproj/Localizable.strings index 23eccdcf3b..ae6dc32aae 100644 --- a/apps/ios/nl.lproj/Localizable.strings +++ b/apps/ios/nl.lproj/Localizable.strings @@ -491,6 +491,9 @@ /* No comment provided by engineer. */ "Allow sending disappearing messages." = "Toestaan dat verdwijnende berichten worden verzonden."; +/* No comment provided by engineer. */ +"Allow sharing" = "Delen toestaan"; + /* No comment provided by engineer. */ "Allow to irreversibly delete sent messages. (24 hours)" = "Sta toe om verzonden berichten onomkeerbaar te verwijderen. (24 uur)"; @@ -689,12 +692,15 @@ /* rcv group event chat item */ "blocked %@" = "geblokkeerd %@"; -/* blocked chat item */ +/* marked deleted chat item preview text */ "blocked by admin" = "geblokkeerd door beheerder"; /* No comment provided by engineer. */ "Blocked by admin" = "Geblokkeerd door beheerder"; +/* No comment provided by engineer. */ +"Blur media" = "Vervaag media"; + /* No comment provided by engineer. */ "bold" = "vetgedrukt"; @@ -828,6 +834,9 @@ /* No comment provided by engineer. */ "Chat database deleted" = "Chat database verwijderd"; +/* No comment provided by engineer. */ +"Chat database exported" = "Chat database geëxporteerd"; + /* No comment provided by engineer. */ "Chat database imported" = "Chat database geïmporteerd"; @@ -1041,6 +1050,9 @@ /* chat list item title (it should not be shown */ "connection established" = "verbinding gemaakt"; +/* No comment provided by engineer. */ +"Connection notifications" = "Verbindingsmeldingen"; + /* No comment provided by engineer. */ "Connection request sent!" = "Verbindingsverzoek verzonden!"; @@ -1080,9 +1092,6 @@ /* notification */ "Contact is connected" = "Contact is verbonden"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Contact is nog niet verbonden!"; - /* No comment provided by engineer. */ "Contact name" = "Contact naam"; @@ -1281,6 +1290,9 @@ /* chat item action */ "Delete" = "Verwijderen"; +/* No comment provided by engineer. */ +"Delete %lld messages of members?" = "%lld berichten van leden verwijderen?"; + /* No comment provided by engineer. */ "Delete %lld messages?" = "%lld berichten verwijderen?"; @@ -1317,12 +1329,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Verwijder contact"; -/* No comment provided by engineer. */ -"Delete Contact" = "Verwijder contact"; - -/* No comment provided by engineer. */ -"Delete contact?\nThis cannot be undone!" = "Verwijder contact?\nDit kan niet ongedaan gemaakt worden!"; - /* No comment provided by engineer. */ "Delete database" = "Database verwijderen"; @@ -1377,9 +1383,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Oude database verwijderen?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Wachtende verbinding verwijderen"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Wachtende verbinding verwijderen?"; @@ -1434,9 +1437,15 @@ /* No comment provided by engineer. */ "Desktop devices" = "Desktop apparaten"; +/* No comment provided by engineer. */ +"Destination server address of %@ is incompatible with forwarding server %@ settings." = "Het bestemmingsserveradres van %@ is niet compatibel met de doorstuurserverinstellingen %@."; + /* snd error text */ "Destination server error: %@" = "Bestemmingsserverfout: %@"; +/* No comment provided by engineer. */ +"Destination server version of %@ is incompatible with forwarding server %@." = "De versie van de bestemmingsserver %@ is niet compatibel met de doorstuurserver %@."; + /* No comment provided by engineer. */ "Detailed statistics" = "Gedetailleerde statistieken"; @@ -1485,6 +1494,9 @@ /* No comment provided by engineer. */ "disabled" = "uitgeschakeld"; +/* No comment provided by engineer. */ +"Disabled" = "Uitgeschakeld"; + /* No comment provided by engineer. */ "Disappearing message" = "Verdwijnend bericht"; @@ -1632,6 +1644,9 @@ /* enabled status */ "enabled" = "ingeschakeld"; +/* No comment provided by engineer. */ +"Enabled" = "Ingeschakeld"; + /* No comment provided by engineer. */ "Enabled for" = "Ingeschakeld voor"; @@ -1773,6 +1788,9 @@ /* No comment provided by engineer. */ "Error changing setting" = "Fout bij wijzigen van instelling"; +/* No comment provided by engineer. */ +"Error connecting to forwarding server %@. Please try later." = "Fout bij het verbinden met doorstuurserver %@. Probeer het later opnieuw."; + /* No comment provided by engineer. */ "Error creating address" = "Fout bij aanmaken van adres"; @@ -1803,9 +1821,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Fout bij verwijderen van verbinding"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Fout bij het verwijderen van contact"; - /* No comment provided by engineer. */ "Error deleting database" = "Fout bij het verwijderen van de database"; @@ -2086,6 +2101,15 @@ /* No comment provided by engineer. */ "Forwarded from" = "Doorgestuurd vanuit"; +/* No comment provided by engineer. */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "De doorstuurserver %@ kon geen verbinding maken met de bestemmingsserver %@. Probeer het later opnieuw."; + +/* No comment provided by engineer. */ +"Forwarding server address is incompatible with network settings: %@." = "Het adres van de doorstuurserver is niet compatibel met de netwerkinstellingen: %@."; + +/* No comment provided by engineer. */ +"Forwarding server version is incompatible with network settings: %@." = "De doorstuurserverversie is niet compatibel met de netwerkinstellingen: %@."; + /* snd error text */ "Forwarding server: %@\nDestination server error: %@" = "Doorstuurserver: %1$@\nBestemmingsserverfout: %2$@"; @@ -2635,6 +2659,12 @@ /* No comment provided by engineer. */ "Max 30 seconds, received instantly." = "Max 30 seconden, direct ontvangen."; +/* No comment provided by engineer. */ +"Media & file servers" = "Media- en bestandsservers"; + +/* blur media */ +"Medium" = "Medium"; + /* member role */ "member" = "lid"; @@ -2699,10 +2729,7 @@ "Message reception" = "Bericht ontvangst"; /* No comment provided by engineer. */ -"Message routing fallback" = "Terugval op berichtroutering"; - -/* No comment provided by engineer. */ -"Message routing mode" = "Berichtrouteringsmodus"; +"Message servers" = "Berichtservers"; /* No comment provided by engineer. */ "Message source remains private." = "Berichtbron blijft privé."; @@ -2932,6 +2959,9 @@ /* No comment provided by engineer. */ "Not compatible!" = "Niet compatibel!"; +/* No comment provided by engineer. */ +"Nothing selected" = "Niets geselecteerd"; + /* No comment provided by engineer. */ "Notifications" = "Meldingen"; @@ -2977,10 +3007,10 @@ "One-time invitation link" = "Eenmalige uitnodiging link"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Onion hosts zullen nodig zijn voor verbinding. Vereist het inschakelen van VPN."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Onion hosts zullen nodig zijn voor verbinding.\nVereist het inschakelen van VPN."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Onion hosts worden gebruikt indien beschikbaar. Vereist het inschakelen van VPN."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Onion hosts worden gebruikt indien beschikbaar.\nVereist het inschakelen van VPN."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Onion hosts worden niet gebruikt."; @@ -3552,9 +3582,6 @@ /* chat item action */ "Reveal" = "Onthullen"; -/* No comment provided by engineer. */ -"Revert" = "Terugdraaien"; - /* No comment provided by engineer. */ "Revoke" = "Intrekken"; @@ -3588,6 +3615,9 @@ /* No comment provided by engineer. */ "Save and notify group members" = "Opslaan en groep leden melden"; +/* No comment provided by engineer. */ +"Save and reconnect" = "Opslaan en opnieuw verbinden"; + /* No comment provided by engineer. */ "Save and update group profile" = "Groep profiel opslaan en bijwerken"; @@ -3699,9 +3729,12 @@ /* chat item text */ "security code changed" = "beveiligingscode gewijzigd"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Selecteer"; +/* No comment provided by engineer. */ +"Selected %lld" = "%lld geselecteerd"; + /* No comment provided by engineer. */ "Selected chat preferences prohibit this message." = "Geselecteerde chat voorkeuren verbieden dit bericht."; @@ -3729,9 +3762,6 @@ /* No comment provided by engineer. */ "send direct message" = "stuur een direct bericht"; -/* No comment provided by engineer. */ -"Send direct message" = "Direct bericht sturen"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Stuur een direct bericht om verbinding te maken"; @@ -3933,6 +3963,9 @@ /* No comment provided by engineer. */ "Share this 1-time invite link" = "Deel deze eenmalige uitnodigingslink"; +/* No comment provided by engineer. */ +"Share to SimpleX" = "Delen op SimpleX"; + /* No comment provided by engineer. */ "Share with contacts" = "Delen met contacten"; @@ -4026,12 +4059,18 @@ /* No comment provided by engineer. */ "SMP server" = "SMP server"; +/* blur media */ +"Soft" = "Soft"; + /* No comment provided by engineer. */ -"SMP servers" = "SMP servers"; +"Some file(s) were not exported:" = "Sommige bestanden zijn niet geëxporteerd:"; /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Er zijn enkele niet-fatale fouten opgetreden tijdens het importeren - u kunt de Chat console raadplegen voor meer details."; +/* No comment provided by engineer. */ +"Some non-fatal errors occurred during import:" = "Er zijn enkele niet-fatale fouten opgetreden tijdens het importeren:"; + /* notification title */ "Somebody" = "Iemand"; @@ -4098,6 +4137,9 @@ /* No comment provided by engineer. */ "strike" = "staking"; +/* blur media */ +"Strong" = "Krachtig"; + /* No comment provided by engineer. */ "Submit" = "Indienen"; @@ -4144,7 +4186,7 @@ "Tap to scan" = "Tik om te scannen"; /* No comment provided by engineer. */ -"Tap to start a new chat" = "Tik om een nieuw gesprek te starten"; +"TCP connection" = "TCP verbinding"; /* No comment provided by engineer. */ "TCP connection timeout" = "Timeout van TCP-verbinding"; @@ -4221,6 +4263,12 @@ /* No comment provided by engineer. */ "The message will be marked as moderated for all members." = "Het bericht wordt gemarkeerd als gemodereerd voor alle leden."; +/* No comment provided by engineer. */ +"The messages will be deleted for all members." = "De berichten worden voor alle leden verwijderd."; + +/* No comment provided by engineer. */ +"The messages will be marked as moderated for all members." = "De berichten worden voor alle leden als gemodereerd gemarkeerd."; + /* No comment provided by engineer. */ "The next generation of private messaging" = "De volgende generatie privéberichten"; @@ -4411,7 +4459,7 @@ "Unknown error" = "Onbekende fout"; /* No comment provided by engineer. */ -"unknown relays" = "onbekende relays"; +"unknown servers" = "onbekende relays"; /* No comment provided by engineer. */ "Unknown servers!" = "Onbekende servers!"; @@ -4452,9 +4500,6 @@ /* No comment provided by engineer. */ "Update" = "Update"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = ".onion hosts-instelling updaten?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Database wachtwoord bijwerken"; @@ -4462,7 +4507,7 @@ "Update network settings?" = "Netwerk instellingen bijwerken?"; /* No comment provided by engineer. */ -"Update transport isolation mode?" = "Transportisolatiemodus updaten?"; +"Update settings?" = "Instellingen actualiseren?"; /* rcv group event chat item */ "updated group profile" = "bijgewerkt groep profiel"; @@ -4473,9 +4518,6 @@ /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "Door de instellingen bij te werken, wordt de client opnieuw verbonden met alle servers."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "Als u deze instelling bijwerkt, wordt de client opnieuw verbonden met alle servers."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Upgrade en open chat"; @@ -4542,9 +4584,6 @@ /* No comment provided by engineer. */ "User selection" = "Gebruikersselectie"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "Het gebruik van .onion-hosts vereist een compatibele VPN-provider."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "SimpleX Chat servers gebruiken."; @@ -4737,9 +4776,6 @@ /* No comment provided by engineer. */ "XFTP server" = "XFTP server"; -/* No comment provided by engineer. */ -"XFTP servers" = "XFTP servers"; - /* pref value */ "yes" = "Ja"; @@ -4878,9 +4914,6 @@ /* No comment provided by engineer. */ "You have already requested connection!\nRepeat connection request?" = "Je hebt al verbinding aangevraagd!\nVerbindingsverzoek herhalen?"; -/* No comment provided by engineer. */ -"You have no chats" = "Je hebt geen gesprekken"; - /* No comment provided by engineer. */ "You have to enter passphrase every time the app starts - it is not stored on the device." = "U moet elke keer dat de app start het wachtwoord invoeren, deze wordt niet op het apparaat opgeslagen."; @@ -4896,6 +4929,12 @@ /* snd group event chat item */ "you left" = "jij bent vertrokken"; +/* No comment provided by engineer. */ +"You may migrate the exported database." = "U kunt de geëxporteerde database migreren."; + +/* No comment provided by engineer. */ +"You may save the exported archive." = "U kunt het geëxporteerde archief opslaan."; + /* 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." = "U mag ALLEEN de meest recente versie van uw chat database op één apparaat gebruiken, anders ontvangt u mogelijk geen berichten meer van sommige contacten."; @@ -4971,9 +5010,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Uw chat profielen"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Uw contact moet online zijn om de verbinding te voltooien.\nU kunt deze verbinding verbreken en het contact verwijderen en later proberen met een nieuwe link."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Uw contact heeft een bestand verzonden dat groter is dan de momenteel ondersteunde maximale grootte (%@)."; diff --git a/apps/ios/pl.lproj/Localizable.strings b/apps/ios/pl.lproj/Localizable.strings index fd284d9537..5f44a253af 100644 --- a/apps/ios/pl.lproj/Localizable.strings +++ b/apps/ios/pl.lproj/Localizable.strings @@ -689,7 +689,7 @@ /* rcv group event chat item */ "blocked %@" = "zablokowany %@"; -/* blocked chat item */ +/* marked deleted chat item preview text */ "blocked by admin" = "zablokowany przez admina"; /* No comment provided by engineer. */ @@ -1080,9 +1080,6 @@ /* notification */ "Contact is connected" = "Kontakt jest połączony"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Kontakt nie jest jeszcze połączony!"; - /* No comment provided by engineer. */ "Contact name" = "Nazwa kontaktu"; @@ -1317,12 +1314,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Usuń kontakt"; -/* No comment provided by engineer. */ -"Delete Contact" = "Usuń Kontakt"; - -/* No comment provided by engineer. */ -"Delete contact?\nThis cannot be undone!" = "Usunąć kontakt?\nTo nie może być cofnięte!"; - /* No comment provided by engineer. */ "Delete database" = "Usuń bazę danych"; @@ -1377,9 +1368,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Usunąć starą bazę danych?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Usuń oczekujące połączenie"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Usunąć oczekujące połączenie?"; @@ -1803,9 +1791,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Błąd usuwania połączenia"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Błąd usuwania kontaktu"; - /* No comment provided by engineer. */ "Error deleting database" = "Błąd usuwania bazy danych"; @@ -2698,12 +2683,6 @@ /* No comment provided by engineer. */ "Message reception" = "Odebranie wiadomości"; -/* No comment provided by engineer. */ -"Message routing fallback" = "Rezerwowe trasowania wiadomości"; - -/* No comment provided by engineer. */ -"Message routing mode" = "Tryb trasowania wiadomości"; - /* No comment provided by engineer. */ "Message source remains private." = "Źródło wiadomości pozostaje prywatne."; @@ -2977,10 +2956,10 @@ "One-time invitation link" = "Jednorazowy link zaproszenia"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Hosty onion będą wymagane do połączenia. Wymaga włączenia VPN."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Hosty onion będą wymagane do połączenia.\nWymaga włączenia VPN."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Hosty onion będą używane, gdy będą dostępne. Wymaga włączenia VPN."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Hosty onion będą używane, gdy będą dostępne.\nWymaga włączenia VPN."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Hosty onion nie będą używane."; @@ -3552,9 +3531,6 @@ /* chat item action */ "Reveal" = "Ujawnij"; -/* No comment provided by engineer. */ -"Revert" = "Przywrócić"; - /* No comment provided by engineer. */ "Revoke" = "Odwołaj"; @@ -3699,7 +3675,7 @@ /* chat item text */ "security code changed" = "kod bezpieczeństwa zmieniony"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Wybierz"; /* No comment provided by engineer. */ @@ -3729,9 +3705,6 @@ /* No comment provided by engineer. */ "send direct message" = "wyślij wiadomość bezpośrednią"; -/* No comment provided by engineer. */ -"Send direct message" = "Wyślij wiadomość bezpośrednią"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Wyślij wiadomość bezpośrednią aby połączyć"; @@ -4026,9 +3999,6 @@ /* No comment provided by engineer. */ "SMP server" = "Serwer SMP"; -/* No comment provided by engineer. */ -"SMP servers" = "Serwery SMP"; - /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Podczas importu wystąpiły niekrytyczne błędy - więcej szczegółów można znaleźć w konsoli czatu."; @@ -4143,9 +4113,6 @@ /* No comment provided by engineer. */ "Tap to scan" = "Dotknij, aby zeskanować"; -/* No comment provided by engineer. */ -"Tap to start a new chat" = "Dotknij, aby rozpocząć nowy czat"; - /* No comment provided by engineer. */ "TCP connection timeout" = "Limit czasu połączenia TCP"; @@ -4411,7 +4378,7 @@ "Unknown error" = "Nieznany błąd"; /* No comment provided by engineer. */ -"unknown relays" = "nieznane przekaźniki"; +"unknown servers" = "nieznane przekaźniki"; /* No comment provided by engineer. */ "Unknown servers!" = "Nieznane serwery!"; @@ -4452,18 +4419,12 @@ /* No comment provided by engineer. */ "Update" = "Aktualizuj"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "Zaktualizować ustawienie hostów .onion?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Aktualizuj hasło do bazy danych"; /* No comment provided by engineer. */ "Update network settings?" = "Zaktualizować ustawienia sieci?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "Zaktualizować tryb izolacji transportu?"; - /* rcv group event chat item */ "updated group profile" = "zaktualizowano profil grupy"; @@ -4473,9 +4434,6 @@ /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "Aktualizacja ustawień spowoduje ponowne połączenie klienta ze wszystkimi serwerami."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "Aktualizacja tych ustawień spowoduje ponowne połączenie klienta ze wszystkimi serwerami."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Zaktualizuj i otwórz czat"; @@ -4542,9 +4500,6 @@ /* No comment provided by engineer. */ "User selection" = "Wybór użytkownika"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "Używanie hostów .onion wymaga kompatybilnego dostawcy VPN."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "Używanie serwerów SimpleX Chat."; @@ -4737,9 +4692,6 @@ /* No comment provided by engineer. */ "XFTP server" = "Serwer XFTP"; -/* No comment provided by engineer. */ -"XFTP servers" = "Serwery XFTP"; - /* pref value */ "yes" = "tak"; @@ -4878,9 +4830,6 @@ /* No comment provided by engineer. */ "You have already requested connection!\nRepeat connection request?" = "Już prosiłeś o połączenie!\nPowtórzyć prośbę połączenia?"; -/* No comment provided by engineer. */ -"You have no chats" = "Nie masz czatów"; - /* No comment provided by engineer. */ "You have to enter passphrase every time the app starts - it is not stored on the device." = "Musisz wprowadzić hasło przy każdym uruchomieniu aplikacji - nie jest one przechowywane na urządzeniu."; @@ -4971,9 +4920,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Twoje profile czatu"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Twój kontakt musi być online, aby połączenie zostało zakończone.\nMożesz anulować to połączenie i usunąć kontakt (i spróbować później z nowym linkiem)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Twój kontakt wysłał plik, który jest większy niż obecnie obsługiwany maksymalny rozmiar (%@)."; diff --git a/apps/ios/ru.lproj/Localizable.strings b/apps/ios/ru.lproj/Localizable.strings index d842364f91..ef0baedf17 100644 --- a/apps/ios/ru.lproj/Localizable.strings +++ b/apps/ios/ru.lproj/Localizable.strings @@ -996,9 +996,6 @@ /* notification */ "Contact is connected" = "Соединение с контактом установлено"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Соединение еще не установлено!"; - /* No comment provided by engineer. */ "Contact name" = "Имена контактов"; @@ -1212,12 +1209,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Удалить контакт"; -/* No comment provided by engineer. */ -"Delete Contact" = "Удалить контакт"; - -/* No comment provided by engineer. */ -"Delete contact?\nThis cannot be undone!" = "Удалить контакт?\nЭто не может быть отменено!"; - /* No comment provided by engineer. */ "Delete database" = "Удалить данные чата"; @@ -1272,9 +1263,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Удалить предыдущую версию данных?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Удалить соединение"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Удалить ожидаемое соединение?"; @@ -1674,9 +1662,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Ошибка при удалении соединения"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Ошибка при удалении контакта"; - /* No comment provided by engineer. */ "Error deleting database" = "Ошибка при удалении данных чата"; @@ -2500,12 +2485,6 @@ /* notification */ "message received" = "получено сообщение"; -/* No comment provided by engineer. */ -"Message routing fallback" = "Прямая доставка сообщений"; - -/* No comment provided by engineer. */ -"Message routing mode" = "Режим доставки сообщений"; - /* No comment provided by engineer. */ "Message source remains private." = "Источник сообщения остаётся конфиденциальным."; @@ -2761,10 +2740,10 @@ "One-time invitation link" = "Одноразовая ссылка"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Подключаться только к onion хостам. Требуется включенный VPN."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Подключаться только к **onion** хостам.\nТребуется совместимый VPN."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Onion хосты используются, если возможно. Требуется включенный VPN."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Onion хосты используются, если возможно.\nТребуется совместимый VPN."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Onion хосты не используются."; @@ -3261,9 +3240,6 @@ /* chat item action */ "Reveal" = "Показать"; -/* No comment provided by engineer. */ -"Revert" = "Отменить изменения"; - /* No comment provided by engineer. */ "Revoke" = "Отозвать"; @@ -3396,7 +3372,7 @@ /* chat item text */ "security code changed" = "код безопасности изменился"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Выбрать"; /* No comment provided by engineer. */ @@ -3423,9 +3399,6 @@ /* No comment provided by engineer. */ "send direct message" = "отправьте сообщение"; -/* No comment provided by engineer. */ -"Send direct message" = "Отправить сообщение"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Отправьте сообщение чтобы соединиться"; @@ -3666,9 +3639,6 @@ /* No comment provided by engineer. */ "Small groups (max 20)" = "Маленькие группы (до 20)"; -/* No comment provided by engineer. */ -"SMP servers" = "SMP серверы"; - /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Во время импорта произошли некоторые ошибки - для получения более подробной информации вы можете обратиться к консоли."; @@ -3768,9 +3738,6 @@ /* No comment provided by engineer. */ "Tap to scan" = "Нажмите, чтобы сканировать"; -/* No comment provided by engineer. */ -"Tap to start a new chat" = "Нажмите, чтобы начать чат"; - /* No comment provided by engineer. */ "TCP connection timeout" = "Таймаут TCP соединения"; @@ -4018,7 +3985,7 @@ "Unknown error" = "Неизвестная ошибка"; /* No comment provided by engineer. */ -"unknown relays" = "неизвестные серверы"; +"unknown servers" = "неизвестные серверы"; /* No comment provided by engineer. */ "Unknown servers!" = "Неизвестные серверы!"; @@ -4059,18 +4026,12 @@ /* No comment provided by engineer. */ "Update" = "Обновить"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "Обновить настройки .onion хостов?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Поменять пароль"; /* No comment provided by engineer. */ "Update network settings?" = "Обновить настройки сети?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "Обновить режим отдельных сессий?"; - /* rcv group event chat item */ "updated group profile" = "обновил(а) профиль группы"; @@ -4080,9 +4041,6 @@ /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "Обновление настроек приведет к сбросу и установке нового соединения со всеми серверами."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "Обновление этих настроек приведет к сбросу и установке нового соединения со всеми серверами."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Обновить и открыть чат"; @@ -4137,9 +4095,6 @@ /* No comment provided by engineer. */ "User profile" = "Профиль чата"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "Для использования .onion хостов требуется совместимый VPN провайдер."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "Используются серверы, предоставленные SimpleX Chat."; @@ -4320,9 +4275,6 @@ /* No comment provided by engineer. */ "Wrong passphrase!" = "Неправильный пароль!"; -/* No comment provided by engineer. */ -"XFTP servers" = "XFTP серверы"; - /* pref value */ "yes" = "да"; @@ -4458,9 +4410,6 @@ /* No comment provided by engineer. */ "You have already requested connection!\nRepeat connection request?" = "Вы уже запросили соединение!\nПовторить запрос?"; -/* 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." = "Пароль не сохранен на устройстве — Вы будете должны ввести его при каждом запуске чата."; @@ -4551,9 +4500,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Ваши профили чата"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Ваш контакт должен быть в сети чтобы установить соединение.\nВы можете отменить соединение и удалить контакт (и попробовать позже с другой ссылкой)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Ваш контакт отправил файл, размер которого превышает максимальный размер (%@)."; diff --git a/apps/ios/th.lproj/Localizable.strings b/apps/ios/th.lproj/Localizable.strings index b1d328ce6e..86efb2837c 100644 --- a/apps/ios/th.lproj/Localizable.strings +++ b/apps/ios/th.lproj/Localizable.strings @@ -738,9 +738,6 @@ /* notification */ "Contact is connected" = "เชื่อมต่อกับผู้ติดต่อแล้ว"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "ผู้ติดต่อยังไม่ได้เชื่อมต่อ!"; - /* No comment provided by engineer. */ "Contact name" = "ชื่อผู้ติดต่อ"; @@ -921,9 +918,6 @@ /* No comment provided by engineer. */ "Delete contact" = "ลบผู้ติดต่อ"; -/* No comment provided by engineer. */ -"Delete Contact" = "ลบผู้ติดต่อ"; - /* No comment provided by engineer. */ "Delete database" = "ลบฐานข้อมูล"; @@ -975,9 +969,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "ลบฐานข้อมูลเก่า?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "ลบการเชื่อมต่อที่รอดำเนินการ"; - /* No comment provided by engineer. */ "Delete pending connection?" = "ลบการเชื่อมต่อที่รอดำเนินการหรือไม่?"; @@ -1281,9 +1272,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "เกิดข้อผิดพลาดในการลบการเชื่อมต่อ"; -/* No comment provided by engineer. */ -"Error deleting contact" = "เกิดข้อผิดพลาดในการลบผู้ติดต่อ"; - /* No comment provided by engineer. */ "Error deleting database" = "เกิดข้อผิดพลาดในการลบฐานข้อมูล"; @@ -2125,10 +2113,10 @@ "One-time invitation link" = "ลิงก์คำเชิญแบบใช้ครั้งเดียว"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "จำเป็นต้องมีโฮสต์หัวหอมสำหรับการเชื่อมต่อ ต้องเปิดใช้งาน VPN สำหรับการเชื่อมต่อ"; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "จำเป็นต้องมีโฮสต์หัวหอมสำหรับการเชื่อมต่อ ต้องเปิดใช้งาน VPN สำหรับการเชื่อมต่อ"; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "จำเป็นต้องมีโฮสต์หัวหอมสำหรับการเชื่อมต่อ ต้องเปิดใช้งาน VPN สำหรับการเชื่อมต่อ"; +"Onion hosts will be used when available.\nRequires compatible VPN." = "จำเป็นต้องมีโฮสต์หัวหอมสำหรับการเชื่อมต่อ ต้องเปิดใช้งาน VPN สำหรับการเชื่อมต่อ"; /* No comment provided by engineer. */ "Onion hosts will not be used." = "โฮสต์หัวหอมจะไม่ถูกใช้"; @@ -2496,9 +2484,6 @@ /* chat item action */ "Reveal" = "เปิดเผย"; -/* No comment provided by engineer. */ -"Revert" = "เปลี่ยนกลับ"; - /* No comment provided by engineer. */ "Revoke" = "ถอน"; @@ -2601,7 +2586,7 @@ /* chat item text */ "security code changed" = "เปลี่ยนรหัสความปลอดภัยแล้ว"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "เลือก"; /* No comment provided by engineer. */ @@ -2625,9 +2610,6 @@ /* No comment provided by engineer. */ "Send delivery receipts to" = "ส่งใบเสร็จรับการจัดส่งข้อความไปที่"; -/* No comment provided by engineer. */ -"Send direct message" = "ส่งข้อความโดยตรง"; - /* No comment provided by engineer. */ "Send disappearing message" = "ส่งข้อความแบบที่หายไป"; @@ -2802,9 +2784,6 @@ /* No comment provided by engineer. */ "Skipped messages" = "ข้อความที่ข้ามไป"; -/* No comment provided by engineer. */ -"SMP servers" = "เซิร์ฟเวอร์ SMP"; - /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "ข้อผิดพลาดที่ไม่ร้ายแรงบางอย่างเกิดขึ้นระหว่างการนำเข้า - คุณอาจดูรายละเอียดเพิ่มเติมได้ที่คอนโซล Chat"; @@ -2880,9 +2859,6 @@ /* 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"; @@ -3087,27 +3063,18 @@ /* No comment provided by engineer. */ "Update" = "อัปเดต"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "อัปเดตการตั้งค่าโฮสต์ .onion ไหม?"; - /* No comment provided by engineer. */ "Update database passphrase" = "อัปเดตรหัสผ่านของฐานข้อมูล"; /* No comment provided by engineer. */ "Update network settings?" = "อัปเดตการตั้งค่าเครือข่ายไหม?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "อัปเดตโหมดการแยกการขนส่งไหม?"; - /* rcv group event chat item */ "updated group profile" = "อัปเดตโปรไฟล์กลุ่มแล้ว"; /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "การอัปเดตการตั้งค่าจะเชื่อมต่อไคลเอนต์กับเซิร์ฟเวอร์ทั้งหมดอีกครั้ง"; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "การอัปเดตการตั้งค่านี้จะเชื่อมต่อไคลเอนต์กับเซิร์ฟเวอร์ทั้งหมดอีกครั้ง"; - /* No comment provided by engineer. */ "Upgrade and open chat" = "อัปเกรดและเปิดการแชท"; @@ -3135,9 +3102,6 @@ /* No comment provided by engineer. */ "User profile" = "โปรไฟล์ผู้ใช้"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "การใช้โฮสต์ .onion ต้องการผู้ให้บริการ VPN ที่เข้ากันได้"; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "กำลังใช้เซิร์ฟเวอร์ SimpleX Chat อยู่"; @@ -3252,9 +3216,6 @@ /* No comment provided by engineer. */ "Wrong passphrase!" = "รหัสผ่านผิด!"; -/* No comment provided by engineer. */ -"XFTP servers" = "เซิร์ฟเวอร์ XFTP"; - /* pref value */ "yes" = "ใช่"; @@ -3345,9 +3306,6 @@ /* 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." = "คุณต้องใส่รหัสผ่านทุกครั้งที่เริ่มแอป - รหัสผ่านไม่ได้จัดเก็บไว้ในอุปกรณ์"; @@ -3426,9 +3384,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "โปรไฟล์แชทของคุณ"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "ผู้ติดต่อของคุณจะต้องออนไลน์เพื่อให้การเชื่อมต่อเสร็จสมบูรณ์\nคุณสามารถยกเลิกการเชื่อมต่อนี้และลบผู้ติดต่อออก (และลองใหม่ในภายหลังด้วยลิงก์ใหม่)"; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "ผู้ติดต่อของคุณส่งไฟล์ที่ใหญ่กว่าขนาดสูงสุดที่รองรับในปัจจุบัน (%@)"; diff --git a/apps/ios/tr.lproj/Localizable.strings b/apps/ios/tr.lproj/Localizable.strings index 98645f8b42..44e0bff367 100644 --- a/apps/ios/tr.lproj/Localizable.strings +++ b/apps/ios/tr.lproj/Localizable.strings @@ -647,7 +647,7 @@ /* rcv group event chat item */ "blocked %@" = "engellendi %@"; -/* blocked chat item */ +/* marked deleted chat item preview text */ "blocked by admin" = "yönetici tarafından engellendi"; /* No comment provided by engineer. */ @@ -996,9 +996,6 @@ /* notification */ "Contact is connected" = "Kişi bağlandı"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Kişi şuan bağlanmadı!"; - /* No comment provided by engineer. */ "Contact name" = "Kişi adı"; @@ -1215,12 +1212,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Kişiyi sil"; -/* No comment provided by engineer. */ -"Delete Contact" = "Kişiyi sil"; - -/* No comment provided by engineer. */ -"Delete contact?\nThis cannot be undone!" = "Kişi silinsin mi?\nBu geri alınamaz!"; - /* No comment provided by engineer. */ "Delete database" = "Veritabanını sil"; @@ -1275,9 +1266,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Eski veritabanı silinsin mi?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Bekleyen bağlantıyı sil"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Bekleyen bağlantı silinsin mi?"; @@ -1677,9 +1665,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Bağlantı silinirken hata oluştu"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Kişi silinirken hata oluştu"; - /* No comment provided by engineer. */ "Error deleting database" = "Veritabanı silinirken hata oluştu"; @@ -2506,12 +2491,6 @@ /* notification */ "message received" = "mesaj alındı"; -/* No comment provided by engineer. */ -"Message routing fallback" = "Mesaj yönlendirme yedeklemesi"; - -/* No comment provided by engineer. */ -"Message routing mode" = "Mesaj yönlendirme modu"; - /* No comment provided by engineer. */ "Message source remains private." = "Mesaj kaynağı gizli kalır."; @@ -2767,10 +2746,10 @@ "One-time invitation link" = "Tek zamanlı bağlantı daveti"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Bağlantı için Onion ana bilgisayarları gerekecektir. VPN'nin etkinleştirilmesi gerekir."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Bağlantı için Onion ana bilgisayarları gerekecektir.\nVPN'nin etkinleştirilmesi gerekir."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Onion ana bilgisayarları mevcutsa kullanılacaktır. VPN'nin etkinleştirilmesi gerekir."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Onion ana bilgisayarları mevcutsa kullanılacaktır.\nVPN'nin etkinleştirilmesi gerekir."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Onion ana bilgisayarları kullanılmayacaktır."; @@ -3267,9 +3246,6 @@ /* chat item action */ "Reveal" = "Göster"; -/* No comment provided by engineer. */ -"Revert" = "Geri al"; - /* No comment provided by engineer. */ "Revoke" = "İptal et"; @@ -3402,7 +3378,7 @@ /* chat item text */ "security code changed" = "güvenlik kodu değiştirildi"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Seç"; /* No comment provided by engineer. */ @@ -3429,9 +3405,6 @@ /* No comment provided by engineer. */ "send direct message" = "doğrudan mesaj gönder"; -/* No comment provided by engineer. */ -"Send direct message" = "Doğrudan mesaj gönder"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Bağlanmak için doğrudan mesaj gönder"; @@ -3675,9 +3648,6 @@ /* No comment provided by engineer. */ "Small groups (max 20)" = "Küçük gruplar (en fazla 20 kişi)"; -/* No comment provided by engineer. */ -"SMP servers" = "SMP sunucuları"; - /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "İçe aktarma sırasında bazı ölümcül olmayan hatalar oluştu - daha fazla ayrıntı için Sohbet konsoluna bakabilirsiniz."; @@ -3777,9 +3747,6 @@ /* No comment provided by engineer. */ "Tap to scan" = "Taramak için tıkla"; -/* No comment provided by engineer. */ -"Tap to start a new chat" = "Yeni bir sohbet başlatmak için tıkla"; - /* No comment provided by engineer. */ "TCP connection timeout" = "TCP bağlantı zaman aşımı"; @@ -4027,7 +3994,7 @@ "Unknown error" = "Bilinmeyen hata"; /* No comment provided by engineer. */ -"unknown relays" = "bilinmeyen yönlendiriciler"; +"unknown servers" = "bilinmeyen yönlendiriciler"; /* No comment provided by engineer. */ "Unknown servers!" = "Bilinmeyen sunucular!"; @@ -4068,18 +4035,12 @@ /* No comment provided by engineer. */ "Update" = "Güncelle"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = ".onion ana bilgisayarların ayarı güncellensin mi?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Veritabanı parolasını güncelle"; /* No comment provided by engineer. */ "Update network settings?" = "Bağlantı ayarları güncellensin mi?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "Taşıma izolasyon modu güncellensin mi?"; - /* rcv group event chat item */ "updated group profile" = "grup profili güncellendi"; @@ -4089,9 +4050,6 @@ /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "Ayarların güncellenmesi, istemciyi tüm sunuculara yeniden bağlayacaktır."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "Bu ayarın güncellenmesi, istemciyi tüm sunuculara yeniden bağlayacaktır."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Yükselt ve sohbeti aç"; @@ -4146,9 +4104,6 @@ /* No comment provided by engineer. */ "User profile" = "Kullanıcı profili"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = ".onion ana bilgisayarlarını kullanmak için uyumlu VPN sağlayıcısı gerekir."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "SimpleX Chat sunucuları kullanılıyor."; @@ -4329,9 +4284,6 @@ /* No comment provided by engineer. */ "Wrong passphrase!" = "Yanlış parola!"; -/* No comment provided by engineer. */ -"XFTP servers" = "XFTP sunucuları"; - /* pref value */ "yes" = "evet"; @@ -4467,9 +4419,6 @@ /* No comment provided by engineer. */ "You have already requested connection!\nRepeat connection request?" = "Zaten bağlantı isteğinde bulundunuz!\nBağlantı isteği tekrarlansın mı?"; -/* No comment provided by engineer. */ -"You have no chats" = "Hiç sohbetiniz yok"; - /* No comment provided by engineer. */ "You have to enter passphrase every time the app starts - it is not stored on the device." = "Uygulama her başladığında parola girmeniz gerekir - parola cihazınızda saklanmaz."; @@ -4560,9 +4509,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Sohbet profillerin"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Bağlantının tamamlanması için kişinizin çevrimiçi olması gerekir.\nBu bağlantıyı iptal edebilir ve kişiyi kaldırabilirsiniz (ve daha sonra yeni bir bağlantıyla deneyebilirsiniz)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Kişiniz şu anda desteklenen maksimum boyuttan (%@) daha büyük bir dosya gönderdi."; diff --git a/apps/ios/uk.lproj/Localizable.strings b/apps/ios/uk.lproj/Localizable.strings index 1d2630dd1f..b0153d99b4 100644 --- a/apps/ios/uk.lproj/Localizable.strings +++ b/apps/ios/uk.lproj/Localizable.strings @@ -647,7 +647,7 @@ /* rcv group event chat item */ "blocked %@" = "заблоковано %@"; -/* blocked chat item */ +/* marked deleted chat item preview text */ "blocked by admin" = "заблоковано адміністратором"; /* No comment provided by engineer. */ @@ -996,9 +996,6 @@ /* notification */ "Contact is connected" = "Контакт підключений"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "Контакт ще не підключено!"; - /* No comment provided by engineer. */ "Contact name" = "Ім'я контактної особи"; @@ -1215,12 +1212,6 @@ /* No comment provided by engineer. */ "Delete contact" = "Видалити контакт"; -/* No comment provided by engineer. */ -"Delete Contact" = "Видалити контакт"; - -/* No comment provided by engineer. */ -"Delete contact?\nThis cannot be undone!" = "Видалити контакт?\nЦе не можна скасувати!"; - /* No comment provided by engineer. */ "Delete database" = "Видалити базу даних"; @@ -1275,9 +1266,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "Видалити стару базу даних?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "Видалити очікуване з'єднання"; - /* No comment provided by engineer. */ "Delete pending connection?" = "Видалити очікуване з'єднання?"; @@ -1677,9 +1665,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "Помилка видалення з'єднання"; -/* No comment provided by engineer. */ -"Error deleting contact" = "Помилка видалення контакту"; - /* No comment provided by engineer. */ "Error deleting database" = "Помилка видалення бази даних"; @@ -2506,12 +2491,6 @@ /* notification */ "message received" = "повідомлення отримано"; -/* No comment provided by engineer. */ -"Message routing fallback" = "Запасний варіант маршрутизації повідомлень"; - -/* No comment provided by engineer. */ -"Message routing mode" = "Режим маршрутизації повідомлень"; - /* No comment provided by engineer. */ "Message source remains private." = "Джерело повідомлення залишається приватним."; @@ -2767,10 +2746,10 @@ "One-time invitation link" = "Посилання на одноразове запрошення"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Для підключення будуть потрібні хости onion. Потрібно увімкнути VPN."; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Для підключення будуть потрібні хости onion.\nПотрібно увімкнути VPN."; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "Onion хости будуть використовуватися, коли вони будуть доступні. Потрібно увімкнути VPN."; +"Onion hosts will be used when available.\nRequires compatible VPN." = "Onion хости будуть використовуватися, коли вони будуть доступні.\nПотрібно увімкнути VPN."; /* No comment provided by engineer. */ "Onion hosts will not be used." = "Onion хости не будуть використовуватися."; @@ -3267,9 +3246,6 @@ /* chat item action */ "Reveal" = "Показувати"; -/* No comment provided by engineer. */ -"Revert" = "Повернутися"; - /* No comment provided by engineer. */ "Revoke" = "Відкликати"; @@ -3402,7 +3378,7 @@ /* chat item text */ "security code changed" = "змінено код безпеки"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "Виберіть"; /* No comment provided by engineer. */ @@ -3429,9 +3405,6 @@ /* No comment provided by engineer. */ "send direct message" = "надіслати пряме повідомлення"; -/* No comment provided by engineer. */ -"Send direct message" = "Надішліть пряме повідомлення"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Надішліть пряме повідомлення, щоб підключитися"; @@ -3675,9 +3648,6 @@ /* No comment provided by engineer. */ "Small groups (max 20)" = "Невеликі групи (максимум 20 осіб)"; -/* No comment provided by engineer. */ -"SMP servers" = "Сервери SMP"; - /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "Під час імпорту виникли деякі нефатальні помилки – ви можете переглянути консоль чату, щоб дізнатися більше."; @@ -3777,9 +3747,6 @@ /* No comment provided by engineer. */ "Tap to scan" = "Натисніть, щоб сканувати"; -/* No comment provided by engineer. */ -"Tap to start a new chat" = "Натисніть, щоб почати новий чат"; - /* No comment provided by engineer. */ "TCP connection timeout" = "Тайм-аут TCP-з'єднання"; @@ -4027,7 +3994,7 @@ "Unknown error" = "Невідома помилка"; /* No comment provided by engineer. */ -"unknown relays" = "невідомі реле"; +"unknown servers" = "невідомі реле"; /* No comment provided by engineer. */ "Unknown servers!" = "Невідомі сервери!"; @@ -4068,18 +4035,12 @@ /* No comment provided by engineer. */ "Update" = "Оновлення"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "Оновити налаштування хостів .onion?"; - /* No comment provided by engineer. */ "Update database passphrase" = "Оновити парольну фразу бази даних"; /* No comment provided by engineer. */ "Update network settings?" = "Оновити налаштування мережі?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "Оновити режим транспортної ізоляції?"; - /* rcv group event chat item */ "updated group profile" = "оновлений профіль групи"; @@ -4089,9 +4050,6 @@ /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "Оновлення налаштувань призведе до перепідключення клієнта до всіх серверів."; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "Оновлення цього параметра призведе до перепідключення клієнта до всіх серверів."; - /* No comment provided by engineer. */ "Upgrade and open chat" = "Оновлення та відкритий чат"; @@ -4146,9 +4104,6 @@ /* No comment provided by engineer. */ "User profile" = "Профіль користувача"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "Для використання хостів .onion потрібен сумісний VPN-провайдер."; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "Використання серверів SimpleX Chat."; @@ -4329,9 +4284,6 @@ /* No comment provided by engineer. */ "Wrong passphrase!" = "Неправильний пароль!"; -/* No comment provided by engineer. */ -"XFTP servers" = "Сервери XFTP"; - /* pref value */ "yes" = "так"; @@ -4467,9 +4419,6 @@ /* No comment provided by engineer. */ "You have already requested connection!\nRepeat connection request?" = "Ви вже надіслали запит на підключення!\nПовторити запит на підключення?"; -/* 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." = "Вам доведеться вводити парольну фразу щоразу під час запуску програми - вона не зберігається на пристрої."; @@ -4560,9 +4509,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "Ваші профілі чату"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Для завершення з'єднання ваш контакт має бути онлайн.\nВи можете скасувати це з'єднання і видалити контакт (і спробувати пізніше з новим посиланням)."; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Ваш контакт надіслав файл, розмір якого перевищує підтримуваний на цей момент максимальний розмір (%@)."; diff --git a/apps/ios/zh-Hans.lproj/Localizable.strings b/apps/ios/zh-Hans.lproj/Localizable.strings index 07eecee246..a68dd348e8 100644 --- a/apps/ios/zh-Hans.lproj/Localizable.strings +++ b/apps/ios/zh-Hans.lproj/Localizable.strings @@ -599,7 +599,7 @@ /* rcv group event chat item */ "blocked %@" = "已封禁 %@"; -/* blocked chat item */ +/* marked deleted chat item preview text */ "blocked by admin" = "由管理员封禁"; /* No comment provided by engineer. */ @@ -924,9 +924,6 @@ /* notification */ "Contact is connected" = "联系已连接"; -/* No comment provided by engineer. */ -"Contact is not connected yet!" = "联系人尚未连接!"; - /* No comment provided by engineer. */ "Contact name" = "联系人姓名"; @@ -1131,9 +1128,6 @@ /* No comment provided by engineer. */ "Delete contact" = "删除联系人"; -/* No comment provided by engineer. */ -"Delete Contact" = "删除联系人"; - /* No comment provided by engineer. */ "Delete database" = "删除数据库"; @@ -1188,9 +1182,6 @@ /* No comment provided by engineer. */ "Delete old database?" = "删除旧数据库吗?"; -/* No comment provided by engineer. */ -"Delete pending connection" = "删除挂起连接"; - /* No comment provided by engineer. */ "Delete pending connection?" = "删除待定连接?"; @@ -1569,9 +1560,6 @@ /* No comment provided by engineer. */ "Error deleting connection" = "删除连接错误"; -/* No comment provided by engineer. */ -"Error deleting contact" = "删除联系人错误"; - /* No comment provided by engineer. */ "Error deleting database" = "删除数据库错误"; @@ -2599,10 +2587,10 @@ "One-time invitation link" = "一次性邀请链接"; /* No comment provided by engineer. */ -"Onion hosts will be required for connection. Requires enabling VPN." = "Onion 主机将用于连接。需要启用 VPN。"; +"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Onion 主机将用于连接。需要启用 VPN。"; /* No comment provided by engineer. */ -"Onion hosts will be used when available. Requires enabling VPN." = "当可用时,将使用 Onion 主机。需要启用 VPN。"; +"Onion hosts will be used when available.\nRequires compatible VPN." = "当可用时,将使用 Onion 主机。需要启用 VPN。"; /* No comment provided by engineer. */ "Onion hosts will not be used." = "将不会使用 Onion 主机。"; @@ -3060,9 +3048,6 @@ /* chat item action */ "Reveal" = "揭示"; -/* No comment provided by engineer. */ -"Revert" = "恢复"; - /* No comment provided by engineer. */ "Revoke" = "撤销"; @@ -3189,7 +3174,7 @@ /* chat item text */ "security code changed" = "安全密码已更改"; -/* No comment provided by engineer. */ +/* chat item action */ "Select" = "选择"; /* No comment provided by engineer. */ @@ -3216,9 +3201,6 @@ /* No comment provided by engineer. */ "send direct message" = "发送私信"; -/* No comment provided by engineer. */ -"Send direct message" = "发送私信"; - /* No comment provided by engineer. */ "Send direct message to connect" = "发送私信来连接"; @@ -3441,9 +3423,6 @@ /* No comment provided by engineer. */ "Small groups (max 20)" = "小群组(最多 20 人)"; -/* No comment provided by engineer. */ -"SMP servers" = "SMP 服务器"; - /* No comment provided by engineer. */ "Some non-fatal errors occurred during import - you may see Chat console for more details." = "导入过程中发生了一些非致命错误——您可以查看聊天控制台了解更多详细信息。"; @@ -3543,9 +3522,6 @@ /* No comment provided by engineer. */ "Tap to scan" = "轻按扫描"; -/* No comment provided by engineer. */ -"Tap to start a new chat" = "点击开始一个新聊天"; - /* No comment provided by engineer. */ "TCP connection timeout" = "TCP 连接超时"; @@ -3813,18 +3789,12 @@ /* No comment provided by engineer. */ "Update" = "更新"; -/* No comment provided by engineer. */ -"Update .onion hosts setting?" = "更新 .onion 主机设置?"; - /* No comment provided by engineer. */ "Update database passphrase" = "更新数据库密码"; /* No comment provided by engineer. */ "Update network settings?" = "更新网络设置?"; -/* No comment provided by engineer. */ -"Update transport isolation mode?" = "更新传输隔离模式?"; - /* rcv group event chat item */ "updated group profile" = "已更新的群组资料"; @@ -3834,9 +3804,6 @@ /* No comment provided by engineer. */ "Updating settings will re-connect the client to all servers." = "更新设置会将客户端重新连接到所有服务器。"; -/* No comment provided by engineer. */ -"Updating this setting will re-connect the client to all servers." = "更新此设置将重新连接客户端到所有服务器。"; - /* No comment provided by engineer. */ "Upgrade and open chat" = "升级并打开聊天"; @@ -3882,9 +3849,6 @@ /* No comment provided by engineer. */ "User profile" = "用户资料"; -/* No comment provided by engineer. */ -"Using .onion hosts requires compatible VPN provider." = "使用 .onion 主机需要兼容的 VPN 提供商。"; - /* No comment provided by engineer. */ "Using SimpleX Chat servers." = "使用 SimpleX Chat 服务器。"; @@ -4047,9 +4011,6 @@ /* No comment provided by engineer. */ "Wrong passphrase!" = "密码错误!"; -/* No comment provided by engineer. */ -"XFTP servers" = "XFTP 服务器"; - /* pref value */ "yes" = "是"; @@ -4161,9 +4122,6 @@ /* No comment provided by engineer. */ "You have already requested connection via this address!" = "你已经请求通过此地址进行连接!"; -/* 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." = "您必须在每次应用程序启动时输入密码——它不存储在设备上。"; @@ -4248,9 +4206,6 @@ /* No comment provided by engineer. */ "Your chat profiles" = "您的聊天资料"; -/* No comment provided by engineer. */ -"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "您的联系人需要在线才能完成连接。\n您可以取消此连接并删除联系人(然后尝试使用新链接)。"; - /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "您的联系人发送的文件大于当前支持的最大大小 (%@)。"; diff --git a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt index 070c96d6da..1f0f6d470e 100644 --- a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt +++ b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt @@ -11,11 +11,11 @@ import android.view.ViewGroup import android.view.inputmethod.* import android.widget.EditText import android.widget.TextView -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb @@ -51,6 +51,7 @@ actual fun PlatformTextField( textStyle: MutableState, showDeleteTextButton: MutableState, userIsObserver: Boolean, + placeholder: String, onMessageChange: (String) -> Unit, onUpArrow: () -> Unit, onFilesPasted: (List) -> Unit, @@ -58,10 +59,11 @@ actual fun PlatformTextField( ) { val cs = composeState.value val textColor = MaterialTheme.colors.onBackground - val padding = PaddingValues(12.dp, 7.dp, 45.dp, 0.dp) - val paddingStart = with(LocalDensity.current) { 12.dp.roundToPx() } + val hintColor = MaterialTheme.colors.secondary + val padding = PaddingValues(0.dp, 7.dp, 50.dp, 0.dp) + val paddingStart = 0 val paddingTop = with(LocalDensity.current) { 7.dp.roundToPx() } - val paddingEnd = with(LocalDensity.current) { 45.dp.roundToPx() } + val paddingEnd = with(LocalDensity.current) { 50.dp.roundToPx() } val paddingBottom = with(LocalDensity.current) { 7.dp.roundToPx() } var showKeyboard by remember { mutableStateOf(false) } var freeFocus by remember { mutableStateOf(false) } @@ -113,6 +115,8 @@ actual fun PlatformTextField( editText.background = ColorDrawable(Color.Transparent.toArgb()) editText.setPadding(paddingStart, paddingTop, paddingEnd, paddingBottom) editText.setText(cs.message) + editText.hint = placeholder + editText.setHintTextColor(hintColor.toArgb()) if (Build.VERSION.SDK_INT >= 29) { editText.textCursorDrawable?.let { DrawableCompat.setTint(it, CurrentColors.value.colors.secondary.toArgb()) } } else { @@ -135,6 +139,8 @@ actual fun PlatformTextField( editText }) { it.setTextColor(textColor.toArgb()) + it.setHintTextColor(hintColor.toArgb()) + it.hint = placeholder it.textSize = textStyle.value.fontSize.value * appPrefs.fontScale.get() it.isFocusable = composeState.value.preview !is ComposePreview.VoicePreview it.isFocusableInTouchMode = it.isFocusable diff --git a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.android.kt b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.android.kt index 1b9e80b8a0..9a3d9e5e4f 100644 --- a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.android.kt +++ b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.android.kt @@ -6,7 +6,6 @@ import androidx.compose.material.Divider import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.scale import androidx.compose.ui.unit.dp import chat.simplex.common.platform.onRightClick import chat.simplex.common.views.helpers.* @@ -20,14 +19,9 @@ actual fun ChatListNavLinkLayout( disabled: Boolean, selectedChat: State, nextChatSelected: State, - oneHandUI: State ) { var modifier = Modifier.fillMaxWidth() - if (oneHandUI != null && oneHandUI.value) { - modifier = modifier.scale(scaleX = 1f, scaleY = -1f) - } - if (!disabled) modifier = modifier .combinedClickable(onClick = click, onLongClick = { showMenu.value = true }) .onRightClick { showMenu.value = true } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt index b24c05937d..0df2633610 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt @@ -276,7 +276,9 @@ fun AndroidScreen(settingsState: SettingsViewState) { snapshotFlow { ModalManager.center.modalCount.value > 0 } .filter { chatModel.chatId.value == null } .collect { modalBackground -> - if (modalBackground && !chatModel.newChatSheetVisible.value) { + if (chatModel.newChatSheetVisible.value) { + platform.androidSetStatusAndNavBarColors(CurrentColors.value.colors.isLight, CurrentColors.value.colors.background, false, appPrefs.oneHandUI.get()) + } else if (modalBackground) { platform.androidSetStatusAndNavBarColors(CurrentColors.value.colors.isLight, CurrentColors.value.colors.background, false, false) } else { platform.androidSetStatusAndNavBarColors(CurrentColors.value.colors.isLight, CurrentColors.value.colors.background, !appPrefs.oneHandUI.get(), appPrefs.oneHandUI.get()) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index e396ecad56..4211ebd4b7 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -345,6 +345,9 @@ object ChatModel { return withContext(Dispatchers.Main) { // update current chat if (chatId.value == cInfo.id) { + if (cItem.isDeletedContent || cItem.meta.itemDeleted != null) { + AudioPlayer.stop(cItem) + } val items = chatItems.value val itemIndex = items.indexOfFirst { it.id == cItem.id } if (itemIndex >= 0) { @@ -467,6 +470,21 @@ object ChatModel { // update current chat return if (chatId.value == groupInfo.id) { val memberIndex = groupMembersIndexes[member.groupMemberId] + val updated = chatItems.value.map { + // Take into account only specific changes, not all. Other member updates are not important and can be skipped + if (it.chatDir is CIDirection.GroupRcv && it.chatDir.groupMember.groupMemberId == member.groupMemberId && + (it.chatDir.groupMember.image != member.image || + it.chatDir.groupMember.chatViewName != member.chatViewName || + it.chatDir.groupMember.blocked != member.blocked || + it.chatDir.groupMember.memberRole != member.memberRole) + ) + it.copy(chatDir = CIDirection.GroupRcv(member)) + else + it + } + if (updated != chatItems.value) { + chatItems.replaceAll(updated) + } if (memberIndex != null) { groupMembers[memberIndex] = member false @@ -1909,7 +1927,7 @@ data class ChatItem ( } } - fun memberToModerate(chatInfo: ChatInfo): Pair? { + fun memberToModerate(chatInfo: ChatInfo): Pair? { return if (chatInfo is ChatInfo.Group && chatDir is CIDirection.GroupRcv) { val m = chatInfo.groupInfo.membership if (m.memberRole >= GroupMemberRole.Admin && m.memberRole >= chatDir.groupMember.memberRole && meta.itemDeleted == null) { @@ -1917,11 +1935,30 @@ data class ChatItem ( } else { null } + } else if (chatInfo is ChatInfo.Group && chatDir is CIDirection.GroupSnd) { + val m = chatInfo.groupInfo.membership + if (m.memberRole >= GroupMemberRole.Admin) { + chatInfo.groupInfo to null + } else { + null + } } else { null } } + val showLocalDelete: Boolean + get() = when (content) { + is CIContent.SndDirectE2EEInfo -> false + is CIContent.RcvDirectE2EEInfo -> false + is CIContent.SndGroupE2EEInfo -> false + is CIContent.RcvGroupE2EEInfo -> false + else -> true + } + + val canBeDeletedForSelf: Boolean + get() = (content.msgContent != null && !meta.isLive) || meta.itemDeleted != null || isDeletedContent || mergeCategory != null || showLocalDelete + val showNotification: Boolean get() = when (content) { is CIContent.SndMsgContent -> false diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index 2ac6886eb1..4f193bebd2 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -142,8 +142,8 @@ class AppPreferences { }, set = fun(mode: TransportSessionMode) { _networkSessionMode.set(mode.name) } ) - val networkSMPProxyMode = mkStrPreference(SHARED_PREFS_NETWORK_SMP_PROXY_MODE, SMPProxyMode.Never.name) - val networkSMPProxyFallback = mkStrPreference(SHARED_PREFS_NETWORK_SMP_PROXY_FALLBACK, SMPProxyFallback.Allow.name) + val networkSMPProxyMode = mkStrPreference(SHARED_PREFS_NETWORK_SMP_PROXY_MODE, NetCfg.defaults.smpProxyMode.name) + val networkSMPProxyFallback = mkStrPreference(SHARED_PREFS_NETWORK_SMP_PROXY_FALLBACK, NetCfg.defaults.smpProxyFallback.name) val networkHostMode = mkStrPreference(SHARED_PREFS_NETWORK_HOST_MODE, HostMode.OnionViaSocks.name) val networkRequiredHostMode = mkBoolPreference(SHARED_PREFS_NETWORK_REQUIRED_HOST_MODE, false) val networkTCPConnectTimeout = mkTimeoutPreference(SHARED_PREFS_NETWORK_TCP_CONNECT_TIMEOUT, NetCfg.defaults.tcpConnectTimeout, NetCfg.proxyDefaults.tcpConnectTimeout) @@ -225,7 +225,7 @@ class AppPreferences { val iosCallKitEnabled = mkBoolPreference(SHARED_PREFS_IOS_CALL_KIT_ENABLED, true) val iosCallKitCallsInRecents = mkBoolPreference(SHARED_PREFS_IOS_CALL_KIT_CALLS_IN_RECENTS, false) - val oneHandUI = mkBoolPreference(SHARED_PREFS_ONE_HAND_UI, false) + val oneHandUI = mkBoolPreference(SHARED_PREFS_ONE_HAND_UI, appPlatform.isAndroid) private fun mkIntPreference(prefName: String, default: Int) = SharedPreference( @@ -657,8 +657,8 @@ object ChatController { return null } - suspend fun apiCreateActiveUser(rh: Long?, p: Profile?, sameServers: Boolean = false, pastTimestamp: Boolean = false, ctrl: ChatCtrl? = null): User? { - val r = sendCmd(rh, CC.CreateActiveUser(p, sameServers = sameServers, pastTimestamp = pastTimestamp), ctrl) + suspend fun apiCreateActiveUser(rh: Long?, p: Profile?, pastTimestamp: Boolean = false, ctrl: ChatCtrl? = null): User? { + val r = sendCmd(rh, CC.CreateActiveUser(p, pastTimestamp = pastTimestamp), ctrl) if (r is CR.ActiveUser) return r.user.updateRemoteHostId(rh) else if ( r is CR.ChatCmdError && r.chatError is ChatError.ChatErrorStore && r.chatError.storeError is StoreError.DuplicateName || @@ -2176,7 +2176,10 @@ object ChatController { r.chatItemDeletions.forEach { (deletedChatItem, toChatItem) -> val cInfo = deletedChatItem.chatInfo val cItem = deletedChatItem.chatItem - AudioPlayer.stop(cItem) + if (chatModel.chatId.value != null) { + // Stop voice playback only inside a chat, allow to play in a chat list + AudioPlayer.stop(cItem) + } val isLastChatItem = chatModel.getChat(cInfo.id)?.chatItems?.lastOrNull()?.id == cItem.id if (isLastChatItem && ntfManager.hasNotificationsForChat(cInfo.id)) { ntfManager.cancelNotificationsForChat(cInfo.id) @@ -2821,7 +2824,7 @@ class SharedPreference(val get: () -> T, set: (T) -> Unit) { sealed class CC { class Console(val cmd: String): CC() class ShowActiveUser: CC() - class CreateActiveUser(val profile: Profile?, val sameServers: Boolean, val pastTimestamp: Boolean): CC() + class CreateActiveUser(val profile: Profile?, val pastTimestamp: Boolean): CC() class ListUsers: CC() class ApiSetActiveUser(val userId: Long, val viewPwd: String?): CC() class SetAllContactReceipts(val enable: Boolean): CC() @@ -2959,7 +2962,7 @@ sealed class CC { is Console -> cmd is ShowActiveUser -> "/u" is CreateActiveUser -> { - val user = NewUser(profile, sameServers = sameServers, pastTimestamp = pastTimestamp) + val user = NewUser(profile, pastTimestamp = pastTimestamp) "/_create user ${json.encodeToString(user)}" } is ListUsers -> "/users" @@ -3290,7 +3293,6 @@ fun onOff(b: Boolean): String = if (b) "on" else "off" @Serializable data class NewUser( val profile: Profile?, - val sameServers: Boolean, val pastTimestamp: Boolean ) @@ -3586,10 +3588,6 @@ enum class SMPProxyMode { @SerialName("unknown") Unknown, @SerialName("unprotected") Unprotected, @SerialName("never") Never; - - companion object { - val default = Never - } } @Serializable @@ -3597,10 +3595,6 @@ enum class SMPProxyFallback { @SerialName("allow") Allow, @SerialName("allowProtected") AllowProtected, @SerialName("prohibit") Prohibit; - - companion object { - val default = Allow - } } @Serializable @@ -6227,7 +6221,7 @@ data class AppSettings( uiDarkColorScheme?.let { def.systemDarkTheme.set(it) } uiCurrentThemeIds?.let { def.currentThemeIds.set(it) } uiThemes?.let { def.themeOverrides.set(it.skipDuplicates()) } - oneHandUI?.let { def.oneHandUI.set(it) } + oneHandUI?.let { def.oneHandUI.set(if (appPlatform.isAndroid) it else false) } } companion object { @@ -6259,7 +6253,7 @@ data class AppSettings( uiDarkColorScheme = DefaultTheme.SIMPLEX.themeName, uiCurrentThemeIds = null, uiThemes = null, - oneHandUI = false + oneHandUI = true ) val current: AppSettings diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt index af47f9c3e0..475339f71a 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt @@ -14,6 +14,7 @@ expect fun PlatformTextField( textStyle: MutableState, showDeleteTextButton: MutableState, userIsObserver: Boolean, + placeholder: String, onMessageChange: (String) -> Unit, onUpArrow: () -> Unit, onFilesPasted: (List) -> Unit, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt index 1f49a98728..259b7e2320 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt @@ -20,6 +20,8 @@ import chat.simplex.common.views.chat.* import chat.simplex.common.views.helpers.* import chat.simplex.common.model.ChatModel import chat.simplex.common.platform.* +import chat.simplex.res.MR +import dev.icerock.moko.resources.compose.stringResource @Composable fun TerminalView(chatModel: ChatModel, close: () -> Unit) { @@ -77,29 +79,33 @@ fun TerminalLayout( Scaffold( topBar = { CloseSheetBar(close) }, bottomBar = { - Box(Modifier.padding(horizontal = 8.dp)) { - SendMsgView( - composeState = composeState, - showVoiceRecordIcon = false, - recState = remember { mutableStateOf(RecordingState.NotStarted) }, - isDirectChat = false, - liveMessageAlertShown = SharedPreference(get = { false }, set = {}), - sendMsgEnabled = true, - sendButtonEnabled = true, - nextSendGrpInv = false, - needToAllowVoiceToContact = false, - allowedVoiceByPrefs = false, - userIsObserver = false, - userCanSend = true, - allowVoiceToContact = {}, - sendMessage = { sendCommand() }, - sendLiveMessage = null, - updateLiveMessage = null, - editPrevMessage = {}, - onMessageChange = ::onMessageChange, - onFilesPasted = {}, - textStyle = textStyle - ) + Column { + Divider() + Box(Modifier.padding(horizontal = 8.dp)) { + SendMsgView( + composeState = composeState, + showVoiceRecordIcon = false, + recState = remember { mutableStateOf(RecordingState.NotStarted) }, + isDirectChat = false, + liveMessageAlertShown = SharedPreference(get = { false }, set = {}), + sendMsgEnabled = true, + sendButtonEnabled = true, + nextSendGrpInv = false, + needToAllowVoiceToContact = false, + allowedVoiceByPrefs = false, + userIsObserver = false, + userCanSend = true, + allowVoiceToContact = {}, + placeholder = "", + sendMessage = { sendCommand() }, + sendLiveMessage = null, + updateLiveMessage = null, + editPrevMessage = {}, + onMessageChange = ::onMessageChange, + onFilesPasted = {}, + textStyle = textStyle + ) + } } }, contentColor = LocalContentColor.current, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemInfoView.kt index 797d8e66b8..c7df983324 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemInfoView.kt @@ -28,6 +28,7 @@ import chat.simplex.common.views.chat.item.ItemAction import chat.simplex.common.views.chat.item.MarkdownText import chat.simplex.common.views.helpers.* import chat.simplex.common.ui.theme.* +import chat.simplex.common.views.chat.group.MemberProfileImage import chat.simplex.common.views.chatlist.* import chat.simplex.res.MR import dev.icerock.moko.resources.ImageResource @@ -334,7 +335,7 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools SectionItemView( padding = PaddingValues(horizontal = 0.dp) ) { - ProfileImage(size = 36.dp, member.image) + MemberProfileImage(size = 36.dp, member) Spacer(Modifier.width(DEFAULT_SPACE_AFTER_ICON)) Text( member.chatViewName, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt index 6b879d1d02..c0a7775040 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt @@ -1,5 +1,7 @@ package chat.simplex.common.views.chat +import androidx.compose.animation.* +import androidx.compose.animation.core.* import androidx.compose.desktop.ui.tooling.preview.Preview import androidx.compose.foundation.* import androidx.compose.foundation.gestures.* @@ -50,13 +52,14 @@ fun ChatView(staleChatId: State, onComposed: suspend (chatId: String) - val shouldReturn = remember { mutableStateOf(false) } val remoteHostId = remember { derivedStateOf { chatModel.chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }?.remoteHostId } } val showSearch = rememberSaveable { mutableStateOf(false) } - val activeChatInfo = remember { derivedStateOf { - val info = chatModel.chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }?.chatInfo - if (info == null) { - shouldReturn.value = true + val activeChatInfo = remember { + derivedStateOf { + val info = chatModel.chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }?.chatInfo + if (info == null) { + shouldReturn.value = true + } + return@derivedStateOf info ?: ChatInfo.Direct.sampleData } - return@derivedStateOf info ?: ChatInfo.Direct.sampleData - } } val user = chatModel.currentUser.value if (shouldReturn.value || user == null) { @@ -82,6 +85,7 @@ fun ChatView(staleChatId: State, onComposed: suspend (chatId: String) - val attachmentOption = rememberSaveable { mutableStateOf(null) } val attachmentBottomSheetState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden) val scope = rememberCoroutineScope() + val selectedChatItems = rememberSaveable { mutableStateOf(null as Set?) } LaunchedEffect(Unit) { // snapshotFlow here is because it reacts much faster on changes in chatModel.chatId.value. // With LaunchedEffect(chatModel.chatId.value) there is a noticeable delay before reconstruction of the view @@ -95,8 +99,12 @@ fun ChatView(staleChatId: State, onComposed: suspend (chatId: String) - } } } + KeyChangeEffect(chatModel.chatId.value) { + if (chatModel.chatId.value != null) { + selectedChatItems.value = null + } + } val view = LocalMultiplatformView() - val chatRh = remoteHostId.value // We need to have real unreadCount value for displaying it inside top right button // Having activeChat reloaded on every change in it is inefficient (UI lags) @@ -117,26 +125,61 @@ fun ChatView(staleChatId: State, onComposed: suspend (chatId: String) - unreadCount, composeState, composeView = { - Column( - Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally - ) { - if ( - chatInfo is ChatInfo.Direct - && !chatInfo.contact.sndReady - && chatInfo.contact.active - && !chatInfo.contact.nextSendGrpInv + if (selectedChatItems.value == null) { + Column( + Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally ) { - Text( - generalGetString(MR.strings.contact_connection_pending), - Modifier.padding(top = 4.dp), - fontSize = 14.sp, - color = MaterialTheme.colors.secondary + if ( + chatInfo is ChatInfo.Direct + && !chatInfo.contact.sndReady + && chatInfo.contact.active + && !chatInfo.contact.nextSendGrpInv + ) { + Text( + generalGetString(MR.strings.contact_connection_pending), + Modifier.padding(top = 4.dp), + fontSize = 14.sp, + color = MaterialTheme.colors.secondary + ) + } + ComposeView( + chatModel, Chat(remoteHostId = chatRh, chatInfo = chatInfo, chatItems = emptyList()), composeState, attachmentOption, + showChooseAttachment = { scope.launch { attachmentBottomSheetState.show() } } ) } - ComposeView( - chatModel, Chat(remoteHostId = chatRh, chatInfo = chatInfo, chatItems = emptyList()), composeState, attachmentOption, - showChooseAttachment = { scope.launch { attachmentBottomSheetState.show() } } + } else { + SelectedItemsBottomToolbar( + chatItems = remember { chatModel.chatItems }.value, + selectedChatItems = selectedChatItems, + chatInfo = chatInfo, + deleteItems = { canDeleteForAll -> + val itemIds = selectedChatItems.value + if (itemIds != null) { + deleteMessagesAlertDialog( + itemIds.sorted(), + generalGetString(if (itemIds.size == 1) MR.strings.delete_message_mark_deleted_warning else MR.strings.delete_messages_mark_deleted_warning), + forAll = canDeleteForAll, + deleteMessages = { ids, forAll -> + deleteMessages(chatRh, chatInfo, ids, forAll, moderate = false) { + selectedChatItems.value = null + } + } + ) + } + }, + moderateItems = { + if (chatInfo is ChatInfo.Group) { + val itemIds = selectedChatItems.value + if (itemIds != null) { + moderateMessagesAlertDialog(itemIds.sorted(), moderateMessageQuestionText(chatInfo.featureEnabled(ChatFeature.FullDelete), itemIds.size), deleteMessages = { ids -> + deleteMessages(chatRh, chatInfo, ids, true, moderate = true) { + selectedChatItems.value = null + } + }) + } + } + } ) } }, @@ -145,6 +188,7 @@ fun ChatView(staleChatId: State, onComposed: suspend (chatId: String) - searchText, useLinkPreviews = useLinkPreviews, linkMode = chatModel.simplexLinkMode.value, + selectedChatItems = selectedChatItems, back = { hideKeyboard(view) AudioPlayer.stop() @@ -271,22 +315,7 @@ fun ChatView(staleChatId: State, onComposed: suspend (chatId: String) - } } }, - deleteMessages = { itemIds -> - if (itemIds.isNotEmpty()) { - withBGApi { - val deleted = chatModel.controller.apiDeleteChatItems( - chatRh, chatInfo.chatType, chatInfo.apiId, itemIds, CIDeleteMode.cidmInternal - ) - if (deleted != null) { - withChats { - for (di in deleted) { - removeChatItem(chatRh, chatInfo, di.deletedChatItem.chatItem) - } - } - } - } - } - }, + deleteMessages = { itemIds -> deleteMessages(chatRh, chatInfo, itemIds, false, moderate = false) }, receiveFile = { fileId -> withBGApi { chatModel.controller.receiveFile(chatRh, user, fileId) } }, @@ -478,7 +507,7 @@ fun ChatView(staleChatId: State, onComposed: suspend (chatId: String) - if (modalBackground) { platform.androidSetStatusAndNavBarColors(CurrentColors.value.colors.isLight, CurrentColors.value.colors.background, false, false) } else { - platform.androidSetStatusAndNavBarColors(CurrentColors.value.colors.isLight, backgroundColorState.value, true, true) + platform.androidSetStatusAndNavBarColors(CurrentColors.value.colors.isLight, backgroundColorState.value, true, false) } } } @@ -536,6 +565,7 @@ fun ChatLayout( searchValue: State, useLinkPreviews: Boolean, linkMode: SimplexLinkMode, + selectedChatItems: MutableState?>, back: () -> Unit, info: () -> Unit, showMemberInfo: (GroupInfo, GroupMember) -> Unit, @@ -593,9 +623,11 @@ fun ChatLayout( ) ) { ProvideWindowInsets(windowInsetsAnimationsEnabled = true) { + val elevation = remember { derivedStateOf { if (attachmentBottomSheetState.currentValue == ModalBottomSheetValue.Hidden) 0.dp else ModalBottomSheetDefaults.Elevation } } ModalBottomSheetLayout( scrimColor = Color.Black.copy(alpha = 0.12F), modifier = Modifier.navigationBarsWithImePadding(), + sheetElevation = elevation.value, sheetContent = { ChooseAttachmentView( attachmentOption, @@ -611,7 +643,13 @@ fun ChatLayout( } Scaffold( - topBar = { ChatInfoToolbar(chatInfo, back, info, startCall, endCall, addMembers, openGroupLink, changeNtfsState, onSearchValueChanged, showSearch) }, + topBar = { + if (selectedChatItems.value == null) { + ChatInfoToolbar(chatInfo, back, info, startCall, endCall, addMembers, openGroupLink, changeNtfsState, onSearchValueChanged, showSearch) + } else { + SelectedItemsTopToolbar(selectedChatItems) + } + }, bottomBar = composeView, modifier = Modifier.navigationBarsWithImePadding(), floatingActionButton = { floatingButton.value() }, @@ -634,7 +672,7 @@ fun ChatLayout( ) { ChatItemsList( remoteHostId, chatInfo, unreadCount, composeState, searchValue, - useLinkPreviews, linkMode, showMemberInfo, loadPrevMessages, deleteMessage, deleteMessages, + useLinkPreviews, linkMode, selectedChatItems, showMemberInfo, loadPrevMessages, deleteMessage, deleteMessages, receiveFile, cancelFile, joinGroup, acceptCall, acceptFeature, openDirectChat, forwardItem, updateContactStats, updateMemberStats, syncContactConnection, syncMemberConnection, findModelChat, findModelMember, setReaction, showItemDetails, markRead, setFloatingButton, onComposed, developerTools, showViaProxy, @@ -899,6 +937,7 @@ fun BoxWithConstraintsScope.ChatItemsList( searchValue: State, useLinkPreviews: Boolean, linkMode: SimplexLinkMode, + selectedChatItems: MutableState?>, showMemberInfo: (GroupInfo, GroupMember) -> Unit, loadPrevMessages: () -> Unit, deleteMessage: (Long, CIDeleteMode) -> Unit, @@ -1012,86 +1051,117 @@ fun BoxWithConstraintsScope.ChatItemsList( tryOrShowError("${cItem.id}ChatItem", error = { CIBrokenComposableView(if (cItem.chatDir.sent) Alignment.CenterEnd else Alignment.CenterStart) }) { - ChatItemView(remoteHostId, chatInfo, cItem, composeState, provider, useLinkPreviews = useLinkPreviews, linkMode = linkMode, revealed = revealed, range = range, deleteMessage = deleteMessage, deleteMessages = deleteMessages, receiveFile = receiveFile, cancelFile = cancelFile, joinGroup = joinGroup, acceptCall = acceptCall, acceptFeature = acceptFeature, openDirectChat = openDirectChat, forwardItem = forwardItem, updateContactStats = updateContactStats, updateMemberStats = updateMemberStats, syncContactConnection = syncContactConnection, syncMemberConnection = syncMemberConnection, findModelChat = findModelChat, findModelMember = findModelMember, scrollToItem = scrollToItem, setReaction = setReaction, showItemDetails = showItemDetails, developerTools = developerTools, showViaProxy = showViaProxy) + ChatItemView(remoteHostId, chatInfo, cItem, composeState, provider, useLinkPreviews = useLinkPreviews, linkMode = linkMode, revealed = revealed, range = range, selectedChatItems = selectedChatItems, selectChatItem = { selectUnselectChatItem(true, cItem, revealed, selectedChatItems) }, deleteMessage = deleteMessage, deleteMessages = deleteMessages, receiveFile = receiveFile, cancelFile = cancelFile, joinGroup = joinGroup, acceptCall = acceptCall, acceptFeature = acceptFeature, openDirectChat = openDirectChat, forwardItem = forwardItem, updateContactStats = updateContactStats, updateMemberStats = updateMemberStats, syncContactConnection = syncContactConnection, syncMemberConnection = syncMemberConnection, findModelChat = findModelChat, findModelMember = findModelMember, scrollToItem = scrollToItem, setReaction = setReaction, showItemDetails = showItemDetails, developerTools = developerTools, showViaProxy = showViaProxy) } } @Composable fun ChatItemView(cItem: ChatItem, range: IntRange?, prevItem: ChatItem?) { - val voiceWithTransparentBack = cItem.content.msgContent is MsgContent.MCVoice && cItem.content.text.isEmpty() && cItem.quotedItem == null && cItem.meta.itemForwarded == null - if (chatInfo is ChatInfo.Group) { - if (cItem.chatDir is CIDirection.GroupRcv) { - val member = cItem.chatDir.groupMember - val (prevMember, memCount) = - if (range != null) { - chatModel.getPrevHiddenMember(member, range) - } else { - null to 1 - } - if (prevItem == null || showMemberImage(member, prevItem) || prevMember != null) { - Column( - Modifier - .padding(top = 8.dp) - .padding(start = 8.dp, end = if (voiceWithTransparentBack) 12.dp else 66.dp), - verticalArrangement = Arrangement.spacedBy(4.dp), - horizontalAlignment = Alignment.Start - ) { - if (cItem.content.showMemberName) { - val memberNameStyle = SpanStyle(fontSize = 13.5.sp, color = CurrentColors.value.colors.secondary) - val memberNameString = if (memCount == 1 && member.memberRole > GroupMemberRole.Member) { - buildAnnotatedString { - withStyle(memberNameStyle.copy(fontWeight = FontWeight.Medium)) { append(member.memberRole.text) } - append(" ") - withStyle(memberNameStyle) { append(memberNames(member, prevMember, memCount)) } - } - } else { - buildAnnotatedString { - withStyle(memberNameStyle) { append(memberNames(member, prevMember, memCount)) } - } - } - Text( - memberNameString, - Modifier.padding(start = MEMBER_IMAGE_SIZE + 10.dp), - maxLines = 2 - ) + val sent = cItem.chatDir.sent + Box(Modifier.padding(bottom = 4.dp)) { + val voiceWithTransparentBack = cItem.content.msgContent is MsgContent.MCVoice && cItem.content.text.isEmpty() && cItem.quotedItem == null && cItem.meta.itemForwarded == null + val selectionVisible = selectedChatItems.value != null && cItem.canBeDeletedForSelf + val selectionOffset by animateDpAsState(if (selectionVisible && !sent) 4.dp + 22.dp * fontSizeMultiplier else 0.dp) + val swipeableOrSelectionModifier = (if (selectionVisible) Modifier else swipeableModifier).graphicsLayer { translationX = selectionOffset.toPx() } + if (chatInfo is ChatInfo.Group) { + if (cItem.chatDir is CIDirection.GroupRcv) { + val member = cItem.chatDir.groupMember + val (prevMember, memCount) = + if (range != null) { + chatModel.getPrevHiddenMember(member, range) + } else { + null to 1 } - Row( - swipeableModifier, - horizontalArrangement = Arrangement.spacedBy(4.dp) + if (prevItem == null || showMemberImage(member, prevItem) || prevMember != null) { + Column( + Modifier + .padding(top = 8.dp) + .padding(start = 8.dp, end = if (voiceWithTransparentBack) 12.dp else 66.dp), + verticalArrangement = Arrangement.spacedBy(4.dp), + horizontalAlignment = Alignment.Start ) { - Box(Modifier.clickable { showMemberInfo(chatInfo.groupInfo, member) }) { - MemberImage(member) + if (cItem.content.showMemberName) { + val memberNameStyle = SpanStyle(fontSize = 13.5.sp, color = CurrentColors.value.colors.secondary) + val memberNameString = if (memCount == 1 && member.memberRole > GroupMemberRole.Member) { + buildAnnotatedString { + withStyle(memberNameStyle.copy(fontWeight = FontWeight.Medium)) { append(member.memberRole.text) } + append(" ") + withStyle(memberNameStyle) { append(memberNames(member, prevMember, memCount)) } + } + } else { + buildAnnotatedString { + withStyle(memberNameStyle) { append(memberNames(member, prevMember, memCount)) } + } + } + Text( + memberNameString, + Modifier.padding(start = MEMBER_IMAGE_SIZE + 10.dp), + maxLines = 2 + ) + } + Box(contentAlignment = Alignment.CenterStart) { + androidx.compose.animation.AnimatedVisibility(selectionVisible, enter = fadeIn(), exit = fadeOut()) { + SelectedChatItem(Modifier, cItem.id, selectedChatItems) + } + Row( + swipeableOrSelectionModifier, + horizontalArrangement = Arrangement.spacedBy(4.dp) + ) { + Box(Modifier.clickable { showMemberInfo(chatInfo.groupInfo, member) }) { + MemberImage(member) + } + ChatItemViewShortHand(cItem, range) + } + } + } + } else { + Box(contentAlignment = Alignment.CenterStart) { + AnimatedVisibility (selectionVisible, enter = fadeIn(), exit = fadeOut()) { + SelectedChatItem(Modifier.padding(start = 8.dp), cItem.id, selectedChatItems) + } + Row( + Modifier + .padding(start = 8.dp + MEMBER_IMAGE_SIZE + 4.dp, end = if (voiceWithTransparentBack) 12.dp else 66.dp) + .then(swipeableOrSelectionModifier) + ) { + ChatItemViewShortHand(cItem, range) } - ChatItemViewShortHand(cItem, range) } } } else { - Row( - Modifier - .padding(start = 8.dp + MEMBER_IMAGE_SIZE + 4.dp, end = if (voiceWithTransparentBack) 12.dp else 66.dp) - .then(swipeableModifier) + Box(contentAlignment = Alignment.CenterStart) { + AnimatedVisibility (selectionVisible, enter = fadeIn(), exit = fadeOut()) { + SelectedChatItem(Modifier.padding(start = 8.dp), cItem.id, selectedChatItems) + } + Box( + Modifier + .padding(start = if (voiceWithTransparentBack) 12.dp else 104.dp, end = 12.dp) + .then(if (selectionVisible) Modifier else swipeableModifier) + ) { + ChatItemViewShortHand(cItem, range) + } + } + } + } else { // direct message + Box(contentAlignment = Alignment.CenterStart) { + AnimatedVisibility (selectionVisible, enter = fadeIn(), exit = fadeOut()) { + SelectedChatItem(Modifier.padding(start = 8.dp), cItem.id, selectedChatItems) + } + Box( + Modifier.padding( + start = if (sent && !voiceWithTransparentBack) 76.dp else 12.dp, + end = if (sent || voiceWithTransparentBack) 12.dp else 76.dp, + ).then(if (!selectionVisible || !sent) swipeableOrSelectionModifier else Modifier) ) { ChatItemViewShortHand(cItem, range) } } - } else { - Box( - Modifier - .padding(start = if (voiceWithTransparentBack) 12.dp else 104.dp, end = 12.dp) - .then(swipeableModifier) - ) { - ChatItemViewShortHand(cItem, range) - } } - } else { // direct message - val sent = cItem.chatDir.sent - Box( - Modifier.padding( - start = if (sent && !voiceWithTransparentBack) 76.dp else 12.dp, - end = if (sent || voiceWithTransparentBack) 12.dp else 76.dp, - ).then(swipeableModifier) - ) { - ChatItemViewShortHand(cItem, range) + if (selectionVisible) { + Box(Modifier.matchParentSize().clickable { + val checked = selectedChatItems.value?.contains(cItem.id) == true + selectUnselectChatItem(select = !checked, cItem, revealed, selectedChatItems) + }) } } } @@ -1317,7 +1387,7 @@ val MEMBER_IMAGE_SIZE: Dp = 38.dp @Composable fun MemberImage(member: GroupMember) { - ProfileImage(MEMBER_IMAGE_SIZE * fontSizeSqrtMultiplier, member.memberProfile.image, backgroundColor = MaterialTheme.colors.background) + MemberProfileImage(MEMBER_IMAGE_SIZE * fontSizeSqrtMultiplier, member, backgroundColor = MaterialTheme.colors.background) } @Composable @@ -1416,6 +1486,96 @@ private fun bottomEndFloatingButton( } } +@Composable +private fun SelectedChatItem( + modifier: Modifier, + ciId: Long, + selectedChatItems: State?>, +) { + val checked = remember { derivedStateOf { selectedChatItems.value?.contains(ciId) == true } } + Icon( + painterResource(if (checked.value) MR.images.ic_check_circle_filled else MR.images.ic_radio_button_unchecked), + null, + modifier.size(22.dp * fontSizeMultiplier), + tint = if (checked.value) { + MaterialTheme.colors.primary + } else if (isInDarkTheme()) { + // .tertiaryLabel instead of .secondary + Color(red = 235f / 255f, 235f / 255f, 245f / 255f, 76f / 255f) + } else { + // .tertiaryLabel instead of .secondary + Color(red = 60f / 255f, 60f / 255f, 67f / 255f, 76f / 255f) + } + ) +} + +private fun selectUnselectChatItem(select: Boolean, ci: ChatItem, revealed: State, selectedChatItems: MutableState?>) { + val itemIds = mutableSetOf() + if (!revealed.value) { + val currIndex = chatModel.getChatItemIndexOrNull(ci) + val ciCategory = ci.mergeCategory + if (currIndex != null && ciCategory != null) { + val (prevHidden, _) = chatModel.getPrevShownChatItem(currIndex, ciCategory) + val range = chatViewItemsRange(currIndex, prevHidden) + if (range != null) { + val reversedChatItems = chatModel.chatItems.asReversed() + for (i in range) { + itemIds.add(reversedChatItems[i].id) + } + } else { + itemIds.add(ci.id) + } + } else { + itemIds.add(ci.id) + } + } else { + itemIds.add(ci.id) + } + if (select) { + val sel = selectedChatItems.value ?: setOf() + selectedChatItems.value = sel.union(itemIds) + } else { + val sel = (selectedChatItems.value ?: setOf()).toMutableSet() + sel.removeAll(itemIds) + selectedChatItems.value = sel + } +} + +private fun deleteMessages(chatRh: Long?, chatInfo: ChatInfo, itemIds: List, forAll: Boolean, moderate: Boolean, onSuccess: () -> Unit = {}) { + if (itemIds.isNotEmpty()) { + withBGApi { + val deleted = if (chatInfo is ChatInfo.Group && forAll && moderate) { + chatModel.controller.apiDeleteMemberChatItems( + chatRh, + groupId = chatInfo.groupInfo.groupId, + itemIds = itemIds + ) + } else { + chatModel.controller.apiDeleteChatItems( + chatRh, + type = chatInfo.chatType, + id = chatInfo.apiId, + itemIds = itemIds, + mode = if (forAll) CIDeleteMode.cidmBroadcast else CIDeleteMode.cidmInternal + ) + } + if (deleted != null) { + withChats { + for (di in deleted) { + val toChatItem = di.toChatItem?.chatItem + if (toChatItem != null) { + upsertChatItem(chatRh, chatInfo, toChatItem) + } else { + removeChatItem(chatRh, chatInfo, di.deletedChatItem.chatItem) + } + } + } + onSuccess() + } + } + } +} + private fun markUnreadChatAsRead(chatId: String) { val chat = chatModel.chats.value.firstOrNull { it.id == chatId } if (chat?.chatStats?.unreadChat != true) return @@ -1593,6 +1753,7 @@ fun PreviewChatLayout() { searchValue, useLinkPreviews = true, linkMode = SimplexLinkMode.DESCRIPTION, + selectedChatItems = remember { mutableStateOf(setOf()) }, back = {}, info = {}, showMemberInfo = { _, _ -> }, @@ -1664,6 +1825,7 @@ fun PreviewGroupChatLayout() { searchValue, useLinkPreviews = true, linkMode = SimplexLinkMode.DESCRIPTION, + selectedChatItems = remember { mutableStateOf(setOf()) }, back = {}, info = {}, showMemberInfo = { _, _ -> }, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt index f7e4b708e6..372de02b41 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt @@ -872,11 +872,9 @@ fun ComposeView( } } } + Column(Modifier.background(MaterialTheme.colors.background)) { Divider() - Row( - modifier = Modifier.background(MaterialTheme.colors.background).padding(end = 8.dp), - verticalAlignment = Alignment.Bottom, - ) { + Row(Modifier.padding(end = 8.dp), verticalAlignment = Alignment.Bottom) { val isGroupAndProhibitedFiles = chat.chatInfo is ChatInfo.Group && !chat.chatInfo.groupInfo.fullGroupPreferences.files.on(chat.chatInfo.groupInfo.membership) val attachmentClicked = if (isGroupAndProhibitedFiles) { { @@ -896,7 +894,7 @@ fun ComposeView( && !nextSendGrpInv.value IconButton( attachmentClicked, - Modifier.padding(bottom = if (appPlatform.isAndroid) 2.dp else with(LocalDensity.current) { 7.sp.toDp() }), + Modifier.padding(bottom = if (appPlatform.isAndroid) 2.sp.toDp() else 5.sp.toDp() * fontSizeSqrtMultiplier), enabled = attachmentEnabled ) { Icon( @@ -925,7 +923,7 @@ fun ComposeView( snapshotFlow { recState.value } .distinctUntilChanged() .collect { - when(it) { + when (it) { is RecordingState.Started -> onAudioAdded(it.filePath, it.progressMs, false) is RecordingState.Finished -> if (it.durationMs > 300) { onAudioAdded(it.filePath, it.durationMs, true) @@ -1005,6 +1003,7 @@ fun ComposeView( sendButtonColor = sendButtonColor, timedMessageAllowed = timedMessageAllowed, customDisappearingMessageTimePref = chatModel.controller.appPrefs.customDisappearingMessageTime, + placeholder = stringResource(MR.strings.compose_message_placeholder), sendMessage = { ttl -> sendMessage(ttl) resetLinkPreview() @@ -1022,4 +1021,5 @@ fun ComposeView( ) } } + } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SelectableChatItemToolbars.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SelectableChatItemToolbars.kt new file mode 100644 index 0000000000..f3519e9f28 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SelectableChatItemToolbars.kt @@ -0,0 +1,132 @@ +package chat.simplex.common.views.chat + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.material.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import chat.simplex.common.model.* +import chat.simplex.common.platform.BackHandler +import chat.simplex.common.platform.chatModel +import chat.simplex.common.views.helpers.* +import dev.icerock.moko.resources.compose.stringResource +import chat.simplex.res.MR +import dev.icerock.moko.resources.compose.painterResource + +@Composable +fun SelectedItemsTopToolbar(selectedChatItems: MutableState?>) { + val onBackClicked = { selectedChatItems.value = null } + BackHandler(onBack = onBackClicked) + val count = selectedChatItems.value?.size ?: 0 + DefaultTopAppBar( + navigationButton = { NavigationButtonClose(onButtonClicked = onBackClicked) }, + title = { + Text( + if (count == 0) { + stringResource(MR.strings.selected_chat_items_nothing_selected) + } else { + stringResource(MR.strings.selected_chat_items_selected_n).format(count) + }, + fontWeight = FontWeight.SemiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + }, + onTitleClick = null, + showSearch = false, + onSearchValueChanged = {}, + ) + Divider(Modifier.padding(top = AppBarHeight * fontSizeSqrtMultiplier)) +} + +@Composable +fun SelectedItemsBottomToolbar( + chatInfo: ChatInfo, + chatItems: List, + selectedChatItems: MutableState?>, + deleteItems: (Boolean) -> Unit, // Boolean - delete for everyone is possible + moderateItems: () -> Unit, +// shareItems: () -> Unit, +) { + val deleteEnabled = remember { mutableStateOf(false) } + val deleteForEveryoneEnabled = remember { mutableStateOf(false) } + val canModerate = remember { mutableStateOf(false) } + val moderateEnabled = remember { mutableStateOf(false) } + val allButtonsDisabled = remember { mutableStateOf(false) } + Box { + // It's hard to measure exact height of ComposeView with different fontSizes. Better to depend on actual ComposeView, even empty + ComposeView(chatModel = chatModel, Chat.sampleData, remember { mutableStateOf(ComposeState(useLinkPreviews = false)) }, remember { mutableStateOf(null) }, {}) + Row(Modifier.matchParentSize().background(MaterialTheme.colors.background), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically) { + IconButton({ deleteItems(deleteForEveryoneEnabled.value) }, enabled = deleteEnabled.value && !allButtonsDisabled.value) { + Icon( + painterResource(MR.images.ic_delete), + null, + Modifier.size(24.dp), + tint = if (!deleteEnabled.value || allButtonsDisabled.value) MaterialTheme.colors.secondary else MaterialTheme.colors.error + ) + } + + IconButton({ moderateItems() }, Modifier.alpha(if (canModerate.value) 1f else 0f), enabled = moderateEnabled.value && !allButtonsDisabled.value) { + Icon( + painterResource(MR.images.ic_flag), + null, + Modifier.size(24.dp), + tint = if (!moderateEnabled.value || allButtonsDisabled.value) MaterialTheme.colors.secondary else MaterialTheme.colors.error + ) + } + + IconButton({ /*shareItems()*/ }, Modifier.alpha(0f), enabled = false/*!allButtonsDisabled.value*/) { + Icon( + painterResource(MR.images.ic_share), + null, + Modifier.size(24.dp), + tint = if (allButtonsDisabled.value) MaterialTheme.colors.secondary else MaterialTheme.colors.primary + ) + } + } + } + LaunchedEffect(chatInfo, chatItems, selectedChatItems.value) { + recheckItems(chatInfo, chatItems, selectedChatItems, deleteEnabled, deleteForEveryoneEnabled, canModerate, moderateEnabled, allButtonsDisabled) + } +} + +private fun recheckItems(chatInfo: ChatInfo, + chatItems: List, + selectedChatItems: MutableState?>, + deleteEnabled: MutableState, + deleteForEveryoneEnabled: MutableState, + canModerate: MutableState, + moderateEnabled: MutableState, + allButtonsDisabled: MutableState +) { + val count = selectedChatItems.value?.size ?: 0 + allButtonsDisabled.value = count == 0 || count > 20 + canModerate.value = possibleToModerate(chatInfo) + val selected = selectedChatItems.value ?: return + var rDeleteEnabled = true + var rDeleteForEveryoneEnabled = true + var rModerateEnabled = true + var rOnlyOwnGroupItems = true + val rSelectedChatItems = mutableSetOf() + for (ci in chatItems) { + if (selected.contains(ci.id)) { + rDeleteEnabled = rDeleteEnabled && ci.canBeDeletedForSelf + rDeleteForEveryoneEnabled = rDeleteForEveryoneEnabled && ci.meta.deletable && !ci.localNote + rOnlyOwnGroupItems = rOnlyOwnGroupItems && ci.chatDir is CIDirection.GroupSnd + rModerateEnabled = rModerateEnabled && !rOnlyOwnGroupItems && ci.content.msgContent != null && ci.memberToModerate(chatInfo) != null + rSelectedChatItems.add(ci.id) // we are collecting new selected items here to account for any changes in chat items list + } + } + deleteEnabled.value = rDeleteEnabled + deleteForEveryoneEnabled.value = rDeleteForEveryoneEnabled + moderateEnabled.value = rModerateEnabled + selectedChatItems.value = rSelectedChatItems +} + +private fun possibleToModerate(chatInfo: ChatInfo): Boolean = + chatInfo is ChatInfo.Group && chatInfo.groupInfo.membership.memberRole >= GroupMemberRole.Admin diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt index 192f1b005f..201d915fa7 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt @@ -15,12 +15,10 @@ import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.* import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.* import chat.simplex.common.model.* -import chat.simplex.common.model.ChatController.appPrefs import chat.simplex.common.ui.theme.* import chat.simplex.common.views.chat.item.ItemAction import chat.simplex.common.views.helpers.* @@ -51,6 +49,7 @@ fun SendMsgView( allowVoiceToContact: () -> Unit, timedMessageAllowed: Boolean = false, customDisappearingMessageTimePref: SharedPreference? = null, + placeholder: String, sendMessage: (Int?) -> Unit, sendLiveMessage: (suspend () -> Unit)? = null, updateLiveMessage: (suspend () -> Unit)? = null, @@ -62,7 +61,7 @@ fun SendMsgView( ) { val showCustomDisappearingMessageDialog = remember { mutableStateOf(false) } - Box(Modifier.padding(vertical = 8.dp)) { + Box(Modifier.padding(vertical = if (appPlatform.isAndroid) 8.dp else 6.dp)) { val cs = composeState.value var progressByTimeout by rememberSaveable { mutableStateOf(false) } LaunchedEffect(composeState.value.inProgress) { @@ -80,13 +79,24 @@ fun SendMsgView( (!allowedVoiceByPrefs && cs.preview is ComposePreview.VoicePreview) || cs.endLiveDisabled || !sendButtonEnabled - PlatformTextField(composeState, sendMsgEnabled, sendMsgButtonDisabled, textStyle, showDeleteTextButton, userIsObserver, onMessageChange, editPrevMessage, onFilesPasted) { + val clicksOnTextFieldDisabled = !sendMsgEnabled || cs.preview is ComposePreview.VoicePreview || !userCanSend || cs.inProgress + PlatformTextField( + composeState, + sendMsgEnabled, + sendMsgButtonDisabled, + textStyle, + showDeleteTextButton, + userIsObserver, + if (clicksOnTextFieldDisabled) "" else placeholder, + onMessageChange, + editPrevMessage, + onFilesPasted + ) { if (!cs.inProgress) { sendMessage(null) } } - // Disable clicks on text field - if (!sendMsgEnabled || cs.preview is ComposePreview.VoicePreview || !userCanSend || cs.inProgress) { + if (clicksOnTextFieldDisabled) { Box( Modifier .matchParentSize() @@ -101,7 +111,7 @@ fun SendMsgView( if (showDeleteTextButton.value) { DeleteTextButton(composeState) } - Box(Modifier.align(Alignment.BottomEnd).padding(bottom = if (appPlatform.isAndroid) 0.dp else with(LocalDensity.current) { 5.sp.toDp() } * fontSizeSqrtMultiplier)) { + Box(Modifier.align(Alignment.BottomEnd).padding(bottom = if (appPlatform.isAndroid) 0.dp else 5.sp.toDp() * fontSizeSqrtMultiplier)) { val sendButtonSize = remember { Animatable(36f) } val sendButtonAlpha = remember { Animatable(1f) } val scope = rememberCoroutineScope() @@ -564,6 +574,7 @@ fun PreviewSendMsgView() { userCanSend = true, allowVoiceToContact = {}, timedMessageAllowed = false, + placeholder = "", sendMessage = {}, editPrevMessage = {}, onMessageChange = { _ -> }, @@ -599,6 +610,7 @@ fun PreviewSendMsgViewEditing() { userCanSend = true, allowVoiceToContact = {}, timedMessageAllowed = false, + placeholder = "", sendMessage = {}, editPrevMessage = {}, onMessageChange = { _ -> }, @@ -634,6 +646,7 @@ fun PreviewSendMsgViewInProgress() { userCanSend = true, allowVoiceToContact = {}, timedMessageAllowed = false, + placeholder = "", sendMessage = {}, editPrevMessage = {}, onMessageChange = { _ -> }, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt index 1f63e61a02..5d69972886 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt @@ -487,7 +487,7 @@ private fun MemberRow(member: GroupMember, user: Boolean = false, onClick: (() - verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp) ) { - ProfileImage(size = 46.dp, member.image) + MemberProfileImage(size = 46.dp, member) Spacer(Modifier.width(DEFAULT_PADDING_HALF)) Column { Row(verticalAlignment = Alignment.CenterVertically) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt index 7a087a9263..4e84b1b651 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt @@ -25,8 +25,7 @@ import dev.icerock.moko.resources.compose.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp +import androidx.compose.ui.unit.* import chat.simplex.common.model.* import chat.simplex.common.model.ChatModel.controller import chat.simplex.common.model.ChatModel.withChats @@ -495,7 +494,7 @@ fun GroupMemberInfoHeader(member: GroupMember) { Modifier.padding(horizontal = 16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { - ProfileImage(size = 192.dp, member.image, color = if (isInDarkTheme()) GroupDark else SettingsSecondaryLight) + MemberProfileImage(size = 192.dp, member, color = if (isInDarkTheme()) GroupDark else SettingsSecondaryLight) val text = buildAnnotatedString { if (member.verified) { appendInlineContent(id = "shieldIcon") @@ -625,6 +624,22 @@ private fun RoleSelectionRow( } } +@Composable +fun MemberProfileImage( + size: Dp, + mem: GroupMember, + color: Color = MaterialTheme.colors.secondaryVariant, + backgroundColor: Color? = null +) { + ProfileImage( + size = size, + image = mem.image, + color = color, + backgroundColor = backgroundColor, + blurred = mem.blocked + ) +} + private fun updateMemberRoleDialog( newRole: GroupMemberRole, member: GroupMember, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.kt index fc6befad20..b7fe9ea4cf 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.kt @@ -269,7 +269,7 @@ fun CIImageView( if (!smallView && (!showDownloadButton(file?.fileStatus) || !blurred.value)) { loadingIndicator() } else if (smallView && file?.showStatusIconInSmallView == true) { - Box(Modifier.align(Alignment.Center)) { + Box(Modifier.matchParentSize(), contentAlignment = Alignment.Center) { loadingIndicator() } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt index 6f5cb63262..29717e3ecf 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt @@ -50,6 +50,8 @@ fun ChatItemView( linkMode: SimplexLinkMode, revealed: MutableState, range: IntRange?, + selectedChatItems: MutableState?>, + selectChatItem: () -> Unit, deleteMessage: (Long, CIDeleteMode) -> Unit, deleteMessages: (List) -> Unit, receiveFile: (Long) -> Unit, @@ -81,9 +83,7 @@ fun ChatItemView( val live = composeState.value.liveMessage != null Box( - modifier = Modifier - .padding(bottom = 4.dp) - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), contentAlignment = alignment, ) { val info = cItem.meta.itemStatus.statusInto @@ -142,14 +142,6 @@ fun ChatItemView( } } - fun moderateMessageQuestionText(): String { - return if (fullDeleteAllowed) { - generalGetString(MR.strings.moderate_message_will_be_deleted_warning) - } else { - generalGetString(MR.strings.moderate_message_will_be_marked_warning) - } - } - @Composable fun MsgReactionsMenu() { val rs = MsgReaction.values.mapNotNull { r -> @@ -180,6 +172,10 @@ fun ChatItemView( fun DeleteItemMenu() { DefaultDropdownMenu(showMenu) { DeleteItemAction(cItem, revealed, showMenu, questionText = deleteMessageQuestionText(), deleteMessage, deleteMessages) + if (cItem.canBeDeletedForSelf) { + Divider() + SelectItemAction(showMenu, selectChatItem) + } } } @@ -277,8 +273,12 @@ fun ChatItemView( DeleteItemAction(cItem, revealed, showMenu, questionText = deleteMessageQuestionText(), deleteMessage, deleteMessages) } val groupInfo = cItem.memberToModerate(cInfo)?.first - if (groupInfo != null) { - ModerateItemAction(cItem, questionText = moderateMessageQuestionText(), showMenu, deleteMessage) + if (groupInfo != null && cItem.chatDir !is CIDirection.GroupSnd) { + ModerateItemAction(cItem, questionText = moderateMessageQuestionText(cInfo.featureEnabled(ChatFeature.FullDelete), 1), showMenu, deleteMessage) + } + if (cItem.canBeDeletedForSelf) { + Divider() + SelectItemAction(showMenu, selectChatItem) } } } @@ -293,12 +293,20 @@ fun ChatItemView( } ItemInfoAction(cInfo, cItem, showItemDetails, showMenu) DeleteItemAction(cItem, revealed, showMenu, questionText = deleteMessageQuestionText(), deleteMessage, deleteMessages) + if (cItem.canBeDeletedForSelf) { + Divider() + SelectItemAction(showMenu, selectChatItem) + } } } cItem.isDeletedContent -> { DefaultDropdownMenu(showMenu) { ItemInfoAction(cInfo, cItem, showItemDetails, showMenu) DeleteItemAction(cItem, revealed, showMenu, questionText = deleteMessageQuestionText(), deleteMessage, deleteMessages) + if (cItem.canBeDeletedForSelf) { + Divider() + SelectItemAction(showMenu, selectChatItem) + } } } cItem.mergeCategory != null && ((range?.count() ?: 0) > 1 || revealed.value) -> { @@ -309,11 +317,19 @@ fun ChatItemView( ExpandItemAction(revealed, showMenu) } DeleteItemAction(cItem, revealed, showMenu, questionText = deleteMessageQuestionText(), deleteMessage, deleteMessages) + if (cItem.canBeDeletedForSelf) { + Divider() + SelectItemAction(showMenu, selectChatItem) + } } } else -> { DefaultDropdownMenu(showMenu) { DeleteItemAction(cItem, revealed, showMenu, questionText = deleteMessageQuestionText(), deleteMessage, deleteMessages) + if (selectedChatItems.value == null) { + Divider() + SelectItemAction(showMenu, selectChatItem) + } } } } @@ -327,6 +343,10 @@ fun ChatItemView( } ItemInfoAction(cInfo, cItem, showItemDetails, showMenu) DeleteItemAction(cItem, revealed, showMenu, questionText = deleteMessageQuestionText(), deleteMessage, deleteMessages) + if (cItem.canBeDeletedForSelf) { + Divider() + SelectItemAction(showMenu, selectChatItem) + } } } @@ -357,6 +377,10 @@ fun ChatItemView( DefaultDropdownMenu(showMenu) { ItemInfoAction(cInfo, cItem, showItemDetails, showMenu) DeleteItemAction(cItem, revealed, showMenu, questionText = deleteMessageQuestionText(), deleteMessage, deleteMessages) + if (cItem.canBeDeletedForSelf) { + Divider() + SelectItemAction(showMenu, selectChatItem) + } } } @@ -410,6 +434,10 @@ fun ChatItemView( DefaultDropdownMenu(showMenu) { ItemInfoAction(cInfo, cItem, showItemDetails, showMenu) DeleteItemAction(cItem, revealed, showMenu, questionText = generalGetString(MR.strings.delete_message_cannot_be_undone_warning), deleteMessage, deleteMessages) + if (cItem.canBeDeletedForSelf) { + Divider() + SelectItemAction(showMenu, selectChatItem) + } } } @@ -607,7 +635,12 @@ fun DeleteItemAction( for (i in range) { itemIds.add(reversedChatItems[i].id) } - deleteMessagesAlertDialog(itemIds, generalGetString(MR.strings.delete_message_mark_deleted_warning), deleteMessages = deleteMessages) + deleteMessagesAlertDialog( + itemIds, + generalGetString(if (itemIds.size == 1) MR.strings.delete_message_mark_deleted_warning else MR.strings.delete_messages_mark_deleted_warning), + forAll = false, + deleteMessages = { ids, _ -> deleteMessages(ids) } + ) } else { deleteMessageAlertDialog(cItem, questionText, deleteMessage = deleteMessage) } @@ -640,6 +673,21 @@ fun ModerateItemAction( ) } +@Composable +fun SelectItemAction( + showMenu: MutableState, + selectChatItem: () -> Unit, +) { + ItemAction( + stringResource(MR.strings.select_verb), + painterResource(MR.images.ic_check_circle), + onClick = { + showMenu.value = false + selectChatItem() + } + ) +} + @Composable private fun RevealItemAction(revealed: MutableState, showMenu: MutableState) { ItemAction( @@ -784,7 +832,7 @@ fun deleteMessageAlertDialog(chatItem: ChatItem, questionText: String, deleteMes ) } -fun deleteMessagesAlertDialog(itemIds: List, questionText: String, deleteMessages: (List) -> Unit) { +fun deleteMessagesAlertDialog(itemIds: List, questionText: String, forAll: Boolean, deleteMessages: (List, Boolean) -> Unit) { AlertManager.shared.showAlertDialogButtons( title = generalGetString(MR.strings.delete_messages__question).format(itemIds.size), text = questionText, @@ -796,14 +844,29 @@ fun deleteMessagesAlertDialog(itemIds: List, questionText: String, deleteM horizontalArrangement = Arrangement.Center, ) { TextButton(onClick = { - deleteMessages(itemIds) + deleteMessages(itemIds, false) AlertManager.shared.hideAlert() }) { Text(stringResource(MR.strings.for_me_only), color = MaterialTheme.colors.error) } + + if (forAll) { + TextButton(onClick = { + deleteMessages(itemIds, true) + AlertManager.shared.hideAlert() + }) { Text(stringResource(MR.strings.for_everybody), color = MaterialTheme.colors.error) } + } } } ) } +fun moderateMessageQuestionText(fullDeleteAllowed: Boolean, count: Int): String { + return if (fullDeleteAllowed) { + generalGetString(if (count == 1) MR.strings.moderate_message_will_be_deleted_warning else MR.strings.moderate_messages_will_be_deleted_warning) + } else { + generalGetString(if (count == 1) MR.strings.moderate_message_will_be_marked_warning else MR.strings.moderate_messages_will_be_marked_warning) + } +} + fun moderateMessageAlertDialog(chatItem: ChatItem, questionText: String, deleteMessage: (Long, CIDeleteMode) -> Unit) { AlertManager.shared.showAlertDialog( title = generalGetString(MR.strings.delete_member_message__question), @@ -816,6 +879,16 @@ fun moderateMessageAlertDialog(chatItem: ChatItem, questionText: String, deleteM ) } +fun moderateMessagesAlertDialog(itemIds: List, questionText: String, deleteMessages: (List) -> Unit) { + AlertManager.shared.showAlertDialog( + title = if (itemIds.size == 1) generalGetString(MR.strings.delete_member_message__question) else generalGetString(MR.strings.delete_members_messages__question).format(itemIds.size), + text = questionText, + confirmText = generalGetString(MR.strings.delete_verb), + destructive = true, + onConfirm = { deleteMessages(itemIds) } + ) +} + expect fun copyItemToClipboard(cItem: ChatItem, clipboard: ClipboardManager) @Preview @@ -832,6 +905,8 @@ fun PreviewChatItemView( composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = true)) }, revealed = remember { mutableStateOf(false) }, range = 0..1, + selectedChatItems = remember { mutableStateOf(setOf()) }, + selectChatItem = {}, deleteMessage = { _, _ -> }, deleteMessages = { _ -> }, receiveFile = { _ -> }, @@ -869,6 +944,8 @@ fun PreviewChatItemViewDeletedContent() { composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = true)) }, revealed = remember { mutableStateOf(false) }, range = 0..1, + selectedChatItems = remember { mutableStateOf(setOf()) }, + selectChatItem = {}, deleteMessage = { _, _ -> }, deleteMessages = { _ -> }, receiveFile = { _ -> }, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt index 1f8155d3dd..e39adcca3b 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt @@ -27,6 +27,7 @@ import chat.simplex.common.views.chat.* import chat.simplex.common.views.chat.group.deleteGroupDialog import chat.simplex.common.views.chat.group.leaveGroupDialog import chat.simplex.common.views.chat.item.ItemAction +import chat.simplex.common.views.contacts.onRequestAccepted import chat.simplex.common.views.helpers.* import chat.simplex.common.views.newchat.* import chat.simplex.res.MR @@ -34,7 +35,7 @@ import kotlinx.coroutines.* import kotlinx.datetime.Clock @Composable -fun ChatListNavLinkView(chat: Chat, nextChatSelected: State, oneHandUI: State) { +fun ChatListNavLinkView(chat: Chat, nextChatSelected: State) { val showMenu = remember { mutableStateOf(false) } val showMarkRead = remember(chat.chatStats.unreadCount, chat.chatStats.unreadChat) { chat.chatStats.unreadCount > 0 || chat.chatStats.unreadChat @@ -80,7 +81,6 @@ fun ChatListNavLinkView(chat: Chat, nextChatSelected: State, oneHandUI: disabled, selectedChat, nextChatSelected, - oneHandUI ) } is ChatInfo.Group -> @@ -100,7 +100,6 @@ fun ChatListNavLinkView(chat: Chat, nextChatSelected: State, oneHandUI: disabled, selectedChat, nextChatSelected, - oneHandUI ) is ChatInfo.Local -> { ChatListNavLinkLayout( @@ -119,7 +118,6 @@ fun ChatListNavLinkView(chat: Chat, nextChatSelected: State, oneHandUI: disabled, selectedChat, nextChatSelected, - oneHandUI ) } is ChatInfo.ContactRequest -> @@ -129,7 +127,7 @@ fun ChatListNavLinkView(chat: Chat, nextChatSelected: State, oneHandUI: ContactRequestView(chat.chatInfo) } }, - click = { contactRequestAlertDialog(chat.remoteHostId, chat.chatInfo, chatModel) }, + click = { contactRequestAlertDialog(chat.remoteHostId, chat.chatInfo, chatModel) { onRequestAccepted(it) } }, dropdownMenuItems = { tryOrShowError("${chat.id}ChatListNavLinkDropdown", error = {}) { ContactRequestMenuItems(chat.remoteHostId, chat.chatInfo, chatModel, showMenu) @@ -139,7 +137,6 @@ fun ChatListNavLinkView(chat: Chat, nextChatSelected: State, oneHandUI: disabled, selectedChat, nextChatSelected, - oneHandUI ) is ChatInfo.ContactConnection -> ChatListNavLinkLayout( @@ -160,7 +157,6 @@ fun ChatListNavLinkView(chat: Chat, nextChatSelected: State, oneHandUI: disabled, selectedChat, nextChatSelected, - oneHandUI ) is ChatInfo.InvalidJSON -> ChatListNavLinkLayout( @@ -177,7 +173,6 @@ fun ChatListNavLinkView(chat: Chat, nextChatSelected: State, oneHandUI: disabled, selectedChat, nextChatSelected, - oneHandUI ) } } @@ -878,7 +873,6 @@ expect fun ChatListNavLinkLayout( disabled: Boolean, selectedChat: State, nextChatSelected: State, - oneHandUI: State ) @Preview/*( @@ -922,7 +916,6 @@ fun PreviewChatListNavLinkDirect() { disabled = false, selectedChat = remember { mutableStateOf(false) }, nextChatSelected = remember { mutableStateOf(false) }, - oneHandUI = remember { mutableStateOf(false) } ) } } @@ -968,7 +961,6 @@ fun PreviewChatListNavLinkGroup() { disabled = false, selectedChat = remember { mutableStateOf(false) }, nextChatSelected = remember { mutableStateOf(false) }, - oneHandUI = remember { mutableStateOf(false) } ) } } @@ -991,7 +983,6 @@ fun PreviewChatListNavLinkContactRequest() { disabled = false, selectedChat = remember { mutableStateOf(false) }, nextChatSelected = remember { mutableStateOf(false) }, - oneHandUI = remember { mutableStateOf(false) } ) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt index 32f8a2f481..207f8a4b26 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt @@ -12,7 +12,6 @@ import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.scale import androidx.compose.ui.focus.* import androidx.compose.ui.graphics.* import androidx.compose.ui.text.font.FontStyle @@ -25,6 +24,7 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.* import chat.simplex.common.SettingsViewState import chat.simplex.common.model.* +import chat.simplex.common.model.ChatController.appPrefs import chat.simplex.common.model.ChatController.stopRemoteHostAndReloadHosts import chat.simplex.common.ui.theme.* import chat.simplex.common.views.helpers.* @@ -43,19 +43,28 @@ import kotlinx.serialization.json.Json import java.net.URI import kotlin.time.Duration.Companion.seconds -private fun showNewChatSheet(oneHandUI: State, barTitle: String) { +private fun showNewChatSheet(oneHandUI: State) { ModalManager.start.closeModals() ModalManager.end.closeModals() chatModel.newChatSheetVisible.value = true - ModalManager.start.showModalCloseable( - closeOnTop = !oneHandUI.value, - closeBarTitle = if (oneHandUI.value) barTitle else null, - endButtons = { Spacer(Modifier.minimumInteractiveComponentSize()) } - ) { close -> - NewChatSheet(rh = chatModel.currentRemoteHost.value, close) - DisposableEffect(Unit) { - onDispose { - chatModel.newChatSheetVisible.value = false + ModalManager.start.showCustomModal { close -> + val close = { + // It will set it faster than in onDispose. It's important to catch the actual state before + // closing modal for reacting with status bar changes in [App] + chatModel.newChatSheetVisible.value = false + close() + } + ModalView(close, closeOnTop = !oneHandUI.value) { + if (appPlatform.isAndroid) { + BackHandler { + close() + } + } + NewChatSheet(rh = chatModel.currentRemoteHost.value, close) + DisposableEffect(Unit) { + onDispose { + chatModel.newChatSheetVisible.value = false + } } } } @@ -63,7 +72,7 @@ private fun showNewChatSheet(oneHandUI: State, barTitle: String) { @Composable fun ChatListView(chatModel: ChatModel, settingsState: SettingsViewState, setPerformLA: (Boolean) -> Unit, stopped: Boolean) { - val oneHandUI = remember { chatModel.controller.appPrefs.oneHandUI } + val oneHandUI = remember { appPrefs.oneHandUI.state } LaunchedEffect(Unit) { if (shouldShowWhatsNew(chatModel)) { @@ -87,25 +96,25 @@ fun ChatListView(chatModel: ChatModel, settingsState: SettingsViewState, setPerf val (userPickerState, scaffoldState ) = settingsState Scaffold( topBar = { - if (!oneHandUI.state.value) { - Box(Modifier.padding(end = endPadding)) { + if (!oneHandUI.value) { + Column(Modifier.padding(end = endPadding)) { ChatListToolbar( scaffoldState.drawerState, userPickerState, stopped, - oneHandUI ) + Divider() } } }, bottomBar = { - if (oneHandUI.state.value) { - Box(Modifier.padding(end = endPadding)) { + if (oneHandUI.value) { + Column(Modifier.padding(end = endPadding)) { + Divider() ChatListToolbar( scaffoldState.drawerState, userPickerState, stopped, - oneHandUI ) } } @@ -121,11 +130,11 @@ fun ChatListView(chatModel: ChatModel, settingsState: SettingsViewState, setPerf drawerScrimColor = MaterialTheme.colors.onSurface.copy(alpha = if (isInDarkTheme()) 0.16f else 0.32f), drawerGesturesEnabled = appPlatform.isAndroid, floatingActionButton = { - if (!oneHandUI.state.value && searchText.value.text.isEmpty() && !chatModel.desktopNoUserNoRemote && chatModel.chatRunning.value == true) { + if (!oneHandUI.value && searchText.value.text.isEmpty() && !chatModel.desktopNoUserNoRemote && chatModel.chatRunning.value == true) { FloatingActionButton( onClick = { if (!stopped) { - showNewChatSheet(oneHandUI.state, generalGetString(MR.strings.new_chat)) + showNewChatSheet(oneHandUI) } }, Modifier @@ -145,28 +154,17 @@ fun ChatListView(chatModel: ChatModel, settingsState: SettingsViewState, setPerf } } ) { - var modifier = Modifier.padding(it).padding(end = endPadding) - if (oneHandUI.state.value) { - modifier = modifier.scale(scaleX = 1f, scaleY = -1f) - } - - Box(modifier) { + Box(Modifier.padding(it).padding(end = endPadding)) { Box( modifier = Modifier .fillMaxSize() ) { if (!chatModel.desktopNoUserNoRemote) { - ChatList(chatModel, searchText = searchText, oneHandUI = oneHandUI) + ChatList(chatModel, searchText = searchText) } if (chatModel.chats.value.isEmpty() && !chatModel.switchingUsersAndHosts.value && !chatModel.desktopNoUserNoRemote) { - var textModifier = Modifier.align(Alignment.Center) - - if (oneHandUI.state.value) { - textModifier = textModifier.scale(scaleX = 1f, scaleY = -1f) - } - Text(stringResource( - if (chatModel.chatRunning.value == null) MR.strings.loading_chats else MR.strings.you_have_no_chats), textModifier, color = MaterialTheme.colors.secondary) + if (chatModel.chatRunning.value == null) MR.strings.loading_chats else MR.strings.you_have_no_chats), Modifier.align(Alignment.Center), color = MaterialTheme.colors.secondary) } } } @@ -184,7 +182,7 @@ fun ChatListView(chatModel: ChatModel, settingsState: SettingsViewState, setPerf UserPicker( chatModel = chatModel, userPickerState = userPickerState, - contentAlignment = if (oneHandUI.state.value) Alignment.BottomStart else Alignment.TopStart + contentAlignment = if (oneHandUI.value) Alignment.BottomStart else Alignment.TopStart ) { scope.launch { if (scaffoldState.drawerState.isOpen) scaffoldState.drawerState.close() else scaffoldState.drawerState.open() } userPickerState.value = AnimatedViewState.GONE @@ -210,32 +208,35 @@ private fun ConnectButton(text: String, onClick: () -> Unit) { } @Composable -private fun ChatListToolbar(drawerState: DrawerState, userPickerState: MutableStateFlow, stopped: Boolean, oneHandUI: SharedPreference) { +private fun ChatListToolbar(drawerState: DrawerState, userPickerState: MutableStateFlow, stopped: Boolean) { val serversSummary: MutableState = remember { mutableStateOf(null) } val barButtons = arrayListOf<@Composable RowScope.() -> Unit>() val updatingProgress = remember { chatModel.updatingProgress }.value + val oneHandUI = remember { appPrefs.oneHandUI.state } - if (oneHandUI.state.value) { + if (oneHandUI.value) { val sp16 = with(LocalDensity.current) { 16.sp.toDp() } - barButtons.add { - IconButton( - onClick = { - if (!stopped) { - showNewChatSheet(oneHandUI.state, generalGetString(MR.strings.new_chat)) + if (!stopped) { + barButtons.add { + IconButton( + onClick = { + showNewChatSheet(oneHandUI) + }, + ) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .background(MaterialTheme.colors.primary, shape = CircleShape) + .size(33.dp * fontSizeSqrtMultiplier) + ) { + Icon( + painterResource(MR.images.ic_edit_filled), + stringResource(MR.strings.add_contact_or_create_group), + Modifier.size(sp16), + tint = Color.White + ) } - }, - ) { - Box( - modifier = Modifier - .background(if (!stopped) MaterialTheme.colors.primary else MaterialTheme.colors.secondary, shape = CircleShape) - .padding(DEFAULT_PADDING_HALF) - ){ - Icon( - painterResource(MR.images.ic_edit_filled), - stringResource(MR.strings.add_contact_or_create_group), - Modifier.size(sp16), - tint = if (!stopped) MaterialTheme.colors.onPrimary else MaterialTheme.colors.onSecondary) } } } @@ -327,7 +328,6 @@ private fun ChatListToolbar(drawerState: DrawerState, userPickerState: MutableSt onSearchValueChanged = {}, buttons = barButtons ) - Divider(Modifier.padding(top = AppBarHeight * fontSizeSqrtMultiplier)) } @Composable @@ -440,14 +440,8 @@ fun connectIfOpenedViaUri(rhId: Long?, uri: URI, chatModel: ChatModel) { } @Composable -private fun ChatListSearchBar(listState: LazyListState, searchText: MutableState, searchShowingSimplexLink: MutableState, searchChatFilteredBySimplexLink: MutableState, oneHandUI: SharedPreference) { - var modifier = Modifier.fillMaxWidth(); - - if (oneHandUI.state.value) { - modifier = modifier.scale(scaleX = 1f, scaleY = -1f) - } - - Row(verticalAlignment = Alignment.CenterVertically, modifier = modifier) { +private fun ChatListSearchBar(listState: LazyListState, searchText: MutableState, searchShowingSimplexLink: MutableState, searchChatFilteredBySimplexLink: MutableState) { + Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth()) { val focusRequester = remember { FocusRequester() } var focused by remember { mutableStateOf(false) } Icon( @@ -546,11 +540,13 @@ enum class ScrollDirection { } @Composable -private fun ChatList(chatModel: ChatModel, searchText: MutableState, oneHandUI: SharedPreference) { +private fun ChatList(chatModel: ChatModel, searchText: MutableState) { val listState = rememberLazyListState(lazyListState.first, lazyListState.second) var scrollDirection by remember { mutableStateOf(ScrollDirection.Idle) } var previousIndex by remember { mutableStateOf(0) } var previousScrollOffset by remember { mutableStateOf(0) } + val keyboardState by getKeyboardState() + val oneHandUI = remember { appPrefs.oneHandUI.state } LaunchedEffect(listState.firstVisibleItemIndex, listState.firstVisibleItemScrollOffset) { val currentIndex = listState.firstVisibleItemIndex @@ -582,43 +578,47 @@ private fun ChatList(chatModel: ChatModel, searchText: MutableState(null) } val chats = filteredChats(showUnreadAndFavorites, searchShowingSimplexLink, searchChatFilteredBySimplexLink, searchText.value.text, allChats.value.toList()) LazyColumnWithScrollBar( - Modifier.fillMaxWidth(), - listState + Modifier.fillMaxSize(), + listState, + reverseLayout = oneHandUI.value ) { stickyHeader { Column( Modifier .offset { val y = if (searchText.value.text.isEmpty()) { - if (oneHandUI.state.value && scrollDirection == ScrollDirection.Up) { + val offsetMultiplier = if (oneHandUI.value) 1 else -1 + if ( + (oneHandUI.value && scrollDirection == ScrollDirection.Up) || + (appPlatform.isAndroid && keyboardState == KeyboardState.Opened) + ) { 0 - } else if (listState.firstVisibleItemIndex == 0) -listState.firstVisibleItemScrollOffset else -1000 + } else if (listState.firstVisibleItemIndex == 0) offsetMultiplier * listState.firstVisibleItemScrollOffset else offsetMultiplier * 1000 } else { 0 } IntOffset(0, y) } - .background(MaterialTheme.colors.background) - ) { - ChatListSearchBar(listState, searchText, searchShowingSimplexLink, searchChatFilteredBySimplexLink, oneHandUI) - Divider() + .background(MaterialTheme.colors.background), + ) { + if (oneHandUI.value) { + Divider() + } + ChatListSearchBar(listState, searchText, searchShowingSimplexLink, searchChatFilteredBySimplexLink) + if (!oneHandUI.value) { + Divider() + } } } itemsIndexed(chats, key = { _, chat -> chat.remoteHostId to chat.id }) { index, chat -> val nextChatSelected = remember(chat.id, chats) { derivedStateOf { chatModel.chatId.value != null && chats.getOrNull(index + 1)?.id == chatModel.chatId.value } } - ChatListNavLinkView(chat, nextChatSelected, oneHandUI.state) + ChatListNavLinkView(chat, nextChatSelected) } } if (chats.isEmpty() && chatModel.chats.value.isNotEmpty()) { - var modifier = Modifier.fillMaxSize(); - - if (oneHandUI.state.value) { - modifier = modifier.scale(scaleX = 1f, scaleY = -1f) - } - - Box(modifier, contentAlignment = Alignment.Center) { + Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Text(generalGetString(MR.strings.no_filtered_chats), color = MaterialTheme.colors.secondary) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt index cb22bd8f60..0edaf89974 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt @@ -341,10 +341,12 @@ fun ChatPreviewView( val chat = activeVoicePreview.value?.chat ?: chat val ci = activeVoicePreview.value?.ci ?: chat.chatItems.lastOrNull() val mc = ci?.content?.msgContent - if ((showChatPreviews && chatModelDraftChatId != chat.id) || activeVoicePreview.value != null) { + val deleted = ci?.isDeletedContent == true || ci?.meta?.itemDeleted != null + val showContentPreview = (showChatPreviews && chatModelDraftChatId != chat.id && !deleted) || activeVoicePreview.value != null + if (ci != null && showContentPreview) { chatItemContentPreview(chat, ci) } - if (mc !is MsgContent.MCVoice || mc.text.isNotEmpty() || chatModelDraftChatId == chat.id) { + if (mc !is MsgContent.MCVoice || !showContentPreview || mc.text.isNotEmpty() || chatModelDraftChatId == chat.id) { Box(Modifier.offset(x = if (mc is MsgContent.MCFile) -15.sp.toDp() else 0.dp)) { chatPreviewText() } @@ -361,6 +363,13 @@ fun ChatPreviewView( } } } + LaunchedEffect(chatModel.deletedChats.value) { + val voicePreview = activeVoicePreview.value + // Stop voice when deleting the chat + if (chatModel.deletedChats.value.contains(chatModel.remoteHostId() to chat.id) && voicePreview?.ci != null) { + AudioPlayer.stop(voicePreview.ci) + } + } } Spacer(Modifier.width(8.sp.toDp())) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ServersSummaryView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ServersSummaryView.kt index 4bb5474fa6..334335a80f 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ServersSummaryView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ServersSummaryView.kt @@ -68,7 +68,6 @@ enum class SubscriptionColorType { data class SubscriptionStatus( val color: SubscriptionColorType, val variableValue: Float, - val opacity: Float, val statusPercent: Float ) @@ -78,7 +77,6 @@ fun subscriptionStatusColorAndPercentage( subs: SMPServerSubs, hasSess: Boolean ): SubscriptionStatus { - fun roundedToQuarter(n: Float): Float = when { n >= 1 -> 1f n <= 0 -> 0f @@ -86,23 +84,26 @@ fun subscriptionStatusColorAndPercentage( } val activeColor: SubscriptionColorType = if (socksProxy != null) SubscriptionColorType.ACTIVE_SOCKS_PROXY else SubscriptionColorType.ACTIVE - val noConnColorAndPercent = SubscriptionStatus(SubscriptionColorType.DISCONNECTED, 1f, 1f, 0f) + val noConnColorAndPercent = SubscriptionStatus(SubscriptionColorType.DISCONNECTED, 1f, 0f) val activeSubsRounded = roundedToQuarter(subs.shareOfActive) - return if (online && subs.total > 0) { - if (subs.ssActive == 0) { - if (hasSess) - SubscriptionStatus(activeColor, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) - else - noConnColorAndPercent - } else { // ssActive > 0 - if (hasSess) - SubscriptionStatus(activeColor, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) - else - // This would mean implementation error - SubscriptionStatus(SubscriptionColorType.ACTIVE_DISCONNECTED, activeSubsRounded, subs.shareOfActive, subs.shareOfActive) - } - } else noConnColorAndPercent + return if (!online) + noConnColorAndPercent + else if (subs.total == 0 && !hasSess) + // On freshly installed app (without chats) and on app start + SubscriptionStatus(activeColor, 0f, 0f) + else if (subs.ssActive == 0) { + if (hasSess) + SubscriptionStatus(activeColor, activeSubsRounded, subs.shareOfActive) + else + noConnColorAndPercent + } else { // ssActive > 0 + if (hasSess) + SubscriptionStatus(activeColor, activeSubsRounded, subs.shareOfActive) + else + // This would mean implementation error + SubscriptionStatus(SubscriptionColorType.ACTIVE_DISCONNECTED, activeSubsRounded, subs.shareOfActive) + } } @Composable diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListNavLinkView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListNavLinkView.kt index 8035cddc6d..8b2e008ad3 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListNavLinkView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListNavLinkView.kt @@ -6,7 +6,6 @@ import androidx.compose.material.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.scale import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp @@ -22,8 +21,7 @@ fun ShareListNavLinkView( chatModel: ChatModel, isMediaOrFileAttachment: Boolean, isVoice: Boolean, - hasSimplexLink: Boolean, - oneHandUI: State + hasSimplexLink: Boolean ) { val stopped = chatModel.chatRunning.value == false val scope = rememberCoroutineScope() @@ -31,7 +29,7 @@ fun ShareListNavLinkView( is ChatInfo.Direct -> { val voiceProhibited = isVoice && !chat.chatInfo.featureEnabled(ChatFeature.Voice) ShareListNavLinkLayout( - chatLinkPreview = { SharePreviewView(chat, disabled = voiceProhibited, oneHandUI = oneHandUI) }, + chatLinkPreview = { SharePreviewView(chat, disabled = voiceProhibited) }, click = { if (voiceProhibited) { showForwardProhibitedByPrefAlert() @@ -48,7 +46,7 @@ fun ShareListNavLinkView( val voiceProhibited = isVoice && !chat.chatInfo.featureEnabled(ChatFeature.Voice) val prohibitedByPref = simplexLinkProhibited || fileProhibited || voiceProhibited ShareListNavLinkLayout( - chatLinkPreview = { SharePreviewView(chat, disabled = prohibitedByPref, oneHandUI = oneHandUI) }, + chatLinkPreview = { SharePreviewView(chat, disabled = prohibitedByPref) }, click = { if (prohibitedByPref) { showForwardProhibitedByPrefAlert() @@ -61,7 +59,7 @@ fun ShareListNavLinkView( } is ChatInfo.Local -> ShareListNavLinkLayout( - chatLinkPreview = { SharePreviewView(chat, disabled = false, oneHandUI = oneHandUI) }, + chatLinkPreview = { SharePreviewView(chat, disabled = false) }, click = { scope.launch { noteFolderChatAction(chat.remoteHostId, chat.chatInfo.noteFolder) } }, stopped ) @@ -89,15 +87,9 @@ private fun ShareListNavLinkLayout( } @Composable -private fun SharePreviewView(chat: Chat, disabled: Boolean, oneHandUI: State) { - var modifier = Modifier.fillMaxSize() - - if (oneHandUI.value) { - modifier = modifier.scale(scaleX = 1f, scaleY = -1f) - } - +private fun SharePreviewView(chat: Chat, disabled: Boolean) { Row( - modifier, + Modifier.fillMaxSize(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt index b86bc16dbc..6dfac75126 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt @@ -7,7 +7,6 @@ import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.scale import androidx.compose.ui.graphics.Color import dev.icerock.moko.resources.compose.painterResource import dev.icerock.moko.resources.compose.stringResource @@ -15,6 +14,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import chat.simplex.common.SettingsViewState import chat.simplex.common.model.* +import chat.simplex.common.model.ChatController.appPrefs import chat.simplex.common.views.helpers.* import chat.simplex.common.platform.* import chat.simplex.res.MR @@ -25,16 +25,30 @@ fun ShareListView(chatModel: ChatModel, settingsState: SettingsViewState, stoppe var searchInList by rememberSaveable { mutableStateOf("") } val (userPickerState, scaffoldState) = settingsState val endPadding = if (appPlatform.isDesktop) 56.dp else 0.dp - val oneHandUI = remember { chatModel.controller.appPrefs.oneHandUI } + val oneHandUI = remember { appPrefs.oneHandUI.state } Scaffold( Modifier.padding(end = endPadding), contentColor = LocalContentColor.current, drawerContentColor = LocalContentColor.current, scaffoldState = scaffoldState, - topBar = { if (!oneHandUI.state.value) Column { ShareListToolbar(chatModel, userPickerState, stopped) { searchInList = it.trim() } } }, - bottomBar = { if (oneHandUI.state.value) Column { ShareListToolbar(chatModel, userPickerState, stopped) { searchInList = it.trim() } } }, - ) { + topBar = { + if (!oneHandUI.value) { + Column { + ShareListToolbar(chatModel, userPickerState, stopped) { searchInList = it.trim() } + Divider() + } + } + }, + bottomBar = { + if (oneHandUI.value) { + Column { + Divider() + ShareListToolbar(chatModel, userPickerState, stopped) { searchInList = it.trim() } + } + } + } + ) { val sharedContent = chatModel.sharedContent.value var isMediaOrFileAttachment = false var isVoice = false @@ -60,15 +74,9 @@ fun ShareListView(chatModel: ChatModel, settingsState: SettingsViewState, stoppe } null -> {} } - var modifier = Modifier.fillMaxSize() - - if (oneHandUI.state.value) { - modifier = modifier.scale(scaleX = 1f, scaleY = -1f) - } - Box(Modifier.padding(it)) { Column( - modifier = modifier + modifier = Modifier.fillMaxSize() ) { if (chatModel.chats.value.isNotEmpty()) { ShareList( @@ -77,10 +85,9 @@ fun ShareListView(chatModel: ChatModel, settingsState: SettingsViewState, stoppe isMediaOrFileAttachment = isMediaOrFileAttachment, isVoice = isVoice, hasSimplexLink = hasSimplexLink, - oneHandUI = oneHandUI.state ) } else { - EmptyList(oneHandUI = oneHandUI.state) + EmptyList() } } } @@ -101,14 +108,8 @@ private fun hasSimplexLink(msg: String): Boolean { } @Composable -private fun EmptyList(oneHandUI: State) { - var modifier = Modifier.fillMaxSize() - - if (oneHandUI.value) { - modifier = modifier.scale(scaleX = 1f, scaleY = -1f) - } - - Box(modifier, contentAlignment = Alignment.Center) { +private fun EmptyList() { + Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Text(stringResource(MR.strings.you_have_no_chats), color = MaterialTheme.colors.secondary) } } @@ -189,7 +190,6 @@ private fun ShareListToolbar(chatModel: ChatModel, userPickerState: MutableState onSearchValueChanged = onSearchValueChanged, buttons = barButtons ) - Divider() } @Composable @@ -199,8 +199,8 @@ private fun ShareList( isMediaOrFileAttachment: Boolean, isVoice: Boolean, hasSimplexLink: Boolean, - oneHandUI: State ) { + val oneHandUI = remember { appPrefs.oneHandUI.state } val chats by remember(search) { derivedStateOf { val sorted = chatModel.chats.value.toList().sortedByDescending { it.chatInfo is ChatInfo.Local } @@ -212,7 +212,8 @@ private fun ShareList( } } LazyColumnWithScrollBar( - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxSize(), + reverseLayout = oneHandUI.value ) { items(chats) { chat -> ShareListNavLinkView( @@ -221,7 +222,6 @@ private fun ShareList( isMediaOrFileAttachment = isMediaOrFileAttachment, isVoice = isVoice, hasSimplexLink = hasSimplexLink, - oneHandUI = oneHandUI ) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt index de77d13cbf..dad3192e45 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/UserPicker.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.unit.* import chat.simplex.common.model.* +import chat.simplex.common.model.ChatController.appPrefs import chat.simplex.common.model.ChatController.stopRemoteHostAndReloadHosts import chat.simplex.common.model.ChatModel.controller import chat.simplex.common.ui.theme.* @@ -149,7 +150,7 @@ fun UserPicker( .padding(bottom = 10.dp, top = 10.dp) .graphicsLayer { alpha = animatedFloat.value - translationY = (animatedFloat.value - 1) * xOffset + translationY = (if (appPrefs.oneHandUI.state.value) -1 else 1) * (animatedFloat.value - 1) * xOffset }, contentAlignment = contentAlignment ) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/contacts/ContactListNavView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/contacts/ContactListNavView.kt index 4622bff03b..05e693b7c2 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/contacts/ContactListNavView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/contacts/ContactListNavView.kt @@ -16,7 +16,7 @@ import chat.simplex.common.views.newchat.chatContactType import chat.simplex.res.MR import kotlinx.coroutines.delay -private fun onRequestAccepted(chat: Chat) { +fun onRequestAccepted(chat: Chat) { val chatInfo = chat.chatInfo if (chatInfo is ChatInfo.Direct) { ModalManager.start.closeModals() @@ -27,7 +27,7 @@ private fun onRequestAccepted(chat: Chat) { } @Composable -fun ContactListNavLinkView(chat: Chat, nextChatSelected: State, oneHandUI: State) { +fun ContactListNavLinkView(chat: Chat, nextChatSelected: State, showDeletedChatIcon: Boolean) { val showMenu = remember { mutableStateOf(false) } val rhId = chat.remoteHostId val disabled = chatModel.chatRunning.value == false || chatModel.deletedChats.value.contains(rhId to chat.chatInfo.id) @@ -46,7 +46,7 @@ fun ContactListNavLinkView(chat: Chat, nextChatSelected: State, oneHand ChatListNavLinkLayout( chatLinkPreview = { tryOrShowError("${chat.id}ContactListNavLink", error = { ErrorChatListItem() }) { - ContactPreviewView(chat, disabled) + ContactPreviewView(chat, disabled, showDeletedChatIcon) } }, click = { @@ -88,14 +88,13 @@ fun ContactListNavLinkView(chat: Chat, nextChatSelected: State, oneHand disabled, selectedChat, nextChatSelected, - oneHandUI ) } is ChatInfo.ContactRequest -> { ChatListNavLinkLayout( chatLinkPreview = { tryOrShowError("${chat.id}ContactListNavLink", error = { ErrorChatListItem() }) { - ContactPreviewView(chat, disabled) + ContactPreviewView(chat, disabled, showDeletedChatIcon) } }, click = { @@ -121,9 +120,7 @@ fun ContactListNavLinkView(chat: Chat, nextChatSelected: State, oneHand showMenu, disabled, selectedChat, - nextChatSelected, - oneHandUI - ) + nextChatSelected) } else -> {} } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/contacts/ContactPreviewView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/contacts/ContactPreviewView.kt index d47853f03c..dd03bca921 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/contacts/ContactPreviewView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/contacts/ContactPreviewView.kt @@ -21,6 +21,7 @@ import chat.simplex.res.MR fun ContactPreviewView( chat: Chat, disabled: Boolean, + showDeletedChatIcon: Boolean ) { val cInfo = chat.chatInfo val contactType = chatContactType(chat) @@ -104,10 +105,21 @@ fun ContactPreviewView( ) } - if (chat.chatInfo.chatSettings?.favorite == true) { + if (showDeletedChatIcon && chat.chatInfo.chatDeleted) { + Icon( + painterResource(MR.images.ic_inventory_2), + contentDescription = null, + tint = MaterialTheme.colors.secondary, + modifier = Modifier + .size(17.dp) + ) + if (chat.chatInfo.incognito) { + Spacer(Modifier.width(DEFAULT_SPACE_AFTER_ICON)) + } + } else if (chat.chatInfo.chatSettings?.favorite == true) { Icon( painterResource(MR.images.ic_star_filled), - contentDescription = generalGetString(MR.strings.favorite_chat), + contentDescription = null, tint = MaterialTheme.colors.secondary, modifier = Modifier .size(17.dp) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseView.kt index 3ade14bdce..ecf2aaf371 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/database/DatabaseView.kt @@ -522,9 +522,17 @@ private fun exportArchive( progressIndicator.value = true withLongRunningApi { try { - val archiveFile = exportChatArchive(m, null, chatArchiveName, chatArchiveTime, chatArchiveFile) + val (archiveFile, archiveErrors) = exportChatArchive(m, null, chatArchiveName, chatArchiveTime, chatArchiveFile) chatArchiveFile.value = archiveFile - saveArchiveLauncher.launch(archiveFile.substringAfterLast(File.separator)) + if (archiveErrors.isEmpty()) { + saveArchiveLauncher.launch(archiveFile.substringAfterLast(File.separator)) + } else { + showArchiveExportedWithErrorsAlert(generalGetString(MR.strings.chat_database_exported_save), archiveErrors) { + withLongRunningApi { + saveArchiveLauncher.launch(archiveFile.substringAfterLast(File.separator)) + } + } + } progressIndicator.value = false } catch (e: Error) { AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_exporting_chat_database), e.toString()) @@ -539,7 +547,7 @@ suspend fun exportChatArchive( chatArchiveName: MutableState, chatArchiveTime: MutableState, chatArchiveFile: MutableState -): String { +): Pair> { val archiveTime = Clock.System.now() val ts = SimpleDateFormat("yyyy-MM-dd'T'HHmmss", Locale.US).format(Date.from(archiveTime.toJavaInstant())) val archiveName = "simplex-chat.$ts.zip" @@ -550,7 +558,7 @@ suspend fun exportChatArchive( controller.apiSaveAppSettings(AppSettings.current.prepareForExport()) } wallpapersDir.mkdirs() - m.controller.apiExportArchive(config) + val archiveErrors = m.controller.apiExportArchive(config) if (storagePath == null) { deleteOldArchive(m) m.controller.appPrefs.chatArchiveName.set(archiveName) @@ -559,7 +567,7 @@ suspend fun exportChatArchive( chatArchiveName.value = archiveName chatArchiveTime.value = archiveTime chatArchiveFile.value = archivePath - return archivePath + return archivePath to archiveErrors } private fun deleteOldArchive(m: ChatModel) { @@ -592,6 +600,28 @@ private fun importArchiveAlert( ) } +fun showArchiveImportedWithErrorsAlert(archiveErrors: List) { + AlertManager.shared.showAlertMsg( + title = generalGetString(MR.strings.chat_database_imported), + text = generalGetString(MR.strings.restart_the_app_to_use_imported_chat_database) + "\n\n" + generalGetString(MR.strings.non_fatal_errors_occured_during_import) + archiveErrorsText(archiveErrors)) +} + +fun showArchiveExportedWithErrorsAlert(description: String, archiveErrors: List, onConfirm: () -> Unit) { + AlertManager.shared.showAlertMsg( + title = generalGetString(MR.strings.chat_database_exported_title), + text = description + "\n\n" + generalGetString(MR.strings.chat_database_exported_not_all_files) + archiveErrorsText(archiveErrors), + confirmText = generalGetString(MR.strings.chat_database_exported_continue), + onConfirm = onConfirm + ) +} + +private fun archiveErrorsText(errs: List): String = "\n" + errs.map { + when (it) { + is ArchiveError.ArchiveErrorImport -> it.importError + is ArchiveError.ArchiveErrorFile -> "${it.file}: ${it.fileError}" + } +}.joinToString(separator = "\n") + private fun importArchive( m: ChatModel, importedArchiveURI: URI, @@ -621,7 +651,7 @@ private fun importArchive( } } else { operationEnded(m, progressIndicator) { - AlertManager.shared.showAlertMsg(generalGetString(MR.strings.chat_database_imported), text = generalGetString(MR.strings.restart_the_app_to_use_imported_chat_database) + "\n" + generalGetString(MR.strings.non_fatal_errors_occured_during_import)) + showArchiveImportedWithErrorsAlert(archiveErrors) } } } catch (e: Error) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ChatInfoImage.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ChatInfoImage.kt index ea692a9724..1289687601 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ChatInfoImage.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ChatInfoImage.kt @@ -11,8 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.draw.shadow +import androidx.compose.ui.draw.* import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.* import androidx.compose.ui.layout.ContentScale @@ -55,7 +54,8 @@ fun ProfileImage( image: String? = null, icon: ImageResource = MR.images.ic_account_circle_filled, color: Color = MaterialTheme.colors.secondaryVariant, - backgroundColor: Color? = null + backgroundColor: Color? = null, + blurred: Boolean = false ) { Box(Modifier.size(size)) { if (image == null) { @@ -88,7 +88,7 @@ fun ProfileImage( imageBitmap, stringResource(MR.strings.image_descr_profile_image), contentScale = ContentScale.Crop, - modifier = ProfileIconModifier(size) + modifier = ProfileIconModifier(size, blurred = blurred) ) } } @@ -109,12 +109,12 @@ private const val squareToCircleRatio = 0.935f private const val radiusFactor = (1 - squareToCircleRatio) / 50 @Composable -fun ProfileIconModifier(size: Dp, padding: Boolean = true): Modifier { +fun ProfileIconModifier(size: Dp, padding: Boolean = true, blurred: Boolean = false): Modifier { val percent = remember { appPreferences.profileImageCornerRadius.state } val r = max(0f, percent.value) val pad = if (padding) size / 12 else 0.dp val m = Modifier.size(size) - return when { + val m1 = when { r >= 50 -> m.padding(pad).clip(CircleShape) r <= 0 -> { @@ -126,6 +126,7 @@ fun ProfileIconModifier(size: Dp, padding: Boolean = true): Modifier { m.padding((size - sz) / 2).clip(RoundedCornerShape(size = sz * r / 100)) } } + return if (blurred) m1.blur(size / 4) else m1 } /** [AccountCircleFilled] has its inner padding which leads to visible border if there is background underneath. diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/CloseSheetBar.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/CloseSheetBar.kt index 8cdac67bf4..0ff68de3a0 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/CloseSheetBar.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/CloseSheetBar.kt @@ -20,7 +20,7 @@ import chat.simplex.res.MR import dev.icerock.moko.resources.compose.painterResource @Composable -fun CloseSheetBar(close: (() -> Unit)?, showClose: Boolean = true, tintColor: Color = if (close != null) MaterialTheme.colors.primary else MaterialTheme.colors.secondary, arrangement: Arrangement.Vertical = Arrangement.Top, closeBarTitle: String? = null, endButtons: @Composable RowScope.() -> Unit = {}) { +fun CloseSheetBar(close: (() -> Unit)?, showClose: Boolean = true, tintColor: Color = if (close != null) MaterialTheme.colors.primary else MaterialTheme.colors.secondary, arrangement: Arrangement.Vertical = Arrangement.Top, closeBarTitle: String? = null, barPaddingValues: PaddingValues = PaddingValues(horizontal = AppBarHorizontalPadding), endButtons: @Composable RowScope.() -> Unit = {}) { var rowModifier = Modifier .fillMaxWidth() .height(AppBarHeight * fontSizeSqrtMultiplier) @@ -36,7 +36,7 @@ fun CloseSheetBar(close: (() -> Unit)?, showClose: Boolean = true, tintColor: Co .heightIn(min = AppBarHeight * fontSizeSqrtMultiplier) ) { Row( - modifier = Modifier.padding(horizontal = AppBarHorizontalPadding), + modifier = Modifier.padding(barPaddingValues), content = { Row( rowModifier, @@ -70,7 +70,7 @@ fun CloseSheetBar(close: (() -> Unit)?, showClose: Boolean = true, tintColor: Co } @Composable -fun AppBarTitle(title: String, hostDevice: Pair? = null, withPadding: Boolean = true, bottomPadding: Dp = DEFAULT_PADDING * 1.5f) { +fun AppBarTitle(title: String, hostDevice: Pair? = null, withPadding: Boolean = true, bottomPadding: Dp = DEFAULT_PADDING * 1.5f + 8.dp) { val theme = CurrentColors.collectAsState() val titleColor = MaterialTheme.appColors.title val brush = if (theme.value.base == DefaultTheme.SIMPLEX) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/DefaultTopAppBar.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/DefaultTopAppBar.kt index c7ae522684..28e9a997ae 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/DefaultTopAppBar.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/DefaultTopAppBar.kt @@ -53,6 +53,15 @@ fun NavigationButtonBack(onButtonClicked: (() -> Unit)?, tintColor: Color = if ( } } +@Composable +fun NavigationButtonClose(onButtonClicked: (() -> Unit)?, tintColor: Color = if (onButtonClicked != null) MaterialTheme.colors.primary else MaterialTheme.colors.secondary, height: Dp = 24.dp) { + IconButton(onButtonClicked ?: {}, enabled = onButtonClicked != null) { + Icon( + painterResource(MR.images.ic_close), stringResource(MR.strings.back), Modifier.height(height), tint = tintColor + ) + } +} + @Composable fun ShareButton(onButtonClicked: () -> Unit) { IconButton(onButtonClicked) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ModalView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ModalView.kt index a1d8574d9f..d20d573bd2 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ModalView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ModalView.kt @@ -26,7 +26,6 @@ fun ModalView( background: Color = MaterialTheme.colors.background, modifier: Modifier = Modifier, closeOnTop: Boolean = true, - closeBarTitle: String? = null, endButtons: @Composable RowScope.() -> Unit = {}, content: @Composable () -> Unit, ) { @@ -38,14 +37,10 @@ fun ModalView( if (closeOnTop) { CloseSheetBar(if (enableClose) close else null, showClose, endButtons = endButtons) } - Box(if (closeOnTop) modifier else modifier.padding(bottom = AppBarHeight * fontSizeSqrtMultiplier)) { + Box(modifier = modifier) { content() } } - - if (!closeOnTop) { - CloseSheetBar(if (enableClose) close else null, showClose, endButtons = endButtons, arrangement = Arrangement.Bottom, closeBarTitle = closeBarTitle) - } } } @@ -72,17 +67,17 @@ class ModalManager(private val placement: ModalPlacement? = null) { // java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied private var passcodeView: MutableStateFlow<(@Composable (close: () -> Unit) -> Unit)?> = MutableStateFlow(null) - fun showModal(settings: Boolean = false, showClose: Boolean = true, closeOnTop: Boolean = true, closeBarTitle: String? = null,endButtons: @Composable RowScope.() -> Unit = {}, content: @Composable ModalData.() -> Unit) { + fun showModal(settings: Boolean = false, showClose: Boolean = true, closeOnTop: Boolean = true, endButtons: @Composable RowScope.() -> Unit = {}, content: @Composable ModalData.() -> Unit) { val data = ModalData() showCustomModal { close -> - ModalView(close, showClose = showClose, closeOnTop = closeOnTop, closeBarTitle = closeBarTitle, endButtons = endButtons, content = { data.content() }) + ModalView(close, showClose = showClose, closeOnTop = closeOnTop, endButtons = endButtons, content = { data.content() }) } } - fun showModalCloseable(settings: Boolean = false, showClose: Boolean = true, closeOnTop: Boolean = true, closeBarTitle: String? = null, endButtons: @Composable RowScope.() -> Unit = {}, content: @Composable ModalData.(close: () -> Unit) -> Unit) { + fun showModalCloseable(settings: Boolean = false, showClose: Boolean = true, closeOnTop: Boolean = true, endButtons: @Composable RowScope.() -> Unit = {}, content: @Composable ModalData.(close: () -> Unit) -> Unit) { val data = ModalData() showCustomModal { close -> - ModalView(close, showClose = showClose, endButtons = endButtons, closeOnTop = closeOnTop, closeBarTitle = closeBarTitle, content = { data.content(close) }) + ModalView(close, showClose = showClose, endButtons = endButtons, closeOnTop = closeOnTop, content = { data.content(close) }) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/SearchTextField.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/SearchTextField.kt index ca451bd3a2..896d929480 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/SearchTextField.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/SearchTextField.kt @@ -63,6 +63,7 @@ fun SearchTextField( focusedIndicatorColor = Color.Unspecified, unfocusedIndicatorColor = Color.Unspecified, disabledIndicatorColor = Color.Unspecified, + placeholderColor = MaterialTheme.colors.secondary, ) val shape = MaterialTheme.shapes.small.copy(bottomEnd = ZeroCornerSize, bottomStart = ZeroCornerSize) val interactionSource = remember { MutableInteractionSource() } @@ -88,7 +89,7 @@ fun SearchTextField( textStyle = TextStyle( color = MaterialTheme.colors.onBackground, fontWeight = FontWeight.Normal, - fontSize = 16.sp + fontSize = 15.sp ), interactionSource = interactionSource, decorationBox = @Composable { innerTextField -> diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateFromDevice.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateFromDevice.kt index 3cc5468bbb..c60723ee36 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateFromDevice.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateFromDevice.kt @@ -480,12 +480,13 @@ private fun MutableState.exportArchive() { withLongRunningApi { try { getMigrationTempFilesDirectory().mkdir() - val archivePath = exportChatArchive(chatModel, getMigrationTempFilesDirectory(), mutableStateOf(""), mutableStateOf(Instant.DISTANT_PAST), mutableStateOf("")) - val totalBytes = File(archivePath).length() - if (totalBytes > 0L) { - state = MigrationFromState.DatabaseInit(totalBytes, archivePath) + val (archivePath, archiveErrors) = exportChatArchive(chatModel, getMigrationTempFilesDirectory(), mutableStateOf(""), mutableStateOf(Instant.DISTANT_PAST), mutableStateOf("")) + if (archiveErrors.isEmpty()) { + uploadArchive(archivePath) } else { - AlertManager.shared.showAlertMsg(generalGetString(MR.strings.migrate_from_device_exported_file_doesnt_exist)) + showArchiveExportedWithErrorsAlert(generalGetString(MR.strings.chat_database_exported_migrate), archiveErrors) { + uploadArchive(archivePath) + } state = MigrationFromState.UploadConfirmation } } catch (e: Exception) { @@ -498,6 +499,17 @@ private fun MutableState.exportArchive() { } } +private fun MutableState.uploadArchive(archivePath: String) { + val totalBytes = File(archivePath).length() + if (totalBytes > 0L) { + state = MigrationFromState.DatabaseInit(totalBytes, archivePath) + } else { + AlertManager.shared.showAlertMsg(generalGetString(MR.strings.migrate_from_device_exported_file_doesnt_exist)) + state = MigrationFromState.UploadConfirmation + } + +} + suspend fun initTemporaryDatabase(tempDatabaseFile: File, netCfg: NetCfg): Pair? { val (status, ctrl) = chatInitTemporaryDatabase(tempDatabaseFile.absolutePath) showErrorOnMigrationIfNeeded(status) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateToDevice.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateToDevice.kt index 1a94676f79..1a1e8426d4 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateToDevice.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/migration/MigrateToDevice.kt @@ -237,7 +237,6 @@ private fun ModalData.OnionView(link: String, socksProxy: String?, hostMode: Hos proxy } } - val proxyPort = remember { derivedStateOf { networkProxyHostPort.value?.split(":")?.lastOrNull()?.toIntOrNull() ?: 9050 } } val netCfg = rememberSaveable(stateSaver = serializableSaver()) { mutableStateOf(getNetCfg().withOnionHosts(onionHosts.value).copy(socksProxy = socksProxy, sessionMode = sessionMode.value)) @@ -275,7 +274,6 @@ private fun ModalData.OnionView(link: String, socksProxy: String?, hostMode: Hos onionHosts, sessionMode, networkProxyHostPortPref, - proxyPort, toggleSocksProxy = { enable -> networkUseSocksProxy.value = enable }, @@ -599,10 +597,7 @@ private fun MutableState.importArchive(archivePath: String, n val config = ArchiveConfig(archivePath, parentTempDirectory = databaseExportDir.toString()) val archiveErrors = controller.apiImportArchive(config) if (archiveErrors.isNotEmpty()) { - AlertManager.shared.showAlertMsg( - generalGetString(MR.strings.chat_database_imported), - generalGetString(MR.strings.non_fatal_errors_occured_during_import) - ) + showArchiveImportedWithErrorsAlert(archiveErrors) } state = MigrationToState.Passphrase("", netCfg) MigrationToDeviceState.save(MigrationToDeviceState.Passphrase(netCfg)) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt index 6714e3aff6..a1eaf97fe7 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt @@ -14,7 +14,6 @@ import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.scale import androidx.compose.ui.focus.* import androidx.compose.ui.graphics.* import androidx.compose.ui.graphics.painter.Painter @@ -28,6 +27,7 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.* import chat.simplex.common.model.* +import chat.simplex.common.model.ChatController.appPrefs import chat.simplex.common.platform.* import chat.simplex.common.ui.theme.* import chat.simplex.common.views.chatlist.ScrollDirection @@ -39,45 +39,47 @@ import java.net.URI @Composable fun NewChatSheet(rh: RemoteHostInfo?, close: () -> Unit) { - val oneHandUI = remember { chatModel.controller.appPrefs.oneHandUI } + val oneHandUI = remember { appPrefs.oneHandUI.state } + val keyboardState by getKeyboardState() + val showToolbarInOneHandUI = remember { derivedStateOf { keyboardState == KeyboardState.Closed && oneHandUI.value } } - Column( - modifier = Modifier.fillMaxSize() - ) { - if (!oneHandUI.state.value) { - Box(contentAlignment = Alignment.Center) { - val bottomPadding = DEFAULT_PADDING - AppBarTitle( - stringResource(MR.strings.new_chat), - hostDevice(rh?.remoteHostId), - bottomPadding = bottomPadding - ) + Scaffold( + bottomBar = { + if (showToolbarInOneHandUI.value) { + Column { + Divider() + CloseSheetBar( + close = close, + showClose = true, + endButtons = { Spacer(Modifier.minimumInteractiveComponentSize()) }, + arrangement = Arrangement.Bottom, + closeBarTitle = generalGetString(MR.strings.new_chat), + barPaddingValues = PaddingValues(horizontal = 0.dp) + ) + } } } + ) { + Column( + modifier = Modifier.fillMaxSize().padding(it) + ) { + val closeAll = { ModalManager.start.closeModals() } - val closeAll = { ModalManager.start.closeModals() } - - var modifier = Modifier.fillMaxSize() - - if (oneHandUI.state.value) { - modifier = modifier.scale(scaleX = 1f, scaleY = -1f) - } - - Column(modifier = modifier) { - NewChatSheetLayout( - addContact = { - ModalManager.start.showModalCloseable { _ -> NewChatView(chatModel.currentRemoteHost.value, NewChatOption.INVITE, close = closeAll ) } - }, - scanPaste = { - ModalManager.start.showModalCloseable { _ -> NewChatView(chatModel.currentRemoteHost.value, NewChatOption.CONNECT, showQRCodeScanner = appPlatform.isAndroid, close = closeAll) } - }, - createGroup = { - ModalManager.start.showCustomModal { close -> AddGroupView(chatModel, chatModel.currentRemoteHost.value, close, closeAll) } - }, - rh = rh, - close = close, - oneHandUI = oneHandUI - ) + Column(modifier = Modifier.fillMaxSize()) { + NewChatSheetLayout( + addContact = { + ModalManager.start.showModalCloseable { _ -> NewChatView(chatModel.currentRemoteHost.value, NewChatOption.INVITE, close = closeAll ) } + }, + scanPaste = { + ModalManager.start.showModalCloseable { _ -> NewChatView(chatModel.currentRemoteHost.value, NewChatOption.CONNECT, showQRCodeScanner = appPlatform.isAndroid, close = closeAll) } + }, + createGroup = { + ModalManager.start.showCustomModal { close -> AddGroupView(chatModel, chatModel.currentRemoteHost.value, close, closeAll) } + }, + rh = rh, + close = close + ) + } } } } @@ -90,7 +92,7 @@ fun chatContactType(chat: Chat): ContactType { return when (val cInfo = chat.chatInfo) { is ChatInfo.ContactRequest -> ContactType.REQUEST is ChatInfo.Direct -> { - val contact = cInfo.contact; + val contact = cInfo.contact when { contact.activeConn == null && contact.profile.contactLink != null -> ContactType.CARD @@ -116,15 +118,15 @@ private fun NewChatSheetLayout( scanPaste: () -> Unit, createGroup: () -> Unit, close: () -> Unit, - oneHandUI: SharedPreference ) { + val oneHandUI = remember { appPrefs.oneHandUI.state } val listState = rememberLazyListState(lazyListState.first, lazyListState.second) val searchText = rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue("")) } val searchShowingSimplexLink = remember { mutableStateOf(false) } val searchChatFilteredBySimplexLink = remember { mutableStateOf(null) } val showUnreadAndFavorites = remember { ChatController.appPrefs.showUnreadAndFavorites.state }.value - val baseContactTypes = listOf(ContactType.CARD, ContactType.RECENT, ContactType.REQUEST) - val contactTypes by remember(baseContactTypes, searchText.value.text.isEmpty()) { + val baseContactTypes = remember { listOf(ContactType.CARD, ContactType.RECENT, ContactType.REQUEST) } + val contactTypes by remember(searchText.value.text.isEmpty()) { derivedStateOf { contactTypesSearchTargets(baseContactTypes, searchText.value.text.isEmpty()) } } val allChats by remember(chatModel.chats.value, contactTypes) { @@ -133,6 +135,7 @@ private fun NewChatSheetLayout( var scrollDirection by remember { mutableStateOf(ScrollDirection.Idle) } var previousIndex by remember { mutableStateOf(0) } var previousScrollOffset by remember { mutableStateOf(0) } + val keyboardState by getKeyboardState() LaunchedEffect(listState.firstVisibleItemIndex, listState.firstVisibleItemScrollOffset) { val currentIndex = listState.firstVisibleItemIndex @@ -160,24 +163,38 @@ private fun NewChatSheetLayout( contactChats = allChats ) - var sectionModifier = Modifier.fillMaxWidth() - - if (oneHandUI.state.value) { - sectionModifier = sectionModifier.scale(scaleX = 1f, scaleY = -1f) - } + val sectionModifier = Modifier.fillMaxWidth() LazyColumnWithScrollBar( - Modifier.fillMaxWidth(), - listState + Modifier.fillMaxSize(), + listState, + reverseLayout = oneHandUI.value ) { + if (!oneHandUI.value) { + item { + Box(contentAlignment = Alignment.Center) { + val bottomPadding = DEFAULT_PADDING + AppBarTitle( + stringResource(MR.strings.new_chat), + hostDevice(rh?.remoteHostId), + bottomPadding = bottomPadding + ) + } + } + } stickyHeader { Column( Modifier .offset { val y = if (searchText.value.text.isEmpty()) { - if (oneHandUI.state.value && scrollDirection == ScrollDirection.Up) { + val offsetMultiplier = if (oneHandUI.value) 1 else -1 + + if ( + (oneHandUI.value && scrollDirection == ScrollDirection.Up) || + (appPlatform.isAndroid && keyboardState == KeyboardState.Opened) + ) { 0 - } else if (listState.firstVisibleItemIndex == 0) -listState.firstVisibleItemScrollOffset else -1000 + } else if (listState.firstVisibleItemIndex == 0) offsetMultiplier * listState.firstVisibleItemScrollOffset else offsetMultiplier * 1000 } else { 0 } @@ -185,47 +202,57 @@ private fun NewChatSheetLayout( } .background(MaterialTheme.colors.background) ) { - if (!oneHandUI.state.value) { - Divider() - } + Divider() ContactsSearchBar( listState = listState, searchText = searchText, searchShowingSimplexLink = searchShowingSimplexLink, searchChatFilteredBySimplexLink = searchChatFilteredBySimplexLink, close = close, - oneHandUI = oneHandUI ) - Divider() + if (!oneHandUI.value) { + Divider() + } } } item { - Spacer(Modifier.padding(bottom = DEFAULT_PADDING)) + Spacer(Modifier.padding(bottom = 27.dp)) + + val actionButtonsOriginal = listOf( + Triple( + painterResource(MR.images.ic_add_link), + stringResource(MR.strings.add_contact_tab), + addContact, + ), + Triple( + painterResource(MR.images.ic_qr_code), + if (appPlatform.isAndroid) stringResource(MR.strings.scan_paste_link) else stringResource(MR.strings.paste_link), + scanPaste, + ), + Triple( + painterResource(MR.images.ic_group), + stringResource(MR.strings.create_group_button), + createGroup, + ) + ) + + val actionButtons by remember(oneHandUI.value) { + derivedStateOf { + if (oneHandUI.value) actionButtonsOriginal.asReversed() else actionButtonsOriginal + } + } if (searchText.value.text.isEmpty()) { Row { SectionView { - NewChatButton( - icon = painterResource(MR.images.ic_add_link), - text = stringResource(MR.strings.add_contact_tab), - click = addContact, - extraPadding = true, - oneHandUI = oneHandUI.state - ) - NewChatButton( - icon = painterResource(MR.images.ic_qr_code), - text = if (appPlatform.isAndroid) stringResource(MR.strings.scan_paste_link) else stringResource(MR.strings.paste_link), - click = scanPaste, - extraPadding = true, - oneHandUI = oneHandUI.state - ) - NewChatButton( - icon = painterResource(MR.images.ic_group), - text = stringResource(MR.strings.create_group_button), - click = createGroup, - extraPadding = true, - oneHandUI = oneHandUI.state - ) + actionButtons.map { + NewChatButton( + icon = it.first, + text = it.second, + click = it.third, + extraPadding = true, + ) + } } } SectionDividerSpaced(maxBottomPadding = false) @@ -242,11 +269,9 @@ private fun NewChatSheetLayout( ModalManager.start.showCustomModal { closeDeletedChats -> ModalView( close = closeDeletedChats, - closeOnTop = !oneHandUI.state.value, - closeBarTitle = if (oneHandUI.state.value) generalGetString(MR.strings.deleted_chats) else null, - endButtons = { Spacer(Modifier.minimumInteractiveComponentSize()) } + closeOnTop = !oneHandUI.value, ) { - DeletedContactsView(rh = rh, close = { + DeletedContactsView(rh = rh, closeDeletedChats = closeDeletedChats, close = { ModalManager.start.closeModals() }) } @@ -254,7 +279,7 @@ private fun NewChatSheetLayout( } ) { Icon( - painterResource(MR.images.ic_folder_open), + painterResource(MR.images.ic_inventory_2), contentDescription = stringResource(MR.strings.deleted_chats), tint = MaterialTheme.colors.secondary, ) @@ -263,16 +288,16 @@ private fun NewChatSheetLayout( } } } - SectionDividerSpaced() + SectionDividerSpaced(maxBottomPadding = false) } } } item { - if (filteredContactChats.isNotEmpty() && !oneHandUI.state.value) { + if (filteredContactChats.isNotEmpty() && !oneHandUI.value) { Text( stringResource(MR.strings.contact_list_header_title).uppercase(), color = MaterialTheme.colors.secondary, style = MaterialTheme.typography.body2, - modifier = sectionModifier.padding(start = DEFAULT_PADDING, bottom = 5.dp), fontSize = 12.sp + modifier = sectionModifier.padding(start = DEFAULT_PADDING, top = DEFAULT_PADDING_HALF, bottom = DEFAULT_PADDING_HALF), fontSize = 12.sp ) } } @@ -283,7 +308,7 @@ private fun NewChatSheetLayout( chatModel.chatId.value != null && filteredContactChats.getOrNull(index + 1)?.id == chatModel.chatId.value } } - ContactListNavLinkView(chat, nextChatSelected, oneHandUI.state) + ContactListNavLinkView(chat, nextChatSelected, showDeletedChatIcon = true) } } @@ -308,10 +333,9 @@ private fun NewChatButton( iconColor: Color = MaterialTheme.colors.secondary, disabled: Boolean = false, extraPadding: Boolean = false, - oneHandUI: State ) { SectionItemView(click, disabled = disabled) { - Row(modifier = if (oneHandUI.value) Modifier.scale(scaleX = 1f, scaleY = -1f) else Modifier) { + Row { Icon(icon, text, tint = if (disabled) MaterialTheme.colors.secondary else iconColor) TextIconSpaced(extraPadding) Text(text, color = if (disabled) MaterialTheme.colors.secondary else textColor) @@ -326,17 +350,10 @@ private fun ContactsSearchBar( searchShowingSimplexLink: MutableState, searchChatFilteredBySimplexLink: MutableState, close: () -> Unit, - oneHandUI: SharedPreference ) { - var modifier = Modifier.fillMaxWidth(); - - if (oneHandUI.state.value) { - modifier = modifier.scale(scaleX = 1f, scaleY = -1f) - } - var focused by remember { mutableStateOf(false) } - Row(verticalAlignment = Alignment.CenterVertically, modifier = modifier) { + Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth()) { val focusRequester = remember { FocusRequester() } Icon( painterResource(MR.images.ic_search), @@ -416,7 +433,7 @@ private fun ContactsSearchBar( @Composable private fun ToggleFilterButton() { - val pref = remember { ChatController.appPrefs.showUnreadAndFavorites } + val pref = remember { appPrefs.showUnreadAndFavorites } IconButton(onClick = { pref.set(!pref.get()) }) { val sp16 = with(LocalDensity.current) { 16.sp.toDp() } Icon( @@ -471,7 +488,7 @@ private fun filteredContactChats( } private fun filterChat(chat: Chat, searchText: String, showUnreadAndFavorites: Boolean): Boolean { - var meetsPredicate = true; + var meetsPredicate = true val s = searchText.trim().lowercase() val cInfo = chat.chatInfo @@ -485,7 +502,7 @@ private fun filterChat(chat: Chat, searchText: String, showUnreadAndFavorites: B meetsPredicate = meetsPredicate && (cInfo.chatSettings?.favorite ?: false) } - return meetsPredicate; + return meetsPredicate } private fun viewNameContains(cInfo: ChatInfo, s: String): Boolean = @@ -512,85 +529,100 @@ private fun contactTypesSearchTargets(baseContactTypes: List, searc } @Composable -private fun DeletedContactsView(rh: RemoteHostInfo?, close: () -> Unit) { - val oneHandUI = remember { chatModel.controller.appPrefs.oneHandUI } +private fun DeletedContactsView(rh: RemoteHostInfo?, closeDeletedChats: () -> Unit, close: () -> Unit) { + val oneHandUI = remember { appPrefs.oneHandUI.state } + val keyboardState by getKeyboardState() + val showToolbarInOneHandUI = remember { derivedStateOf { keyboardState == KeyboardState.Closed && oneHandUI.value } } - var modifier = Modifier.fillMaxSize() - - if (oneHandUI.state.value) { - modifier = modifier.scale(scaleX = 1f, scaleY = -1f) - } - - Column( - modifier, - ) { - if (!oneHandUI.state.value) { - Box(contentAlignment = Alignment.Center) { - val bottomPadding = DEFAULT_PADDING - AppBarTitle( - stringResource(MR.strings.deleted_chats), - hostDevice(rh?.remoteHostId), - bottomPadding = bottomPadding - ) - } - } - - val listState = rememberLazyListState(lazyListState.first, lazyListState.second) - val searchText = rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue("")) } - val searchShowingSimplexLink = remember { mutableStateOf(false) } - val searchChatFilteredBySimplexLink = remember { mutableStateOf(null) } - val showUnreadAndFavorites = remember { ChatController.appPrefs.showUnreadAndFavorites.state }.value - val contactTypes = listOf(ContactType.CHAT_DELETED) - val allChats by remember(chatModel.chats.value, contactTypes) { - derivedStateOf { filterContactTypes(chatModel.chats.value, contactTypes) } - } - val filteredContactChats = filteredContactChats( - showUnreadAndFavorites = showUnreadAndFavorites, - searchChatFilteredBySimplexLink = searchChatFilteredBySimplexLink, - searchShowingSimplexLink = searchShowingSimplexLink, - searchText = searchText.value.text, - contactChats = allChats - ) - - LazyColumnWithScrollBar( - Modifier.fillMaxWidth(), - listState - ) { - item { - Divider() - ContactsSearchBar( - listState = listState, - searchText = searchText, - searchShowingSimplexLink = searchShowingSimplexLink, - searchChatFilteredBySimplexLink = searchChatFilteredBySimplexLink, - close = close, - oneHandUI = oneHandUI - ) - Divider() - - Spacer(Modifier.padding(bottom = DEFAULT_PADDING)) - } - - itemsIndexed(filteredContactChats) { index, chat -> - val nextChatSelected = remember(chat.id, filteredContactChats) { - derivedStateOf { - chatModel.chatId.value != null && filteredContactChats.getOrNull(index + 1)?.id == chatModel.chatId.value - } - } - ContactListNavLinkView(chat, nextChatSelected, oneHandUI.state) - } - } - if (filteredContactChats.isEmpty() && allChats.isNotEmpty()) { - Column(Modifier.fillMaxSize().padding(DEFAULT_PADDING)) { - Box(Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { - Text( - generalGetString(MR.strings.no_filtered_contacts), - color = MaterialTheme.colors.secondary, - modifier = if (oneHandUI.state.value) Modifier.scale(scaleX = 1f, scaleY = -1f) else Modifier + Scaffold( + bottomBar = { + if (showToolbarInOneHandUI.value) { + Column { + Divider() + CloseSheetBar( + close = closeDeletedChats, + showClose = true, + endButtons = { Spacer(Modifier.minimumInteractiveComponentSize()) }, + arrangement = Arrangement.Bottom, + closeBarTitle = generalGetString(MR.strings.deleted_chats), + barPaddingValues = PaddingValues(horizontal = 0.dp) ) } } } + ) { + Column( + Modifier + .fillMaxSize() + .padding(it) + ) { + if (!oneHandUI.value) { + Box(contentAlignment = Alignment.Center) { + val bottomPadding = DEFAULT_PADDING + AppBarTitle( + stringResource(MR.strings.deleted_chats), + hostDevice(rh?.remoteHostId), + bottomPadding = bottomPadding + ) + } + } + + val listState = rememberLazyListState(lazyListState.first, lazyListState.second) + val searchText = rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue("")) } + val searchShowingSimplexLink = remember { mutableStateOf(false) } + val searchChatFilteredBySimplexLink = remember { mutableStateOf(null) } + val showUnreadAndFavorites = remember { appPrefs.showUnreadAndFavorites.state }.value + val allChats by remember(chatModel.chats.value) { + derivedStateOf { filterContactTypes(chatModel.chats.value, listOf(ContactType.CHAT_DELETED)) } + } + val filteredContactChats = filteredContactChats( + showUnreadAndFavorites = showUnreadAndFavorites, + searchChatFilteredBySimplexLink = searchChatFilteredBySimplexLink, + searchShowingSimplexLink = searchShowingSimplexLink, + searchText = searchText.value.text, + contactChats = allChats + ) + + LazyColumnWithScrollBar( + Modifier.fillMaxSize(), + reverseLayout = oneHandUI.value, + ) { + item { + if (!oneHandUI.value) { + Divider() + } + ContactsSearchBar( + listState = listState, + searchText = searchText, + searchShowingSimplexLink = searchShowingSimplexLink, + searchChatFilteredBySimplexLink = searchChatFilteredBySimplexLink, + close = close, + ) + Divider() + + Spacer(Modifier.padding(bottom = DEFAULT_PADDING)) + } + + itemsIndexed(filteredContactChats) { index, chat -> + val nextChatSelected = remember(chat.id, filteredContactChats) { + derivedStateOf { + chatModel.chatId.value != null && filteredContactChats.getOrNull(index + 1)?.id == chatModel.chatId.value + } + } + ContactListNavLinkView(chat, nextChatSelected, showDeletedChatIcon = false) + } + } + if (filteredContactChats.isEmpty() && allChats.isNotEmpty()) { + Column(Modifier.fillMaxSize().padding(DEFAULT_PADDING)) { + Box(Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { + Text( + generalGetString(MR.strings.no_filtered_contacts), + color = MaterialTheme.colors.secondary, + ) + } + } + } + } } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt index 77e5662b21..007f474265 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt @@ -61,9 +61,8 @@ fun ModalData.NewChatView(rh: RemoteHostInfo?, selection: NewChatOption, showQRC /** When [AddContactLearnMore] is open, we don't need to drop [ChatModel.showingInvitation]. * Otherwise, it will be called here AFTER [AddContactLearnMore] is launched and will clear the value too soon. * It will be dropped automatically when connection established or when user goes away from this screen. - * It applies only to Android because on Desktop center space will not be overlapped by [AddContactLearnMore] **/ - if (chatModel.showingInvitation.value != null && (ModalManager.start.openModalCount() == 1 || appPlatform.isDesktop)) { + if (chatModel.showingInvitation.value != null && ModalManager.start.openModalCount() == 1) { val conn = contactConnection.value if (chatModel.showingInvitation.value?.connChatUsed == false && conn != null) { AlertManager.shared.showAlertDialog( @@ -78,7 +77,7 @@ fun ModalData.NewChatView(rh: RemoteHostInfo?, selection: NewChatOption, showQRC controller.deleteChat(Chat(remoteHostId = rh?.remoteHostId, chatInfo = chatInfo, chatItems = listOf())) if (chatModel.chatId.value == chatInfo.id) { chatModel.chatId.value = null - ModalManager.end.closeModals() + ModalManager.start.closeModals() } } } @@ -212,8 +211,7 @@ private fun InviteView(rhId: Long?, connReqInvitation: String, contactConnection Spacer(Modifier.height(10.dp)) val incognito = remember { mutableStateOf(controller.appPrefs.incognito.get()) } IncognitoToggle(controller.appPrefs.incognito, incognito) { - if (appPlatform.isDesktop) ModalManager.end.closeModals() - ModalManager.end.showModal { IncognitoView() } + ModalManager.start.showModal { IncognitoView() } } KeyChangeEffect(incognito.value) { withBGApi { @@ -233,8 +231,7 @@ private fun InviteView(rhId: Long?, connReqInvitation: String, contactConnection private fun AddContactLearnMoreButton() { IconButton( { - if (appPlatform.isDesktop) ModalManager.end.closeModals() - ModalManager.end.showModalCloseable { close -> + ModalManager.start.showModalCloseable { close -> AddContactLearnMore(close) } }, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt index 340346f5b3..05cd9cb118 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt @@ -18,7 +18,7 @@ import androidx.compose.desktop.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import chat.simplex.common.model.ChatModel -import chat.simplex.common.platform.ColumnWithScrollBar +import chat.simplex.common.platform.* import chat.simplex.common.ui.theme.* import chat.simplex.common.views.helpers.* import chat.simplex.res.MR @@ -115,7 +115,9 @@ fun WhatsNewView(viaSettings: Boolean = false, close: () -> Unit) { AppBarTitle(String.format(generalGetString(MR.strings.new_in_version), v.version), bottomPadding = DEFAULT_PADDING) v.features.forEach { feature -> - featureDescription(painterResource(feature.icon), feature.titleId, feature.descrId, feature.link) + if (feature.show) { + featureDescription(painterResource(feature.icon), feature.titleId, feature.descrId, feature.link) + } } if (v.post != null) { @@ -158,7 +160,8 @@ private data class FeatureDescription( val icon: ImageResource, val titleId: StringResource, val descrId: StringResource, - val link: String? = null + val link: String? = null, + val show: Boolean = true ) private data class VersionDescription( @@ -587,6 +590,43 @@ private val versionDescriptions: List = listOf( ) ) ), + VersionDescription( + version = "v6.0", + post = "https://simplex.chat/blog/20240814-simplex-chat-vision-funding-v6-private-routing-new-user-experience.html", + features = listOf( + FeatureDescription( + icon = MR.images.ic_settings_ethernet, + titleId = MR.strings.v5_8_private_routing, + descrId = MR.strings.v6_0_private_routing_descr + ), + FeatureDescription( + icon = MR.images.ic_id_card, + titleId = MR.strings.v6_0_your_contacts, + descrId = MR.strings.v6_0_your_contacts_descr + ), + FeatureDescription( + icon = MR.images.ic_toast, + titleId = MR.strings.v6_0_reachable_chat_toolbar, + descrId = MR.strings.v6_0_reachable_chat_toolbar_descr, + show = appPlatform.isAndroid + ), + FeatureDescription( + icon = MR.images.ic_link, + titleId = MR.strings.v6_0_connect_faster, + descrId = MR.strings.v6_0_connect_faster_descr + ), + FeatureDescription( + icon = MR.images.ic_delete, + titleId = MR.strings.v6_0_delete_many_messages, + descrId = MR.strings.v6_0_delete_many_messages_descr + ), + FeatureDescription( + icon = MR.images.ic_wifi_tethering, + titleId = MR.strings.v6_0_connection_servers_status, + descrId = MR.strings.v6_0_connection_servers_status_descr + ) + ), + ) ) private val lastVersion = versionDescriptions.last().version diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/remote/ConnectMobileView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/remote/ConnectMobileView.kt index d8c9557863..92503f273e 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/remote/ConnectMobileView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/remote/ConnectMobileView.kt @@ -89,10 +89,7 @@ fun ConnectMobileLayout( connectDesktop: () -> Unit, deleteHost: (RemoteHostInfo) -> Unit, ) { - ColumnWithScrollBar( - Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { + ColumnWithScrollBar(Modifier.fillMaxWidth()) { AppBarTitle(stringResource(if (remember { chatModel.remoteHosts }.isEmpty()) MR.strings.link_a_mobile else MR.strings.linked_mobiles)) SectionView(generalGetString(MR.strings.this_device_name).uppercase()) { DeviceNameField(deviceName.value ?: "") { updateDeviceName(it) } @@ -100,7 +97,7 @@ fun ConnectMobileLayout( PreferenceToggle(stringResource(MR.strings.multicast_discoverable_via_local_network), checked = remember { controller.appPrefs.offerRemoteMulticast.state }.value) { controller.appPrefs.offerRemoteMulticast.set(it) } - SectionDividerSpaced(maxBottomPadding = false) + SectionDividerSpaced() } SectionView(stringResource(MR.strings.devices).uppercase()) { if (chatModel.localUserCreated.value == true) { @@ -179,10 +176,7 @@ private fun ConnectMobileViewLayout( refreshQrCode: () -> Unit = {}, UnderQrLayout: @Composable () -> Unit = {}, ) { - ColumnWithScrollBar( - Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { + ColumnWithScrollBar(Modifier.fillMaxWidth()) { if (title != null) { AppBarTitle(title) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/AdvancedNetworkSettings.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/AdvancedNetworkSettings.kt index cd3e5902d0..ed68c7b013 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/AdvancedNetworkSettings.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/AdvancedNetworkSettings.kt @@ -2,39 +2,54 @@ package chat.simplex.common.views.usersettings import SectionBottomSpacer import SectionCustomFooter +import SectionDividerSpaced import SectionItemView +import SectionItemWithValue import SectionView +import SectionViewSelectableCards import androidx.compose.desktop.ui.tooling.preview.Preview -import androidx.compose.foundation.* import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.* import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.platform.LocalDensity import dev.icerock.moko.resources.compose.painterResource import dev.icerock.moko.resources.compose.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import chat.simplex.common.model.* +import chat.simplex.common.model.ChatController.appPrefs import chat.simplex.common.ui.theme.* import chat.simplex.common.views.helpers.* -import chat.simplex.common.model.ChatModel +import chat.simplex.common.model.ChatModel.controller import chat.simplex.common.platform.ColumnWithScrollBar +import chat.simplex.common.platform.chatModel import chat.simplex.res.MR import java.text.DecimalFormat @Composable -fun AdvancedNetworkSettingsView(chatModel: ChatModel) { - val currentCfg = remember { mutableStateOf(chatModel.controller.getNetCfg()) } +fun ModalData.AdvancedNetworkSettingsView(showModal: (ModalData.() -> Unit) -> Unit, close: () -> Unit) { + val currentRemoteHost by remember { chatModel.currentRemoteHost } + val developerTools = remember { appPrefs.developerTools.get() } + + // Will be actual once the screen is re-opened + val savedCfg = remember { mutableStateOf(controller.getNetCfg()) } + // Will have an edited state when the screen is re-opened + val currentCfg = remember { stateGetOrPut("currentCfg") { controller.getNetCfg() } } val currentCfgVal = currentCfg.value // used only on initialization + + val onionHosts = remember { mutableStateOf(currentCfgVal.onionHosts) } + val sessionMode = remember { mutableStateOf(currentCfgVal.sessionMode) } + val smpProxyMode = remember { mutableStateOf(currentCfgVal.smpProxyMode) } + val smpProxyFallback = remember { mutableStateOf(currentCfgVal.smpProxyFallback) } + + val networkUseSocksProxy: MutableState = remember { mutableStateOf(currentCfgVal.useSocksProxy) } val networkTCPConnectTimeout = remember { mutableStateOf(currentCfgVal.tcpConnectTimeout) } val networkTCPTimeout = remember { mutableStateOf(currentCfgVal.tcpTimeout) } val networkTCPTimeoutPerKb = remember { mutableStateOf(currentCfgVal.tcpTimeoutPerKb) } - var networkRcvConcurrency = remember { mutableStateOf(currentCfgVal.rcvConcurrency) } + val networkRcvConcurrency = remember { mutableStateOf(currentCfgVal.rcvConcurrency) } val networkSMPPingInterval = remember { mutableStateOf(currentCfgVal.smpPingInterval) } val networkSMPPingCount = remember { mutableStateOf(currentCfgVal.smpPingCount) } val networkEnableKeepAlive = remember { mutableStateOf(currentCfgVal.enableKeepAlive) } @@ -63,11 +78,11 @@ fun AdvancedNetworkSettingsView(chatModel: ChatModel) { } return NetCfg( socksProxy = currentCfg.value.socksProxy, - hostMode = currentCfg.value.hostMode, - requiredHostMode = currentCfg.value.requiredHostMode, - sessionMode = currentCfg.value.sessionMode, - smpProxyMode = currentCfg.value.smpProxyMode, - smpProxyFallback = currentCfg.value.smpProxyFallback, +// hostMode = currentCfg.value.hostMode, +// requiredHostMode = currentCfg.value.requiredHostMode, + sessionMode = sessionMode.value, + smpProxyMode = smpProxyMode.value, + smpProxyFallback = smpProxyFallback.value, tcpConnectTimeout = networkTCPConnectTimeout.value, tcpTimeout = networkTCPTimeout.value, tcpTimeoutPerKb = networkTCPTimeoutPerKb.value, @@ -75,10 +90,14 @@ fun AdvancedNetworkSettingsView(chatModel: ChatModel) { tcpKeepAlive = tcpKeepAlive, smpPingInterval = networkSMPPingInterval.value, smpPingCount = networkSMPPingCount.value - ) + ).withOnionHosts(onionHosts.value) } fun updateView(cfg: NetCfg) { + onionHosts.value = cfg.onionHosts + sessionMode.value = cfg.sessionMode + smpProxyMode.value = cfg.smpProxyMode + smpProxyFallback.value = cfg.smpProxyFallback networkTCPConnectTimeout.value = cfg.tcpConnectTimeout networkTCPTimeout.value = cfg.tcpTimeout networkTCPTimeoutPerKb.value = cfg.tcpTimeoutPerKb @@ -97,40 +116,80 @@ fun AdvancedNetworkSettingsView(chatModel: ChatModel) { } } - fun saveCfg(cfg: NetCfg) { + fun saveCfg(cfg: NetCfg, close: (() -> Unit)? = null) { withBGApi { - chatModel.controller.apiSetNetworkConfig(cfg) - currentCfg.value = cfg - chatModel.controller.setNetCfg(cfg) + if (chatModel.controller.apiSetNetworkConfig(cfg)) { + currentCfg.value = cfg + savedCfg.value = cfg + chatModel.controller.setNetCfg(cfg) + close?.invoke() + } } } fun reset() { val newCfg = if (currentCfg.value.useSocksProxy) NetCfg.proxyDefaults else NetCfg.defaults updateView(newCfg) - saveCfg(newCfg) + currentCfg.value = newCfg } - AdvancedNetworkSettingsLayout( - networkTCPConnectTimeout, - networkTCPTimeout, - networkTCPTimeoutPerKb, - networkRcvConcurrency, - networkSMPPingInterval, - networkSMPPingCount, - networkEnableKeepAlive, - networkTCPKeepIdle, - networkTCPKeepIntvl, - networkTCPKeepCnt, - resetDisabled = if (currentCfg.value.useSocksProxy) currentCfg.value == NetCfg.proxyDefaults else currentCfg.value == NetCfg.defaults, - reset = { showUpdateNetworkSettingsDialog(::reset) }, - footerDisabled = buildCfg() == currentCfg.value, - revert = { updateView(currentCfg.value) }, - save = { showUpdateNetworkSettingsDialog { saveCfg(buildCfg()) } } - ) + val saveDisabled = buildCfg() == savedCfg.value + + ModalView( + close = { + if (saveDisabled) { + close() + } else { + showUnsavedChangesAlert({ + saveCfg(buildCfg(), close) + }, close) + } + }, + ) { + AdvancedNetworkSettingsLayout( + currentRemoteHost = currentRemoteHost, + networkUseSocksProxy = networkUseSocksProxy, + developerTools = developerTools, + onionHosts = onionHosts, + useOnion = { onionHosts.value = it; currentCfg.value = currentCfg.value.withOnionHosts(it) }, + sessionMode = sessionMode, + smpProxyMode = smpProxyMode, + smpProxyFallback = smpProxyFallback, + networkTCPConnectTimeout, + networkTCPTimeout, + networkTCPTimeoutPerKb, + networkRcvConcurrency, + networkSMPPingInterval, + networkSMPPingCount, + networkEnableKeepAlive, + networkTCPKeepIdle, + networkTCPKeepIntvl, + networkTCPKeepCnt, + updateSessionMode = { sessionMode.value = it; currentCfg.value = currentCfg.value.copy(sessionMode = it) }, + updateSMPProxyMode = { smpProxyMode.value = it; currentCfg.value = currentCfg.value.copy(smpProxyMode = it) }, + updateSMPProxyFallback = { smpProxyFallback.value = it; currentCfg.value = currentCfg.value.copy(smpProxyFallback = it) }, + showModal = showModal, + resetDisabled = if (currentCfg.value.useSocksProxy) buildCfg() == NetCfg.proxyDefaults else buildCfg() == NetCfg.defaults, + reset = ::reset, + saveDisabled = saveDisabled, + save = { + showUpdateNetworkSettingsDialog { + saveCfg(buildCfg()) + } + } + ) + } } @Composable fun AdvancedNetworkSettingsLayout( + currentRemoteHost: RemoteHostInfo?, + networkUseSocksProxy: State, + developerTools: Boolean, + onionHosts: MutableState, + useOnion: (OnionHosts) -> Unit, + sessionMode: MutableState, + smpProxyMode: MutableState, + smpProxyFallback: MutableState, networkTCPConnectTimeout: MutableState, networkTCPTimeout: MutableState, networkTCPTimeoutPerKb: MutableState, @@ -141,10 +200,13 @@ fun AdvancedNetworkSettingsView(chatModel: ChatModel) { networkTCPKeepIdle: MutableState, networkTCPKeepIntvl: MutableState, networkTCPKeepCnt: MutableState, + updateSessionMode: (TransportSessionMode) -> Unit, + updateSMPProxyMode: (SMPProxyMode) -> Unit, + updateSMPProxyFallback: (SMPProxyFallback) -> Unit, + showModal: (ModalData.() -> Unit) -> Unit, resetDisabled: Boolean, reset: () -> Unit, - footerDisabled: Boolean, - revert: () -> Unit, + saveDisabled: Boolean, save: () -> Unit ) { val secondsLabel = stringResource(MR.strings.network_option_seconds_label) @@ -154,10 +216,39 @@ fun AdvancedNetworkSettingsView(chatModel: ChatModel) { .fillMaxWidth(), ) { AppBarTitle(stringResource(MR.strings.network_settings_title)) - SectionView { - SectionItemView { - ResetToDefaultsButton(reset, disabled = resetDisabled) + + if (currentRemoteHost == null) { + SectionView(generalGetString(MR.strings.settings_section_title_private_message_routing)) { + SMPProxyModePicker(smpProxyMode, showModal, updateSMPProxyMode) + SMPProxyFallbackPicker(smpProxyFallback, showModal, updateSMPProxyFallback, enabled = remember { derivedStateOf { smpProxyMode.value != SMPProxyMode.Never } }) + SettingsPreferenceItem(painterResource(MR.images.ic_arrow_forward), stringResource(MR.strings.private_routing_show_message_status), chatModel.controller.appPrefs.showSentViaProxy) } + SectionCustomFooter { + Text(stringResource(MR.strings.private_routing_explanation)) + } + SectionDividerSpaced(maxTopPadding = true) + } + + if (currentRemoteHost == null && networkUseSocksProxy.value) { + SectionView(stringResource(MR.strings.network_socks_proxy).uppercase()) { + UseOnionHosts(onionHosts, networkUseSocksProxy, showModal, useOnion) + SectionCustomFooter { + Column { + Text(annotatedStringResource(MR.strings.disable_onion_hosts_when_not_supported)) + } + } + } + SectionDividerSpaced(maxTopPadding = true) + } + + if (currentRemoteHost == null && developerTools) { + SectionView(stringResource(MR.strings.network_session_mode_transport_isolation).uppercase()) { + SessionModePicker(sessionMode, showModal, updateSessionMode) + } + SectionDividerSpaced() + } + + SectionView(stringResource(MR.strings.network_option_tcp_connection).uppercase()) { SectionItemView { TimeoutSettingRow( stringResource(MR.strings.network_option_tcp_connection_timeout), networkTCPConnectTimeout, @@ -220,23 +311,92 @@ fun AdvancedNetworkSettingsView(chatModel: ChatModel) { } } } - SectionCustomFooter { - SettingsSectionFooter(revert, save, footerDisabled) + + SectionDividerSpaced(maxBottomPadding = false) + + SectionView { + SectionItemView(reset, disabled = resetDisabled) { + Text(stringResource(MR.strings.network_options_reset_to_defaults), color = if (resetDisabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary) + } + SectionItemView(save, disabled = saveDisabled) { + Text(stringResource(MR.strings.network_options_save_and_reconnect), color = if (saveDisabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary) + } } SectionBottomSpacer() } } @Composable -fun ResetToDefaultsButton(reset: () -> Unit, disabled: Boolean) { - val modifier = if (disabled) Modifier else Modifier.clickable { reset() } - Row( - modifier.fillMaxSize(), - verticalAlignment = Alignment.CenterVertically - ) { - val color = if (disabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary - Text(stringResource(MR.strings.network_options_reset_to_defaults), color = color) +private fun SMPProxyModePicker( + smpProxyMode: MutableState, + showModal: (@Composable ModalData.() -> Unit) -> Unit, + updateSMPProxyMode: (SMPProxyMode) -> Unit, +) { + val density = LocalDensity.current + val values = remember { + SMPProxyMode.values().map { + when (it) { + SMPProxyMode.Always -> ValueTitleDesc(SMPProxyMode.Always, generalGetString(MR.strings.network_smp_proxy_mode_always), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_mode_always_description), density)) + SMPProxyMode.Unknown -> ValueTitleDesc(SMPProxyMode.Unknown, generalGetString(MR.strings.network_smp_proxy_mode_unknown), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_mode_unknown_description), density)) + SMPProxyMode.Unprotected -> ValueTitleDesc(SMPProxyMode.Unprotected, generalGetString(MR.strings.network_smp_proxy_mode_unprotected), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_mode_unprotected_description), density)) + SMPProxyMode.Never -> ValueTitleDesc(SMPProxyMode.Never, generalGetString(MR.strings.network_smp_proxy_mode_never), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_mode_never_description), density)) + } + } } + + SectionItemWithValue( + generalGetString(MR.strings.network_smp_proxy_mode_private_routing), + smpProxyMode, + values, + icon = painterResource(MR.images.ic_settings_ethernet), + onSelected = { + showModal { + ColumnWithScrollBar( + Modifier.fillMaxWidth(), + ) { + AppBarTitle(stringResource(MR.strings.network_smp_proxy_mode_private_routing)) + SectionViewSelectableCards(null, smpProxyMode, values, updateSMPProxyMode) + } + } + } + ) +} + +@Composable +private fun SMPProxyFallbackPicker( + smpProxyFallback: MutableState, + showModal: (@Composable ModalData.() -> Unit) -> Unit, + updateSMPProxyFallback: (SMPProxyFallback) -> Unit, + enabled: State, +) { + val density = LocalDensity.current + val values = remember { + SMPProxyFallback.values().map { + when (it) { + SMPProxyFallback.Allow -> ValueTitleDesc(SMPProxyFallback.Allow, generalGetString(MR.strings.network_smp_proxy_fallback_allow), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_fallback_allow_description), density)) + SMPProxyFallback.AllowProtected -> ValueTitleDesc(SMPProxyFallback.AllowProtected, generalGetString(MR.strings.network_smp_proxy_fallback_allow_protected), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_fallback_allow_protected_description), density)) + SMPProxyFallback.Prohibit -> ValueTitleDesc(SMPProxyFallback.Prohibit, generalGetString(MR.strings.network_smp_proxy_fallback_prohibit), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_fallback_prohibit_description), density)) + } + } + } + + SectionItemWithValue( + generalGetString(MR.strings.network_smp_proxy_fallback_allow_downgrade), + smpProxyFallback, + values, + icon = painterResource(MR.images.ic_arrows_left_right), + enabled = enabled, + onSelected = { + showModal { + ColumnWithScrollBar( + Modifier.fillMaxWidth(), + ) { + AppBarTitle(stringResource(MR.strings.network_smp_proxy_fallback_allow_downgrade)) + SectionViewSelectableCards(null, smpProxyFallback, values, updateSMPProxyFallback) + } + } + } + ) } @Composable @@ -377,43 +537,6 @@ fun TimeoutSettingRow(title: String, selection: MutableState, values: List } } -@Composable -fun SettingsSectionFooter(revert: () -> Unit, save: () -> Unit, disabled: Boolean) { - Row( - Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - FooterButton(painterResource(MR.images.ic_replay), stringResource(MR.strings.network_options_revert), revert, disabled) - FooterButton(painterResource(MR.images.ic_check), stringResource(MR.strings.network_options_save), save, disabled) - } -} - -@Composable -fun FooterButton(icon: Painter, title: String, action: () -> Unit, disabled: Boolean) { - Surface( - shape = RoundedCornerShape(20.dp), - color = Color.Black.copy(alpha = 0f), - contentColor = LocalContentColor.current - ) { - val modifier = if (disabled) Modifier else Modifier.clickable { action() } - Row( - modifier.padding(8.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp) - ) { - Icon( - icon, - title, - tint = if (disabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary - ) - Text( - title, - color = if (disabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary - ) - } - } -} - fun showUpdateNetworkSettingsDialog(action: () -> Unit) { AlertManager.shared.showAlertDialog( title = generalGetString(MR.strings.update_network_settings_question), @@ -423,11 +546,27 @@ fun showUpdateNetworkSettingsDialog(action: () -> Unit) { ) } +private fun showUnsavedChangesAlert(save: () -> Unit, revert: () -> Unit) { + AlertManager.shared.showAlertDialogStacked( + title = generalGetString(MR.strings.update_network_settings_question), + confirmText = generalGetString(MR.strings.network_options_save_and_reconnect), + dismissText = generalGetString(MR.strings.exit_without_saving), + onConfirm = save, + onDismiss = revert, + ) +} + @Preview @Composable fun PreviewAdvancedNetworkSettingsLayout() { SimpleXTheme { AdvancedNetworkSettingsLayout( + currentRemoteHost = null, + networkUseSocksProxy = remember { mutableStateOf(false) }, + developerTools = false, + sessionMode = remember { mutableStateOf(TransportSessionMode.User) }, + smpProxyMode = remember { mutableStateOf(SMPProxyMode.Never) }, + smpProxyFallback = remember { mutableStateOf(SMPProxyFallback.Allow) }, networkTCPConnectTimeout = remember { mutableStateOf(10_000000) }, networkTCPTimeout = remember { mutableStateOf(10_000000) }, networkTCPTimeoutPerKb = remember { mutableStateOf(10_000) }, @@ -438,10 +577,15 @@ fun PreviewAdvancedNetworkSettingsLayout() { networkTCPKeepIdle = remember { mutableStateOf(10) }, networkTCPKeepIntvl = remember { mutableStateOf(10) }, networkTCPKeepCnt = remember { mutableStateOf(10) }, + onionHosts = remember { mutableStateOf(OnionHosts.PREFER) }, + useOnion = {}, + updateSessionMode = {}, + updateSMPProxyMode = {}, + updateSMPProxyFallback = {}, + showModal = {}, resetDisabled = false, reset = {}, - footerDisabled = false, - revert = {}, + saveDisabled = false, save = {} ) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/CallSettings.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/CallSettings.kt index 94415b0ee0..468a192f09 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/CallSettings.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/CallSettings.kt @@ -36,10 +36,7 @@ fun CallSettingsLayout( callOnLockScreen: SharedPreference, editIceServers: () -> Unit, ) { - ColumnWithScrollBar( - Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { + ColumnWithScrollBar(Modifier.fillMaxWidth()) { AppBarTitle(stringResource(MR.strings.your_calls)) val lockCallState = remember { mutableStateOf(callOnLockScreen.get()) } SectionView(stringResource(MR.strings.settings_section_title_settings)) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/NetworkAndServers.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/NetworkAndServers.kt index 61c8e1b75f..62ba287879 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/NetworkAndServers.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/NetworkAndServers.kt @@ -7,9 +7,7 @@ import SectionItemView import SectionItemWithValue import SectionView import SectionViewSelectable -import SectionViewSelectableCards import TextIconSpaced -import androidx.compose.foundation.* import androidx.compose.foundation.layout.* import androidx.compose.foundation.text.KeyboardActions import androidx.compose.material.* @@ -20,20 +18,17 @@ import androidx.compose.ui.Modifier import dev.icerock.moko.resources.compose.painterResource import dev.icerock.moko.resources.compose.stringResource import androidx.compose.ui.text.* -import androidx.compose.ui.text.font.* import androidx.compose.ui.text.input.* import androidx.compose.desktop.ui.tooling.preview.Preview import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import chat.simplex.common.model.* +import chat.simplex.common.model.ChatController.appPrefs import chat.simplex.common.model.ChatModel.controller import chat.simplex.common.platform.* import chat.simplex.common.ui.theme.* -import chat.simplex.common.views.chat.item.ClickableText import chat.simplex.common.views.helpers.* -import chat.simplex.common.views.helpers.annotatedStringResource import chat.simplex.res.MR @Composable @@ -42,22 +37,11 @@ fun NetworkAndServersView() { // It's not a state, just a one-time value. Shouldn't be used in any state-related situations val netCfg = remember { chatModel.controller.getNetCfg() } val networkUseSocksProxy: MutableState = remember { mutableStateOf(netCfg.useSocksProxy) } - val developerTools = chatModel.controller.appPrefs.developerTools.get() - val onionHosts = remember { mutableStateOf(netCfg.onionHosts) } - val sessionMode = remember { mutableStateOf(netCfg.sessionMode) } - val smpProxyMode = remember { mutableStateOf(netCfg.smpProxyMode) } - val smpProxyFallback = remember { mutableStateOf(netCfg.smpProxyFallback) } val proxyPort = remember { derivedStateOf { chatModel.controller.appPrefs.networkProxyHostPort.state.value?.split(":")?.lastOrNull()?.toIntOrNull() ?: 9050 } } NetworkAndServersLayout( currentRemoteHost = currentRemoteHost, - developerTools = developerTools, networkUseSocksProxy = networkUseSocksProxy, - onionHosts = onionHosts, - sessionMode = sessionMode, - smpProxyMode = smpProxyMode, - smpProxyFallback = smpProxyFallback, - proxyPort = proxyPort, toggleSocksProxy = { enable -> val def = NetCfg.defaults val proxyDef = NetCfg.proxyDefaults @@ -84,7 +68,6 @@ fun NetworkAndServersView() { chatModel.controller.apiSetNetworkConfig(conf) chatModel.controller.setNetCfg(conf) networkUseSocksProxy.value = true - onionHosts.value = conf.onionHosts } } ) @@ -111,184 +94,48 @@ fun NetworkAndServersView() { chatModel.controller.apiSetNetworkConfig(conf) chatModel.controller.setNetCfg(conf) networkUseSocksProxy.value = false - onionHosts.value = conf.onionHosts } } ) } - }, - useOnion = { - if (onionHosts.value == it) return@NetworkAndServersLayout - val prevValue = onionHosts.value - onionHosts.value = it - val startsWith = when (it) { - OnionHosts.NEVER -> generalGetString(MR.strings.network_use_onion_hosts_no_desc_in_alert) - OnionHosts.PREFER -> generalGetString(MR.strings.network_use_onion_hosts_prefer_desc_in_alert) - OnionHosts.REQUIRED -> generalGetString(MR.strings.network_use_onion_hosts_required_desc_in_alert) - } - showUpdateNetworkSettingsDialog( - title = generalGetString(MR.strings.update_onion_hosts_settings_question), - startsWith, - onDismiss = { - onionHosts.value = prevValue - } - ) { - withBGApi { - val newCfg = chatModel.controller.getNetCfg().withOnionHosts(it) - val res = chatModel.controller.apiSetNetworkConfig(newCfg) - if (res) { - chatModel.controller.setNetCfg(newCfg) - onionHosts.value = it - } else { - onionHosts.value = prevValue - } - } - } - }, - updateSessionMode = { - if (sessionMode.value == it) return@NetworkAndServersLayout - val prevValue = sessionMode.value - sessionMode.value = it - val startsWith = when (it) { - TransportSessionMode.User -> generalGetString(MR.strings.network_session_mode_user_description) - TransportSessionMode.Entity -> generalGetString(MR.strings.network_session_mode_entity_description) - } - showUpdateNetworkSettingsDialog( - title = generalGetString(MR.strings.update_network_session_mode_question), - startsWith, - onDismiss = { sessionMode.value = prevValue } - ) { - withBGApi { - val newCfg = chatModel.controller.getNetCfg().copy(sessionMode = it) - val res = chatModel.controller.apiSetNetworkConfig(newCfg) - if (res) { - chatModel.controller.setNetCfg(newCfg) - sessionMode.value = it - } else { - sessionMode.value = prevValue - } - } - } - }, - updateSMPProxyMode = { - if (smpProxyMode.value == it) return@NetworkAndServersLayout - val prevValue = smpProxyMode.value - smpProxyMode.value = it - val startsWith = when (it) { - SMPProxyMode.Always -> generalGetString(MR.strings.network_smp_proxy_mode_always_description) - SMPProxyMode.Unknown -> generalGetString(MR.strings.network_smp_proxy_mode_unknown_description) - SMPProxyMode.Unprotected -> generalGetString(MR.strings.network_smp_proxy_mode_unprotected_description) - SMPProxyMode.Never -> generalGetString(MR.strings.network_smp_proxy_mode_never_description) - } - showUpdateNetworkSettingsDialog( - title = generalGetString(MR.strings.update_network_smp_proxy_mode_question), - startsWith, - onDismiss = { smpProxyMode.value = prevValue } - ) { - withBGApi { - val newCfg = chatModel.controller.getNetCfg().copy(smpProxyMode = it) - val res = chatModel.controller.apiSetNetworkConfig(newCfg) - if (res) { - chatModel.controller.setNetCfg(newCfg) - smpProxyMode.value = it - } else { - smpProxyMode.value = prevValue - } - } - } - }, - updateSMPProxyFallback = { - if (smpProxyFallback.value == it) return@NetworkAndServersLayout - val prevValue = smpProxyFallback.value - smpProxyFallback.value = it - val startsWith = when (it) { - SMPProxyFallback.Allow -> generalGetString(MR.strings.network_smp_proxy_fallback_allow_description) - SMPProxyFallback.AllowProtected -> generalGetString(MR.strings.network_smp_proxy_fallback_allow_protected_description) - SMPProxyFallback.Prohibit -> generalGetString(MR.strings.network_smp_proxy_fallback_prohibit_description) - } - showUpdateNetworkSettingsDialog( - title = generalGetString(MR.strings.update_network_smp_proxy_fallback_question), - startsWith, - onDismiss = { smpProxyFallback.value = prevValue } - ) { - withBGApi { - val newCfg = chatModel.controller.getNetCfg().copy(smpProxyFallback = it) - val res = chatModel.controller.apiSetNetworkConfig(newCfg) - if (res) { - chatModel.controller.setNetCfg(newCfg) - smpProxyFallback.value = it - } else { - smpProxyFallback.value = prevValue - } - } - } } ) } @Composable fun NetworkAndServersLayout( currentRemoteHost: RemoteHostInfo?, - developerTools: Boolean, networkUseSocksProxy: MutableState, - onionHosts: MutableState, - sessionMode: MutableState, - smpProxyMode: MutableState, - smpProxyFallback: MutableState, - proxyPort: State, toggleSocksProxy: (Boolean) -> Unit, - useOnion: (OnionHosts) -> Unit, - updateSessionMode: (TransportSessionMode) -> Unit, - updateSMPProxyMode: (SMPProxyMode) -> Unit, - updateSMPProxyFallback: (SMPProxyFallback) -> Unit, ) { val m = chatModel - ColumnWithScrollBar( - Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { + ColumnWithScrollBar(Modifier.fillMaxWidth()) { val showModal = { it: @Composable ModalData.() -> Unit -> ModalManager.start.showModal(content = it) } + val showCustomModal = { it: @Composable (close: () -> Unit) -> Unit -> ModalManager.start.showCustomModal { close -> it(close) }} AppBarTitle(stringResource(MR.strings.network_and_servers)) if (!chatModel.desktopNoUserNoRemote) { SectionView(generalGetString(MR.strings.settings_section_title_messages)) { - SettingsActionItem(painterResource(MR.images.ic_dns), stringResource(MR.strings.smp_servers), { ModalManager.start.showCustomModal { close -> ProtocolServersView(m, m.remoteHostId, ServerProtocol.SMP, close) } }) + SettingsActionItem(painterResource(MR.images.ic_dns), stringResource(MR.strings.message_servers), { ModalManager.start.showCustomModal { close -> ProtocolServersView(m, m.remoteHostId, ServerProtocol.SMP, close) } }) - SettingsActionItem(painterResource(MR.images.ic_dns), stringResource(MR.strings.xftp_servers), { ModalManager.start.showCustomModal { close -> ProtocolServersView(m, m.remoteHostId, ServerProtocol.XFTP, close) } }) + SettingsActionItem(painterResource(MR.images.ic_dns), stringResource(MR.strings.media_and_file_servers), { ModalManager.start.showCustomModal { close -> ProtocolServersView(m, m.remoteHostId, ServerProtocol.XFTP, close) } }) if (currentRemoteHost == null) { - UseSocksProxySwitch(networkUseSocksProxy, proxyPort, toggleSocksProxy, showModal, chatModel.controller.appPrefs.networkProxyHostPort, false) - UseOnionHosts(onionHosts, networkUseSocksProxy, showModal, useOnion) - if (developerTools) { - SessionModePicker(sessionMode, showModal, updateSessionMode) + UseSocksProxySwitch(networkUseSocksProxy, toggleSocksProxy) + SettingsActionItem(painterResource(MR.images.ic_settings_ethernet), stringResource(MR.strings.network_socks_proxy_settings), { showCustomModal { SocksProxySettings(networkUseSocksProxy.value, appPrefs.networkProxyHostPort, false, it) }}) + SettingsActionItem(painterResource(MR.images.ic_cable), stringResource(MR.strings.network_settings), { ModalManager.start.showCustomModal { AdvancedNetworkSettingsView(showModal, it) } }) + if (networkUseSocksProxy.value) { + SectionCustomFooter { + Column { + Text(annotatedStringResource(MR.strings.socks_proxy_setting_limitations)) + } + } + SectionDividerSpaced(maxTopPadding = true) + } else { + SectionDividerSpaced() } - SettingsActionItem(painterResource(MR.images.ic_cable), stringResource(MR.strings.network_settings), { ModalManager.start.showModal { AdvancedNetworkSettingsView(m) } }) } } } - if (currentRemoteHost == null && networkUseSocksProxy.value) { - SectionCustomFooter { - Column { - Text(annotatedStringResource(MR.strings.disable_onion_hosts_when_not_supported)) - Spacer(Modifier.height(DEFAULT_PADDING_HALF)) - Text(annotatedStringResource(MR.strings.socks_proxy_setting_limitations)) - } - } - Divider(Modifier.padding(start = DEFAULT_PADDING_HALF, top = 32.dp, end = DEFAULT_PADDING_HALF, bottom = 30.dp)) - } else if (!chatModel.desktopNoUserNoRemote) { - Divider(Modifier.padding(start = DEFAULT_PADDING_HALF, top = 24.dp, end = DEFAULT_PADDING_HALF, bottom = 30.dp)) - } - - if (currentRemoteHost == null) { - SectionView(generalGetString(MR.strings.settings_section_title_private_message_routing)) { - SMPProxyModePicker(smpProxyMode, showModal, updateSMPProxyMode) - SMPProxyFallbackPicker(smpProxyFallback, showModal, updateSMPProxyFallback, enabled = remember { mutableStateOf(smpProxyMode.value != SMPProxyMode.Never) }) - SettingsPreferenceItem(painterResource(MR.images.ic_arrow_forward), stringResource(MR.strings.private_routing_show_message_status), chatModel.controller.appPrefs.showSentViaProxy) - } - SectionCustomFooter { - Text(stringResource(MR.strings.private_routing_explanation)) - } - Divider(Modifier.padding(start = DEFAULT_PADDING_HALF, top = 32.dp, end = DEFAULT_PADDING_HALF, bottom = 30.dp)) - } SectionView(generalGetString(MR.strings.settings_section_title_calls)) { SettingsActionItem(painterResource(MR.images.ic_electrical_services), stringResource(MR.strings.webrtc_ice_servers), { ModalManager.start.showModal { RTCServersView(m) } }) @@ -313,13 +160,14 @@ fun NetworkAndServersView() { onionHosts: MutableState, sessionMode: MutableState, networkProxyHostPort: SharedPreference, - proxyPort: State, toggleSocksProxy: (Boolean) -> Unit, useOnion: (OnionHosts) -> Unit, updateSessionMode: (TransportSessionMode) -> Unit, ) { val showModal = { it: @Composable ModalData.() -> Unit -> ModalManager.fullscreen.showModal(content = it) } - UseSocksProxySwitch(networkUseSocksProxy, proxyPort, toggleSocksProxy, showModal, networkProxyHostPort, true) + val showCustomModal = { it: @Composable (close: () -> Unit) -> Unit -> ModalManager.fullscreen.showCustomModal { close -> it(close) }} + UseSocksProxySwitch(networkUseSocksProxy, toggleSocksProxy) + SettingsActionItem(painterResource(MR.images.ic_settings_ethernet), stringResource(MR.strings.network_socks_proxy_settings), { showCustomModal { SocksProxySettings(networkUseSocksProxy.value, networkProxyHostPort, true, it) } }) UseOnionHosts(onionHosts, networkUseSocksProxy, showModal, useOnion) if (developerTools) { SessionModePicker(sessionMode, showModal, updateSessionMode) @@ -329,11 +177,7 @@ fun NetworkAndServersView() { @Composable fun UseSocksProxySwitch( networkUseSocksProxy: MutableState, - proxyPort: State, toggleSocksProxy: (Boolean) -> Unit, - showModal: (@Composable ModalData.() -> Unit) -> Unit, - networkProxyHostPort: SharedPreference = chatModel.controller.appPrefs.networkProxyHostPort, - migration: Boolean = false, ) { Row( Modifier.fillMaxWidth().padding(end = DEFAULT_PADDING), @@ -350,32 +194,7 @@ fun UseSocksProxySwitch( tint = MaterialTheme.colors.secondary ) TextIconSpaced(false) - val text = buildAnnotatedString { - append(generalGetString(MR.strings.network_socks_toggle_use_socks_proxy) + " (") - val style = SpanStyle(color = MaterialTheme.colors.primary) - val disabledStyle = SpanStyle(color = MaterialTheme.colors.onBackground) - withAnnotation(tag = "PORT", annotation = generalGetString(MR.strings.network_proxy_port).format(proxyPort.value)) { - withStyle(if (networkUseSocksProxy.value || !migration) style else disabledStyle) { - append(generalGetString(MR.strings.network_proxy_port).format(proxyPort.value)) - } - } - append(")") - } - ClickableText( - text, - style = TextStyle(color = MaterialTheme.colors.onBackground, fontSize = 16.sp, fontFamily = Inter, fontWeight = FontWeight.Normal), - onClick = { offset -> - text.getStringAnnotations(tag = "PORT", start = offset, end = offset) - .firstOrNull()?.let { _ -> - if (networkUseSocksProxy.value || !migration) { - showModal { SockProxySettings(chatModel, networkProxyHostPort, migration) } - } - } - }, - shouldConsumeEvent = { offset -> - text.getStringAnnotations(tag = "PORT", start = offset, end = offset).any() - } - ) + Text(generalGetString(MR.strings.network_socks_toggle_use_socks_proxy)) } DefaultSwitch( checked = networkUseSocksProxy.value, @@ -385,94 +204,124 @@ fun UseSocksProxySwitch( } @Composable -fun SockProxySettings( - m: ChatModel, - networkProxyHostPort: SharedPreference = m.controller.appPrefs.networkProxyHostPort, +fun SocksProxySettings( + networkUseSocksProxy: Boolean, + networkProxyHostPort: SharedPreference = appPrefs.networkProxyHostPort, migration: Boolean, + close: () -> Unit ) { - ColumnWithScrollBar( - Modifier - .fillMaxWidth() - ) { - val defaultHostPort = remember { "localhost:9050" } - AppBarTitle(generalGetString(MR.strings.network_socks_proxy_settings)) - val hostPortSaved by remember { networkProxyHostPort.state } - val hostUnsaved = rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue(hostPortSaved?.split(":")?.firstOrNull() ?: "localhost")) - } - val portUnsaved = rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue(hostPortSaved?.split(":")?.lastOrNull() ?: "9050")) - } - val save = { + val defaultHostPort = remember { "localhost:9050" } + val hostPortSaved by remember { networkProxyHostPort.state } + val hostUnsaved = rememberSaveable(stateSaver = TextFieldValue.Saver) { + mutableStateOf(TextFieldValue(hostPortSaved?.split(":")?.firstOrNull() ?: "localhost")) + } + val portUnsaved = rememberSaveable(stateSaver = TextFieldValue.Saver) { + mutableStateOf(TextFieldValue(hostPortSaved?.split(":")?.lastOrNull() ?: "9050")) + } + val save = { + val oldValue = networkProxyHostPort.get() + networkProxyHostPort.set(hostUnsaved.value.text + ":" + portUnsaved.value.text) + if (networkUseSocksProxy && !migration) { withBGApi { - networkProxyHostPort.set(hostUnsaved.value.text + ":" + portUnsaved.value.text) - if (m.controller.appPrefs.networkUseSocksProxy.get() && !migration) { - m.controller.apiSetNetworkConfig(m.controller.getNetCfg()) + if (!controller.apiSetNetworkConfig(controller.getNetCfg())) { + networkProxyHostPort.set(oldValue) } } } - SectionView { - SectionItemView { - ResetToDefaultsButton({ - val reset = { - networkProxyHostPort.set(defaultHostPort) - val newHost = defaultHostPort.split(":").first() - val newPort = defaultHostPort.split(":").last() - hostUnsaved.value = hostUnsaved.value.copy(newHost, TextRange(newHost.length)) - portUnsaved.value = portUnsaved.value.copy(newPort, TextRange(newPort.length)) - save() - } - if (m.controller.appPrefs.networkUseSocksProxy.get() && !migration) { - showUpdateNetworkSettingsDialog { - reset() - } - } else { - reset() - } - }, disabled = hostPortSaved == defaultHostPort) - } - SectionItemView { - DefaultConfigurableTextField( - hostUnsaved, - stringResource(MR.strings.host_verb), - modifier = Modifier.fillMaxWidth(), - isValid = ::validHost, - keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }), - keyboardType = KeyboardType.Text, - ) - } - SectionItemView { - DefaultConfigurableTextField( - portUnsaved, - stringResource(MR.strings.port_verb), - modifier = Modifier.fillMaxWidth(), - isValid = ::validPort, - keyboardActions = KeyboardActions(onDone = { defaultKeyboardAction(ImeAction.Done); save() }), - keyboardType = KeyboardType.Number, - ) + } + val saveAndClose = { + val oldValue = networkProxyHostPort.get() + networkProxyHostPort.set(hostUnsaved.value.text + ":" + portUnsaved.value.text) + if (networkUseSocksProxy && !migration) { + withBGApi { + if (controller.apiSetNetworkConfig(controller.getNetCfg())) { + close() + } else { + networkProxyHostPort.set(oldValue) + } } } - SectionCustomFooter { - NetworkSectionFooter( - revert = { - val prevHost = hostPortSaved?.split(":")?.firstOrNull() ?: "localhost" - val prevPort = hostPortSaved?.split(":")?.lastOrNull() ?: "9050" - hostUnsaved.value = hostUnsaved.value.copy(prevHost, TextRange(prevHost.length)) - portUnsaved.value = portUnsaved.value.copy(prevPort, TextRange(prevPort.length)) - }, - save = { if (m.controller.appPrefs.networkUseSocksProxy.get() && !migration) showUpdateNetworkSettingsDialog { save() } else save() }, - revertDisabled = hostPortSaved == (hostUnsaved.value.text + ":" + portUnsaved.value.text), - saveDisabled = hostPortSaved == (hostUnsaved.value.text + ":" + portUnsaved.value.text) || - remember { derivedStateOf { !validHost(hostUnsaved.value.text) } }.value || - remember { derivedStateOf { !validPort(portUnsaved.value.text) } }.value - ) + } + val saveDisabled = hostPortSaved == (hostUnsaved.value.text + ":" + portUnsaved.value.text) || + remember { derivedStateOf { !validHost(hostUnsaved.value.text) } }.value || + remember { derivedStateOf { !validPort(portUnsaved.value.text) } }.value + val resetDisabled = hostUnsaved.value.text + ":" + portUnsaved.value.text == defaultHostPort + ModalView( + close = { + if (saveDisabled) { + close() + } else { + showUnsavedSocksHostPortAlert( + confirmText = generalGetString(if (networkUseSocksProxy && !migration) MR.strings.network_options_save_and_reconnect else MR.strings.network_options_save), + save = saveAndClose, + close = close + ) + } + }, + ) { + ColumnWithScrollBar( + Modifier + .fillMaxWidth() + ) { + AppBarTitle(generalGetString(MR.strings.network_socks_proxy_settings)) + SectionView { + SectionItemView { + DefaultConfigurableTextField( + hostUnsaved, + stringResource(MR.strings.host_verb), + modifier = Modifier.fillMaxWidth(), + isValid = ::validHost, + keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }), + keyboardType = KeyboardType.Text, + ) + } + SectionItemView { + DefaultConfigurableTextField( + portUnsaved, + stringResource(MR.strings.port_verb), + modifier = Modifier.fillMaxWidth(), + isValid = ::validPort, + keyboardActions = KeyboardActions(onDone = { defaultKeyboardAction(ImeAction.Done); save() }), + keyboardType = KeyboardType.Number, + ) + } + } + + Divider(Modifier.padding(start = DEFAULT_PADDING_HALF, top = 27.dp, end = DEFAULT_PADDING_HALF, bottom = 30.dp)) + + SectionView { + SectionItemView({ + val newHost = defaultHostPort.split(":").first() + val newPort = defaultHostPort.split(":").last() + hostUnsaved.value = hostUnsaved.value.copy(newHost, TextRange(newHost.length)) + portUnsaved.value = portUnsaved.value.copy(newPort, TextRange(newPort.length)) + }, disabled = resetDisabled) { + Text(stringResource(MR.strings.network_options_reset_to_defaults), color = if (resetDisabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary) + } + SectionItemView( + click = { if (networkUseSocksProxy && !migration) showUpdateNetworkSettingsDialog { save() } else save() }, + disabled = saveDisabled + ) { + Text(stringResource(if (networkUseSocksProxy && !migration) MR.strings.network_options_save_and_reconnect else MR.strings.network_options_save), color = if (saveDisabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary) + } + } + SectionBottomSpacer() } - SectionBottomSpacer() } } +private fun showUnsavedSocksHostPortAlert(confirmText: String, save: () -> Unit, close: () -> Unit) { + AlertManager.shared.showAlertDialogStacked( + title = generalGetString(MR.strings.update_network_settings_question), + confirmText = confirmText, + dismissText = generalGetString(MR.strings.exit_without_saving), + onConfirm = save, + onDismiss = close, + ) +} + @Composable -private fun UseOnionHosts( +fun UseOnionHosts( onionHosts: MutableState, enabled: State, showModal: (@Composable ModalData.() -> Unit) -> Unit, @@ -521,7 +370,7 @@ private fun UseOnionHosts( } @Composable -private fun SessionModePicker( +fun SessionModePicker( sessionMode: MutableState, showModal: (@Composable ModalData.() -> Unit) -> Unit, updateSessionMode: (TransportSessionMode) -> Unit, @@ -554,91 +403,6 @@ private fun SessionModePicker( ) } -@Composable -private fun SMPProxyModePicker( - smpProxyMode: MutableState, - showModal: (@Composable ModalData.() -> Unit) -> Unit, - updateSMPProxyMode: (SMPProxyMode) -> Unit, -) { - val density = LocalDensity.current - val values = remember { - SMPProxyMode.values().map { - when (it) { - SMPProxyMode.Always -> ValueTitleDesc(SMPProxyMode.Always, generalGetString(MR.strings.network_smp_proxy_mode_always), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_mode_always_description), density)) - SMPProxyMode.Unknown -> ValueTitleDesc(SMPProxyMode.Unknown, generalGetString(MR.strings.network_smp_proxy_mode_unknown), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_mode_unknown_description), density)) - SMPProxyMode.Unprotected -> ValueTitleDesc(SMPProxyMode.Unprotected, generalGetString(MR.strings.network_smp_proxy_mode_unprotected), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_mode_unprotected_description), density)) - SMPProxyMode.Never -> ValueTitleDesc(SMPProxyMode.Never, generalGetString(MR.strings.network_smp_proxy_mode_never), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_mode_never_description), density)) - } - } - } - - SectionItemWithValue( - generalGetString(MR.strings.network_smp_proxy_mode_private_routing), - smpProxyMode, - values, - icon = painterResource(MR.images.ic_settings_ethernet), - onSelected = { - showModal { - ColumnWithScrollBar( - Modifier.fillMaxWidth(), - ) { - AppBarTitle(stringResource(MR.strings.network_smp_proxy_mode_private_routing)) - SectionViewSelectableCards(null, smpProxyMode, values, updateSMPProxyMode) - } - } - } - ) -} - -@Composable -private fun SMPProxyFallbackPicker( - smpProxyFallback: MutableState, - showModal: (@Composable ModalData.() -> Unit) -> Unit, - updateSMPProxyFallback: (SMPProxyFallback) -> Unit, - enabled: State, -) { - val density = LocalDensity.current - val values = remember { - SMPProxyFallback.values().map { - when (it) { - SMPProxyFallback.Allow -> ValueTitleDesc(SMPProxyFallback.Allow, generalGetString(MR.strings.network_smp_proxy_fallback_allow), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_fallback_allow_description), density)) - SMPProxyFallback.AllowProtected -> ValueTitleDesc(SMPProxyFallback.AllowProtected, generalGetString(MR.strings.network_smp_proxy_fallback_allow_protected), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_fallback_allow_protected_description), density)) - SMPProxyFallback.Prohibit -> ValueTitleDesc(SMPProxyFallback.Prohibit, generalGetString(MR.strings.network_smp_proxy_fallback_prohibit), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_smp_proxy_fallback_prohibit_description), density)) - } - } - } - - SectionItemWithValue( - generalGetString(MR.strings.network_smp_proxy_fallback_allow_downgrade), - smpProxyFallback, - values, - icon = painterResource(MR.images.ic_arrows_left_right), - enabled = enabled, - onSelected = { - showModal { - ColumnWithScrollBar( - Modifier.fillMaxWidth(), - ) { - AppBarTitle(stringResource(MR.strings.network_smp_proxy_fallback_allow_downgrade)) - SectionViewSelectableCards(null, smpProxyFallback, values, updateSMPProxyFallback) - } - } - } - ) -} - -@Composable -private fun NetworkSectionFooter(revert: () -> Unit, save: () -> Unit, revertDisabled: Boolean, saveDisabled: Boolean) { - Row( - Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - FooterButton(painterResource(MR.images.ic_replay), stringResource(MR.strings.network_options_revert), revert, revertDisabled) - FooterButton(painterResource(MR.images.ic_check), stringResource(MR.strings.network_options_save), save, saveDisabled) - } -} - // https://stackoverflow.com/a/106223 private fun validHost(s: String): Boolean { val validIp = Regex("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$") @@ -652,7 +416,7 @@ fun validPort(s: String): Boolean { return s.isNotBlank() && s.matches(validPort) } -private fun showUpdateNetworkSettingsDialog( +fun showUpdateNetworkSettingsDialog( title: String, startsWith: String = "", message: String = generalGetString(MR.strings.updating_settings_will_reconnect_client_to_all_servers), @@ -675,18 +439,8 @@ fun PreviewNetworkAndServersLayout() { SimpleXTheme { NetworkAndServersLayout( currentRemoteHost = null, - developerTools = true, networkUseSocksProxy = remember { mutableStateOf(true) }, - proxyPort = remember { mutableStateOf(9050) }, toggleSocksProxy = {}, - onionHosts = remember { mutableStateOf(OnionHosts.PREFER) }, - sessionMode = remember { mutableStateOf(TransportSessionMode.User) }, - smpProxyMode = remember { mutableStateOf(SMPProxyMode.Never) }, - smpProxyFallback = remember { mutableStateOf(SMPProxyFallback.Allow) }, - useOnion = {}, - updateSessionMode = {}, - updateSMPProxyMode = {}, - updateSMPProxyFallback = {}, ) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt index 3dfe8c3590..b0aa365a21 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SettingsView.kt @@ -112,7 +112,7 @@ fun SettingsLayout( Modifier .fillMaxSize() .themedBackground(theme.value.base) - .padding(top = if (appPlatform.isAndroid) DEFAULT_PADDING else DEFAULT_PADDING * 3) + .padding(top = if (appPlatform.isAndroid) DEFAULT_PADDING else DEFAULT_PADDING * 2.8f) ) { AppBarTitle(stringResource(MR.strings.your_settings)) diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml index cd50902ef7..8f1635369a 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml @@ -334,7 +334,7 @@ خطأ في تغيير الدور %1$d فشل فك تعمية الرسائل. سمة داكنة - حُذِفت + حُذفت عبارة مرور قاعدة البيانات وتصديرها حذف جميع الملفات حذف بعد @@ -353,8 +353,8 @@ حذف المجموعة حذف المجموعة؟ حذف الرابط - حُذِفت في: %s - المجموعة حُذِفت + حُذفت في: %s + المجموعة حُذفت حذف الصورة تخصيص السمات حذف قاعدة البيانات @@ -398,7 +398,7 @@ عبارة المرور الحالية… سيتم تحديث عبارة مرور تعمية قاعدة البيانات وتخزينها في Keystore. معرّف قاعدة البيانات - حُذِفت في + حُذفت في %d يوم %d أيام مخصص @@ -773,7 +773,6 @@ أرشيف قاعدة البيانات القديمة غير مفعّل رابط دعوة لمرة واحدة - سوف تكون مضيفات البصل مطلوبة للاتصال. المراقب لا يوجد نص دور عضو جديد @@ -789,8 +788,6 @@ لا سوف تكون مضيفات البصل مطلوبة للاتصال. \nيُرجى ملاحظة: أنك لن تتمكن من الاتصال بالخوادم بدون عنوان onion. - سيتم استخدام مضيفات البصل عند توفرها. - لن يتم استخدام مضيفات البصل. اسم عرض جديد: عبارة مرور جديدة… قيد الانتظار @@ -892,7 +889,6 @@ حٌديثت السجل في حٌديثت السجل في: %s استعادة - إرجاع يرى المستلمون التحديثات أثناء كتابتها. استلمت، ممنوع حفظ @@ -1165,7 +1161,6 @@ ملفات تعريف الدردشة الخاصة بك عنوان SimpleX الخاص بك خوادم SMP الخاصة بك - هل تريد تحديث إعداد مضيفي onion.؟ عندما يكون التطبيق قيد التشغيل عبر المُرحل لقد انضممت إلى هذه المجموعة @@ -1403,7 +1398,7 @@ سيتم إخفاء كافة الرسائل الجديدة من %s! محظور حظر أعضاء المجموعة - جهة الاتصال حُذِفت + جهة الاتصال حُذفت أنشِئ مجموعة باستخدام ملف تعريف عشوائي. أنشِئ مجموعة أنشِئ ملف تعريف @@ -1930,7 +1925,7 @@ الاتصالات أُنشئت أخطاء فك التعمية - حُذِفت + حُذفت الملفات التي نُزّلت أخطاء التنزيل منتهية الصلاحيّة @@ -1998,4 +1993,36 @@ تمويه الوسائط متوسط ناعم + المكالمة + اتصل + الرسالة + افتح + بحث + الإعدادات + فيديو + تأكيد حذف جهة الاتصال؟ + حُذفت جهة الاتصال! + سيتم حذف جهة الاتصال - لا يمكن التراجع عن هذا! + حُذفت المحادثة! + احذف دون إشعار + أبقِ المحادثة + احذف المحادثة فقط + لا يزال بإمكانك إرسال الرسائل إلى %1$s من الدردشات المحذوفة. + ألصق الرابط + جهات اتصالك + واجهة مستخدم بيد واحدة + حُذفت جهة الاتصال. + السماح بالمكالمات؟ + أرسل رسالة لتفعيل المكالمات. + المكالمات ممنوعة! + لا يمكن مكالمة أحد أعضاء المجموعة + لا يمكن إرسال رسالة إلى عضو المجموعة + جارِ الاتصال بجهة الاتصال، يُرجى الانتظار أو التحقق لاحقًا! + حُذفت الدردشات + ادعُ + لا توجد جهات اتصال مُصفاة + لا يمكن مكالمة جهة الاتصال + لا يزال بإمكانك عرض المحادثة مع %1$s في قائمة الدردشات. + يجب عليك السماح لجهات اتصالك بالاتصال حتى تتمكن من الاتصال بها. + يُرجى الطلب من جهة اتصالك تفعيل المكالمات. \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 9812e7b10a..bdd54811ac 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -311,14 +311,19 @@ Hide Allow Moderate + Select Expand Delete message? Delete %d messages? Message will be deleted - this cannot be undone! Message will be marked for deletion. The recipient(s) will be able to reveal this message. + Messages will be marked for deletion. The recipient(s) will be able to reveal these messages. Delete member message? + Delete %d messages of members? The message will be deleted for all members. + The messages will be deleted for all members. The message will be marked as moderated for all members. + The messages will be marked as moderated for all members. Delete for me For everyone Stop file @@ -368,6 +373,8 @@ No selected chat + Nothing selected + Selected %d Share message… @@ -398,6 +405,7 @@ SimpleX links not allowed Files and media not allowed Voice messages not allowed + Message Image @@ -459,7 +467,7 @@ Delete without notification Delete contact Conversation deleted! - You can still send messages to %1$s from the Deleted chats. + You can send messages to %1$s from Archived contacts. Contact deleted! You can still view conversation with %1$s in the list of chats. Set contact name… @@ -668,7 +676,7 @@ Invalid QR code The code you scanned is not a SimpleX link QR code. - Deleted chats + Archived contacts No filtered contacts Your contacts @@ -699,6 +707,7 @@ Send us email SimpleX Lock Chat console + Message servers SMP servers Configured SMP servers Other SMP servers @@ -723,6 +732,8 @@ Delete server The servers for new connections of your current chat profile Save servers? + Update network settings? + Media & file servers XFTP servers Configured XFTP servers Other XFTP servers @@ -746,7 +757,8 @@ Save Network & servers Advanced network settings - Network settings + Advanced settings + SOCKS proxy SOCKS proxy settings Use SOCKS proxy port %d @@ -756,7 +768,6 @@ Access the servers via SOCKS proxy on port %d? Proxy must be started before enabling this option. Use direct Internet connection? If you confirm, the messaging servers will be able to see your IP address, and your provider - which servers you are connecting to. - Update .onion hosts setting? Use .onion hosts When available No @@ -764,9 +775,6 @@ Onion hosts will be used when available. Onion hosts will not be used. Onion hosts will be required for connection.\nPlease note: you will not be able to connect to the servers without .onion address. - Onion hosts will be used when available. - Onion hosts will not be used. - Onion hosts will be required for connection. Transport isolation Chat profile Connection @@ -777,7 +785,7 @@ Please note: message and file relays are connected via SOCKS proxy. Calls and sending link previews use direct connection.]]> Private routing Always - Unknown relays + Unknown servers Unprotected Never Always use private routing. @@ -1188,7 +1196,7 @@ Error importing chat database Chat database imported Restart the app to use imported chat database. - Some non-fatal errors occurred during import - you may see Chat console for more details. + Some non-fatal errors occurred during import: Delete chat profile? This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost. Chat database deleted @@ -1214,6 +1222,11 @@ This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes. Delete messages Error changing setting + Chat database exported + You may save the exported archive. + You may migrate the exported database. + Some file(s) were not exported + Continue Save passphrase in Keystore @@ -1280,7 +1293,7 @@ Database downgrade Incompatible database version Confirm database upgrades - One-hand UI + Reachable chat toolbar Show console in new window Show chat list in new window Invalid migration confirmation @@ -1599,6 +1612,7 @@ Error saving group profile + TCP connection Reset to defaults sec TCP connection timeout @@ -1608,8 +1622,8 @@ PING interval PING count Enable TCP keep-alive - Revert Save + Save and reconnect Update network settings? Updating settings will re-connect the client to all servers. Update @@ -1960,6 +1974,17 @@ Improved message delivery With reduced battery usage. Persian UI + It protects your IP address and connections. + Your contacts your way + - Search contacts when starting chat.\n- Archive contacts to chat later. + Reachable chat toolbar 👋 + Use the app with one hand. + Connect to your friends faster + Even when they are offline. + Moderate like a pro ✋ + Delete up to 20 messages at once. + Control your network + Connection and servers status. seconds diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml index 81f537133c..d43aee7c8a 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml @@ -800,13 +800,11 @@ Мрежови настройки Порт порт %d - Няма се използват Onion хостове. Задължително Не За свързване ще са необходими Onion хостове. \nМоля, обърнете внимание: няма да можете да се свържете със сървърите без .onion адрес. Ще се използват Onion хостове, когато са налични. - Ще се използват Onion хостове, когато са налични. Няма се използват Onion хостове. Нека да поговорим в SimpleX Chat Парола за показване @@ -878,7 +876,6 @@ Няма избран чат Известия Известията ще спрат да работят, докато не стартирате отново приложението - За свързване ще са необходими Onion хостове. Само 10 изображения могат да бъдат изпратени едновременно Само собствениците на групата могат да активират файлове и медията. Само собствениците на групата могат да активират гласови съобщения. @@ -1147,7 +1144,6 @@ Високоговорителят е изключен Спрете чата, за да активирате действията с базата данни. Роля - Отмени промените Запази Нулирай цветовете Вторичен @@ -1225,7 +1221,6 @@ Вашите SMP сървъри Използвай SOCKS прокси Използвай SOCKS прокси\? - Актуализиране на настройката за .onion хостове\? Използване на директна интернет връзка\? Използвай .onion хостове Когато са налични diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml index 5a73805093..e64ea5cc8e 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml @@ -228,7 +228,6 @@ Použít proxy server SOCKS\? Použít přímé připojení k internetu\? Ne - Onion hostitelé nebudou použiti. Chat profil Připojení simplexmq: v%s (%2s) @@ -357,7 +356,6 @@ Nebyl vybrán žádný kontakt Snažíte se pozvat kontakt, se kterým jste sdíleli inkognito profil, do skupiny, ve které používáte svůj hlavní profil Skupina - Vrátit Aktualizací nastavení se klient znovu připojí ke všem serverům. Nastavit 1 den Chyba spojení (AUTH) @@ -629,14 +627,11 @@ Ujistěte se, že adresy serverů WebRTC ICE jsou ve správném formátu, oddělené na řádcích a nejsou duplicitní. Uložit Síť a servery - Aktualizovat nastavení hostitelů .onion\? Použít hostitele .onion Když bude dostupný Povinné Onion hostitelé budou použiti, pokud jsou k dispozici. Onion hostitelé nebudou použiti. - Onion hostitelé budou použiti, pokud jsou k dispozici. - Pro připojení budou vyžadováni Onion hostitelé. Izolace přenosu for each chat profile you have in the app.]]> Oddělit TCP připojení (a SOCKS pověření) bude použito pro všechny kontakty a členy skupin. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml index b4fcc3867a..b85276badd 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml @@ -396,7 +396,6 @@ Zugriff auf die Server über SOCKS-Proxy auf Port %d? Der Proxy muss gestartet werden, bevor diese Option aktiviert wird. Direkte Internetverbindung verwenden? Wenn Sie dies bestätigen, können die Messaging-Server Ihre IP-Adresse sowie Ihren Provider sehen und mit welchen Servern Sie sich verbinden. - Einstellung für .onion-Hosts aktualisieren? Verwende .onion-Hosts Wenn verfügbar Nein @@ -405,9 +404,6 @@ Onion-Hosts werden nicht verwendet. Für die Verbindung werden Onion-Hosts benötigt. \nBitte beachten Sie: Ohne .onion-Adresse können Sie keine Verbindung mit den Servern herstellen. - Wenn Onion-Hosts verfügbar sind, werden sie verwendet. - Onion-Hosts werden nicht verwendet. - Für die Verbindung werden Onion-Hosts benötigt. Erscheinungsbild Adresse erstellen @@ -826,7 +822,6 @@ Protokollzeitüberschreitung PING-Intervall TCP-Keep-Alive aktivieren - Zurücksetzen Speichern Netzwerkeinstellungen aktualisieren? Die Aktualisierung der Einstellungen wird den Client wieder mit allen Servern verbinden. @@ -1732,7 +1727,7 @@ Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Relais hochgeladen. Archivieren und Hochladen Warnung: Das Archiv wird gelöscht.]]> - Überprüfen Sie Ihre Internet-Verbindung und probieren Sie es nochmals + Überprüfen Sie Ihre Internetverbindung und probieren Sie es nochmals Datenbank wird archiviert Bitte beachten Sie: Aus Sicherheitsgründen wird die Nachrichtenentschlüsselung Ihrer Verbindungen abgebrochen, wenn Sie die gleiche Datenbank auf zwei Geräten nutzen.]]> Migration abbrechen @@ -1850,15 +1845,15 @@ Profil-Bilder Form der Profil-Bilder Quadratisch, kreisförmig oder irgendetwas dazwischen. - Fehler auf dem Zielserver: %1$s + Fehler auf dem Ziel-Server: %1$s Fehler: %1$s Warnung bei der Nachrichtenzustellung Falscher Schlüssel oder unbekannte Verbindung - höchstwahrscheinlich ist diese Verbindung gelöscht. Die Server-Version ist nicht mit den Netzwerkeinstellungen kompatibel. Kapazität überschritten - der Empfänger hat die zuvor gesendeten Nachrichten nicht empfangen. - Weiterleitungsserver: %1$s -\nFehler auf dem Zielserver: %2$s - Weiterleitungsserver: %1$s + Weiterleitungs-Server: %1$s +\nFehler auf dem Ziel-Server: %2$s + Weiterleitungs-Server: %1$s \nFehler: %2$s Netzwerk-Fehler - die Nachricht ist nach vielen Sende-Versuchen abgelaufen. Die Server-Adresse ist nicht mit den Netzwerkeinstellungen kompatibel. @@ -1877,10 +1872,10 @@ Nachrichtenstatus anzeigen Herabstufung erlauben Sie nutzen immer privates Routing. - Nachrichten werden nicht direkt versendet, selbst wenn Ihr oder der Zielserver kein privates Routing unterstützt. + Nachrichten werden nicht direkt versendet, selbst wenn Ihr oder der Ziel-Server kein privates Routing unterstützt. PRIVATES NACHRICHTEN-ROUTING - Nachrichten werden direkt versendet, wenn die IP-Adresse geschützt ist, und Ihr oder der Zielserver kein privates Routing unterstützt. - Nachrichten werden direkt versendet, wenn Ihr oder der Zielserver kein privates Routing unterstützt. + Nachrichten werden direkt versendet, wenn die IP-Adresse geschützt ist, und Ihr oder der Ziel-Server kein privates Routing unterstützt. + Nachrichten werden direkt versendet, wenn Ihr oder der Ziel-Server kein privates Routing unterstützt. Zum Schutz Ihrer IP-Adresse, wird für die Nachrichten-Auslieferung privates Routing über Ihre konfigurierten SMP-Server genutzt. Sie nutzen privates Routing mit unbekannten Servern, wenn Ihre IP-Adresse nicht geschützt ist. IP-Adresse schützen @@ -2057,7 +2052,7 @@ Hochgeladen Sie sind nicht mit diesen Servern verbunden. Zur Auslieferung von Nachrichten an diese Server wird privates Routing genutzt. Summe aller Abonnements - Die Serverstatistiken werden zurückgesetzt. Dies kann nicht rückgängig gemacht werden! + Die Server-Statistiken werden zurückgesetzt. Dies kann nicht rückgängig gemacht werden! Größe Beginnend mit %s. Abonniert @@ -2071,15 +2066,55 @@ Aktualisierung verfügbar: %s Aktivieren Sie die periodische Überprüfung auf stabile oder Beta-Versionen der App, um über neue Versionen benachrichtigt zu werden. Herunterladen der Aktualisierung abgebrochen - Die Weiterleitungsserver-Adresse ist nicht kompatibel mit den Netzwerkeinstellungen: %1$s. - Die Verbindung des Weiterleitungsservers %1$s zum Zielserver %2$s schlug fehl. Bitte versuchen Sie es später erneut. - Die Zielserver-Version von %1$s ist nicht mit dem Weiterleitungsserver %2$s kompatibel. - Die Weiterleitungsserver-Version ist nicht kompatibel mit den Netzwerkeinstellungen: %1$s. - Die Zielserver-Adresse von %1$s ist nicht mit den Einstellungen des Weiterleitungsservers %2$s kompatibel. - Fehler beim Verbinden zum Weiterleitungsserver %1$s. Bitte versuchen Sie es später erneut. - Medium unscharf machen + Die Weiterleitungs-Server-Adresse ist nicht kompatibel mit den Netzwerkeinstellungen: %1$s. + Die Verbindung des Weiterleitungs-Servers %1$s zum Ziel-Server %2$s schlug fehl. Bitte versuchen Sie es später erneut. + Die Ziel-Server-Version von %1$s ist nicht mit dem Weiterleitungs-Server %2$s kompatibel. + Die Weiterleitungs-Server-Version ist nicht kompatibel mit den Netzwerkeinstellungen: %1$s. + Die Ziel-Server-Adresse von %1$s ist nicht mit den Einstellungen des Weiterleitungs-Servers %2$s kompatibel. + Fehler beim Verbinden zum Weiterleitungs-Server %1$s. Bitte versuchen Sie es später erneut. + Medium verpixeln Weich - Hart - Medium + Stark + Mittel Aus + Verbinden + Nachricht + Öffnen + Unterhaltung gelöscht! + Nur die Unterhaltung löschen + Suchen + Video + Sie können die Unterhaltung mit %1$s weiterhin in der Chatliste einsehen. + Link einfügen + Gelöschte Chats + Keine gefilterten Kontakte + Ihre Kontakte + Einhand-Bedienoberfläche + Bitten Sie Ihren Kontakt darum, Anrufe zu aktivieren. + Sie müssen Ihrem Kontakt Anrufe zu Ihnen erlauben, bevor Sie ihn selbst anrufen können. + Anrufe erlauben? + Anrufen + Kontakt kann nicht angerufen werden + Anrufe nicht zugelassen! + Löschen des Kontakts bestätigen? + Kontakt gelöscht! + Gruppenmitglied kann nicht angerufen werden + Nachricht an Gruppenmitglied nicht möglich + Verbinde mit Kontakt, bitte warten oder später erneut überprüfen! + Kontakt wurde gelöscht. + Kontakt wird gelöscht. Dies kann nicht rückgängig gemacht werden! + Ohne Benachrichtigung löschen + Einladen + Unterhaltung behalten + Nachricht senden, um Anrufe zu aktivieren. + Sie können weiterhin Nachrichten an %1$s von den gelöschten Chats aus senden. + Einstellungen + Die Nachrichten werden für alle Mitglieder gelöscht. + Die Nachrichten werden für alle Mitglieder als moderiert markiert. + %d Nachrichten der Mitglieder löschen? + Nachricht + Nachrichten werden zur Löschung markiert. Der/Die Empfänger hat/haben die Möglichkeit, diese Nachrichten aufzudecken. + %d ausgewählt + Es wurde Nichts ausgewählt + Auswählen \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml index 836ab0865d..cd67a28477 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml @@ -447,7 +447,6 @@ Asegúrate de que las direcciones del servidor SMP tienen el formato correcto, están separadas por líneas y no están duplicadas. Notificación instantánea Configuración de red - No se usarán hosts .onion cifrado de extremo a extremo de 2 capas .]]> Puedes cambiar estos ajustes más tarde en Configuración. Instantánea @@ -466,7 +465,6 @@ Contacto y texto MIEMBRO nunca - Se requieren hosts .onion para la conexión No se usarán hosts .onion Vista previa de notificaciones ¡Invitación caducada! @@ -511,7 +509,6 @@ Asegúrate de que las direcciones del servidor WebRTC ICE tienen el formato correcto, están separadas por líneas y no duplicadas. Se requieren hosts .onion para la conexión \nRecuerda: no podrás conectarte a servidores que no tengan dirección .onion. - Se usarán hosts .onion si están disponibles. Inmune a spam y abuso si SimpleX no tiene identificadores de usuario, ¿cómo puede entregar los mensajes\?]]> Videollamada entrante @@ -636,7 +633,6 @@ Guardar y notificar contactos Protocolo y código abiertos: cualquiera puede usar los servidores. Rol - Revertir Intervalo PING Contador PING Sólo tu contacto puede eliminar mensajes de forma irreversible (tu puedes marcarlos para eliminar). (24 horas) @@ -800,7 +796,6 @@ Estrella en GitHub Lista de servidores para las conexiones nuevas de tu perfil actual ¿Usar conexión directa a Internet\? - ¿Actualizar la configuración de los hosts .onion\? El perfil sólo se comparte con tus contactos. inicializando… Mensajes omitidos diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml index c18c163483..2fe4ec452e 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml @@ -588,7 +588,6 @@ میزبان‌های Onion برای اتصال الزامی خواهد بود. \nلطفا توجه داشته باشید: شما بدون نشانی‌ onion. قادر نخواهید بود به سرورها متصل شوید. ذخیره - تنظیمات میزبان‌های onion. به روز شود؟ پورت از پروکسی SOCKS استفاده شود؟ از اتصال مستقیم اینترنت استفاده شود؟ @@ -597,7 +596,6 @@ هاست الزامی از میزبان‌های Onion وقتی موجود باشند استفاده خواهد شد. - از میزبان‌های Onion وقتی موجود باشند استفاده خواهد شد. ظاهر نسخه برنامه: v%s نمایش گزینه‌های توسعه‌دهنده @@ -608,7 +606,6 @@ برای هر نمایه گپی که در برنامه دارید استفاده خواهد شد.]]> نمایش خطاهای داخلی نمایش تماس‌های کند API - از میزبان‌های Onion استفاده نخواهد شد. خیر استفاده از میزبان‌های onion. را روی «خیر» تنظیم کنید اگر پروکسی SOCKS از آنها پشتیبانی نمی‌کند.]]> سفارشی کردن تم @@ -630,7 +627,6 @@ اتصال ساختار برنامه: %s تنظیمات شبکه - میزبان‌های Onion برای اتصال الزامی خواهد بود. نمایش: لطفا توجه داشته باشید: واسطه‌های پیام و پرونده از طریق پروکسی SOCKS متصل می‌شوند. تماس‌ها و ارسال پیش‌نمایش‌های لینک از اتصال مستقیم استفاده می‌کنند.]]> گزینه‌های توسعه‌دهنده @@ -1313,7 +1309,6 @@ وقفه پینگ شمار پینگ فعال کردن زنده نگه‌داشتن TCP - برگشت ذخیره تنظیمات شبکه به‌روزرسانی شود؟ افزودن نمایه diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml index b89f0ddb62..8200d8a0ff 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml @@ -623,7 +623,6 @@ Aseta kontaktin nimi… Tallenna salasana Keystoreen Vain kontaktisi voi lähettää katoavia viestejä. - Onion-isäntiä käytetään, kun niitä on saatavilla. Portti portti %d Use .onion hosts arvoon Ei, jos SOCKS-välityspalvelin ei tue niitä.]]> @@ -661,7 +660,6 @@ TCP-yhteyden aikakatkaisu PING-määrä PING-väli - Palauta Profiili- ja palvelinyhteydet Aseta ryhmän asetukset jos SimpleX ei sisällä käyttäjätunnuksia, kuinka se voi toimittaa viestejä\?]]> @@ -916,8 +914,6 @@ Kiitos SimpleX Chatin asentamisesta! Asetukset Lisää - Onion-isäntiä ei käytetä. - Yhteyden muodostamiseen tarvitaan Onion-isäntiä. Yksityiset ilmoitukset Kaiutin pois päältä Kaiutin päällä @@ -1156,7 +1152,6 @@ \nkontakteillesi ICE-palvelimesi Kun saatavilla - Päivitä .onion-isäntien asetus\? Käytä .onion-isäntiä Puhelusi Tätä ryhmää ei enää ole olemassa. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml index a077223b45..eb2c76d2bb 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml @@ -321,8 +321,6 @@ Assurez-vous que les adresses des serveurs WebRTC ICE sont au bon format et ne sont pas dupliquées, un par ligne. Accéder aux serveurs via un proxy SOCKS sur le port %d \? Le proxy doit être démarré avant d\'activer cette option. Utiliser les hôtes .onions - Les hôtes .onion seront utilisés lorsqu\'ils sont disponibles. - Les hôtes .onion seront nécessaires pour la connexion. transmettre ainsi que par quel·s serveur·s vous pouvez recevoir les messages de vos contacts.]]> Vos paramètres SimpleX Lock @@ -414,12 +412,10 @@ Comment faire Serveurs ICE (un par ligne) Erreur lors de la sauvegarde des serveurs ICE - Mettre à jour le paramètre des hôtes .onion \? Quand disponible Les hôtes .onion ne seront pas utilisés. Les hôtes .onion seront nécessaires pour la connexion. \nAttention : vous ne pourrez pas vous connecter aux serveurs sans adresse .onion. - Les hôtes .onion ne seront pas utilisés. Supprimer l\'adresse \? Tous vos contacts resteront connectés. Partager le lien @@ -833,7 +829,6 @@ directe Entièrement décentralisé – visible que par ses membres. Les membres du groupes peuvent envoyer des messages éphémères. - Revenir en arrière Interdire l’envoi de messages éphémères. Le mode incognito protège votre vie privée en utilisant un nouveau profil aléatoire pour chaque contact. La mise à jour des ces paramètres reconnectera le client à tous les serveurs. @@ -1989,4 +1984,47 @@ Erreurs d\'inscription Inscriptions ignorées Fichiers téléversés + Modéré + Flouter les médias + L\'adresse du serveur de destination %1$s est incompatible avec les paramètres du serveur de redirection %2$s. + La version du serveur de destination %1$s est incompatible avec le serveur de redirection %2$s. + Le serveur de redirection %1$s n\'a pas réussi à se connecter au serveur de destination %2$s. Veuillez réessayer plus tard. + L\'adresse du serveur de redirection est incompatible avec les paramètres du réseau : %1$s. + La version du serveur de redirection est incompatible avec les paramètres du réseau : %1$s. + Fort + Erreur de connexion au serveur de redirection %1$s. Veuillez réessayer plus tard. + Off + Léger + Paramètres + se connecter + message + ouvrir + Confirmer la suppression du contact ? + Le contact sera supprimé - il n\'est pas possible de revenir en arrière ! + Supprimer sans notification + Garder la conversation + Ne supprimer que la conversation + rechercher + vidéo + Contact supprimé ! + Vous pouvez toujours envoyer des messages à %1$s à partir des chats supprimés. + Discussions supprimées + Pas de contacts filtrés + Coller le lien + Vos contacts + Interface utilisateur à une main + Le contact est supprimé. + Les appels ne sont pas autorisés ! + Vous devez autoriser votre contact à appeler pour pouvoir l\'appeler. + Impossible d\'envoyer un message à ce membre du groupe + Vous pouvez toujours consulter la conversation avec %1$s dans la liste des conversation. + Autoriser les appels ? + appel + Impossible d\'appeler le contact + Connexion au contact, veuillez patienter ou vérifier plus tard ! + Impossible d\'appeler ce membre du groupe + Conversation supprimée ! + Inviter + Veuillez demander à votre contact d\'autoriser les appels. + Envoyer un message pour activer les appels. \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml index e1e3e00d71..71d795c242 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml @@ -299,7 +299,7 @@ kapcsolódás (elfogadva) Kiszolgáló címének ellenőrzése és újrapróbálkozás. Csoport törlése? - Adatbázis frissítés megerősítése + Adatbázis fejlesztésének megerősítése Saját profil létrehozása cím megváltoztatása… kapcsolódás… @@ -349,7 +349,7 @@ Függő kapcsolatfelvételi kérések törlése? Adatbázis titkosítva! Üzenetek kiürítése? - Visszatérés a korábbi adatbázis verzióra + Adatbázis visszafejlesztése Üzenetek kiürítése Adatbázis titkosítási jelmondat frissítve lesz. Kapcsolódás automatikusan @@ -381,7 +381,7 @@ %d hónap Cím törlése? Üzenet kézbesítési jelentések letiltása? - Az adatbázis jelmondat eltérő a Keystore-ba elmentettől. + Az adatbázis jelmondata eltér a Keystore-ban lévőtől. Közvetlen üzenetek E-mail Letiltás mindenki számára @@ -460,7 +460,7 @@ Számítógép kliens verziója %s nem kompatibilis ezzel az alkalmazással. Kézbesítés %d fájl %s összméretben - Adatbázis jelmondat szükséges a csevegés megnyitásához. + A csevegés megnyitásához adja meg az adatbázis jelmondatát. %dnap Engedélyezés mindenki számára A kézbesítési jelentések le vannak tiltva! @@ -508,7 +508,7 @@ Titkosít Csoport nem található! Hiba az SMP kiszolgálók mentésekor - Visszatérés a korábbi verzióra és a csevegés megnyitása + Visszafejlesztés és a csevegés megnyitása A csoport inaktív Gyors és nem kell várni, amíg a feladó online lesz! Hiba a csoporthoz való csatlakozáskor @@ -740,9 +740,7 @@ Új tag szerepköre Kikapcsolva Érvénytelen hivatkozás! - A kapcsolódáshoz Onion kiszolgálókra lesz szükség. Változások a %s verzióban - Onion kiszolgálók használata, ha azok rendelkezésre állnak. Érvénytelen kiszolgálócím! k soha @@ -765,7 +763,6 @@ bekapcsolva Japán és portugál kezelőfelület Az üzenetek végleges törlése le van tiltva ebben a csoportban. - Onion kiszolgálók nem lesznek használva. %s eszközzel megszakadt a kapcsolat]]> hónap Üzenetvázlat @@ -1079,7 +1076,7 @@ Jelenlegi profil Fájl feltöltése A hívások kezdeményezése le van tiltva. - Megkövetelt + Szükséges SimpleX Chat üzenetek Visszaállítás Adatbázis jelmondat beállítása @@ -1098,7 +1095,6 @@ Hívások nem sikerült elküldeni KEZELŐFELÜLET SZÍNEI - Visszaállítás Előző jelszó megadása az adatbázis biztonsági mentésének visszaállítása után. Ez a művelet nem vonható vissza. Másodlagos SOCKS PROXY @@ -1122,7 +1118,7 @@ Biztonsági kód megtekintése Tag feloldása? A küldő törölhette a kapcsolódási kérelmet. - Téves adatbázis jelmondat + Hibás adatbázis jelmondat SMP kiszolgálók Az üzenet kézbesítési jelentések le vannak tiltva Adatbázis mappa megnyitása @@ -1169,7 +1165,7 @@ simplexmq: v%s (%2s) Szétkapcsolás Véletlenszerű profil - Téves jelmondat! + Hibás jelmondat! Az üzenetreakciók küldése le van tiltva. Rendszer olvasatlan @@ -1405,9 +1401,9 @@ Közvetlen internet kapcsolat használata? Továbbra is kap hívásokat és értesítéseket a némított profiloktól, ha azok aktívak. A fő csevegési profilja elküldésre kerül a csoporttagok számára - Később engedélyezheti őket az alkalmazás Adatvédelem és biztonság menüpontban. - Rejtett profilja megjelenítéséhez írja be a teljes jelszavát a keresőmezőbe a Csevegési profilok menüben. - A csevegés frissítése és megnyitása + Később engedélyezheti őket az alkalmazás „Adatvédelem és biztonság” menüjében. + Rejtett profilja felfedéséhez írja be a teljes jelszavát a keresőmezőbe a Csevegési profilok menüben. + Fejlesztés és a csevegés megnyitása Hangüzeneteket küldéséhez engedélyeznie kell azok küldését az ismerősei számára. fogadja az üzeneteket, ismerősöket – a kiszolgálók, amelyeket az üzenetküldéshez használ.]]> %1$s csoport tagja.]]> @@ -1432,7 +1428,6 @@ Ismeretlen adatbázis hiba: %s Elrejtheti vagy lenémíthatja a felhasználó profiljait - koppintson (vagy asztali alkalmazásban kattintson) hosszan a profilra a felugró menühöz. Inkognító mód kapcsolódáskor. - Tor .onion kiszolgálók beállításainak frissítése? Megoszthat egy hivatkozást vagy QR-kódot - így bárki csatlakozhat a csoporthoz. Ha a csoport később törlésre kerül, akkor nem fogja elveszíteni annak tagjait. Csatlakozott ehhez a csoporthoz %1$s csoporthoz!]]> @@ -1476,7 +1471,7 @@ Rendszerhitelesítés helyetti beállítás. A fogadó cím egy másik kiszolgálóra változik. A címváltoztatás a feladó online állapotba kerülése után fejeződik be. A csevegés megállítása a csevegő adatbázis exportálásához, importálásához, vagy törléséhez. A csevegés megállítása alatt nem tud üzeneteket fogadni és küldeni. - Jelmondat mentése a kulcstárolóba + Jelmondat mentése a Keystore-ba Köszönet a felhasználóknak - hozzájárulás a Weblaten! Jelmondat mentése a beállításokban Ennek a csoportnak több mint %1$d tagja van, a kézbesítési jelentések nem kerülnek elküldésre. @@ -1768,7 +1763,7 @@ \nHiba: %2$s Hálózati problémák - az üzenet többszöri elküldési kísérlet után lejárt. A kiszolgáló verziója nem kompatibilis a hálózati beállításokkal. - Rossz kulcs vagy ismeretlen kapcsolat - valószínűleg ez a kapcsolat törlődött. + Hibás kulcs vagy ismeretlen kapcsolat - valószínűleg ez a kapcsolat törlődött. Továbbító kiszolgáló: %1$s \nCélkiszolgáló hiba: %2$s Hiba: %1$s @@ -1779,7 +1774,7 @@ Ismeretlen átjátszók Ha az IP-cím rejtett Üzenet állapot megjelenítése - Korábbi verzióra történő visszatérés engedélyezése + Visszafejlesztés engedélyezése Mindig Nem Nem védett @@ -1983,4 +1978,55 @@ Letiltás Letiltva Stabil + Hiba a(z) %1$s továbbító kiszolgálóhoz való kapcsolódáskor. Próbálja meg később. + A(z) %1$s célkiszolgáló verziója nem kompatibilis a(z) %2$s továbbító kiszolgálóval. + A(z) %1$s továbbító kiszolgáló nem tudott csatlakozni a(z) %2$s célkiszolgálóhoz. Próbálja meg később. + A(z) %1$s célkiszolgáló címe nem kompatibilis a(z) %2$s továbbító kiszolgáló beállításaival. + Média elhomályosítása + Közepes + Kikapcsolva + Enyhe + Erős + A továbbító kiszolgáló címe nem kompatibilis a hálózati beállításokkal: %1$s. + A továbbító kiszolgáló verziója nem kompatibilis a hálózati beállításokkal: %1$s. + hívás + Az ismerős törlésre fog kerülni - ez a művelet nem vonható vissza! + Csak a beszélgetés törlése + megnyitás + Beszélgetés törölve! + Ismerős törölve! + Törölt csevegések + Nincsenek szűrt ismerősök + Hivatkozás beillesztése + A hívások le vannak tiltva! + Nem lehet felhívni az ismerőst + Nem lehet üzenetet küldeni a csoporttagnak + Kapcsolódás az ismerőshöz, várjon vagy ellenőrizze később! + Törölt ismerős. + Nem lehet felhívni a csoporttagot + Hívások engedélyezése? + Meghívás + üzenet + Beszélgetés megtartása + Biztosan törli az ismerőst? + kapcsolódás + Egykezes UI + Törlés értesítés nélkül + Beállítások + keresés + videó + A „Törölt csevegésekből” továbbra is küldhet üzeneteket neki: %1$s. + Ismerősök + Kérje meg az ismerősét, hogy engedélyezze a hívásokat. + Üzenet küldése a hívások engedélyezéséhez. + Engedélyeznie kell a hívásokat az ismerőse számára, hogy fel tudják hívni egymást. + A(z) %1$s nevű ismerősével folytatott beszélgetéseit továbbra is megtekintheti a csevegések listájában. + Üzenet + Kiválaszt + Az üzenetek minden tag számára moderáltként lesznek megjelölve. + Nincs kiválasztva semmi + Az üzenetek törlésre lesznek jelölve. A címzett(ek) képes(ek) lesz(nek) felfedni ezt az üzenetet. + Törli a tagok %d üzenetét? + %d kiválasztva + Az üzenetek minden tag számára törlésre kerülnek. \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_check_circle.svg b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_check_circle.svg new file mode 100644 index 0000000000..d44f9a2d1b --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_check_circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_id_card.svg b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_id_card.svg new file mode 100644 index 0000000000..ff3b77c1d6 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_id_card.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_radio_button_unchecked.svg b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_radio_button_unchecked.svg new file mode 100644 index 0000000000..7433962953 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_radio_button_unchecked.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_toast.svg b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_toast.svg new file mode 100644 index 0000000000..64f03f2fa7 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_toast.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml index e5bc6ed20a..0de7b10c49 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml @@ -610,18 +610,14 @@ No Gli host Onion saranno necessari per la connessione. \nNota bene: non potrai connetterti ai server senza indirizzo .onion . - Gli host Onion saranno necessari per la connessione. Gli host Onion verranno usati quando disponibili. - Gli host Onion verranno usati quando disponibili. Gli host Onion non verranno usati. - Gli host Onion non verranno usati. Valuta l\'app Obbligatorio Salva I server WebRTC ICE salvati verranno rimossi. Condividi link Dai una stella su GitHub - Aggiornare l\'impostazione degli host .onion\? Usare una connessione internet diretta\? Usa gli host .onion Usare il proxy SOCKS\? @@ -816,7 +812,6 @@ Scadenza del protocollo Ricezione via Ripristina i predefiniti - Ripristina Salva Salva il profilo del gruppo sec @@ -2000,4 +1995,44 @@ Leggera Media Forte + chiama + messaggio + apri + cerca + Impostazioni + Elimina senza avvisare + Tieni la conversazione + Elimina solo la conversazione + Puoi ancora inviare messaggi a %1$s dalle chat eliminate. + Chat eliminate + Nessun contatto filtrato + Incolla link + I tuoi contatti + Interfaccia a una mano + Invita + Consentire le chiamate? + Chiamate proibite! + Impossibile chiamare il contatto + Impossibile chiamare il membro del gruppo + In collegamento con il contatto, attendi o controlla più tardi! + Il contatto è stato eliminato. + Chiedi al contatto di attivare le chiamate. + Devi consentire le chiamate al tuo contatto per poterlo chiamare. + Impossibile inviare messaggi al membro del gruppo + Il contatto verrà eliminato - non è reversibile! + Conversazione eliminata! + Invia un messaggio per attivare le chiamate. + video + Puoi ancora vedere la conversazione con %1$s nell\'elenco delle chat. + connetti + Contatto eliminato! + Confermare l\'eliminazione del contatto? + Messaggio + Nessuna selezione + Seleziona + Selezionato %d + I messaggi verranno eliminati per tutti i membri. + I messaggi verranno contrassegnati come moderati per tutti i membri. + Eliminare %d messaggi dei membri? + I messaggi saranno contrassegnati per l\'eliminazione. Il/I destinatario/i sarà/saranno in grado di rivelare questi messaggi. \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml index c35b750c01..3c33a8cc88 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml @@ -604,8 +604,6 @@ בהיר ודאו שלקובץ יש תחביר YAML תקין. ייצאו ערכת נושא כדי לקבל דוגמה למבנה תקין של קובץ ערכת נושא. ככל הנראה איש קשר זה מחק את החיבור איתך. - ייעשה שימוש במארחי Onion כאשר יהיו זמינים. - מארחי Onion יידרשו לחיבור. נחסם על ידי %s אין קוד גישה לאפליקציה ניתן לשלוח רק 10 סרטונים בו־זמנית @@ -674,7 +672,6 @@ יידרשו מארחי onion לחיבור. \nשימו לב: לא תוכלו להתחבר לשרתים ללא כתובת .onion. לא ייעשה שימוש במארחי Onion. - לא ייעשה שימוש במארחי Onion. שיחה שלא נענתה הצפנה מקצה־לקצה דו־שכבתית.]]> ללא הצפנה מקצה־לקצה @@ -902,7 +899,6 @@ שניות אישור תפקיד - ביטול שמור ועדכן את פרופיל הקבוצה לשמור הודעת פתיחה\? %s (נוכחי) @@ -1077,7 +1073,6 @@ (כדי לשתף עם איש הקשר שלך) כדי להתחיל צ׳אט חדש השתמש עבור חיבורים חדשים - לעדכן הגדרות מארחי ‪.onion‬\?‬ כדי לאמת הצפנה מקצה־לקצה עם איש הקשר שלכם, יש להשוות (או לסרוק) את הקוד במכשירים שלכם. פרופילי צ׳אט לעדכן מצב בידוד תעבורה\? @@ -1815,7 +1810,7 @@ נשמר נשמר מ מקבלי ההודעה לא יוכלו לראות מי שלח את ההודעה - הועבר + העבר מעביר הודעה… קישורי SimpleX לא מאופשרים מסלול פרטי @@ -1840,4 +1835,96 @@ ערכת נושא בהירה מערכת שגיאה בהצגת התראה, צור קשר עם המפתחים + שגיאה בהתחברות לשרת %1$s, אנא נסה מאוחר יותר + אין עדיין חיבור ישיר, ההודעה תעובר ע\"י מנהל. + חבר לא פעיל + שרתי XFTP אחרים + הראה אחוזים + מושבת + יציבה + הותקן בהצלחה + התקן עדכון + פתח מיקום קובץ + אנא הפעל מחדש את האפילקציה. + הזכר מאוחר יותר + דלג על הגרסא הזאת + השבת + גדול פונט + פרופיל נוכחי + הודעות שנשלחו + פג תוקף + שגיאות בשליחה + גודל + קבצים שהועלו + יחול בצ\'אטים ישירים! + בלוטוס + טשטש מדיה + כבוי + בינוני + חזק + מושבת + לא פעיל + פרטים + שגיאה + שגיאה בהתחברות מחדש לשרת + שגיאה בהתחברות מחדש לשרתים + שגיאות + מקבל ההודעות + שרתי פרוקסי + חבר מחדש את לכל השרתים + להתחבר מחדש לשרת? + להתחבר מחדש לשרתים? + סטטיסטיקות + סך הכל + ניסיונות + הושלם + חיבורים + נמחק + שגיאות במחיקה + שגיאה באיפוס הסטטיסטיקה + אחר + מאובטח + שלח ישירות + נשלח דרך פרוקסי + קבצים שהורדו + שגיאות בהורדה + פתח הגדרות שרת + כתובת שרת + חריגה מהקיבולת - הנמען לא קיבל הודעות שנשלחו בעבר. + בדוק עבור עדכונים + מחובר + שרתים מחוברים + בודק עבור עדכונים חדשים + מתחבר + נוצר + הודעה הועברה + ההודעה תוכל להימסר מאוחר יותר אם החבר יהפוך לפעיל. + הודעות שהתקבלו + אפס את כל הסטטיסטיקות + גודל + קישורי SimpleX לא מאופשרים בקבוצה הזו. + סרוק/ הדבק קישור + אנא נסה מאוחר יותר + שרתי SMP אחרים + אפס + הועלה + סטטיסטיקה מפורטת + בטא + לאפס את כל הסטטיסטיקות? + שגיאות בפענוח + שגיאות אחרות + שגיאה בהעלאה + יורד עדכון לאפליקציה + מוריד עדכון לאפליקציה, אל תסגור את האפליקציה + כל הפרופילים + קבצים + אין מידע, נסה לרענן + מידע על השרתים + התקבל סה\"כ + התקבלו שגיאות + התחבר מחדש + שלח הודעות + נשלח בסה\"כ + שרת SMP + שרת XFTP \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml index 7d97b6fa03..38df6a8b16 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml @@ -204,7 +204,6 @@ 接続済み リンク経由で繋がる。 接続エラー - 接続にオニオンのホストが必要となります。 接続待ち (紹介済み) 接続エラー (AUTH) 接続タイムアウト @@ -222,7 +221,6 @@ 追加情報アイコン オニオンのホストが利用可能時に使われます。 オニオンのホストが使われません。 - オニオンのホストが利用可能時に使われます。 画像を1回で最大10枚を送信できます。 2層エンドツーエンド暗号化で送信されたプロフィール、連絡先、グループ、メッセージは、クライント端末にしか保存されません。]]> グループ設定を変えられるのはグループのオーナーだけです。 @@ -315,7 +313,6 @@ ICEサーバ (1行に1サーバ) ネットワークとサーバ ネットワーク設定 - オニオンのホストが使われません。 アドレスを削除 保存せずに閉じる 表示の名前には空白が使用できません。 @@ -735,7 +732,6 @@ あなたのICEサーバ 直接にインタネットに繋がりますか? SOCKSプロキシを使いますか? - .onionのホスト設定を更新しますか? .onionホストを使う 利用可能時に トランスポート隔離 @@ -883,7 +879,6 @@ アプリ起動時にパスフレーズを入力しなければなりません。端末に保存されてません。 データベースのパスフレーズ変更が完了してません。 リンク、またはQRコードを共有できます。誰でもグループに参加できます。後で削除しても、グループのメンバーがそのままのこります。 - 元に戻す 更新 1日に設定 一定時間が経ったら送信されたメッセージが削除されます。 diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml index 9d7088d742..ffd62b4755 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml @@ -635,7 +635,6 @@ 이 설정은 현재 내 프로필의 메시지에 적용되어요. 멤버 역할이 \"%s\"(으)로 변경되고, 회원은 새로운 초대를 받게 될 거예요. - 되돌리기 이 채팅에서는 메시지 영구 삭제가 허용되지 않았어요. 나가기 큰 파일! @@ -667,9 +666,6 @@ 사용 가능한 경우 Onion 호스트가 사용될 거예요. Onion 호스트가 사용되지 않을 거예요. 전송 격리 - Onion 호스트가 사용되지 않을 거예요. - 사용 가능한 경우 Onion 호스트가 사용될 거예요. - 연결하려면 Onion 호스트가 필요해요. 차세대 사생활 보호 메시징 새 비밀번호… TCP 연결 유지 활성화 diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml index a98aba3ff6..6139eb5133 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml @@ -130,7 +130,6 @@ grupės profilis atnaujintas Grupė Ištrinti pokalbio profilį\? - Sugrąžinti Įrašyti įjungta Ištrinti po @@ -1373,7 +1372,6 @@ (nuskanuokite ar įklijuokite iš iškarpinės) Priėmėte prisijungimą Jūs pakvietėte kontaktą - Onion serveriai bus reikalingi ryšiui. Onion serveriai bus naudojami, kai tik bus. Išeiti neišsaugant Jūs kontroliuojate savo pokalbį! @@ -1565,7 +1563,6 @@ Jūsų SimpleX adresas Nuskanuoti serverio QR kodą Reikalingi - Onion serveriai bus naudojami, kai tik bus. Onion serveriai nebus naudojami. Savaiminis susinaikinimas Senas duomenų bazės archyvas @@ -1628,8 +1625,6 @@ Moderuoti nori prisijungti prie jūsų! nuorodos peržiūros nuotrauka - Onion serveriai nebus naudojami. - Atnaujinti .onion serverių nustatymą? Kai programėlė yra paleista Užrakto režimas Galite paleisti pokalbius per programėlės nustatymus/ duomenų bazę arba paleisdami programėlę iš naujo. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml index b807789c08..d97cf4b7ad 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml @@ -320,7 +320,6 @@ സ്വീകരിക്കുന്ന വിലാസം മാറുക സെർവറുകൾ സംരക്ഷിക്കുക - പഴയപടിയാക്കുക സംവിധാനം സംവിധാനം ശീർഷകം diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml index 58f09108ce..b8df4c38fe 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml @@ -546,7 +546,6 @@ Eenmalige uitnodiging link Plakken Vooraf ingesteld server adres - Onion hosts worden niet gebruikt. Privé meldingen Plak de link die je hebt ontvangen Periodiek @@ -573,7 +572,6 @@ Wachtwoord is nodig uit Eenmalige uitnodiging link - Onion hosts zijn vereist voor verbinding. Alleen groep eigenaren kunnen groep voorkeuren wijzigen. (alleen opgeslagen door groepsleden) Vooraf ingestelde server @@ -584,7 +582,6 @@ OK Onion hosts zijn vereist voor verbinding. Onion hosts worden gebruikt indien beschikbaar. - Onion hosts worden gebruikt indien beschikbaar. Onion hosts worden niet gebruikt. Open-source protocol en code. Iedereen kan de servers draaien. Mensen kunnen alleen verbinding met u maken via de links die u deelt. @@ -808,7 +805,6 @@ Resetten naar standaardwaarden Ontvangst adres wijzigen Protocol timeout - Terugdraaien Opslaan sec Wanneer je een incognito profiel met iemand deelt, wordt dit profiel gebruikt voor de groepen waarvoor ze je uitnodigen. @@ -904,7 +900,6 @@ verbinding maken met SimpleX Chat ontwikkelaars om vragen te stellen en updates te ontvangen.]]> Tenzij uw contact de verbinding heeft verwijderd of deze link al is gebruikt, kan het een bug zijn. Meld het alstublieft. \nOm verbinding te maken, vraagt u uw contact om een andere verbinding link te maken en te controleren of u een stabiele netwerkverbinding heeft. - .onion hosts-instelling updaten\? SimpleX Chat servers gebruiken\? Spraak berichten zijn verboden in deze groep. Welkom %1$s! @@ -1987,4 +1982,55 @@ Update beschikbaar: %s Downloaden van update geannuleerd Als u op de hoogte wilt worden gehouden van de nieuwe releases, schakelt u periodieke controle op stabiele of bètaversies in. + Vervaag media + Medium + uit + Soft + Krachtig + Het doelserveradres van %1$s is niet compatibel met de instellingen van de doorstuurserver %2$s. + De doelserverversie van %1$s is incompatibel met de doorstuurserver %2$s. + Fout bij verbinden met doorstuurserver %1$s. Probeer het later opnieuw. + Doorstuurserver %1$s kon geen verbinding maken met bestemmingsserver %2$s. Probeer het later opnieuw. + Het doorstuuradres is niet compatibel met de netwerkinstellingen: %1$s. + De doorstuurserverversie is niet compatibel met de netwerkinstellingen: %1$s. + Kan contact niet bellen + Oproepen toestaan? + bellen + Kan geen groepslid bellen + Bellen verboden! + Contact verwijderen bevestigen? + Gesprek verwijderd! + Verwijderen zonder melding + Verwijderde chats + Contact is verwijderd. + Er wordt verbinding gemaakt met het contact. Even geduld of controleer het later! + Kan geen bericht sturen naar groepslid + %d berichten van leden verwijderen? + Bericht + Berichten worden gemarkeerd voor verwijdering. De ontvanger(s) kunnen deze berichten onthullen. + Niets geselecteerd + verbinden + Contact verwijderd! + Het contact wordt verwijderd. Dit kan niet ongedaan worden gemaakt! + Blijf in gesprek + bericht + Alleen conversatie verwijderen + open + Plak de link + Uitnodiging + Gebruikersinterface met één hand + Vraag uw contactpersoon om oproepen in te schakelen. + Geen gefilterde contacten + Selecteer + Geselecteerd %d + Stuur een bericht om oproepen mogelijk te maken. + zoekopdracht + Je kunt nog steeds berichten sturen naar %1$s vanuit de Verwijderde chats. + Instellingen + De berichten worden voor alle leden verwijderd. + De berichten worden voor alle leden als gemodereerd gemarkeerd. + video + Je kunt nog steeds het gesprek met %1$s bekijken in de lijst met chats. + U moet uw contactpersoon toestemming geven om te bellen, zodat hij/zij je kan bellen. + Jouw contacten \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml index 2422148b45..dc97062155 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml @@ -348,14 +348,11 @@ Nie Hosty onion będą wymagane do połączenia. \nUwaga: nie będziesz mógł połączyć się z serwerami bez adresu .onion. - Hosty onion będą wymagane do połączenia. Hosty onion będą używane, gdy będą dostępne. - Hosty onion będą używane, gdy będą dostępne. Hosty onion nie będą używane. Wymagane Zapisz Izolacja transportu - Zaktualizować ustawienie hostów .onion\? Zaktualizować tryb izolacji transportu\? Użyć bezpośredniego połączenia z Internetem\? Użyj hostów .onion @@ -758,7 +755,6 @@ Profil i połączenia z serwerem Limit czasu protokołu Przywróć wartości domyślne - Przywrócić Zapisz sek Dotknij, aby aktywować profil. @@ -953,7 +949,6 @@ Wideo zaproponował %s: %2s Tylko właściciele grup mogą włączyć wiadomości głosowe. - Hosty onion nie będą używane. Tylko Twój kontakt może nieodwracalnie usunąć wiadomości (możesz oznaczyć je do usunięcia). (24 godziny) Hasło nie zostało znalezione w Keystore, wprowadź je ręcznie. Może się tak zdarzyć, gdy przywrócisz dane aplikacji za pomocą narzędzia do kopii zapasowych. Jeśli tak nie jest, skontaktuj się z programistami. Członkowie grupy mogą wysyłać znikające wiadomości. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml index f0a0c53496..2fa9f85599 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml @@ -482,7 +482,6 @@ Arquivo de banco de dados antigo Convidar membros Nenhum contato selecionado - Reverter Salvar Redefinir cores interface italiana @@ -647,7 +646,6 @@ Onion hosts não serão usados. Os hosts Onion serão necessários para a conexão. \nAtenção: você não será capaz de se conectar aos servidores sem um endereço .onion - Os hosts Onion serão necessários para a conexão. Versão principal: v%s repositório do GitHub.]]> Pode ser mudado mais tarde via configurações. @@ -761,9 +759,7 @@ Proteja seus perfis de bate-papo com uma senha! Este texto está disponível nas configurações Escanear código - Hosts Onion não serão usados. Os hosts Onion serão usados quando disponíveis. - Os hosts Onion serão usados quando disponíveis. Seu perfil atual Privacidade redefinida Notificações privadas @@ -963,7 +959,6 @@ Compartilhar mensagem… Bem-vindo(a) %1$s! você está convidado para o grupo - Atualizar configuração de hosts .onion\? Usar bate-papo Mensagens de voz são proibidas neste chat. Vídeo diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml index 65ffeef271..e652ab27e5 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml @@ -39,7 +39,7 @@ Apenas dados de perfil local Realçar Você permite - Mensagens que desaparecem + Mensagens temporárias sempre não Definir preferências de grupo @@ -62,12 +62,12 @@ %d min %d mês %d meses - %dmês + %dº mês Administradores podem criar as ligações para entrar em grupos. Mensagens de voz Aceitar automaticamente pedidos de contato Adicionar servidores lendo QR codes. - Mensagens que desaparecem + Mensagens temporárias Mensagens ao vivo As mensagens enviadas serão eliminadas após o tempo definido. Mensagem de rascunho @@ -138,17 +138,17 @@ Arquivo de conversa Eliminar Eliminar todos os ficheiros - Eliminar ficheiro + Eliminar arquivo Eliminar arquivo de conversa\? Eliminar base de dados BASE DE DADOS DE CONVERSA Base de dados de conversa eliminada Nome para Exibição Mostrar: - eliminada + eliminado grupo eliminado Nome do grupo: - O nome para exibição não pode conter espaços em branco. + O nome de exibição não pode conter espaços em branco. %dm Não mostrar novamente Mostrar opções de desenvolvedor @@ -157,9 +157,9 @@ Permitir enviar mensagens que desaparecem. Nome para Exibição: Mostrar código QR - Mensagens que desaparecem são proibidas neste grupo. - Conectar via ligação / código QR - Mensagens que desaparecem são proibidas nesta conversa. + Mensagens temporárias são proibidas neste grupo. + Conectar via link / código QR + Mensagens temporárias são proibidas nesta conversa. Enviar AO VIVO Enviar uma mensagem ao vivo - ela será atualizada para o(s) destinatário(s) à medida que você a digita @@ -251,7 +251,7 @@ Base de dados de conversa importada A conversa está parada Verifique o endereço do servidor e tente novamente. - O seu perfil será enviado para o contato do qual você recebeu esta ligação. + O seu perfil será enviado para o contacto do qual você recebeu esta ligação. Erro ao eliminar a base de dados de conversa Erro ao eliminar ligação de grupo Perfil de conversa @@ -270,14 +270,14 @@ Alterar função Alterar a função no grupo\? Erro ao alterar função - O contato permite + O contacto permite Preferências de conversa SimpleX m - Conectar através da ligação de contato\? - Conectar via convite de ligação\? + Conectar através do endereço de contacto? + Conectar via link de convite? Conectar através da ligação do grupo\? - Você irá juntar-se a um grupo ao qual esta ligação se refere e conectar-se aos membros do grupo. + Você irá conectar-se a todos os membros do grupo. erro Erro ao criar perfil! Erro ao adicionar membro(s) @@ -334,7 +334,7 @@ conectando (aceite) conectando (anunciado) conectando - Contato verificado + Contacto verificado Ligação de grupo conectando… conexão estabelecida @@ -348,10 +348,10 @@ Conectado conectando… Tempo limite de conexão - Preferências de contato - Contato escondido: - O contato ainda não está conectado! - Nome do contato + Preferências de contacto + contacto escondido: + O contacto ainda não está conectado! + Nome do contacto Contribuir Copiar Versão principal: v%s @@ -362,16 +362,16 @@ Conectar via ligação Erro de conexão conexão %1$d - O contato já existe + O contacto já existe Convite de ligação de utilização única Salvar Modo anónimo convidado através da ligação do seu grupo - Você está a tentar convidar um contato com quem partilhou um perfil anónimo para o grupo no qual voçê está a usar o seu perfil principal + Você está a tentar convidar um contacto com quem partilhou um perfil anónimo para um grupo no qual você está a usar o seu perfil principal Conexão O modo anónimo protege a privacidade do nome e da imagem do seu perfil principal — para cada novo contato um novo perfil aleatório é criado. - você partilhou ligação de utilização única - você partilhou ligação anónima de utilização única + você partilhou a ligação de utilização única + você partilhou a ligação anónima de utilização única Ligação de conexão inválida Salvar Se você recebeu convite de ligação do SimpleX Chat, você pode abri-lo no seu navegador: @@ -397,9 +397,9 @@ Descrição Ligação completa anónimo via ligação de endereço de contato - Abrir a ligação no navegador pode reduzir a privacidade e a segurança da ligação. As ligações Simplex não confiáveis serão vermelhas. + Abrir a ligação no browser poderá reduzir a privacidade e a segurança da ligação. As ligações Simplex não confiáveis serão vermelhas. Confirmar credenciais - Contato e todas as mensagens serão eliminadas - esta acção não pode ser revertida! + O contacto e todas as mensagens serão eliminadas - esta ação é irreversível! ligação de visualização de imagem Ligação inválida! Guia de Utilizador.]]> @@ -414,12 +414,12 @@ Convite de ligação de utilização única Todos os seus contatos permanecerão conectados. A atualização do perfil será enviada aos seus contatos. Adicione endereço ao seu perfil, para que os seus contatos possam partilhá-lo com outras pessoas. A atualização do perfil será enviada aos seus contatos. - Os contatos podem marcar mensagens para eliminar; você será capaz de as ver. + Os contactos podem marcar mensagens para eliminar; você será capaz de as ver. Criar convite de ligação de utilização única anónimo via ligação de utilização única anónimo via ligação de grupo via ligação de utilização única - Você está a usar um perfil anónimo para este grupo - para impedir a partilha do seu perfil principal não é permitido convidar contatos + Você está a usar um perfil anónimo para este grupo - para impedir a partilha do seu perfil principal, não é permitido convidar contactos Ligação para 1 utilização Criar ligação Apagar ligação\? @@ -433,8 +433,8 @@ Partilhar ligação de utilização única GitHub.]]> Criar perfil - Criar perfil - %d contato(s) selecionado(s) + Criar o seu perfil + %d contacto(s) selecionado(s) Eliminar perfil de conversa para Eliminar para todos %dd @@ -447,16 +447,16 @@ Eliminar ficheiros de todos os perfis de conversa Eliminar mensagens %d ficheiros(s) com tamanho total de %s - Senha atual… - Eliminar conexão pendente\? + Palavra-passe atual… + Eliminar ligação pendente? Eliminar mensagens após Eliminar perfil de conversa\? Eliminar perfil de conversa %d hora %d horas - erro de base de dados - A senha da base de dados é diferente da guardada na Keystore. - A senha da base de dados é necessária para abrir a conversa. + Erro de base de dados + A palavra-passe da base de dados é diferente da armazenada na Keystore. + A palavra-passe da base de dados é necessária para abrir a conversa. Eliminar grupo Eliminar grupo\? direta @@ -464,20 +464,20 @@ Eliminar perfil Criar fila Eliminar para mim - Desabilitar o bloqueio do SimpleX + Desativar o bloqueio do SimpleX Atualmente o tamanho máximo de ficheiro suportado é %1$s. - Eliminar contato + Eliminar contacto Criar grupo secreto Eliminar servidor Personalizar tema Eliminar imagem Não criar endereço - Desabilitar - Senha da base de dados + Desativar + Palavra-passe da base de dados Criar endereço SimpleX ID da base de dados Eliminar ficheiro - Eliminar contato\? + Eliminar contacto? DISPOSITIVO Mensagens diretas Descentralizado @@ -487,7 +487,7 @@ %ds %d seg %dw - Nome para exibição duplicado! + Nome de exibição duplicado! %d segundos Ficheiro guardado Atualização da base de dados @@ -499,7 +499,7 @@ Ficheiro Ficheiro não encontrado Ficheiro - Você não perderá os seus contatos se eliminar o seu endereço mais tarde. + Você não irá perder os seus contatos se eliminar o seu endereço mais tarde. Você pode esconder ou silenciar um perfil de utilizador - pressione-o para o menu. Vídeo ligado Servidores XFTP @@ -525,7 +525,7 @@ Senha da base de dados incorreta esquerda Senha errada! - Você deixará de receber mensagens deste grupo. O histórico de mensagens será preservado. + Você irá deixar de receber mensagens deste grupo. O histórico de mensagens será preservado. Juntar-se ao grupo\? Com mensagem de boas-vindas opcional. via %1$s @@ -558,7 +558,7 @@ Esta ação não pode ser revertida - o seu perfil, contatos, mensagens e ficheiros serão irreversivelmente perdidos. Esta ação não pode ser revertida - as mensagens enviadas e recebidas antes da seleção serão eliminadas. Pode demorar vários minutos. A sua base de dados atual de conversas será ELIMINADA e SUBSTITUÍDA pela importada. -\nEsta ação não pode ser revertida - o seu perfil, contatos, mensagens e ficheiros serão irreversivelmente perdidos. +\nEsta ação é irreversível - o seu perfil, contactos, mensagens e ficheiros serão irreversivelmente perdidos. Marcar como não lido membro MEMBRO @@ -578,7 +578,6 @@ Pré-visualização de notificação Muito provavelmente este contato eliminou a conexão consigo. Este texto está disponível nas definições - Atualizar definições de servidores .onion\? Pode ser alterado mais tarde através das definições. AJUDA SUPORTE SIMPLEX CHAT @@ -591,29 +590,28 @@ Novidades %s Novo pedido de contato Novo arquivo de base de dados - A base de dados está encriptada com uma senha aleatória, você pode alterá-la. + A base de dados está encriptada com uma palavra-passe aleatória, você pode alterá-la. Insira a senha correta. A tentativa de alterar a senha da base de dados não foi concluída. - A sua base de dados de conversas não está encriptada - defina a senha para a proteger. + A sua base de dados de conversas não está encriptada - defina a palavra-passe para a proteger. Insira a senha… - Você tem que inserir a senha sempre que a aplicação é iniciada - ela não é guardada no dispositivo. + Você tem que inserir a palavra-passe sempre que a aplicação é iniciada - ela não é armazenada no dispositivo. Nova senha… Remover Remover senha da Keystore\? Insira a senha atual correta. Atualizar senha da base de dados nova mensagem - Senha da base de dados & exportação - A base de dados está encriptada com uma senha aleatória. Por favor, altere-a antes de exportar. - A senha de encriptação da base de dados será atualizada. + Palavra-passe da base de dados & exportação + A base de dados está encriptada com uma palavra-passe aleatória. Por favor, altere-a antes de exportar. + A palavra-passe de encriptação da base de dados será atualizada. Por favor armazene a senha de forma segura, você NÃO será capaz de a alterar se a perder. - A senha de encriptação da base de dados será atualizada e armazenada na Keystore. + A palavra-passe de encriptação da base de dados será atualizada e armazenada nas definições. A base de dados será encriptada e a senha armazenada na Keystore. Por favor armazene a senha de forma segura, você NÃO será capaz de aceder às conversas se a perder. Para receber notificações, por favor, digite a senha da base de dados Hosts Onion não serão usados. Hosts Onion serão usados quando disponíveis. - Hosts Onion serão necessários para a conexão. chamada de vídeo (sem encriptação ponta a ponta) chamada de áudio (não encriptada ponta a ponta) chamada de áudio encriptada ponta a ponta @@ -623,12 +621,11 @@ oferecido %s Arquivo de base de dados antigo Hosts Onion serão necessários para a conexão. - Hosts Onion serão usados quando disponíveis. Pode acontecer quando você ou sua conexão usaram o backup de base de dados antigo. encriptado ponta a ponta desligado Ler código QR.]]> - contato não tem encriptação ponta a ponta + o contacto não tem encriptação ponta a ponta oferecido %s: %2s desligado ligado @@ -644,9 +641,8 @@ Para verificar a encriptação de ponta a ponta com o seu contato, compare (ou leia) o código nos seus dispositivos. Ler o código de segurança a partir da aplicação do seu contacto. Ler o código QR do servidor - Hosts Onion não serão usados. encriptação de ponta a ponta de 2 camadas.]]> - contato tem encriptação ponta a ponta + o contacto tem encriptação ponta a ponta sem encriptação ponta a ponta criador meses @@ -685,51 +681,51 @@ Email Isolamento do Transporte terminado - Ferramentas de desenvolvedor + Ferramentos de programador Encriptar Fazer downgrade e abrir chat - Activar TCP manter-vivo + Ativar TCP keep-alive predefinido (%s) Isolamento do Transporte A tentar connectar ao servidor usado para receber mensagens deste contacto. Erro de descodificação IDs das bases de dados e opções de isolamento do Transporte - Downgrade da base de dados - Activar SimpleX Lock + Regressão da base de dados + Ativar SimpleX Lock Editar editado Mensagem temporária Editar imagem - Activar bloqueio - Activar código de acesso auto-destrutivo - Activar auto-destruição + Ativar bloqueio + Ativar código de acesso auto-destrutivo + Ativar auto-destruição Um perfil vazio é criado com o nome fornecido, e a aplicação abre como de costume. - a versão da base de dados é mais recente do que a aplicação, mas sem migração para baixo para: %s - Desaparecerá: %s + a versão da base de dados é mais recente do que a aplicação, mas sem migração de regressão para: %s + Desaparecerá a: %s Eliminar ficheiros e multimédia\? Eliminado a: %s - A autenticação do dispositivo está desactivada. A desligar SimpleX Lock. - A autenticação do dispositivo não está activada. Pode activar o SimpleX Lock através das Definições, depois de activar a autenticação do dispositivo. + A autenticação do dispositivo está desativada. A desligar SimpleX Lock. + A autenticação do dispositivo não está ativa. Pode ativar o SimpleX Lock através das Definições, depois de ativar a autenticação do dispositivo. migração diferente na aplicação/base de dados: %s / %s - Activar chamadas a partir do ecrã de bloqueio através das Definições. + Ativar chamadas a partir do ecrã de bloqueio através das Definições. Encriptar base de dados\? Introduzir o servidor manualmente - Activar a eliminação automática de mensagens\? + Ativar a eliminação automática de mensagens? Editar perfil de grupo Erro de desencriptação O código de acesso é substituído por um código auto-destrutivo. ID da base de dados: %d - Nomes, avatares e isolamento de transporte diferentes. + Nomes, fotos de perfil e isolamento de transporte diferentes. Secundário adicional Realce adicional Fundo - Customizar e partilhar temas de cor. + Personalizar e partilhar temas de cor. Temas personalizados Eliminado a - Desaparecerá - activado - activado para contacto - activado para si + Desaparecerá a + Ativo + ativo para contacto + ativo para si Pesquisar Desativado O teste falhou na etapa %s. @@ -779,4 +775,178 @@ Parar conversa Obrigado aos usuários – contribuam via Weblate! Função lenta + Entrega + As suas preferências + Desconectar dispositivos móveis + %d mensagens bloqueadas pelo administrador + Abrir porta na firewall + A sua privacidade + Ativar (manter sobreposição de grupo) + Abrir ecrã de migração + Erro de servidor do destino: %1$s + Você pode ativar o SimpleX Lock através das Definições. + Eliminar %d mensagens? + Criar perfil de chat + Abrir definições + Contactos + você saiu + você removeu %1$s + encriptação ok + Cancelar mudança de endereço + Você continuará a receber chamadas e notificações de perfis silenciados quando estes estão ativos. + Ativar em conversas diretas (BETA)! + Endereço de computador + Descobrível na rede local + Desktop tem uma versão não suportada. Por favor, confirme que usa a mesma versão em ambos os dispositivos + Desktop tem o código de convite errado + A transferir arquivo + A transferir detalhes de ligação + A criar ligação de arquivo + duplicados(as) + Abrir definições do servidor + O seu perfil de conversa será enviado +\npara o seu contacto + Conectar com %1$s? + Auricular + Dispositivos + Usar a partir de computador na aplicação mobile e ler código QR.]]> + Você enviou um convite de grupo + você mudou o seu cargo para %s + você mudou o endereço para %s + 6 novos idiomas de interface + A versão %s da aplicação de computador não é compatível com esta aplicação. + %s com a razão: %s]]> + O seu perfil %1$s vai ser partilhado. + Transferir + Cancelar + Opções de programador + Ativar + Computador + O seu contacto enviou um ficheiro que é maior que o tamanho máximo suportado atualmente (%1$s). + O seu servidor + O endereço do seu servidor + As tuas chamadas + Não enviar histórico a novos membros. + Você partilhou um caminho de ficheiro inválido. Relate o problema aos programadores da aplicação. + Você não tem conversas + Criar grupo + O seu perfil de conversa será enviado para os membros do grupo + Desktop foi disconectado + Transferência falhada + Desativar notificações + Abir SimpleX Chat para aceitar a chamada + Ativar (manter sobreposições) + Criado em + Ativo para + Os seus contactos podem permitir eliminação total de mensagens. + Desconectado com a razão: %s + Você já solicitou ligação através deste endereço! + Código e protocolo open-source - qualquer indivíduo pode ser anfitrião dos servidores. + %d mensagens bloqueadas + %d mensagens marcadas como eliminadas + Você não pode ser verificado; por favor tente novamente. + contacto eliminado + Cancelar mudança de endereço? + Você convidou este contacto + Corrigir nome para %s? + Descobrir na rede local + Ativar recibos para grupos? + Desativar para todos + Você desbloqueou %s + Você será conectado quando o pedido de ligação for aceite, por favor aguarde ou volte mais tarde! + O seu perfil atual + O seu perfil será armazenado no seu dispositivo e partilhado apenas com os seus contactos. Os servidores SimpleX não conseguem ver o seu perfil. + Você tem que usar a versão mais recente da sua base de dados de conversas em APENAS UM dispositivo, caso contrário poderá deixar de receber mensagens de alguns contactos. + A base de dados será encriptada e a palavra-passe armazenada nas definições. + Você juntou-se a este group. A conectar ao membro que o convidou. + você mudou o cargo de %s para %s + contacto %1$s mudou para %2$s + você mudou de endereço + desativado + Criado em: %s + desativado + Descobrir e juntar a grupos + Dispositivos desktop + Compreendido + errors de desencriptação + Ligações + Criado + Eliminado + Erros de eliminação + Erro de cópia + Criar novo perfil na aplicação de computador. 💻 + Recibos de entrega! + Recibos de entrega desativados! + Não ativar + Você não pode enviar mensagens! + Eliminar e notificar contacto + Eliminar sem notificação + Conversas eliminadas + O seu endereço SimpleX + Os seus contactos + Os seus perfis de conversa + Você pode ver a ligação de convite outra vez nos detalhes da ligação. + A transferir atualização da app, não feche a aplicação + Transferir %s (%s) + Os seus servidores ICE + O seu perfil, contactos e mensagens entregues são armazenados no seu dispositivo. + Os seus servidores ICE + Desativar (manter as sobreposições de grupo) + Desativar (manter sobreposições) + Desativar recibos? + Desativar recibos para grupos? + Ativar para todos + Ativar para todos os grupos + Ativar recibos? + Você rejeitou o convite de grupo + Você juntou-se a este grupo + %d eventos de grupo + encriptação ok para %s + O pedido de ligação vai ser enviado para este membro do grupo. + O contacto foi eliminado. + Você precisa de permitir que o seu contacto inicie chamada de voz para poder iniciar uma chamada de voz. + Escuro + Cores de modo escuro + Modo escuro + Aproximar + Desktop está inativo + Perfil atual + Eliminar base de dados deste dispositivo + Estatísticas detalhadas + Transferido + Ficheiros transferidos + Erros de transferência + Conectar via link? + Criar perfil + A criar ligação… + Contacto eliminado! + Conversa eliminada! + Erro crítico + Nome deste dispositivo + O contacto será eliminado - esta ação é irreversível! + A palavra-passe de encriptação da base de dados será atualizada e armazenada nas definições. + Criar um grupo utilizando um perfil aleatório. + Migração da base de dados em progresso. +\nPode demorar alguns minutos. + Você será conectado quando o dispositivo do seu contacto estiver online, por favor aguarde ou volte mais tarde! + Desconectar + Desativado + Os seus servidores XFTP + Você controla a conversa! + Você poderá ver a conversa com %1$s na lista de conversas. + Os seus servidores SMP + Você pode usar markdown para formatar mensagens: + Você poderá enviar mensagens para %1$s através das conversas Eliminadas. + O seu contacto precisa de estar online para a ligação ser completada. +\nVocê pode cancelar esta ligação e remover o contacto (e tentar mais tarde com uma nova ligação). + Os seus contactos permanecerão conectados. + Você terá que autenticar-se quando iniciar ou abrir a aplicação após 30 segundos em segundo plano. + Ativar acesso à câmara + Você precisa de permitir que o seu contacto envie mensagens de aúdio para poder enviá-las. + Desativar + Desativar para todos os grupos + A tua base de dados de conversas + Detalhes + Você pode partilhar o seu endereço com os seus contactos para permitir que se conectem com %s. + Você pode partilhar o seu endereço como uma ligação ou código QR - qualquer pessoa pode conectar-se a si. \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml index 4c8865f464..7c509a9e1f 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml @@ -193,7 +193,6 @@ Respinge Salvează fraza de acces în setări Salvează și actualizează profilul grupului - Revenire Repetă cererea de alăturare? Repornește conversația salvat diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml index 0e5b329669..11bc35adce 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml @@ -394,7 +394,6 @@ Соединяться с серверами через SOCKS прокси через порт %d? Прокси должен быть запущен до включения этой опции. Использовать прямое соединение с Интернет? Если Вы подтвердите, серверы смогут видеть Ваш IP адрес, а провайдер - с какими серверами Вы соединяетесь. - Обновить настройки .onion хостов? Использовать .onion хосты Когда возможно Нет @@ -403,9 +402,6 @@ Onion хосты не используются. Подключаться только к onion хостам. \nОбратите внимание: Вы не сможете соединиться с серверами, у которых нет .onion адреса. - Onion хосты используются, если возможно. - Onion хосты не используются. - Подключаться только к onion хостам. Интерфейс Создать адрес @@ -831,7 +827,6 @@ Таймаут протокола Интервал PING Включить TCP keep-alive - Отменить изменения Сохранить Обновить настройки сети? Обновление настроек приведет к переподключению клиента ко всем серверам. @@ -1941,4 +1936,22 @@ Рисунок обоев Фон обоев Применить к + Не удается отправить сообщение + Бета + Соединeно + попытки + Готово + Потвердить удаление контакта? + Размытие изображения + Все профили + Проверка на наличиее обновлений + Разрешить звонки? + Звонки запрещены! + Не удается позвонить члену группы + Обновление скачано + звонок + Не удается позвонить контакту + Не удается написать члену группы + Проверка на наличиее обновлений + соединиться \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml index ef020efb54..058f0305a8 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml @@ -665,10 +665,7 @@ การตั้งค่าเครือข่าย จำเป็นต้องมีโฮสต์หัวหอมสำหรับการเชื่อมต่อ ไม่ - จำเป็นต้องมีโฮสต์หัวหอมสำหรับการเชื่อมต่อ - โฮสต์หัวหอมจะถูกใช้เมื่อมี โฮสต์หัวหอมจะไม่ถูกใช้ - โฮสต์หัวหอมจะไม่ถูกใช้ รหัสผ่านที่จะแสดง สายที่ไม่ได้รับ ผู้คนสามารถเชื่อมต่อกับคุณผ่านลิงก์ที่คุณแบ่งปันเท่านั้น @@ -852,7 +849,6 @@ บันทึกและอัปเดตโปรไฟล์กลุ่ม กำลังรับผ่าน รีเซ็ตเป็นค่าเริ่มต้น - เปลี่ยนกลับ บันทึก รีเซ็ตสี ได้รับ, ห้าม @@ -1147,7 +1143,6 @@ ใช้พร็อกซี SOCKS ใช้การเชื่อมต่ออินเทอร์เน็ตโดยตรงหรือไม่\? ใช้พร็อกซี SOCKS หรือไม่\? - อัปเดตการตั้งค่าโฮสต์ .onion ไหม\? ใช้โฮสต์ .onion เมื่อพร้อมใช้งาน อัปเดตโหมดการแยกการขนส่งไหม\? diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml index 1d67d2a0a9..5413afa82b 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml @@ -1145,7 +1145,6 @@ Bağlantı paylaş SimpleX Ekibi %s, %s ve %s bağlandı - Geri al SOCKS VEKİLİ Masaüstür cihazlar SMP sunucuları @@ -1318,14 +1317,12 @@ Kayıt %s te güncellendi Uygulama yeni yerel dosyaları şifreler (videolar dışında). %s , %s de - Bağlantı için Onion ana bilgisayarları gerekli olacaktır. Alıcılar devre dışı bırakılsın mı? Bağlantı yeniden senkronizasyonunu şifrele? Grup ayarlarından ve kişilerden geçersiz kılınmış olabilirler Yeni üyelere geçmiş gönderilmedi. Güvenlik değerlendirmesi Yeniden dene - Onion ana bilgisayarları mümkün olduğunda kullanılacaktır. Sunuculara %d bağlantı noktasındaki vekil SOCKS aracılığıyla erişilsin mi? Vekil bu seçeneği etkinleştirmeden önce başlatılmak zorundadır. İstenmeyen mesajları gizlemek için. Test %s adımında hata yaşandı. @@ -1362,7 +1359,6 @@ Ayarlardaki parola silinsin mi? Alıcılar etkinleştirilsin mi? Yeni bir sohbet başlatmak için tıkla - Onion ana bilgisayarları kullanılmayacaktır. Kişinin engelini kaldır Yönlendirici sunucusu sadece lazım ise kullanılacak. Diğer taraf IP adresini görebilir. %s ın bağlantısı kesildi]]> @@ -1510,7 +1506,6 @@ Telefona bağlandı Bağlanırken takma ada geçiş yap. Mesaj gönderildi! - .onion ana bilgisayarları ayarı güncellensin mi? Yeni bağlantılar için kullan senin için adres değiştirildi SOCKS vekilini kullan? diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml index abdf0dd8e0..7b6087e113 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml @@ -251,7 +251,6 @@ Налаштування мережі Використовувати SOCKS-проксі? Використовувати прямий підключення до Інтернету? - Оновити налаштування .onion-хостів? Використовувати .onion-хости Якщо доступно Ні @@ -640,8 +639,6 @@ Помилка збереження серверів ICE .Onion-хости будуть обов\'язковими для підключення. \nЗверніть увагу: ви не зможете підключитися до серверів без адреси .onion. - Хости .onion будуть використовуватися, якщо доступні. - Хости .onion будуть обов\'язковими для підключення. Показати параметри розробника Ідентифікатори бази даних та опція ізоляції транспорту. Сповіщення перестануть працювати, поки ви не перезапустите додаток @@ -953,7 +950,6 @@ зображення попереднього перегляду посилання скасувати попередній перегляд посилання Налаштування - Хости .onion не будуть використовуватися. Виклик у процесі Помилка бази даних Відновити @@ -997,7 +993,6 @@ ДЛЯ КОНСОЛІ Учасника буде вилучено з групи - цю дію неможливо скасувати! Змінити роль - Відновити Ви все ще отримуватимете дзвінки та сповіщення від приглушених профілів, коли вони активні. %d місяці %dmth diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml index c0b372413d..2a524cbbd8 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml @@ -542,4 +542,19 @@ Tắt đã bị tắt Tin nhắn tự xóa bị cấm trong nhóm này. + gọi + kết nối + Liên hệ sẽ bị xóa - điều này không thể hoàn tác! + Cuộc trò chuyện đã bị xóa! + Làm mờ phương tiện truyền thông + Không thể gọi liên hệ + Cho phép thực hiện cuộc gọi? + Cuộc gọi bị cấm! + Đang kết nối tới liên hệ, xin vui lòng đợi hoặc kiểm tra sau! + Liên hệ đã bị xóa. + Không thể nhắn tin cho thành viên nhóm + Không thể gọi thành viên nhóm + Xác nhận xóa liên hệ? + Liên hệ đã bị xóa! + Đã xóa các cuộc trò chuyện \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml index 92b5f792b1..86fa917d6a 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml @@ -667,7 +667,6 @@ 关闭 连接需要 Onion 主机。 \n请注意:如果没有 .onion 地址,您将无法连接到服务器。 - Onion 主机将在可用时使用。 从不 已提供 %s 已提供 %s:%2s @@ -686,8 +685,6 @@ 没有联系人可添加 网络状态 关闭 - 将不会使用 Onion 主机。 - 连接需要 Onion 主机。 没有收到或发送的文件 发送人已取消文件传输。 分享 @@ -744,7 +741,6 @@ 开始新的聊天 要与您的联系人验证端到端加密,请比较(或扫描)您设备上的代码。 取消静音 - 更新 .onion 主机设置? 更新传输隔离模式? (从剪贴板扫描或粘贴) 保护队列 @@ -829,7 +825,6 @@ 已删除 角色 - 恢复 重置颜色 减少电池使用量 为了保护时区,图像/语音文件使用 UTC。 @@ -1107,10 +1102,10 @@ 最大 1gb 的视频和文件 快速且无需等待发件人在线! 禁止音频/视频通话。 - 您和您的联系人都可以拨打电话。 - 只有您可以拨打电话。 - 只有您的联系人可以拨打电话。 - 允许您的联系人与您进行语音通话。 + 您和您的联系人都可以进行呼叫。 + 只有您可以进行呼叫。 + 只有您的联系人可以进行呼叫。 + 允许联系人呼叫你。 允许通话,前提是你的联系人允许它们。 禁止音频/视频通话。 1分钟 @@ -2000,4 +1995,44 @@ 关闭 轻柔 强烈 + 消息 + 呼叫 + 联系人将被删除 - 无法撤销此操作! + 保留对话 + 只删除对话 + 删除了联系人! + 删除了对话! + 不通知删除 + 你仍可以在聊天列表中查看与 %1$s 的对话。 + 粘贴链接 + 联系人 + 单手用户界面 + 正在连接联系人,请等候或稍后检查! + 联系人被删除了。 + 要能够呼叫联系人,你需要先允许联系人进行呼叫。 + 请让你的联系人启用通话。 + 无法呼叫联系人 + 无法呼叫群成员 + 无法给群成员发消息 + 确认删除联系人? + 连接 + 邀请 + 没有过滤的联系人 + 打开 + 搜索 + 发送消息来开启通话。 + 你仍可以从已删除的聊天给 %1$s 发送消息。 + 已删除的聊天 + 允许通话? + 通话被禁止! + 设置 + 视频 + 消息将被标记为删除。收信人将可以揭示这些消息。 + 删除成员的 %d 条消息吗? + 选择 + 写消息 + 什么也没选中 + 已选中 %d + 将对所有成员删除这些消息。 + 这些消息将对所有成员标记为受管制。 \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml index 21298376d9..5935ea303c 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml @@ -412,8 +412,6 @@ ICE 伺服器(每行一個) 使用 .onion 主機 Onion 主機不會啟用。 - Onion 主機會在可用時啟用。 - Onion 主機不會啟用。 連接 刪除聯絡地址 顏色 @@ -437,7 +435,6 @@ 請確保你的 WebRTC ICE 伺服器地址是正確的格式,每行也有分隔和沒有重複。 使用直接互聯網連接? 如果你確定,你的訊息伺服器能夠看到你的 IP 位置,和你的網路供應商 - 你正在連接到哪些伺服器。 - 更新 .onion 主機設定? 刪除圖片 開始中 … 等待對方回應… @@ -496,7 +493,6 @@ 需要 Onion 主機會在可用時啟用。 - 連接時將需要使用 Onion 主機。 刪除聯絡地址? 你的個人檔案只會儲存於你的裝置和只會分享給你的聯絡人。 SimpleX 伺服器並不會看到你的個人檔案。 儲存並通知你的聯絡人 @@ -825,7 +821,6 @@ 自動銷毀訊息於這個群組內是禁用的。 已提供 %s 儲存群組檔案時出錯 - 恢復 主題 你允許 修改群組內的設定 diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt index 8fe8ecc68a..f6b44f6035 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt @@ -1,9 +1,7 @@ package chat.simplex.common.platform -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.background +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.* @@ -17,8 +15,7 @@ import androidx.compose.ui.input.key.* import androidx.compose.ui.platform.* import androidx.compose.ui.text.* import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.input.KeyboardCapitalization -import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.text.input.* import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import chat.simplex.common.views.chat.* @@ -49,6 +46,7 @@ actual fun PlatformTextField( textStyle: MutableState, showDeleteTextButton: MutableState, userIsObserver: Boolean, + placeholder: String, onMessageChange: (String) -> Unit, onUpArrow: () -> Unit, onFilesPasted: (List) -> Unit, @@ -58,7 +56,7 @@ actual fun PlatformTextField( val focusRequester = remember { FocusRequester() } val focusManager = LocalFocusManager.current val keyboard = LocalSoftwareKeyboardController.current - val padding = PaddingValues(12.dp, 12.dp, 45.dp, 0.dp) + val padding = PaddingValues(0.dp, 12.dp, 50.dp, 0.dp) LaunchedEffect(cs.contextItem) { if (cs.contextItem !is ComposeContextItem.QuotedItem) return@LaunchedEffect // In replying state @@ -169,9 +167,20 @@ actual fun PlatformTextField( CompositionLocalProvider( LocalLayoutDirection provides if (isRtl) LayoutDirection.Rtl else LocalLayoutDirection.current ) { - Column(Modifier.weight(1f).padding(start = 12.dp, end = 32.dp)) { + Column(Modifier.weight(1f).padding(start = 0.dp, end = 50.dp)) { Spacer(Modifier.height(8.dp)) - innerTextField() + TextFieldDefaults.TextFieldDecorationBox( + value = textFieldValue.text, + innerTextField = innerTextField, + placeholder = { Text(placeholder, style = textStyle.value.copy(color = MaterialTheme.colors.secondary)) }, + singleLine = false, + enabled = true, + isError = false, + trailingIcon = null, + interactionSource = remember { MutableInteractionSource() }, + contentPadding = PaddingValues(), + visualTransformation = VisualTransformation.None, + ) Spacer(Modifier.height(10.dp)) } } diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.desktop.kt index 57069a8caa..189f1842dd 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.desktop.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.desktop.kt @@ -35,7 +35,6 @@ actual fun ChatListNavLinkLayout( disabled: Boolean, selectedChat: State, nextChatSelected: State, - oneHandUI: State, ) { var modifier = Modifier.fillMaxWidth() if (!disabled) modifier = modifier diff --git a/cabal.project b/cabal.project index 5f2c823561..c316d93305 100644 --- a/cabal.project +++ b/cabal.project @@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: 03ea151be5dce9a4b8683f9f28805bdc8ba66758 + tag: a76e15fd77d68a09bc43820c1cf6bd1c71700100 source-repository-package type: git diff --git a/package.yaml b/package.yaml index be6d5a808e..095a36371a 100644 --- a/package.yaml +++ b/package.yaml @@ -1,5 +1,5 @@ name: simplex-chat -version: 6.0.0.3 +version: 6.0.0.4 #synopsis: #description: homepage: https://github.com/simplex-chat/simplex-chat#readme diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index 30390eeb9e..69eca4dd5c 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."03ea151be5dce9a4b8683f9f28805bdc8ba66758" = "1gfkqzda6vw3fsd34c08jygwg0m5v211sm7v7jdvj0sx1p8428d4"; + "https://github.com/simplex-chat/simplexmq.git"."a76e15fd77d68a09bc43820c1cf6bd1c71700100" = "07vrjpid03w8f1himhvaaljzspwxxkln814k5kx0yw9hhmabh7zy"; "https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38"; "https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d"; "https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl"; diff --git a/simplex-chat.cabal b/simplex-chat.cabal index ff34640c6e..bd17fd9d64 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -5,7 +5,7 @@ cabal-version: 1.12 -- see: https://github.com/sol/hpack name: simplex-chat -version: 6.0.0.3 +version: 6.0.0.4 category: Web, System, Services, Cryptography homepage: https://github.com/simplex-chat/simplex-chat#readme author: simplex.chat @@ -593,6 +593,7 @@ test-suite simplex-chat-test MessageBatching MobileTests ProtocolTests + RandomServers RemoteTests SchemaDump ValidNames diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 3c634ef0b5..28c141d28a 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -148,8 +148,10 @@ defaultChatConfig = defaultServers = DefaultAgentServers { smp = _defaultSMPServers, + useSMP = 4, ntf = _defaultNtfServers, xftp = L.map (presetServerCfg True) defaultXFTPServers, + useXFTP = L.length defaultXFTPServers, netCfg = defaultNetworkConfig }, tbqSize = 1024, @@ -178,7 +180,13 @@ _defaultSMPServers = L.fromList $ map (presetServerCfg True) - [ "smp://h--vW7ZSkXPeOUpfxlFGgauQmXNFOzGoizak7Ult7cw=@smp15.simplex.im,oauu4bgijybyhczbnxtlggo6hiubahmeutaqineuyy23aojpih3dajad.onion", + [ "smp://0YuTwO05YJWS8rkjn9eLJDjQhFKvIYd8d4xG8X1blIU=@smp8.simplex.im,beccx4yfxxbvyhqypaavemqurytl6hozr47wfc7uuecacjqdvwpw2xid.onion", + "smp://SkIkI6EPd2D63F4xFKfHk7I1UGZVNn6k1QWZ5rcyr6w=@smp9.simplex.im,jssqzccmrcws6bhmn77vgmhfjmhwlyr3u7puw4erkyoosywgl67slqqd.onion", + "smp://6iIcWT_dF2zN_w5xzZEY7HI2Prbh3ldP07YTyDexPjE=@smp10.simplex.im,rb2pbttocvnbrngnwziclp2f4ckjq65kebafws6g4hy22cdaiv5dwjqd.onion", + "smp://1OwYGt-yqOfe2IyVHhxz3ohqo3aCCMjtB-8wn4X_aoY=@smp11.simplex.im,6ioorbm6i3yxmuoezrhjk6f6qgkc4syabh7m3so74xunb5nzr4pwgfqd.onion", + "smp://UkMFNAXLXeAAe0beCa4w6X_zp18PwxSaSjY17BKUGXQ=@smp12.simplex.im,ie42b5weq7zdkghocs3mgxdjeuycheeqqmksntj57rmejagmg4eor5yd.onion", + "smp://enEkec4hlR3UtKx2NMpOUK_K4ZuDxjWBO1d9Y4YXVaA=@smp14.simplex.im,aspkyu2sopsnizbyfabtsicikr2s4r3ti35jogbcekhm3fsoeyjvgrid.onion", + "smp://h--vW7ZSkXPeOUpfxlFGgauQmXNFOzGoizak7Ult7cw=@smp15.simplex.im,oauu4bgijybyhczbnxtlggo6hiubahmeutaqineuyy23aojpih3dajad.onion", "smp://hejn2gVIqNU6xjtGM3OwQeuk8ZEbDXVJXAlnSBJBWUA=@smp16.simplex.im,p3ktngodzi6qrf7w64mmde3syuzrv57y55hxabqcq3l5p6oi7yzze6qd.onion", "smp://ZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M=@smp17.simplex.im,ogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion", "smp://PtsqghzQKU83kYTlQ1VKg996dW4Cw4x_bvpKmiv8uns=@smp18.simplex.im,lyqpnwbs2zqfr45jqkncwpywpbtq7jrhxnib5qddtr6npjyezuwd3nqd.onion", @@ -188,13 +196,7 @@ _defaultSMPServers = (presetServerCfg False) [ "smp://u2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU=@smp4.simplex.im,o5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion", "smp://hpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg=@smp5.simplex.im,jjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion", - "smp://PQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo=@smp6.simplex.im,bylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion", - "smp://0YuTwO05YJWS8rkjn9eLJDjQhFKvIYd8d4xG8X1blIU=@smp8.simplex.im,beccx4yfxxbvyhqypaavemqurytl6hozr47wfc7uuecacjqdvwpw2xid.onion", - "smp://SkIkI6EPd2D63F4xFKfHk7I1UGZVNn6k1QWZ5rcyr6w=@smp9.simplex.im,jssqzccmrcws6bhmn77vgmhfjmhwlyr3u7puw4erkyoosywgl67slqqd.onion", - "smp://6iIcWT_dF2zN_w5xzZEY7HI2Prbh3ldP07YTyDexPjE=@smp10.simplex.im,rb2pbttocvnbrngnwziclp2f4ckjq65kebafws6g4hy22cdaiv5dwjqd.onion", - "smp://1OwYGt-yqOfe2IyVHhxz3ohqo3aCCMjtB-8wn4X_aoY=@smp11.simplex.im,6ioorbm6i3yxmuoezrhjk6f6qgkc4syabh7m3so74xunb5nzr4pwgfqd.onion", - "smp://UkMFNAXLXeAAe0beCa4w6X_zp18PwxSaSjY17BKUGXQ=@smp12.simplex.im,ie42b5weq7zdkghocs3mgxdjeuycheeqqmksntj57rmejagmg4eor5yd.onion", - "smp://enEkec4hlR3UtKx2NMpOUK_K4ZuDxjWBO1d9Y4YXVaA=@smp14.simplex.im,aspkyu2sopsnizbyfabtsicikr2s4r3ti35jogbcekhm3fsoeyjvgrid.onion" + "smp://PQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo=@smp6.simplex.im,bylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion" ] _defaultNtfServers :: [NtfServer] @@ -380,11 +382,31 @@ withFileLock name = withEntityLock name . CLFile useServers :: UserProtocol p => ChatConfig -> SProtocolType p -> [ServerCfg p] -> NonEmpty (ServerCfg p) useServers ChatConfig {defaultServers} p = fromMaybe (cfgServers p defaultServers) . nonEmpty -cfgServers :: UserProtocol p => SProtocolType p -> (DefaultAgentServers -> NonEmpty (ServerCfg p)) +randomServers :: forall p. UserProtocol p => SProtocolType p -> ChatConfig -> IO (NonEmpty (ServerCfg p), [ServerCfg p]) +randomServers p ChatConfig {defaultServers} = do + let srvs = cfgServers p defaultServers + (enbldSrvs, dsbldSrvs) = L.partition (\ServerCfg {enabled} -> enabled) srvs + toUse = cfgServersToUse p defaultServers + if length enbldSrvs <= toUse + then pure (srvs, []) + else do + (enbldSrvs', srvsToDisable) <- splitAt toUse <$> shuffle enbldSrvs + let dsbldSrvs' = map (\srv -> (srv :: ServerCfg p) {enabled = False}) srvsToDisable + srvs' = sortOn server' $ enbldSrvs' <> dsbldSrvs' <> dsbldSrvs + pure (fromMaybe srvs $ L.nonEmpty srvs', srvs') + where + server' ServerCfg {server = ProtoServerWithAuth srv _} = srv + +cfgServers :: UserProtocol p => SProtocolType p -> DefaultAgentServers -> NonEmpty (ServerCfg p) cfgServers p DefaultAgentServers {smp, xftp} = case p of SPSMP -> smp SPXFTP -> xftp +cfgServersToUse :: UserProtocol p => SProtocolType p -> DefaultAgentServers -> Int +cfgServersToUse p DefaultAgentServers {useSMP, useXFTP} = case p of + SPSMP -> useSMP + SPXFTP -> useXFTP + -- enableSndFiles has no effect when mainApp is True startChatController :: Bool -> Bool -> CM' (Async ()) startChatController mainApp enableSndFiles = do @@ -523,7 +545,7 @@ processChatCommand cmd = processChatCommand' :: VersionRangeChat -> ChatCommand -> CM ChatResponse processChatCommand' vr = \case ShowActiveUser -> withUser' $ pure . CRActiveUser - CreateActiveUser NewUser {profile, sameServers, pastTimestamp} -> do + CreateActiveUser NewUser {profile, pastTimestamp} -> do forM_ profile $ \Profile {displayName} -> checkValidName displayName p@Profile {displayName} <- liftIO $ maybe generateRandomProfile pure profile u <- asks currentUser @@ -546,15 +568,13 @@ processChatCommand' vr = \case createPresetContactCards :: User -> CM () createPresetContactCards user = withFastStore $ \db -> do - createContact db user simplexTeamContactProfile createContact db user simplexStatusContactProfile + createContact db user simplexTeamContactProfile chooseServers :: (ProtocolTypeI p, UserProtocol p) => SProtocolType p -> CM (NonEmpty (ServerCfg p), [ServerCfg p]) - chooseServers protocol - | sameServers = - asks currentUser >>= readTVarIO >>= \case - Nothing -> throwChatError CENoActiveUser - Just user -> chosenServers =<< withFastStore' (`getProtocolServers` user) - | otherwise = chosenServers [] + chooseServers protocol = + asks currentUser >>= readTVarIO >>= \case + Nothing -> asks config >>= liftIO . randomServers protocol + Just user -> chosenServers =<< withFastStore' (`getProtocolServers` user) where chosenServers servers = do cfg <- asks config @@ -7914,10 +7934,9 @@ chatCommandP = onOffP = ("on" $> True) <|> ("off" $> False) profileNames = (,) <$> displayName <*> fullNameP newUserP = do - sameServers <- "same_servers=" *> onOffP <* A.space <|> pure False (cName, fullName) <- profileNames let profile = Just Profile {displayName = cName, fullName, image = Nothing, contactLink = Nothing, preferences = Nothing} - pure NewUser {profile, sameServers, pastTimestamp = False} + pure NewUser {profile, pastTimestamp = False} jsonP :: J.FromJSON a => Parser a jsonP = J.eitherDecodeStrict' <$?> A.takeByteString groupProfile = do diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index 18b6c694e4..301ef690a6 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -174,8 +174,10 @@ defaultChatHooks = data DefaultAgentServers = DefaultAgentServers { smp :: NonEmpty (ServerCfg 'PSMP), + useSMP :: Int, ntf :: [NtfServer], xftp :: NonEmpty (ServerCfg 'PXFTP), + useXFTP :: Int, netCfg :: NetworkConfig } diff --git a/src/Simplex/Chat/Core.hs b/src/Simplex/Chat/Core.hs index 07fac82677..a07968654d 100644 --- a/src/Simplex/Chat/Core.hs +++ b/src/Simplex/Chat/Core.hs @@ -105,7 +105,7 @@ createActiveUser cc = do loop = do displayName <- T.pack <$> getWithPrompt "display name" let profile = Just Profile {displayName, fullName = "", image = Nothing, contactLink = Nothing, preferences = Nothing} - execChatCommand' (CreateActiveUser NewUser {profile, sameServers = False, pastTimestamp = False}) `runReaderT` cc >>= \case + execChatCommand' (CreateActiveUser NewUser {profile, pastTimestamp = False}) `runReaderT` cc >>= \case CRActiveUser user -> pure user r -> do ts <- getCurrentTime diff --git a/src/Simplex/Chat/Remote.hs b/src/Simplex/Chat/Remote.hs index 064fcc561e..276baf56e8 100644 --- a/src/Simplex/Chat/Remote.hs +++ b/src/Simplex/Chat/Remote.hs @@ -72,11 +72,11 @@ import UnliftIO.Directory (copyFile, createDirectoryIfMissing, doesDirectoryExis -- when acting as host minRemoteCtrlVersion :: AppVersion -minRemoteCtrlVersion = AppVersion [5, 8, 0, 4] +minRemoteCtrlVersion = AppVersion [6, 0, 0, 4] -- when acting as controller minRemoteHostVersion :: AppVersion -minRemoteHostVersion = AppVersion [5, 8, 0, 4] +minRemoteHostVersion = AppVersion [6, 0, 0, 4] currentAppVersion :: AppVersion currentAppVersion = AppVersion SC.version diff --git a/src/Simplex/Chat/Terminal.hs b/src/Simplex/Chat/Terminal.hs index eb11bb0205..5cc695db04 100644 --- a/src/Simplex/Chat/Terminal.hs +++ b/src/Simplex/Chat/Terminal.hs @@ -39,8 +39,10 @@ terminalChatConfig = "smp://hpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg=@smp5.simplex.im,jjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion", "smp://PQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo=@smp6.simplex.im,bylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion" ], + useSMP = 3, ntf = ["ntf://FB-Uop7RTaZZEG0ZLD2CIaTjsPh-Fw0zFAnb7QyA8Ks=@ntf2.simplex.im,ntg7jdjy2i3qbib3sykiho3enekwiaqg3icctliqhtqcg6jmoh6cxiad.onion"], xftp = L.map (presetServerCfg True) defaultXFTPServers, + useXFTP = L.length defaultXFTPServers, netCfg = defaultNetworkConfig { smpProxyMode = SPMUnknown, diff --git a/src/Simplex/Chat/Types.hs b/src/Simplex/Chat/Types.hs index 93820365b0..fe40fcfcee 100644 --- a/src/Simplex/Chat/Types.hs +++ b/src/Simplex/Chat/Types.hs @@ -124,7 +124,6 @@ data User = User data NewUser = NewUser { profile :: Maybe Profile, - sameServers :: Bool, pastTimestamp :: Bool } deriving (Show) diff --git a/tests/ChatTests/Direct.hs b/tests/ChatTests/Direct.hs index 473d62a8cf..26bc7a54de 100644 --- a/tests/ChatTests/Direct.hs +++ b/tests/ChatTests/Direct.hs @@ -97,7 +97,6 @@ chatDirectTests = do it "create second user" testCreateSecondUser it "multiple users subscribe and receive messages after restart" testUsersSubscribeAfterRestart it "both users have contact link" testMultipleUserAddresses - it "create user with default servers" testCreateUserDefaultServers it "create user with same servers" testCreateUserSameServers it "delete user" testDeleteUser it "users have different chat item TTL configuration, chat items expire" testUsersDifferentCIExpirationTTL @@ -1442,14 +1441,14 @@ testMultipleUserAddresses = cLinkAlisa <- getContactLink alice True bob ##> ("/c " <> cLinkAlisa) alice <#? bob - alice #$> ("/_get chats 2 pcc=on", chats, [("<@bob", ""), ("@SimpleX-Status", ""), ("@SimpleX Chat team", ""), ("*", "")]) + alice #$> ("/_get chats 2 pcc=on", chats, [("<@bob", ""), ("@SimpleX Chat team", ""), ("@SimpleX-Status", ""), ("*", "")]) alice ##> "/ac bob" alice <## "bob (Bob): accepting contact request, you can send messages to contact" concurrently_ (bob <## "alisa: contact is connected") (alice <## "bob (Bob): contact is connected") threadDelay 100000 - alice #$> ("/_get chats 2 pcc=on", chats, [("@bob", lastChatFeature), ("@SimpleX-Status", ""), ("@SimpleX Chat team", ""), ("*", "")]) + alice #$> ("/_get chats 2 pcc=on", chats, [("@bob", lastChatFeature), ("@SimpleX Chat team", ""), ("@SimpleX-Status", ""), ("*", "")]) alice <##> bob bob #> "@alice hey alice" @@ -1480,7 +1479,7 @@ testMultipleUserAddresses = (cath <## "alisa: contact is connected") (alice <## "cath (Catherine): contact is connected") threadDelay 100000 - alice #$> ("/_get chats 2 pcc=on", chats, [("@cath", lastChatFeature), ("@bob", "hey"), ("@SimpleX-Status", ""), ("@SimpleX Chat team", ""), ("*", "")]) + alice #$> ("/_get chats 2 pcc=on", chats, [("@cath", lastChatFeature), ("@bob", "hey"), ("@SimpleX Chat team", ""), ("@SimpleX-Status", ""), ("*", "")]) alice <##> cath -- first user doesn't have cath as contact @@ -1488,39 +1487,6 @@ testMultipleUserAddresses = showActiveUser alice "alice (Alice)" alice @@@ [("@bob", "hey alice")] -testCreateUserDefaultServers :: HasCallStack => FilePath -> IO () -testCreateUserDefaultServers = - testChat2 aliceProfile bobProfile $ - \alice _ -> do - alice #$> ("/smp smp://2345-w==@smp2.example.im smp://3456-w==@smp3.example.im:5224", id, "ok") - alice #$> ("/xftp xftp://2345-w==@xftp2.example.im xftp://3456-w==@xftp3.example.im:5224", id, "ok") - checkCustomServers alice - - alice ##> "/create user alisa" - showActiveUser alice "alisa" - - alice #$> ("/smp", id, "smp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=:server_password@localhost:7001") - alice #$> ("/xftp", id, "xftp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=:server_password@localhost:7002") - - -- with same_servers=off - alice ##> "/user alice" - showActiveUser alice "alice (Alice)" - checkCustomServers alice - - alice ##> "/create user same_servers=off alisa2" - showActiveUser alice "alisa2" - - alice #$> ("/smp", id, "smp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=:server_password@localhost:7001") - alice #$> ("/xftp", id, "xftp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=:server_password@localhost:7002") - where - checkCustomServers alice = do - alice ##> "/smp" - alice <## "smp://2345-w==@smp2.example.im" - alice <## "smp://3456-w==@smp3.example.im:5224" - alice ##> "/xftp" - alice <## "xftp://2345-w==@xftp2.example.im" - alice <## "xftp://3456-w==@xftp3.example.im:5224" - testCreateUserSameServers :: HasCallStack => FilePath -> IO () testCreateUserSameServers = testChat2 aliceProfile bobProfile $ @@ -1529,7 +1495,7 @@ testCreateUserSameServers = alice #$> ("/xftp xftp://2345-w==@xftp2.example.im xftp://3456-w==@xftp3.example.im:5224", id, "ok") checkCustomServers alice - alice ##> "/create user same_servers=on alisa" + alice ##> "/create user alisa" showActiveUser alice "alisa" checkCustomServers alice diff --git a/tests/RandomServers.hs b/tests/RandomServers.hs new file mode 100644 index 0000000000..0c6baa71bb --- /dev/null +++ b/tests/RandomServers.hs @@ -0,0 +1,51 @@ +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE StandaloneDeriving #-} +{-# OPTIONS_GHC -Wno-orphans #-} + +module RandomServers where + +import Control.Monad (replicateM) +import qualified Data.List.NonEmpty as L +import Simplex.Chat (cfgServers, cfgServersToUse, defaultChatConfig, randomServers) +import Simplex.Chat.Controller (ChatConfig (..)) +import Simplex.Messaging.Agent.Env.SQLite (ServerCfg (..)) +import Simplex.Messaging.Protocol (ProtoServerWithAuth (..), SProtocolType (..), UserProtocol) +import Test.Hspec + +randomServersTests :: Spec +randomServersTests = describe "choosig random servers" $ do + it "should choose 4 random SMP servers and keep the rest disabled" testRandomSMPServers + it "should keep all 6 XFTP servers" testRandomXFTPServers + +deriving instance Eq (ServerCfg p) + +testRandomSMPServers :: IO () +testRandomSMPServers = do + [srvs1, srvs2, srvs3] <- + replicateM 3 $ + checkEnabled SPSMP 4 False =<< randomServers SPSMP defaultChatConfig + (srvs1 == srvs2 && srvs2 == srvs3) `shouldBe` False -- && to avoid rare failures + +testRandomXFTPServers :: IO () +testRandomXFTPServers = do + [srvs1, srvs2, srvs3] <- + replicateM 3 $ + checkEnabled SPXFTP 6 True =<< randomServers SPXFTP defaultChatConfig + (srvs1 == srvs2 && srvs2 == srvs3) `shouldBe` True + +checkEnabled :: UserProtocol p => SProtocolType p -> Int -> Bool -> (L.NonEmpty (ServerCfg p), [ServerCfg p]) -> IO [ServerCfg p] +checkEnabled p n allUsed (srvs, _) = do + let def = defaultServers defaultChatConfig + cfgSrvs = L.sortWith server' $ cfgServers p def + toUse = cfgServersToUse p def + srvs == cfgSrvs `shouldBe` allUsed + L.map enable srvs `shouldBe` L.map enable cfgSrvs + let enbldSrvs = L.filter (\ServerCfg {enabled} -> enabled) srvs + toUse `shouldBe` n + length enbldSrvs `shouldBe` n + pure enbldSrvs + where + server' ServerCfg {server = ProtoServerWithAuth srv _} = srv + enable :: forall p. ServerCfg p -> ServerCfg p + enable srv = (srv :: ServerCfg p) {enabled = False} diff --git a/tests/Test.hs b/tests/Test.hs index cbe8b627ec..3d59b840dd 100644 --- a/tests/Test.hs +++ b/tests/Test.hs @@ -10,6 +10,7 @@ import MarkdownTests import MessageBatching import MobileTests import ProtocolTests +import RandomServers import RemoteTests import SchemaDump import Test.Hspec hiding (it) @@ -30,6 +31,7 @@ main = do around tmpBracket $ describe "WebRTC encryption" webRTCTests describe "Valid names" validNameTests describe "Message batching" batchingTests + describe "Random servers" randomServersTests around testBracket $ do describe "Mobile API Tests" mobileTests describe "SimpleX chat client" chatTests diff --git a/website/langs/de.json b/website/langs/de.json index 7dec07e8e9..c8d58d0343 100644 --- a/website/langs/de.json +++ b/website/langs/de.json @@ -18,62 +18,62 @@ "simplex-explained-tab-2-p-2": "Die Server leiten Nachrichten immer nur in eine Richtung weiter, ohne den vollständigen Verlauf der Nutzer-Unterhaltung oder seiner Verbindungen zu kennen.", "simplex-explained-tab-3-p-1": "Die Server nutzen für jede Warteschlange separate, anonyme Anmeldeinformationen und wissen nicht welchem Nutzer diese gehören.", "simplex-explained-tab-3-p-2": "Durch die Verwendung von Tor-Zugangsservern können Nutzer ihre Metadaten-Privatsphäre weiter verbessern und Korellationen von IP-Adressen verhindern.", - "smp-protocol": "SMP Protokoll", + "smp-protocol": "SMP-Protokoll", "chat-bot-example": "Beispiel für einen Chatbot", "donate": "Spenden", - "copyright-label": "© 2020-2024 SimpleX | Open-Source Projekt", - "chat-protocol": "Chat Protokoll", - "simplex-chat-protocol": "SimpleX Chat Protokoll", - "terminal-cli": "Terminal Kommandozeilen-Schnittstelle", + "copyright-label": "© 2020-2024 SimpleX | Open-Source-Projekt", + "chat-protocol": "Chat-Protokoll", + "simplex-chat-protocol": "SimpleX-Chat-Protokoll", + "terminal-cli": "Terminal-Kommandozeilen-Schnittstelle", "terms-and-privacy-policy": "Datenschutzrichtlinie", "hero-header": "Privatsphäre neu definiert", "hero-overlay-2-textlink": "Wie funktioniert SimpleX?", "hero-subheader": "Der erste Messenger
ohne Nutzerkennungen", "hero-p-1": "Andere Apps haben Nutzerkennungen: Signal, Matrix, Session, Briar, Jami, Cwtch usw.
SimpleX arbeitet ohne diese, nicht einmal mit Zufallszahlen.
Dies steigert die Privatsphäre ungemein.", "hero-overlay-1-textlink": "Warum sind Nutzerkennungen schlecht für die Privatspäre?", - "hero-overlay-2-title": "Warum Benutzerkennungen schlecht für die Privatsphäre sind?", + "hero-overlay-2-title": "Warum sind Benutzerkennungen schlecht für die Privatsphäre?", "hero-2-header": "Aufbau einer privaten Verbindung", "hero-overlay-1-title": "Wie funktioniert SimpleX?", "hero-2-header-desc": "Das Video zeigt Ihnen, wie Sie sich mit einem Kontakt mit dessen Einmal-QR-Code persönlich oder per Videotreff verbinden. Sie können sich auch über einen geteilten Einladungslink miteinander verbinden.", - "feature-2-title": "Ende-zu-Ende verschlüsselte
Bilder, Videos und Dateien", - "feature-4-title": "Ende-zu-Ende verschlüsselte Sprachnachrichten", - "feature-1-title": "Ende-zu-Ende verschlüsselte Nachrichten mit Markdowns und Bearbeitungsmöglichkeiten", - "feature-3-title": "Ende-zu-Ende verschlüsselte dezentralisierte Gruppen — Nur die Nutzer wissen, dass diese überhaupt existieren", + "feature-2-title": "Ende-zu-Ende-verschlüsselte
Bilder, Videos und Dateien", + "feature-4-title": "Ende-zu-Ende-verschlüsselte Sprachnachrichten", + "feature-1-title": "Ende-zu-Ende-verschlüsselte Nachrichten mit Markdowns und Bearbeitungsmöglichkeiten", + "feature-3-title": "Ende-zu-Ende-verschlüsselte dezentralisierte Gruppen — Nur die Nutzer wissen, dass diese überhaupt existieren", "simplex-private-8-title": "Mischen von Nachrichten,
um Korrelationen zu reduzieren", "feature-5-title": "Verschwindende geheime Unterhaltungen", - "feature-6-title": "Ende-zu-Ende verschlüsselte Sprach- und Videoanrufe", + "feature-6-title": "Ende-zu-Ende-verschlüsselte Sprach- und Videoanrufe", "feature-7-title": "Portable und verschlüsselte App-Datenspeicherung — verschieben Sie das komplette Profil einfach auf ein anderes Gerät", "feature-8-title": "Inkognito-Modus —
Einzigartig in SimpleX Chat", "simplex-network-overlay-1-title": "Vergleich mit P2P Nachrichten-Protokollen", - "simplex-private-1-title": "Zwei Schichten der
Ende-zu-Ende Verschlüsselung", + "simplex-private-1-title": "Zwei Schichten der
Ende-zu-Ende-Verschlüsselung", "simplex-private-2-title": "Zusätzliche Schicht der
Server-Verschlüsselung", "simplex-private-3-title": "Sichere authentifizierte
TLS-Transportschicht", "simplex-private-4-title": "Optionaler
Zugang per Tor", "simplex-private-5-title": "Mehrere Schichten der
Inhalteauffüllung", - "simplex-private-7-title": "Nachrichten-Integrität
Überprüfung", - "simplex-private-6-title": "Out-of-Band
Schlüsselaustausch", + "simplex-private-7-title": "Nachrichten-Integritäts-
Überprüfung", + "simplex-private-6-title": "Out-of-Band-
Schlüsselaustausch", "simplex-private-9-title": "Unidirektionale
Nachrichten-Warteschlangen", "simplex-private-10-title": "Temporäre, anonyme paarweise Kennungen", - "simplex-private-card-1-point-1": "Doppeltes-Ratchet Protokoll —
Off-the-Record Nachrichten mit Perfect Forward Secrecy und Einbruchserholung.", - "simplex-private-card-1-point-2": "NaCL Kryptobox in jeder Warteschlange, um eine Korrelation des Datenverkehrs zwischen Nachrichtenwarteschlangen zu verhindern, falls TLS kompromittiert wurde.", + "simplex-private-card-1-point-1": "Double-Ratchet-Protokoll —
Off-the-Record-Nachrichten mit Perfect Forward Secrecy und Einbruchsresistenz.", + "simplex-private-card-1-point-2": "NaCL-Kryptobox in jeder Warteschlange, um eine Korrelation des Datenverkehrs zwischen Nachrichtenwarteschlangen zu verhindern, falls TLS kompromittiert wurde.", "simplex-private-card-3-point-1": "Für Client-Server-Verbindungen wird nur TLS 1.2/1.3 mit starken Algorithmen verwendet.", "simplex-private-card-2-point-1": "Zusätzliche Server-Verschlüsselungs-Schicht für die Zustellung an den Empfänger, um eine Korrelation zwischen empfangenen und gesendeten Server-Daten zu vermeiden, falls TLS kompromittiert wurde.", "simplex-private-card-3-point-2": "Server-Fingerabdrücke und Kanalbindung verhindern MITM- und Replay-Angriffe.", "simplex-private-card-3-point-3": "Die Wiederaufnahme von Verbindungen ist deaktiviert, um Sitzungs-Angriffe zu verhindern.", "simplex-private-card-4-point-1": "Um Ihre IP-Adresse zu schützen, können Sie per Tor oder irgendeinem anderen Transportschichten-Netzwerk auf Server zugreifen.", - "simplex-private-card-4-point-2": "Um SimpleX per Tor zu nutzen, installieren Sie unter Android bitte die Orbot App und aktivieren Sie den SOCKS5 Proxy oder unter iOS per VPN.", + "simplex-private-card-4-point-2": "Um SimpleX per Tor zu nutzen, installieren Sie unter Android bitte die Orbot-App und aktivieren Sie den SOCKS5-Proxy oder unter iOS per VPN.", "simplex-private-card-5-point-1": "SimpleX nutzt Inhalte-Auffüllung für jede Verschlüsselungs-Schicht, um Angriffe auf die Nachrichtengröße zu vereiteln.", "simplex-private-card-5-point-2": "Erzeugt Nachrichten mit unterschiedlichen Größen, die für Server und Netzwerk-Beobachter identisch aussehen.", - "simplex-private-card-6-point-1": "Viele Kommunikations-Plattformen sind für MITM-Angriffe durch Server oder Netzwerk-Provider anfällig.", + "simplex-private-card-6-point-1": "Viele Kommunikations-Plattformen sind für MITM-Angriffe durch Server oder Netzwerk-Anbieter anfällig.", "simplex-private-card-9-point-1": "Jede Nachrichten-Warteschlange leitet Nachrichten mit unterschiedlichen Sende- und Empfängeradressen jeweils nur in einer Richtung weiter.", - "simplex-private-card-9-point-2": "Verglichen mit traditionellen Nachrichten-Brokern, werden mögliche Angriffs-Vektoren und vorhandene Meta-Daten reduziert.", + "simplex-private-card-9-point-2": "Verglichen mit traditionellen Nachrichten-Brokern, werden mögliche Angriffs-Vektoren und vorhandene Metadaten reduziert.", "simplex-private-card-10-point-1": "SimpleX nutzt für jeden Nutzer-Kontakt oder jedes Gruppenmitglied eigene temporäre, anonyme und paarweise Adressen und Berechtigungsnachweise.", "simplex-private-card-10-point-2": "SimpleX erlaubt es, Nachrichten ohne Nutzerprofil-Bezeichner zu versenden und bietet dabei bessere Metadaten-Privatsphäre an als andere Alternativen.", - "simplex-unique-4-title": "Sie besitzen das SimpleX Netzwerk", + "simplex-unique-4-title": "Sie besitzen das SimpleX-Netzwerk", "privacy-matters-1-title": "Werbung und Preisdiskriminierung", - "privacy-matters-1-overlay-1-title": "Privatsphäre sichert Ihnen Geld", - "privacy-matters-2-overlay-1-title": "Privatsphäre gibt Ihnen Kraft", - "privacy-matters-1-overlay-1-linkText": "Privatsphäre sichert Ihnen Geld", + "privacy-matters-1-overlay-1-title": "Privatsphäre spart Ihnen Geld", + "privacy-matters-2-overlay-1-title": "Privatsphäre gibt Ihnen Macht", + "privacy-matters-1-overlay-1-linkText": "Privatsphäre spart Ihnen Geld", "privacy-matters-2-overlay-1-linkText": "Privatsphäre gibt Ihnen Kraft", "privacy-matters-3-title": "Strafverfolgung wegen einer harmlosen Verbindung", "privacy-matters-3-overlay-1-title": "Privatsphäre schützt Ihre Freiheit", @@ -81,27 +81,27 @@ "privacy-matters-3-overlay-1-linkText": "Privatsphäre schützt Ihre Freiheit", "simplex-unique-1-title": "Sie erhalten eine vollumfängliche Privatsphäre", "simplex-unique-1-overlay-1-title": "Komplette Privatsphäre für Ihre Identität, ihr Profil, Ihre Kontakte und Metadaten", - "simplex-unique-2-title": "Sie sind geschützt vor
SPAM und Missbrauch", - "simplex-unique-2-overlay-1-title": "Der beste Schutz vor SPAM und Missbrauch", + "simplex-unique-2-title": "Sie sind geschützt vor
Spam und Missbrauch", + "simplex-unique-2-overlay-1-title": "Der beste Schutz vor Spam und Missbrauch", "simplex-unique-3-title": "Sie haben die Kontrolle über Ihre Daten", "simplex-unique-3-overlay-1-title": "Besitz, Kontrolle und Sicherheit Ihrer Daten", - "simplex-unique-4-overlay-1-title": "Voll dezentralisiert — Die Nutzer besitzen das SimpleX Netzwerk", - "hero-overlay-card-1-p-1": "Viele Nutzer fragen:Woher weiß SimpleX, an wenn es Nachrichten versenden muss, wenn es keine Benutzerkennungen gibt?", + "simplex-unique-4-overlay-1-title": "Voll dezentralisiert — Die Nutzer besitzen das SimpleX-Netzwerk", + "hero-overlay-card-1-p-1": "Viele Nutzer fragen:Woher weiß SimpleX, an wen es Nachrichten versenden muss, wenn es keine Benutzerkennungen gibt?", "simplex-private-card-7-point-1": "Um die Integrität von Nachrichten sicherzustellen, werden sie sequentiell durchnummeriert und beinhalten den Hash der vorhergehenden Nachricht.", "simplex-private-card-7-point-2": "Der Empfänger wird alarmiert, sobald eine Nachricht ergänzt, entfernt oder verändert wird.", - "simplex-private-card-8-point-1": "Die SimpleX Server arbeiten als Mix-Knoten mit geringer Verzögerung — eingehende und ausgehende Nachrichten haben eine unterschiedliche Reihenfolge.", + "simplex-private-card-8-point-1": "Die SimpleX-Server arbeiten als Mix-Knoten mit geringer Verzögerung — eingehende und ausgehende Nachrichten haben eine unterschiedliche Reihenfolge.", "hero-overlay-card-1-p-3": "Sie definieren, welche(n) Server Sie für den Empfang von Nachrichten nutzen. Ihre Kontakte — nutzen diese Server, um ihnen Nachrichten darüber zu senden. Jede Konversation nutzt üblicherweise also zwei unterschiedliche Server.", - "hero-overlay-card-1-p-5": "Die Benutzer-Profile, Kontakte und Gruppen werden nur auf den Endgerät des Nutzers gespeichert. Die Nachrichten werden mit einer 2-Schichten Ende-zu-Ende Verschlüsselung versendet.", - "hero-overlay-card-1-p-6": "Lesen Sie mehr darüber im SimpleX Whitepaper.", + "hero-overlay-card-1-p-5": "Die Benutzer-Profile, Kontakte und Gruppen werden nur auf den Endgerät des Nutzers gespeichert. Die Nachrichten werden mit einer 2-Schichten-Ende-zu-Ende-Verschlüsselung versendet.", + "hero-overlay-card-1-p-6": "Lesen Sie mehr darüber im SimpleX-Whitepaper.", "hero-overlay-card-2-p-2": "Sie können diese Informationen mit bestehenden öffentlichen sozialen Netzwerken korrelieren und damit wahre Identitäten herausfinden.", - "hero-overlay-card-2-p-3": "Wenn Sie sich mit zwei unterschiedlichen Kontakten über das selbe Profil unterhalten, können sie, selbst bei sehr auf Privatsphäre achtenden Apps, die Tor v3 Dienste nutzen, feststellen, dass diese Kontakte mit der selben Person verbunden sind.", - "hero-overlay-card-1-p-2": "Um Nachrichten auszuliefern, nutzt SimpleX statt Benutzerkennungen wie auf allen anderen Plattformen, temporäre, anonyme und paarweise Kennungen für Nachrichten-Warteschlangen, die für jede Ihrer Verbindungen unterschiedlich sind — Es gibt keinerlei Langzeit-Kennungen.", + "hero-overlay-card-2-p-3": "Wenn Sie sich mit zwei unterschiedlichen Kontakten über dasselbe Profil unterhalten, können sie, selbst bei sehr auf Privatsphäre bedachten Apps, die Tor-v3-Dienste nutzen, feststellen, dass diese Kontakte mit derselben Person verbunden sind.", + "hero-overlay-card-1-p-2": "Um Nachrichten auszuliefern, nutzt SimpleX statt Benutzerkennungen wie auf allen anderen Plattformen temporäre, anonyme und paarweise Kennungen für Nachrichten-Warteschlangen, die für jede Ihrer Verbindungen unterschiedlich sind — Es gibt keinerlei Langzeit-Kennungen.", "hero-overlay-card-1-p-4": "Dieses Design verhindert schon auf der Applikations-Ebene Datenlecks für jegliche Benutzer'Metadaten. Sie können sich über Tor mit Nachrichten-Servern verbinden, um Ihre Privatsphäre weiter zu verbessern und die von Ihnen genutzte IP-Adresse zu schützen.", "hero-overlay-card-2-p-1": "Wenn Nutzer dauerhafte Identitäten besitzen, selbst wenn diese eine Zufallsnummer, wie eine Sitzungs-ID, ist, besteht ein Risiko, das Provider oder Angreifer feststellen können, wie Nutzer miteinander verbunden sind und wie viele Nachrichten sie versenden.", "hero-overlay-card-2-p-4": "SimpleX schützt gegen solche Angriffe, weil es vom Design her keinerlei Benutzerkennungen besitzt. Und Sie haben sogar unterschiedliche Anzeigenamen für jeden Kontakt und vermeiden jegliche geteilte Daten zwischen diesen, wenn Sie den Inkognito-Modus nutzen.", "simplex-network-overlay-card-1-p-1": "Peer-to-Peer-Nachrichten-Protokolle und -Applikationen haben verschiedene Probleme, die diese weniger vertrauenswürdig, die Analyse wesentlich komplexer und anfälliger gegen verschiedene Arten von Angriffen, als bei SimpleX machen.", "simplex-network-overlay-card-1-li-2": "Das SimpleX Design hat, im Gegensatz zu den meisten P2P-Netzwerken, keinerlei globalen Benutzerkennungen, auch keine temporären. Es nutzt ausschließlich temporäre paarweise Kennungen, die bessere Anonymität und Metadaten-Schutz bieten.", - "simplex-network-overlay-card-1-li-4": "P2P-Implementierungen können durch Internet-Provider blockiert werden, wie beispielweise BitTorrent). SimpleX ist transportunabhängig - es kann über Standard-Web-Protokolle, wie beispielsweise WebSockets, arbeiten.", + "simplex-network-overlay-card-1-li-4": "P2P-Implementierungen können durch Internetanbieter blockiert werden, wie beispielweise BitTorrent). SimpleX ist transportunabhängig – es kann über Standard-Web-Protokolle, wie beispielsweise WebSockets, arbeiten.", "simplex-network-overlay-card-1-li-6": "P2P-Netzwerke können anfällig für DRDoS-Angriffe sein, wenn die Clients den Datenverkehr erneut senden und verstärken können, was zu einem netzwerkweiten Denial-of-Service führt. SimpleX-Clients leiten nur Datenverkehr von bekannten Verbindungen weiter und können von einem Angreifer nicht dazu verwendet werden, den Datenverkehr im gesamten Netzwerk zu verstärken.", "privacy-matters-overlay-card-1-p-1": "Viele große Unternehmen nutzen Informationen, mit wem Sie in Verbindung stehen, um Ihr Einkommen zu schätzen, Ihnen Produkte zu verkaufen, die Sie nicht wirklich benötigen und um die Preise zu bestimmen.", "privacy-matters-overlay-card-1-p-2": "Online-Händler wissen, dass Menschen mit geringerem Einkommen eher dringende Einkäufe tätigen, sodass sie möglicherweise höhere Preise verlangen können oder Rabatte streichen.", @@ -131,28 +131,28 @@ "learn-more": "Erfahren Sie mehr darüber", "more-info": "Weitere Informationen", "hide-info": "Informationen verbergen", - "contact-hero-subheader": "Scannen Sie den QR-Code mit der SimpleX Chat-Applikation auf Ihrem Mobilgerät oder Tablet.", - "contact-hero-p-2": "Bisher SimpleX Chat noch nicht herunter geladen?", + "contact-hero-subheader": "Scannen Sie den QR-Code mit der SimpleX-Chat-Applikation auf Ihrem Mobilgerät oder Tablet.", + "contact-hero-p-2": "SimpleX Chat noch nicht heruntergeladen?", "scan-qr-code-from-mobile-app": "Scannen Sie den QR-Code aus der mobilen Applikation", - "install-simplex-app": "Installieren Sie die SimpleX Applikation", + "install-simplex-app": "Installieren Sie die SimpleX-App", "connect-in-app": "Verbinden Sie sich in der Applikation", - "open-simplex-app": "Öffnen Sie die SimpleX Applikation", + "open-simplex-app": "Öffnen Sie die SimpleX-App", "scan-the-qr-code-with-the-simplex-chat-app-description": "Die öffentlichen Schlüssel und die Adresse der Nachrichtenwarteschlange in diesem Link werden NICHT über das Netzwerk gesendet, wenn Sie diese Seite aufrufen —
sie sind in dem Hash-Fragment der Link-URL enthalten.", "installing-simplex-chat-to-terminal": "Installation von SimpleX-Chat im Terminal", "use-this-command": "Benutzen Sie dieses Kommando:", "see-simplex-chat": "Siehe SimpleX-Chat", - "github-repository": "GitHub Repository", - "the-instructions--source-code": "Die Anleitung, wie Sie es herunter laden und aus dem Quellcode kompilieren.", + "github-repository": "GitHub-Repository", + "the-instructions--source-code": "Die Anleitung, wie Sie es herunterladen und aus dem Quellcode kompilieren.", "if-you-already-installed": "Wenn Sie es schon installiert haben", "simplex-chat-for-the-terminal": "SimpleX Chat für das Terminal", "privacy-matters-section-header": "Warum es auf Privatsphäre ankommt", "privacy-matters-section-label": "Stellen Sie sicher, dass Ihr Messenger keinen Zugriff auf Ihre Daten hat!", "tap-to-close": "Zum Schließen drücken", - "simplex-network-section-header": "SimpleX Netzwerk", + "simplex-network-section-header": "SimpleX-Netzwerk", "simplex-network-1-header": "Im Gegensatz zu P2P-Netzwerken", "simplex-network-1-desc": "Alle Nachrichten werden über Server versandt, was sowohl einen besseren Schutz der Metadaten als auch eine zuverlässigere asynchrone Nachrichtenübermittlung ermöglicht und dabei Vieles vermeidet", "simplex-network-1-overlay-linktext": "Probleme von P2P-Netzwerken", - "simplex-network-2-desc": "Simple X-Relay-Server speichern KEINE Benutzerprofile, Kontakte und zugestellte Nachrichten und stellen KEINE Verbindungen untereinander her und es gibt KEIN Serververzeichnis.", + "simplex-network-2-desc": "SimpleX-Relay-Server speichern KEINE Benutzerprofile, Kontakte und zugestellte Nachrichten und stellen KEINE Verbindungen untereinander her, und es gibt KEIN Serververzeichnis.", "simplex-network-3-header": "SimpleX-Netzwerk", "comparison-section-header": "Vergleich mit anderen Protokollen", "protocol-1-text": "Signal, große Plattformen", @@ -164,28 +164,28 @@ "comparison-point-4-text": "Einzelnes oder zentralisiertes Netzwerk", "yes": "Ja", "no": "Nein", - "no-private": "Nein - vertraulich", - "no-secure": "Nein - sicher", - "no-resilient": "Nein - widerstandsfähig", - "no-federated": "Nein - föderiert", + "no-private": "Nein – vertraulich", + "no-secure": "Nein – sicher", + "no-resilient": "Nein – widerstandsfähig", + "no-federated": "Nein – föderiert", "comparison-section-list-point-2": "DNS-basierte Adressen", "comparison-section-list-point-3": "Öffentlicher Schlüssel oder eine andere weltweit eindeutige ID", - "comparison-section-list-point-4": "Wenn die Server des Betreibers kompromittiert werden. In Signal und weiteren Apps kann der Securitycode überprüft werden, um dies zu entschärfen", + "comparison-section-list-point-4": "Wenn die Server des Betreibers kompromittiert werden. In Signal und weiteren Apps kann der Sicherheitscode überprüft werden, um dies zu entschärfen", "comparison-section-list-point-6": "P2P sind zwar verteilt, aber nicht föderiert - sie arbeiten als ein einziges Netzwerk", "comparison-section-list-point-7": "P2P-Netzwerke haben entweder eine zentrale Verwaltung oder das gesamte Netzwerk kann kompromittiert werden", "see-here": "Siehe hier", "simplex-unique-card-4-p-1": "Das SimpleX-Netzwerk ist vollständig dezentralisiert und unabhängig von Kryptowährungen oder anderen Plattformen außer dem Internet.", "unique": "einmalig", "privacy-matters-overlay-card-2-p-1": "Vor nicht allzu langer Zeit beobachteten wir, wie große Wahlen von einem angesehenen Beratungsunternehmen manipuliert wurden, welches unsere sozialen Graphen nutzte, um unsere Sicht auf die reale Welt zu verzerren und unsere Stimmen zu manipulieren.", - "privacy-matters-overlay-card-3-p-2": "Eine der schockierendsten Geschichten ist die Erfahrung von Mohamedou Ould Salahi, welche in seinen Memoiren beschrieben und im Film \"The Mauritanian\" gezeigt wird. Er kam nach einem Anruf bei seinen Verwandten in Afghanistan und ohne Gerichtsverfahren in das Guantanamo-Lager und wurde dort einige Jahre lang gefoltert, weil er verdächtigt wurde, an den 9/11-Angriffen beteiligt gewesen zu sein, obwohl er die vorhergehenden 10 Jahre in Deutschland gelebt hatte.", + "privacy-matters-overlay-card-3-p-2": "Eine der schockierendsten Geschichten ist die Erfahrung von Mohamedou Ould Salahi, welche in seinen Memoiren beschrieben und im Film „The Mauritanian“ gezeigt wird. Er kam nach einem Anruf bei seinen Verwandten in Afghanistan und ohne Gerichtsverfahren in das Guantanamo-Lager und wurde dort einige Jahre lang gefoltert, weil er verdächtigt wurde, an den 9/11-Angriffen beteiligt gewesen zu sein, obwohl er die vorhergehenden 10 Jahre in Deutschland gelebt hatte.", "simplex-unique-overlay-card-1-p-1": "Im Gegensatz zu anderen Nachrichten-Plattformen weist SimpleX den Benutzern keine Kennungen zu. Es verlässt sich nicht auf Telefonnummern, domänenbasierte Adressen (wie E-Mail oder XMPP), Benutzernamen, öffentliche Schlüssel oder sogar Zufallszahlen, um seine Benutzer zu identifizieren — Wir wissen nicht, wie viele Personen unsere SimpleX-Server verwenden.", "simplex-unique-overlay-card-1-p-2": "Um Nachrichten auszuliefern nutzt SimpleX paarweise anonyme Adressen aus unidirektionalen Nachrichten-Warteschlangen, die für empfangene und gesendete Nachrichten separiert sind und gewöhnlich über verschiedene Server gesendet werden. Die Nutzung von SimpleX entspricht der Nutzung von unterschiedlichen Mailservern oder Telefonen für jeden einzelnen Kontakt und vermeidet dabei eine mühsame Verwaltung.", "simplex-network-overlay-card-1-li-5": "Alle bekannten P2P-Netzwerke können anfällig für Sybil-Angriffe sein, da jeder Knoten ermittelbar ist und das Netzwerk als Ganzes funktioniert. Bekannte Maßnahmen zur Verhinderung erfordern entweder eine zentralisierte Komponente oder einen teuren Ausführungsnachweis. Das SimpleX-Netzwerk bietet keine Ermittlung der Server, ist fragmentiert und arbeitet mit mehreren isolierten Subnetzwerken, wodurch netzwerkweite Angriffe unmöglich werden.", "simplex-network-overlay-card-1-li-3": "P2P löst nicht das Problem des MITM-Angriffs und die meisten bestehenden Implementierungen nutzen für den initialen Schlüsselaustausch keine Out-of-Band-Nachrichten. Im Gegensatz hierzu nutzt SimpleX für den initialen Schlüsselaustausch Out-of-Band-Nachrichten oder zum Teil schon bestehende sichere und vertrauenswürdige Verbindungen.", - "tap-the-connect-button-in-the-app": "Drücken Sie die ‘Verbinden’ Taste in der Applikation", + "tap-the-connect-button-in-the-app": "Drücken Sie die „Verbinden“-Taste in der Applikation", "to-make-a-connection": "Um eine Verbindung zu starten:", "contact-hero-p-3": "Nutzen Sie die unten genannten Links, um die Applikation herunterzuladen.", - "scan-the-qr-code-with-the-simplex-chat-app": "Scannen Sie den QR-Code mit der SimpleX Chat-Applikation", + "scan-the-qr-code-with-the-simplex-chat-app": "Scannen Sie den QR-Code mit der SimpleX-Chat-Applikation", "copy-the-command-below-text": "Kopieren Sie sich das unten genannte Kommando und nutzen Sie es im Chat:", "privacy-matters-section-subheader": "Die Wahrung der Privatsphäre Ihrer Metadaten — mit wem Sie wann Kontakt haben — schützt Sie vor:", "simplex-private-section-header": "Was macht SimpleX vertraulich", @@ -193,17 +193,17 @@ "simplex-network-2-header": "Im Gegensatz zu föderierten Netzwerken", "comparison-section-list-point-1": "Normalerweise auf der Grundlage einer Telefonnummer, in einigen Fällen auf der Grundlage von Benutzernamen", "comparison-point-5-text": "Zentrale Komponente oder andere Netzwerk-weite Angriffe", - "no-decentralized": "Nein - dezentralisiert", + "no-decentralized": "Nein – dezentralisiert", "comparison-section-list-point-5": "Die Privatsphäre-Metadaten des Nutzers werden nicht geschützt", - "simplex-network-overlay-card-1-li-1": "P2P-Netzwerke vertrauen auf Varianten von DHT, um Nachrichten zu routen. DHT-Designs müssen zwischen Zustellungsgarantie und Latenz ausgleichen. Verglichen mit P2P bietet SimpleX sowohl eine bessere Zustellungsgarantie, als auch eine niedrigere Latenz, weil eine Nachricht redundant und parallel über mehrere Server gesendet werden kann, wobei die durch den Empfänger ausgewählten Server genutzt werden. In P2P-Netzwerken werden Nachrichten sequentiell über O(log N) Knoten gesendet, wobei die Knoten durch einen Algorithmus ausgewählt werden.", + "simplex-network-overlay-card-1-li-1": "P2P-Netzwerke vertrauen auf Varianten von DHT, um Nachrichten zu routen. DHT-Designs müssen zwischen Zustellungsgarantie und Latenz ausgleichen. Verglichen mit P2P bietet SimpleX sowohl eine bessere Zustellungsgarantie als auch eine niedrigere Latenz, weil eine Nachricht redundant und parallel über mehrere Server gesendet werden kann, wobei die durch den Empfänger ausgewählten Server genutzt werden. In P2P-Netzwerken werden Nachrichten sequentiell über O(log N)-Knoten gesendet, wobei die Knoten durch einen Algorithmus ausgewählt werden.", "simplex-unique-overlay-card-3-p-4": "Zwischen dem gesendeten und empfangenen Serververkehr gibt es keine gemeinsamen Kennungen oder Chiffriertexte — sodass ein Beobachter nicht ohne weiteres feststellen kann, wer mit wem kommuniziert, selbst wenn TLS kompromittiert wurde.", "simplex-unique-overlay-card-4-p-3": "Wenn Sie darüber nachdenken, für die SimpleX-Plattform entwickeln zu wollen, z.B. einen Chatbot für SimpleX-App-Nutzer oder die Integration der SimpleX-Chat-Bibliothek in Ihre mobilen Apps, kontaktieren Sie uns bitte für eine weitere Beratung und Unterstützung.", "privacy-matters-overlay-card-1-p-4": "Die SimpleX-Plattform schützt die Privatsphäre Ihrer Verbindungen besser als jede Alternative und verhindert vollständig, dass Ihr sozialer Graph für Unternehmen oder Organisationen verfügbar wird. Selbst wenn die Anwender SimpleX-Chat-Server verwenden, kennen wir die Anzahl der Benutzer oder ihre Verbindungen nicht.", "contact-hero-header": "Sie haben eine Adresse zur Verbindung mit SimpleX Chat erhalten", "invitation-hero-header": "Sie haben einen Einmal-Link zur Verbindung mit SimpleX Chat erhalten", - "privacy-matters-overlay-card-3-p-3": "Normale Menschen werden für das, was sie online teilen, sogar unter Nutzung ihrer \"anonymen\" Konten, selbst in demokratischen Ländern verhaftet.", + "privacy-matters-overlay-card-3-p-3": "Normale Menschen werden für das, was sie online teilen, sogar unter Nutzung ihrer „anonymen“ Konten, selbst in demokratischen Ländern verhaftet.", "simplex-unique-overlay-card-3-p-1": "SimpleX Chat speichert alle Benutzerdaten ausschließlich auf den Endgeräten in einem portablen und verschlüsselten Datenbankformat, welches exportiert und auf jedes unterstützte Gerät übertragen werden kann.", - "simplex-unique-overlay-card-2-p-2": "Auch wenn die optionale Benutzeradresse zum Versenden von SPAM-Kontaktanfragen verwendet werden kann, können Sie sie ändern oder ganz löschen, ohne dass Ihre Verbindungen verloren gehen.", + "simplex-unique-overlay-card-2-p-2": "Auch wenn die optionale Benutzeradresse zum Versenden von Spam-Kontaktanfragen verwendet werden kann, können Sie sie ändern oder ganz löschen, ohne dass Ihre Verbindungen verloren gehen.", "simplex-unique-overlay-card-4-p-2": "Die SimpleX-Plattform verwendet ein offenes Protokoll und bietet ein SDK zur Erstellung von Chatbots an, welches die Erstellung von Diensten ermöglicht, mit denen Nutzer über SimpleX-Chat interagieren können — Wir sind gespannt, welche SimpleX-Dienste Sie erstellen können.", "simplex-unique-card-4-p-2": "Sie können SimpleX mit Ihren eigenen Servern oder mit den von uns zur Verfügung gestellten Servern verwenden — und sich trotzdem mit jedem Benutzer verbinden.", "why-simplex-is": "Warum ist SimpleX", @@ -234,15 +234,15 @@ "docs-dropdown-7": "SimpleX Chat übersetzen", "glossary": "Glossar", "signing-key-fingerprint": "Fingerabdruck des Signaturschlüssels (SHA-256)", - "f-droid-org-repo": "F-Droid.org Repository", + "f-droid-org-repo": "F-Droid.org-Repository", "stable-versions-built-by-f-droid-org": "Von F-Droid.org erstellte stabile Versionen", - "f-droid-page-f-droid-org-repo-section-text": "SimpleX Chat- und F-Droid.org-Repositorys signieren ihre Builds mit verschiedenen Schlüsseln. Zum Umschalten bitte die Chat-Datenbank exportieren und die App neu installieren.", + "f-droid-page-f-droid-org-repo-section-text": "SimpleX-Chat- und F-Droid.org-Repositorys signieren ihre Builds mit verschiedenen Schlüsseln. Zum Umschalten bitte die Chat-Datenbank exportieren und die App neu installieren.", "releases-to-this-repo-are-done-1-2-days-later": "Die Versionen für dieses Repository werden einige Tage später erstellt", - "docs-dropdown-8": "SimpleX Verzeichnisdienst", + "docs-dropdown-8": "SimpleX-Verzeichnisdienst", "simplex-chat-via-f-droid": "SimpleX Chat per F-Droid", - "simplex-chat-repo": "SimpleX Chat Repository", + "simplex-chat-repo": "SimpleX-Chat-Repository", "stable-and-beta-versions-built-by-developers": "Von den Entwicklern erstellte stabile und Beta-Versionen", - "f-droid-page-simplex-chat-repo-section-text": "Um es Ihrem F-Droid-Client hinzuzufügen scannen Sie den QR-Code oder nutzen Sie diese URL:", + "f-droid-page-simplex-chat-repo-section-text": "Um es Ihrem F-Droid-Client hinzuzufügen, scannen Sie den QR-Code oder nutzen Sie diese URL:", "comparison-section-list-point-4a": "SimpleX-Relais können die E2E-Verschlüsselung nicht kompromittieren. Überprüfen Sie den Sicherheitscode, um einen möglichen Angriff auf den Out-of-Band-Kanal zu entschärfen", "hero-overlay-3-title": "Sicherheits-Gutachten", "hero-overlay-card-3-p-2": "Trail of Bits untersuchte im November 2022 die kryptografischen und Netzwerk-Komponenten der SimpleX-Plattform.",