diff --git a/README.md b/README.md index 4cd7b2b787..28b40d0c1b 100644 --- a/README.md +++ b/README.md @@ -234,6 +234,8 @@ You can use SimpleX with your own servers and still communicate with people usin Recent and important updates: +[Mar 23, 2024. SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration.](./blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.md) + [Mar 14, 2024. SimpleX Chat v5.6 beta: adding quantum resistance to Signal double ratchet algorithm.](./blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.md) [Jan 24, 2024. SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect.](./blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.md) @@ -377,8 +379,9 @@ Please also join [#simplex-devs](https://simplex.chat/contact#/?v=1-2&smp=smp%3A - ✅ Using mobile profiles from the desktop app. - ✅ Private notes. - ✅ Improve sending videos (including encryption of locally stored videos). +- ✅ Post-quantum resistant key exchange in double ratchet protocol. +- 🏗 Improve stability and reduce battery usage. - 🏗 Improve experience for the new users. -- 🏗 Post-quantum resistant key exchange in double ratchet protocol. - 🏗 Large groups, communities and public channels. - 🏗 Message delivery relay for senders (to conceal IP address from the recipients' servers and to reduce the traffic). - Privacy & security slider - a simple way to set all settings at once. diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 365f23c33e..a099069f77 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -21,6 +21,8 @@ public let CURRENT_CHAT_VERSION: Int = 2 // version range that supports establishing direct connection with a group member (xGrpDirectInvVRange in core) public let CREATE_MEMBER_CONTACT_VRANGE = VersionRange(minVersion: 2, maxVersion: CURRENT_CHAT_VERSION) +private let networkStatusesLock = DispatchQueue(label: "chat.simplex.app.network-statuses.lock") + enum TerminalItem: Identifiable { case cmd(Date, ChatCommand) case resp(Date, ChatResponse) @@ -1566,34 +1568,30 @@ func processReceivedMsg(_ res: ChatResponse) async { m.removeChat(mergedContact.id) } } - case let .contactsSubscribed(_, contactRefs): - await updateContactsStatus(contactRefs, status: .connected) - case let .contactsDisconnected(_, contactRefs): - await updateContactsStatus(contactRefs, status: .disconnected) - case let .contactSubSummary(_, contactSubscriptions): - await MainActor.run { - for sub in contactSubscriptions { -// no need to update contact here, and it is slow -// if active(user) { -// m.updateContact(sub.contact) -// } - if let err = sub.contactError { - processContactSubError(sub.contact, err) - } else { - m.setContactNetworkStatus(sub.contact, .connected) - } - } - } case let .networkStatus(status, connections): - await MainActor.run { + // dispatch queue to synchronize access + networkStatusesLock.sync { + var ns = m.networkStatuses + // slow loop is on the background thread for cId in connections { - m.networkStatuses[cId] = status + ns[cId] = status + } + // fast model update is on the main thread + DispatchQueue.main.sync { + m.networkStatuses = ns } } case let .networkStatuses(_, statuses): () - await MainActor.run { + // dispatch queue to synchronize access + networkStatusesLock.sync { + var ns = m.networkStatuses + // slow loop is on the background thread for s in statuses { - m.networkStatuses[s.agentConnId] = s.networkStatus + ns[s.agentConnId] = s.networkStatus + } + // fast model update is on the main thread + DispatchQueue.main.sync { + m.networkStatuses = ns } } case let .newChatItem(user, aChatItem): @@ -1944,26 +1942,6 @@ func chatItemSimpleUpdate(_ user: any UserLike, _ aChatItem: AChatItem) async { } } -func updateContactsStatus(_ contactRefs: [ContactRef], status: NetworkStatus) async { - let m = ChatModel.shared - await MainActor.run { - for c in contactRefs { - m.networkStatuses[c.agentConnId] = status - } - } -} - -func processContactSubError(_ contact: Contact, _ chatError: ChatError) { - let m = ChatModel.shared - var err: String - switch chatError { - case .errorAgent(agentError: .BROKER(_, .NETWORK)): err = "network" - case .errorAgent(agentError: .SMP(smpErr: .AUTH)): err = "contact deleted" - default: err = String(describing: chatError) - } - m.setContactNetworkStatus(contact, .error(connectionError: err)) -} - func refreshCallInvitations() throws { let m = ChatModel.shared let callInvitations = try justRefreshCallInvitations() diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift index c3e4805bf3..16974147c8 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift @@ -70,14 +70,14 @@ struct CIImageView: View { } private func imageView(_ img: UIImage) -> some View { - let w = img.size.width <= img.size.height ? maxWidth * 0.75 : img.imageData == nil ? .infinity : maxWidth + let w = img.size.width <= img.size.height ? maxWidth * 0.75 : maxWidth DispatchQueue.main.async { imgWidth = w } return ZStack(alignment: .topTrailing) { if img.imageData == nil { Image(uiImage: img) .resizable() .scaledToFit() - .frame(maxWidth: w) + .frame(width: w) } else { SwiftyGif(image: img) .frame(width: w, height: w * img.size.height / img.size.width) diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift index ff208fe58a..a3918e17bc 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift @@ -243,13 +243,13 @@ struct CIVideoView: View { } private func imageView(_ img: UIImage) -> some View { - let w = img.size.width <= img.size.height ? maxWidth * 0.75 : .infinity + let w = img.size.width <= img.size.height ? maxWidth * 0.75 : maxWidth DispatchQueue.main.async { videoWidth = w } return ZStack(alignment: .topTrailing) { Image(uiImage: img) .resizable() .scaledToFit() - .frame(maxWidth: w) + .frame(width: w) loadingIndicator() } } diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 468027ec8a..cd2aa55bc3 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -17,6 +17,7 @@ struct ChatView: View { @Environment(\.colorScheme) var colorScheme @Environment(\.dismiss) var dismiss @Environment(\.presentationMode) var presentationMode + @Environment(\.scenePhase) var scenePhase @State @ObservedObject var chat: Chat @State private var showChatInfoSheet: Bool = false @State private var showAddMembersSheet: Bool = false @@ -234,7 +235,9 @@ struct ChatView: View { private func initChatView() { let cInfo = chat.chatInfo - if case let .direct(contact) = cInfo { + // This check prevents the call to apiContactInfo after the app is suspended, and the database is closed. + if case .active = scenePhase, + case let .direct(contact) = cInfo { Task { do { let (stats, _) = try await apiContactInfo(chat.chatInfo.apiId) @@ -511,6 +514,7 @@ struct ChatView: View { chat: chat, chatItem: ci, maxWidth: maxWidth, + itemWidth: maxWidth, composeState: $composeState, selectedMember: $selectedMember, chatView: self @@ -523,6 +527,7 @@ struct ChatView: View { @ObservedObject var chat: Chat var chatItem: ChatItem var maxWidth: CGFloat + @State var itemWidth: CGFloat @Binding var composeState: ComposeState @Binding var selectedMember: GMember? var chatView: ChatView @@ -651,7 +656,7 @@ struct ChatView: View { playbackState: $playbackState, playbackTime: $playbackTime ) - .uiKitContextMenu(maxWidth: maxWidth, menu: uiMenu, allowMenu: $allowMenu) + .uiKitContextMenu(hasImageOrVideo: ci.content.msgContent?.isImageOrVideo == true, maxWidth: maxWidth, itemWidth: $itemWidth, menu: uiMenu, allowMenu: $allowMenu) .accessibilityLabel("") if ci.content.msgContent != nil && (ci.meta.itemDeleted == nil || revealed) && ci.reactions.count > 0 { chatItemReactions(ci) diff --git a/apps/ios/Shared/Views/ChatList/UserPicker.swift b/apps/ios/Shared/Views/ChatList/UserPicker.swift index 741af6f08f..922fc84e53 100644 --- a/apps/ios/Shared/Views/ChatList/UserPicker.swift +++ b/apps/ios/Shared/Views/ChatList/UserPicker.swift @@ -12,6 +12,7 @@ private let fillColorLight = Color(uiColor: UIColor(red: 0.99, green: 0.99, blue struct UserPicker: View { @EnvironmentObject var m: ChatModel @Environment(\.colorScheme) var colorScheme + @Environment(\.scenePhase) var scenePhase @Binding var showSettings: Bool @Binding var showConnectDesktop: Bool @Binding var userPickerVisible: Bool @@ -91,7 +92,10 @@ struct UserPicker: View { .opacity(userPickerVisible ? 1.0 : 0.0) .onAppear { do { - m.users = try listUsers() + // This check prevents the call of listUsers after the app is suspended, and the database is closed. + if case .active = scenePhase { + m.users = try listUsers() + } } catch let error { logger.error("Error loading users \(responseError(error))") } diff --git a/apps/ios/Shared/Views/Helpers/ContextMenu.swift b/apps/ios/Shared/Views/Helpers/ContextMenu.swift index 3b82d6eb95..9504d919ef 100644 --- a/apps/ios/Shared/Views/Helpers/ContextMenu.swift +++ b/apps/ios/Shared/Views/Helpers/ContextMenu.swift @@ -11,11 +11,20 @@ import UIKit import SwiftUI extension View { - func uiKitContextMenu(maxWidth: CGFloat, menu: Binding, allowMenu: Binding) -> some View { + func uiKitContextMenu(hasImageOrVideo: Bool, maxWidth: CGFloat, itemWidth: Binding, menu: Binding, allowMenu: Binding) -> some View { Group { if allowMenu.wrappedValue { - InteractionView(content: self, maxWidth: maxWidth, menu: menu) - .fixedSize(horizontal: true, vertical: false) + if hasImageOrVideo { + InteractionView(content: + self.environmentObject(ChatModel.shared) + .overlay(DetermineWidthImageVideoItem()) + .onPreferenceChange(DetermineWidthImageVideoItem.Key.self) { itemWidth.wrappedValue = $0 == 0 ? maxWidth : $0 } + , maxWidth: maxWidth, itemWidth: itemWidth, menu: menu) + .frame(maxWidth: itemWidth.wrappedValue) + } else { + InteractionView(content: self.environmentObject(ChatModel.shared), maxWidth: maxWidth, itemWidth: itemWidth, menu: menu) + .fixedSize(horizontal: true, vertical: false) + } } else { self } @@ -31,13 +40,14 @@ private class HostingViewHolder: UIView { struct InteractionView: UIViewRepresentable { let content: Content var maxWidth: CGFloat + var itemWidth: Binding @Binding var menu: UIMenu func makeUIView(context: Context) -> UIView { let view = HostingViewHolder() - view.contentSize = CGSizeMake(maxWidth, .infinity) view.backgroundColor = .clear let hostView = UIHostingController(rootView: content) + view.contentSize = hostView.view.intrinsicContentSize hostView.view.translatesAutoresizingMaskIntoConstraints = false let constraints = [ hostView.view.topAnchor.constraint(equalTo: view.topAnchor), @@ -57,7 +67,11 @@ struct InteractionView: UIViewRepresentable { } func updateUIView(_ uiView: UIView, context: Context) { - (uiView as! HostingViewHolder).contentSize = uiView.subviews[0].sizeThatFits(CGSizeMake(maxWidth, .infinity)) + let was = (uiView as! HostingViewHolder).contentSize + (uiView as! HostingViewHolder).contentSize = uiView.subviews[0].sizeThatFits(CGSizeMake(itemWidth.wrappedValue, .infinity)) + if was != (uiView as! HostingViewHolder).contentSize { + uiView.invalidateIntrinsicContentSize() + } } func makeCoordinator() -> Coordinator { diff --git a/apps/ios/Shared/Views/Helpers/DetermineWidth.swift b/apps/ios/Shared/Views/Helpers/DetermineWidth.swift index d2a0aaab1d..b05ab17089 100644 --- a/apps/ios/Shared/Views/Helpers/DetermineWidth.swift +++ b/apps/ios/Shared/Views/Helpers/DetermineWidth.swift @@ -21,6 +21,19 @@ struct DetermineWidth: View { } } +struct DetermineWidthImageVideoItem: View { + typealias Key = MaximumWidthImageVideoPreferenceKey + var body: some View { + GeometryReader { proxy in + Color.clear + .preference( + key: MaximumWidthImageVideoPreferenceKey.self, + value: proxy.size.width + ) + } + } +} + struct MaximumWidthPreferenceKey: PreferenceKey { static var defaultValue: CGFloat = 0 static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { @@ -28,6 +41,13 @@ struct MaximumWidthPreferenceKey: PreferenceKey { } } +struct MaximumWidthImageVideoPreferenceKey: PreferenceKey { + static var defaultValue: CGFloat = 0 + static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { + value = max(value, nextValue()) + } +} + struct DetermineWidth_Previews: PreviewProvider { static var previews: some View { DetermineWidth() 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 f04880ee91..0f8bff18ea 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -631,6 +631,7 @@ Admins can block a member for all. + Администраторите могат да блокират член за всички. No comment provided by engineer. @@ -690,6 +691,7 @@ All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays. + Всички ваши контакти, разговори и файлове ще бъдат сигурно криптирани и качени на парчета в конфигурираните XFTP релета. No comment provided by engineer. @@ -819,6 +821,7 @@ App data migration + Миграция на данните от приложението No comment provided by engineer. @@ -858,14 +861,17 @@ Apply + Приложи No comment provided by engineer. Archive and upload + Архивиране и качване No comment provided by engineer. Archiving database + Архивиране на база данни No comment provided by engineer. @@ -1060,6 +1066,7 @@ Cancel migration + Отмени миграцията No comment provided by engineer. @@ -1165,6 +1172,7 @@ Chat migrated! + Чатът е мигриран! No comment provided by engineer. @@ -1263,6 +1271,7 @@ Confirm network settings + Потвърди мрежовите настройки No comment provided by engineer. @@ -1277,10 +1286,12 @@ Confirm that you remember database passphrase to migrate it. + Потвърдете, че помните паролата на базата данни, преди да я мигрирате. No comment provided by engineer. Confirm upload + Потвърди качването No comment provided by engineer. @@ -1544,6 +1555,7 @@ This is your own one-time link! Creating archive link + Създаване на архивен линк No comment provided by engineer. @@ -1768,6 +1780,7 @@ This cannot be undone! Delete database from this device + Изтриване на базата данни от това устройство No comment provided by engineer. @@ -2062,6 +2075,7 @@ This cannot be undone! Download failed + Неуспешно изтегляне No comment provided by engineer. @@ -2071,10 +2085,12 @@ This cannot be undone! Downloading archive + Архива се изтегля No comment provided by engineer. Downloading link details + Подробности за линка се изтеглят No comment provided by engineer. @@ -2134,6 +2150,7 @@ This cannot be undone! Enable in direct chats (BETA)! + Активиране в личните чатове (БЕТА)! No comment provided by engineer. @@ -2253,6 +2270,7 @@ This cannot be undone! Enter passphrase + Въведи парола No comment provided by engineer. @@ -2317,6 +2335,7 @@ This cannot be undone! Error allowing contact PQ encryption + Грешка при разрешаване на PQ криптиране за контакт No comment provided by engineer. @@ -2411,6 +2430,7 @@ This cannot be undone! Error downloading the archive + Грешка при изтеглянето на архива No comment provided by engineer. @@ -2490,6 +2510,7 @@ This cannot be undone! Error saving settings + Грешка при запазване на настройките when migrating @@ -2564,10 +2585,12 @@ This cannot be undone! Error uploading the archive + Грешка при качването на архива No comment provided by engineer. Error verifying passphrase: + Грешка при проверката на паролата: No comment provided by engineer. @@ -2622,6 +2645,7 @@ This cannot be undone! Exported file doesn't exist + Експортираният файл не съществува No comment provided by engineer. @@ -2696,10 +2720,12 @@ This cannot be undone! Finalize migration + Завърши миграцията No comment provided by engineer. Finalize migration on another device. + Завършете миграцията на другото устройство. No comment provided by engineer. @@ -2994,6 +3020,7 @@ This cannot be undone! Hungarian interface + Унгарски интерфейс No comment provided by engineer. @@ -3063,10 +3090,12 @@ This cannot be undone! Import failed + Неуспешно импортиране No comment provided by engineer. Importing archive + Импортиране на архив No comment provided by engineer. @@ -3086,6 +3115,7 @@ This cannot be undone! In order to continue, chat should be stopped. + За да продължите, чатът трябва да бъде спрян. No comment provided by engineer. @@ -3202,6 +3232,7 @@ This cannot be undone! Invalid migration confirmation + Невалидно потвърждение за мигриране No comment provided by engineer. @@ -3574,6 +3605,7 @@ This is your link for group %@! Message too large + Съобщението е твърде голямо No comment provided by engineer. @@ -3601,26 +3633,32 @@ This is your link for group %@! Migrate device + Мигрирай устройството No comment provided by engineer. Migrate from another device + Мигриране от друго устройство No comment provided by engineer. Migrate here + Мигрирай тук No comment provided by engineer. Migrate to another device + Миграция към друго устройство No comment provided by engineer. Migrate to another device via QR code. + Мигрирайте към друго устройство чрез QR код. No comment provided by engineer. Migrating + Мигриране No comment provided by engineer. @@ -3630,6 +3668,7 @@ This is your link for group %@! Migration complete + Миграцията е завършена No comment provided by engineer. @@ -3993,6 +4032,7 @@ This is your link for group %@! Open migration to another device + Отвори миграцията към друго устройство authentication reason @@ -4012,6 +4052,7 @@ This is your link for group %@! Or paste archive link + Или постави архивен линк No comment provided by engineer. @@ -4021,6 +4062,7 @@ This is your link for group %@! Or securely share this file link + Или сигурно споделете този линк към файла No comment provided by engineer. @@ -4110,6 +4152,7 @@ This is your link for group %@! Picture-in-picture calls + Обаждания "картина в картина" No comment provided by engineer. @@ -4134,6 +4177,7 @@ This is your link for group %@! Please confirm that network settings are correct for this device. + Моля, потвърдете, че мрежовите настройки са правилни за това устройство. No comment provided by engineer. @@ -4195,6 +4239,7 @@ Error: %@ Post-quantum E2EE + Постквантово E2EE No comment provided by engineer. @@ -4334,10 +4379,12 @@ Error: %@ Push server + Push сървър No comment provided by engineer. Quantum resistant encryption + Квантово устойчиво криптиране No comment provided by engineer. @@ -4527,10 +4574,12 @@ Error: %@ Repeat download + Повтори изтеглянето No comment provided by engineer. Repeat import + Повтори импортирането No comment provided by engineer. @@ -4540,6 +4589,7 @@ Error: %@ Repeat upload + Повтори качването No comment provided by engineer. @@ -4644,6 +4694,7 @@ Error: %@ Safer groups + По-безопасни групи No comment provided by engineer. @@ -5013,6 +5064,7 @@ Error: %@ Set passphrase + Задаване на парола No comment provided by engineer. @@ -5072,6 +5124,7 @@ Error: %@ Show QR code + Покажи QR код No comment provided by engineer. @@ -5216,6 +5269,7 @@ Error: %@ Stop chat + Спри чата No comment provided by engineer. @@ -5260,6 +5314,7 @@ Error: %@ Stopping chat + Спиране на чата No comment provided by engineer. @@ -5511,10 +5566,12 @@ It can happen because of some bug or when the connection is compromised. This chat is protected by end-to-end encryption. + Този чат е защитен чрез криптиране от край до край. E2EE info chat item This chat is protected by quantum resistant end-to-end encryption. + Този чат е защитен от квантово устойчиво криптиране от край до край. E2EE info chat item @@ -5813,6 +5870,7 @@ To connect, please ask your contact to create another connection link and check Upload failed + Неуспешно качване No comment provided by engineer. @@ -5822,6 +5880,7 @@ To connect, please ask your contact to create another connection link and check Uploading archive + Архивът се качва No comment provided by engineer. @@ -5876,6 +5935,7 @@ 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. @@ -5915,10 +5975,12 @@ To connect, please ask your contact to create another connection link and check Verify database passphrase + Проверете паролата на базата данни No comment provided by engineer. Verify passphrase + Провери паролата No comment provided by engineer. @@ -6013,6 +6075,7 @@ To connect, please ask your contact to create another connection link and check Warning: starting chat on multiple devices is not supported and will cause message delivery failures + Внимание: стартирането на чата на множество устройства не се поддържа и ще доведе до неуспешно изпращане на съобщения No comment provided by engineer. @@ -6037,6 +6100,7 @@ To connect, please ask your contact to create another connection link and check Welcome message is too long + Съобщението при посрещане е твърде дълго No comment provided by engineer. @@ -6187,6 +6251,7 @@ Repeat join request? You can give another try. + Можете да опитате още веднъж. No comment provided by engineer. @@ -7094,6 +7159,7 @@ SimpleX сървърите не могат да видят вашия профи quantum resistant e2e encryption + квантово устойчиво e2e криптиране chat item text @@ -7173,6 +7239,7 @@ SimpleX сървърите не могат да видят вашия профи standard end-to-end encryption + стандартно криптиране от край до край chat item text 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 3ed8ecbaeb..7ad19ff86f 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -635,7 +635,7 @@ Admins can block a member for all. - Administratoren können für ein Mitglied alle Funktionen blockieren. + Administratoren können ein Gruppenmitglied für Alle blockieren. No comment provided by engineer. @@ -1291,7 +1291,7 @@ Confirm that you remember database passphrase to migrate it. - Für die Migration bestätigen Sie bitte, dass Sie sich an das Datenbank-Passwort erinnern. + Bitte bestätigen Sie für die Migration, dass Sie sich an Ihr Datenbank-Passwort erinnern. No comment provided by engineer. @@ -3660,7 +3660,7 @@ Das ist Ihr Link für die Gruppe %@! Migrate to another device via QR code. - Über einen QR-Code auf ein anderes Gerät migrieren. + Daten können über einen QR-Code auf ein anderes Gerät migriert werden. No comment provided by engineer. @@ -5618,7 +5618,7 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro To ask any questions and to receive updates: - Um Fragen zu stellen und Aktualisierungen zu erhalten: + Um Fragen zu stellen und aktuelle Informationen zu erhalten: No comment provided by engineer. @@ -6508,7 +6508,7 @@ Sie können diese Verbindung abbrechen und den Kontakt entfernen (und es später Your contacts will remain connected. - Ihre Kontakte bleiben verbunden. + Ihre Kontakte bleiben weiterhin verbunden. No comment provided by engineer. 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 2f279a963c..99a117d786 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -134,6 +134,7 @@ %@ uploaded + %@ cargado No comment provided by engineer. @@ -1295,6 +1296,7 @@ Confirm upload + Confirmar subida No comment provided by engineer. @@ -1558,6 +1560,7 @@ This is your own one-time link! Creating archive link + Creando enlace de archivo No comment provided by engineer. @@ -1782,6 +1785,7 @@ This cannot be undone! Delete database from this device + Eliminar base de datos de este dispositivo No comment provided by engineer. @@ -2076,6 +2080,7 @@ This cannot be undone! Download failed + Error en la descarga No comment provided by engineer. @@ -2085,10 +2090,12 @@ This cannot be undone! Downloading archive + Descargando archivo No comment provided by engineer. Downloading link details + Descargando detalles del enlace No comment provided by engineer. @@ -2148,6 +2155,7 @@ This cannot be undone! Enable in direct chats (BETA)! + Activar en chats directos (BETA)! No comment provided by engineer. @@ -2267,6 +2275,7 @@ This cannot be undone! Enter passphrase + Introducir frase de contraseña No comment provided by engineer. @@ -2331,6 +2340,7 @@ This cannot be undone! Error allowing contact PQ encryption + Error al permitir cifrado PQ al contacto No comment provided by engineer. @@ -2425,6 +2435,7 @@ This cannot be undone! Error downloading the archive + Error al descargar el archivo No comment provided by engineer. @@ -2504,6 +2515,7 @@ This cannot be undone! Error saving settings + Error al guardar ajustes when migrating @@ -2578,10 +2590,12 @@ This cannot be undone! Error uploading the archive + Error al subir el archivo No comment provided by engineer. Error verifying passphrase: + Error al verificar la frase de contraseña: No comment provided by engineer. @@ -2636,6 +2650,7 @@ This cannot be undone! Exported file doesn't exist + El archivo exportado no existe No comment provided by engineer. @@ -2710,10 +2725,12 @@ This cannot be undone! Finalize migration + Finalizar la migración No comment provided by engineer. Finalize migration on another device. + Finalizar la migración en otro dispositivo. No comment provided by engineer. @@ -3008,6 +3025,7 @@ This cannot be undone! Hungarian interface + Interfaz húngara No comment provided by engineer. @@ -3077,10 +3095,12 @@ This cannot be undone! Import failed + Error de importación No comment provided by engineer. Importing archive + Importando archivo No comment provided by engineer. @@ -3100,6 +3120,7 @@ This cannot be undone! In order to continue, chat should be stopped. + Para continuar, el chat debe ser interrumpido. No comment provided by engineer. @@ -3216,6 +3237,7 @@ This cannot be undone! Invalid migration confirmation + Confirmación de migración inválida No comment provided by engineer. @@ -3588,6 +3610,7 @@ This is your link for group %@! Message too large + Mensaje demasiado grande No comment provided by engineer. @@ -3607,34 +3630,42 @@ This is your link for group %@! Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery. + Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo** con perfecta confidencialidad, repudio y recuperación tras ataques. No comment provided by engineer. Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery. + Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo resistente a la computación cuántica** con perfecta confidencialidad, repudio y recuperación tras ataques. No comment provided by engineer. Migrate device + Migrar dispositivo No comment provided by engineer. Migrate from another device + Migrar desde otro dispositivo No comment provided by engineer. Migrate here + Migrar aquí No comment provided by engineer. Migrate to another device + Migrar hacia otro dispositivo No comment provided by engineer. Migrate to another device via QR code. + Migrar hacia otro dispositivo mediante código QR. No comment provided by engineer. Migrating + Migrando No comment provided by engineer. @@ -3644,6 +3675,7 @@ This is your link for group %@! Migration complete + Migración completada No comment provided by engineer. @@ -4007,6 +4039,7 @@ This is your link for group %@! Open migration to another device + Abrir la migración hacia otro dispositivo authentication reason @@ -4026,6 +4059,7 @@ This is your link for group %@! Or paste archive link + O pegar enlace del archivo No comment provided by engineer. @@ -4035,6 +4069,7 @@ This is your link for group %@! Or securely share this file link + O comparta de forma segura el enlace de este archivo No comment provided by engineer. @@ -4124,6 +4159,7 @@ This is your link for group %@! Picture-in-picture calls + Llamadas picture-in-picture No comment provided by engineer. @@ -4148,6 +4184,7 @@ This is your link for group %@! Please confirm that network settings are correct for this device. + Por favor confirme que la configuración de red es correcta para este dispositivo. No comment provided by engineer. @@ -4209,6 +4246,7 @@ Error: %@ Post-quantum E2EE + E2EE postcuántica No comment provided by engineer. @@ -4348,10 +4386,12 @@ Error: %@ Push server + Servidor push No comment provided by engineer. Quantum resistant encryption + Cifrado resistente a la tecnología cuántica No comment provided by engineer. @@ -4541,10 +4581,12 @@ Error: %@ Repeat download + Repetir descarga No comment provided by engineer. Repeat import + Repetir importación No comment provided by engineer. @@ -4554,6 +4596,7 @@ Error: %@ Repeat upload + Repetir la carga No comment provided by engineer. @@ -4658,6 +4701,7 @@ Error: %@ Safer groups + Grupos más seguros No comment provided by engineer. @@ -5027,6 +5071,7 @@ Error: %@ Set passphrase + Definir frase de contraseña No comment provided by engineer. @@ -5086,6 +5131,7 @@ Error: %@ Show QR code + Mostrar código QR No comment provided by engineer. @@ -5230,6 +5276,7 @@ Error: %@ Stop chat + Detener el chat No comment provided by engineer. @@ -5274,6 +5321,7 @@ Error: %@ Stopping chat + Detención del chat No comment provided by engineer. @@ -5525,10 +5573,12 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida. This chat is protected by end-to-end encryption. + Este chat está protegido por cifrado de extremo a extremo. E2EE info chat item This chat is protected by quantum resistant end-to-end encryption. + Este chat está protegido por un cifrado de extremo a extremo resistente a tecnologías cuánticas. E2EE info chat item @@ -5828,6 +5878,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Upload failed + Error de carga No comment provided by engineer. @@ -5837,6 +5888,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Uploading archive + Subiendo el archivo No comment provided by engineer. @@ -5891,6 +5943,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Use the app while in the call. + Usar la app durante la llamada. No comment provided by engineer. @@ -5930,10 +5983,12 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Verify database passphrase + Verificar la contraseña de la base de datos No comment provided by engineer. Verify passphrase + Verificar frase de contraseña No comment provided by engineer. @@ -6028,6 +6083,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Warning: starting chat on multiple devices is not supported and will cause message delivery failures + Advertencia: el inicio del chat en varios dispositivos no es compatible y provocará fallos en la entrega de mensajes No comment provided by engineer. @@ -6052,6 +6108,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Welcome message is too long + El mensaje de bienvenida es demasiado largo No comment provided by engineer. @@ -6111,6 +6168,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb You **must not** use the same database on two devices. + **No debe** usar la misma base de datos en dos dispositivos. No comment provided by engineer. @@ -6202,6 +6260,7 @@ Repeat join request? You can give another try. + Puede intentarlo de nuevo. No comment provided by engineer. @@ -7109,6 +7168,7 @@ Los servidores de SimpleX no pueden ver tu perfil. quantum resistant e2e encryption + cifrado e2e resistente a la cuántica chat item text @@ -7188,6 +7248,7 @@ Los servidores de SimpleX no pueden ver tu perfil. standard end-to-end encryption + cifrado estándar de extremo a extremo chat item text 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 7bdbefedb6..1e335c00b0 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -2155,7 +2155,7 @@ Cette opération ne peut être annulée ! Enable in direct chats (BETA)! - Activé dans les conversations directes (BETA) ! + Activer dans les conversations directes (BETA) ! No comment provided by engineer. @@ -3635,7 +3635,7 @@ Voici votre lien pour le groupe %@ ! Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery. - Les messages, fichiers et appels sont protégés par un chiffrement **2e2 résistant post-quantique** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction. + Les messages, fichiers et appels sont protégés par un chiffrement **e2e résistant post-quantique** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction. No comment provided by engineer. @@ -5578,7 +5578,7 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise. This chat is protected by quantum resistant end-to-end encryption. - Cette discussion est protégée par un chiffrement de bout en bout résistant post-quantique. + Cette discussion est protégée par un chiffrement de bout en bout résistant aux technologies quantiques. E2EE info chat item @@ -6082,7 +6082,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien Warning: starting chat on multiple devices is not supported and will cause message delivery failures - Attention : démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages + Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages 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 ac71ed26bc..45cfe0c468 100644 --- a/apps/ios/SimpleX Localizations/he.xcloc/Localized Contents/he.xliff +++ b/apps/ios/SimpleX Localizations/he.xcloc/Localized Contents/he.xliff @@ -5311,6 +5311,11 @@ SimpleX servers cannot see your profile. ללא היסטוריה No comment provided by engineer. + + %@ and %@ + %@ ו-%@ + 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 4fe1a8da8e..34d39c405d 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -3635,7 +3635,7 @@ Questo è il tuo link per il gruppo %@! Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery. - I messaggi, i file e le chiamate sono protetti da **crittografia e2e resistente al quantistico** con perfect forward secrecy, ripudio e recupero da intrusione. + I messaggi, i file e le chiamate sono protetti da **crittografia e2e resistente alla quantistica** con perfect forward secrecy, ripudio e recupero da intrusione. No comment provided by engineer. @@ -4391,7 +4391,7 @@ Errore: %@ Quantum resistant encryption - Crittografia resistente al quantistico + Crittografia resistente alla quantistica No comment provided by engineer. @@ -5578,7 +5578,7 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa. This chat is protected by quantum resistant end-to-end encryption. - Questa chat è protetta da crittografia end-to-end resistente al quantistico. + Questa chat è protetta da crittografia end-to-end resistente alla quantistica. E2EE info chat item @@ -6002,7 +6002,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Via secure quantum resistant protocol. - Tramite protocollo sicuro resistente al quantistico. + Tramite protocollo sicuro resistente alla quantistica. No comment provided by engineer. @@ -7167,7 +7167,7 @@ I server di SimpleX non possono vedere il tuo profilo. quantum resistant e2e encryption - crittografia e2e resistente al quantistico + crittografia e2e resistente alla quantistica chat item text 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 61d91c8fbb..d450d228d8 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -4024,7 +4024,7 @@ Dit is jouw link voor groep %@! Open chat - Gesprekken openen + Chat openen No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/pt.xcloc/Localized Contents/pt.xliff b/apps/ios/SimpleX Localizations/pt.xcloc/Localized Contents/pt.xliff index 71c523ca4e..a31d4e314d 100644 --- a/apps/ios/SimpleX Localizations/pt.xcloc/Localized Contents/pt.xliff +++ b/apps/ios/SimpleX Localizations/pt.xcloc/Localized Contents/pt.xliff @@ -15,32 +15,39 @@ Available in v5.1 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) + .(pode ser copiado) No comment provided by engineer. - + !1 colored! + !1 colorido! No comment provided by engineer. - + #secret# + #secreto# No comment provided by engineer. @@ -55,48 +62,59 @@ Available in v5.1 %@ / %@ No comment provided by engineer. - + %@ is connected! + %@ está conectado! notification title - + %@ is not verified + %@ não foi verificado No comment provided by engineer. - + %@ is verified + %@ foi verificado No comment provided by engineer. - + %@ servers + %@ servidores No comment provided by engineer. - + %@ wants to connect! + %@ quer se conectar! notification title - + %d days + %d dias message ttl - + %d hours + %d horas message ttl - + %d min + %d minuto message ttl - + %d months + %d meses message ttl - + %d sec + %d segundo message ttl - + %d skipped message(s) + %d mensagem(s) ignorada(s) integrity error chat item @@ -107,28 +125,34 @@ Available in v5.1 %lld %@ No comment provided by engineer. - + %lld contact(s) selected + %lld contato(s) selecionado(s) No comment provided by engineer. - + %lld file(s) with total size of %@ + %lld arquivo(s) com tamanho total de %@ No comment provided by engineer. - + %lld members + %lld membros No comment provided by engineer. - + %lld minutes + %lld minutos No comment provided by engineer. - + %lld second(s) + %lld segundo(s) No comment provided by engineer. - + %lld seconds + %lld segundos No comment provided by engineer. @@ -159,12 +183,14 @@ Available in v5.1 %lldw No comment provided by engineer. - + %u messages failed to decrypt. + %u mensagens não foram descriptografadas. No comment provided by engineer. - + %u messages skipped. + %u mensagens ignoradas. No comment provided by engineer. @@ -175,48 +201,56 @@ Available in v5.1 ) No comment provided by engineer. - + **Add new contact**: to create your one-time QR Code or link for your contact. + **Adicionar novo contato**: para criar seu QR Code único ou link para seu contato. 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. + **Mais privado**: verifique novas mensagens a cada 20 minutos. O token do dispositivo é compartilhado com o servidor SimpleX Chat, mas não com quantos contatos ou mensagens você possui. 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). + **Totalmente privado**: não use o servidor de notificações do SimpleX Chat, verifique as mensagens periodicamente em segundo plano (depende da frequência com que você usa o aplicativo). 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. + **Atenção**: Você NÃO poderá recuperar ou alterar a senha caso a perca. 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. + **Recomendado**: O token do dispositivo e as notificações são enviados ao servidor de notificação do SimpleX Chat, mas não o conteúdo, o tamanho da mensagem ou de quem ela é. 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. + **Aviso**: As notificações push instantâneas exigem uma senha salva nas Chaves. No comment provided by engineer. - + **e2e encrypted** audio call + ** Criptografado e2e** chamada de áudio No comment provided by engineer. - + **e2e encrypted** video call + **Criptografado e2e** chamada de vídeo No comment provided by engineer. @@ -353,144 +387,175 @@ Available in v5.1 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. + Todas as mensagens serão apagadas – isso não pode ser desfeito! As mensagens serão apagadas SOMENTE para você. No comment provided by engineer. All your contacts will remain connected No comment provided by engineer. - + Allow + Permitir No comment provided by engineer. - + Allow calls only if your contact allows them. + Permita chamadas somente se seu contato permitir. No comment provided by engineer. - + Allow disappearing messages only if your contact allows it to you. + Permita o desaparecimento de mensagens somente se o seu contato permitir. 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. + Permitir o envio de mensagens diretas aos membros. No comment provided by engineer. - + Allow sending disappearing messages. + Permitir o envio de mensagens que desaparecem. No comment provided by engineer. Allow to irreversibly delete sent messages. No comment provided by engineer. - + Allow to send voice messages. + Permitir enviar mensagens de voz. No comment provided by engineer. - + Allow voice messages only if your contact allows them. + Permita mensagens de voz apenas se o seu contato permitir. No comment provided by engineer. - + Allow voice messages? + Permitir mensagens de voz? No comment provided by engineer. - + Allow your contacts to call you. + Permita que seus contatos liguem para você. 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. + Permita que seus contatos enviem mensagens que desaparecem. No comment provided by engineer. - + Allow your contacts to send voice messages. + Permita que seus contatos enviem mensagens de voz. No comment provided by engineer. - + Already connected? + Já conectado? No comment provided by engineer. - + Always use relay + Sempre usar retransmissão No comment provided by engineer. - + Answer call + Atender chamada No comment provided by engineer. - + App build: %@ + Versão do Aplicativo: %@ No comment provided by engineer. - + App icon + Ícone do Aplicativo No comment provided by engineer. - + App passcode + Senha do Aplicativo No comment provided by engineer. - + App version + Versão do Aplicativo No comment provided by engineer. - + App version: v%@ + Versão do Aplicativo: v%@ No comment provided by engineer. - + Appearance + Aparência No comment provided by engineer. - + Attach + Anexar No comment provided by engineer. - + Audio & video calls + Chamadas de áudio e vídeo No comment provided by engineer. - + Audio and video calls + Chamadas de áudio e vídeo No comment provided by engineer. - + Audio/video calls + Chamadas de áudio/vídeo chat feature - + Audio/video calls are prohibited. + Chamadas de áudio/vídeo são proibidas. No comment provided by engineer. - + Authentication cancelled + Autenticação cancelada PIN entry - + Authentication failed + Falha na autenticação No comment provided by engineer. - + Authentication is required before the call is connected, but you may miss calls. + A autenticação é necessária antes que a chamada seja conectada, mas você pode perder chamadas. No comment provided by engineer. - + Authentication unavailable + Autenticação indisponível No comment provided by engineer. - + Auto-accept contact requests + Aceitar solicitações de contato automaticamente No comment provided by engineer. @@ -4162,6 +4227,226 @@ SimpleX servers cannot see your profile. \~strike~ No comment provided by engineer. + + ## In reply to + ## Em resposta a + copied message info + + + %@ uploaded + %@ enviado + No comment provided by engineer. + + + %d weeks + %d semanas + time interval + + + %lld messages blocked by admin + %lld mensagens bloqueadas pelo administrador + No comment provided by engineer. + + + %lld new interface languages + %lld novas interface de idiomas + No comment provided by engineer. + + + **Add contact**: to create a new invitation link, or connect via a link you received. + **Adicionar contato**: para criar um novo link de convite ou conectar-se por meio de um link que você recebeu. + No comment provided by engineer. + + + **Create group**: to create a new group. + **Criar grupo**: para criar um novo grupo. + No comment provided by engineer. + + + **Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection. + **Observação**: usar o mesmo banco de dados em dois dispositivos interromperá a descriptografia de mensagens de suas conexões, como proteção de segurança. + No comment provided by engineer. + + + ## History + ## Histórico + copied message info + + + **Warning**: the archive will be removed. + **Atenção**: O arquivo será removido. + No comment provided by engineer. + + + %@ and %@ + %@ e %@ + No comment provided by engineer. + + + %@ and %@ connected + %@ e %@ conectado + No comment provided by engineer. + + + %1$@ at %2$@: + %1$@ em %2$@: + copied message info, <sender> at <time> + + + %@ connected + %@ conectado + No comment provided by engineer. + + + %@, %@ and %lld members + %@, %@ e %lld membros + No comment provided by engineer. + + + %@, %@ and %lld other members connected + %@, %@ e %lld outros membros conectados + No comment provided by engineer. + + + %lld group events + %lld eventos de grupo + No comment provided by engineer. + + + %lld messages marked deleted + %lld mensagens marcadas como excluídas + No comment provided by engineer. + + + %lld messages blocked + %lld mensagens bloqueadas + No comment provided by engineer. + + + %lld messages moderated by %@ + %lld mensagens moderadas por %@ + No comment provided by engineer. + + + (this device v%@) + (este dispositivo v%@) + No comment provided by engineer. + + + All data is erased when it is entered. + Todos os dados são apagados quando são inseridos. + No comment provided by engineer. + + + Allow irreversible message deletion only if your contact allows it to you. (24 hours) + Permita a exclusão irreversível de mensagens somente se o seu contato permitir. (24 horas) + No comment provided by engineer. + + + Apply + Aplicar + No comment provided by engineer. + + + Archive and upload + Arquivar e fazer envio + No comment provided by engineer. + + + All new messages from %@ will be hidden! + Todas as novas mensagens de %@ ficarão ocultas! + No comment provided by engineer. + + + Already connecting! + Já conectando! + No comment provided by engineer. + + + App encrypts new local files (except videos). + O aplicativo criptografa novos arquivos locais (exceto vídeos). + No comment provided by engineer. + + + App passcode is replaced with self-destruct passcode. + A senha do Aplicativo é substituída pela senha de autodestruição. + No comment provided by engineer. + + + All your contacts will remain connected. + Todos os seus contatos permanecerão conectados. + No comment provided by engineer. + + + All your contacts will remain connected. Profile update will be sent to your contacts. + Todos os seus contatos permanecerão conectados. A atualização do perfil será enviada para seus contatos. + No comment provided by engineer. + + + Allow to send files and media. + Permitir o envio de arquivos e mídia. + No comment provided by engineer. + + + App data migration + Migração de dados de aplicativos + No comment provided by engineer. + + + Archiving database + Arquivando banco de dados + No comment provided by engineer. + + + All messages will be deleted - this cannot be undone! + Todas as mensagens serão apagadas – isso não pode ser desfeito! + No comment provided by engineer. + + + All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays. + Todos os seus contatos, conversas e arquivos serão criptografados com segurança e enviados em partes para retransmissões XFTP configuradas. + No comment provided by engineer. + + + Allow message reactions only if your contact allows them. + Permita reações às mensagens somente se o seu contato permitir. + No comment provided by engineer. + + + Allow message reactions. + Permitir reações às mensagens. + No comment provided by engineer. + + + Allow your contacts to irreversibly delete sent messages. (24 hours) + Permita que seus contatos apaguem irreversivelmente as mensagens enviadas. (24 horas) + No comment provided by engineer. + + + Already joining the group! + Entrando no grupo! + No comment provided by engineer. + + + An empty chat profile with the provided name is created, and the app opens as usual. + Um perfil de conversa vazio com o nome fornecido é criado e o aplicativo abre normalmente. + No comment provided by engineer. + + + Auto-accept + Aceitar automaticamente + No comment provided by engineer. + + + Allow your contacts adding message reactions. + Permita que seus contatos adicionem reações às mensagens. + No comment provided by engineer. + + + Allow to irreversibly delete sent messages. (24 hours) + Permitir apagar irreversivelmente as mensagens enviadas. (24 horas) + 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 f78bdd0384..7d5f119b9d 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -6082,7 +6082,7 @@ To connect, please ask your contact to create another connection link and check Warning: starting chat on multiple devices is not supported and will cause message delivery failures - Внимание: запуск чата на нескольких устройствах не поддерживается и приведет к сбоям доставки сообщений. + Внимание: запуск чата на нескольких устройствах не поддерживается и приведет к сбоям доставки сообщений 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 51ef266312..05c68ea21e 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -99,7 +99,7 @@ %1$@ at %2$@: - %1$@, %2$@ de + 1$@, %2$@'de: copied message info, <sender> at <time> @@ -2340,6 +2340,7 @@ Bu geri alınamaz! Error allowing contact PQ encryption + İletişim PQ şifrelemesine izin verirken hata oluştu No comment provided by engineer. @@ -3024,6 +3025,7 @@ Bu geri alınamaz! Hungarian interface + Macarca arayüz No comment provided by engineer. @@ -3628,34 +3630,42 @@ Bu senin grup için bağlantın %@! Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery. + Mesajlar, dosyalar ve aramalar **uçtan uca şifreleme** ile mükemmel ileri gizlilik, inkar ve izinsiz giriş kurtarma ile korunur. No comment provided by engineer. Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery. + Mesajlar, dosyalar ve aramalar **kuantum dirençli e2e şifreleme** ile mükemmel ileri gizlilik, inkar ve zorla girme kurtarma ile korunur. No comment provided by engineer. Migrate device + Cihazı taşıma No comment provided by engineer. Migrate from another device + Başka bir cihazdan geçiş yapın No comment provided by engineer. Migrate here + Buraya göç edin No comment provided by engineer. Migrate to another device + Başka bir cihaza taşıma No comment provided by engineer. Migrate to another device via QR code. + QR kodu aracılığıyla başka bir cihaza geçiş yapın. No comment provided by engineer. Migrating + Göçmenlik No comment provided by engineer. @@ -3665,6 +3675,7 @@ Bu senin grup için bağlantın %@! Migration complete + Geçiş tamamlandı No comment provided by engineer. @@ -4028,6 +4039,7 @@ Bu senin grup için bağlantın %@! Open migration to another device + Başka bir cihaza açık geçiş authentication reason @@ -4047,6 +4059,7 @@ Bu senin grup için bağlantın %@! Or paste archive link + Veya arşiv bağlantısını yapıştırın No comment provided by engineer. @@ -4056,6 +4069,7 @@ Bu senin grup için bağlantın %@! Or securely share this file link + Veya bu dosya bağlantısını güvenli bir şekilde paylaşın No comment provided by engineer. @@ -4145,6 +4159,7 @@ Bu senin grup için bağlantın %@! Picture-in-picture calls + Resim içinde resim aramaları No comment provided by engineer. @@ -4169,6 +4184,7 @@ Bu senin grup için bağlantın %@! Please confirm that network settings are correct for this device. + Lütfen bu cihaz için ağ ayarlarının doğru olduğunu onaylayın. No comment provided by engineer. @@ -4230,6 +4246,7 @@ Hata: %@ Post-quantum E2EE + Kuantum sonrası E2EE No comment provided by engineer. @@ -4369,10 +4386,12 @@ Hata: %@ Push server + Push sunucu No comment provided by engineer. Quantum resistant encryption + Kuantum dirençli şifreleme No comment provided by engineer. @@ -4422,7 +4441,7 @@ Hata: %@ Receipts are disabled - Görüldü devre dışı bırakıldı + Makbuzlar devre dışı bırakıldı No comment provided by engineer. @@ -4562,10 +4581,12 @@ Hata: %@ Repeat download + Tekrar indir No comment provided by engineer. Repeat import + İthalatı tekrarla No comment provided by engineer. @@ -4575,6 +4596,7 @@ Hata: %@ Repeat upload + Yüklemeyi tekrarla No comment provided by engineer. @@ -4679,6 +4701,7 @@ Hata: %@ Safer groups + Daha güvenli gruplar No comment provided by engineer. @@ -4938,7 +4961,7 @@ Hata: %@ Sending delivery receipts will be enabled for all contacts. - Görüldü bilgisi bütün kişileri için etkinleştirilecektir. + Teslimat makbuzlarının gönderilmesi tüm kişiler için etkinleştirilecektir. No comment provided by engineer. @@ -5048,6 +5071,7 @@ Hata: %@ Set passphrase + Parolayı ayarla No comment provided by engineer. @@ -5107,6 +5131,7 @@ Hata: %@ Show QR code + QR kodunu göster No comment provided by engineer. @@ -5251,6 +5276,7 @@ Hata: %@ Stop chat + Sohbeti kes No comment provided by engineer. @@ -5295,6 +5321,7 @@ Hata: %@ Stopping chat + Sohbeti durdurma No comment provided by engineer. @@ -5324,7 +5351,7 @@ Hata: %@ TCP_KEEPCNT - TCP_CNTYİTUT + TCP_KEEPCNT No comment provided by engineer. @@ -5546,10 +5573,12 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. This chat is protected by end-to-end encryption. + Bu sohbet uçtan uca şifreleme ile korunmaktadır. E2EE info chat item This chat is protected by quantum resistant end-to-end encryption. + Bu sohbet kuantum dirençli uçtan uca şifreleme ile korunmaktadır. E2EE info chat item @@ -5848,6 +5877,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Upload failed + Yükleme başarısız No comment provided by engineer. @@ -5857,6 +5887,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Uploading archive + Arşiv yükleme No comment provided by engineer. @@ -5911,6 +5942,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Use the app while in the call. + Görüşme sırasında uygulamayı kullanın. No comment provided by engineer. @@ -5950,10 +5982,12 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Verify database passphrase + Veritabanı parolasını doğrulayın No comment provided by engineer. Verify passphrase + Parolayı doğrula No comment provided by engineer. @@ -6048,6 +6082,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Warning: starting chat on multiple devices is not supported and will cause message delivery failures + Uyarı: birden fazla cihazda sohbet başlatmak desteklenmez ve mesaj teslim hatalarına neden olur No comment provided by engineer. @@ -6072,6 +6107,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Welcome message is too long + Hoş geldiniz mesajı çok uzun No comment provided by engineer. @@ -6131,6 +6167,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste You **must not** use the same database on two devices. + Aynı veritabanını iki cihazda **kullanmamalısınız**. No comment provided by engineer. @@ -6222,6 +6259,7 @@ Katılma isteği tekrarlansın mı? You can give another try. + Bir kez daha deneyebilirsiniz. No comment provided by engineer. @@ -7129,6 +7167,7 @@ SimpleX sunucuları profilinizi göremez. quantum resistant e2e encryption + kuantuma dayanıklı e2e şifreleme chat item text @@ -7208,6 +7247,7 @@ SimpleX sunucuları profilinizi göremez. standard end-to-end encryption + standart uçtan uca şifreleme chat item text 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 19b46bfc45..29edc0b9ac 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -109,6 +109,7 @@ %@ downloaded + %@ встановлено No comment provided by engineer. @@ -133,6 +134,7 @@ %@ uploaded + %@ завантажено No comment provided by engineer. @@ -352,6 +354,7 @@ **Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection. + **Зверніть увагу**: використання однієї і тієї ж бази даних на двох пристроях порушить розшифровку повідомлень з ваших з'єднань, як захист безпеки. No comment provided by engineer. @@ -371,6 +374,7 @@ **Warning**: the archive will be removed. + **Попередження**: архів буде видалено. No comment provided by engineer. @@ -631,6 +635,7 @@ Admins can block a member for all. + Адміністратори можуть заблокувати користувача для всіх. No comment provided by engineer. @@ -690,6 +695,7 @@ All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays. + Всі ваші контакти, розмови та файли будуть надійно зашифровані та завантажені частинами на налаштовані XFTP-реле. No comment provided by engineer. @@ -819,6 +825,7 @@ App data migration + Міграція даних додатків No comment provided by engineer. @@ -858,14 +865,17 @@ Apply + Подати заявку No comment provided by engineer. Archive and upload + Архівування та завантаження No comment provided by engineer. Archiving database + Архівування бази даних No comment provided by engineer. @@ -1060,6 +1070,7 @@ Cancel migration + Скасувати міграцію No comment provided by engineer. @@ -1165,6 +1176,7 @@ Chat migrated! + Чат перемістився! No comment provided by engineer. @@ -1189,6 +1201,7 @@ Choose _Migrate from another device_ on the new device and scan QR code. + Виберіть _Перемістити з іншого пристрою_ на новому пристрої та відскануйте QR-код. No comment provided by engineer. @@ -1218,6 +1231,7 @@ Clear private notes? + Чисті приватні нотатки? No comment provided by engineer. @@ -1262,6 +1276,7 @@ Confirm network settings + Підтвердьте налаштування мережі No comment provided by engineer. @@ -1276,10 +1291,12 @@ Confirm that you remember database passphrase to migrate it. + Переконайтеся, що ви пам'ятаєте пароль до бази даних для її перенесення. No comment provided by engineer. Confirm upload + Підтвердити завантаження No comment provided by engineer. @@ -1348,6 +1365,7 @@ This is your own one-time link! Connected to desktop + Підключено до настільного комп'ютера No comment provided by engineer. @@ -1362,6 +1380,7 @@ This is your own one-time link! Connecting to desktop + Підключення до ПК No comment provided by engineer. @@ -1386,6 +1405,7 @@ This is your own one-time link! Connection terminated + З'єднання розірвано No comment provided by engineer. @@ -1455,6 +1475,7 @@ This is your own one-time link! Correct name to %@? + Виправити ім'я на %@? No comment provided by engineer. @@ -1469,6 +1490,7 @@ This is your own one-time link! Create a group using a random profile. + Створіть групу, використовуючи випадковий профіль. No comment provided by engineer. @@ -1483,6 +1505,7 @@ This is your own one-time link! Create group + Створити групу No comment provided by engineer. @@ -1497,10 +1520,12 @@ This is your own one-time link! Create new profile in [desktop app](https://simplex.chat/downloads/). 💻 + Створіть новий профіль у [desktop app](https://simplex.chat/downloads/). 💻 No comment provided by engineer. Create profile + Створити профіль No comment provided by engineer. @@ -1520,10 +1545,12 @@ This is your own one-time link! Created at + Створено за адресою No comment provided by engineer. Created at: %@ + Створено за адресою: %@ copied message info @@ -1533,10 +1560,12 @@ This is your own one-time link! Creating archive link + Створення архівного посилання No comment provided by engineer. Creating link… + Створення посилання… No comment provided by engineer. @@ -1679,6 +1708,7 @@ This is your own one-time link! Delete %lld messages? + Видалити %lld повідомлень? No comment provided by engineer. @@ -1708,6 +1738,7 @@ This is your own one-time link! Delete and notify contact + Видалити та повідомити контакт No comment provided by engineer. @@ -1743,6 +1774,8 @@ This is your own one-time link! Delete contact? This cannot be undone! + Видалити контакт? +Це не можна скасувати! No comment provided by engineer. @@ -1752,6 +1785,7 @@ This cannot be undone! Delete database from this device + Видалити базу даних з цього пристрою No comment provided by engineer. @@ -1891,14 +1925,17 @@ This cannot be undone! Desktop address + Адреса робочого столу No comment provided by engineer. Desktop app version %@ is not compatible with this app. + Версія програми для настільних комп'ютерів %@ не сумісна з цією програмою. No comment provided by engineer. Desktop devices + Настільні пристрої No comment provided by engineer. @@ -1993,14 +2030,17 @@ This cannot be undone! Disconnect desktop? + Відключити робочий стіл? No comment provided by engineer. Discover and join groups + Знаходьте та приєднуйтесь до груп No comment provided by engineer. Discover via local network + Відкриття через локальну мережу No comment provided by engineer. @@ -2015,6 +2055,7 @@ This cannot be undone! Do not send history to new members. + Не надсилайте історію новим користувачам. No comment provided by engineer. @@ -2039,6 +2080,7 @@ This cannot be undone! Download failed + Не вдалося завантажити No comment provided by engineer. @@ -2048,10 +2090,12 @@ This cannot be undone! Downloading archive + Завантажити архів No comment provided by engineer. Downloading link details + Деталі посилання для завантаження No comment provided by engineer. @@ -2101,6 +2145,7 @@ This cannot be undone! Enable camera access + Увімкніть доступ до камери No comment provided by engineer. @@ -2110,6 +2155,7 @@ This cannot be undone! Enable in direct chats (BETA)! + Увімкнути в прямих чатах (BETA)! No comment provided by engineer. @@ -2154,10 +2200,12 @@ This cannot be undone! Encrypt local files + Шифрування локальних файлів No comment provided by engineer. Encrypt stored files & media + Шифрування збережених файлів і носіїв No comment provided by engineer. @@ -2172,6 +2220,7 @@ This cannot be undone! Encrypted message: app is stopped + Зашифроване повідомлення: додаток зупинено notification @@ -2201,10 +2250,12 @@ This cannot be undone! Encryption re-negotiation error + Помилка повторного узгодження шифрування message decrypt error item Encryption re-negotiation failed. + Повторне узгодження шифрування не вдалося. No comment provided by engineer. @@ -2219,10 +2270,12 @@ This cannot be undone! Enter group name… + Введіть назву групи… No comment provided by engineer. Enter passphrase + Введіть парольну фразу No comment provided by engineer. @@ -2242,6 +2295,7 @@ This cannot be undone! Enter this device name… + Введіть назву пристрою… No comment provided by engineer. @@ -2256,6 +2310,7 @@ This cannot be undone! Enter your name… + Введіть своє ім'я… No comment provided by engineer. @@ -2285,6 +2340,7 @@ This cannot be undone! Error allowing contact PQ encryption + Помилка, що дозволяє шифрування контакту PQ No comment provided by engineer. @@ -2319,10 +2375,12 @@ This cannot be undone! Error creating member contact + Помилка при створенні контакту користувача No comment provided by engineer. Error creating message + Повідомлення про створення помилки No comment provided by engineer. @@ -2332,6 +2390,7 @@ This cannot be undone! Error decrypting file + Помилка розшифрування файлу No comment provided by engineer. @@ -2376,6 +2435,7 @@ This cannot be undone! Error downloading the archive + Помилка завантаження архіву No comment provided by engineer. @@ -2415,6 +2475,7 @@ This cannot be undone! Error opening chat + Помилка відкриття чату No comment provided by engineer. @@ -2454,6 +2515,7 @@ This cannot be undone! Error saving settings + Налаштування збереження помилок when migrating @@ -2463,6 +2525,7 @@ This cannot be undone! Error scanning code: %@ + Код помилки сканування: %@ No comment provided by engineer. @@ -2472,6 +2535,7 @@ This cannot be undone! Error sending member contact invitation + Помилка надсилання запрошення до контактів учасника No comment provided by engineer. @@ -2526,10 +2590,12 @@ This cannot be undone! Error uploading the archive + Помилка при завантаженні архіву No comment provided by engineer. Error verifying passphrase: + Помилка при перевірці парольної фрази: No comment provided by engineer. @@ -2564,6 +2630,7 @@ This cannot be undone! Expand + Розгорнути chat item action @@ -2583,6 +2650,7 @@ This cannot be undone! Exported file doesn't exist + Експортований файл не існує No comment provided by engineer. @@ -2602,6 +2670,7 @@ This cannot be undone! Faster joining and more reliable messages. + Швидше приєднання та надійніші повідомлення. No comment provided by engineer. @@ -2656,10 +2725,12 @@ This cannot be undone! Finalize migration + Завершити міграцію No comment provided by engineer. Finalize migration on another device. + Завершіть міграцію на іншому пристрої. No comment provided by engineer. @@ -2709,6 +2780,7 @@ This cannot be undone! Found desktop + Знайдено робочий стіл No comment provided by engineer. @@ -2733,6 +2805,7 @@ This cannot be undone! Fully decentralized – visible only to members. + Повністю децентралізована - видима лише для учасників. No comment provided by engineer. @@ -2757,10 +2830,12 @@ This cannot be undone! Group already exists + Група вже існує No comment provided by engineer. Group already exists! + Група вже існує! No comment provided by engineer. @@ -2920,6 +2995,7 @@ This cannot be undone! History is not sent to new members. + Історія не надсилається новим учасникам. No comment provided by engineer. @@ -2949,6 +3025,7 @@ This cannot be undone! Hungarian interface + Інтерфейс угорською мовою No comment provided by engineer. @@ -3018,14 +3095,17 @@ This cannot be undone! Import failed + Не вдалося імпортувати No comment provided by engineer. Importing archive + Імпорт архіву No comment provided by engineer. Improved message delivery + Покращена доставка повідомлень No comment provided by engineer. @@ -3040,6 +3120,7 @@ This cannot be undone! In order to continue, chat should be stopped. + Для того, щоб продовжити, чат слід зупинити. No comment provided by engineer. @@ -3054,6 +3135,7 @@ This cannot be undone! Incognito groups + Групи інкогніто No comment provided by engineer. @@ -3088,6 +3170,7 @@ This cannot be undone! Incompatible version + Несумісна версія No comment provided by engineer. @@ -3134,6 +3217,7 @@ This cannot be undone! Invalid QR code + Неправильний QR-код No comment provided by engineer. @@ -3143,22 +3227,27 @@ This cannot be undone! Invalid display name! + Неправильне ім'я користувача! No comment provided by engineer. Invalid link + Невірне посилання No comment provided by engineer. Invalid migration confirmation + Недійсне підтвердження міграції No comment provided by engineer. Invalid name! + Неправильне ім'я! No comment provided by engineer. Invalid response + Неправильна відповідь No comment provided by engineer. @@ -3254,10 +3343,12 @@ This cannot be undone! Join group conversations + Приєднуйтесь до групових розмов No comment provided by engineer. Join group? + Приєднатися до групи? No comment provided by engineer. @@ -3267,11 +3358,14 @@ This cannot be undone! Join with current profile + Приєднатися з поточним профілем No comment provided by engineer. Join your group? This is your link for group %@! + Приєднатися до групи? +Це ваше посилання на групу %@! No comment provided by engineer. @@ -3281,14 +3375,17 @@ This is your link for group %@! Keep + Тримай No comment provided by engineer. Keep the app open to use it from desktop + Тримайте додаток відкритим, щоб використовувати його з робочого столу No comment provided by engineer. Keep unused invitation? + Зберігати невикористані запрошення? No comment provided by engineer. @@ -3353,14 +3450,17 @@ This is your link for group %@! Link mobile and desktop apps! 🔗 + Зв'яжіть мобільні та десктопні додатки! 🔗 No comment provided by engineer. Linked desktop options + Параметри пов'язаного робочого столу No comment provided by engineer. Linked desktops + Пов'язані робочі столи No comment provided by engineer. @@ -3510,6 +3610,7 @@ This is your link for group %@! Message too large + Повідомлення занадто велике No comment provided by engineer. @@ -3524,38 +3625,47 @@ This is your link for group %@! Messages from %@ will be shown! + Повідомлення від %@ будуть показані! No comment provided by engineer. Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery. + Повідомлення, файли та дзвінки захищені **наскрізним шифруванням** з ідеальною секретністю переадресації, відмовою та відновленням після злому. No comment provided by engineer. Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery. + Повідомлення, файли та дзвінки захищені **квантово-стійким шифруванням e2e** з ідеальною секретністю переадресації, відмовою та відновленням після злому. No comment provided by engineer. Migrate device + Перенести пристрій No comment provided by engineer. Migrate from another device + Перехід з іншого пристрою No comment provided by engineer. Migrate here + Мігруйте сюди No comment provided by engineer. Migrate to another device + Перехід на інший пристрій No comment provided by engineer. Migrate to another device via QR code. + Перейдіть на інший пристрій за допомогою QR-коду. No comment provided by engineer. Migrating + Міграція No comment provided by engineer. @@ -3565,6 +3675,7 @@ This is your link for group %@! Migration complete + Міграція завершена No comment provided by engineer. @@ -3659,6 +3770,7 @@ This is your link for group %@! New chat + Новий чат No comment provided by engineer. @@ -3678,6 +3790,7 @@ This is your link for group %@! New desktop app! + Новий десктопний додаток! No comment provided by engineer. @@ -3762,6 +3875,7 @@ This is your link for group %@! Not compatible! + Не сумісні! No comment provided by engineer. @@ -3785,6 +3899,7 @@ This is your link for group %@! OK + ОК No comment provided by engineer. @@ -3899,6 +4014,7 @@ This is your link for group %@! Open + Відкрито No comment provided by engineer. @@ -3918,10 +4034,12 @@ This is your link for group %@! Open group + Відкрита група No comment provided by engineer. Open migration to another device + Відкрита міграція на інший пристрій authentication reason @@ -3936,22 +4054,27 @@ This is your link for group %@! Opening app… + Відкриваємо програму… No comment provided by engineer. Or paste archive link + Або вставте посилання на архів No comment provided by engineer. Or scan QR code + Або відскануйте QR-код No comment provided by engineer. Or securely share this file link + Або безпечно поділіться цим посиланням на файл No comment provided by engineer. Or show this code + Або покажіть цей код No comment provided by engineer. @@ -3996,10 +4119,12 @@ This is your link for group %@! Past member %@ + Колишній учасник %@ past/unknown group member Paste desktop address + Вставте адресу робочого столу No comment provided by engineer. @@ -4009,10 +4134,12 @@ This is your link for group %@! Paste link to connect! + Вставте посилання для підключення! No comment provided by engineer. Paste the link you received + Вставте отримане посилання No comment provided by engineer. @@ -4032,6 +4159,7 @@ This is your link for group %@! Picture-in-picture calls + Дзвінки "картинка в картинці No comment provided by engineer. @@ -4056,11 +4184,14 @@ This is your link for group %@! Please confirm that network settings are correct for this device. + Переконайтеся, що налаштування мережі для цього пристрою є правильними. No comment provided by engineer. Please contact developers. Error: %@ + Зверніться до розробників. +Помилка: %@ No comment provided by engineer. @@ -4115,6 +4246,7 @@ Error: %@ Post-quantum E2EE + Пост-квантовий E2EE No comment provided by engineer. @@ -4154,6 +4286,7 @@ Error: %@ Private notes + Приватні нотатки name of notes to self @@ -4168,10 +4301,12 @@ Error: %@ Profile name + Назва профілю No comment provided by engineer. Profile name: + Ім'я профілю: No comment provided by engineer. @@ -4251,10 +4386,12 @@ Error: %@ Push server + Push-сервер No comment provided by engineer. Quantum resistant encryption + Квантово-стійке шифрування No comment provided by engineer. @@ -4284,6 +4421,7 @@ Error: %@ Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + Читайте більше в [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). No comment provided by engineer. @@ -4343,6 +4481,7 @@ Error: %@ Recent history and improved [directory bot](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). + Нещодавня історія та покращення [directory bot](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). No comment provided by engineer. @@ -4437,22 +4576,27 @@ Error: %@ Repeat connection request? + Повторити запит на підключення? No comment provided by engineer. Repeat download + Повторити завантаження No comment provided by engineer. Repeat import + Повторний імпорт No comment provided by engineer. Repeat join request? + Повторити запит на приєднання? No comment provided by engineer. Repeat upload + Повторне завантаження No comment provided by engineer. @@ -4512,6 +4656,7 @@ Error: %@ Retry + Спробуйте ще раз No comment provided by engineer. @@ -4556,6 +4701,7 @@ Error: %@ Safer groups + Безпечніші групи No comment provided by engineer. @@ -4610,7 +4756,7 @@ Error: %@ Save preferences? - Зберегти налаштування? + Зберегти настройки? No comment provided by engineer. @@ -4645,6 +4791,7 @@ Error: %@ Saved message + Збережене повідомлення message info title @@ -4654,6 +4801,7 @@ Error: %@ Scan QR code from desktop + Відскануйте QR-код з робочого столу No comment provided by engineer. @@ -4678,10 +4826,12 @@ Error: %@ Search bar accepts invitation links. + Рядок пошуку приймає посилання-запрошення. No comment provided by engineer. Search or paste SimpleX link + Знайдіть або вставте посилання SimpleX No comment provided by engineer. @@ -4746,6 +4896,7 @@ Error: %@ Send direct message to connect + Надішліть пряме повідомлення, щоб підключитися No comment provided by engineer. @@ -4790,6 +4941,7 @@ Error: %@ Send up to 100 last messages to new members. + Надішліть до 100 останніх повідомлень новим користувачам. No comment provided by engineer. @@ -4889,6 +5041,7 @@ Error: %@ Session code + Код сесії No comment provided by engineer. @@ -4918,6 +5071,7 @@ Error: %@ Set passphrase + Встановити парольну фразу No comment provided by engineer. @@ -4967,6 +5121,7 @@ Error: %@ Share this 1-time invite link + Поділіться цим одноразовим посиланням-запрошенням No comment provided by engineer. @@ -4976,6 +5131,7 @@ Error: %@ Show QR code + Показати QR-код No comment provided by engineer. @@ -5065,6 +5221,7 @@ Error: %@ Simplified incognito mode + Спрощений режим інкогніто No comment provided by engineer. @@ -5099,6 +5256,7 @@ Error: %@ Start chat? + Почати чат? No comment provided by engineer. @@ -5118,6 +5276,7 @@ Error: %@ Stop chat + Припинити чат No comment provided by engineer. @@ -5162,6 +5321,7 @@ Error: %@ Stopping chat + Зупинка чату No comment provided by engineer. @@ -5216,6 +5376,7 @@ Error: %@ Tap to Connect + Натисніть, щоб підключитися No comment provided by engineer. @@ -5235,10 +5396,12 @@ Error: %@ Tap to paste link + Натисніть, щоб вставити посилання No comment provided by engineer. Tap to scan + Натисніть, щоб сканувати No comment provided by engineer. @@ -5305,6 +5468,7 @@ It can happen because of some bug or when the connection is compromised. The code you scanned is not a SimpleX link QR code. + Відсканований вами код не є QR-кодом посилання SimpleX. No comment provided by engineer. @@ -5374,6 +5538,7 @@ It can happen because of some bug or when the connection is compromised. The text you pasted is not a SimpleX link. + Текст, який ви вставили, не є посиланням SimpleX. No comment provided by engineer. @@ -5408,18 +5573,22 @@ It can happen because of some bug or when the connection is compromised. This chat is protected by end-to-end encryption. + Цей чат захищений наскрізним шифруванням. E2EE info chat item This chat is protected by quantum resistant end-to-end encryption. + Цей чат захищений квантово-стійким наскрізним шифруванням. E2EE info chat item This device name + Це ім'я пристрою No comment provided by engineer. This display name is invalid. Please choose another name. + Це ім'я для відображення є недійсним. Будь ласка, виберіть інше ім'я. No comment provided by engineer. @@ -5434,10 +5603,12 @@ It can happen because of some bug or when the connection is compromised. This is your own SimpleX address! + Це ваша власна SimpleX-адреса! No comment provided by engineer. This is your own one-time link! + Це ваше власне одноразове посилання! No comment provided by engineer. @@ -5457,6 +5628,7 @@ It can happen because of some bug or when the connection is compromised. To hide unwanted messages. + Приховати небажані повідомлення. No comment provided by engineer. @@ -5503,6 +5675,7 @@ You will be prompted to complete authentication before this feature is enabled.< Toggle incognito when connecting. + Увімкніть інкогніто при підключенні. No comment provided by engineer. @@ -5522,6 +5695,7 @@ You will be prompted to complete authentication before this feature is enabled.< Turkish interface + Турецький інтерфейс No comment provided by engineer. @@ -5541,22 +5715,27 @@ You will be prompted to complete authentication before this feature is enabled.< Unblock + Розблoкувати No comment provided by engineer. Unblock for all + Розблокування для всіх No comment provided by engineer. Unblock member + Розблокувати учасника No comment provided by engineer. Unblock member for all? + Розблокувати учасника для всіх? No comment provided by engineer. Unblock member? + Розблокувати учасника? No comment provided by engineer. @@ -5623,10 +5802,12 @@ To connect, please ask your contact to create another connection link and check Unlink + Роз'єднати зв'язок No comment provided by engineer. Unlink desktop? + Від'єднати робочий стіл? No comment provided by engineer. @@ -5651,6 +5832,7 @@ To connect, please ask your contact to create another connection link and check Up to 100 last messages are sent to new members. + Новим користувачам надсилається до 100 останніх повідомлень. No comment provided by engineer. @@ -5695,6 +5877,7 @@ To connect, please ask your contact to create another connection link and check Upload failed + Не вдалося завантфжити No comment provided by engineer. @@ -5704,6 +5887,7 @@ To connect, please ask your contact to create another connection link and check Uploading archive + Завантаження архіву No comment provided by engineer. @@ -5733,6 +5917,7 @@ To connect, please ask your contact to create another connection link and check Use from desktop + Використання з робочого столу No comment provided by engineer. @@ -5747,6 +5932,7 @@ To connect, please ask your contact to create another connection link and check Use only local notifications? + Використовувати лише локальні сповіщення? No comment provided by engineer. @@ -5756,6 +5942,7 @@ 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. @@ -5775,10 +5962,12 @@ To connect, please ask your contact to create another connection link and check Verify code with desktop + Перевірте код на робочому столі No comment provided by engineer. Verify connection + Перевірте з'єднання No comment provided by engineer. @@ -5788,14 +5977,17 @@ To connect, please ask your contact to create another connection link and check Verify connections + Пeревірте з'єднання No comment provided by engineer. Verify database passphrase + Перевірте пароль до бази даних No comment provided by engineer. Verify passphrase + Підтвердіть парольну фразу No comment provided by engineer. @@ -5810,6 +6002,7 @@ To connect, please ask your contact to create another connection link and check Via secure quantum resistant protocol. + Через безпечний квантово-стійкий протокол. No comment provided by engineer. @@ -5839,6 +6032,7 @@ To connect, please ask your contact to create another connection link and check Visible history + Видима історія chat feature @@ -5868,6 +6062,7 @@ To connect, please ask your contact to create another connection link and check Waiting for desktop... + Чекаємо на десктопну версію... No comment provided by engineer. @@ -5887,6 +6082,7 @@ To connect, please ask your contact to create another connection link and check Warning: starting chat on multiple devices is not supported and will cause message delivery failures + Попередження: запуск чату на декількох пристроях не підтримується і може призвести до збоїв у доставці повідомлень No comment provided by engineer. @@ -5911,6 +6107,7 @@ To connect, please ask your contact to create another connection link and check Welcome message is too long + Привітальне повідомлення занадто довге No comment provided by engineer. @@ -5935,6 +6132,7 @@ To connect, please ask your contact to create another connection link and check With encrypted files and media. + З зашифрованими файлами та медіа. No comment provided by engineer. @@ -5944,6 +6142,7 @@ To connect, please ask your contact to create another connection link and check With reduced battery usage. + З меншим споживанням заряду акумулятора. No comment provided by engineer. @@ -5968,6 +6167,7 @@ To connect, please ask your contact to create another connection link and check You **must not** use the same database on two devices. + Ви **не повинні використовувати** одну і ту ж базу даних на двох пристроях. No comment provided by engineer. @@ -5992,31 +6192,39 @@ To connect, please ask your contact to create another connection link and check You are already connecting to %@. + Ви вже з'єднані з %@. No comment provided by engineer. You are already connecting via this one-time link! + Ви вже підключаєтеся до %@.Ви вже підключаєтеся за цим одноразовим посиланням! No comment provided by engineer. You are already in group %@. + Ви вже перебуваєте в групі %@. No comment provided by engineer. You are already joining the group %@. + Ви вже приєдналися до групи %@. No comment provided by engineer. You are already joining the group via this link! + Ви вже приєдналися до групи за цим посиланням! No comment provided by engineer. You are already joining the group via this link. + Ви вже приєдналися до групи за цим посиланням. No comment provided by engineer. You are already joining the group! Repeat join request? + Ви вже приєдналися до групи! +Повторити запит на приєднання? No comment provided by engineer. @@ -6051,6 +6259,7 @@ Repeat join request? You can give another try. + Ви можете спробувати ще раз. No comment provided by engineer. @@ -6060,6 +6269,7 @@ Repeat join request? You can make it visible to your SimpleX contacts via Settings. + Ви можете зробити його видимим для ваших контактів у SimpleX за допомогою налаштувань. No comment provided by engineer. @@ -6104,6 +6314,7 @@ Repeat join request? You can view invitation link again in connection details. + Ви можете переглянути посилання на запрошення ще раз у деталях підключення. No comment provided by engineer. @@ -6123,11 +6334,14 @@ Repeat join request? You have already requested connection via this address! + Ви вже надсилали запит на підключення за цією адресою! No comment provided by engineer. You have already requested connection! Repeat connection request? + Ви вже надіслали запит на підключення! +Повторити запит на підключення? No comment provided by engineer. @@ -6182,6 +6396,7 @@ Repeat connection request? You will be connected when group link host's device is online, please wait or check later! + Ви будете підключені, коли пристрій хоста групового посилання буде онлайн, будь ласка, зачекайте або перевірте пізніше! No comment provided by engineer. @@ -6201,6 +6416,7 @@ Repeat connection request? You will connect to all group members. + Ви з'єднаєтеся з усіма учасниками групи. No comment provided by engineer. @@ -6317,6 +6533,7 @@ You can cancel this connection and remove the contact (and try later with a new Your profile + Ваш профіль No comment provided by engineer. @@ -6413,6 +6630,7 @@ SimpleX servers cannot see your profile. and %lld other events + та %lld інших подій No comment provided by engineer. @@ -6422,6 +6640,7 @@ SimpleX servers cannot see your profile. author + автор member role @@ -6436,14 +6655,17 @@ SimpleX servers cannot see your profile. blocked + заблоковано marked deleted chat item preview text blocked %@ + заблоковано %@ rcv group event chat item blocked by admin + заблоковано адміністратором marked deleted chat item preview text @@ -6518,6 +6740,7 @@ SimpleX servers cannot see your profile. connected directly + з'єднані безпосередньо rcv group event chat item @@ -6567,6 +6790,7 @@ SimpleX servers cannot see your profile. contact %1$@ changed to %2$@ + контакт %1$@ змінено на %2$@ profile update event chat item @@ -6621,6 +6845,7 @@ SimpleX servers cannot see your profile. deleted contact + видалений контакт rcv direct event chat item @@ -6840,6 +7065,7 @@ SimpleX servers cannot see your profile. member %1$@ changed to %2$@ + учасника %1$@ змінено на %2$@ profile update event chat item @@ -6926,7 +7152,7 @@ SimpleX servers cannot see your profile. on - увімкнено + увімкненo group pref value @@ -6941,6 +7167,7 @@ SimpleX servers cannot see your profile. quantum resistant e2e encryption + квантово-стійке шифрування e2e chat item text @@ -6970,10 +7197,12 @@ SimpleX servers cannot see your profile. removed contact address + видалено контактну адресу profile update event chat item removed profile picture + видалено зображення профілю profile update event chat item @@ -7003,18 +7232,22 @@ SimpleX servers cannot see your profile. send direct message + надіслати пряме повідомлення No comment provided by engineer. set new contact address + встановити нову контактну адресу profile update event chat item set new profile picture + встановити нове зображення профілю profile update event chat item standard end-to-end encryption + стандартне наскрізне шифрування chat item text @@ -7034,6 +7267,7 @@ SimpleX servers cannot see your profile. unblocked %@ + розблоковано %@ rcv group event chat item @@ -7043,6 +7277,7 @@ SimpleX servers cannot see your profile. unknown status + невідомий статус No comment provided by engineer. @@ -7052,10 +7287,12 @@ SimpleX servers cannot see your profile. updated profile + оновлений профіль profile update event chat item v%@ + v%@ No comment provided by engineer. @@ -7125,6 +7362,7 @@ SimpleX servers cannot see your profile. you blocked %@ + ви заблокували %@ snd group event chat item @@ -7169,6 +7407,7 @@ SimpleX servers cannot see your profile. you unblocked %@ + ви розблокували %@ snd group event chat item @@ -7205,6 +7444,7 @@ SimpleX servers cannot see your profile. SimpleX uses local network access to allow using user chat profile via desktop app on the same network. + SimpleX використовує доступ до локальної мережі, щоб дозволити користувачеві користуватися профілем чату через десктопну програму в тій же мережі. Privacy - Local Network Usage Description diff --git a/apps/ios/SimpleX NSE/ConcurrentQueue.swift b/apps/ios/SimpleX NSE/ConcurrentQueue.swift deleted file mode 100644 index 274a683c00..0000000000 --- a/apps/ios/SimpleX NSE/ConcurrentQueue.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// ConcurrentQueue.swift -// SimpleX NSE -// -// Created by Evgeny on 08/12/2023. -// Copyright © 2023 SimpleX Chat. All rights reserved. -// - -import Foundation - -struct DequeueElement { - var elementId: UUID? - var task: Task -} - -class ConcurrentQueue { - private var queue: [T] = [] - private var queueLock = DispatchQueue(label: "chat.simplex.app.SimpleX-NSE.concurrent-queue.lock.\(UUID())") - private var continuations = [(elementId: UUID, continuation: CheckedContinuation)]() - - func enqueue(_ el: T) { - resumeContinuation(el) { self.queue.append(el) } - } - - func frontEnqueue(_ el: T) { - resumeContinuation(el) { self.queue.insert(el, at: 0) } - } - - private func resumeContinuation(_ el: T, add: @escaping () -> Void) { - queueLock.sync { - if let (_, cont) = continuations.first { - continuations.remove(at: 0) - cont.resume(returning: el) - } else { - add() - } - } - } - - func dequeue() -> DequeueElement { - queueLock.sync { - if queue.isEmpty { - let elementId = UUID() - let task = Task { - await withCheckedContinuation { cont in - continuations.append((elementId, cont)) - } - } - return DequeueElement(elementId: elementId, task: task) - } else { - let el = queue.remove(at: 0) - return DequeueElement(task: Task { el }) - } - } - } - - func cancelDequeue(_ elementId: UUID) { - queueLock.sync { - let cancelled = continuations.filter { $0.elementId == elementId } - continuations.removeAll { $0.elementId == elementId } - cancelled.forEach { $0.continuation.resume(returning: nil) } - } - } -} diff --git a/apps/ios/SimpleX NSE/NotificationService.swift b/apps/ios/SimpleX NSE/NotificationService.swift index 6f76781837..efd8f33dd8 100644 --- a/apps/ios/SimpleX NSE/NotificationService.swift +++ b/apps/ios/SimpleX NSE/NotificationService.swift @@ -22,110 +22,6 @@ let nseSuspendSchedule: SuspendSchedule = (2, 4) let fastNSESuspendSchedule: SuspendSchedule = (1, 1) -typealias NtfStream = ConcurrentQueue - -// Notifications are delivered via concurrent queues, as they are all received from chat controller in a single loop that -// writes to ConcurrentQueue and when notification is processed, the instance of Notification service extension reads from the queue. -// One queue per connection (entity) is used. -// The concurrent queues allow read cancellation, to ensure that notifications are not lost in case the current thread completes -// before expected notification is read (multiple notifications can be expected, because one notification can be delivered for several messages). -actor PendingNtfs { - static let shared = PendingNtfs() - private var ntfStreams: [String: NtfStream] = [:] - - func createStream(_ id: String) async { - logger.debug("NotificationService PendingNtfs.createStream: \(id)") - if ntfStreams[id] == nil { - ntfStreams[id] = ConcurrentQueue() - logger.debug("NotificationService PendingNtfs.createStream: created ConcurrentQueue") - } - } - - func readStream(_ id: String, for nse: NotificationService, ntfInfo: NtfMessages) async { - logger.debug("NotificationService PendingNtfs.readStream: \(id) \(ntfInfo.ntfMessages.count)") - if !ntfInfo.user.showNotifications { - nse.setBestAttemptNtf(.empty) - } - if let s = ntfStreams[id] { - logger.debug("NotificationService PendingNtfs.readStream: has stream") - var expected = Set(ntfInfo.ntfMessages.map { $0.msgId }) - logger.debug("NotificationService PendingNtfs.readStream: expecting: \(expected)") - var readCancelled = false - var dequeued: DequeueElement? - nse.cancelRead = { - readCancelled = true - if let elementId = dequeued?.elementId { - s.cancelDequeue(elementId) - } - } - while !readCancelled { - dequeued = s.dequeue() - if let ntf = await dequeued?.task.value { - if readCancelled { - logger.debug("NotificationService PendingNtfs.readStream: read cancelled, put ntf to queue front") - s.frontEnqueue(ntf) - break - } else if case let .msgInfo(info) = ntf { - let found = expected.remove(info.msgId) - if found != nil { - logger.debug("NotificationService PendingNtfs.readStream: msgInfo, last: \(expected.isEmpty)") - if expected.isEmpty { break } - } else if let msgTs = ntfInfo.msgTs, info.msgTs > msgTs { - logger.debug("NotificationService PendingNtfs.readStream: unexpected msgInfo") - s.frontEnqueue(ntf) - break - } - } else if ntfInfo.user.showNotifications { - logger.debug("NotificationService PendingNtfs.readStream: setting best attempt") - nse.setBestAttemptNtf(ntf) - if ntf.isCallInvitation { break } - } - } else { - break - } - } - nse.cancelRead = nil - logger.debug("NotificationService PendingNtfs.readStream: exiting") - } - } - - func writeStream(_ id: String, _ ntf: NSENotification) async { - logger.debug("NotificationService PendingNtfs.writeStream: \(id)") - if let s = ntfStreams[id] { - logger.debug("NotificationService PendingNtfs.writeStream: writing ntf") - s.enqueue(ntf) - } - } -} - -// The current implementation assumes concurrent notification delivery and uses semaphores -// to process only one notification per connection (entity) at a time. -class NtfStreamSemaphores { - static let shared = NtfStreamSemaphores() - private static let queue = DispatchQueue(label: "chat.simplex.app.SimpleX-NSE.notification-semaphores.lock") - private var semaphores: [String: DispatchSemaphore] = [:] - - func waitForStream(_ id: String) { - streamSemaphore(id, value: 0)?.wait() - } - - func signalStreamReady(_ id: String) { - streamSemaphore(id, value: 1)?.signal() - } - - // this function returns nil if semaphore is just created, so passed value shoud be coordinated with the desired end value of the semaphore - private func streamSemaphore(_ id: String, value: Int) -> DispatchSemaphore? { - NtfStreamSemaphores.queue.sync { - if let s = semaphores[id] { - return s - } else { - semaphores[id] = DispatchSemaphore(value: value) - return nil - } - } - } -} - enum NSENotification { case nse(UNMutableNotificationContent) case callkit(RcvCallInvitation) @@ -149,7 +45,7 @@ class NSEThreads { static let shared = NSEThreads() private static let queue = DispatchQueue(label: "chat.simplex.app.SimpleX-NSE.notification-threads.lock") private var allThreads: Set = [] - private var activeThreads: Set = [] + private var activeThreads: [(UUID, NotificationService)] = [] func newThread() -> UUID { NSEThreads.queue.sync { @@ -158,19 +54,42 @@ class NSEThreads { } } - func startThread(_ t: UUID) { + func startThread(_ t: UUID, _ service: NotificationService) { NSEThreads.queue.sync { if allThreads.contains(t) { - _ = activeThreads.insert(t) + activeThreads.append((t, service)) } else { logger.warning("NotificationService startThread: thread \(t) was removed before it started") } } } + func processNotification(_ id: ChatId, _ ntf: NSENotification) async -> Void { + var waitTime: Int64 = 5_000_000000 + while waitTime > 0 { + if let (_, nse) = rcvEntityThread(id), + nse.shouldProcessNtf && nse.processReceivedNtf(ntf) { + break + } else { + try? await Task.sleep(nanoseconds: 10_000000) + waitTime -= 10_000000 + } + } + } + + private func rcvEntityThread(_ id: ChatId) -> (UUID, NotificationService)? { + NSEThreads.queue.sync { + activeThreads.first(where: { (_, nse) in nse.receiveEntityId == id }) + } + } + func endThread(_ t: UUID) -> Bool { NSEThreads.queue.sync { - let tActive = activeThreads.remove(t) + let tActive: UUID? = if let index = activeThreads.firstIndex(where: { $0.0 == t }) { + activeThreads.remove(at: index).0 + } else { + nil + } let t = allThreads.remove(t) if tActive != nil && activeThreads.isEmpty { return true @@ -198,8 +117,11 @@ class NotificationService: UNNotificationServiceExtension { // thread is added to allThreads here - if thread did not start chat, // chat does not need to be suspended but NSE state still needs to be set to "suspended". var threadId: UUID? = NSEThreads.shared.newThread() + var notificationInfo: NtfMessages? var receiveEntityId: String? - var cancelRead: (() -> Void)? + var expectedMessages: Set = [] + // return true if the message is taken - it prevents sending it to another NotificationService instance for processing + var shouldProcessNtf = false var appSubscriber: AppSubscriber? var returnedSuspension = false @@ -265,7 +187,7 @@ class NotificationService: UNNotificationServiceExtension { // check it here again appStateGroupDefault.get().inactive { // thread is added to activeThreads tracking set here - if thread started chat it needs to be suspended - if let t = threadId { NSEThreads.shared.startThread(t) } + if let t = threadId { NSEThreads.shared.startThread(t, self) } let dbStatus = startChat() if case .ok = dbStatus, let ntfInfo = apiGetNtfMessage(nonce: nonce, encNtfInfo: encNtfInfo) { @@ -276,17 +198,11 @@ class NotificationService: UNNotificationServiceExtension { ? .nse(createConnectionEventNtf(ntfInfo.user, connEntity)) : .empty ) - if let id = connEntity.id { + if let id = connEntity.id, ntfInfo.msgTs != nil { + notificationInfo = ntfInfo receiveEntityId = id - NtfStreamSemaphores.shared.waitForStream(id) - if receiveEntityId != nil { - Task { - logger.debug("NotificationService: receiveNtfMessages: in Task, connEntity id \(id)") - await PendingNtfs.shared.createStream(id) - await PendingNtfs.shared.readStream(id, for: self, ntfInfo: ntfInfo) - deliverBestAttemptNtf() - } - } + expectedMessages = Set(ntfInfo.ntfMessages.map { $0.msgId }) + shouldProcessNtf = true return } } @@ -302,6 +218,38 @@ class NotificationService: UNNotificationServiceExtension { deliverBestAttemptNtf(urgent: true) } + func processReceivedNtf(_ ntf: NSENotification) -> Bool { + guard let ntfInfo = notificationInfo, let msgTs = ntfInfo.msgTs else { return false } + if !ntfInfo.user.showNotifications { + self.setBestAttemptNtf(.empty) + } + if case let .msgInfo(info) = ntf { + let found = expectedMessages.remove(info.msgId) + if found != nil { + logger.debug("NotificationService processNtf: msgInfo, last: \(self.expectedMessages.isEmpty)") + if expectedMessages.isEmpty { + self.deliverBestAttemptNtf() + } + return true + } else if info.msgTs > msgTs { + logger.debug("NotificationService processNtf: unexpected msgInfo, let other instance to process it, stopping this one") + self.deliverBestAttemptNtf() + return false + } else { + logger.debug("NotificationService processNtf: unknown message, let other instance to process it") + return false + } + } else if ntfInfo.user.showNotifications { + logger.debug("NotificationService processNtf: setting best attempt") + self.setBestAttemptNtf(ntf) + if ntf.isCallInvitation { + self.deliverBestAttemptNtf() + } + return true + } + return false + } + func setBadgeCount() { badgeCount = ntfBadgeCountGroupDefault.get() + 1 ntfBadgeCountGroupDefault.set(badgeCount) @@ -323,14 +271,9 @@ class NotificationService: UNNotificationServiceExtension { private func deliverBestAttemptNtf(urgent: Bool = false) { logger.debug("NotificationService.deliverBestAttemptNtf") - if let cancel = cancelRead { - cancelRead = nil - cancel() - } - if let id = receiveEntityId { - receiveEntityId = nil - NtfStreamSemaphores.shared.signalStreamReady(id) - } + // stop processing other messages + shouldProcessNtf = false + let suspend: Bool if let t = threadId { threadId = nil @@ -572,7 +515,7 @@ func chatSuspended() { } // A single loop is used per Notification service extension process to receive and process all messages depending on the NSE state -// If the extension is not active yet, or suspended/suspending, or the app is running, the notifications will no be received. +// If the extension is not active yet, or suspended/suspending, or the app is running, the notifications will not be received. func receiveMessages() async { logger.debug("NotificationService receiveMessages") while true { @@ -591,8 +534,7 @@ func receiveMessages() async { logger.debug("NotificationService receiveMsg: message") if let (id, ntf) = await receivedMsgNtf(msg) { logger.debug("NotificationService receiveMsg: notification") - await PendingNtfs.shared.createStream(id) - await PendingNtfs.shared.writeStream(id, ntf) + await NSEThreads.shared.processNotification(id, ntf) } } } diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 9e43249650..6443c21b9e 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -36,11 +36,6 @@ 5C35CFC827B2782E00FB6C6D /* BGManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFC727B2782E00FB6C6D /* BGManager.swift */; }; 5C35CFCB27B2E91D00FB6C6D /* NtfManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFCA27B2E91D00FB6C6D /* NtfManager.swift */; }; 5C36027327F47AD5009F19D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C36027227F47AD5009F19D9 /* AppDelegate.swift */; }; - 5C371E742BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E6F2BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a */; }; - 5C371E752BACC5D600100AD3 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E702BACC5D600100AD3 /* libgmpxx.a */; }; - 5C371E762BACC5D600100AD3 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E712BACC5D600100AD3 /* libffi.a */; }; - 5C371E772BACC5D600100AD3 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E722BACC5D600100AD3 /* libgmp.a */; }; - 5C371E782BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E732BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a */; }; 5C3A88CE27DF50170060F1C2 /* DetermineWidth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */; }; 5C3A88D127DF57800060F1C2 /* FramedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88D027DF57800060F1C2 /* FramedItemView.swift */; }; 5C3CCFCC2AE6BD3100C3F0C3 /* ConnectDesktopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3CCFCB2AE6BD3100C3F0C3 /* ConnectDesktopView.swift */; }; @@ -116,6 +111,11 @@ 5CC2C0FC2809BF11000C35E3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FA2809BF11000C35E3 /* Localizable.strings */; }; 5CC2C0FF2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FD2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings */; }; 5CC868F329EB540C0017BBFD /* CIRcvDecryptionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC868F229EB540C0017BBFD /* CIRcvDecryptionError.swift */; }; + 5CC932F52BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC932F02BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a */; }; + 5CC932F62BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC932F12BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a */; }; + 5CC932F72BBDD9FA008A1EB6 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC932F22BBDD9F9008A1EB6 /* libgmpxx.a */; }; + 5CC932F82BBDD9FA008A1EB6 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC932F32BBDD9F9008A1EB6 /* libgmp.a */; }; + 5CC932F92BBDD9FA008A1EB6 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC932F42BBDD9F9008A1EB6 /* libffi.a */; }; 5CCB939C297EFCB100399E78 /* NavStackCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCB939B297EFCB100399E78 /* NavStackCompat.swift */; }; 5CD67B8F2B0E858A00C510B1 /* hs_init.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CD67B8D2B0E858A00C510B1 /* hs_init.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5CD67B902B0E858A00C510B1 /* hs_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 5CD67B8E2B0E858A00C510B1 /* hs_init.c */; }; @@ -144,7 +144,6 @@ 5CEACCED27DEA495000BD591 /* MsgContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCEC27DEA495000BD591 /* MsgContentView.swift */; }; 5CEBD7462A5C0A8F00665FE2 /* KeyboardPadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */; }; 5CEBD7482A5F115D00665FE2 /* SetDeliveryReceiptsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEBD7472A5F115D00665FE2 /* SetDeliveryReceiptsView.swift */; }; - 5CF9371E2B23429500E1D781 /* ConcurrentQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF9371D2B23429500E1D781 /* ConcurrentQueue.swift */; }; 5CF937202B24DE8C00E1D781 /* SharedFileSubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF9371F2B24DE8C00E1D781 /* SharedFileSubscriber.swift */; }; 5CF937232B2503D000E1D781 /* NSESubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF937212B25034A00E1D781 /* NSESubscriber.swift */; }; 5CFA59C42860BC6200863A68 /* MigrateToAppGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFA59C32860BC6200863A68 /* MigrateToAppGroupView.swift */; }; @@ -291,11 +290,6 @@ 5C371E4E2BA9AAA200100AD3 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; 5C371E4F2BA9AB6400100AD3 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = "hu.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = ""; }; 5C371E502BA9AB6400100AD3 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InfoPlist.strings; sourceTree = ""; }; - 5C371E6F2BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a"; sourceTree = ""; }; - 5C371E702BACC5D600100AD3 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; - 5C371E712BACC5D600100AD3 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 5C371E722BACC5D600100AD3 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; - 5C371E732BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a"; sourceTree = ""; }; 5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetermineWidth.swift; sourceTree = ""; }; 5C3A88D027DF57800060F1C2 /* FramedItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FramedItemView.swift; sourceTree = ""; }; 5C3CCFCB2AE6BD3100C3F0C3 /* ConnectDesktopView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectDesktopView.swift; sourceTree = ""; }; @@ -408,6 +402,11 @@ 5CC2C0FB2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; 5CC2C0FE2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = "ru.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = ""; }; 5CC868F229EB540C0017BBFD /* CIRcvDecryptionError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIRcvDecryptionError.swift; sourceTree = ""; }; + 5CC932F02BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a"; sourceTree = ""; }; + 5CC932F12BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a"; sourceTree = ""; }; + 5CC932F22BBDD9F9008A1EB6 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; + 5CC932F32BBDD9F9008A1EB6 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; + 5CC932F42BBDD9F9008A1EB6 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; 5CCB939B297EFCB100399E78 /* NavStackCompat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavStackCompat.swift; sourceTree = ""; }; 5CD67B8D2B0E858A00C510B1 /* hs_init.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hs_init.h; sourceTree = ""; }; 5CD67B8E2B0E858A00C510B1 /* hs_init.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = hs_init.c; sourceTree = ""; }; @@ -437,7 +436,6 @@ 5CEACCEC27DEA495000BD591 /* MsgContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MsgContentView.swift; sourceTree = ""; }; 5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardPadding.swift; sourceTree = ""; }; 5CEBD7472A5F115D00665FE2 /* SetDeliveryReceiptsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetDeliveryReceiptsView.swift; sourceTree = ""; }; - 5CF9371D2B23429500E1D781 /* ConcurrentQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConcurrentQueue.swift; sourceTree = ""; }; 5CF9371F2B24DE8C00E1D781 /* SharedFileSubscriber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedFileSubscriber.swift; sourceTree = ""; }; 5CF937212B25034A00E1D781 /* NSESubscriber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSESubscriber.swift; sourceTree = ""; }; 5CFA59C32860BC6200863A68 /* MigrateToAppGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrateToAppGroupView.swift; sourceTree = ""; }; @@ -523,12 +521,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5C371E752BACC5D600100AD3 /* libgmpxx.a in Frameworks */, - 5C371E742BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a in Frameworks */, 5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */, - 5C371E782BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a in Frameworks */, - 5C371E762BACC5D600100AD3 /* libffi.a in Frameworks */, - 5C371E772BACC5D600100AD3 /* libgmp.a in Frameworks */, + 5CC932F72BBDD9FA008A1EB6 /* libgmpxx.a in Frameworks */, + 5CC932F62BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a in Frameworks */, + 5CC932F52BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a in Frameworks */, + 5CC932F92BBDD9FA008A1EB6 /* libffi.a in Frameworks */, + 5CC932F82BBDD9FA008A1EB6 /* libgmp.a in Frameworks */, 5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -592,11 +590,11 @@ 5C764E5C279C70B7000C6508 /* Libraries */ = { isa = PBXGroup; children = ( - 5C371E712BACC5D600100AD3 /* libffi.a */, - 5C371E722BACC5D600100AD3 /* libgmp.a */, - 5C371E702BACC5D600100AD3 /* libgmpxx.a */, - 5C371E6F2BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a */, - 5C371E732BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a */, + 5CC932F42BBDD9F9008A1EB6 /* libffi.a */, + 5CC932F32BBDD9F9008A1EB6 /* libgmp.a */, + 5CC932F22BBDD9F9008A1EB6 /* libgmpxx.a */, + 5CC932F02BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a */, + 5CC932F12BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a */, ); path = Libraries; sourceTree = ""; @@ -800,7 +798,6 @@ isa = PBXGroup; children = ( 5CDCAD5128186DE400503DA2 /* SimpleX NSE.entitlements */, - 5CF9371D2B23429500E1D781 /* ConcurrentQueue.swift */, 5CDCAD472818589900503DA2 /* NotificationService.swift */, 5CDCAD492818589900503DA2 /* Info.plist */, 5CB0BA862826CB3A00B3292C /* InfoPlist.strings */, @@ -1285,7 +1282,6 @@ files = ( 5CDCAD482818589900503DA2 /* NotificationService.swift in Sources */, 5CFE0922282EEAF60002594B /* ZoomableScrollView.swift in Sources */, - 5CF9371E2B23429500E1D781 /* ConcurrentQueue.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1445,6 +1441,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -1506,6 +1503,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -1534,12 +1532,16 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; + CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; + CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 204; + CURRENT_PROJECT_VERSION = 206; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; + GCC_OPTIMIZATION_LEVEL = s; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "SimpleX--iOS--Info.plist"; INFOPLIST_KEY_NSCameraUsageDescription = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls."; @@ -1558,11 +1560,13 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 5.6; + LLVM_LTO = YES_THIN; + MARKETING_VERSION = 5.6.1; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; SDKROOT = iphoneos; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; }; @@ -1577,12 +1581,16 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; + CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; + CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 204; + CURRENT_PROJECT_VERSION = 206; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; - ENABLE_PREVIEWS = YES; + ENABLE_CODE_COVERAGE = NO; + ENABLE_PREVIEWS = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "SimpleX--iOS--Info.plist"; INFOPLIST_KEY_NSCameraUsageDescription = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls."; @@ -1601,7 +1609,8 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 5.6; + LLVM_LTO = YES; + MARKETING_VERSION = 5.6.1; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; SDKROOT = iphoneos; @@ -1657,12 +1666,15 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; + CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 204; + CURRENT_PROJECT_VERSION = 206; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; + GCC_OPTIMIZATION_LEVEL = s; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "SimpleX NSE/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "SimpleX NSE"; @@ -1673,13 +1685,15 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6; + LLVM_LTO = YES; + MARKETING_VERSION = 5.6.1; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Osize"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; }; @@ -1689,12 +1703,15 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; + CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 204; + CURRENT_PROJECT_VERSION = 206; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; + ENABLE_CODE_COVERAGE = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "SimpleX NSE/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "SimpleX NSE"; @@ -1705,13 +1722,15 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.6; + LLVM_LTO = YES; + MARKETING_VERSION = 5.6.1; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Osize"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; VALIDATE_PRODUCT = YES; @@ -1723,14 +1742,17 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; + CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; + CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 204; + CURRENT_PROJECT_VERSION = 206; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_BITCODE = NO; + GCC_OPTIMIZATION_LEVEL = s; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 SimpleX Chat. All rights reserved."; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -1748,7 +1770,8 @@ "$(inherited)", "$(PROJECT_DIR)/Libraries/sim", ); - MARKETING_VERSION = 5.6; + LLVM_LTO = YES; + MARKETING_VERSION = 5.6.1; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; @@ -1757,6 +1780,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INCLUDE_PATHS = ""; SWIFT_OBJC_BRIDGING_HEADER = ./SimpleXChat/SimpleX.h; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -1769,14 +1793,17 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; + CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; + CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 204; + CURRENT_PROJECT_VERSION = 206; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_BITCODE = NO; + ENABLE_CODE_COVERAGE = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 SimpleX Chat. All rights reserved."; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -1794,7 +1821,8 @@ "$(inherited)", "$(PROJECT_DIR)/Libraries/sim", ); - MARKETING_VERSION = 5.6; + LLVM_LTO = YES; + MARKETING_VERSION = 5.6.1; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; @@ -1803,6 +1831,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INCLUDE_PATHS = ""; SWIFT_OBJC_BRIDGING_HEADER = ./SimpleXChat/SimpleX.h; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; diff --git a/apps/ios/SimpleXChat/APITypes.swift b/apps/ios/SimpleXChat/APITypes.swift index f55c69a349..b18022cfec 100644 --- a/apps/ios/SimpleXChat/APITypes.swift +++ b/apps/ios/SimpleXChat/APITypes.swift @@ -557,11 +557,6 @@ public enum ChatResponse: Decodable, Error { case contactRequestRejected(user: UserRef) case contactUpdated(user: UserRef, toContact: Contact) case groupMemberUpdated(user: UserRef, groupInfo: GroupInfo, fromMember: GroupMember, toMember: GroupMember) - // TODO remove events below - case contactsSubscribed(server: String, contactRefs: [ContactRef]) - case contactsDisconnected(server: String, contactRefs: [ContactRef]) - case contactSubSummary(user: UserRef, contactSubscriptions: [ContactSubStatus]) - // TODO remove events above case networkStatus(networkStatus: NetworkStatus, connections: [String]) case networkStatuses(user_: UserRef?, networkStatuses: [ConnNetworkStatus]) case groupSubscribed(user: UserRef, groupInfo: GroupRef) @@ -724,9 +719,6 @@ public enum ChatResponse: Decodable, Error { case .contactRequestRejected: return "contactRequestRejected" case .contactUpdated: return "contactUpdated" case .groupMemberUpdated: return "groupMemberUpdated" - case .contactsSubscribed: return "contactsSubscribed" - case .contactsDisconnected: return "contactsDisconnected" - case .contactSubSummary: return "contactSubSummary" case .networkStatus: return "networkStatus" case .networkStatuses: return "networkStatuses" case .groupSubscribed: return "groupSubscribed" @@ -885,9 +877,6 @@ public enum ChatResponse: Decodable, Error { case .contactRequestRejected: return noDetails case let .contactUpdated(u, toContact): return withUser(u, String(describing: toContact)) case let .groupMemberUpdated(u, groupInfo, fromMember, toMember): return withUser(u, "groupInfo: \(groupInfo)\nfromMember: \(fromMember)\ntoMember: \(toMember)") - case let .contactsSubscribed(server, contactRefs): return "server: \(server)\ncontacts:\n\(String(describing: contactRefs))" - case let .contactsDisconnected(server, contactRefs): return "server: \(server)\ncontacts:\n\(String(describing: contactRefs))" - case let .contactSubSummary(u, contactSubscriptions): return withUser(u, String(describing: contactSubscriptions)) case let .networkStatus(status, conns): return "networkStatus: \(String(describing: status))\nconnections: \(String(describing: conns))" case let .networkStatuses(u, statuses): return withUser(u, String(describing: statuses)) case let .groupSubscribed(u, groupInfo): return withUser(u, String(describing: groupInfo)) @@ -1827,6 +1816,7 @@ public enum AgentErrorType: Decodable { case BROKER(brokerAddress: String, brokerErr: BrokerErrorType) case AGENT(agentErr: SMPAgentError) case INTERNAL(internalErr: String) + case CRITICAL(offerRestart: Bool, criticalErr: String) case INACTIVE } @@ -1878,6 +1868,8 @@ public enum XFTPErrorType: Decodable { case NO_FILE case HAS_FILE case FILE_IO + case TIMEOUT + case REDIRECT(redirectError: String) case INTERNAL } @@ -1885,6 +1877,8 @@ public enum RCErrorType: Decodable { case `internal`(internalErr: String) case identity case noLocalAddress + case newController + case notDiscovered case tlsStartFailed case exception(exception: String) case ctrlAuth @@ -1910,6 +1904,7 @@ public enum ProtocolTransportError: Decodable { case badBlock case largeMsg case badSession + case noServerAuth case handshake(handshakeErr: SMPHandshakeError) } @@ -1917,6 +1912,7 @@ public enum SMPHandshakeError: Decodable { case PARSE case VERSION case IDENTITY + case BAD_AUTH } public enum SMPAgentError: Decodable { @@ -1938,10 +1934,13 @@ public enum RemoteCtrlError: Decodable { case badState case busy case timeout + case noKnownControllers + case badController case disconnected(remoteCtrlId: Int64, reason: String) case badInvitation case badVersion(appVersion: String) -// case protocolError(protocolError: RemoteProtocolError) + case hTTP2Error(http2Error: String) + case protocolError } public struct MigrationFileLinkData: Codable { diff --git a/apps/ios/SimpleXChat/AppGroup.swift b/apps/ios/SimpleXChat/AppGroup.swift index 4fbe78dc7a..df4de134c2 100644 --- a/apps/ios/SimpleXChat/AppGroup.swift +++ b/apps/ios/SimpleXChat/AppGroup.swift @@ -197,7 +197,7 @@ public let confirmDBUpgradesGroupDefault = BoolDefault(defaults: groupDefaults, public let callKitEnabledGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_CALL_KIT_ENABLED) -public let pqExperimentalEnabledDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_ENCRYPT_LOCAL_FILES) +public let pqExperimentalEnabledDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PQ_EXPERIMENTAL_ENABLED) public class DateDefault { var defaults: UserDefaults diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index b74a2517c7..ed62b5c9ac 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -2120,7 +2120,7 @@ public enum ConnectionEntity: Decodable { public var id: String? { switch self { case let .rcvDirectMsgConnection(contact): - return contact?.id ?? nil + return contact?.id case let .rcvGroupMsgConnection(_, groupMember): return groupMember.id case let .userContactConnection(userContact): @@ -3209,6 +3209,14 @@ public enum MsgContent: Equatable { } } + public var isImageOrVideo: Bool { + switch self { + case .image: true + case .video: true + default: false + } + } + var cmdString: String { "json \(encodeJSON(self))" } diff --git a/apps/ios/bg.lproj/Localizable.strings b/apps/ios/bg.lproj/Localizable.strings index 580c20d65a..44b4c6de9f 100644 --- a/apps/ios/bg.lproj/Localizable.strings +++ b/apps/ios/bg.lproj/Localizable.strings @@ -377,6 +377,9 @@ /* member role */ "admin" = "админ"; +/* No comment provided by engineer. */ +"Admins can block a member for all." = "Администраторите могат да блокират член за всички."; + /* No comment provided by engineer. */ "Admins can create the links to join groups." = "Админите могат да създадат линкове за присъединяване към групи."; @@ -416,6 +419,9 @@ /* No comment provided by engineer. */ "All your contacts will remain connected. Profile update will be sent to your contacts." = "Всички ваши контакти ще останат свързани. Актуализацията на профила ще бъде изпратена до вашите контакти."; +/* No comment provided by engineer. */ +"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Всички ваши контакти, разговори и файлове ще бъдат сигурно криптирани и качени на парчета в конфигурираните XFTP релета."; + /* No comment provided by engineer. */ "Allow" = "Позволи"; @@ -497,6 +503,9 @@ /* No comment provided by engineer. */ "App build: %@" = "Компилация на приложението: %@"; +/* No comment provided by engineer. */ +"App data migration" = "Миграция на данните от приложението"; + /* No comment provided by engineer. */ "App encrypts new local files (except videos)." = "Приложението криптира нови локални файлове (с изключение на видеоклипове)."; @@ -518,6 +527,15 @@ /* No comment provided by engineer. */ "Appearance" = "Изглед"; +/* No comment provided by engineer. */ +"Apply" = "Приложи"; + +/* No comment provided by engineer. */ +"Archive and upload" = "Архивиране и качване"; + +/* No comment provided by engineer. */ +"Archiving database" = "Архивиране на база данни"; + /* No comment provided by engineer. */ "Attach" = "Прикачи"; @@ -665,6 +683,9 @@ /* No comment provided by engineer. */ "Cancel" = "Отказ"; +/* No comment provided by engineer. */ +"Cancel migration" = "Отмени миграцията"; + /* feature offered item */ "cancelled %@" = "отменен %@"; @@ -744,6 +765,9 @@ /* No comment provided by engineer. */ "Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "Чатът е спрян. Ако вече сте използвали тази база данни на друго устройство, трябва да я прехвърлите обратно, преди да стартирате чата отново."; +/* No comment provided by engineer. */ +"Chat migrated!" = "Чатът е мигриран!"; + /* No comment provided by engineer. */ "Chat preferences" = "Чат настройки"; @@ -801,6 +825,9 @@ /* No comment provided by engineer. */ "Confirm database upgrades" = "Потвърди актуализаациите на базата данни"; +/* No comment provided by engineer. */ +"Confirm network settings" = "Потвърди мрежовите настройки"; + /* No comment provided by engineer. */ "Confirm new passphrase…" = "Потвърди новата парола…"; @@ -810,6 +837,12 @@ /* No comment provided by engineer. */ "Confirm password" = "Потвърди парола"; +/* No comment provided by engineer. */ +"Confirm that you remember database passphrase to migrate it." = "Потвърдете, че помните паролата на базата данни, преди да я мигрирате."; + +/* No comment provided by engineer. */ +"Confirm upload" = "Потвърди качването"; + /* server test step */ "Connect" = "Свързване"; @@ -1008,6 +1041,9 @@ /* No comment provided by engineer. */ "Created on %@" = "Създаден на %@"; +/* No comment provided by engineer. */ +"Creating archive link" = "Създаване на архивен линк"; + /* No comment provided by engineer. */ "Creating link…" = "Линкът се създава…"; @@ -1155,6 +1191,9 @@ /* No comment provided by engineer. */ "Delete database" = "Изтрий базата данни"; +/* No comment provided by engineer. */ +"Delete database from this device" = "Изтриване на базата данни от това устройство"; + /* server test step */ "Delete file" = "Изтрий файл"; @@ -1347,9 +1386,18 @@ /* No comment provided by engineer. */ "Downgrade and open chat" = "Понижи версията и отвори чата"; +/* No comment provided by engineer. */ +"Download failed" = "Неуспешно изтегляне"; + /* server test step */ "Download file" = "Свали файл"; +/* No comment provided by engineer. */ +"Downloading archive" = "Архива се изтегля"; + +/* No comment provided by engineer. */ +"Downloading link details" = "Подробности за линка се изтеглят"; + /* No comment provided by engineer. */ "Duplicate display name!" = "Дублирано име!"; @@ -1383,6 +1431,9 @@ /* No comment provided by engineer. */ "Enable for all" = "Активиране за всички"; +/* No comment provided by engineer. */ +"Enable in direct chats (BETA)!" = "Активиране в личните чатове (БЕТА)!"; + /* No comment provided by engineer. */ "Enable instant notifications?" = "Активирай незабавни известия?"; @@ -1497,6 +1548,9 @@ /* No comment provided by engineer. */ "Enter Passcode" = "Въведете kодa за достъп"; +/* No comment provided by engineer. */ +"Enter passphrase" = "Въведи парола"; + /* No comment provided by engineer. */ "Enter passphrase…" = "Въведи парола…"; @@ -1536,6 +1590,9 @@ /* No comment provided by engineer. */ "Error adding member(s)" = "Грешка при добавяне на член(ове)"; +/* No comment provided by engineer. */ +"Error allowing contact PQ encryption" = "Грешка при разрешаване на PQ криптиране за контакт"; + /* No comment provided by engineer. */ "Error changing address" = "Грешка при промяна на адреса"; @@ -1590,6 +1647,9 @@ /* No comment provided by engineer. */ "Error deleting user profile" = "Грешка при изтриване на потребителския профил"; +/* No comment provided by engineer. */ +"Error downloading the archive" = "Грешка при изтеглянето на архива"; + /* No comment provided by engineer. */ "Error enabling delivery receipts!" = "Грешка при активирането на потвърждениeто за доставка!"; @@ -1635,6 +1695,9 @@ /* No comment provided by engineer. */ "Error saving passphrase to keychain" = "Грешка при запазване на парола в Кeychain"; +/* when migrating */ +"Error saving settings" = "Грешка при запазване на настройките"; + /* No comment provided by engineer. */ "Error saving user password" = "Грешка при запазване на потребителска парола"; @@ -1677,6 +1740,12 @@ /* No comment provided by engineer. */ "Error updating user privacy" = "Грешка при актуализиране на поверителността на потребителя"; +/* No comment provided by engineer. */ +"Error uploading the archive" = "Грешка при качването на архива"; + +/* No comment provided by engineer. */ +"Error verifying passphrase:" = "Грешка при проверката на паролата:"; + /* No comment provided by engineer. */ "Error: " = "Грешка: "; @@ -1710,6 +1779,9 @@ /* No comment provided by engineer. */ "Exported database archive." = "Експортиран архив на базата данни."; +/* No comment provided by engineer. */ +"Exported file doesn't exist" = "Експортираният файл не съществува"; + /* No comment provided by engineer. */ "Exporting database archive…" = "Експортиране на архив на базата данни…"; @@ -1752,6 +1824,12 @@ /* No comment provided by engineer. */ "Filter unread and favorite chats." = "Филтрирайте непрочетените и любимите чатове."; +/* No comment provided by engineer. */ +"Finalize migration" = "Завърши миграцията"; + +/* No comment provided by engineer. */ +"Finalize migration on another device." = "Завършете миграцията на другото устройство."; + /* No comment provided by engineer. */ "Finally, we have them! 🚀" = "Най-накрая ги имаме! 🚀"; @@ -1935,6 +2013,9 @@ /* No comment provided by engineer. */ "How to use your servers" = "Как да използвате вашите сървъри"; +/* No comment provided by engineer. */ +"Hungarian interface" = "Унгарски интерфейс"; + /* No comment provided by engineer. */ "ICE servers (one per line)" = "ICE сървъри (по един на ред)"; @@ -1974,6 +2055,12 @@ /* No comment provided by engineer. */ "Import database" = "Импортиране на база данни"; +/* No comment provided by engineer. */ +"Import failed" = "Неуспешно импортиране"; + +/* No comment provided by engineer. */ +"Importing archive" = "Импортиране на архив"; + /* No comment provided by engineer. */ "Improved message delivery" = "Подобрена доставка на съобщения"; @@ -1983,6 +2070,9 @@ /* No comment provided by engineer. */ "Improved server configuration" = "Подобрена конфигурация на сървъра"; +/* No comment provided by engineer. */ +"In order to continue, chat should be stopped." = "За да продължите, чатът трябва да бъде спрян."; + /* No comment provided by engineer. */ "In reply to" = "В отговор на"; @@ -2067,6 +2157,9 @@ /* No comment provided by engineer. */ "Invalid link" = "Невалиден линк"; +/* No comment provided by engineer. */ +"Invalid migration confirmation" = "Невалидно потвърждение за мигриране"; + /* No comment provided by engineer. */ "Invalid name!" = "Невалидно име!"; @@ -2331,6 +2424,9 @@ /* No comment provided by engineer. */ "Message text" = "Текст на съобщението"; +/* No comment provided by engineer. */ +"Message too large" = "Съобщението е твърде голямо"; + /* No comment provided by engineer. */ "Messages" = "Съобщения"; @@ -2340,9 +2436,30 @@ /* No comment provided by engineer. */ "Messages from %@ will be shown!" = "Съобщенията от %@ ще бъдат показани!"; +/* No comment provided by engineer. */ +"Migrate device" = "Мигрирай устройството"; + +/* No comment provided by engineer. */ +"Migrate from another device" = "Мигриране от друго устройство"; + +/* No comment provided by engineer. */ +"Migrate here" = "Мигрирай тук"; + +/* No comment provided by engineer. */ +"Migrate to another device" = "Миграция към друго устройство"; + +/* No comment provided by engineer. */ +"Migrate to another device via QR code." = "Мигрирайте към друго устройство чрез QR код."; + +/* No comment provided by engineer. */ +"Migrating" = "Мигриране"; + /* No comment provided by engineer. */ "Migrating database archive…" = "Архивът на базата данни се мигрира…"; +/* No comment provided by engineer. */ +"Migration complete" = "Миграцията е завършена"; + /* No comment provided by engineer. */ "Migration error:" = "Грешка при мигриране:"; @@ -2600,6 +2717,9 @@ /* No comment provided by engineer. */ "Open group" = "Отвори група"; +/* authentication reason */ +"Open migration to another device" = "Отвори миграцията към друго устройство"; + /* No comment provided by engineer. */ "Open Settings" = "Отвори настройки"; @@ -2612,9 +2732,15 @@ /* No comment provided by engineer. */ "Opening app…" = "Приложението се отваря…"; +/* No comment provided by engineer. */ +"Or paste archive link" = "Или постави архивен линк"; + /* No comment provided by engineer. */ "Or scan QR code" = "Или сканирай QR код"; +/* No comment provided by engineer. */ +"Or securely share this file link" = "Или сигурно споделете този линк към файла"; + /* No comment provided by engineer. */ "Or show this code" = "Или покажи този код"; @@ -2666,6 +2792,9 @@ /* message decrypt error item */ "Permanent decryption error" = "Постоянна грешка при декриптиране"; +/* No comment provided by engineer. */ +"Picture-in-picture calls" = "Обаждания \"картина в картина\""; + /* No comment provided by engineer. */ "PING count" = "PING бройка"; @@ -2684,6 +2813,9 @@ /* No comment provided by engineer. */ "Please check yours and your contact preferences." = "Моля, проверете вашите настройки и тези вашия за контакт."; +/* No comment provided by engineer. */ +"Please confirm that network settings are correct for this device." = "Моля, потвърдете, че мрежовите настройки са правилни за това устройство."; + /* No comment provided by engineer. */ "Please contact developers.\nError: %@" = "Моля, свържете се с разработчиците.\nГрешка: %@"; @@ -2717,6 +2849,9 @@ /* server test error */ "Possibly, certificate fingerprint in server address is incorrect" = "Въжможно е пръстовият отпечатък на сертификата в адреса на сървъра да е неправилен"; +/* No comment provided by engineer. */ +"Post-quantum E2EE" = "Постквантово E2EE"; + /* No comment provided by engineer. */ "Preserve the last message draft, with attachments." = "Запазете последната чернова на съобщението с прикачени файлове."; @@ -2798,6 +2933,15 @@ /* No comment provided by engineer. */ "Push notifications" = "Push известия"; +/* No comment provided by engineer. */ +"Push server" = "Push сървър"; + +/* chat item text */ +"quantum resistant e2e encryption" = "квантово устойчиво e2e криптиране"; + +/* No comment provided by engineer. */ +"Quantum resistant encryption" = "Квантово устойчиво криптиране"; + /* No comment provided by engineer. */ "Rate the app" = "Оценете приложението"; @@ -2933,9 +3077,18 @@ /* No comment provided by engineer. */ "Repeat connection request?" = "Изпрати отново заявката за свързване?"; +/* No comment provided by engineer. */ +"Repeat download" = "Повтори изтеглянето"; + +/* No comment provided by engineer. */ +"Repeat import" = "Повтори импортирането"; + /* No comment provided by engineer. */ "Repeat join request?" = "Изпрати отново заявката за присъединяване?"; +/* No comment provided by engineer. */ +"Repeat upload" = "Повтори качването"; + /* chat item action */ "Reply" = "Отговори"; @@ -2993,6 +3146,9 @@ /* No comment provided by engineer. */ "Run chat" = "Стартиране на чат"; +/* No comment provided by engineer. */ +"Safer groups" = "По-безопасни групи"; + /* chat item action */ "Save" = "Запази"; @@ -3233,6 +3389,9 @@ /* No comment provided by engineer. */ "Set passcode" = "Задай kод за достъп"; +/* No comment provided by engineer. */ +"Set passphrase" = "Задаване на парола"; + /* No comment provided by engineer. */ "Set passphrase to export" = "Задай парола за експортиране"; @@ -3278,6 +3437,9 @@ /* No comment provided by engineer. */ "Show preview" = "Показване на визуализация"; +/* No comment provided by engineer. */ +"Show QR code" = "Покажи QR код"; + /* No comment provided by engineer. */ "Show:" = "Покажи:"; @@ -3338,6 +3500,9 @@ /* notification title */ "Somebody" = "Някой"; +/* chat item text */ +"standard end-to-end encryption" = "стандартно криптиране от край до край"; + /* No comment provided by engineer. */ "Start chat" = "Започни чат"; @@ -3353,6 +3518,9 @@ /* No comment provided by engineer. */ "Stop" = "Спри"; +/* No comment provided by engineer. */ +"Stop chat" = "Спри чата"; + /* No comment provided by engineer. */ "Stop chat to enable database actions" = "Спрете чата, за да активирате действията с базата данни"; @@ -3380,6 +3548,9 @@ /* authentication reason */ "Stop SimpleX" = "Спри SimpleX"; +/* No comment provided by engineer. */ +"Stopping chat" = "Спиране на чата"; + /* No comment provided by engineer. */ "strike" = "зачеркнат"; @@ -3530,6 +3701,12 @@ /* No comment provided by engineer. */ "This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Това действие не може да бъде отменено - вашият профил, контакти, съобщения и файлове ще бъдат безвъзвратно загубени."; +/* E2EE info chat item */ +"This chat is protected by end-to-end encryption." = "Този чат е защитен чрез криптиране от край до край."; + +/* E2EE info chat item */ +"This chat is protected by quantum resistant end-to-end encryption." = "Този чат е защитен от квантово устойчиво криптиране от край до край."; + /* notification title */ "this contact" = "този контакт"; @@ -3722,9 +3899,15 @@ /* No comment provided by engineer. */ "Upgrade and open chat" = "Актуализирай и отвори чата"; +/* No comment provided by engineer. */ +"Upload failed" = "Неуспешно качване"; + /* server test step */ "Upload file" = "Качи файл"; +/* No comment provided by engineer. */ +"Uploading archive" = "Архивът се качва"; + /* No comment provided by engineer. */ "Use .onion hosts" = "Използвай .onion хостове"; @@ -3755,6 +3938,9 @@ /* No comment provided by engineer. */ "Use SimpleX Chat servers?" = "Използвай сървърите на SimpleX Chat?"; +/* No comment provided by engineer. */ +"Use the app while in the call." = "Използвайте приложението по време на разговора."; + /* No comment provided by engineer. */ "User profile" = "Потребителски профил"; @@ -3782,6 +3968,12 @@ /* No comment provided by engineer. */ "Verify connections" = "Потвърждение за свързване"; +/* No comment provided by engineer. */ +"Verify database passphrase" = "Проверете паролата на базата данни"; + +/* No comment provided by engineer. */ +"Verify passphrase" = "Провери паролата"; + /* No comment provided by engineer. */ "Verify security code" = "Потвърди кода за сигурност"; @@ -3860,6 +4052,9 @@ /* No comment provided by engineer. */ "wants to connect to you!" = "иска да се свърже с вас!"; +/* No comment provided by engineer. */ +"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Внимание: стартирането на чата на множество устройства не се поддържа и ще доведе до неуспешно изпращане на съобщения"; + /* No comment provided by engineer. */ "Warning: you may lose some data!" = "Предупреждение: Може да загубите някои данни!"; @@ -3875,6 +4070,9 @@ /* No comment provided by engineer. */ "Welcome message" = "Съобщение при посрещане"; +/* No comment provided by engineer. */ +"Welcome message is too long" = "Съобщението при посрещане е твърде дълго"; + /* No comment provided by engineer. */ "What's new" = "Какво е новото"; @@ -3971,6 +4169,9 @@ /* No comment provided by engineer. */ "You can enable them later via app Privacy & Security settings." = "Можете да ги активирате по-късно през настройките за \"Поверителност и сигурност\" на приложението."; +/* No comment provided by engineer. */ +"You can give another try." = "Можете да опитате още веднъж."; + /* No comment provided by engineer. */ "You can hide or mute a user profile - swipe it to the right." = "Можете да скриете или заглушите известията за потребителски профил - плъзнете надясно."; diff --git a/apps/ios/de.lproj/Localizable.strings b/apps/ios/de.lproj/Localizable.strings index 7074a4ee27..e2cfcee022 100644 --- a/apps/ios/de.lproj/Localizable.strings +++ b/apps/ios/de.lproj/Localizable.strings @@ -390,7 +390,7 @@ "admin" = "Admin"; /* No comment provided by engineer. */ -"Admins can block a member for all." = "Administratoren können für ein Mitglied alle Funktionen blockieren."; +"Admins can block a member for all." = "Administratoren können ein Gruppenmitglied für Alle blockieren."; /* No comment provided by engineer. */ "Admins can create the links to join groups." = "Administratoren können Links für den Beitritt zu Gruppen erzeugen."; @@ -853,7 +853,7 @@ "Confirm password" = "Passwort bestätigen"; /* No comment provided by engineer. */ -"Confirm that you remember database passphrase to migrate it." = "Für die Migration bestätigen Sie bitte, dass Sie sich an das Datenbank-Passwort erinnern."; +"Confirm that you remember database passphrase to migrate it." = "Bitte bestätigen Sie für die Migration, dass Sie sich an Ihr Datenbank-Passwort erinnern."; /* No comment provided by engineer. */ "Confirm upload" = "Hochladen bestätigen"; @@ -2470,7 +2470,7 @@ "Migrate to another device" = "Auf ein anderes Gerät migrieren"; /* No comment provided by engineer. */ -"Migrate to another device via QR code." = "Über einen QR-Code auf ein anderes Gerät migrieren."; +"Migrate to another device via QR code." = "Daten können über einen QR-Code auf ein anderes Gerät migriert werden."; /* No comment provided by engineer. */ "Migrating" = "Migrieren"; @@ -3753,7 +3753,7 @@ "This setting applies to messages in your current chat profile **%@**." = "Diese Einstellung gilt für Nachrichten in Ihrem aktuellen Chat-Profil **%@**."; /* No comment provided by engineer. */ -"To ask any questions and to receive updates:" = "Um Fragen zu stellen und Aktualisierungen zu erhalten:"; +"To ask any questions and to receive updates:" = "Um Fragen zu stellen und aktuelle Informationen zu erhalten:"; /* No comment provided by engineer. */ "To connect, your contact can scan QR code or use the link in the app." = "Um eine Verbindung herzustellen, kann Ihr Kontakt den QR-Code scannen oder den Link in der App verwenden."; @@ -4359,7 +4359,7 @@ "Your contacts can allow full message deletion." = "Ihre Kontakte können die unwiederbringliche Löschung von Nachrichten erlauben."; /* No comment provided by engineer. */ -"Your contacts will remain connected." = "Ihre Kontakte bleiben verbunden."; +"Your contacts will remain connected." = "Ihre Kontakte bleiben weiterhin verbunden."; /* 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."; diff --git a/apps/ios/es.lproj/Localizable.strings b/apps/ios/es.lproj/Localizable.strings index 7a60858bc1..7e82b77e2e 100644 --- a/apps/ios/es.lproj/Localizable.strings +++ b/apps/ios/es.lproj/Localizable.strings @@ -157,6 +157,9 @@ /* No comment provided by engineer. */ "%@ servers" = "Servidores %@"; +/* No comment provided by engineer. */ +"%@ uploaded" = "%@ cargado"; + /* notification title */ "%@ wants to connect!" = "¡ %@ quiere contactar!"; @@ -852,6 +855,9 @@ /* No comment provided by engineer. */ "Confirm that you remember database passphrase to migrate it." = "Confirme que recuerda la frase secreta de la base de datos para migrarla."; +/* No comment provided by engineer. */ +"Confirm upload" = "Confirmar subida"; + /* server test step */ "Connect" = "Conectar"; @@ -1050,6 +1056,9 @@ /* No comment provided by engineer. */ "Created on %@" = "Creado en %@"; +/* No comment provided by engineer. */ +"Creating archive link" = "Creando enlace de archivo"; + /* No comment provided by engineer. */ "Creating link…" = "Creando enlace…"; @@ -1197,6 +1206,9 @@ /* No comment provided by engineer. */ "Delete database" = "Eliminar base de datos"; +/* No comment provided by engineer. */ +"Delete database from this device" = "Eliminar base de datos de este dispositivo"; + /* server test step */ "Delete file" = "Eliminar archivo"; @@ -1389,9 +1401,18 @@ /* No comment provided by engineer. */ "Downgrade and open chat" = "Degradar y abrir Chat"; +/* No comment provided by engineer. */ +"Download failed" = "Error en la descarga"; + /* server test step */ "Download file" = "Descargar archivo"; +/* No comment provided by engineer. */ +"Downloading archive" = "Descargando archivo"; + +/* No comment provided by engineer. */ +"Downloading link details" = "Descargando detalles del enlace"; + /* No comment provided by engineer. */ "Duplicate display name!" = "¡Nombre mostrado duplicado!"; @@ -1425,6 +1446,9 @@ /* No comment provided by engineer. */ "Enable for all" = "Activar para todos"; +/* No comment provided by engineer. */ +"Enable in direct chats (BETA)!" = "Activar en chats directos (BETA)!"; + /* No comment provided by engineer. */ "Enable instant notifications?" = "¿Activar notificación instantánea?"; @@ -1539,6 +1563,9 @@ /* No comment provided by engineer. */ "Enter Passcode" = "Introduce Código"; +/* No comment provided by engineer. */ +"Enter passphrase" = "Introducir frase de contraseña"; + /* No comment provided by engineer. */ "Enter passphrase…" = "Introduce la contraseña…"; @@ -1578,6 +1605,9 @@ /* No comment provided by engineer. */ "Error adding member(s)" = "Error al añadir miembro(s)"; +/* No comment provided by engineer. */ +"Error allowing contact PQ encryption" = "Error al permitir cifrado PQ al contacto"; + /* No comment provided by engineer. */ "Error changing address" = "Error al cambiar servidor"; @@ -1632,6 +1662,9 @@ /* No comment provided by engineer. */ "Error deleting user profile" = "Error al eliminar perfil"; +/* No comment provided by engineer. */ +"Error downloading the archive" = "Error al descargar el archivo"; + /* No comment provided by engineer. */ "Error enabling delivery receipts!" = "¡Error al activar confirmaciones de entrega!"; @@ -1677,6 +1710,9 @@ /* No comment provided by engineer. */ "Error saving passphrase to keychain" = "Error al guardar contraseña en Keychain"; +/* when migrating */ +"Error saving settings" = "Error al guardar ajustes"; + /* No comment provided by engineer. */ "Error saving user password" = "Error al guardar contraseña de usuario"; @@ -1719,6 +1755,12 @@ /* No comment provided by engineer. */ "Error updating user privacy" = "Error al actualizar privacidad de usuario"; +/* No comment provided by engineer. */ +"Error uploading the archive" = "Error al subir el archivo"; + +/* No comment provided by engineer. */ +"Error verifying passphrase:" = "Error al verificar la frase de contraseña:"; + /* No comment provided by engineer. */ "Error: " = "Error: "; @@ -1752,6 +1794,9 @@ /* No comment provided by engineer. */ "Exported database archive." = "Archivo de base de datos exportado."; +/* No comment provided by engineer. */ +"Exported file doesn't exist" = "El archivo exportado no existe"; + /* No comment provided by engineer. */ "Exporting database archive…" = "Exportando base de datos…"; @@ -1794,6 +1839,12 @@ /* No comment provided by engineer. */ "Filter unread and favorite chats." = "Filtra chats no leídos y favoritos."; +/* No comment provided by engineer. */ +"Finalize migration" = "Finalizar la migración"; + +/* No comment provided by engineer. */ +"Finalize migration on another device." = "Finalizar la migración en otro dispositivo."; + /* No comment provided by engineer. */ "Finally, we have them! 🚀" = "¡Por fin los tenemos! 🚀"; @@ -1977,6 +2028,9 @@ /* No comment provided by engineer. */ "How to use your servers" = "Cómo usar los servidores"; +/* No comment provided by engineer. */ +"Hungarian interface" = "Interfaz húngara"; + /* No comment provided by engineer. */ "ICE servers (one per line)" = "Servidores ICE (uno por línea)"; @@ -2016,6 +2070,12 @@ /* No comment provided by engineer. */ "Import database" = "Importar base de datos"; +/* No comment provided by engineer. */ +"Import failed" = "Error de importación"; + +/* No comment provided by engineer. */ +"Importing archive" = "Importando archivo"; + /* No comment provided by engineer. */ "Improved message delivery" = "Entrega de mensajes mejorada"; @@ -2025,6 +2085,9 @@ /* No comment provided by engineer. */ "Improved server configuration" = "Configuración del servidor mejorada"; +/* No comment provided by engineer. */ +"In order to continue, chat should be stopped." = "Para continuar, el chat debe ser interrumpido."; + /* No comment provided by engineer. */ "In reply to" = "En respuesta a"; @@ -2109,6 +2172,9 @@ /* No comment provided by engineer. */ "Invalid link" = "Enlace no válido"; +/* No comment provided by engineer. */ +"Invalid migration confirmation" = "Confirmación de migración inválida"; + /* No comment provided by engineer. */ "Invalid name!" = "¡Nombre no válido!"; @@ -2373,6 +2439,9 @@ /* No comment provided by engineer. */ "Message text" = "Contacto y texto"; +/* No comment provided by engineer. */ +"Message too large" = "Mensaje demasiado grande"; + /* No comment provided by engineer. */ "Messages" = "Mensajes"; @@ -2382,9 +2451,36 @@ /* No comment provided by engineer. */ "Messages from %@ will be shown!" = "¡Los mensajes de %@ serán mostrados!"; +/* No comment provided by engineer. */ +"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo** con perfecta confidencialidad, repudio y recuperación tras ataques."; + +/* No comment provided by engineer. */ +"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo resistente a la computación cuántica** con perfecta confidencialidad, repudio y recuperación tras ataques."; + +/* No comment provided by engineer. */ +"Migrate device" = "Migrar dispositivo"; + +/* No comment provided by engineer. */ +"Migrate from another device" = "Migrar desde otro dispositivo"; + +/* No comment provided by engineer. */ +"Migrate here" = "Migrar aquí"; + +/* No comment provided by engineer. */ +"Migrate to another device" = "Migrar hacia otro dispositivo"; + +/* No comment provided by engineer. */ +"Migrate to another device via QR code." = "Migrar hacia otro dispositivo mediante código QR."; + +/* No comment provided by engineer. */ +"Migrating" = "Migrando"; + /* No comment provided by engineer. */ "Migrating database archive…" = "Migrando base de datos…"; +/* No comment provided by engineer. */ +"Migration complete" = "Migración completada"; + /* No comment provided by engineer. */ "Migration error:" = "Error de migración:"; @@ -2642,6 +2738,9 @@ /* No comment provided by engineer. */ "Open group" = "Grupo abierto"; +/* authentication reason */ +"Open migration to another device" = "Abrir la migración hacia otro dispositivo"; + /* No comment provided by engineer. */ "Open Settings" = "Abrir Configuración"; @@ -2654,9 +2753,15 @@ /* No comment provided by engineer. */ "Opening app…" = "Iniciando aplicación…"; +/* No comment provided by engineer. */ +"Or paste archive link" = "O pegar enlace del archivo"; + /* No comment provided by engineer. */ "Or scan QR code" = "O escanear código QR"; +/* No comment provided by engineer. */ +"Or securely share this file link" = "O comparta de forma segura el enlace de este archivo"; + /* No comment provided by engineer. */ "Or show this code" = "O mostrar este código"; @@ -2708,6 +2813,9 @@ /* message decrypt error item */ "Permanent decryption error" = "Error permanente descifrado"; +/* No comment provided by engineer. */ +"Picture-in-picture calls" = "Llamadas picture-in-picture"; + /* No comment provided by engineer. */ "PING count" = "Contador PING"; @@ -2726,6 +2834,9 @@ /* No comment provided by engineer. */ "Please check yours and your contact preferences." = "Comprueba tus preferencias y las de tu contacto."; +/* No comment provided by engineer. */ +"Please confirm that network settings are correct for this device." = "Por favor confirme que la configuración de red es correcta para este dispositivo."; + /* No comment provided by engineer. */ "Please contact developers.\nError: %@" = "Por favor, contacta con los desarrolladores.\nError: %@"; @@ -2759,6 +2870,9 @@ /* server test error */ "Possibly, certificate fingerprint in server address is incorrect" = "Posiblemente la huella digital del certificado en la dirección del servidor es incorrecta"; +/* No comment provided by engineer. */ +"Post-quantum E2EE" = "E2EE postcuántica"; + /* No comment provided by engineer. */ "Preserve the last message draft, with attachments." = "Conserva el último borrador del mensaje con los datos adjuntos."; @@ -2840,6 +2954,15 @@ /* No comment provided by engineer. */ "Push notifications" = "Notificaciones automáticas"; +/* No comment provided by engineer. */ +"Push server" = "Servidor push"; + +/* chat item text */ +"quantum resistant e2e encryption" = "cifrado e2e resistente a la cuántica"; + +/* No comment provided by engineer. */ +"Quantum resistant encryption" = "Cifrado resistente a la tecnología cuántica"; + /* No comment provided by engineer. */ "Rate the app" = "Valora la aplicación"; @@ -2975,9 +3098,18 @@ /* No comment provided by engineer. */ "Repeat connection request?" = "¿Repetir solicitud de conexión?"; +/* No comment provided by engineer. */ +"Repeat download" = "Repetir descarga"; + +/* No comment provided by engineer. */ +"Repeat import" = "Repetir importación"; + /* No comment provided by engineer. */ "Repeat join request?" = "¿Repetir solicitud de admisión?"; +/* No comment provided by engineer. */ +"Repeat upload" = "Repetir la carga"; + /* chat item action */ "Reply" = "Responder"; @@ -3035,6 +3167,9 @@ /* No comment provided by engineer. */ "Run chat" = "Ejecutar chat"; +/* No comment provided by engineer. */ +"Safer groups" = "Grupos más seguros"; + /* chat item action */ "Save" = "Guardar"; @@ -3275,6 +3410,9 @@ /* No comment provided by engineer. */ "Set passcode" = "Código autodestrucción"; +/* No comment provided by engineer. */ +"Set passphrase" = "Definir frase de contraseña"; + /* No comment provided by engineer. */ "Set passphrase to export" = "Escribe la contraseña para exportar"; @@ -3320,6 +3458,9 @@ /* No comment provided by engineer. */ "Show preview" = "Mostrar vista previa"; +/* No comment provided by engineer. */ +"Show QR code" = "Mostrar código QR"; + /* No comment provided by engineer. */ "Show:" = "Mostrar:"; @@ -3380,6 +3521,9 @@ /* notification title */ "Somebody" = "Alguien"; +/* chat item text */ +"standard end-to-end encryption" = "cifrado estándar de extremo a extremo"; + /* No comment provided by engineer. */ "Start chat" = "Iniciar chat"; @@ -3395,6 +3539,9 @@ /* No comment provided by engineer. */ "Stop" = "Detener"; +/* No comment provided by engineer. */ +"Stop chat" = "Detener el chat"; + /* No comment provided by engineer. */ "Stop chat to enable database actions" = "Detén SimpleX para habilitar las acciones sobre la base de datos"; @@ -3422,6 +3569,9 @@ /* authentication reason */ "Stop SimpleX" = "Detener SimpleX"; +/* No comment provided by engineer. */ +"Stopping chat" = "Detención del chat"; + /* No comment provided by engineer. */ "strike" = "tachado"; @@ -3572,6 +3722,12 @@ /* No comment provided by engineer. */ "This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Esta acción es irreversible. Tu perfil, contactos, mensajes y archivos se perderán irreversiblemente."; +/* E2EE info chat item */ +"This chat is protected by end-to-end encryption." = "Este chat está protegido por cifrado de extremo a extremo."; + +/* E2EE info chat item */ +"This chat is protected by quantum resistant end-to-end encryption." = "Este chat está protegido por un cifrado de extremo a extremo resistente a tecnologías cuánticas."; + /* notification title */ "this contact" = "este contacto"; @@ -3764,9 +3920,15 @@ /* No comment provided by engineer. */ "Upgrade and open chat" = "Actualizar y abrir Chat"; +/* No comment provided by engineer. */ +"Upload failed" = "Error de carga"; + /* server test step */ "Upload file" = "Subir archivo"; +/* No comment provided by engineer. */ +"Uploading archive" = "Subiendo el archivo"; + /* No comment provided by engineer. */ "Use .onion hosts" = "Usar hosts .onion"; @@ -3797,6 +3959,9 @@ /* No comment provided by engineer. */ "Use SimpleX Chat servers?" = "¿Usar servidores SimpleX Chat?"; +/* No comment provided by engineer. */ +"Use the app while in the call." = "Usar la app durante la llamada."; + /* No comment provided by engineer. */ "User profile" = "Perfil de usuario"; @@ -3824,6 +3989,12 @@ /* No comment provided by engineer. */ "Verify connections" = "Verificar conexiones"; +/* No comment provided by engineer. */ +"Verify database passphrase" = "Verificar la contraseña de la base de datos"; + +/* No comment provided by engineer. */ +"Verify passphrase" = "Verificar frase de contraseña"; + /* No comment provided by engineer. */ "Verify security code" = "Comprobar código de seguridad"; @@ -3902,6 +4073,9 @@ /* No comment provided by engineer. */ "wants to connect to you!" = "¡quiere contactar contigo!"; +/* No comment provided by engineer. */ +"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Advertencia: el inicio del chat en varios dispositivos no es compatible y provocará fallos en la entrega de mensajes"; + /* No comment provided by engineer. */ "Warning: you may lose some data!" = "Atención: ¡puedes perder algunos datos!"; @@ -3917,6 +4091,9 @@ /* No comment provided by engineer. */ "Welcome message" = "Mensaje de bienvenida"; +/* No comment provided by engineer. */ +"Welcome message is too long" = "El mensaje de bienvenida es demasiado largo"; + /* No comment provided by engineer. */ "What's new" = "Novedades"; @@ -3953,6 +4130,9 @@ /* No comment provided by engineer. */ "You" = "Tú"; +/* No comment provided by engineer. */ +"You **must not** use the same database on two devices." = "**No debe** usar la misma base de datos en dos dispositivos."; + /* No comment provided by engineer. */ "You accepted connection" = "Has aceptado la conexión"; @@ -4013,6 +4193,9 @@ /* No comment provided by engineer. */ "You can enable them later via app Privacy & Security settings." = "Puedes activarlos más tarde en la configuración de Privacidad y Seguridad."; +/* No comment provided by engineer. */ +"You can give another try." = "Puede intentarlo de nuevo."; + /* No comment provided by engineer. */ "You can hide or mute a user profile - swipe it to the right." = "Puedes ocultar o silenciar un perfil deslizándolo a la derecha."; diff --git a/apps/ios/fr.lproj/Localizable.strings b/apps/ios/fr.lproj/Localizable.strings index 8a66611d39..cbc72479e3 100644 --- a/apps/ios/fr.lproj/Localizable.strings +++ b/apps/ios/fr.lproj/Localizable.strings @@ -1447,7 +1447,7 @@ "Enable for all" = "Activer pour tous"; /* No comment provided by engineer. */ -"Enable in direct chats (BETA)!" = "Activé dans les conversations directes (BETA) !"; +"Enable in direct chats (BETA)!" = "Activer dans les conversations directes (BETA) !"; /* No comment provided by engineer. */ "Enable instant notifications?" = "Activer les notifications instantanées ?"; @@ -2455,7 +2455,7 @@ "Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Les messages, fichiers et appels sont protégés par un chiffrement **de bout en bout** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction."; /* No comment provided by engineer. */ -"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Les messages, fichiers et appels sont protégés par un chiffrement **2e2 résistant post-quantique** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction."; +"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Les messages, fichiers et appels sont protégés par un chiffrement **e2e résistant post-quantique** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction."; /* No comment provided by engineer. */ "Migrate device" = "Transférer l'appareil"; @@ -3726,7 +3726,7 @@ "This chat is protected by end-to-end encryption." = "Cette discussion est protégée par un chiffrement de bout en bout."; /* E2EE info chat item */ -"This chat is protected by quantum resistant end-to-end encryption." = "Cette discussion est protégée par un chiffrement de bout en bout résistant post-quantique."; +"This chat is protected by quantum resistant end-to-end encryption." = "Cette discussion est protégée par un chiffrement de bout en bout résistant aux technologies quantiques."; /* notification title */ "this contact" = "ce contact"; @@ -4074,7 +4074,7 @@ "wants to connect to you!" = "veut établir une connexion !"; /* No comment provided by engineer. */ -"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Attention : démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages"; +"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages"; /* No comment provided by engineer. */ "Warning: you may lose some data!" = "Attention : vous risquez de perdre des données !"; diff --git a/apps/ios/it.lproj/Localizable.strings b/apps/ios/it.lproj/Localizable.strings index 88b3497758..5ebda7396f 100644 --- a/apps/ios/it.lproj/Localizable.strings +++ b/apps/ios/it.lproj/Localizable.strings @@ -2455,7 +2455,7 @@ "Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "I messaggi, i file e le chiamate sono protetti da **crittografia end-to-end** con perfect forward secrecy, ripudio e recupero da intrusione."; /* No comment provided by engineer. */ -"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "I messaggi, i file e le chiamate sono protetti da **crittografia e2e resistente al quantistico** con perfect forward secrecy, ripudio e recupero da intrusione."; +"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "I messaggi, i file e le chiamate sono protetti da **crittografia e2e resistente alla quantistica** con perfect forward secrecy, ripudio e recupero da intrusione."; /* No comment provided by engineer. */ "Migrate device" = "Migra dispositivo"; @@ -2958,10 +2958,10 @@ "Push server" = "Server push"; /* chat item text */ -"quantum resistant e2e encryption" = "crittografia e2e resistente al quantistico"; +"quantum resistant e2e encryption" = "crittografia e2e resistente alla quantistica"; /* No comment provided by engineer. */ -"Quantum resistant encryption" = "Crittografia resistente al quantistico"; +"Quantum resistant encryption" = "Crittografia resistente alla quantistica"; /* No comment provided by engineer. */ "Rate the app" = "Valuta l'app"; @@ -3726,7 +3726,7 @@ "This chat is protected by end-to-end encryption." = "Questa chat è protetta da crittografia end-to-end."; /* E2EE info chat item */ -"This chat is protected by quantum resistant end-to-end encryption." = "Questa chat è protetta da crittografia end-to-end resistente al quantistico."; +"This chat is protected by quantum resistant end-to-end encryption." = "Questa chat è protetta da crittografia end-to-end resistente alla quantistica."; /* notification title */ "this contact" = "questo contatto"; @@ -4014,7 +4014,7 @@ "via relay" = "via relay"; /* No comment provided by engineer. */ -"Via secure quantum resistant protocol." = "Tramite protocollo sicuro resistente al quantistico."; +"Via secure quantum resistant protocol." = "Tramite protocollo sicuro resistente alla quantistica."; /* No comment provided by engineer. */ "Video call" = "Videochiamata"; diff --git a/apps/ios/nl.lproj/Localizable.strings b/apps/ios/nl.lproj/Localizable.strings index bfd97f3f43..6ba5b419f6 100644 --- a/apps/ios/nl.lproj/Localizable.strings +++ b/apps/ios/nl.lproj/Localizable.strings @@ -2730,7 +2730,7 @@ "Open" = "Open"; /* No comment provided by engineer. */ -"Open chat" = "Gesprekken openen"; +"Open chat" = "Chat openen"; /* authentication reason */ "Open chat console" = "Chat console openen"; diff --git a/apps/ios/ru.lproj/Localizable.strings b/apps/ios/ru.lproj/Localizable.strings index c3f981d144..e82ab7a07f 100644 --- a/apps/ios/ru.lproj/Localizable.strings +++ b/apps/ios/ru.lproj/Localizable.strings @@ -4074,7 +4074,7 @@ "wants to connect to you!" = "хочет соединиться с Вами!"; /* No comment provided by engineer. */ -"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Внимание: запуск чата на нескольких устройствах не поддерживается и приведет к сбоям доставки сообщений."; +"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Внимание: запуск чата на нескольких устройствах не поддерживается и приведет к сбоям доставки сообщений"; /* No comment provided by engineer. */ "Warning: you may lose some data!" = "Предупреждение: Вы можете потерять какие то данные!"; diff --git a/apps/ios/tr.lproj/Localizable.strings b/apps/ios/tr.lproj/Localizable.strings index bded9498b9..2e866ebe08 100644 --- a/apps/ios/tr.lproj/Localizable.strings +++ b/apps/ios/tr.lproj/Localizable.strings @@ -137,7 +137,7 @@ "%@ and %@ connected" = "%@ ve %@ bağlandı"; /* copied message info, at