diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 74f97134d7..d7f29087d8 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -495,9 +495,9 @@ func loadChat(chatId: ChatId, im: ItemsModel, contentTag: MsgContentTag? = nil, ) } -func apiGetChatItemInfo(type: ChatType, id: Int64, scope: GroupChatScope?, itemId: Int64) async throws -> ChatItemInfo { +func apiGetChatItemInfo(type: ChatType, id: Int64, scope: GroupChatScope?, itemId: Int64) async throws -> (AChatItem, ChatItemInfo) { let r: ChatResponse0 = try await chatSendCmd(.apiGetChatItemInfo(type: type, id: id, scope: scope, itemId: itemId)) - if case let .chatItemInfo(_, _, chatItemInfo) = r { return chatItemInfo } + if case let .chatItemInfo(_, aci, chatItemInfo) = r { return (aci, chatItemInfo) } throw r.unexpected } diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift index fc46669cee..f08f4fba6a 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift @@ -126,7 +126,7 @@ struct CIFileView: View { } case let .rcvError(rcvFileError): logger.debug("CIFileView fileAction - in .rcvError") - showFileErrorAlert(rcvFileError) + showFileErrorAlert(rcvFileError, file) case let .rcvWarning(rcvFileError): logger.debug("CIFileView fileAction - in .rcvWarning") showFileErrorAlert(rcvFileError, temporary: true) @@ -171,10 +171,12 @@ struct CIFileView: View { case .sndError: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10) case .sndWarning: fileIcon("doc.fill", innerIcon: "exclamationmark.triangle.fill", innerIconSize: 10) case .rcvInvitation: - if fileSizeValid(file, senderProfile) { - fileIcon("arrow.down.doc.fill", color: theme.colors.primary) - } else { + if !fileSizeValid(file, senderProfile) { fileIcon("doc.fill", color: .orange, innerIcon: "exclamationmark", innerIconSize: 12) + } else if file.expired { + fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10) + } else { + fileIcon("arrow.down.doc.fill", color: theme.colors.primary) } case .rcvAccepted: fileIcon("doc.fill", innerIcon: "ellipsis", innerIconSize: 12) case let .rcvTransfer(rcvProgress, rcvTotal): @@ -264,7 +266,14 @@ func saveCryptoFile(_ fileSource: CryptoFile) { } } -func showFileErrorAlert(_ err: FileError, temporary: Bool = false) { +func showFileErrorAlert(_ err: FileError, _ file: CIFile? = nil, temporary: Bool = false) { + if let file, file.expired, let fileExpires = file.fileExpires, err == .auth || err == .noFile { + showAlert( + NSLocalizedString("File expired", comment: "file error alert title"), + message: String.localizedStringWithFormat(NSLocalizedString("File was available until %@.", comment: "file error text"), localTimestamp(fileExpires)) + ) + return + } let title: String = if temporary { NSLocalizedString("Temporary file error", comment: "file error alert title") } else { diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift index 972e9c4ec6..93966543c6 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift @@ -83,7 +83,7 @@ struct CIImageView: View { case .rcvComplete: () // ? case .rcvCancelled: () // TODO case let .rcvError(rcvFileError): - showFileErrorAlert(rcvFileError) + showFileErrorAlert(rcvFileError, file) case let .rcvWarning(rcvFileError): showFileErrorAlert(rcvFileError, temporary: true) case let .sndError(sndFileError): @@ -152,7 +152,7 @@ struct CIImageView: View { case .sndCancelled: fileIcon("xmark", 10, 13) case .sndError: fileIcon("xmark", 10, 13) case .sndWarning: fileIcon("exclamationmark.triangle.fill", 10, 13) - case .rcvInvitation: fileIcon("arrow.down", 10, 13) + case .rcvInvitation: fileIcon(file.expired && fileSizeValid(file, senderProfile) ? "xmark" : "arrow.down", 10, 13) case .rcvAccepted: fileIcon("ellipsis", 14, 11) case .rcvTransfer: progressView() case .rcvAborted: fileIcon("exclamationmark.arrow.circlepath", 14, 11) diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift index 912fde4043..d5340010ab 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift @@ -368,7 +368,7 @@ struct CIVideoView: View { .simultaneousGesture(TapGesture().onEnded { showFileErrorAlert(sndFileError, temporary: true) }) - case .rcvInvitation: fileIcon("arrow.down", 10, 13) + case .rcvInvitation: fileIcon(file.expired && fileSizeValid(file, senderProfile) ? "xmark" : "arrow.down", 10, 13) case .rcvAccepted: fileIcon("ellipsis", 14, 11) case let .rcvTransfer(rcvProgress, rcvTotal): if file.fileProtocol == .xftp && rcvProgress < rcvTotal { @@ -382,7 +382,7 @@ struct CIVideoView: View { case let .rcvError(rcvFileError): fileIcon("xmark", 10, 13) .simultaneousGesture(TapGesture().onEnded { - showFileErrorAlert(rcvFileError) + showFileErrorAlert(rcvFileError, file) }) case let .rcvWarning(rcvFileError): fileIcon("exclamationmark.triangle.fill", 10, 13) diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIVoiceView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIVoiceView.swift index 820074542f..64fa2a4dd3 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/CIVoiceView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIVoiceView.swift @@ -178,7 +178,7 @@ struct VoiceMessagePlayer: View { .simultaneousGesture(TapGesture().onEnded { showFileErrorAlert(sndFileError, temporary: true) }) - case .rcvInvitation: downloadButton(recordingFile, "play.fill") + case .rcvInvitation: downloadButton(recordingFile, recordingFile.expired ? "multiply" : "play.fill") case .rcvAccepted: loadingIcon() case .rcvTransfer: loadingIcon() case .rcvAborted: downloadButton(recordingFile, "exclamationmark.arrow.circlepath") @@ -187,7 +187,7 @@ struct VoiceMessagePlayer: View { case let .rcvError(rcvFileError): fileStatusIcon("multiply", 14) .simultaneousGesture(TapGesture().onEnded { - showFileErrorAlert(rcvFileError) + showFileErrorAlert(rcvFileError, recordingFile) }) case let .rcvWarning(rcvFileError): fileStatusIcon("exclamationmark.triangle.fill", 16) diff --git a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift index 44284350dc..ac27cb27c2 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift @@ -75,7 +75,35 @@ struct FramedItemView: View { } }) } else if let itemForwarded = chatItem.meta.itemForwarded { - framedItemHeader(icon: "arrowshape.turn.up.forward", caption: Text(itemForwarded.text(chat.chatInfo.chatType)).italic(), pad: true) + let twoRowHeader: Bool = if chat.chatInfo.chatType == .local { + itemForwarded.chatTypeApiIdMsgId != nil || itemForwarded.sourceGroupLink != nil + } else { + switch itemForwarded { + case let .group(_, _, _, _, _, _, groupType): groupType != nil + case .groupLink: true + default: false + } + } + if twoRowHeader { + let caption: LocalizedStringKey = chat.chatInfo.chatType == .local ? "saved from" : "forwarded from" + headerFrame(pad: true) { + VStack(alignment: .leading, spacing: 4) { + headerRow(icon: "arrowshape.turn.up.forward", caption: Text(caption).italic()) + Text(itemForwarded.chatName) + .font(.subheadline) + .lineLimit(1) + } + } + .simultaneousGesture(TapGesture().onEnded { + if let (chatType, apiId, msgId) = itemForwarded.chatTypeApiIdMsgId { + im.loadOpenChatNoWait("\(chatType.rawValue)\(apiId)", msgId) + } else if let link = itemForwarded.sourceGroupLink { + planAndConnect(link, theme: theme, dismiss: false) + } + }) + } else { + framedItemHeader(icon: "arrowshape.turn.up.forward", caption: Text(itemForwarded.text(chat.chatInfo.chatType)).italic(), pad: true) + } } ChatItemContentView(chat: chat, im: im, chatItem: chatItem, msgContentView: framedMsgContentView) @@ -191,8 +219,14 @@ struct FramedItemView: View { } } - @ViewBuilder func framedItemHeader(icon: String? = nil, iconColor: Color? = nil, caption: Text, pad: Bool = false) -> some View { - let v = HStack(spacing: 6) { + func framedItemHeader(icon: String? = nil, iconColor: Color? = nil, caption: Text, pad: Bool = false) -> some View { + headerFrame(pad: pad) { + headerRow(icon: icon, iconColor: iconColor, caption: caption) + } + } + + private func headerRow(icon: String?, iconColor: Color? = nil, caption: Text) -> some View { + HStack(spacing: 6) { if let icon = icon { Image(systemName: icon) .resizable() @@ -204,13 +238,17 @@ struct FramedItemView: View { .font(.caption) .lineLimit(1) } - .foregroundColor(theme.colors.secondary) - .padding(.horizontal, 12) - .padding(.top, 6) - .padding(.bottom, pad || (chatItem.quotedItem == nil && chatItem.meta.itemForwarded == nil) ? 6 : 0) - .overlay(DetermineWidth()) - .frame(minWidth: msgWidth, alignment: .leading) - .background(chatItemFrameContextColor(chatItem, theme)) + } + + @ViewBuilder private func headerFrame(pad: Bool = false, @ViewBuilder _ content: () -> some View) -> some View { + let v = content() + .foregroundColor(theme.colors.secondary) + .padding(.horizontal, 12) + .padding(.top, 6) + .padding(.bottom, pad || (chatItem.quotedItem == nil && chatItem.meta.itemForwarded == nil) ? 6 : 0) + .overlay(DetermineWidth()) + .frame(minWidth: msgWidth, alignment: .leading) + .background(chatItemFrameContextColor(chatItem, theme)) if let mediaWidth = maxMediaWidth(), mediaWidth < maxWidth { v.frame(maxWidth: mediaWidth, alignment: .leading) } else { diff --git a/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift b/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift index 2213b34586..15effaeea6 100644 --- a/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift @@ -162,6 +162,9 @@ struct ChatItemInfoView: View { if let deleteAt = meta.itemTimed?.deleteAt { infoRow("Disappears at", localTimestamp(deleteAt)) } + if let file = ci.file, let fileExpires = file.fileExpires { + infoRow(file.expired ? "File was available until" : "File available until", localTimestamp(fileExpires)) + } if meta.msgVerified?.verified == true { let signedText: LocalizedStringKey = ci.chatDir.sent ? "Signed" : "Signed & verified" HStack { diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index bc55fc6174..08941e9ccc 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -1719,6 +1719,7 @@ struct ChatView: View { @State private var showArchivingReports = false @State private var showChatItemInfoSheet: Bool = false @State private var chatItemInfo: ChatItemInfo? + @State private var chatItemInfoItem: ChatItem? @State private var msgWidth: CGFloat = 0 @State private var touchInProgress: Bool = false @@ -2230,8 +2231,9 @@ struct ChatView: View { .frame(minWidth: 0, maxWidth: .infinity, alignment: alignment) .sheet(isPresented: $showChatItemInfoSheet, onDismiss: { chatItemInfo = nil + chatItemInfoItem = nil }) { - ChatItemInfoView(ci: ci, userMemberId: chat.chatInfo.groupInfo?.membership.memberId, chatItemInfo: $chatItemInfo) + ChatItemInfoView(ci: chatItemInfoItem ?? ci, userMemberId: chat.chatInfo.groupInfo?.membership.memberId, chatItemInfo: $chatItemInfo) } } @@ -2574,8 +2576,9 @@ struct ChatView: View { Task { do { let cInfo = chat.chatInfo - let ciInfo = try await apiGetChatItemInfo(type: cInfo.chatType, id: cInfo.apiId, scope: cInfo.groupChatScope(), itemId: ci.id) + let (aci, ciInfo) = try await apiGetChatItemInfo(type: cInfo.chatType, id: cInfo.apiId, scope: cInfo.groupChatScope(), itemId: ci.id) await MainActor.run { + chatItemInfoItem = aci.chatItem chatItemInfo = ciInfo } if case let .group(gInfo, _) = chat.chatInfo { diff --git a/apps/ios/Shared/Views/Helpers/NameBadge.swift b/apps/ios/Shared/Views/Helpers/NameBadge.swift index 67f6d6d6b2..5a48e495a2 100644 --- a/apps/ios/Shared/Views/Helpers/NameBadge.swift +++ b/apps/ios/Shared/Views/Helpers/NameBadge.swift @@ -162,8 +162,8 @@ func showBadgeInfoAlert(_ name: String, _ badge: LocalBadge) { } else { // supporter, legend and unknown types use the supporter wording let supports = - if badge.status == .expired, let expiry = badge.badge.badgeExpiry { - String.localizedStringWithFormat(NSLocalizedString("%1$@ supported SimpleX Chat. The badge expired on %2$@.", comment: "badge alert"), name, expiry.formatted(date: .abbreviated, time: .omitted)) + if badge.status == .expired { + String.localizedStringWithFormat(NSLocalizedString("%1$@ supported SimpleX Chat. The badge expired on %2$@.", comment: "badge alert"), name, badge.badge.badgeExpiry.formatted(date: .abbreviated, time: .omitted)) } else { String.localizedStringWithFormat(NSLocalizedString("%@ supports SimpleX Chat.", comment: "badge alert"), name) } diff --git a/apps/ios/Shared/Views/Helpers/ShareSheet.swift b/apps/ios/Shared/Views/Helpers/ShareSheet.swift index 670cc7cae0..56e437e5c8 100644 --- a/apps/ios/Shared/Views/Helpers/ShareSheet.swift +++ b/apps/ios/Shared/Views/Helpers/ShareSheet.swift @@ -142,6 +142,7 @@ class OpenChatAlertViewController: UIViewController { private let profileBadge: LocalBadge? private let subtitle: String? private let information: String? + private let secondaryInformation: Bool private let cancelTitle: String private let confirmTitle: String? private let secondTitle: String? @@ -156,6 +157,7 @@ class OpenChatAlertViewController: UIViewController { profileBadge: LocalBadge? = nil, subtitle: String? = nil, information: String? = nil, + secondaryInformation: Bool = false, cancelTitle: String = "Cancel", confirmTitle: String? = "Open", secondTitle: String? = nil, @@ -169,6 +171,7 @@ class OpenChatAlertViewController: UIViewController { self.profileBadge = profileBadge self.subtitle = subtitle self.information = information + self.secondaryInformation = secondaryInformation self.cancelTitle = cancelTitle self.confirmTitle = confirmTitle self.secondTitle = secondTitle @@ -248,7 +251,7 @@ class OpenChatAlertViewController: UIViewController { let infoLabel = UILabel() infoLabel.text = information infoLabel.font = UIFont.preferredFont(forTextStyle: .footnote) - infoLabel.textColor = .label + infoLabel.textColor = secondaryInformation ? .secondaryLabel : .label infoLabel.numberOfLines = 3 infoLabel.textAlignment = .center infoLabel.translatesAutoresizingMaskIntoConstraints = false @@ -426,6 +429,7 @@ func showOpenChatAlert( theme: AppTheme, subtitle: String? = nil, information: String? = nil, + secondaryInformation: Bool = false, cancelTitle: String = "Cancel", confirmTitle: String? = "Open", secondTitle: String? = nil, @@ -446,6 +450,7 @@ func showOpenChatAlert( profileBadge: profileBadge, subtitle: subtitle, information: information, + secondaryInformation: secondaryInformation, cancelTitle: cancelTitle, confirmTitle: confirmTitle, secondTitle: secondTitle, diff --git a/apps/ios/Shared/Views/NewChat/NewChatView.swift b/apps/ios/Shared/Views/NewChat/NewChatView.swift index 51746766bd..f938fb0063 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatView.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatView.swift @@ -1195,8 +1195,8 @@ private func showPrepareGroupAlert( information: ownerVerificationMessage(ownerVerification), cancelTitle: NSLocalizedString("Cancel", comment: "new chat action"), confirmTitle: isChannel - ? NSLocalizedString("Open new channel", comment: "new chat action") - : NSLocalizedString("Open new group", comment: "new chat action"), + ? NSLocalizedString("Open channel", comment: "new chat action") + : NSLocalizedString("Open group", comment: "new chat action"), secondTitle: connectOtherButton, onCancel: { cleanup?() }, onConfirm: { @@ -1259,6 +1259,20 @@ private func showOpenKnownContactAlert( ) } +private func memberRoleInformation(_ role: GroupMemberRole, isChannel: Bool) -> String { + switch role { + case .observer: isChannel + ? NSLocalizedString("You are a subscriber", comment: "new chat alert") + : NSLocalizedString("You are an observer", comment: "new chat alert") + case .moderator: NSLocalizedString("You are a moderator", comment: "new chat alert") + case .admin: NSLocalizedString("You are an admin", comment: "new chat alert") + case .owner: NSLocalizedString("You are an owner", comment: "new chat alert") + default: isChannel + ? NSLocalizedString("You are a contributor", comment: "new chat alert") + : NSLocalizedString("You are a member", comment: "new chat alert") + } +} + private func showOpenKnownGroupAlert( _ groupInfo: GroupInfo, theme: AppTheme, @@ -1278,18 +1292,16 @@ private func showOpenKnownGroupAlert( ), theme: theme, subtitle: groupInfo.useRelays ? subscriberCount : nil, + information: groupInfo.nextConnectPrepared || groupInfo.businessChat != nil + ? nil + : memberRoleInformation(groupInfo.membership.memberRole, isChannel: groupInfo.useRelays), + secondaryInformation: true, cancelTitle: NSLocalizedString("Cancel", comment: "new chat action"), confirmTitle: groupInfo.useRelays - ? ( groupInfo.nextConnectPrepared - ? NSLocalizedString("Open new channel", comment: "new chat action") - : NSLocalizedString("Open channel", comment: "new chat action") - ) + ? NSLocalizedString("Open channel", comment: "new chat action") : groupInfo.businessChat == nil - ? ( groupInfo.nextConnectPrepared - ? NSLocalizedString("Open new group", comment: "new chat action") - : NSLocalizedString("Open group", comment: "new chat action") - ) + ? NSLocalizedString("Open group", comment: "new chat action") : ( groupInfo.nextConnectPrepared ? NSLocalizedString("Open new chat", comment: "new chat action") : NSLocalizedString("Open chat", comment: "new chat action") diff --git a/apps/ios/Shared/Views/UserSettings/UserAddressView.swift b/apps/ios/Shared/Views/UserSettings/UserAddressView.swift index b9048becda..9711f3d6f8 100644 --- a/apps/ios/Shared/Views/UserSettings/UserAddressView.swift +++ b/apps/ios/Shared/Views/UserSettings/UserAddressView.swift @@ -802,6 +802,8 @@ private func saveAddressSettings(_ settings: AddressSettingsState, _ savedSettin } } +private let simplexNameSaleStart = Calendar(identifier: .gregorian).date(from: DateComponents(timeZone: TimeZone(identifier: "UTC"), year: 2026, month: 12, day: 12, hour: 18))! + struct SetSimplexDomainView: View { let title: LocalizedStringKey let footer: LocalizedStringKey @@ -815,6 +817,8 @@ struct SetSimplexDomainView: View { @State private var original = "" @State private var didSave = false @State private var editing = false + @State private var timeToSaleStart = simplexNameSaleStart.timeIntervalSinceNow + @State private var saleTimer: Timer? = nil @FocusState private var nameFocused: Bool init(title: LocalizedStringKey, footer: LocalizedStringKey, prompt: String, simplexName: String, broadcastWarning: String? = nil, save: @escaping (String?) async -> Bool) { @@ -873,7 +877,7 @@ struct SetSimplexDomainView: View { Section { if editing { Button { - openBrowserAlert(uri: "https://github.com/simplex-chat/simplex-chat/blob/master/docs/guide/register-simplex-name.md") + openBrowserAlert(uri: "https://simplex.domains/#testing") } label: { HStack { Text("How to register a test name") @@ -901,15 +905,39 @@ struct SetSimplexDomainView: View { } } } + Section { + VStack(alignment: .leading, spacing: 4) { + Text(verbatim: saleCountdown(timeToSaleStart)) + Text(timeToSaleStart > 0 ? "until you can register a SimpleX domain" : "Update the app to register a SimpleX domain") + .font(.caption) + .foregroundColor(theme.colors.secondary) + } + } header: { + Text("SimpleX name sale starts in") + .foregroundColor(theme.colors.secondary) + } footer: { + Text("Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/)") + .foregroundColor(theme.colors.secondary) + .padding(.bottom) + } } + .modifier(ThemedBackground(grouped: true)) .navigationTitle(title) .navigationBarTitleDisplayMode(.large) .onAppear { if editing { DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) { nameFocused = true } } + if timeToSaleStart > 0 { + saleTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { t in + timeToSaleStart = simplexNameSaleStart.timeIntervalSinceNow + if timeToSaleStart <= 0 { t.invalidate() } + } + } } .onDisappear { + saleTimer?.invalidate() + saleTimer = nil if !didSave, !saving, changed, isValid { let domain = normalized(simplexName) let saveName = save @@ -948,6 +976,21 @@ struct SetSimplexDomainView: View { : addSimplexTLD((t.hasPrefix("@") || t.hasPrefix("#") ? String(t.dropFirst()) : t).lowercased()) } + private func saleCountdown(_ remaining: TimeInterval) -> String { + let total = max(0, Int(remaining)) + let days = total / 86400 + let dayStr = String.localizedStringWithFormat( + days == 1 + ? NSLocalizedString("%d day", comment: "time interval") + : NSLocalizedString("%d days", comment: "time interval"), + days + ) + return dayStr + " " + String.localizedStringWithFormat( + NSLocalizedString("%02d hrs %02d min %02d sec", comment: "countdown"), + total / 3600 % 24, total / 60 % 60, total % 60 + ) + } + private func addSimplexTLD(_ d: String) -> String { if d.contains(".") { d } else { "\(d).simplex" } } diff --git a/apps/ios/SimpleX Localizations/az.xcloc/Localized Contents/az.xliff b/apps/ios/SimpleX Localizations/az.xcloc/Localized Contents/az.xliff new file mode 100644 index 0000000000..b8e7c44a67 --- /dev/null +++ b/apps/ios/SimpleX Localizations/az.xcloc/Localized Contents/az.xliff @@ -0,0 +1,10951 @@ + + + +
+ +
+ + + (can be copied) + (kopyalana bilər) + No comment provided by engineer. + + + !1 colored! + !1 rəngli! + No comment provided by engineer. + + + # %@ + # %@ + copied message info title, # <title> + + + ## History + ## Tarixçə + copied message info + + + ## In reply to + ## Cavab olaraq + copied message info + + + #secret# + #gizli# + No comment provided by engineer. + + + %1$@ supported SimpleX Chat. The badge expired on %2$@. + %1$@ SimpleX Chat-ı dəstəklədi. Nişanın müddəti %2$@ tarixində bitdi. + badge alert + + + %@ + %@ + No comment provided by engineer. + + + %@ %@ + %@ %@ + No comment provided by engineer. + + + %@ (current) + %@ (cari) + No comment provided by engineer. + + + %@ (current): + %@ (cari): + copied message info + + + %@ / %@ + %@ / %@ + No comment provided by engineer. + + + %@ and %@ + %@ və %@ + No comment provided by engineer. + + + %@ and %@ connected + %@ və %@ qoşuldu + No comment provided by engineer. + + + %1$@ at %2$@: + %2$@ tarixində %1$@: + copied message info, <sender> at <time> + + + %@ connected + %@ qoşuldu + No comment provided by engineer. + + + %@ downloaded + %@ yüklənib + No comment provided by engineer. + + + %@ invested in SimpleX Chat crowdfunding. + SimpleX Chat-ın kraudfandinqinə %@ sərmayə qoyulub. + badge alert + + + %@ is connected! + %@ qoşulub! + notification title + + + %@ is not verified + %@ təsdiqlənməyib + No comment provided by engineer. + + + %@ is verified + %@ təsdiqlənib + No comment provided by engineer. + + + %@ server + %@ server + No comment provided by engineer. + + + %@ servers + %@ serverlər + No comment provided by engineer. + + + %@ supports SimpleX Chat. + %@ SimpleX Chat-ı dəstəkləyir. + badge alert + + + %@ uploaded + %@ yükləndi + No comment provided by engineer. + + + %@ wants to connect! + %@ qoşulmaq istəyir! + notification title + + + %1$@, %2$@ + %1$@, %2$@ + format for date separator in chat + + + %@, %@ and %lld members + %@, %@ və %lld üzv + No comment provided by engineer. + + + %@, %@ and %lld other members connected + %@, %@ və digər %lld üzv qoşuldu + No comment provided by engineer. + + + %@: + %@: + copied message info + + + %d days + %d gün + time interval + + + %d file(s) are still being downloaded. + %d fayl hələ də yüklənir. + forward confirmation reason + + + %d file(s) failed to download. + %d faylın endirilməsi uğursuz oldu. + forward confirmation reason + + + %d file(s) were deleted. + %d fayl silindi. + forward confirmation reason + + + %d file(s) were not downloaded. + %d fayl yüklənmədi. + forward confirmation reason + + + %d hours + %d saat + time interval + + + %d messages not forwarded + %d mesaj yönləndirilməyib + alert title + + + %d min + %d dəq + time interval + + + %d months + %d ay + time interval + + + %d owner + %d sahib + channel owners count + + + %d owners + %d sahibləri + channel owners count + + + %d owners & contributors + %d sahib və töhfəçi + channel members count + + + %d relays failed + %d rele sıradan çıxdı + channel relay bar +channel subscriber relay bar + + + %d relays not active + %d rele aktiv deyil + channel relay bar +channel subscriber relay bar + + + %d relays removed + %d rele silindi + channel relay bar +channel subscriber relay bar + + + %d sec + %d san + time interval + + + %d seconds(s) + %d saniyə + delete after time + + + %d skipped message(s) + %d mesaj ötürüldü + integrity error chat item + + + %d subscriber + %d abunəçi + channel subscriber count + + + %d subscribers + %d abunəçilər + channel subscriber count + + + %d weeks + %d həftə + time interval + + + %1$d/%2$d relays active + %1$d/%2$d ötürücü aktivdir + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d errors + %1$d/%2$d ötürücü aktiv, %3$d xəta + channel relay bar + + + %1$d/%2$d relays active, %3$d failed + %1$d/%2$d ötürücü aktiv, %3$d uğursuz + channel creation progress with errors +channel relay bar + + + %1$d/%2$d relays active, %3$d removed + %1$d/%2$d ötürücü aktivdir, %3$d-ü silinib + channel relay bar + + + %1$d/%2$d relays connected + %1$d/%2$d ötürücü qoşulub + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + %1$d/%2$d ötürücü qoşulub, %3$d xəta + channel subscriber relay bar + + + %1$d/%2$d relays connected, %3$d failed + %1$d/%2$d ötürücü qoşulub, %3$d-si uğursuz olub + channel subscriber relay bar + + + %1$d/%2$d relays connected, %3$d removed + %1$d/%2$d ötürücü qoşulub, %3$d silinib + channel subscriber relay bar + + + %lld + %lld + No comment provided by engineer. + + + %lld %@ + %lld %@ + No comment provided by engineer. + + + %lld channel events + %lld kanal hadisəsi + No comment provided by engineer. + + + %lld contact(s) selected + %lld kontakt seçildi + No comment provided by engineer. + + + %lld file(s) with total size of %@ + Ümumi həcmi %@ olan %lld fayl + No comment provided by engineer. + + + %lld group events + %lld qrup tədbiri + No comment provided by engineer. + + + %lld members + %lld üzv + No comment provided by engineer. + + + %lld messages blocked + %lld mesaj bloklandı + No comment provided by engineer. + + + %lld messages blocked by admin + İnzibatçı tərəfindən %lld mesaj bloklanıb + No comment provided by engineer. + + + %lld messages marked deleted + %lld mesaj silinmiş kimi işarələndi + No comment provided by engineer. + + + %lld messages moderated by %@ + %@ tərəfindən moderasiya edilmiş %lld mesaj + No comment provided by engineer. + + + %lld minutes + %lld dəqiqə + No comment provided by engineer. + + + %lld new interface languages + %lld yeni interfeys dili + No comment provided by engineer. + + + %lld seconds + %lld saniyə + No comment provided by engineer. + + + %lldd + %lldd + No comment provided by engineer. + + + %lldh + %lldh + No comment provided by engineer. + + + %lldk + %lldk + No comment provided by engineer. + + + %lldm + %lldm + No comment provided by engineer. + + + %lldmth + %lldmth + No comment provided by engineer. + + + %llds + %llds + No comment provided by engineer. + + + %lldw + %lldw + No comment provided by engineer. + + + %u messages failed to decrypt. + %u mesajın şifrəsi açıla bilmədi. + No comment provided by engineer. + + + %u messages skipped. + %u mesaj ötürüldü. + No comment provided by engineer. + + + (from owner) + (sahibindən) + chat link info line + + + (new) + (yeni) + No comment provided by engineer. + + + (this device v%@) + (bu cihaz v%@) + No comment provided by engineer. + + + **Create 1-time link**: to create and share a new invitation link. + **Birdəfəlik keçid yarat**: yeni dəvət keçidi yaratmaq və paylaşmaq üçün. + No comment provided by engineer. + + + **Create group**: to create a new group. + **Qrup yarat**: yeni qrup yaratmaq. + No comment provided by engineer. + + + **More private**: check new messages every 20 minutes. Only device token is shared with our push server. It doesn't see how many contacts you have, or any message metadata. + **Daha çox məxfilik**: yeni mesajları hər 20 dəqiqədən bir yoxlayın. Push serverimizlə yalnız cihazın tokeni paylaşılır; server kontaktlarınızın sayını və ya mesajlarla bağlı hər hansı metadanatı görmür. + No comment provided by engineer. + + + **Most private**: do not use SimpleX Chat push server. The app will check messages in background, when the system allows it, depending on how often you use the app. + **Ən yüksək məxfilik**: SimpleX Chat-ın push serverindən istifadə etmir. Tətbiq, ondan nə qədər tez-tez istifadə etdiyinizdən asılı olaraq, sistem icazə verdikdə mesajları arxa fonda yoxlayacaq. + 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. + **Diqqət**: Təhlükəsizlik tədbiri olaraq, eyni verilənlər bazasından iki cihazda istifadə etmək əlaqədə olduğunuz şəxslərdən gələn mesajların şifrəsinin açılmasını mümkünsüz edəcək. + No comment provided by engineer. + + + **Please note**: you will NOT be able to recover or change passphrase if you lose it. + **Diqqət**: Əgər parol ifadəsini itirsəniz, onu bərpa edə və ya dəyişdirə bilməyəcəksiniz. + No comment provided by engineer. + + + **Recommended**: device token and end-to-end encrypted notifications are sent to SimpleX Chat push server, but it does not see the message content, size or who it is from. + **Tövsiyə olunur**: cihaz tokeni və uçdan-uca şifrələnmiş bildirişlər SimpleX Chat-ın push serverinə göndərilir, lakin server mesajın məzmununu, həcmini və ya kimdən gəldiyini görmür. + No comment provided by engineer. + + + **Scan / Paste link**: to connect via a link you received. + **Skan edin / Keçidi yapışdırın**: aldığınız keçid vasitəsilə qoşulmaq üçün. + No comment provided by engineer. + + + **Test relay** to retrieve its name. + Adını əldə etmək üçün **ötürücünü yoxlayın**. + No comment provided by engineer. + + + **Warning**: Instant push notifications require passphrase saved in Keychain. + **Xəbərdarlıq**: Ani təkan bildirişləri üçün "Keychain"də yadda saxlanılmış parol ifadəsi tələb olunur. + No comment provided by engineer. + + + **Warning**: the archive will be removed. + **Xəbərdarlıq**: arxiv silinəcək. + No comment provided by engineer. + + + **e2e encrypted** audio call + **Ucdan-uca şifrələnmiş** səsli zəng + No comment provided by engineer. + + + **e2e encrypted** video call + **Ucdan-uca şifrələnmiş** videozəng + No comment provided by engineer. + + + \*bold* + \*qalın* + No comment provided by engineer. + + + - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! +- delivery receipts (up to 20 members). +- faster and more stable. + - [kataloq xidmətinə](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) qoşulun (BETA)! - çatdırılma bildirişləri (20 üzvə qədər). - daha sürətli və daha stabil. + No comment provided by engineer. + + + - more stable message delivery. +- a bit better groups. +- and more! + - daha sabit mesaj çatdırılması. - bir az daha yaxşı qruplar. - və daha çoxu! + No comment provided by engineer. + + + - opt-in to send link previews. +- prevent hyperlink phishing. +- remove link tracking. + - keçid önizləmələrinin göndərilməsinə razılıq verin. - hiperkeçid vasitəsilə fişinqin qarşısını alın. - keçid izləmə funksiyasını ləğv edin. + No comment provided by engineer. + + + - optionally notify deleted contacts. +- profile names with spaces. +- and more! + - silinmiş kontaktlara seçimli bildiriş göndərmə. - boşluq işarəsi olan profil adları. - və daha çoxu! + No comment provided by engineer. + + + - voice messages up to 5 minutes. +- custom time to disappear. +- editing history. + - 5 dəqiqəyə qədər səsli mesajlar. - fərdi yoxa çıxma müddəti. - redaktə tarixçəsi. + No comment provided by engineer. + + + 0 sec + 0 saniyə + time to disappear + + + 0s + 0s + No comment provided by engineer. + + + 1 day + 1 gün + delete after time +time interval + + + 1 hour + 1 saat + time interval + + + 1 minute + 1 dəqiqə + No comment provided by engineer. + + + 1 month + 1 ay + delete after time +time interval + + + 1 week + 1 həftə + delete after time +time interval + + + 1 year + 1 il + delete after time + + + 1-time link + Bir dəfəlik keçid + No comment provided by engineer. + + + 1-time link can be used *with one contact only* - share in person or via any messenger. + Birdəfəlik keçid *yalnız bir kontaktla* istifadə oluna bilər – onu şəxsən və ya hər hansı messencer vasitəsilə paylaşın. + No comment provided by engineer. + + + 5 minutes + 5 dəqiqə + No comment provided by engineer. + + + 6 + 6 + No comment provided by engineer. + + + 30 seconds + 30 saniyə + No comment provided by engineer. + + + <p>Hi!</p> +<p><a href="%@">Connect to me via SimpleX Chat</a></p> + <p>Salam!</p> <p><a href="%@">SimpleX Chat vasitəsilə mənimlə əlaqə saxlayın</a></p> + email text + + + A few more things + Daha bir neçə məqam + No comment provided by engineer. + + + A link for one person to connect + Bir nəfərin qoşulması üçün keçid + No comment provided by engineer. + + + A new contact + Yeni əlaqə + notification title + + + A new random profile will be shared. + Yeni və təsadüfi bir profil paylaşılacaq. + No comment provided by engineer. + + + A separate TCP connection will be used **for each chat profile you have in the app**. + Tətbiqdəki hər bir söhbət profili üçün ayrıca TCP bağlantısı istifadə olunacaq. + No comment provided by engineer. + + + A separate TCP connection will be used **for each contact and group member**. +**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail. + **Hər bir kontakt və qrup üzvü üçün** ayrıca TCP bağlantısı istifadə olunacaq. **Diqqət**: Əgər çox sayda bağlantınız varsa, batareya və trafik sərfiyyatı əhəmiyyətli dərəcədə arta bilər və bəzi bağlantılar uğursuz ola bilər. + No comment provided by engineer. + + + Abort + Ləğv et + No comment provided by engineer. + + + Abort changing address + Ünvan dəyişikliyini ləğv et + No comment provided by engineer. + + + Abort changing address? + Ünvan dəyişikliyi dayandırılsın? + No comment provided by engineer. + + + About SimpleX Chat + SimpleX Chat haqqında + No comment provided by engineer. + + + About operators + Operatorlar haqqında + No comment provided by engineer. + + + Accent + Aksent + No comment provided by engineer. + + + Accept + Qəbul et + accept contact request via notification +accept incoming call via notification +alert action +swipe action + + + Accept as member + Üzv kimi qəbul et + alert action + + + Accept as observer + Müşahidəçi kimi qəbul et + alert action + + + Accept conditions + Şərtləri qəbul edin + No comment provided by engineer. + + + Accept connection request? + Əlaqə istəyi qəbul edilsin? + No comment provided by engineer. + + + Accept contact request + Əlaqə sorğusunu qəbul et + alert title + + + Accept contact request from %@? + %@ əlaqə sorğusunu qəbul edirsiniz? + notification body + + + Accept incognito + Gizli rejimdə qəbul et + alert action +swipe action + + + Accept member + Üzvü qəbul et + alert title + + + Accepted conditions + Qəbul edilmiş şərtlər + No comment provided by engineer. + + + Acknowledged + Qəbul edildi + No comment provided by engineer. + + + Acknowledgement errors + Təsdiq xətaları + No comment provided by engineer. + + + Active + Aktiv + token status text + + + Active connections + Aktiv bağlantılar + No comment provided by engineer. + + + Add + Əlavə et + No comment provided by engineer. + + + Add address to your profile, so that your SimpleX contacts can share it with other people. Profile update will be sent to your SimpleX contacts. + Profilinizə ünvan əlavə edin ki, SimpleX kontaktlarınızı onu başqaları ilə paylaşa bilsinlər. Profil yeniləməsi SimpleX kontaktlarınıza göndəriləcək. + No comment provided by engineer. + + + Add contributors. + Töhfəçiləri əlavə edin. + No comment provided by engineer. + + + Add description + Təsvir əlavə edin + No comment provided by engineer. + + + Add friends + Dostlar əlavə et + No comment provided by engineer. + + + Add list + Siyahı əlavə et + No comment provided by engineer. + + + Add message + Mesaj əlavə et + placeholder for sending contact request + + + Add profile + Profil əlavə et + No comment provided by engineer. + + + Add relay + Ötürücü əlavə et + No comment provided by engineer. + + + Add relays + Ötürücülər əlavə edin + No comment provided by engineer. + + + Add relays to restore message delivery. + Mesaj çatdırılmasını bərpa etmək üçün relelər əlavə edin. + No comment provided by engineer. + + + Add server + Server əlavə et + No comment provided by engineer. + + + Add servers by scanning QR codes. + QR kodları skan edərək serverlər əlavə edin. + No comment provided by engineer. + + + Add team members + Komanda üzvlərini əlavə edin + No comment provided by engineer. + + + Add this code to your webpage. It will display the preview of your channel / group. + Bu kodu veb-səhifənizə əlavə edin. O, kanalınızın və ya qrupunuzun önizləməsini göstərəcək. + No comment provided by engineer. + + + Add to another device + Başqa cihaza əlavə et + No comment provided by engineer. + + + Add to list + Siyahıya əlavə et + No comment provided by engineer. + + + Add welcome message + Salamlama mesajı əlavə edin + No comment provided by engineer. + + + Add your team members to the conversations. + Komanda üzvlərinizi söhbətlərə əlavə edin. + No comment provided by engineer. + + + Added media & file servers + Media və fayl serverləri əlavə edildi + No comment provided by engineer. + + + Added message servers + Mesaj serverləri əlavə edildi + No comment provided by engineer. + + + Additional accent + Əlavə vurğu + No comment provided by engineer. + + + Additional accent 2 + Əlavə vurğu 2 + No comment provided by engineer. + + + Additional secondary + Əlavə ikinci dərəcəli + No comment provided by engineer. + + + Address + Ünvan + No comment provided by engineer. + + + Address change will be aborted. Old receiving address will be used. + Ünvan dəyişikliyi ləğv ediləcək. Köhnə qəbul ünvanı istifadə olunacaq. + No comment provided by engineer. + + + Address or 1-time link? + Ünvan, yoxsa birdəfəlik keçid? + No comment provided by engineer. + + + Address settings + Ünvan parametrləri + No comment provided by engineer. + + + Admins can block a member for all. + İnzibatçılar üzvü hamı üçün bloklaya bilərlər. + No comment provided by engineer. + + + Admins can create the links to join groups. + İnzibatçılar qruplara qoşulmaq üçün keçidlər yarada bilərlər. + No comment provided by engineer. + + + Advanced network settings + Qabaqcıl şəbəkə parametrləri + No comment provided by engineer. + + + Advanced options + Əlavə seçimlər + No comment provided by engineer. + + + Advanced settings + Əlavə parametrlər + No comment provided by engineer. + + + All + Hamısı + No comment provided by engineer. + + + All app data is deleted. + Tətbiqin bütün məlumatları silinir. + No comment provided by engineer. + + + All chats and messages will be deleted - this cannot be undone! + Bütün söhbətlər və mesajlar silinəcək – bunu geri qaytarmaq mümkün deyil! + No comment provided by engineer. + + + All chats will be removed from the list %@, and the list deleted. + Bütün söhbətlər %@ siyahısından çıxarılacaq və siyahı silinəcək. + alert message + + + All data is erased when it is entered. + Bütün məlumatlar daxil edildikdən sonra silinir. + No comment provided by engineer. + + + All data is kept private on your device. + Bütün məlumatlar cihazınızda məxfi saxlanılır. + No comment provided by engineer. + + + All group members will remain connected. + Qrupun bütün üzvləri əlaqədə qalacaqlar. + No comment provided by engineer. + + + All messages + Bütün mesajlar + No comment provided by engineer. + + + All messages and files are sent **end-to-end encrypted**, with post-quantum security in direct messages. + Bütün mesajlar və fayllar **uçdan-uca şifrələnmiş** şəkildə göndərilir, birbaşa mesajlarda isə post-kvant təhlükəsizliyi təmin edilir. + No comment provided by engineer. + + + All messages will be deleted - this cannot be undone! + Bütün mesajlar silinəcək – bunu geri qaytarmaq mümkün deyil! + No comment provided by engineer. + + + All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you. + Bütün mesajlar silinəcək – bunu geri qaytarmaq mümkün deyil! Mesajlar yalnız sizin üçün silinəcək. + No comment provided by engineer. + + + All new messages from %@ will be hidden! + %@ gələn bütün yeni mesajlar gizlədiləcək! + No comment provided by engineer. + + + All profiles + Bütün profillər + profile dropdown + + + All relays failed + Bütün ötürücü sıradan çıxdı. + No comment provided by engineer. + + + All relays removed + Bütün ötürücü çıxarılıb + No comment provided by engineer. + + + All reports will be archived for you. + Bütün hesabatlar sizin üçün arxivləşdiriləcək. + No comment provided by engineer. + + + All servers + Bütün serverlər + No comment provided by engineer. + + + All your contacts will remain connected. + Bütün kontaktlarınız əlaqədə qalacaq. + No comment provided by engineer. + + + All your contacts will remain connected. Profile update will be sent to your contacts. + Bütün kontaktlarınızla əlaqə qorunub saxlanılacaq. Profil yeniləməsi kontaktlarınıza göndəriləcək. + No comment provided by engineer. + + + All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays. + Bütün kontaktlarınız, söhbətləriniz və fayllarınız təhlükəsiz şəkildə şifrələnəcək və hissələr halında konfiqurasiya edilmiş XFTP ötürücülərinə yüklənəcək. + No comment provided by engineer. + + + Allow + İcazə verin + No comment provided by engineer. + + + Allow anyone to embed + Hər kəsin yerləşdirməsinə icazə verin + No comment provided by engineer. + + + Allow calls only if your contact allows them. + Zənglərə yalnız əlaqə saxladığınız şəxs icazə verdikdə icazə verin. + No comment provided by engineer. + + + Allow calls? + Zənglərə icazə verilsin? + No comment provided by engineer. + + + Allow disappearing messages only if your contact allows it to you. + Yoxa çıxan mesajlara yalnız qarşı tərəf buna icazə verdiyi təqdirdə icazə verin. + No comment provided by engineer. + + + Allow downgrade + Endirməyə icazə verin + No comment provided by engineer. + + + Allow files and media only if your contact allows them. + Fayllara və mediaya yalnız əlaqə saxladığınız şəxs icazə verdiyi təqdirdə icazə verin. + No comment provided by engineer. + + + Allow irreversible message deletion only if your contact allows it to you. (24 hours) + Kontaktunuz buna icazə verdiyi halda, geri qaytarılması mümkün olmayan mesaj silinməsinə icazə verin. (24 saat) + No comment provided by engineer. + + + Allow members to chat with admins. + Üzvlərə administratorlarla söhbət etməyə icazə verin. + No comment provided by engineer. + + + Allow message reactions only if your contact allows them. + Mesaj reaksiyalarına yalnız əlaqə saxladığınız şəxs buna icazə verdikdə icazə verin. + No comment provided by engineer. + + + Allow message reactions. + Mesaj reaksiyalarına icazə verin. + No comment provided by engineer. + + + Allow sending direct messages to members. + Üzvlərə birbaşa mesaj göndərilməsinə icazə verin. + No comment provided by engineer. + + + Allow sending direct messages to subscribers. + Abunəçilərə birbaşa mesaj göndərilməsinə icazə verin. + No comment provided by engineer. + + + Allow sending disappearing messages. + Yoxa çıxan mesajların göndərilməsinə icazə verin. + No comment provided by engineer. + + + Allow sharing + Paylaşmağa icazə verin + No comment provided by engineer. + + + Allow subscribers to chat with admins. + Abunəçilərə administratorlarla söhbət etməyə icazə verin. + No comment provided by engineer. + + + Allow to irreversibly delete sent messages. (24 hours) + Göndərilmiş mesajların geri qaytarıla bilməyəcək şəkildə silinməsinə icazə verin. (24 saat) + No comment provided by engineer. + + + Allow to report messsages to moderators. + İstifadəçilərə mesajları moderatorlara şikayət etmək imkanı verin. + No comment provided by engineer. + + + Allow to send SimpleX links. + SimpleX linklərinin göndərilməsinə icazə verin. + No comment provided by engineer. + + + Allow to send files and media. + Faylların və medianın göndərilməsinə icazə verin. + No comment provided by engineer. + + + Allow to send voice messages. + Səsli mesajların göndərilməsinə icazə verin. + No comment provided by engineer. + + + Allow voice messages only if your contact allows them. + Səsli mesajlara yalnız əlaqə saxladığınız şəxs icazə verdiyi təqdirdə icazə verin. + No comment provided by engineer. + + + Allow voice messages? + Səsli mesajlara icazə verilsin? + No comment provided by engineer. + + + Allow your contacts adding message reactions. + Kontaktlarınıza mesajlara reaksiya əlavə etməyə icazə verin. + No comment provided by engineer. + + + Allow your contacts to call you. + Kontaktlarınızın sizə zəng etməsinə icazə verin. + No comment provided by engineer. + + + Allow your contacts to irreversibly delete sent messages. (24 hours) + Kontaktlarınıza göndərilmiş mesajları geri qaytarıla bilməyəcək şəkildə silməyə icazə verin. (24 saat) + No comment provided by engineer. + + + Allow your contacts to send disappearing messages. + Kontaktlarınıza yoxa çıxan mesajlar göndərməyə icazə verin. + No comment provided by engineer. + + + Allow your contacts to send files and media. + Kontaktlarınıza fayl və media göndərməyə icazə verin. + No comment provided by engineer. + + + Allow your contacts to send voice messages. + Kontaktlarınıza səsli mesajlar göndərməyə icazə verin. + No comment provided by engineer. + + + Already connected? + Artıq qoşulmusunuz? + No comment provided by engineer. + + + Already connecting! + Artıq qoşulur! + new chat sheet title + + + Already joining the group! + Artıq qrupa qoşuluram! + new chat sheet title + + + Always use private routing. + Həmişə şəxsi marşrutlaşdırmadan istifadə edin. + No comment provided by engineer. + + + Always use relay + Həmişə ötürücünü istifadə edin. + No comment provided by engineer. + + + An empty chat profile with the provided name is created, and the app opens as usual. + Təqdim olunmuş adla boş bir çat profili yaradılır və tətbiq adi qaydada açılır. + No comment provided by engineer. + + + Another reason + Başqa bir səbəb + report reason + + + Answer call + Zəngə cavab verin + No comment provided by engineer. + + + Any webpage can show the preview. + İstənilən veb-səhifə önizləməni göstərə bilər. + No comment provided by engineer. + + + App build: %@ + Tətbiq versiyası: %@ + No comment provided by engineer. + + + App data migration + Tətbiq məlumatlarının miqrasiyası + No comment provided by engineer. + + + App encrypts new local files (except videos). + Tətbiq yeni yerli faylları (videolar istisna olmaqla) şifrələyir. + No comment provided by engineer. + + + App group: + Tətbiq qrupu: + No comment provided by engineer. + + + App icon + Tətbiq ikonu + No comment provided by engineer. + + + App passcode + Tətbiq üçün giriş kodu + No comment provided by engineer. + + + App passcode is replaced with self-destruct passcode. + Tətbiqin giriş kodu öz-özünə silinən giriş kodu ilə əvəz olunur. + No comment provided by engineer. + + + App session + Tətbiq sessiyası + No comment provided by engineer. + + + App update required + Tətbiq yeniləməsi tələb olunur + alert title + + + App version + Tətbiq versiyası + No comment provided by engineer. + + + App version: v%@ + Tətbiq versiyası: v%@ + No comment provided by engineer. + + + Appearance + Görünüş + No comment provided by engineer. + + + Apply + Müraciət edin + No comment provided by engineer. + + + Apply to + Müraciət edin + No comment provided by engineer. + + + Archive + Arxiv + No comment provided by engineer. + + + Archive %lld reports? + %lld hesabatı arxivlə? + No comment provided by engineer. + + + Archive all reports? + Bütün hesabatları arxivləyək? + No comment provided by engineer. + + + Archive and upload + Arxivləyin və yükləyin + No comment provided by engineer. + + + Archive contacts to chat later. + Daha sonra yazışmaq üçün kontaktları arxivləşdirin. + No comment provided by engineer. + + + Archive report + Arxiv hesabatı + No comment provided by engineer. + + + Archive report? + Hesabatı arxivləşdirək? + No comment provided by engineer. + + + Archive reports + Arxiv hesabatları + swipe action + + + Archived contacts + Arxivlənmiş kontaktlar + No comment provided by engineer. + + + Archiving database + Verilənlər bazasının arxivləşdirilməsi + No comment provided by engineer. + + + Attach + Əlavə et + No comment provided by engineer. + + + Audio & video calls + Audio və video zənglər + No comment provided by engineer. + + + Audio and video calls + Audio və video zənglər + No comment provided by engineer. + + + Audio call + Səsli zəng + No comment provided by engineer. + + + Audio/video calls + Audio/video zənglər + chat feature + + + Audio/video calls are prohibited. + Audio və video zənglər qadağandır. + No comment provided by engineer. + + + Authentication cancelled + Autentifikasiya ləğv edildi + PIN entry + + + Authentication failed + Autentifikasiya uğursuz oldu + No comment provided by engineer. + + + Authentication is required before the call is connected, but you may miss calls. + Zəng birləşdirilməzdən əvvəl autentifikasiya tələb olunur, lakin zəngləri qaçıra bilərsiniz. + No comment provided by engineer. + + + Authentication unavailable + Autentifikasiya mümkün deyil + No comment provided by engineer. + + + Auto-accept + Avtomatik qəbul + No comment provided by engineer. + + + Auto-accept contact requests + Əlaqə sorğularını avtomatik qəbul et + No comment provided by engineer. + + + Auto-accept images + Şəkilləri avtomatik qəbul et + No comment provided by engineer. + + + Back + Geri + No comment provided by engineer. + + + Background + Arxa plan + No comment provided by engineer. + + + Bad desktop address + Yanlış masaüstü ünvanı + No comment provided by engineer. + + + Bad message ID + Yanlış mesaj ID + No comment provided by engineer. + + + Bad message hash + Yanlış mesaj heşi + No comment provided by engineer. + + + Badge cannot be verified + Nişan təsdiqlənə bilmir + badge alert title + + + Be free +in your network + Şəbəkənizdə sərbəst olun + No comment provided by engineer. + + + Be free in your network. + Şəbəkənizdə sərbəst olun. + No comment provided by engineer. + + + Because we destroyed the power to know who you are. So that your power can never be taken. + Çünki biz kim olduğunuzu bilmək gücünü məhv etdik. Ta ki gücünüz heç vaxt əlinizdən alınmasın deyə. + No comment provided by engineer. + + + Better calls + Daha yaxşı zənglər + No comment provided by engineer. + + + Better channels 📢 + Daha yaxşı kanallar 📢 + No comment provided by engineer. + + + Better groups + Daha yaxşı qruplar + No comment provided by engineer. + + + Better groups performance + Qrupların daha yaxşı performansı + No comment provided by engineer. + + + Better message dates. + Daha yaxşı mesaj tarixləri. + No comment provided by engineer. + + + Better messages + Daha yaxşı mesajlar + No comment provided by engineer. + + + Better networking + Daha yaxşı şəbəkə + No comment provided by engineer. + + + Better notifications + Daha yaxşı bildirişlər + No comment provided by engineer. + + + Better privacy and security + Daha yaxşı məxfilik və təhlükəsizlik + No comment provided by engineer. + + + Better security ✅ + Daha yaxşı təhlükəsizlik ✅ + No comment provided by engineer. + + + Better user experience + Daha yaxşı istifadəçi təcrübəsi + No comment provided by engineer. + + + Bio + Haqqında + No comment provided by engineer. + + + Bio too large + Bioqrafiya çox uzundur + alert title + + + Black + Qara + No comment provided by engineer. + + + Block + Blok + No comment provided by engineer. + + + Block for all + Hamı üçün blokla + No comment provided by engineer. + + + Block group members + Blok qrupu üzvləri + No comment provided by engineer. + + + Block member + Blok üzvü + No comment provided by engineer. + + + Block member for all? + Hamı üçün üzvü blokla? + No comment provided by engineer. + + + Block member? + İstifadəçini blokla? + No comment provided by engineer. + + + Block subscriber for all? + Abunəçini hamı üçün blokla? + No comment provided by engineer. + + + Blocked by admin + İnzibatçı tərəfindən bloklanıb + No comment provided by engineer. + + + Blur for better privacy. + Daha yaxşı məxfilik üçün bulanıqlaşdırın. + No comment provided by engineer. + + + Blur media + Medianı bulandır + No comment provided by engineer. + + + Bot + Bot + No comment provided by engineer. + + + Both you and your contact can add message reactions. + Həm siz, həm də əlaqə saxladığınız şəxs mesajlara reaksiya əlavə edə bilərsiniz. + No comment provided by engineer. + + + Both you and your contact can irreversibly delete sent messages. (24 hours) + Həm siz, həm də həmsöhbətiniz göndərilən mesajları geri qaytarıla bilməyəcək şəkildə silə bilərsiniz. (24 saat) + No comment provided by engineer. + + + Both you and your contact can make calls. + Həm siz, həm də əlaqə saxladığınız şəxs zəng edə bilərsiniz. + No comment provided by engineer. + + + Both you and your contact can send disappearing messages. + Həm siz, həm də əlaqə saxladığınız şəxs yoxa çıxan mesajlar göndərə bilərsiniz. + No comment provided by engineer. + + + Both you and your contact can send files and media. + Həm siz, həm də əlaqə saxladığınız şəxs fayllar və media göndərə bilərsiniz. + No comment provided by engineer. + + + Both you and your contact can send voice messages. + Həm siz, həm də əlaqə saxladığınız şəxs səsli mesajlar göndərə bilərsiniz. + No comment provided by engineer. + + + Bottom bar + Alt panel + No comment provided by engineer. + + + Broadcast + Yayımlamaq + compose placeholder for channel owner + + + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! + Bolqar, fin, tay və ukrayna dilləri – istifadəçilərə və [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)-ə təşəkkürlər! + No comment provided by engineer. + + + Business address + Biznes ünvanı + chat link info line + + + Business chats + Biznes söhbətləri + No comment provided by engineer. + + + Business connection + İşgüzar əlaqə + No comment provided by engineer. + + + Businesses + Bizneslər + No comment provided by engineer. + + + By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA). + Çat profili (standart) və ya [əlaqə vasitəsilə](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA). + No comment provided by engineer. + + + Call already ended! + Zəng artıq bitib! + No comment provided by engineer. + + + Calls prohibited! + Zəng etmək qadağandır! + No comment provided by engineer. + + + Camera not available + Kamera mövcud deyil + No comment provided by engineer. + + + Can't call contact + Kontaktla əlaqə yaratmaq mümkün deyil + No comment provided by engineer. + + + Can't call member + Üzvü çağırmaq mümkün deyil + No comment provided by engineer. + + + Can't change profile + Profili dəyişmək mümkün deyil + alert title + + + Can't invite contact! + Kontaktı dəvət etmək mümkün deyil! + No comment provided by engineer. + + + Can't invite contacts! + Kontaktları dəvət etmək mümkün deyil! + No comment provided by engineer. + + + Can't message member + İstifadəçiyə mesaj göndərmək mümkün deyil + No comment provided by engineer. + + + Cancel + Ləğv et + alert action +alert button +new chat action + + + Cancel and delete channel + Kanalı ləğv et və sil + No comment provided by engineer. + + + Cancel creating channel? + Kanalın yaradılmasını ləğv etmək? + alert title + + + Cancel migration + Köçürməni ləğv et + No comment provided by engineer. + + + Cannot access keychain to save database password + Verilənlər bazası parolunu saxlamaq üçün açar zəncirinə daxil olmaq mümkün deyil + No comment provided by engineer. + + + Cannot forward message + Mesajı yönləndirmək mümkün deyil + No comment provided by engineer. + + + Cannot receive file + Fayl qəbul edilə bilmir + alert title + + + Capacity exceeded - recipient did not receive previously sent messages. + Tutum həddi aşıldı – alıcı əvvəllər göndərilmiş mesajları qəbul etməyib. + snd error text + + + Cellular + Hüceyrəvi + No comment provided by engineer. + + + Change + Dəyişiklik + No comment provided by engineer. + + + Change automatic message deletion? + Avtomatik mesaj silinməsini dəyişdirmək? + alert title + + + Change chat profiles + Çat profillərini dəyişdirin + authentication reason + + + Change database passphrase? + Verilənlər bazasının parolunu dəyişdirmək? + No comment provided by engineer. + + + Change lock mode + Kilid rejimini dəyişdirin + authentication reason + + + Change passcode + Kilid kodunu dəyişdirin + authentication reason + + + Change receiving address + Qəbul ünvanını dəyişdirin + No comment provided by engineer. + + + Change receiving address? + Qəbul ünvanını dəyişdirmək? + No comment provided by engineer. + + + Change role + Rolu dəyişdirin + No comment provided by engineer. + + + Change role? + Rolunuzu dəyişin? + No comment provided by engineer. + + + Change self-destruct mode + Öz-özünü məhv etmə rejimini dəyişdirin + authentication reason + + + Change self-destruct passcode + Öz-özünü məhv etmə kodunu dəyişdirin + authentication reason +set passcode view + + + Channel + Kanal + No comment provided by engineer. + + + Channel SimpleX name + SimpleX kanalı adı + No comment provided by engineer. + + + Channel display name + Kanalın görünən adı + No comment provided by engineer. + + + Channel full name (optional) + Kanalın tam adı (isteğe bağlı) + No comment provided by engineer. + + + Channel has no active relays. Please try to join later. + Kanalda aktiv ötürücü yoxdur. Zəhmət olmasa, daha sonra qoşulmağa cəhd edin. + alert message +alert subtitle + + + Channel image + Kanal şəkli + No comment provided by engineer. + + + Channel link + Kanalın linki + chat link info line + + + Channel preferences + Kanal seçimləri + No comment provided by engineer. + + + Channel profile + Kanal profili + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + Kanal profili abunəçilərin cihazlarında və çat ötürücülərində saxlanılır. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + Kanal profili dəyişdirildi. Əgər onu yaddaşda saxlasanız, yenilənmiş profil kanal abunəçilərinə göndəriləcək. + alert message + + + Channel temporarily unavailable + Kanal müvəqqəti olaraq mövcud deyil + alert title + + + Channel webpage + Kanalın veb-səhifəsi + No comment provided by engineer. + + + Channel will be deleted for all subscribers - this cannot be undone! + Kanal bütün abunəçilər üçün silinəcək – bunu geri qaytarmaq mümkün deyil! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + Kanal sizin üçün silinəcək – bunu geri qaytarmaq mümkün olmayacaq! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Continue? + Kanal %2$d ötürücüdən %1$d-i ilə işləməyə başlayacaq. Davam edilsin? + alert message + + + Channels + Kanallar + No comment provided by engineer. + + + Chat + Çat + No comment provided by engineer. + + + Chat already exists + Çat artıq mövcuddur + No comment provided by engineer. + + + Chat already exists! + Çat artıq mövcuddur! + new chat sheet title + + + Chat colors + Çat rəngləri + No comment provided by engineer. + + + Chat console + Çat konsolu + No comment provided by engineer. + + + Chat data + Çat məlumatları + No comment provided by engineer. + + + Chat database + Çat məlumat bazası + No comment provided by engineer. + + + Chat database deleted + Çat məlumat bazası silindi + No comment provided by engineer. + + + Chat database exported + Çat məlumat bazası ixrac edildi + No comment provided by engineer. + + + Chat database imported + Çat məlumat bazası idxal edildi + No comment provided by engineer. + + + Chat is running + Çat işləyir + No comment provided by engineer. + + + Chat is stopped + Çat dayandırılıb + 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. + Çat dayandırılıb. Əgər bu verilənlər bazasından artıq başqa bir cihazda istifadə etmisinizsə, çata başlamazdan əvvəl onu geri köçürməlisiniz. + No comment provided by engineer. + + + Chat list + Çat siyahısı + No comment provided by engineer. + + + Chat migrated! + Çat köçürüldü! + No comment provided by engineer. + + + Chat preferences + Çat seçimləri + No comment provided by engineer. + + + Chat preferences were changed. + Çat parametrləri dəyişdirildi. + alert message + + + Chat profile + Çat profili + No comment provided by engineer. + + + Chat relay + Çat ötürücüsü + No comment provided by engineer. + + + Chat relays + Çat ötürücüləri + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + Çat ötürücüləri yaratdığınız kanallarda mesajları ötürür. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + Çat ötürücüləri mesajları kanal abunəçilərinə yönləndirir. + No comment provided by engineer. + + + Chat theme + Söhbət mövzusu + No comment provided by engineer. + + + Chat will be deleted for all members - this cannot be undone! + Çat bütün üzvlər üçün silinəcək – bunu geri qaytarmaq mümkün deyil! + No comment provided by engineer. + + + Chat will be deleted for you - this cannot be undone! + Çat sizin üçün silinəcək – bunu geri qaytarmaq mümkün deyil! + No comment provided by engineer. + + + Chat with admins + Adminlərlə söhbət + chat feature +chat toolbar + + + Chat with member + Üzvlə söhbət edin + No comment provided by engineer. + + + Chat with members before they join. + Üzvlər qoşulmazdan əvvəl onlarla söhbət edin. + No comment provided by engineer. + + + Chats + Çatlar + No comment provided by engineer. + + + Chats with admins are prohibited. + Adminlərlə söhbət etmək qadağandır. + No comment provided by engineer. + + + Chats with admins in public channels have no E2E encryption - use only with trusted chat relays. + İctimai kanallarda administratorlarla aparılan söhbətlərdə uçdan-uca şifrələmə (E2E) yoxdur; yalnız etibarlı söhbət ötürücülərindən (relays) istifadə edin. + alert message + + + Chats with members + Üzvlərlə söhbətlər + No comment provided by engineer. + + + Chats with members are disabled + Üzvlərlə söhbət deaktiv edilib + No comment provided by engineer. + + + Check messages every 20 min. + Mesajları hər 20 dəqiqədən bir yoxlayın. + No comment provided by engineer. + + + Check messages when allowed. + İcazə verildikdə mesajları yoxlayın. + No comment provided by engineer. + + + Check relay address and try again. + Ötürücünün ünvanını yoxlayın və yenidən cəhd edin. + alert message + + + Check relay name and try again. + Ötürücünün adını yoxlayın və yenidən cəhd edin. + alert message + + + Check server address and try again. + Server ünvanını yoxlayın və yenidən cəhd edin. + alert title + + + Chinese and Spanish interface + Çin və İspan dillərində interfeys + No comment provided by engineer. + + + Choose _Migrate from another device_ on the new device and scan QR code. + Yeni cihazda "Başqa cihazdan keçid et" seçimini edin və QR kodu skan edin. + No comment provided by engineer. + + + Choose file + Fayl seçin + No comment provided by engineer. + + + Choose from library + Kitabxanadan seçin + No comment provided by engineer. + + + Chunks deleted + Hissələr silindi + No comment provided by engineer. + + + Chunks downloaded + Hissələr yükləndi + No comment provided by engineer. + + + Chunks uploaded + Hissələr yükləndi + No comment provided by engineer. + + + Clear + Aydın + swipe action + + + Clear conversation + Aydın söhbət + No comment provided by engineer. + + + Clear conversation? + Aydın söhbət? + No comment provided by engineer. + + + Clear group? + Qrupu təmizləyin? + No comment provided by engineer. + + + Clear or delete group? + Qrupu təmizləyin və ya silin? + No comment provided by engineer. + + + Clear private notes? + Şəxsi qeydləri təmizləyin? + No comment provided by engineer. + + + Clear verification + Aydın təsdiqləmə + No comment provided by engineer. + + + Color chats with the new themes. + Yeni mövzularla rəngli söhbətlər. + No comment provided by engineer. + + + Color mode + Rəng rejimi + No comment provided by engineer. + + + Community guidelines violation + İcma qaydalarının pozulması + report reason + + + Compare file + Faylı müqayisə et + server test step + + + Compare security codes with your contacts. + Təhlükəsizlik kodlarını kontaktlarınızla müqayisə edin. + No comment provided by engineer. + + + Completed + Tamamlanıb + No comment provided by engineer. + + + Conditions accepted on: %@. + Şərtlər %@ tarixində qəbul edilib. + No comment provided by engineer. + + + Conditions are accepted for the operator(s): **%@**. + Operator(lar) üçün şərtlər qəbul edilir: **%@**. + No comment provided by engineer. + + + Conditions are already accepted for these operator(s): **%@**. + Bu operator(lar) üçün şərtlər artıq qəbul edilib: **%@**. + No comment provided by engineer. + + + Conditions of use + İstifadə şərtləri + alert button + + + Conditions will be accepted for the operator(s): **%@**. + Şərtlər operator(lar) üçün qəbul ediləcək: **%@**. + No comment provided by engineer. + + + Conditions will be accepted on: %@. + Şərtlər %@ tarixində qəbul ediləcək. + No comment provided by engineer. + + + Conditions will be automatically accepted for enabled operators on: %@. + Şərtlər %@ üzərində aktivləşdirilmiş operatorlar üçün avtomatik olaraq qəbul ediləcək. + No comment provided by engineer. + + + Configure ICE servers + ICE serverlərini konfiqurasiya edin + No comment provided by engineer. + + + Configure relays + Ötürücüləri konfiqurasiya edin + No comment provided by engineer. + + + Confirm + Təsdiqləyin + No comment provided by engineer. + + + Confirm Passcode + Kilid kodunu təsdiqləyin + No comment provided by engineer. + + + Confirm contact deletion? + Kontaktın silinməsini təsdiqləyin? + No comment provided by engineer. + + + Confirm database upgrades + Verilənlər bazası təkmilləşdirmələrini təsdiqləyin + No comment provided by engineer. + + + Confirm files from unknown servers. + Naməlum serverlərdən gələn faylları təsdiqləyin. + No comment provided by engineer. + + + Confirm network settings + Şəbəkə parametrlərini təsdiqləyin + No comment provided by engineer. + + + Confirm new passphrase… + Yeni parolu təsdiqləyin… + No comment provided by engineer. + + + Confirm password + Parolu təsdiqləyin + No comment provided by engineer. + + + Confirm that you remember database passphrase to migrate it. + Verilənlər bazasını miqrasiya etmək üçün onun şifrə ifadəsini xatırladığınızı təsdiqləyin. + No comment provided by engineer. + + + Confirm upload + Yükləməni təsdiqləyin + No comment provided by engineer. + + + Confirmed + Təsdiqlənib + token status text + + + Connect + Qoşulun + relay test step +server test step + + + Connect automatically + Avtomatik qoşul + No comment provided by engineer. + + + Connect faster! 🚀 + Daha sürətlə qoşulun! 🚀 + No comment provided by engineer. + + + Connect to %@ + %@ ilə əlaqə qur + new chat action + + + Connect to desktop + İş masasına qoşulun + No comment provided by engineer. + + + Connect to your friends faster. + Dostlarınızla daha tez əlaqə qurun. + No comment provided by engineer. + + + Connect to yourself? +This is your own SimpleX address! + Özünüzə qoşulun? Bu, sizin şəxsi SimpleX ünvanınızdır! + new chat sheet title + + + Connect to yourself? +This is your own one-time link! + Özünüzlə əlaqə qurun? +Bu, sizin şəxsi birdəfəlik keçidinizdir! + new chat sheet title + + + Connect via contact address + Əlaqə ünvanı vasitəsilə əlaqə saxlayın + new chat sheet title + + + Connect via link + Keçid vasitəsilə qoşulun + new chat sheet title + + + Connect via link or QR code + Keçid və ya QR kod vasitəsilə qoşulun + No comment provided by engineer. + + + Connect via one-time link + Birdəfəlik keçid vasitəsilə qoşulun + new chat sheet title + + + Connect with %@ + %@ ilə əlaqə yaradın + new chat action + + + Connected + Əlaqəli + No comment provided by engineer. + + + Connected desktop + Qoşulmuş iş masası + No comment provided by engineer. + + + Connected servers + Əlaqəli serverlər + No comment provided by engineer. + + + Connected to desktop + Masaüstü kompüterə qoşulub + No comment provided by engineer. + + + Connecting + Əlaqə qurulur + No comment provided by engineer. + + + Connecting to server… + Serverə qoşulur… + No comment provided by engineer. + + + Connecting to server… (error: %@) + Serverə qoşulur… (xəta: %@) + No comment provided by engineer. + + + Connecting to contact, please wait or check later! + Əlaqəyə qoşulur, zəhmət olmasa gözləyin və ya daha sonra yoxlayın! + No comment provided by engineer. + + + Connecting to desktop + İş masasına qoşulur + No comment provided by engineer. + + + Connection + Əlaqə + No comment provided by engineer. + + + Connection and servers status. + Əlaqə və serverlərin vəziyyəti. + No comment provided by engineer. + + + Connection blocked + Əlaqə bloklandı + No comment provided by engineer. + + + Connection blocked: %@ + Əlaqə bloklandı: %@ + conn error description + + + Connection error + Bağlantı xətası + alert title + + + Connection failed + Əlaqə uğursuz oldu + No comment provided by engineer. + + + Connection is blocked by server operator: +%@ + Server operator tərəfindən bağlantı bloklanıb: %@ + No comment provided by engineer. + + + Connection link removed + Əlaqə linki silindi + conn error description + + + Connection not ready. + Bağlantı hazır deyil. + No comment provided by engineer. + + + Connection notifications + Əlaqə bildirişləri + No comment provided by engineer. + + + Connection request sent! + Əlaqə sorğusu göndərildi! + No comment provided by engineer. + + + Connection requires encryption renegotiation. + Əlaqə şifrələmənin yenidən razılaşdırılmasını tələb edir. + No comment provided by engineer. + + + Connection security + Bağlantı təhlükəsizliyi + No comment provided by engineer. + + + Connection terminated + Əlaqə kəsildi + No comment provided by engineer. + + + Connection timeout + Əlaqə kəsildi + alert title + + + Connection with desktop stopped + Masaüstü ilə əlaqə kəsildi + No comment provided by engineer. + + + Connections + Əlaqələr + No comment provided by engineer. + + + Contact + Əlaqə + No comment provided by engineer. + + + Contact address + Əlaqə ünvanı + chat link info line + + + Contact allows + Əlaqə imkan verir + No comment provided by engineer. + + + Contact already exists + Kontakt artıq mövcuddur + No comment provided by engineer. + + + Contact deleted! + Kontakt silindi! + No comment provided by engineer. + + + Contact hidden: + Əlaqə məlumatı gizlədilib: + notification + + + Contact is connected + Əlaqə quruldu + notification + + + Contact is deleted. + Kontakt silindi. + No comment provided by engineer. + + + Contact name + Kontakt adı + No comment provided by engineer. + + + Contact preferences + Kontakt seçimləri + No comment provided by engineer. + + + Contact requests in groups + Qruplarda əlaqə sorğuları + No comment provided by engineer. + + + Contact will be deleted - this cannot be undone! + Kontakt silinəcək – bunu geri qaytarmaq mümkün olmayacaq! + No comment provided by engineer. + + + Contacts + Kontakt + No comment provided by engineer. + + + Contacts can mark messages for deletion; you will be able to view them. + Kontaktlar mesajları silinmək üçün işarələyə bilər; siz onları görə biləcəksiniz. + No comment provided by engineer. + + + Content violates conditions of use + Məzmun istifadə şərtlərini pozur + blocking reason + + + Continue + Davam edin + alert action + + + Contribute + Töhfə verin + No comment provided by engineer. + + + Conversation deleted! + Söhbət silindi! + No comment provided by engineer. + + + Copy + Kopyalayın + No comment provided by engineer. + + + Copy code + Kodu kopyalayın + No comment provided by engineer. + + + Copy error + Kopyalama xətası + No comment provided by engineer. + + + Core version: v%@ + Əsas versiya: v%@ + No comment provided by engineer. + + + Corner + Künc + No comment provided by engineer. + + + Correct name to %@? + Düzgün ad %@-dir? + alert message + + + Create 1-time link + Bir dəfəlik keçid yarat + No comment provided by engineer. + + + Create SimpleX address + SimpleX ünvanı yaradın + No comment provided by engineer. + + + Create a group using a random profile. + Təsadüfi profildən istifadə edərək qrup yaradın. + No comment provided by engineer. + + + Create a webpage to show your channel preview to visitors before they subscribe. Host it yourself or use any static hosting. + Ziyarətçilərə abunə olmazdan əvvəl kanalınızın önizləməsini göstərmək üçün bir veb-səhifə yaradın. Onu özünüz host edin və ya hər hansı statik hostinq xidmətindən istifadə edin. + No comment provided by engineer. + + + Create file + Fayl yarat + server test step + + + Create group + Qrup yarat + No comment provided by engineer. + + + Create group link + Qrup linki yarat + No comment provided by engineer. + + + Create link + Keçid yarat + No comment provided by engineer. + + + Create list + Siyahı yarat + No comment provided by engineer. + + + Create new profile in [desktop app](https://simplex.chat/downloads/). 💻 + [Masaüstü tətbiqində](https://simplex.chat/downloads/) yeni profil yaradın. 💻 + No comment provided by engineer. + + + Create profile + Profil yarat + No comment provided by engineer. + + + Create public channel + Açıq kanal yarat + No comment provided by engineer. + + + Create queue + Növbə yarat + server test step + + + Create web preview. + Veb-önbaxış yaradın. + No comment provided by engineer. + + + Create your address + Ünvanınızı yaradın + No comment provided by engineer. + + + Create your link + Linkinizi yaradın + No comment provided by engineer. + + + Create your profile + Profilinizi yaradın + No comment provided by engineer. + + + Create your public address + İctimai ünvanınızı yaradın + No comment provided by engineer. + + + Created + Yaradılıb + No comment provided by engineer. + + + Created at + Yaradılma tarixi + No comment provided by engineer. + + + Created at: %@ + Yaradılma tarixi: %@ + copied message info + + + Creating archive link + Arxiv keçidi yaradılır + No comment provided by engineer. + + + Creating channel + Kanal yaradılır + No comment provided by engineer. + + + Creating link… + Keçid yaradılır… + No comment provided by engineer. + + + Crowdfunding on Wefunder + Wefunder kraudfandinq + No comment provided by engineer. + + + Crowdfunding on Wefunder. + Wefunder də kraudfandinq. + No comment provided by engineer. + + + Current Passcode + Cari giriş kodu + No comment provided by engineer. + + + Current conditions text couldn't be loaded, you can review conditions via this link: + Hazırkı şərtlər mətni yüklənə bilmədi; şərtlərlə bu keçid vasitəsilə tanış ola bilərsiniz: + No comment provided by engineer. + + + Current passphrase… + Cari parolu ifadəsi… + No comment provided by engineer. + + + Current profile + Cari profil + No comment provided by engineer. + + + Currently maximum supported file size is %@. + Hazırda dəstəklənən maksimum fayl ölçüsü %@-dır. + No comment provided by engineer. + + + Custom time + Fərdi vaxt + No comment provided by engineer. + + + Customizable message shape. + Fərdiləşdirilə bilən mesaj forması. + No comment provided by engineer. + + + Customize theme + Üslubu fərdiləşdirin + No comment provided by engineer. + + + Dark + Qaranlıq + No comment provided by engineer. + + + Dark mode colors + Qaranlıq rejim rəngləri + No comment provided by engineer. + + + Database ID + Verilənlər bazası identifikatoru + No comment provided by engineer. + + + Database ID: %d + Verilənlər bazası ID: %d + copied message info + + + Database IDs and Transport isolation option. + Verilənlər bazası identifikatorları və nəqliyyat səviyyəsində təcrid seçimi. + No comment provided by engineer. + + + Database downgrade + Verilənlər bazasının aşağı səviyyəsi + No comment provided by engineer. + + + Database encrypted! + Verilənlər bazası şifrələndi! + No comment provided by engineer. + + + Database encryption passphrase will be updated and stored in the keychain. + + Verilənlər bazasının şifrələnməsi üçün istifadə olunan parol yenilənəcək və açar dəstində (keychain) saxlanılacaq. + + No comment provided by engineer. + + + Database encryption passphrase will be updated. + + Verilənlər bazasının şifrələnməsi üçün istifadə olunan parol ifadəsi yenilənəcək. + + No comment provided by engineer. + + + Database error + Verilənlər bazası xətası + No comment provided by engineer. + + + Database is encrypted using a random passphrase, you can change it. + Verilənlər bazası təsadüfi bir parol ifadəsi ilə şifrələnib; onu dəyişə bilərsiniz. + No comment provided by engineer. + + + Database is encrypted using a random passphrase. Please change it before exporting. + Verilənlər bazası təsadüfi bir parol ifadəsi ilə şifrələnib. Zəhmət olmasa, onu ixrac etməzdən əvvəl dəyişdirin. + No comment provided by engineer. + + + Database passphrase + Verilənlər bazasının parolu + No comment provided by engineer. + + + Database passphrase & export + Verilənlər bazasının parolu və ixracı + No comment provided by engineer. + + + Database passphrase is different from saved in the keychain. + Verilənlər bazasının parolu "Keychain" saxlanılandan fərqlidir. + No comment provided by engineer. + + + Database passphrase is required to open chat. + Çatı açmaq üçün verilənlər bazasının parolu tələb olunur. + No comment provided by engineer. + + + Database upgrade + Verilənlər bazasının təkmilləşdirilməsi + No comment provided by engineer. + + + Database will be encrypted and the passphrase stored in the keychain. + + Verilənlər bazası şifrələnəcək və parol açar dəstində (keychain) saxlanılacaq. + + No comment provided by engineer. + + + Database will be encrypted. + + Verilənlər bazası şifrələnəcək. + + No comment provided by engineer. + + + Database will be migrated when the app restarts + Tətbiq yenidən başladıldıqda verilənlər bazası miqrasiya olunacaq. + No comment provided by engineer. + + + Debug delivery + Çatdırılmanın sazlanması + No comment provided by engineer. + + + Decode link + Linki deşifrə et + relay test step + + + Decryption error + Şifrənin açılması xətası + message decrypt error item + + + Delete + Sil + alert action +swipe action + + + Delete %lld messages of members? + Üzvlərin %lld mesajını silmək? + No comment provided by engineer. + + + Delete %lld messages? + %lld mesaj silinsin? + No comment provided by engineer. + + + Delete address + Ünvanı sil + No comment provided by engineer. + + + Delete address? + Ünvan silinsin? + No comment provided by engineer. + + + Delete after + Sonradan sil + No comment provided by engineer. + + + Delete all files + Bütün faylları silin + No comment provided by engineer. + + + Delete and notify contact + Kontaktı sil və ona bildiriş göndər + No comment provided by engineer. + + + Delete channel + Kanalı sil + No comment provided by engineer. + + + Delete channel? + Kanalı sil? + No comment provided by engineer. + + + Delete chat + Çatı sil + No comment provided by engineer. + + + Delete chat messages from your device. + Cihazınızdan söhbət mesajlarını silin. + No comment provided by engineer. + + + Delete chat profile + Çat profilini sil + No comment provided by engineer. + + + Delete chat profile? + Çat profilini sil? + No comment provided by engineer. + + + Delete chat with member? + İştirakçı ilə söhbəti sil? + alert title + + + Delete chat? + Çatı sil? + No comment provided by engineer. + + + Delete connection + Əlaqəni sil + No comment provided by engineer. + + + Delete contact + Kontaktı sil + No comment provided by engineer. + + + Delete contact? + Kontaktı sil? + No comment provided by engineer. + + + Delete database + Verilənlər bazasını silin + No comment provided by engineer. + + + Delete database from this device + Verilənlər bazasını bu cihazdan silin + No comment provided by engineer. + + + Delete file + Faylı sil + server test step + + + Delete files and media? + Faylları və media fayllarını sil? + No comment provided by engineer. + + + Delete files for all chat profiles + Bütün söhbət profilləri üçün faylları silin + No comment provided by engineer. + + + Delete for everyone + Hamı üçün sil + chat feature + + + Delete for me + Mənim üçün sil + No comment provided by engineer. + + + Delete from history + Tarixçədən sil + No comment provided by engineer. + + + Delete group + Qrupu sil + No comment provided by engineer. + + + Delete group? + Qrupu sil? + No comment provided by engineer. + + + Delete invitation + Dəvəti sil + No comment provided by engineer. + + + Delete link + Linki sil + No comment provided by engineer. + + + Delete link? + Linki sil? + No comment provided by engineer. + + + Delete list? + Siyahını sil? + alert title + + + Delete member message? + Üzvün mesajını sil? + No comment provided by engineer. + + + Delete member messages + Üzv mesajlarını silin + No comment provided by engineer. + + + Delete member messages? + Üzv mesajları silinsin? + alert title + + + Delete message? + Mesaj silinsin? + No comment provided by engineer. + + + Delete messages + Mesajları sil + alert action +alert button + + + Delete messages after + Mesajları ... sonra sil + No comment provided by engineer. + + + Delete old database + Köhnə verilənlər bazasını silin + No comment provided by engineer. + + + Delete old database? + Köhnə verilənlər bazası silinsinmi? + No comment provided by engineer. + + + Delete or moderate up to 200 messages. + 200 dənə mesajı silin və ya moderasiya edin. + No comment provided by engineer. + + + Delete pending connection? + Gözləmədə olan əlaqə silinsin? + No comment provided by engineer. + + + Delete profile + Profili sil + No comment provided by engineer. + + + Delete queue + Növbəni sil + server test step + + + Delete relay + Ötürücü sil + No comment provided by engineer. + + + Delete report + Hesabatı sil + No comment provided by engineer. + + + Delete up to 20 messages at once. + Eyni anda 20 qədər mesajı silin. + No comment provided by engineer. + + + Delete user profile? + İstifadəçi profilini sil? + No comment provided by engineer. + + + Delete without notification + Bildiriş olmadan silin + No comment provided by engineer. + + + Deleted + Silinib + No comment provided by engineer. + + + Deleted at + Silinmə vaxtı: + No comment provided by engineer. + + + Deleted at: %@ + Silinmə vaxtı: %@ + copied message info + + + Deletion errors + Silinmə səhvləri + No comment provided by engineer. + + + Delivered even when Apple drops them. + Hətta Apple onlardan imtina etdiyi halda belə təqdim olunur. + No comment provided by engineer. + + + Delivery + Çatdırılma + No comment provided by engineer. + + + Delivery receipts are disabled! + Çatdırılma bildirişləri deaktiv edilib! + No comment provided by engineer. + + + Delivery receipts! + Çatdırılma bildirişləri! + No comment provided by engineer. + + + Deprecated options + Köhnəlmiş seçimlər + No comment provided by engineer. + + + Description + Təsvir + No comment provided by engineer. + + + Description too large + Təsvir çox böyükdür + alert title + + + Desktop address + Masaüstü ünvanı + No comment provided by engineer. + + + Desktop app version %@ is not compatible with this app. + Masaüstü tətbiqinin %@ versiyası bu tətbiqlə uyğun deyil. + No comment provided by engineer. + + + Desktop devices + Masaüstü cihazlar + No comment provided by engineer. + + + Destination server address of %1$@ is incompatible with forwarding server %2$@ settings. + %1$@ ünvanının təyinat serveri %2$@ yönləndirmə serverinin parametrləri ilə uyğun deyil. + No comment provided by engineer. + + + Destination server error: %@ + Təyinat serveri xətası: %@ + snd error text + + + Destination server version of %1$@ is incompatible with forwarding server %2$@. + %1$@ təyinat serverinin versiyası %2$@ yönləndirmə serveri ilə uyğun deyil. + No comment provided by engineer. + + + Detailed statistics + Ətraflı statistika + No comment provided by engineer. + + + Details + Təfərrüatlar + No comment provided by engineer. + + + Developer + Proqramçı + No comment provided by engineer. + + + Developer options + Tərtibatçı seçimləri + No comment provided by engineer. + + + Device + Cihaz + No comment provided by engineer. + + + Device authentication is disabled. Turning off SimpleX Lock. + Cihazın autentifikasiyası deaktiv edilib. SimpleX Lock söndürülür. + No comment provided by engineer. + + + Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication. + Cihazın autentifikasiyası aktivləşdirilməyib. Cihazın autentifikasiyasını aktivləşdirdikdən sonra "Ayarlar" vasitəsilə "SimpleX Lock" funksiyasını işə sala bilərsiniz. + No comment provided by engineer. + + + Different names, avatars and transport isolation. + Müxtəlif adlar, avatarlar və nəqliyyat təcridi. + No comment provided by engineer. + + + Direct messages + Birbaşa mesajlar + chat feature + + + Direct messages between members are prohibited in this chat. + Bu çatda üzvlər arasında birbaşa mesajlaşma qadağandır. + No comment provided by engineer. + + + Direct messages between members are prohibited. + Üzvlər arasında birbaşa mesajlaşma qadağandır. + No comment provided by engineer. + + + Direct messages between subscribers are prohibited. + Abunəçilər arasında birbaşa mesajlaşma qadağandır. + No comment provided by engineer. + + + Disable + Deaktiv et + alert button + + + Disable (keep overrides) + Deaktiv et (dəyişiklikləri saxla) + No comment provided by engineer. + + + Disable SimpleX Lock + SimpleX kilidini deaktiv edin + authentication reason + + + Disable automatic message deletion? + Mesajların avtomatik silinməsini deaktiv et? + alert title + + + Disable delete messages + Mesajların silinməsini deaktiv edin + alert button + + + Disable for all + Hamısı üçün deaktiv et + No comment provided by engineer. + + + Disabled + Deaktifdir + No comment provided by engineer. + + + Disappearing message + Yoxa çıxan mesaj + No comment provided by engineer. + + + Disappearing messages + Yoxa çıxan mesajlar + chat feature + + + Disappearing messages are prohibited in this chat. + Bu çatda yoxa çıxan mesajlara icazə verilmir. + No comment provided by engineer. + + + Disappearing messages are prohibited. + Yoxa çıxan mesajlar qadağandır. + No comment provided by engineer. + + + Disappears at + Yoxa çıxma vaxtı + No comment provided by engineer. + + + Disappears at: %@ + Yox olur: %@ + copied message info + + + Disconnect + Əlaqəni kəs + server test step + + + Disconnect desktop? + İş masası ayrılsın? + No comment provided by engineer. + + + Discover and join groups + Qrupları kəşf edin və onlara qoşulun + No comment provided by engineer. + + + Discover via local network + Yerli şəbəkə vasitəsilə aşkar edin + No comment provided by engineer. + + + Do NOT send messages directly, even if your or destination server does not support private routing. + Hətta sizin və ya təyinat serveriniz şəxsi marşrutlaşdırmanı dəstəkləməsə belə, mesajları birbaşa GÖNDƏRMƏYİN. + No comment provided by engineer. + + + Do NOT use SimpleX for emergency calls. + No comment provided by engineer. + + + Do NOT use private routing. + Şəxsi marşrutlaşdırmadan istifadə etməyin. + No comment provided by engineer. + + + Do it later + Daha sonra edin + No comment provided by engineer. + + + Do not require signing messages. + Mesajları imzalamağı tələb etməyin. + No comment provided by engineer. + + + Do not send history to new members. + Tarixçəni yeni üzvlərə göndərməyin. + No comment provided by engineer. + + + Do not send history to new subscribers. + Yeni abunəçilərə tarixçə göndərməyin. + No comment provided by engineer. + + + Do not use credentials with proxy. + Etimadnamələri proxy ilə istifadə etməyin. + No comment provided by engineer. + + + Documents: + Sənədlər: + No comment provided by engineer. + + + Don't create address + Ünvan yaratmayın + No comment provided by engineer. + + + Don't enable + Aktivləşdirməyin + No comment provided by engineer. + + + Don't miss important messages. + Vacib mesajları qaçırmayın. + No comment provided by engineer. + + + Don't save + Yadda saxlamayın + alert action + + + Don't show again + Bir daha göstərməyin + alert action + + + Done + Hazırdır + No comment provided by engineer. + + + Downgrade and open chat + Siyahını aşağı salın və söhbəti açın + No comment provided by engineer. + + + Download + Yükləyin + alert button +chat item action + + + Download errors + Yükləmə xətaları + No comment provided by engineer. + + + Download failed + Yükləmə uğursuz oldu + No comment provided by engineer. + + + Download file + Faylı yükləyin + server test step + + + Download files + Faylları yükləyin + alert action + + + Downloaded + Yüklənib + No comment provided by engineer. + + + Downloaded files + Yüklənmiş fayllar + No comment provided by engineer. + + + Downloading archive + Arxiv yüklənir + No comment provided by engineer. + + + Downloading link details + Yükləmə linki detalları + No comment provided by engineer. + + + Duplicate display name! + Dublikat ekran adı! + No comment provided by engineer. + + + Duration + Müddət + No comment provided by engineer. + + + E2E encrypted notifications. + E2E şifrələnmiş bildirişlər. + No comment provided by engineer. + + + Easier to invite your friends 👋 + Dostlarınızı dəvət etmək daha asandır 👋 + No comment provided by engineer. + + + Easier to read. + Oxumaq daha asandır. + No comment provided by engineer. + + + Edit + Redaktə edin + chat item action + + + Edit channel profile + Kanal profilini redaktə edin + No comment provided by engineer. + + + Edit description + Təsviri redaktə edin + No comment provided by engineer. + + + Edit group profile + Qrup profilini redaktə edin + No comment provided by engineer. + + + Empty message! + Boş mesaj! + No comment provided by engineer. + + + Enable + Aktivləşdirin + alert button + + + Enable (keep overrides) + Aktivləşdirin (əvəzləmələri saxlayın) + No comment provided by engineer. + + + Enable Flux in Network & servers settings for better metadata privacy. + Daha yaxşı metaməlumat məxfiliyi üçün Şəbəkə və server parametrlərində Flux aktivləşdirin. + No comment provided by engineer. + + + Enable SimpleX Lock + SimpleX Lock-u aktivləşdirin + authentication reason + + + Enable TCP keep-alive + TCP aktiv qalmasını aktivləşdirin + No comment provided by engineer. + + + Enable at least one chat relay in Network & Servers. + Şəbəkə və Serverlər bölməsində ən azı bir söhbət ötürməsini aktivləşdirin. + channel creation warning + + + Enable automatic message deletion? + Avtomatik mesaj silinməsi aktivləşdirilsin? + alert title + + + Enable camera access + Kamera girişini aktivləşdirin + No comment provided by engineer. + + + Enable chats with admins? + Adminlərlə söhbətlər aktivləşdirilsin? + alert title + + + Enable disappearing messages by default. + Varsayılan olaraq, mesajların yoxa çıxmasını aktivləşdirin. + No comment provided by engineer. + + + Enable for all + Hamı üçün aktivləşdirin + No comment provided by engineer. + + + Enable in direct chats (BETA)! + Birbaşa söhbətlərdə aktivləşdirin (BETA)! + No comment provided by engineer. + + + Enable instant notifications? + Ani bildirişlər aktivləşdirilsin? + No comment provided by engineer. + + + Enable link previews? + Link önizləmələri aktivləşdirilsin? + alert title + + + Enable lock + Kilidi aktivləşdirin + No comment provided by engineer. + + + Enable periodic notifications? + Dövri bildirişlər aktivləşdirilsin? + No comment provided by engineer. + + + Enable self-destruct + Özünü məhv etməyi aktivləşdirin + No comment provided by engineer. + + + Enable self-destruct passcode + Özünüməhvetmə parolunu aktivləşdirin + set passcode view + + + Enabled + Aktivləşdirilib + No comment provided by engineer. + + + Enabled for + Aktivləşdirilib + No comment provided by engineer. + + + Encrypt + Şifrələyin + No comment provided by engineer. + + + Encrypt database? + Verilənlər bazasını şifrələyin? + No comment provided by engineer. + + + Encrypt local files + Yerli faylları şifrələyin + No comment provided by engineer. + + + Encrypt stored files & media + Saxlanılan faylları və medianı şifrələyin + No comment provided by engineer. + + + Encrypted database + Şifrələnmiş verilənlər bazası + No comment provided by engineer. + + + Encrypted message or another event + Şifrələnmiş mesaj və ya başqa bir hadisə + notification + + + Encrypted message: app is stopped + Şifrələnmiş mesaj: tətbiq dayandırılıb + notification + + + Encrypted message: database error + Şifrələnmiş mesaj: verilənlər bazası xətası + notification + + + Encrypted message: database migration error + Şifrələnmiş mesaj: verilənlər bazasının köçürülməsi xətası + notification + + + Encrypted message: keychain error + Şifrələnmiş mesaj: açar zəncir xətası + notification + + + Encrypted message: no passphrase + Şifrələnmiş mesaj: parol yoxdur + notification + + + Encrypted message: unexpected error + Şifrələnmiş mesaj: gözlənilməz xəta + notification + + + Encryption re-negotiation error + Şifrələmənin yenidən danışıqları xətası + message decrypt error item + + + Encryption re-negotiation failed. + Şifrələmənin yenidən müzakirəsi uğursuz oldu. + No comment provided by engineer. + + + Encryption renegotiation in progress. + Şifrələmənin yenidən müzakirəsi davam edir. + No comment provided by engineer. + + + Enter Passcode + Şifrəni daxil edin + No comment provided by engineer. + + + Enter channel name… + Kanal adını daxil edin… + No comment provided by engineer. + + + Enter correct passphrase. + Düzgün parol daxil edin. + No comment provided by engineer. + + + Enter description (optional) + Təsvir daxil edin (isteğe bağlı) + placeholder + + + Enter group name… + Qrup adını daxil edin… + No comment provided by engineer. + + + Enter passphrase + Şifrəni daxil edin + No comment provided by engineer. + + + Enter passphrase… + Şifrəni daxil edin… + No comment provided by engineer. + + + Enter password above to show! + Göstərmək üçün yuxarıdakı parolu daxil edin! + No comment provided by engineer. + + + Enter profile name... + Profil adını daxil edin... + No comment provided by engineer. + + + Enter relay name… + Ötürücü adını daxil edin… + No comment provided by engineer. + + + Enter server manually + Serveri əl ilə daxil edin + No comment provided by engineer. + + + Enter this device name… + Bu cihazın adını daxil edin… + No comment provided by engineer. + + + Enter webpage URL + Veb səhifə URL daxil edin + No comment provided by engineer. + + + Enter welcome message… + Xoş gəldin mesajını daxil edin… + placeholder + + + Enter welcome message… (optional) + Xoş gəldin mesajını daxil edin... (isteğe bağlı) + placeholder + + + Enter your name… + Adınızı daxil edin… + No comment provided by engineer. + + + Error + Xəta + No comment provided by engineer. + + + Error aborting address change + Ünvan dəyişikliyini ləğv edərkən xəta + No comment provided by engineer. + + + Error accepting conditions + Şərtləri qəbul edərkən xəta baş verdi + alert title + + + Error accepting contact request + Əlaqə sorğusunu qəbul edərkən xəta baş verdi + No comment provided by engineer. + + + Error accepting member + Üzv qəbul edərkən xəta baş verdi + alert title + + + Error adding member(s) + Üzv(lər) əlavə etmə xətası + No comment provided by engineer. + + + Error adding relay + Ötürücü əlavə etmə xətası + alert title + + + Error adding relays + Ötürücü əlavə edərkən xəta baş verdi + alert title + + + Error adding server + Server əlavə etmə xətası + alert title + + + Error adding short link + Qısa link əlavə etmə xətası + No comment provided by engineer. + + + Error changing address + Ünvanı dəyişdirərkən xəta baş verdi + No comment provided by engineer. + + + Error changing chat profile + Çat profilini dəyişdirərkən xəta baş verdi + alert title + + + Error changing connection profile + Bağlantı profilini dəyişdirərkən xəta baş verdi + No comment provided by engineer. + + + Error changing role + Rolu dəyişdirərkən xəta baş verdi + No comment provided by engineer. + + + Error changing setting + Ayarı dəyişdirərkən xəta baş verdi + alert title + + + Error changing to incognito! + İnkoqnito rejiminə keçməkdə xəta baş verdi! + No comment provided by engineer. + + + Error checking token status + Token statusunu yoxlamaqda xəta + No comment provided by engineer. + + + Error connecting to forwarding server %@. Please try later. + %@ yönləndirmə serverinə qoşulma xətası. Zəhmət olmasa, daha sonra cəhd edin. + alert message + + + Error connecting to the server used to receive messages from this connection: %@ + Bu bağlantıdan mesaj almaq üçün istifadə edilən serverə qoşulma xətası: %@ + subscription status explanation + + + Error creating address + Ünvan yaratmaqda xəta + No comment provided by engineer. + + + Error creating channel + Kanal yaratmaqda xəta + alert title + + + Error creating group + Qrup yaratmaqda xəta + No comment provided by engineer. + + + Error creating group link + Qrup linki yaradılarkən xəta baş verdi + No comment provided by engineer. + + + Error creating list + Siyahı yaratmaqda xəta + alert title + + + Error creating member contact + Üzv əlaqəsi yaratmaqda xəta + No comment provided by engineer. + + + Error creating message + Mesaj yaratmaqda xəta + No comment provided by engineer. + + + Error creating profile! + Profil yaratmaqda xəta! + No comment provided by engineer. + + + Error creating report + Hesabat yaratmaqda xəta + No comment provided by engineer. + + + Error decrypting file + Faylın şifrəsini açmaqda xəta + No comment provided by engineer. + + + Error deleting chat + Söhbəti silməkdə xəta baş verdi + alert title + + + Error deleting chat database + Çat verilənlər bazasını silməkdə xəta baş verdi + alert title + + + Error deleting chat! + Söhbəti silməkdə xəta baş verdi! + alert title + + + Error deleting connection + Bağlantı silinmə xətası + No comment provided by engineer. + + + Error deleting database + Verilənlər bazasını silməkdə xəta + alert title + + + Error deleting message + Mesajı silməkdə xəta baş verdi + alert title + + + Error deleting old database + Köhnə verilənlər bazasını silməkdə xəta + alert title + + + Error deleting token + Tokeni silməkdə xəta baş verdi + No comment provided by engineer. + + + Error deleting user profile + İstifadəçi profilini silməkdə xəta baş verdi + No comment provided by engineer. + + + Error downloading the archive + Arxivi yükləməkdə xəta + No comment provided by engineer. + + + Error enabling delivery receipts! + Çatdırılma qəbzlərini aktivləşdirmədə xəta baş verdi! + No comment provided by engineer. + + + Error enabling notifications + Bildirişləri aktivləşdirmə xətası + No comment provided by engineer. + + + Error encrypting database + No comment provided by engineer. + + + Error exporting chat database + alert title + + + Error exporting theme: %@ + No comment provided by engineer. + + + Error importing chat database + alert title + + + Error joining group + No comment provided by engineer. + + + Error loading servers + alert title + + + Error migrating settings + No comment provided by engineer. + + + Error opening chat + No comment provided by engineer. + + + Error receiving file + alert title + + + Error reconnecting server + No comment provided by engineer. + + + Error reconnecting servers + No comment provided by engineer. + + + Error registering for notifications + alert title + + + Error rejecting contact request + alert title + + + Error removing member + alert title + + + Error reordering lists + alert title + + + Error resetting statistics + No comment provided by engineer. + + + Error saving ICE servers + No comment provided by engineer. + + + Error saving channel profile + No comment provided by engineer. + + + Error saving chat list + alert title + + + Error saving group profile + No comment provided by engineer. + + + Error saving name + alert title + + + Error saving passcode + No comment provided by engineer. + + + Error saving passphrase to keychain + No comment provided by engineer. + + + Error saving servers + alert title + + + Error saving settings + when migrating + + + Error saving user password + No comment provided by engineer. + + + Error scanning code: %@ + No comment provided by engineer. + + + Error sending email + No comment provided by engineer. + + + Error sending member contact invitation + No comment provided by engineer. + + + Error sending message + No comment provided by engineer. + + + Error setting auto-accept + No comment provided by engineer. + + + Error setting delivery receipts! + No comment provided by engineer. + + + Error sharing address + alert title + + + Error sharing channel + alert title + + + Error starting chat + No comment provided by engineer. + + + Error stopping chat + No comment provided by engineer. + + + Error switching profile + alert title + + + Error switching profile! + alertTitle + + + Error synchronizing connection + No comment provided by engineer. + + + Error testing server connection + No comment provided by engineer. + + + Error updating group link + No comment provided by engineer. + + + Error updating message + No comment provided by engineer. + + + Error updating server + alert title + + + Error updating settings + 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: + No comment provided by engineer. + + + Error: %@ + alert message +conn error description +file error text +snd error text + + + Error: %@. + relay test error +server test error + + + Error: URL is invalid + No comment provided by engineer. + + + Error: no database file + No comment provided by engineer. + + + Errors + No comment provided by engineer. + + + Errors in servers configuration. + servers error + + + Even when disabled in the conversation. + No comment provided by engineer. + + + Exit without saving + No comment provided by engineer. + + + Expand + chat item action + + + Expired + token status text + + + Export database + No comment provided by engineer. + + + Export error: + No comment provided by engineer. + + + Export theme + 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… + No comment provided by engineer. + + + Failed to remove passphrase + No comment provided by engineer. + + + Fast and no wait until the sender is online! + No comment provided by engineer. + + + Faster deletion of groups. + No comment provided by engineer. + + + Faster joining and more reliable messages. + No comment provided by engineer. + + + Faster sending messages. + No comment provided by engineer. + + + Favorite + swipe action + + + Favorites + No comment provided by engineer. + + + File error + file error alert title + + + File errors: +%@ + alert message + + + File is blocked by server operator: +%@. + file error text + + + File not found - most likely file was deleted or cancelled. + file error text + + + File server error: %@ + file error text + + + File servers + No comment provided by engineer. + + + File servers: %@ + copied message info + + + File status + No comment provided by engineer. + + + File status: %@ + copied message info + + + File will be deleted from servers. + No comment provided by engineer. + + + File will be received when your contact completes uploading it. + No comment provided by engineer. + + + File will be received when your contact is online, please wait or check later! + No comment provided by engineer. + + + File: %@ + No comment provided by engineer. + + + Files + No comment provided by engineer. + + + Files & media + No comment provided by engineer. + + + Files and media + chat feature + + + Files and media are prohibited in this chat. + No comment provided by engineer. + + + Files and media are prohibited. + No comment provided by engineer. + + + Files and media not allowed + No comment provided by engineer. + + + Files and media prohibited! + No comment provided by engineer. + + + Filter + 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! 🚀 + No comment provided by engineer. + + + Find chats faster + No comment provided by engineer. + + + Fingerprint in destination server address does not match certificate: %@. + No comment provided by engineer. + + + Fingerprint in forwarding server address does not match certificate: %@. + No comment provided by engineer. + + + Fingerprint in server address does not match certificate. + relay test error +server test error + + + Fingerprint in server address does not match certificate: %@. + No comment provided by engineer. + + + Fix + No comment provided by engineer. + + + Fix connection + No comment provided by engineer. + + + Fix connection? + No comment provided by engineer. + + + Fix encryption after restoring backups. + No comment provided by engineer. + + + Fix not supported by contact + No comment provided by engineer. + + + Fix not supported by group member + No comment provided by engineer. + + + For all moderators + No comment provided by engineer. + + + For anyone to reach you + No comment provided by engineer. + + + For chat profile %@: + servers error +servers warning + + + For console + No comment provided by engineer. + + + For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server. + No comment provided by engineer. + + + For me + No comment provided by engineer. + + + For private routing + No comment provided by engineer. + + + For social media + No comment provided by engineer. + + + Forward + chat item action + + + Forward %d message(s)? + alert title + + + Forward and save messages + No comment provided by engineer. + + + Forward messages + alert action + + + Forward messages without files? + alert message + + + Forward up to 20 messages at once. + No comment provided by engineer. + + + Forwarded + No comment provided by engineer. + + + Forwarded from + No comment provided by engineer. + + + Forwarding %lld messages + No comment provided by engineer. + + + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. + alert message + + + Forwarding server address is incompatible with network settings: %@. + No comment provided by engineer. + + + Forwarding server version is incompatible with network settings: %@. + No comment provided by engineer. + + + Forwarding server: %1$@ +Destination server error: %2$@ + snd error text + + + Forwarding server: %1$@ +Error: %2$@ + snd error text + + + Found desktop + No comment provided by engineer. + + + French interface + No comment provided by engineer. + + + Full link + No comment provided by engineer. + + + Full name (optional) + No comment provided by engineer. + + + Fully decentralized – visible only to members. + No comment provided by engineer. + + + Fully re-implemented - work in background! + No comment provided by engineer. + + + Further reduced battery usage + No comment provided by engineer. + + + GIFs and stickers + No comment provided by engineer. + + + Get SimpleX name (BETA) + No comment provided by engineer. + + + Get link + relay test step + + + Get notified when mentioned. + No comment provided by engineer. + + + Get started + No comment provided by engineer. + + + Good afternoon! + message preview + + + Good morning! + message preview + + + Group + No comment provided by engineer. + + + Group already exists + No comment provided by engineer. + + + Group already exists! + new chat sheet title + + + Group display name + No comment provided by engineer. + + + Group full name (optional) + No comment provided by engineer. + + + Group image + No comment provided by engineer. + + + Group invitation + No comment provided by engineer. + + + Group invitation expired + No comment provided by engineer. + + + Group invitation is no longer valid, it was removed by sender. + No comment provided by engineer. + + + Group invitations + No comment provided by engineer. + + + Group link + chat link info line + + + Group links + No comment provided by engineer. + + + Group message: + notification + + + Group moderation + No comment provided by engineer. + + + Group preferences + No comment provided by engineer. + + + Group profile + No comment provided by engineer. + + + Group profile is stored on members' devices, not on the servers. + No comment provided by engineer. + + + Group profile was changed. If you save it, the updated profile will be sent to group members. + alert message + + + Group webpage + No comment provided by engineer. + + + Group welcome message + No comment provided by engineer. + + + Group will be deleted for all members - this cannot be undone! + No comment provided by engineer. + + + Group will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Groups + No comment provided by engineer. + + + Help + No comment provided by engineer. + + + Help & support + No comment provided by engineer. + + + Help admins moderating their groups. + No comment provided by engineer. + + + Hidden + No comment provided by engineer. + + + Hidden chat profiles + No comment provided by engineer. + + + Hidden profile password + No comment provided by engineer. + + + Hide + chat item action + + + Hide app screen in the recent apps. + No comment provided by engineer. + + + Hide profile + No comment provided by engineer. + + + Hide: + No comment provided by engineer. + + + History + No comment provided by engineer. + + + History is not sent to new members. + No comment provided by engineer. + + + History is not sent to new subscribers. + No comment provided by engineer. + + + How SimpleX works + No comment provided by engineer. + + + How it affects privacy + No comment provided by engineer. + + + How it helps privacy + No comment provided by engineer. + + + How it works + alert button + + + How to + No comment provided by engineer. + + + How to register a test name + No comment provided by engineer. + + + How to use it + 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) + No comment provided by engineer. + + + IP address + No comment provided by engineer. + + + If you can't meet in person, show QR code in a video call, or share the link. + No comment provided by engineer. + + + If you enter this passcode when opening the app, all app data will be irreversibly removed! + No comment provided by engineer. + + + If you enter your self-destruct passcode while opening the app: + No comment provided by engineer. + + + If you joined or created channels, they will stop working permanently. + down migration warning + + + If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app). + No comment provided by engineer. + + + Ignore + No comment provided by engineer. + + + Image will be received when your contact completes uploading it. + No comment provided by engineer. + + + Image will be received when your contact is online, please wait or check later! + No comment provided by engineer. + + + Images + No comment provided by engineer. + + + Immediately + No comment provided by engineer. + + + Import + No comment provided by engineer. + + + Import chat database? + No comment provided by engineer. + + + Import database + No comment provided by engineer. + + + Import failed + No comment provided by engineer. + + + Import theme + No comment provided by engineer. + + + Importing archive + No comment provided by engineer. + + + Improved delivery, reduced traffic usage. +More improvements are coming soon! + No comment provided by engineer. + + + Improved message delivery + No comment provided by engineer. + + + Improved privacy and security + 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 + No comment provided by engineer. + + + In-call sounds + No comment provided by engineer. + + + Inappropriate content + report reason + + + Inappropriate profile + report reason + + + Incognito + No comment provided by engineer. + + + Incognito groups + No comment provided by engineer. + + + Incognito mode + No comment provided by engineer. + + + Incognito mode protects your privacy by using a new random profile for each contact. + No comment provided by engineer. + + + Incoming audio call + notification + + + Incoming call + notification + + + Incoming video call + notification + + + Incompatible database version + No comment provided by engineer. + + + Incompatible version + No comment provided by engineer. + + + Incorrect passcode + PIN entry + + + Incorrect security code! + No comment provided by engineer. + + + Info + chat item action + + + Initial role + No comment provided by engineer. + + + Install SimpleX Chat for terminal + No comment provided by engineer. + + + Instant + No comment provided by engineer. + + + Instant push notifications will be hidden! + + No comment provided by engineer. + + + Interface + No comment provided by engineer. + + + Interface colors + No comment provided by engineer. + + + Invalid + token status text + + + Invalid (bad token) + token status text + + + Invalid (expired) + token status text + + + Invalid (unregistered) + token status text + + + Invalid (wrong topic) + token status text + + + Invalid QR code + No comment provided by engineer. + + + Invalid connection link + conn error description + + + Invalid display name! + No comment provided by engineer. + + + Invalid link + alert title + + + Invalid migration confirmation + No comment provided by engineer. + + + Invalid name! + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title + + + Invalid response + No comment provided by engineer. + + + Invalid server address! + alert title + + + Invalid status + item status text + + + Invitation expired! + No comment provided by engineer. + + + Invite friends + No comment provided by engineer. + + + Invite member + No comment provided by engineer. + + + Invite members + No comment provided by engineer. + + + Invite someone privately + No comment provided by engineer. + + + Invite to chat + No comment provided by engineer. + + + Invite to group + No comment provided by engineer. + + + Irreversible message deletion + No comment provided by engineer. + + + Irreversible message deletion is prohibited in this chat. + No comment provided by engineer. + + + Irreversible message deletion is prohibited. + No comment provided by engineer. + + + It allows having many anonymous connections without any shared data between them in a single chat profile. + No comment provided by engineer. + + + It can happen when you or your connection used the old database backup. + No comment provided by engineer. + + + It can happen when: +1. The messages expired in the sending client after 2 days or on the server after 30 days. +2. Message decryption failed, because you or your contact used old database backup. +3. The connection was compromised. + No comment provided by engineer. + + + It protects your IP address and connections. + No comment provided by engineer. + + + It seems like you are already connected via this link. If it is not the case, there was an error (%@). + No comment provided by engineer. + + + It will be shown to subscribers and used to allow loading the preview. + No comment provided by engineer. + + + Italian interface + No comment provided by engineer. + + + Japanese interface + No comment provided by engineer. + + + Join + swipe action + + + Join as %@ + No comment provided by engineer. + + + Join channel + No comment provided by engineer. + + + Join channel %@ + new chat action + + + Join group + new chat sheet title + + + Join group conversations + No comment provided by engineer. + + + Join incognito + No comment provided by engineer. + + + Join your group? +This is your link for group %@! + new chat action + + + Joining group + No comment provided by engineer. + + + Keep + alert action + + + Keep conversation + No comment provided by engineer. + + + Keep the app open to use it from desktop + No comment provided by engineer. + + + Keep unused invitation? + alert title + + + Keep your chats clean + No comment provided by engineer. + + + Keep your connections + No comment provided by engineer. + + + KeyChain error + No comment provided by engineer. + + + Keychain error + No comment provided by engineer. + + + LIVE + No comment provided by engineer. + + + Large file! + No comment provided by engineer. + + + Learn more + badge alert button + + + Leave + swipe action + + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + + + Leave chat + No comment provided by engineer. + + + Leave chat? + No comment provided by engineer. + + + Leave group + No comment provided by engineer. + + + Leave group? + No comment provided by engineer. + + + Less traffic on mobile networks. + No comment provided by engineer. + + + Let people connect to you via name registered with your SimpleX address. + No comment provided by engineer. + + + Let people join via name registered with this channel link. + No comment provided by engineer. + + + Let someone connect to you + No comment provided by engineer. + + + Let's talk in SimpleX Chat + email subject + + + Light + No comment provided by engineer. + + + Limitations + No comment provided by engineer. + + + Link mobile and desktop apps! 🔗 + No comment provided by engineer. + + + Link signature verified. + owner verification + + + Linked desktop options + No comment provided by engineer. + + + Linked desktops + No comment provided by engineer. + + + Links + No comment provided by engineer. + + + List + swipe action + + + List name and emoji should be different for all lists. + No comment provided by engineer. + + + List name... + No comment provided by engineer. + + + Live message! + No comment provided by engineer. + + + Live messages + No comment provided by engineer. + + + Loading profile… + in progress text + + + Local name + No comment provided by engineer. + + + Local profile data only + No comment provided by engineer. + + + Lock after + No comment provided by engineer. + + + Lock mode + No comment provided by engineer. + + + Make one message disappear + No comment provided by engineer. + + + Make profile private! + No comment provided by engineer. + + + Make sure WebRTC ICE server addresses are in correct format, line separated and are not duplicated. + No comment provided by engineer. + + + Manage your relays. + No comment provided by engineer. + + + Mark deleted for everyone + No comment provided by engineer. + + + Mark read + No comment provided by engineer. + + + Mark verified + No comment provided by engineer. + + + Markdown in messages + No comment provided by engineer. + + + Max 30 seconds, received instantly. + No comment provided by engineer. + + + Media & file servers + No comment provided by engineer. + + + Medium + blur media + + + Member + No comment provided by engineer. + + + Member %@ + past/unknown group member + + + Member admission + No comment provided by engineer. + + + Member inactive + item status text + + + Member is deleted - can't accept request + No comment provided by engineer. + + + Member messages will be deleted - this cannot be undone! + alert message + + + Member reports + chat feature + + + Member will be removed from chat - this cannot be undone! + alert message + + + Member will be removed from group - this cannot be undone! + alert message + + + Member will join the group, accept member? + alert message + + + Members can add message reactions. + No comment provided by engineer. + + + Members can chat with admins. + No comment provided by engineer. + + + Members can irreversibly delete sent messages. (24 hours) + No comment provided by engineer. + + + Members can report messsages to moderators. + No comment provided by engineer. + + + Members can send SimpleX links. + No comment provided by engineer. + + + Members can send direct messages. + No comment provided by engineer. + + + Members can send disappearing messages. + No comment provided by engineer. + + + Members can send files and media. + No comment provided by engineer. + + + Members can send voice messages. + No comment provided by engineer. + + + Mention members 👋 + No comment provided by engineer. + + + Menus + No comment provided by engineer. + + + Message delivery error + item status text + + + Message delivery receipts! + No comment provided by engineer. + + + Message delivery warning + item status text + + + Message draft + No comment provided by engineer. + + + Message error + No comment provided by engineer. + + + Message forwarded + item status text + + + Message instantly once you tap Connect. + No comment provided by engineer. + + + Message may be delivered later if member becomes active. + item status description + + + Message queue info + No comment provided by engineer. + + + Message reactions + chat feature + + + Message reactions are prohibited in this chat. + No comment provided by engineer. + + + Message reactions are prohibited. + No comment provided by engineer. + + + Message reception + No comment provided by engineer. + + + Message servers + No comment provided by engineer. + + + Message shape + No comment provided by engineer. + + + Message signing is not required. + No comment provided by engineer. + + + Message signing is required. + No comment provided by engineer. + + + Message source remains private. + No comment provided by engineer. + + + Message status + No comment provided by engineer. + + + Message status: %@ + copied message info + + + Message text + No comment provided by engineer. + + + Message too large + No comment provided by engineer. + + + Messages + No comment provided by engineer. + + + Messages & files + No comment provided by engineer. + + + Messages are protected by **end-to-end encryption**. + No comment provided by engineer. + + + Messages from %@ will be shown! + No comment provided by engineer. + + + Messages in this channel are **not end-to-end encrypted**. Chat relays can see these messages. + No comment provided by engineer. + + + Messages in this channel are not end-to-end encrypted. Chat relays can see these messages. + E2EE info chat item + + + Messages in this chat will never be deleted. + alert message + + + Messages received + No comment provided by engineer. + + + Messages sent + No comment provided by engineer. + + + Messages were deleted after you selected them. + alert message + + + 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. + No comment provided by engineer. + + + Migrate + No comment provided by engineer. + + + Migrate 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. + 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: + No comment provided by engineer. + + + Migration failed. Tap **Skip** below to continue using the current database. Please report the issue to the app developers via chat or email [chat@simplex.chat](mailto:chat@simplex.chat). + No comment provided by engineer. + + + Migration is completed + No comment provided by engineer. + + + Migrations: + No comment provided by engineer. + + + Moderate + chat item action + + + Moderated at + No comment provided by engineer. + + + Moderated at: %@ + copied message info + + + More + swipe action + + + More improvements are coming soon! + No comment provided by engineer. + + + More privacy + No comment provided by engineer. + + + More reliable network connection. + No comment provided by engineer. + + + More reliable notifications + No comment provided by engineer. + + + Most likely this connection is deleted. + item status description + + + Multiple chat profiles + No comment provided by engineer. + + + Mute + notification label action + + + Mute all + notification label action + + + Muted when inactive! + No comment provided by engineer. + + + Name + swipe action + + + Name not found + No comment provided by engineer. + + + Network & servers + No comment provided by engineer. + + + Network commitments + No comment provided by engineer. + + + Network connection + No comment provided by engineer. + + + Network decentralization + No comment provided by engineer. + + + Network error + conn error description + + + Network issues - message expired after many attempts to send it. + snd error text + + + Network management + No comment provided by engineer. + + + Network operator + No comment provided by engineer. + + + Network routers cannot know +who talks to whom + No comment provided by engineer. + + + Network settings + No comment provided by engineer. + + + Network status + alert title + + + New + token status text + + + New 1-time link + No comment provided by engineer. + + + New Passcode + No comment provided by engineer. + + + New SOCKS credentials will be used every time you start the app. + No comment provided by engineer. + + + New SOCKS credentials will be used for each server. + No comment provided by engineer. + + + New chat + No comment provided by engineer. + + + New chat experience 🎉 + No comment provided by engineer. + + + New chat relay + No comment provided by engineer. + + + New contact request + notification + + + New contact: + notification + + + New desktop app! + No comment provided by engineer. + + + New display name + No comment provided by engineer. + + + New events + notification + + + New group role: Moderator + No comment provided by engineer. + + + New in %@ + No comment provided by engineer. + + + New media options + No comment provided by engineer. + + + New member role + No comment provided by engineer. + + + New member wants to join the group. + rcv group event chat item + + + New message + notification + + + New passphrase… + No comment provided by engineer. + + + New server + No comment provided by engineer. + + + No + No comment provided by engineer. + + + No account. No phone. No email. No ID. +The most secure encryption. + No comment provided by engineer. + + + No active relays + No comment provided by engineer. + + + No app password + Authentication unavailable + + + No available relays + No comment provided by engineer. + + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + + + No chats + No comment provided by engineer. + + + No chats found + No comment provided by engineer. + + + No chats in list %@ + No comment provided by engineer. + + + No chats with members + No comment provided by engineer. + + + No contacts selected + No comment provided by engineer. + + + No contacts to add + No comment provided by engineer. + + + No delivery information + No comment provided by engineer. + + + No device token! + No comment provided by engineer. + + + No direct connection yet, message is forwarded by admin. + item status description + + + No filtered chats + No comment provided by engineer. + + + Group not found! + No comment provided by engineer. + + + No history + No comment provided by engineer. + + + No info, try to reload + No comment provided by engineer. + + + No media & file servers. + servers error + + + No message + No comment provided by engineer. + + + No message servers. + servers error + + + No network connection + No comment provided by engineer. + + + No permission to record speech + No comment provided by engineer. + + + No permission to record video + No comment provided by engineer. + + + No permission to record voice message + No comment provided by engineer. + + + No private routing session + alert title + + + No push server + No comment provided by engineer. + + + No received or sent files + No comment provided by engineer. + + + No relays + No comment provided by engineer. + + + No servers for private message routing. + servers error + + + No servers to receive files. + servers error + + + No servers to receive messages. + servers error + + + No servers to resolve names. + servers warning + + + No servers to send files. + servers error + + + No token! + alert title + + + No unread chats + No comment provided by engineer. + + + No valid link + No comment provided by engineer. + + + Nobody tracked your conversations. No one drew a map of where you'd been. Privacy was never a feature - it was the way of life. + No comment provided by engineer. + + + Non-profit governance + No comment provided by engineer. + + + None of your servers are set to resolve SimpleX names. Configure servers, or use a connection link. + No comment provided by engineer. + + + Not a better lock on someone else's door. Not a nicer landlord that respects your privacy, but still keeps the record of all visitors. You are not a guest. You are home. No king can enter it - you are sovereign. + No comment provided by engineer. + + + Not all relays connected + alert title + + + Not compatible! + No comment provided by engineer. + + + Notes + No comment provided by engineer. + + + Nothing selected + No comment provided by engineer. + + + Nothing to forward! + alert title + + + Notifications + No comment provided by engineer. + + + Notifications are disabled! + No comment provided by engineer. + + + Notifications error + alert title + + + Notifications privacy + No comment provided by engineer. + + + Notifications status + alert title + + + Now admins can: +- delete members' messages. +- disable members ("observer" role) + No comment provided by engineer. + + + OK + alert button + + + Off + blur media + + + Ok + alert action +alert button +new chat action + + + Old database + No comment provided by engineer. + + + On your phone, not on servers. + No comment provided by engineer. + + + One-time invitation link + No comment provided by engineer. + + + One-time link + chat link info line + + + Onion hosts will be **required** for connection. +Requires compatible VPN. + No comment provided by engineer. + + + Onion hosts will be used when available. +Requires compatible VPN. + No comment provided by engineer. + + + Onion hosts will not be used. + No comment provided by engineer. + + + Only channel owners can change channel preferences. + No comment provided by engineer. + + + Only chat owners can change preferences. + No comment provided by engineer. + + + Only client devices store user profiles, contacts, groups, and messages. + No comment provided by engineer. + + + Only delete conversation + No comment provided by engineer. + + + Only group owners can change group preferences. + No comment provided by engineer. + + + Only group owners can enable files and media. + No comment provided by engineer. + + + Only group owners can enable voice messages. + No comment provided by engineer. + + + Only sender and moderators see it + No comment provided by engineer. + + + Only you and moderators see it + No comment provided by engineer. + + + Only you can add message reactions. + No comment provided by engineer. + + + Only you can irreversibly delete messages (your contact can mark them for deletion). (24 hours) + No comment provided by engineer. + + + Only you can make calls. + No comment provided by engineer. + + + Only you can send disappearing messages. + No comment provided by engineer. + + + Only you can send files and media. + No comment provided by engineer. + + + Only you can send voice messages. + No comment provided by engineer. + + + Only your contact can add message reactions. + No comment provided by engineer. + + + Only your contact can irreversibly delete messages (you can mark them for deletion). (24 hours) + No comment provided by engineer. + + + Only your contact can make calls. + No comment provided by engineer. + + + Only your contact can send disappearing messages. + No comment provided by engineer. + + + Only your contact can send files and media. + No comment provided by engineer. + + + Only your contact can send voice messages. + No comment provided by engineer. + + + Only your page above can show the preview. + No comment provided by engineer. + + + Open + alert action +alert button + + + Open Settings + No comment provided by engineer. + + + Open changes + No comment provided by engineer. + + + Open channel + new chat action + + + Open chat + new chat action + + + Open chat console + authentication reason + + + Open clean link + alert action + + + Open conditions + No comment provided by engineer. + + + Open external link? + alert title + + + Open full link + alert action + + + Open group + new chat action + + + Open link? + alert title + + + Open migration to another device + authentication reason + + + Open new channel + new chat action + + + Open new chat + new chat action + + + Open new group + new chat action + + + Open to accept + No comment provided by engineer. + + + Open to connect + No comment provided by engineer. + + + Open to join + No comment provided by engineer. + + + Open to use bot + No comment provided by engineer. + + + Opening app… + No comment provided by engineer. + + + Operator + No comment provided by engineer. + + + Operator server + alert title + + + Operators commit to: +- Be independent +- Minimize metadata usage +- Run verified open-source code + No comment provided by engineer. + + + Or import archive file + No comment provided by engineer. + + + Or paste archive link + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or securely share this file link + No comment provided by engineer. + + + Or show QR in person or via video call. + No comment provided by engineer. + + + Or show this code + No comment provided by engineer. + + + Or to share privately + No comment provided by engineer. + + + Or use this QR - print or show online. + No comment provided by engineer. + + + Organize chats into lists + No comment provided by engineer. + + + Other + No comment provided by engineer. + + + Other file errors: +%@ + alert message + + + Owner + No comment provided by engineer. + + + Owners & contributors + No comment provided by engineer. + + + Ownership: you can run your own relays. + No comment provided by engineer. + + + PING count + No comment provided by engineer. + + + PING interval + No comment provided by engineer. + + + Passcode + No comment provided by engineer. + + + Passcode changed! + No comment provided by engineer. + + + Passcode entry + No comment provided by engineer. + + + Passcode not changed! + No comment provided by engineer. + + + Passcode set! + No comment provided by engineer. + + + Password + No comment provided by engineer. + + + Password to show + No comment provided by engineer. + + + Paste desktop address + No comment provided by engineer. + + + Paste image + No comment provided by engineer. + + + Paste link / Scan + No comment provided by engineer. + + + Paste link to connect! + No comment provided by engineer. + + + Paste the link you received + No comment provided by engineer. + + + Pending + No comment provided by engineer. + + + Periodic + No comment provided by engineer. + + + Permanent decryption error + message decrypt error item + + + Picture-in-picture calls + No comment provided by engineer. + + + Play from the chat list. + No comment provided by engineer. + + + Please ask your contact to enable calls. + No comment provided by engineer. + + + Please ask your contact to enable sending voice messages. + No comment provided by engineer. + + + Please check that mobile and desktop are connected to the same local network, and that desktop firewall allows the connection. +Please share any other issues with the developers. + No comment provided by engineer. + + + Please check that you used the correct link or ask your contact to send you another one. + No comment provided by engineer. + + + Please check your network connection with %@ and try again. + alert message + + + 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. +Error: %@ + No comment provided by engineer. + + + Please contact group admin. + No comment provided by engineer. + + + Please enter correct current passphrase. + No comment provided by engineer. + + + Please enter the previous password after restoring database backup. This action can not be undone. + No comment provided by engineer. + + + Please remember or store it securely - there is no way to recover a lost passcode! + No comment provided by engineer. + + + Please report it to the developers. + No comment provided by engineer. + + + Please restart the app and migrate the database to enable push notifications. + No comment provided by engineer. + + + Please store passphrase securely, you will NOT be able to access chat if you lose it. + No comment provided by engineer. + + + Please store passphrase securely, you will NOT be able to change it if you lose it. + No comment provided by engineer. + + + Please try to disable and re-enable notfications. + token info + + + Please wait for group moderators to review your request to join the group. + snd group event chat item + + + Please wait for token activation to complete. + token info + + + Please wait for token to be registered. + token info + + + Polish interface + No comment provided by engineer. + + + Port + No comment provided by engineer. + + + Preserve the last message draft, with attachments. + No comment provided by engineer. + + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + + + Preset server address + No comment provided by engineer. + + + Preset servers + No comment provided by engineer. + + + Preview + No comment provided by engineer. + + + Previously connected servers + No comment provided by engineer. + + + Privacy for your customers. + No comment provided by engineer. + + + Privacy policy and conditions of use. + No comment provided by engineer. + + + Privacy: for owners and subscribers. + No comment provided by engineer. + + + Private and secure messaging. + No comment provided by engineer. + + + Private filenames + No comment provided by engineer. + + + Private media file names. + No comment provided by engineer. + + + Private message routing + No comment provided by engineer. + + + Private message routing 🚀 + No comment provided by engineer. + + + Private notes + name of notes to self + + + Private routing + No comment provided by engineer. + + + Private routing error + alert title + + + Private routing timeout + alert title + + + Profile and server connections + No comment provided by engineer. + + + Profile image + No comment provided by engineer. + + + Profile images + No comment provided by engineer. + + + Profile password + No comment provided by engineer. + + + Profile theme + No comment provided by engineer. + + + Profile update will be sent to your SimpleX contacts. + alert message +alert title + + + Prohibit audio/video calls. + No comment provided by engineer. + + + Prohibit chats with admins. + No comment provided by engineer. + + + Prohibit irreversible message deletion. + No comment provided by engineer. + + + Prohibit message reactions. + No comment provided by engineer. + + + Prohibit messages reactions. + No comment provided by engineer. + + + Prohibit reporting messages to moderators. + No comment provided by engineer. + + + Prohibit sending SimpleX links. + No comment provided by engineer. + + + Prohibit sending direct messages to members. + No comment provided by engineer. + + + Prohibit sending direct messages to subscribers. + No comment provided by engineer. + + + Prohibit sending disappearing messages. + No comment provided by engineer. + + + Prohibit sending files and media. + No comment provided by engineer. + + + Prohibit sending voice messages. + No comment provided by engineer. + + + Protect IP address + No comment provided by engineer. + + + Protect app screen + No comment provided by engineer. + + + Protect your IP address from the messaging relays chosen by your contacts. +Enable in *Network & servers* settings. + No comment provided by engineer. + + + Protect your chat profiles with a password! + No comment provided by engineer. + + + Protocol background timeout + No comment provided by engineer. + + + Protocol timeout + No comment provided by engineer. + + + Protocol timeout per KB + No comment provided by engineer. + + + Proxied + No comment provided by engineer. + + + Proxied servers + No comment provided by engineer. + + + Proxy requires password + No comment provided by engineer. + + + Public channels - speak freely 🚀 + No comment provided by engineer. + + + Public names for your channel or business. + No comment provided by engineer. + + + Push notifications + No comment provided by engineer. + + + Push server + No comment provided by engineer. + + + Quantum resistant encryption + No comment provided by engineer. + + + Rate the app + No comment provided by engineer. + + + Reachable chat toolbar + No comment provided by engineer. + + + React… + chat item menu + + + Read + swipe action + + + Read more + profile description teaser + + + Read more in User Guide. + No comment provided by engineer. + + + Read more in our GitHub repository. + No comment provided by engineer. + + + Receipts are disabled + No comment provided by engineer. + + + Receive errors + No comment provided by engineer. + + + Received at + No comment provided by engineer. + + + Received at: %@ + copied message info + + + Received message + message info title + + + Received messages + No comment provided by engineer. + + + Received reply + No comment provided by engineer. + + + Received total + No comment provided by engineer. + + + Receiving address will be changed to a different server. Address change will complete after sender comes online. + No comment provided by engineer. + + + Receiving file will be stopped. + No comment provided by engineer. + + + Receiving via + No comment provided by engineer. + + + 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). + No comment provided by engineer. + + + Recipient(s) can't see who this message is from. + No comment provided by engineer. + + + Recipients see updates as you type them. + No comment provided by engineer. + + + Reconnect + No comment provided by engineer. + + + Reconnect all connected servers to force message delivery. It uses additional traffic. + No comment provided by engineer. + + + Reconnect all servers + No comment provided by engineer. + + + Reconnect all servers? + No comment provided by engineer. + + + Reconnect server to force message delivery. It uses additional traffic. + No comment provided by engineer. + + + Reconnect server? + No comment provided by engineer. + + + Reconnect servers? + No comment provided by engineer. + + + Record updated at + No comment provided by engineer. + + + Record updated at: %@ + copied message info + + + Reduced battery usage + No comment provided by engineer. + + + Register + No comment provided by engineer. + + + Register notification token? + token info + + + Registered + token status text + + + Reject + alert action +reject incoming call via notification +swipe action + + + Reject (sender NOT notified) + No comment provided by engineer. + + + Reject contact request + alert title + + + Reject member? + alert title + + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + + + Relay results: + alert message + + + Relay server is only used if necessary. Another party can observe your IP address. + No comment provided by engineer. + + + Relay server protects your IP address, but it can observe the duration of the call. + No comment provided by engineer. + + + Relay test failed! + No comment provided by engineer. + + + Relay will be removed from channel - this cannot be undone! + alert message + + + Relays added: %@. + alert message + + + Reliability: many relays per channel. + No comment provided by engineer. + + + Remove + alert action + + + Remove and delete messages + alert action + + + Remove archive? + No comment provided by engineer. + + + Remove image + No comment provided by engineer. + + + Remove link tracking + No comment provided by engineer. + + + Remove member + No comment provided by engineer. + + + Remove member? + alert title + + + Remove name + No comment provided by engineer. + + + Remove passphrase from keychain? + No comment provided by engineer. + + + Remove relay + No comment provided by engineer. + + + Remove relay? + alert title + + + Remove subscriber? + alert title + + + Removes messages and blocks members. + No comment provided by engineer. + + + Renegotiate + No comment provided by engineer. + + + Renegotiate encryption + No comment provided by engineer. + + + Renegotiate encryption? + No comment provided by engineer. + + + Repeat download + No comment provided by engineer. + + + Repeat import + No comment provided by engineer. + + + Repeat upload + No comment provided by engineer. + + + Reply + chat item action + + + Report + chat item action + + + Report content: only group moderators will see it. + report reason + + + Report member profile: only group moderators will see it. + report reason + + + Report other: only group moderators will see it. + report reason + + + Report reason? + No comment provided by engineer. + + + Report sent to moderators + alert title + + + Report spam: only group moderators will see it. + report reason + + + Report violation: only group moderators will see it. + report reason + + + Report: %@ + report in notification + + + Reporting messages to moderators is prohibited. + No comment provided by engineer. + + + Reports + No comment provided by engineer. + + + Require signing messages. + No comment provided by engineer. + + + Required + No comment provided by engineer. + + + Reset + No comment provided by engineer. + + + Reset all hints + No comment provided by engineer. + + + Reset all statistics + No comment provided by engineer. + + + Reset all statistics? + No comment provided by engineer. + + + Reset colors + No comment provided by engineer. + + + Reset to app theme + No comment provided by engineer. + + + Reset to defaults + No comment provided by engineer. + + + Reset to user theme + No comment provided by engineer. + + + Resolver error: %@ + No comment provided by engineer. + + + Restart the app to create a new chat profile + No comment provided by engineer. + + + Restart the app to use imported chat database + No comment provided by engineer. + + + Restore + No comment provided by engineer. + + + Restore database backup + No comment provided by engineer. + + + Restore database backup? + No comment provided by engineer. + + + Restore database error + No comment provided by engineer. + + + Retry + alert action + + + Reveal + chat item action + + + Review conditions + No comment provided by engineer. + + + Review group members + No comment provided by engineer. + + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + + + Revoke + No comment provided by engineer. + + + Revoke file + cancel file action + + + Revoke file? + No comment provided by engineer. + + + Role + No comment provided by engineer. + + + Role will be changed to "%@". All chat members will be notified. + No comment provided by engineer. + + + Role will be changed to "%@". All group members will be notified. + No comment provided by engineer. + + + Role will be changed to "%@". All subscribers will be notified. + No comment provided by engineer. + + + Role will be changed to "%@". The member will receive a new invitation. + No comment provided by engineer. + + + Run chat + No comment provided by engineer. + + + SMP server + No comment provided by engineer. + + + SOCKS proxy + No comment provided by engineer. + + + Safe web links + No comment provided by engineer. + + + Safely receive files + No comment provided by engineer. + + + Safer groups + No comment provided by engineer. + + + Save + alert action +alert button +chat item action + + + Save (and notify contacts) + alert button + + + Save (and notify members) + alert button + + + Save (and notify subscribers) + alert button + + + Save SimpleX name? + alert title + + + Save admission settings? + alert title + + + Save and notify contact + alert button + + + Save and notify group members + No comment provided by engineer. + + + Save and notify members + No comment provided by engineer. + + + Save and notify subscribers + No comment provided by engineer. + + + Save and reconnect + No comment provided by engineer. + + + Save and update group profile + No comment provided by engineer. + + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + + + Save group profile + No comment provided by engineer. + + + Save group profile? + alert title + + + Save list + No comment provided by engineer. + + + Save passphrase and open chat + No comment provided by engineer. + + + Save passphrase in Keychain + No comment provided by engineer. + + + Save preferences? + alert title + + + Save profile password + No comment provided by engineer. + + + Save servers + No comment provided by engineer. + + + Save servers? + alert title + + + Save webpage settings? + alert title + + + Save welcome message? + No comment provided by engineer. + + + Save your profile? + alert title + + + Saved + No comment provided by engineer. + + + Saved WebRTC ICE servers will be removed + No comment provided by engineer. + + + Saved from + No comment provided by engineer. + + + Saved message + message info title + + + Saving %lld messages + No comment provided by engineer. + + + Scale + No comment provided by engineer. + + + Scan / Paste link + No comment provided by engineer. + + + Scan QR code + No comment provided by engineer. + + + Scan QR code from desktop + No comment provided by engineer. + + + Scan code + No comment provided by engineer. + + + Scan security code from your contact's app. + No comment provided by engineer. + + + Scan server QR code + No comment provided by engineer. + + + Search + No comment provided by engineer. + + + Search bar accepts invitation links. + No comment provided by engineer. + + + Search files + No comment provided by engineer. + + + Search images + No comment provided by engineer. + + + Search links + No comment provided by engineer. + + + Search or paste SimpleX link + No comment provided by engineer. + + + Search videos + No comment provided by engineer. + + + Search voice messages + No comment provided by engineer. + + + Secondary + No comment provided by engineer. + + + Secure queue + server test step + + + Secured + No comment provided by engineer. + + + Security assessment + No comment provided by engineer. + + + Security code + No comment provided by engineer. + + + Security: owners hold channel keys. + No comment provided by engineer. + + + Select + chat item action + + + Select chat profile + No comment provided by engineer. + + + Selected %lld + No comment provided by engineer. + + + Selected chat preferences prohibit this message. + No comment provided by engineer. + + + Self-destruct + No comment provided by engineer. + + + Self-destruct passcode + No comment provided by engineer. + + + Self-destruct passcode changed! + No comment provided by engineer. + + + Self-destruct passcode enabled! + No comment provided by engineer. + + + Send + No comment provided by engineer. + + + Send a live message - it will update for the recipient(s) as you type it + No comment provided by engineer. + + + Send contact request? + No comment provided by engineer. + + + Send delivery receipts to + No comment provided by engineer. + + + Send direct message to connect + No comment provided by engineer. + + + Send disappearing message + No comment provided by engineer. + + + Send errors + No comment provided by engineer. + + + Send link previews + No comment provided by engineer. + + + Send live message + No comment provided by engineer. + + + Send message to enable calls. + No comment provided by engineer. + + + Send messages directly when IP address is protected and your or destination server does not support private routing. + No comment provided by engineer. + + + Send messages directly when your or destination server does not support private routing. + No comment provided by engineer. + + + Send notifications + No comment provided by engineer. + + + Send private reports + No comment provided by engineer. + + + Send questions and ideas + No comment provided by engineer. + + + Send receipts + No comment provided by engineer. + + + Send request + No comment provided by engineer. + + + Send request without message + No comment provided by engineer. + + + Send the link via any messenger - it's secure. Ask to paste into SimpleX. + No comment provided by engineer. + + + Send them from gallery or custom keyboards. + No comment provided by engineer. + + + Send up to 100 last messages to new members. + No comment provided by engineer. + + + Send up to 100 last messages to new subscribers. + No comment provided by engineer. + + + Send your private feedback to groups. + No comment provided by engineer. + + + Sender cancelled file transfer. + alert message + + + Sending a link preview may reveal your IP address to the website. You can change this in Privacy settings later. + alert message + + + Sending delivery receipts will be enabled for all contacts in all visible chat profiles. + No comment provided by engineer. + + + Sending delivery receipts will be enabled for all contacts. + No comment provided by engineer. + + + Sending file will be stopped. + No comment provided by engineer. + + + Sending receipts is disabled for %lld contacts + No comment provided by engineer. + + + Sending receipts is disabled for %lld groups + No comment provided by engineer. + + + Sending receipts is enabled for %lld contacts + No comment provided by engineer. + + + Sending receipts is enabled for %lld groups + No comment provided by engineer. + + + Sending via + No comment provided by engineer. + + + Sent at + No comment provided by engineer. + + + Sent at: %@ + copied message info + + + Sent directly + No comment provided by engineer. + + + Sent message + message info title + + + Sent messages + No comment provided by engineer. + + + Sent messages will be deleted after set time. + No comment provided by engineer. + + + Sent reply + No comment provided by engineer. + + + Sent total + No comment provided by engineer. + + + Sent via proxy + No comment provided by engineer. + + + Server + No comment provided by engineer. + + + Server %@ does not support name resolution. Configure servers, or use a connection link. + No comment provided by engineer. + + + Server added to operator %@. + alert message + + + Server address + No comment provided by engineer. + + + Server address is incompatible with network settings. + srv error text. + + + Server address is incompatible with network settings: %@. + No comment provided by engineer. + + + Server operator changed. + alert title + + + Server operators + No comment provided by engineer. + + + Server protocol changed. + alert title + + + Server requires authorization to connect to relay, check password. + relay test error + + + Server requires authorization to create queues, check password. + server test error + + + Server requires authorization to upload, check password. + server test error + + + Server test failed! + No comment provided by engineer. + + + Server type + No comment provided by engineer. + + + Server version is incompatible with network settings. + srv error text + + + Server version is incompatible with your app: %@. + No comment provided by engineer. + + + Servers + No comment provided by engineer. + + + Servers info + No comment provided by engineer. + + + Servers statistics will be reset - this cannot be undone! + No comment provided by engineer. + + + Session code + No comment provided by engineer. + + + Set 1 day + No comment provided by engineer. + + + Set chat name… + No comment provided by engineer. + + + Set contact name… + No comment provided by engineer. + + + Set default theme + No comment provided by engineer. + + + Set group preferences + No comment provided by engineer. + + + Set it instead of system authentication. + No comment provided by engineer. + + + Set member admission + No comment provided by engineer. + + + Set message expiration in chats. + No comment provided by engineer. + + + Set passcode + No comment provided by engineer. + + + Set passphrase + No comment provided by engineer. + + + Set passphrase to export + No comment provided by engineer. + + + Set profile bio and welcome message. + No comment provided by engineer. + + + Set the message shown to new members! + No comment provided by engineer. + + + Set timeouts for proxy/VPN + No comment provided by engineer. + + + Settings + No comment provided by engineer. + + + Settings were changed. + alert message + + + Setup notifications + No comment provided by engineer. + + + Setup routers + No comment provided by engineer. + + + Shape profile images + No comment provided by engineer. + + + Share + alert action +chat item action + + + Share 1-time link + No comment provided by engineer. + + + Share 1-time link with a friend + No comment provided by engineer. + + + Share SimpleX address on social media. + No comment provided by engineer. + + + Share address + No comment provided by engineer. + + + Share address publicly + No comment provided by engineer. + + + Share address with SimpleX contacts? + alert title + + + Share channel + No comment provided by engineer. + + + Share from other apps. + No comment provided by engineer. + + + Share link + No comment provided by engineer. + + + Share old address + alert button + + + Share old link + alert button + + + Share profile + No comment provided by engineer. + + + Share relay address + No comment provided by engineer. + + + Share this 1-time invite link + No comment provided by engineer. + + + Share to SimpleX + No comment provided by engineer. + + + Share via chat + No comment provided by engineer. + + + Share with SimpleX contacts + No comment provided by engineer. + + + Share your address + No comment provided by engineer. + + + Short SimpleX address + No comment provided by engineer. + + + Short description + No comment provided by engineer. + + + Short link + No comment provided by engineer. + + + Show QR code + No comment provided by engineer. + + + Show calls in phone history + No comment provided by engineer. + + + Show developer options + No comment provided by engineer. + + + Show encryption + No comment provided by engineer. + + + Show last messages + No comment provided by engineer. + + + Show message status + No comment provided by engineer. + + + Show percentage + No comment provided by engineer. + + + Show preview + No comment provided by engineer. + + + Show → on messages sent via private routing. + No comment provided by engineer. + + + Show: + No comment provided by engineer. + + + Sign message + No comment provided by engineer. + + + Sign messages + chat feature + + + Signature missing + alert title +copied message info + + + Signed + copied message info + + + Signed & verified + copied message info + + + Signing proves you authored this message and can't be denied later. + No comment provided by engineer. + + + SimpleX + No comment provided by engineer. + + + SimpleX Address + No comment provided by engineer. + + + SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app. + No comment provided by engineer. + + + SimpleX Chat security was audited by Trail of Bits. + No comment provided by engineer. + + + SimpleX Lock + No comment provided by engineer. + + + SimpleX Lock mode + No comment provided by engineer. + + + SimpleX Lock not enabled! + No comment provided by engineer. + + + SimpleX Lock turned on + No comment provided by engineer. + + + SimpleX address + No comment provided by engineer. + + + SimpleX address and 1-time links are safe to share via any messenger. + No comment provided by engineer. + + + SimpleX address or 1-time link? + No comment provided by engineer. + + + SimpleX address settings + alert title + + + SimpleX channel link + simplex link type + + + SimpleX contact address + simplex link type + + + SimpleX encrypted message or connection event + notification + + + SimpleX group link + simplex link type + + + SimpleX links + chat feature + + + SimpleX links are prohibited. + No comment provided by engineer. + + + SimpleX links not allowed + No comment provided by engineer. + + + SimpleX name + No comment provided by engineer. + + + SimpleX name error + No comment provided by engineer. + + + SimpleX name not verified + alert title + + + SimpleX one-time invitation + simplex link type + + + SimpleX protocols reviewed by Trail of Bits. + No comment provided by engineer. + + + SimpleX public names (BETA) + No comment provided by engineer. + + + SimpleX relay address + simplex link type + + + Simplified incognito mode + No comment provided by engineer. + + + Size + No comment provided by engineer. + + + Skip + No comment provided by engineer. + + + Skipped messages + No comment provided by engineer. + + + Small groups (max 20) + No comment provided by engineer. + + + Soft + blur media + + + Some app settings were not migrated. + No comment provided by engineer. + + + Some file(s) were not exported: + No comment provided by engineer. + + + Some non-fatal errors occurred during import - you may see Chat console for more details. + No comment provided by engineer. + + + Some non-fatal errors occurred during import: + No comment provided by engineer. + + + Some servers failed the test: +%@ + alert message + + + Somebody + notification title + + + Spam + blocking reason +report reason + + + Square, circle, or anything in between. + No comment provided by engineer. + + + Star on GitHub + No comment provided by engineer. + + + Start chat + No comment provided by engineer. + + + Start chat? + No comment provided by engineer. + + + Start migration + No comment provided by engineer. + + + Starting from %@. + No comment provided by engineer. + + + Statistics + No comment provided by engineer. + + + Status + No comment provided by engineer. + + + Stop + No comment provided by engineer. + + + Stop SimpleX + authentication reason + + + Stop chat + No comment provided by engineer. + + + Stop chat to export, import or delete chat database. You will not be able to receive and send messages while the chat is stopped. + No comment provided by engineer. + + + Stop chat? + No comment provided by engineer. + + + Stop file + cancel file action + + + Stop receiving file? + No comment provided by engineer. + + + Stop sending file? + No comment provided by engineer. + + + Stop sharing + alert action + + + Stop sharing address? + alert title + + + Stopping chat + No comment provided by engineer. + + + Storage + No comment provided by engineer. + + + Strong + blur media + + + Submit + No comment provided by engineer. + + + Subscribed + No comment provided by engineer. + + + Subscriber + No comment provided by engineer. + + + Subscriber reports + chat feature + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers can add message reactions. + No comment provided by engineer. + + + Subscribers can chat with admins. + No comment provided by engineer. + + + Subscribers can irreversibly delete sent messages. (24 hours) + No comment provided by engineer. + + + Subscribers can report messsages to moderators. + No comment provided by engineer. + + + Subscribers can send SimpleX links. + No comment provided by engineer. + + + Subscribers can send direct messages. + No comment provided by engineer. + + + Subscribers can send disappearing messages. + No comment provided by engineer. + + + Subscribers can send files and media. + No comment provided by engineer. + + + Subscribers can send voice messages. + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + + + Subscription errors + No comment provided by engineer. + + + Subscriptions ignored + No comment provided by engineer. + + + Support the project + No comment provided by engineer. + + + Switch audio and video during the call. + No comment provided by engineer. + + + Switch chat profile for 1-time invitations. + No comment provided by engineer. + + + System + No comment provided by engineer. + + + System authentication + No comment provided by engineer. + + + TCP connection + No comment provided by engineer. + + + TCP connection bg timeout + No comment provided by engineer. + + + TCP connection timeout + No comment provided by engineer. + + + TCP port for messaging + No comment provided by engineer. + + + TCP_KEEPCNT + No comment provided by engineer. + + + TCP_KEEPIDLE + No comment provided by engineer. + + + TCP_KEEPINTVL + No comment provided by engineer. + + + Tail + No comment provided by engineer. + + + Take picture + No comment provided by engineer. + + + Talk to someone + No comment provided by engineer. + + + Tap Connect to chat + No comment provided by engineer. + + + Tap Connect to send request + No comment provided by engineer. + + + Tap Connect to use bot + No comment provided by engineer. + + + Tap Join channel + No comment provided by engineer. + + + Tap Join group + No comment provided by engineer. + + + Tap button + No comment provided by engineer. + + + Tap to Connect + No comment provided by engineer. + + + Tap to activate profile. + No comment provided by engineer. + + + Tap to join + No comment provided by engineer. + + + Tap to join incognito + No comment provided by engineer. + + + Tap to open + No comment provided by engineer. + + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + + + Temporary file error + file error alert title + + + Test failed at step %@. + relay test failure +server test failure + + + Test notifications + No comment provided by engineer. + + + Test relay + No comment provided by engineer. + + + Test server + No comment provided by engineer. + + + Test servers + No comment provided by engineer. + + + Tests failed! + alert title + + + Thank you for installing SimpleX Chat! + No comment provided by engineer. + + + Thanks to the users – [contribute via Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! + No comment provided by engineer. + + + Thanks to the users – contribute via Weblate! + No comment provided by engineer. + + + The ID of the next message is incorrect (less or equal to the previous). +It can happen because of some bug or when the connection is compromised. + No comment provided by engineer. + + + The SimpleX name #%@ is registered without channel link. Add channel link to the name via the registration page. + alert message + + + The SimpleX name %@ is registered, but it has no valid link. + No comment provided by engineer. + + + The SimpleX name %@ is registered, but not added to profile. Please add it to your address or channel profile, if you are the owner. + No comment provided by engineer. + + + The SimpleX name @%@ is registered without SimpleX address. Add your SimpleX address to the name via the registration page. + alert message + + + The address will be short, and your profile will be shared via the address. + alert message + + + The app can notify you when you receive messages or contact requests - please open settings to enable. + No comment provided by engineer. + + + The app protects your privacy by using different operators in each conversation. + No comment provided by engineer. + + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + + + The app will ask to confirm downloads from unknown file servers (except .onion). + No comment provided by engineer. + + + The attempt to change database passphrase was not completed. + No comment provided by engineer. + + + The badge is signed with a key that this version of the app does not recognize. Update the app to verify this badge. + badge alert + + + The channel required this message to be signed, but the signature is missing. + alert message + + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + + + The connection reached the limit of undelivered messages + conn error description + + + The connection reached the limit of undelivered messages, your contact may be offline. + No comment provided by engineer. + + + The connection you accepted will be cancelled! + No comment provided by engineer. + + + The contact you shared this link with will NOT be able to connect! + No comment provided by engineer. + + + The created archive is available via app Settings / Database / Old database archive. + No comment provided by engineer. + + + The encryption is working and the new encryption agreement is not required. It may result in connection errors! + No comment provided by engineer. + + + The first network where you own +your contacts and groups. + No comment provided by engineer. + + + The hash of the previous message is different. + No comment provided by engineer. + + + The link will be short, and group profile will be shared via the link. + alert message + + + The message will be deleted for all members. + No comment provided by engineer. + + + The message will be marked as moderated for all members. + No comment provided by engineer. + + + The messages will be deleted for all members. + No comment provided by engineer. + + + The messages will be marked as moderated for all members. + No comment provided by engineer. + + + The old database was not removed during the migration, it can be deleted. + No comment provided by engineer. + + + The oldest human freedom - to speak to another person without being watched - built on infrastructure that cannot betray it. + No comment provided by engineer. + + + The same conditions will apply to operator **%@**. + No comment provided by engineer. + + + The second preset operator in the app! + No comment provided by engineer. + + + The second tick we missed! ✅ + No comment provided by engineer. + + + The sender deleted the connection request. + No comment provided by engineer. + + + The sender will NOT be notified + alert message + + + The servers for new connections of your current chat profile **%@**. + No comment provided by engineer. + + + The servers for new files of your current chat profile **%@**. + No comment provided by engineer. + + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + + + The uploaded database archive will be permanently removed from the servers. + No comment provided by engineer. + + + Themes + No comment provided by engineer. + + + Then we moved online, and every platform asked for a piece of you - your name, your number, your friends. We accepted that the price of talking to others is letting someone know who we talk to. Every generation, people and tech, had it this way - telephone, email, messengers, social media. It seemed the only way possible. + No comment provided by engineer. + + + There is another way. A network with no phone numbers. No usernames. No accounts. No user identities of any kind. A network that connects people and carries encrypted messages without knowing who is connected. + No comment provided by engineer. + + + These conditions will also apply for: **%@**. + No comment provided by engineer. + + + These settings are for your current profile **%@**. + No comment provided by engineer. + + + They can be overridden in contact and group settings. + No comment provided by engineer. + + + This SimpleX name is not registered. Please check the name. + No comment provided by engineer. + + + This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain. + No comment provided by engineer. + + + This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes. + No comment provided by engineer. + + + This action cannot be undone - the messages sent and received in this chat earlier than selected will be deleted. + alert message + + + This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost. + No comment provided by engineer. + + + This badge could not be verified and may not be genuine. + badge alert + + + 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. + + + This group has over %lld members, delivery receipts are not sent. + No comment provided by engineer. + + + This group no longer exists. + No comment provided by engineer. + + + This group requires a newer version of the app. Please update the app to join. + alert message +alert subtitle + + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is the last active relay. Removing it will prevent message delivery to subscribers. + alert message + + + This is your link for channel %@! + new chat action + + + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. + No comment provided by engineer. + + + This link was used with another mobile device, please create a new link on the desktop. + No comment provided by engineer. + + + This message was deleted or not received yet. + No comment provided by engineer. + + + This setting applies to messages in your current chat profile **%@**. + No comment provided by engineer. + + + Time to disappear is set only for new contacts. + No comment provided by engineer. + + + Title + No comment provided by engineer. + + + To ask any questions and to receive updates: + No comment provided by engineer. + + + To connect, your contact can scan QR code or use the link in the app. + No comment provided by engineer. + + + To hide unwanted messages. + No comment provided by engineer. + + + To make SimpleX Network last. + No comment provided by engineer. + + + To make a new connection + No comment provided by engineer. + + + To protect against your link being replaced, you can compare contact security codes. + No comment provided by engineer. + + + To protect timezone, image/voice files use UTC. + No comment provided by engineer. + + + To protect your IP address, private routing uses your SMP servers to deliver messages. + No comment provided by engineer. + + + To protect your information, turn on SimpleX Lock. +You will be prompted to complete authentication before this feature is enabled. + No comment provided by engineer. + + + To protect your privacy, SimpleX uses separate IDs for each of your contacts. + No comment provided by engineer. + + + To receive + No comment provided by engineer. + + + To record speech please grant permission to use Microphone. + No comment provided by engineer. + + + To record video please grant permission to use Camera. + No comment provided by engineer. + + + To record voice message please grant permission to use Microphone. + No comment provided by engineer. + + + To resolve names + No comment provided by engineer. + + + To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page. + No comment provided by engineer. + + + To send + No comment provided by engineer. + + + To send commands you must be connected. + alert message + + + To support instant push notifications the chat database has to be migrated. + No comment provided by engineer. + + + To use another profile after connection attempt, delete the chat and use the link again. + alert message + + + To use the servers of **%@**, accept conditions of use. + No comment provided by engineer. + + + To verify end-to-end encryption with your contact compare (or scan) the code on your devices. + No comment provided by engineer. + + + To verify keys with this subscriber, compare (or scan) the code on your devices. + No comment provided by engineer. + + + Toggle incognito when connecting. + No comment provided by engineer. + + + Token status: %@. + token status + + + Toolbar opacity + No comment provided by engineer. + + + Top bar + No comment provided by engineer. + + + Total + No comment provided by engineer. + + + Transport isolation + No comment provided by engineer. + + + Transport sessions + No comment provided by engineer. + + + Trying to connect to the server used to receive messages from this connection. + subscription status explanation + + + Turkish interface + No comment provided by engineer. + + + Turn off + No comment provided by engineer. + + + Turn on + No comment provided by engineer. + + + Unable to record voice message + No comment provided by engineer. + + + Unblock + 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. + + + Unblock subscriber for all? + No comment provided by engineer. + + + Unconfirmed name + No comment provided by engineer. + + + Undelivered messages + No comment provided by engineer. + + + Unexpected migration state + No comment provided by engineer. + + + Unfav. + swipe action + + + Unhide + No comment provided by engineer. + + + Unhide chat profile + No comment provided by engineer. + + + Unhide profile + No comment provided by engineer. + + + Unit + No comment provided by engineer. + + + Unknown caller + callkit banner + + + Unknown database error: %@ + No comment provided by engineer. + + + Unknown error + No comment provided by engineer. + + + Unknown servers! + alert title + + + Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions. + No comment provided by engineer. + + + Unlink + No comment provided by engineer. + + + Unlink desktop? + No comment provided by engineer. + + + Unlock + No comment provided by engineer. + + + Unlock app + authentication reason + + + Unmute + notification label action + + + Unread + swipe action + + + Unsupported connection link + conn error description + + + Unverified badge + badge alert title + + + Up to 100 last messages are sent to new members. + No comment provided by engineer. + + + Up to 100 last messages are sent to new subscribers. + No comment provided by engineer. + + + Update + No comment provided by engineer. + + + Update database passphrase + No comment provided by engineer. + + + Update network settings? + No comment provided by engineer. + + + Update settings? + No comment provided by engineer. + + + Updated conditions + No comment provided by engineer. + + + Updating settings will re-connect the client to all servers. + No comment provided by engineer. + + + Upgrade + alert button + + + Upgrade address + No comment provided by engineer. + + + Upgrade address? + alert message +alert title + + + Upgrade and open chat + No comment provided by engineer. + + + Upgrade group link? + alert message + + + Upgrade link + No comment provided by engineer. + + + Upgrade your address + No comment provided by engineer. + + + Upload errors + No comment provided by engineer. + + + Upload failed + No comment provided by engineer. + + + Upload file + server test step + + + Uploaded + No comment provided by engineer. + + + Uploaded files + No comment provided by engineer. + + + Uploading archive + No comment provided by engineer. + + + Use %@ + No comment provided by engineer. + + + Use .onion hosts + No comment provided by engineer. + + + Use SOCKS proxy + No comment provided by engineer. + + + Use SimpleX Chat servers? + No comment provided by engineer. + + + Use TCP port %@ when no port is specified. + No comment provided by engineer. + + + Use TCP port 443 for preset servers only. + No comment provided by engineer. + + + Use current profile + new chat action + + + Use for files + No comment provided by engineer. + + + Use for messages + No comment provided by engineer. + + + Use for new channels + No comment provided by engineer. + + + Use for new connections + No comment provided by engineer. + + + Use from desktop + No comment provided by engineer. + + + Use iOS call interface + No comment provided by engineer. + + + Use incognito profile + No comment provided by engineer. + + + Use new incognito profile + new chat action + + + Use only local notifications? + No comment provided by engineer. + + + Use private routing with unknown servers when IP address is not protected. + No comment provided by engineer. + + + Use private routing with unknown servers. + No comment provided by engineer. + + + Use relay + No comment provided by engineer. + + + Use server + No comment provided by engineer. + + + Use servers + No comment provided by engineer. + + + Use the app while in the call. + No comment provided by engineer. + + + Use the app with one hand. + No comment provided by engineer. + + + Use this address in your social media profile, website, or email signature. + No comment provided by engineer. + + + Use web port + No comment provided by engineer. + + + Used chat relays do not support webpages. + No comment provided by engineer. + + + User selection + No comment provided by engineer. + + + Username + No comment provided by engineer. + + + Using SimpleX Chat servers. + No comment provided by engineer. + + + Verify + relay test step + + + Verify SimpleX names + No comment provided by engineer. + + + Verify code with desktop + No comment provided by engineer. + + + Verify connection + No comment provided by engineer. + + + Verify connection security + No comment provided by engineer. + + + Verify connections + No comment provided by engineer. + + + Verify database passphrase + No comment provided by engineer. + + + Verify name + No comment provided by engineer. + + + Verify passphrase + No comment provided by engineer. + + + Verify security code + No comment provided by engineer. + + + Via browser + No comment provided by engineer. + + + Via secure quantum resistant protocol. + No comment provided by engineer. + + + Video call + No comment provided by engineer. + + + Video will be received when your contact completes uploading it. + No comment provided by engineer. + + + Video will be received when your contact is online, please wait or check later! + No comment provided by engineer. + + + Videos + No comment provided by engineer. + + + Videos and files up to 1gb + No comment provided by engineer. + + + View conditions + No comment provided by engineer. + + + View security code + No comment provided by engineer. + + + View updated conditions + No comment provided by engineer. + + + Visible history + chat feature + + + Voice messages + chat feature + + + Voice messages are prohibited in this chat. + No comment provided by engineer. + + + Voice messages are prohibited. + No comment provided by engineer. + + + Voice messages not allowed + No comment provided by engineer. + + + Voice messages prohibited! + No comment provided by engineer. + + + Voice message… + No comment provided by engineer. + + + Wait + alert action + + + Wait response + relay test step + + + Waiting for channel owner to add relays. + No comment provided by engineer. + + + Waiting for desktop... + No comment provided by engineer. + + + Waiting for file + No comment provided by engineer. + + + Waiting for image + No comment provided by engineer. + + + Waiting for video + No comment provided by engineer. + + + Wallpaper accent + No comment provided by engineer. + + + Wallpaper background + 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! + No comment provided by engineer. + + + We made connecting simpler for new users. + No comment provided by engineer. + + + WebRTC ICE servers + No comment provided by engineer. + + + Webpage code + No comment provided by engineer. + + + Webpage settings were changed. If you save, the updated settings will be sent to subscribers. + alert message + + + Welcome %@! + No comment provided by engineer. + + + Welcome message + No comment provided by engineer. + + + Welcome message is too long + No comment provided by engineer. + + + Welcome your contacts 👋 + No comment provided by engineer. + + + What's new + No comment provided by engineer. + + + When available + No comment provided by engineer. + + + When connecting audio and video calls. + No comment provided by engineer. + + + When more than one operator is enabled, none of them has metadata to learn who communicates with whom. + No comment provided by engineer. + + + When you share an incognito profile with somebody, this profile will be used for the groups they invite you to. + No comment provided by engineer. + + + Why SimpleX is built. + No comment provided by engineer. + + + WiFi + No comment provided by engineer. + + + Will be enabled in direct chats! + No comment provided by engineer. + + + Wired ethernet + No comment provided by engineer. + + + With encrypted files and media. + No comment provided by engineer. + + + With optional welcome message. + No comment provided by engineer. + + + With reduced battery usage. + No comment provided by engineer. + + + Without Tor or VPN, your IP address will be visible to file servers. + No comment provided by engineer. + + + Without Tor or VPN, your IP address will be visible to these XFTP relays: %@. + alert message + + + Wrong database passphrase + No comment provided by engineer. + + + Wrong key or unknown connection - most likely this connection is deleted. + snd error text + + + Wrong key or unknown file chunk address - most likely file is deleted. + file error text + + + Wrong passphrase! + No comment provided by engineer. + + + XFTP server + No comment provided by engineer. + + + You **must not** use the same database on two devices. + No comment provided by engineer. + + + You accepted connection + No comment provided by engineer. + + + You allow + No comment provided by engineer. + + + You already have a chat profile with the same display name. Please choose another name. + No comment provided by engineer. + + + You are already connected to %@. + No comment provided by engineer. + + + You are already connected with %@. + No comment provided by engineer. + + + You are already connecting to %@. + new chat sheet message + + + You are already connecting via this one-time link! + new chat sheet message + + + You are already in group %@. + No comment provided by engineer. + + + You are already joining the group %@. + new chat sheet message + + + You are already joining the group via this link. + new chat sheet message + + + You are already joining the group! +Repeat join request? + new chat sheet title + + + You are connected to the server used to receive messages from this connection. + subscription status explanation + + + You are invited to group + No comment provided by engineer. + + + You are not connected to the server used to receive messages from this connection (no subscription). + subscription status explanation + + + You are not connected to these servers. Private routing is used to deliver messages to them. + No comment provided by engineer. + + + You can accept calls from lock screen, without device and app authentication. + No comment provided by engineer. + + + You can change it in Appearance settings. + No comment provided by engineer. + + + You can configure servers via settings. + No comment provided by engineer. + + + You can create it later + No comment provided by engineer. + + + You can enable later via Settings + No comment provided by engineer. + + + You can enable them later via app Your privacy 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. + No comment provided by engineer. + + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + + + You can now chat with %@ + notification body + + + You can now invest in SimpleX Chat + No comment provided by engineer. + + + You can now invest in SimpleX Chat! 🚀 + No comment provided by engineer. + + + You can send messages to %@ from Archived contacts. + No comment provided by engineer. + + + You can set connection name, to remember who the link was shared with. + No comment provided by engineer. + + + You can set lock screen notification preview via settings. + No comment provided by engineer. + + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + + + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. + No comment provided by engineer. + + + You can share this address with your contacts to let them connect with **%@**. + No comment provided by engineer. + + + You can start chat via app Settings / Database or by restarting the app + No comment provided by engineer. + + + You can still view conversation with %@ in the list of chats. + No comment provided by engineer. + + + You can support SimpleX starting from v7 of the app. + badge alert + + + You can turn on SimpleX Lock via Settings. + No comment provided by engineer. + + + You can use markdown to format messages: + No comment provided by engineer. + + + You can view invitation link again in connection details. + alert message + + + You can view your reports in Chat with admins. + alert message + + + You can't send messages! + alert title + + + You commit to: +- Only legal content in public groups +- Respect other users - no spam + No comment provided by engineer. + + + You connected to the channel via this relay link. + No comment provided by engineer. + + + You could not be verified; please try again. + No comment provided by engineer. + + + You have already requested connection! +Repeat connection request? + new chat sheet title + + + You have to enter passphrase every time the app starts - it is not stored on the device. + No comment provided by engineer. + + + You invited a contact + No comment provided by engineer. + + + You joined this group + No comment provided by engineer. + + + You joined this group. Connecting to inviting group member. + No comment provided by engineer. + + + You may migrate the exported database. + No comment provided by engineer. + + + You may save the exported archive. + No comment provided by engineer. + + + You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts. + No comment provided by engineer. + + + You need to allow your contact to call to be able to call them. + No comment provided by engineer. + + + You need to allow your contact to send voice messages to be able to send them. + No comment provided by engineer. + + + You rejected group invitation + No comment provided by engineer. + + + You sent group invitation + No comment provided by engineer. + + + You should receive notifications. + token info + + + You were born without an account + No comment provided by engineer. + + + You will be able to send messages **only after your request is accepted**. + No comment provided by engineer. + + + You will be connected to group when the group host's device is online, please wait or check later! + No comment provided by engineer. + + + You will be connected when group link host's device is online, please wait or check later! + No comment provided by engineer. + + + You will be connected when your connection request is accepted, please wait or check later! + No comment provided by engineer. + + + You will be connected when your contact's device is online, please wait or check later! + No comment provided by engineer. + + + You will be required to authenticate when you start or resume the app after 30 seconds in background. + No comment provided by engineer. + + + You will still receive calls and notifications from muted profiles when they are active. + No comment provided by engineer. + + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + + + You will stop receiving messages from this chat. Chat history will be preserved. + No comment provided by engineer. + + + You will stop receiving messages from this group. Chat history will be preserved. + No comment provided by engineer. + + + You won't lose your contacts if you later delete your address. + No comment provided by engineer. + + + You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile + No comment provided by engineer. + + + You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed + No comment provided by engineer. + + + Your ICE servers + No comment provided by engineer. + + + Your SimpleX address + No comment provided by engineer. + + + Your SimpleX name + No comment provided by engineer. + + + Your business contact + No comment provided by engineer. + + + Your calls + No comment provided by engineer. + + + Your channel + No comment provided by engineer. + + + Your chat database is not encrypted - set passphrase to encrypt it. + No comment provided by engineer. + + + Your chat preferences + alert title + + + Your chat profiles + No comment provided by engineer. + + + Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. + alert message + + + Your connection was moved to %@ but an error happened when switching profile. + No comment provided by engineer. + + + Your contact + No comment provided by engineer. + + + Your contact removed this link, or it was a one-time link that was already used. +To connect, ask your contact to create a new link. + No comment provided by engineer. + + + Your contact sent a file that is larger than currently supported maximum size (%@). + No comment provided by engineer. + + + Your contacts can allow full message deletion. + No comment provided by engineer. + + + Your contacts will remain connected. + No comment provided by engineer. + + + Your conversations belong to you, as it had always been before the Internet. The network is not a place you visit. It is a place you create and own. And nobody can take it from you, whether you make it private or public. + No comment provided by engineer. + + + Your credentials may be sent unencrypted. + No comment provided by engineer. + + + Your current chat database will be DELETED and REPLACED with the imported one. + No comment provided by engineer. + + + Your current profile + No comment provided by engineer. + + + Your group + No comment provided by engineer. + + + Your network + No comment provided by engineer. + + + Your new channel %1$@ is connected to %2$d of %3$d relays. +If you cancel, the channel will be deleted - you can create it again. + alert message + + + Your preferences + No comment provided by engineer. + + + Your privacy + No comment provided by engineer. + + + Your profile + No comment provided by engineer. + + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + + + Your profile **%@** will be shared. + No comment provided by engineer. + + + Your profile is stored on your device and only shared with your contacts. + No comment provided by engineer. + + + Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile. + No comment provided by engineer. + + + Your profile was changed. If you save it, the updated profile will be sent to all your contacts. + alert message + + + Your public address + No comment provided by engineer. + + + Your random profile + No comment provided by engineer. + + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + + + Your server address + No comment provided by engineer. + + + Your servers + No comment provided by engineer. + + + Your settings + No comment provided by engineer. + + + [Send us email](mailto:chat@simplex.chat) + No comment provided by engineer. + + + \_italic_ + No comment provided by engineer. + + + \`a + b` + No comment provided by engineer. + + + above, then choose: + No comment provided by engineer. + + + accepted + No comment provided by engineer. + + + accepted %@ + rcv group event chat item + + + accepted call + call status + + + accepted invitation + chat list item title + + + accepted you + rcv group event chat item + + + acknowledged roster + No comment provided by engineer. + + + active + No comment provided by engineer. + + + admin + member role + + + admins + feature role + + + agreeing encryption for %@… + chat item text + + + agreeing encryption… + chat item text + + + all + member criteria value + + + all members + feature role + + + always + pref value + + + and %lld other events + No comment provided by engineer. + + + archived report + No comment provided by engineer. + + + attempts + No comment provided by engineer. + + + audio call (not e2e encrypted) + No comment provided by engineer. + + + author + member role + + + bad message ID + integrity error chat item + + + bad message hash + integrity error chat item + + + blocked + marked deleted chat item preview text + + + blocked %@ + rcv group event chat item + + + blocked by admin + blocked chat item +marked deleted chat item preview text + + + bold + No comment provided by engineer. + + + call + No comment provided by engineer. + + + call error + call status + + + call in progress + call status + + + calling… + call status + + + can't broadcast + No comment provided by engineer. + + + can't send messages + No comment provided by engineer. + + + cancelled %@ + feature offered item + + + changed address for you + chat item text + + + changed role of %1$@ to %2$@ + rcv group event chat item + + + changed your role to %@ + rcv group event chat item + + + changing address for %@… + chat item text + + + changing address… + chat item text + + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + + + colored + No comment provided by engineer. + + + complete + No comment provided by engineer. + + + connect to SimpleX Chat developers. + No comment provided by engineer. + + + connected + No comment provided by engineer. + + + connecting + No comment provided by engineer. + + + connecting (accepted) + No comment provided by engineer. + + + connecting (announced) + No comment provided by engineer. + + + connecting (introduced) + No comment provided by engineer. + + + connecting (introduction invitation) + No comment provided by engineer. + + + connecting call… + call status + + + connecting… + No comment provided by engineer. + + + connection established + chat list item title (it should not be shown + + + connection:%@ + connection information + + + contact %1$@ changed to %2$@ + profile update event chat item + + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + + + contact has e2e encryption + No comment provided by engineer. + + + contact has no e2e encryption + No comment provided by engineer. + + + contact not ready + No comment provided by engineer. + + + contact should accept… + No comment provided by engineer. + + + contributor + member role + + + creator + No comment provided by engineer. + + + custom + dropdown time picker choice + + + database version is newer than the app, but no down migration for: %@ + No comment provided by engineer. + + + days + time unit + + + decryption errors + No comment provided by engineer. + + + default (%@) + delete after time +pref value + + + default (no) + No comment provided by engineer. + + + default (yes) + No comment provided by engineer. + + + deleted + deleted chat item + + + deleted channel + rcv group event chat item + + + deleted contact + rcv direct event chat item + + + deleted group + rcv group event chat item + + + different migration in the app/database: %@ / %@ + No comment provided by engineer. + + + direct + connection level description + + + disabled + No comment provided by engineer. + + + duplicate message + integrity error chat item + + + duplicates + No comment provided by engineer. + + + e2e encrypted + No comment provided by engineer. + + + enabled + enabled status + + + enabled for contact + enabled status + + + enabled for you + enabled status + + + encryption agreed + chat item text + + + encryption agreed for %@ + chat item text + + + encryption ok + chat item text + + + encryption ok for %@ + chat item text + + + encryption re-negotiation allowed + chat item text + + + encryption re-negotiation allowed for %@ + chat item text + + + encryption re-negotiation required + chat item text + + + encryption re-negotiation required for %@ + chat item text + + + ended + No comment provided by engineer. + + + ended call %@ + call status + + + error + No comment provided by engineer. + + + error: %@ + receive error chat item + + + expired + No comment provided by engineer. + + + failed + No comment provided by engineer. + + + forwarded + No comment provided by engineer. + + + group + shown on group welcome message + + + group deleted + No comment provided by engineer. + + + group is deleted + No comment provided by engineer. + + + group profile updated + snd group event chat item + + + hours + time unit + + + https:// + No comment provided by engineer. + + + iOS Keychain is used to securely store passphrase - it allows receiving push notifications. + No comment provided by engineer. + + + iOS Keychain will be used to securely store passphrase after you restart the app or change passphrase - it will allow receiving push notifications. + No comment provided by engineer. + + + inactive + No comment provided by engineer. + + + incognito via contact address link + chat list item description + + + incognito via group link + chat list item description + + + incognito via one-time link + chat list item description + + + indirect (%d) + connection level description + + + invalid chat + invalid chat data + + + invalid chat data + No comment provided by engineer. + + + invalid data + invalid chat item + + + invitation to group %@ + group name + + + invite + No comment provided by engineer. + + + invited + No comment provided by engineer. + + + invited %@ + rcv group event chat item + + + invited to connect + chat list item title + + + invited via your group link + rcv group event chat item + + + italic + No comment provided by engineer. + + + left + rcv group event chat item + + + link + No comment provided by engineer. + + + marked deleted + marked deleted chat item preview text + + + member + member role + + + member %1$@ changed to %2$@ + profile update event chat item + + + connected + rcv group event chat item + + + member has old version + No comment provided by engineer. + + + message + No comment provided by engineer. + + + message received + notification + + + minutes + time unit + + + missed call + call status + + + moderated + moderated chat item + + + moderated by %@ + marked deleted chat item preview text + + + moderator + member role + + + months + time unit + + + never + delete after time + + + new + No comment provided by engineer. + + + new message + notification + + + no + pref value + + + no e2e encryption + No comment provided by engineer. + + + no subscription + No comment provided by engineer. + + + no text + copied message info in history + + + not synchronized + No comment provided by engineer. + + + observer + member role + + + off + enabled status +group pref value +member criteria value +time to disappear + + + offered %@ + feature offered item + + + offered %1$@: %2$@ + feature offered item + + + on + group pref value + + + other + No comment provided by engineer. + + + other errors + No comment provided by engineer. + + + owner + member role + + + owners + feature role + + + peer-to-peer + No comment provided by engineer. + + + pending + No comment provided by engineer. + + + pending approval + No comment provided by engineer. + + + pending review + No comment provided by engineer. + + + quantum resistant e2e encryption + chat item text + + + received answer… + No comment provided by engineer. + + + received confirmation… + No comment provided by engineer. + + + rejected + No comment provided by engineer. + + + rejected call + call status + + + relay + member role + + + removed + No comment provided by engineer. + + + removed %@ + rcv group event chat item + + + removed (%d attempts) + receive error chat item + + + removed by operator + No comment provided by engineer. + + + removed contact address + profile update event chat item + + + removed from group + No comment provided by engineer. + + + removed profile picture + profile update event chat item + + + removed you + rcv group event chat item + + + request is sent + No comment provided by engineer. + + + request to join rejected + No comment provided by engineer. + + + requested connection + rcv group event chat item + + + requested connection from group %@ + rcv direct event chat item + + + requested to connect + chat list item title + + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + + + saved + No comment provided by engineer. + + + saved from %@ + No comment provided by engineer. + + + search + No comment provided by engineer. + + + sec + network option + + + seconds + time unit + + + secret + No comment provided by engineer. + + + security code changed + chat item text + + + server queue info: %1$@ + +last received msg: %2$@ + queue info + + + 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 + + + starting… + No comment provided by engineer. + + + strike + No comment provided by engineer. + + + subscriber + member role + + + this contact + notification title + + + unblocked %@ + rcv group event chat item + + + unknown + connection info + + + unknown servers + No comment provided by engineer. + + + unknown status + No comment provided by engineer. + + + unprotected + No comment provided by engineer. + + + updated channel profile + rcv group event chat item + + + updated group profile + rcv group event chat item + + + updated profile + profile update event chat item + + + v%@ + No comment provided by engineer. + + + via %@ + relay hostname + + + via contact address link + chat list item description + + + via group link + chat list item description + + + via one-time link + chat list item description + + + via relay + No comment provided by engineer. + + + video + No comment provided by engineer. + + + video call (not e2e encrypted) + No comment provided by engineer. + + + waiting for answer… + No comment provided by engineer. + + + waiting for confirmation… + No comment provided by engineer. + + + wants to connect to you! + No comment provided by engineer. + + + weeks + time unit + + + when IP hidden + No comment provided by engineer. + + + yes + pref value + + + you + No comment provided by engineer. + + + you accepted this member + snd group event chat item + + + you are observer + No comment provided by engineer. + + + you are subscriber + No comment provided by engineer. + + + you blocked %@ + snd group event chat item + + + you changed address + chat item text + + + you changed address for %@ + chat item text + + + you changed role for yourself to %@ + snd group event chat item + + + you changed role of %1$@ to %2$@ + snd group event chat item + + + you left + snd group event chat item + + + you removed %@ + snd group event chat item + + + you shared one-time link + chat list item description + + + you shared one-time link incognito + chat list item description + + + you unblocked %@ + snd group event chat item + + + you: + No comment provided by engineer. + + + \~strike~ + No comment provided by engineer. + + + ⚠️ Signature verification failed: %@. + owner verification + + +
+ +
+ +
+ + + SimpleX + Bundle name + + + SimpleX needs camera access to scan QR codes to connect to other users and for video calls. + Privacy - Camera Usage Description + + + SimpleX uses Face ID for local authentication + Privacy - Face ID Usage Description + + + SimpleX uses local network access to allow using user chat profile via desktop app on the same network. + Privacy - Local Network Usage Description + + + SimpleX needs microphone access for audio and video calls, and to record voice messages. + Privacy - Microphone Usage Description + + + SimpleX needs access to Photo Library for saving captured and received media + Privacy - Photo Library Additions Usage Description + + +
+ +
+ +
+ + + SimpleXChat + Bundle name + + + Copyright © 2022 SimpleX Chat. All rights reserved. + Copyright (human-readable) + + +
+ +
+ +
+ + + SimpleX NSE + Bundle display name + + + SimpleX NSE + Bundle name + + + Copyright © 2022 SimpleX Chat. All rights reserved. + Copyright (human-readable) + + +
+ +
+ +
+ + + %d new events + notification body + + + From %d chat(s) + notification body + + + From: %@ + notification body + + + New events + notification + + + New messages + notification + + +
+ +
+ +
+ + + SimpleX SE + Bundle display name + + + SimpleX SE + Bundle name + + + Copyright © 2024 SimpleX Chat. All rights reserved. + Copyright (human-readable) + + +
+ +
+ +
+ + + %@ + No comment provided by engineer. + + + App is locked! + No comment provided by engineer. + + + Cancel + No comment provided by engineer. + + + Cannot access keychain to save database password + No comment provided by engineer. + + + Cannot forward message + No comment provided by engineer. + + + Comment + No comment provided by engineer. + + + Currently maximum supported file size is %@. + No comment provided by engineer. + + + Database downgrade required + No comment provided by engineer. + + + Database encrypted! + No comment provided by engineer. + + + Database error + No comment provided by engineer. + + + Database passphrase is different from saved in the keychain. + No comment provided by engineer. + + + Database passphrase is required to open chat. + No comment provided by engineer. + + + Database upgrade required + No comment provided by engineer. + + + Error preparing file + No comment provided by engineer. + + + Error preparing message + No comment provided by engineer. + + + Error: %@ + No comment provided by engineer. + + + File error + No comment provided by engineer. + + + Incompatible database version + No comment provided by engineer. + + + Invalid migration confirmation + No comment provided by engineer. + + + Keychain error + No comment provided by engineer. + + + Large file! + No comment provided by engineer. + + + No active profile + No comment provided by engineer. + + + Ok + No comment provided by engineer. + + + Open the app to downgrade the database. + No comment provided by engineer. + + + Open the app to upgrade the database. + No comment provided by engineer. + + + Passphrase + No comment provided by engineer. + + + Please create a profile in the SimpleX app + No comment provided by engineer. + + + Selected chat preferences prohibit this message. + No comment provided by engineer. + + + Sending a message takes longer than expected. + No comment provided by engineer. + + + Sending message… + No comment provided by engineer. + + + Share + No comment provided by engineer. + + + Slow network? + No comment provided by engineer. + + + Unknown database error: %@ + No comment provided by engineer. + + + Unsupported format + No comment provided by engineer. + + + Wait + No comment provided by engineer. + + + Wrong database passphrase + No comment provided by engineer. + + + You can allow sharing in Your privacy / SimpleX Lock settings. + No comment provided by engineer. + + +
+
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 d0e27058e8..9b35dc90e6 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -39,6 +39,10 @@ %1$@ supported SimpleX Chat. The badge expired on %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -152,6 +156,10 @@ %@: copied message info + + %d day + time interval + %d days %d дни @@ -2603,6 +2611,10 @@ This is your own one-time link! Линкът се създава… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder No comment provided by engineer. @@ -6311,18 +6323,10 @@ alert button Отвори миграцията към друго устройство authentication reason - - Open new channel - new chat action - Open new chat new chat action - - Open new group - new chat action - Open to accept No comment provided by engineer. @@ -8287,6 +8291,10 @@ copied message info SimpleX name not verified alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation Еднократна покана за SimpleX @@ -9325,6 +9333,10 @@ You will be prompted to complete authentication before this feature is enabled.< Update settings? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions No comment provided by engineer. @@ -9841,6 +9853,23 @@ alert title Вече имате чат профил със същото име. Моля, изберете друго име. No comment provided by engineer. + + You are a contributor + new chat alert + + + You are a member + Вие сте член + new chat alert + + + You are a moderator + new chat alert + + + You are a subscriber + new chat alert + You are already connected to %@. Вече сте вече свързани с %@. @@ -9882,6 +9911,21 @@ Repeat join request? Изпрати отново заявката за присъединяване? new chat sheet title + + You are an admin + Вие сте админ + new chat alert + + + You are an observer + Вие сте наблюдател + new chat alert + + + You are an owner + Вие сте собственик + new chat alert + You are connected to the server used to receive messages from this connection. subscription status explanation @@ -10815,6 +10859,10 @@ pref value препратено No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group shown on group welcome message @@ -11194,9 +11242,9 @@ time to disappear запазено No comment provided by engineer. - - saved from %@ - запазено от %@ + + saved from + запазено от No comment provided by engineer. @@ -11286,6 +11334,10 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile rcv group event chat item diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff index 26c97d549d..28fc9e9244 100644 --- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff +++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff @@ -39,6 +39,10 @@ %1$@ supported SimpleX Chat. The badge expired on %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -152,6 +156,10 @@ %@: copied message info + + %d day + time interval + %d days %d dní @@ -2499,6 +2507,10 @@ Toto je váš vlastní jednorázový odkaz! Creating link… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder No comment provided by engineer. @@ -6120,18 +6132,10 @@ alert button Open migration to another device authentication reason - - Open new channel - new chat action - Open new chat new chat action - - Open new group - new chat action - Open to accept No comment provided by engineer. @@ -8056,6 +8060,10 @@ copied message info SimpleX name not verified alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation Jednorázová pozvánka SimpleX @@ -9074,6 +9082,10 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření. Update settings? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions No comment provided by engineer. @@ -9567,6 +9579,23 @@ alert title Již máte profil chatu se stejným zobrazovacím názvem. Zvolte prosím jiné jméno. No comment provided by engineer. + + You are a contributor + new chat alert + + + You are a member + Jste člen + new chat alert + + + You are a moderator + new chat alert + + + You are a subscriber + new chat alert + You are already connected to %@. Již jste připojeni k %@. @@ -9601,6 +9630,21 @@ alert title Repeat join request? new chat sheet title + + You are an admin + Jste správce + new chat alert + + + You are an observer + Jste pozorovatel + new chat alert + + + You are an owner + Jste vlastník + new chat alert + You are connected to the server used to receive messages from this connection. subscription status explanation @@ -10519,6 +10563,10 @@ pref value forwarded No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group shown on group welcome message @@ -10892,8 +10940,8 @@ time to disappear saved No comment provided by engineer. - - saved from %@ + + saved from No comment provided by engineer. @@ -10978,6 +11026,10 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile rcv group event chat item 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 1265c782e0..e139c82f80 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -40,6 +40,10 @@ %1$@ hat SimpleX Chat unterstützt. Das Abzeichen ist am %2$@ abgelaufen. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -155,6 +159,10 @@ %@: copied message info + + %d day + time interval + %d days %d Tage @@ -2527,7 +2535,7 @@ Das ist Ihr eigener Einmal-Link! Contact requests in groups - KONTAKTANFRAGEN VON GRUPPEN + Kontaktanfragen in Gruppen No comment provided by engineer. @@ -2715,12 +2723,18 @@ Das ist Ihr eigener Einmal-Link! Link wird erstellt… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder + Crowdfunding auf Wefunder No comment provided by engineer. Crowdfunding on Wefunder. + Crowdfunding auf Wefunder. No comment provided by engineer. @@ -4780,6 +4794,7 @@ Fehler: %2$@ Group invitations + Gruppeneinladungen No comment provided by engineer. @@ -6744,21 +6759,11 @@ alert button Migration auf ein anderes Gerät öffnen authentication reason - - Open new channel - Neuen Kanal öffnen - new chat action - Open new chat Neuen Chat öffnen new chat action - - Open new group - Neue Gruppe öffnen - new chat action - Open to accept Zum Akzeptieren öffnen @@ -8945,6 +8950,10 @@ copied message info SimpleX-Name ist nicht verifiziert alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation SimpleX-Einmal-Einladung @@ -10098,6 +10107,10 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt Einstellungen aktualisieren? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions Aktualisierte Nutzungsbedingungen @@ -10664,6 +10677,26 @@ alert title Sie haben schon ein Chat-Profil mit dem gleichen Anzeigenamen. Bitte wählen Sie einen anderen Namen aus. No comment provided by engineer. + + You are a contributor + Sie sind Mitwirkender + new chat alert + + + You are a member + Sie sind Mitglied + new chat alert + + + You are a moderator + Sie sind Moderator + new chat alert + + + You are a subscriber + Sie sind Abonnent + new chat alert + You are already connected to %@. Sie sind bereits mit %@ verbunden. @@ -10706,6 +10739,21 @@ Repeat join request? Verbindungsanfrage wiederholen? new chat sheet title + + You are an admin + Sie sind Admin + new chat alert + + + You are an observer + Sie sind Beobachter + new chat alert + + + You are an owner + Sie sind Eigentümer + new chat alert + You are connected to the server used to receive messages from this connection. Sie sind mit dem Server verbunden, der für den Empfang von Nachrichten dieser Verbindung genutzt wird. @@ -10778,10 +10826,12 @@ Verbindungsanfrage wiederholen? You can now invest in SimpleX Chat + Sie können nun in SimpleX-Chat investieren No comment provided by engineer. You can now invest in SimpleX Chat! 🚀 + Sie können nun in SimpleX-Chat investieren! 🚀 No comment provided by engineer. @@ -11708,6 +11758,10 @@ pref value weitergeleitet No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group Gruppe @@ -12116,9 +12170,9 @@ time to disappear abgespeichert No comment provided by engineer. - - saved from %@ - abgespeichert von %@ + + saved from + abgespeichert von No comment provided by engineer. @@ -12215,6 +12269,10 @@ Zuletzt empfangene Nachricht: %2$@ Ungeschützt No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile Kanalprofil aktualisiert @@ -12352,7 +12410,7 @@ Zuletzt empfangene Nachricht: %2$@ you removed %@ - entfernt %@ aus der Gruppe + Sie haben %@ aus der Gruppe entfernt snd group event chat item diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index 38e0ecfe85..184c9fd6b4 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -40,6 +40,11 @@ %1$@ supported SimpleX Chat. The badge expired on %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -155,6 +160,11 @@ %@: copied message info + + %d day + %d day + time interval + %d days %d days @@ -2715,6 +2725,11 @@ This is your own one-time link! Creating link… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder Crowdfunding on Wefunder @@ -6747,21 +6762,11 @@ alert button Open migration to another device authentication reason - - Open new channel - Open new channel - new chat action - Open new chat Open new chat new chat action - - Open new group - Open new group - new chat action - Open to accept Open to accept @@ -8948,6 +8953,11 @@ copied message info SimpleX name not verified alert title + + SimpleX name sale starts in + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation SimpleX one-time invitation @@ -10101,6 +10111,11 @@ You will be prompted to complete authentication before this feature is enabled.< Update settings? No comment provided by engineer. + + Update the app to register a SimpleX domain + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions Updated conditions @@ -10667,6 +10682,26 @@ alert title You already have a chat profile with the same display name. Please choose another name. No comment provided by engineer. + + You are a contributor + You are a contributor + new chat alert + + + You are a member + You are a member + new chat alert + + + You are a moderator + You are a moderator + new chat alert + + + You are a subscriber + You are a subscriber + new chat alert + You are already connected to %@. You are already connected to %@. @@ -10709,6 +10744,21 @@ Repeat join request? Repeat join request? new chat sheet title + + You are an admin + You are an admin + new chat alert + + + You are an observer + You are an observer + new chat alert + + + You are an owner + You are an owner + new chat alert + You are connected to the server used to receive messages from this connection. You are connected to the server used to receive messages from this connection. @@ -11713,6 +11763,11 @@ pref value forwarded No comment provided by engineer. + + forwarded from + forwarded from + No comment provided by engineer. + group group @@ -12121,9 +12176,9 @@ time to disappear saved No comment provided by engineer. - - saved from %@ - saved from %@ + + saved from + saved from No comment provided by engineer. @@ -12220,6 +12275,11 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + until you can register a SimpleX domain + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile updated channel profile 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 60f0dd3e2d..c898d8b893 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -40,6 +40,10 @@ %1$@ ha apoyado a SimpleX Chat. La insignia caducó el %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -155,6 +159,10 @@ %@: copied message info + + %d day + time interval + %d days %d día(s) @@ -2715,12 +2723,18 @@ This is your own one-time link! Creando enlace… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder + Crowdfunding en Wefunder No comment provided by engineer. Crowdfunding on Wefunder. + Crowdfunding en Wefunder. No comment provided by engineer. @@ -4780,6 +4794,7 @@ Error: %2$@ Group invitations + Invitaciones en grupo No comment provided by engineer. @@ -6744,21 +6759,11 @@ alert button Abrir menú migración a otro dispositivo authentication reason - - Open new channel - Abrir canal nuevo - new chat action - Open new chat Abrir chat nuevo new chat action - - Open new group - Abrir grupo nuevo - new chat action - Open to accept Abrir para aceptar @@ -8945,6 +8950,10 @@ copied message info Nombre SimpleX no verificado alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation Invitación SimpleX de un uso @@ -10098,6 +10107,10 @@ Se te pedirá que completes la autenticación antes de activar esta función.¿Actualizar configuración? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions Condiciones actualizadas @@ -10664,6 +10677,26 @@ alert title Ya tienes un perfil con este nombre mostrado. Por favor, elige otro nombre. No comment provided by engineer. + + You are a contributor + Eres colaborador + new chat alert + + + You are a member + Eres miembro + new chat alert + + + You are a moderator + Eres moderador + new chat alert + + + You are a subscriber + Eres suscriptor + new chat alert + You are already connected to %@. Ya estás conectado con %@. @@ -10706,6 +10739,21 @@ Repeat join request? ¿Repetir solicitud de admisión? new chat sheet title + + You are an admin + Eres administrador + new chat alert + + + You are an observer + Eres observador + new chat alert + + + You are an owner + Eres propietario + new chat alert + You are connected to the server used to receive messages from this connection. Estás conectado al servidor usado para recibir mensajes de esta conexión. @@ -10778,10 +10826,12 @@ Repeat join request? You can now invest in SimpleX Chat + Ahora puedes invertir en SimpleX Chat No comment provided by engineer. You can now invest in SimpleX Chat! 🚀 + Ahora puedes invertir en SimpleX Chat! 🚀 No comment provided by engineer. @@ -11708,6 +11758,10 @@ pref value reenviado No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group grupo @@ -12116,9 +12170,9 @@ time to disappear guardado No comment provided by engineer. - - saved from %@ - Guardado desde %@ + + saved from + Guardado desde No comment provided by engineer. @@ -12215,6 +12269,10 @@ last received msg: %2$@ desprotegida No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile perfil del canal actualizado diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff index 78caebe522..e01c47949d 100644 --- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff +++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff @@ -39,6 +39,10 @@ %1$@ supported SimpleX Chat. The badge expired on %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ % @ @@ -144,6 +148,10 @@ %@: copied message info + + %d day + time interval + %d days %d päivää @@ -2386,6 +2394,10 @@ This is your own one-time link! Creating link… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder No comment provided by engineer. @@ -6000,18 +6012,10 @@ alert button Open migration to another device authentication reason - - Open new channel - new chat action - Open new chat new chat action - - Open new group - new chat action - Open to accept No comment provided by engineer. @@ -7935,6 +7939,10 @@ copied message info SimpleX name not verified alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation SimpleX-kertakutsu @@ -8948,6 +8956,10 @@ Sinua kehotetaan suorittamaan todennus loppuun, ennen kuin tämä ominaisuus ote Update settings? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions No comment provided by engineer. @@ -9441,6 +9453,23 @@ alert title Sinulla on jo keskusteluprofiili samalla näyttönimellä. Valitse toinen nimi. No comment provided by engineer. + + You are a contributor + new chat alert + + + You are a member + Olet jäsen + new chat alert + + + You are a moderator + new chat alert + + + You are a subscriber + new chat alert + You are already connected to %@. Olet jo muodostanut yhteyden %@:n kanssa. @@ -9475,6 +9504,21 @@ alert title Repeat join request? new chat sheet title + + You are an admin + Olet ylläpitäjä + new chat alert + + + You are an observer + Olet tarkkailija + new chat alert + + + You are an owner + Olet omistaja + new chat alert + You are connected to the server used to receive messages from this connection. subscription status explanation @@ -10391,6 +10435,10 @@ pref value forwarded No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group shown on group welcome message @@ -10764,8 +10812,8 @@ time to disappear saved No comment provided by engineer. - - saved from %@ + + saved from No comment provided by engineer. @@ -10850,6 +10898,10 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile rcv group event chat item 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 78e8e30096..b4afa63843 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -40,6 +40,10 @@ %1$@ a soutenu SimpleX Chat. Le badge a expiré le %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -155,6 +159,10 @@ %@ : copied message info + + %d day + time interval + %d days %d jours @@ -327,7 +335,7 @@ channel relay bar %lld file(s) with total size of %@ - %lld fichier·s pour une taille totale de %@ + %lld fichier(s) pour une taille totale de %@ No comment provided by engineer. @@ -509,7 +517,7 @@ channel relay bar - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). - faster and more stable. - - connexion au [service d'annuaire](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA) ! + - connexion au [service d'annuaire](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) (BÊTA) ! - les accusés de réception (jusqu'à 20 membres). - plus rapide et plus stable. No comment provided by engineer. @@ -938,7 +946,7 @@ swipe action All chats and messages will be deleted - this cannot be undone! - Toutes les conversations et tous les messages seront supprimés - il est impossible de revenir en arrière ! + Toutes les conversations et tous les messages seront supprimés — cette action est irréversible ! No comment provided by engineer. @@ -973,12 +981,12 @@ swipe action All messages will be deleted - this cannot be undone! - Tous les messages seront supprimés - il n'est pas possible de revenir en arrière ! + Tous les messages seront supprimés — cette action est irréversible ! No comment provided by engineer. All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you. - Tous les messages seront supprimés - impossible de revenir en arrière ! Les messages seront supprimés UNIQUEMENT pour vous. + Tous les messages seront supprimés — cette action est irréversible ! Les messages seront supprimés UNIQUEMENT pour vous. No comment provided by engineer. @@ -1640,7 +1648,7 @@ au sein de votre réseau By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA). - Par profil de messagerie (par défaut) ou [par connexion](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA). + Par profil de messagerie (par défaut) ou [par connexion](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BÊTA). No comment provided by engineer. @@ -1864,12 +1872,12 @@ alert subtitle Channel will be deleted for all subscribers - this cannot be undone! - Le canal sera supprimé pour tous les abonné·es ; ceci ne peut pas être annulé ! + Le canal sera supprimé pour tous les abonnés — cette action est irréversible ! No comment provided by engineer. Channel will be deleted for you - this cannot be undone! - Le canal sera supprimé pour vous ; ceci ne peut pas être annulé ! + Le canal sera supprimé pour vous — cette action est irréversible ! No comment provided by engineer. @@ -1999,12 +2007,12 @@ alert subtitle Chat will be deleted for all members - this cannot be undone! - La conversation sera supprimée pour tous les membres - cela ne peut pas être annulé ! + La conversation sera supprimée pour tous les membres — cette action est irréversible ! No comment provided by engineer. Chat will be deleted for you - this cannot be undone! - La conversation sera supprimée pour vous - il n'est pas possible de revenir en arrière ! + La conversation sera supprimée pour vous — cette action est irréversible ! No comment provided by engineer. @@ -2532,7 +2540,7 @@ Il s'agit de votre propre lien unique ! Contact will be deleted - this cannot be undone! - Le contact sera supprimé - il n'est pas possible de revenir en arrière ! + Le contact sera supprimé — cette action est irréversible ! No comment provided by engineer. @@ -2715,12 +2723,18 @@ Il s'agit de votre propre lien unique ! Création d'un lien… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder + Financement participatif sur Wefunder No comment provided by engineer. Crowdfunding on Wefunder. + Financement participatif sur Wefunder. No comment provided by engineer. @@ -3235,7 +3249,7 @@ alert button Developer - Outils du développeur + Outils développeur No comment provided by engineer. @@ -3250,12 +3264,12 @@ alert button Device authentication is disabled. Turning off SimpleX Lock. - L'authentification de l'appareil est désactivée. Désactivation de SimpleX Lock. + L'authentification de l'appareil est désactivée. Désactivation du Verrouillage SimpleX. No comment provided by engineer. Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication. - L'authentification de l'appareil n'est pas activée. Vous pouvez activer SimpleX Lock via Paramètres, une fois que vous avez activé l'authentification de l'appareil. + L'authentification de l'appareil n'est pas activée. Vous pouvez activer le Verrouillage SimpleX dans les Paramètres une fois l'authentification de l'appareil activée. No comment provided by engineer. @@ -3295,7 +3309,7 @@ alert button Disable SimpleX Lock - Désactiver SimpleX Lock + Désactiver le Verrouillage SimpleX authentication reason @@ -3556,12 +3570,12 @@ chat item action Enable Flux in Network & servers settings for better metadata privacy. - Activez Flux dans les paramètres du réseau et des serveurs pour une meilleure confidentialité des métadonnées. + Activez Flux dans les paramètres Réseau et serveurs pour une meilleure confidentialité des métadonnées. No comment provided by engineer. Enable SimpleX Lock - Activer SimpleX Lock + Activer le Verrouillage SimpleX authentication reason @@ -3571,7 +3585,7 @@ chat item action Enable at least one chat relay in Network & Servers. - Activez au moins un relais de messagerie dans Réseaux et serveurs. + Activez au moins un relais de messagerie dans Réseau et serveurs. channel creation warning @@ -3601,7 +3615,7 @@ chat item action Enable in direct chats (BETA)! - Activer dans les conversations directes (BETA) ! + Activer dans les conversations directes (BÊTA) ! No comment provided by engineer. @@ -4705,7 +4719,7 @@ Erreur : %2$@ Get SimpleX name (BETA) - Obtenir un nom SimpleX (BETA) + Obtenir un nom SimpleX (BÊTA) No comment provided by engineer. @@ -4780,6 +4794,7 @@ Erreur : %2$@ Group invitations + Invitations de groupe No comment provided by engineer. @@ -4834,12 +4849,12 @@ Erreur : %2$@ Group will be deleted for all members - this cannot be undone! - Le groupe va être supprimé pour tout les membres - impossible de revenir en arrière ! + Le groupe va être supprimé pour tout les membres — cette action est irréversible ! No comment provided by engineer. Group will be deleted for you - this cannot be undone! - Le groupe va être supprimé pour vous - impossible de revenir en arrière ! + Le groupe va être supprimé pour vous — cette action est irréversible ! No comment provided by engineer. @@ -5691,7 +5706,7 @@ Voici votre lien pour le groupe %@ ! Member messages will be deleted - this cannot be undone! - Les messages des membres seront supprimés ; ceci ne peut pas être annulé ! + Les messages des membres seront supprimés — cette action est irréversible ! alert message @@ -5701,12 +5716,12 @@ Voici votre lien pour le groupe %@ ! Member will be removed from chat - this cannot be undone! - Le membre sera retiré de la conversation - cette action est irréversible ! + Le membre sera retiré de la conversation — cette action est irréversible ! alert message Member will be removed from group - this cannot be undone! - Ce membre sera retiré du groupe - impossible de revenir en arrière ! + Ce membre sera retiré du groupe — cette action est irréversible ! alert message @@ -6450,7 +6465,7 @@ Le chiffrement le plus sûr. Not a better lock on someone else's door. Not a nicer landlord that respects your privacy, but still keeps the record of all visitors. You are not a guest. You are home. No king can enter it - you are sovereign. - Ce n’est pas une meilleure serrure sur la porte de quelqu’un d’autre. Ce n’est pas un propriétaire plus aimable qui respecte votre vie privée, mais qui tient tout de même un registre de tous les visiteurs. Vous n’êtes pas un·e invité·e, vous êtes chez vous. Aucun roi ne peut y entrer : c’est vous le souverain. + Ce n’est pas une meilleure serrure sur la porte de quelqu'un d'autre. Ni un propriétaire plus attentionné qui respecte votre vie privée, mais conserve toujours le registre de tous les visiteurs. Vous n'êtes pas un invité. Vous êtes chez vous. Aucun roi ne peut y entrer — vous êtes souverain. No comment provided by engineer. @@ -6744,21 +6759,11 @@ alert button Ouvrir le transfert vers un autre appareil authentication reason - - Open new channel - Ouvrir un nouveau canal - new chat action - Open new chat Ouvrir une nouvelle conversation new chat action - - Open new group - Ouvrir le nouveau groupe - new chat action - Open to accept Ouvrir pour accepter @@ -7123,7 +7128,7 @@ Erreur : %@ Privacy for your customers. - Respect de la vie privée de vos clients. + Confidentialité pour vos clients. No comment provided by engineer. @@ -7583,7 +7588,7 @@ swipe action Relay will be removed from channel - this cannot be undone! - Le relais sera supprimé du canal ; cette action est irréversible ! + Le relais sera supprimé du canal — cette action est irréversible ! alert message @@ -7863,7 +7868,7 @@ swipe action Review members before admitting ("knocking"). - Contrôler les membres avant de les admettre (« toquer »). + Examiner les membres avant leur admission (« frapper à la porte »). admission stage description @@ -8540,7 +8545,7 @@ chat item action Servers statistics will be reset - this cannot be undone! - Les statistiques des serveurs seront réinitialisées - il n'est pas possible de revenir en arrière ! + Les statistiques des serveurs seront réinitialisées — cette action est irréversible ! No comment provided by engineer. @@ -8857,22 +8862,22 @@ copied message info SimpleX Lock - SimpleX Lock + Verrouillage SimpleX No comment provided by engineer. SimpleX Lock mode - Mode de SimpleX Lock + Mode de Verrouillage SimpleX No comment provided by engineer. SimpleX Lock not enabled! - SimpleX Lock n'est pas activé ! + Le Verrouillage SimpleX n'est pas activé ! No comment provided by engineer. SimpleX Lock turned on - SimpleX Lock activé + Verrouillage SimpleX activé No comment provided by engineer. @@ -8945,6 +8950,10 @@ copied message info Nom SimpleX non vérifié alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation Invitation unique SimpleX @@ -8957,7 +8966,7 @@ copied message info SimpleX public names (BETA) - Noms publics SimpleX (BETA) + Noms publics SimpleX (BÊTA) No comment provided by engineer. @@ -9160,7 +9169,7 @@ report reason Subscriber will be removed from channel - this cannot be undone! - L'abonné sera supprimé du canal ; cette action est irréversible ! + L'abonné sera supprimé du canal — cette action est irréversible ! alert message @@ -9652,22 +9661,22 @@ vos contacts et vos groupes. This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain. - Cette action ne peut être annulée - tous les fichiers et médias reçus et envoyés seront supprimés. Les photos à faible résolution seront conservées. + Cette action est irréversible — tous les fichiers et médias reçus et envoyés seront supprimés. Les photos à faible résolution seront conservées. No comment provided by engineer. This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes. - Cette action ne peut être annulée - les messages envoyés et reçus avant la date sélectionnée seront supprimés. Cela peut prendre plusieurs minutes. + Cette action est irréversible — les messages envoyés et reçus avant la date sélectionnée seront supprimés. Cela peut prendre plusieurs minutes. No comment provided by engineer. This action cannot be undone - the messages sent and received in this chat earlier than selected will be deleted. - Cette action est irréversible : les messages envoyés et reçus dans cette conversation avant la date sélectionnée seront supprimés. + Cette action est irréversible — les messages envoyés et reçus dans cette conversation avant la date sélectionnée seront supprimés. alert message This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost. - Cette action ne peut être annulée - votre profil, vos contacts, vos messages et vos fichiers seront irréversiblement perdus. + Cette action est irréversible — votre profil, vos contacts, vos messages et vos fichiers seront irréversiblement perdus. No comment provided by engineer. @@ -9799,8 +9808,8 @@ alert subtitle To protect your information, turn on SimpleX Lock. You will be prompted to complete authentication before this feature is enabled. - Pour protéger vos informations, activez la fonction SimpleX Lock. -Vous serez invité à confirmer l'authentification avant que cette fonction ne soit activée. + Pour protéger vos informations, activez le Verrouillage SimpleX. +Une authentification vous sera demandée avant que cette fonctionnalité ne soit activée. No comment provided by engineer. @@ -10098,6 +10107,10 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s Mettre à jour les paramètres ? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions Conditions mises à jour @@ -10664,6 +10677,26 @@ alert title Vous avez déjà un profil de messagerie avec le même nom d’affichage. Veuillez choisir un autre nom. No comment provided by engineer. + + You are a contributor + Vous êtes contributeur + new chat alert + + + You are a member + Vous êtes membre + new chat alert + + + You are a moderator + Vous êtes modérateur + new chat alert + + + You are a subscriber + Vous êtes abonné·e + new chat alert + You are already connected to %@. Vous êtes déjà connecté·e à %@ via ce lien. @@ -10706,6 +10739,21 @@ Repeat join request? Répéter la demande d'adhésion ? new chat sheet title + + You are an admin + Vous êtes admin + new chat alert + + + You are an observer + Vous êtes observateur + new chat alert + + + You are an owner + Vous êtes propriétaire + new chat alert + You are connected to the server used to receive messages from this connection. Vous êtes connecté au serveur utilisé pour recevoir les messages de cette connexion. @@ -10753,7 +10801,7 @@ Répéter la demande d'adhésion ? You can enable them later via app Your privacy settings. - Vous pourrez les activer plus tard dans les paramètres « Votre vie privée ». + Vous pouvez les activer plus tard dans les paramètres de confidentialité de l'application. No comment provided by engineer. @@ -10778,10 +10826,12 @@ Répéter la demande d'adhésion ? You can now invest in SimpleX Chat + Vous pouvez désormais investir dans SimpleX Chat No comment provided by engineer. You can now invest in SimpleX Chat! 🚀 + Vous pouvez désormais investir dans SimpleX Chat ! 🚀 No comment provided by engineer. @@ -10831,7 +10881,7 @@ Répéter la demande d'adhésion ? You can turn on SimpleX Lock via Settings. - Vous pouvez activer SimpleX Lock dans les Paramètres. + Vous pouvez activer le Verrouillage SimpleX dans les Paramètres. No comment provided by engineer. @@ -11136,7 +11186,7 @@ Si vous annulez, le canal sera supprimé : vous pourrez le recréer. Your privacy - Votre vie privée + Votre confidentialité No comment provided by engineer. @@ -11708,6 +11758,10 @@ pref value transféré No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group groupe @@ -12116,9 +12170,9 @@ time to disappear enregistré No comment provided by engineer. - - saved from %@ - enregistré à partir de %@ + + saved from + enregistré à partir de No comment provided by engineer. @@ -12215,6 +12269,10 @@ dernier message reçu : %2$@ non protégé No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile profil du canal mis à jour @@ -12702,7 +12760,7 @@ dernier message reçu : %2$@ You can allow sharing in Your privacy / SimpleX Lock settings. - Vous pouvez autoriser le partage dans Votre vie privée / Réglages de verrouillage SimpleX. + Vous pouvez autoriser le partage dans les paramètres Votre confidentialité / Verrouillage SimpleX. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff index 4663996480..9093d33a0e 100644 --- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff +++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff @@ -40,6 +40,10 @@ %1$@ támogatta a SimpleX Chatet. A kitűző lejárt ekkor: %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -155,6 +159,10 @@ %@: copied message info + + %d day + time interval + %d days %d nap @@ -1640,7 +1648,7 @@ a saját hálózatában By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA). - A csevegési profillal (alapértelmezett), vagy a [kapcsolattal] (https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (béta). + A csevegési profillal (alapértelmezés), vagy a [kapcsolattal](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (béta). No comment provided by engineer. @@ -2715,12 +2723,18 @@ Ez a saját egyszer használható meghívója! Hivatkozás létrehozása… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder + Közösségi finanszírozás a Wefunder oldalon No comment provided by engineer. Crowdfunding on Wefunder. + Közösségi finanszírozás a Wefunder oldalon. No comment provided by engineer. @@ -3591,7 +3605,7 @@ chat item action Enable disappearing messages by default. - Eltűnő üzenetek engedélyezése alapértelmezetten. + Eltűnő üzenetek engedélyezése alapértelmezésként. No comment provided by engineer. @@ -4780,6 +4794,7 @@ Hiba: %2$@ Group invitations + Meghívások csoportokba No comment provided by engineer. @@ -5151,7 +5166,7 @@ További fejlesztések hamarosan! Info - Információ + Adatok chat item action @@ -5811,7 +5826,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Message queue info - Üzenet várólista-információi + Üzenet várólistaadatai No comment provided by engineer. @@ -6305,7 +6320,7 @@ A legbiztonságosabb titkosítás. No delivery information - Nincs kézbesítési információ + Nincsenek kézbesítési adatok No comment provided by engineer. @@ -6335,7 +6350,7 @@ A legbiztonságosabb titkosítás. No info, try to reload - Nincs információ, próbálja meg újratölteni + Nincsenek adatok, próbálja meg újratölteni No comment provided by engineer. @@ -6744,21 +6759,11 @@ alert button Átköltöztetés indítása egy másik eszközre authentication reason - - Open new channel - Új csatorna megnyitása - new chat action - Open new chat Új csevegés megnyitása new chat action - - Open new group - Új csoport megnyitása - new chat action - Open to accept Megnyitás az elfogadáshoz @@ -7376,12 +7381,12 @@ Engedélyezze a *Hálózat és kiszolgálók* menüben. Read more in User Guide. - További információkat a használati útmutatóban talál. + További tudnivalókat a használati útmutatóban talál. No comment provided by engineer. Read more in our GitHub repository. - További információkat a GitHub-tárolónkban talál. + További tudnivalókat a GitHub-tárolónkban talál. No comment provided by engineer. @@ -7793,7 +7798,7 @@ swipe action Reset to defaults - Visszaállítás alapértelmezettre + Visszaállítás alapértelmezésre No comment provided by engineer. @@ -8535,7 +8540,7 @@ chat item action Servers info - Információk a kiszolgálókról + Kiszolgálóadatok No comment provided by engineer. @@ -8945,6 +8950,10 @@ copied message info Nincs ellenőrizve a SimpleX-név alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation Egyszer használható SimpleX meghívó @@ -10098,6 +10107,10 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll Frissíti a beállításokat? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions Frissített feltételek @@ -10664,6 +10677,26 @@ alert title Már van egy csevegési profil ugyanezzel a megjelenítendő névvel. Válasszon egy másik nevet. No comment provided by engineer. + + You are a contributor + Ön közreműködő + new chat alert + + + You are a member + Ön tag + new chat alert + + + You are a moderator + Ön moderátor + new chat alert + + + You are a subscriber + Ön feliratkozó + new chat alert + You are already connected to %@. Ön már kapcsolódott a következőhöz: %@. @@ -10706,6 +10739,21 @@ Repeat join request? Megismétli a csatlakozási kérést? new chat sheet title + + You are an admin + Ön adminisztrátor + new chat alert + + + You are an observer + Ön megfigyelő + new chat alert + + + You are an owner + Ön tulajdonos + new chat alert + You are connected to the server used to receive messages from this connection. Ön kapcsolódott ahhoz a kiszolgálóhoz, amely az adott partnerétől érkező üzenetek fogadására szolgál. @@ -10778,10 +10826,12 @@ Megismétli a csatlakozási kérést? You can now invest in SimpleX Chat + Mostantól befektethet a SimpleX Chatbe No comment provided by engineer. You can now invest in SimpleX Chat! 🚀 + Mostantól befektethet a SimpleX Chatbe! 🚀 No comment provided by engineer. @@ -11554,18 +11604,18 @@ marked deleted chat item preview text default (%@) - alapértelmezett (%@) + alapértelmezés (%@) delete after time pref value default (no) - alapértelmezett (nem) + alapértelmezés (nem) No comment provided by engineer. default (yes) - alapértelmezett (igen) + alapértelmezés (igen) No comment provided by engineer. @@ -11708,6 +11758,10 @@ pref value továbbított No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group csoport @@ -12116,9 +12170,9 @@ time to disappear mentett No comment provided by engineer. - - saved from %@ - mentve innen: %@ + + saved from + mentve innen: No comment provided by engineer. @@ -12150,7 +12204,7 @@ time to disappear server queue info: %1$@ last received msg: %2$@ - kiszolgáló várólista-információi: %1$@ + kiszolgáló várólistaadatai: %1$@ utoljára fogadott üzenet: %2$@ queue info @@ -12215,6 +12269,10 @@ utoljára fogadott üzenet: %2$@ nem védett No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile frissítette a csatorna profilját 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 80f6c9a224..e6136681a0 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -40,6 +40,10 @@ %1$@ ha sostenuto SimpleX Chat. La targhetta è scaduta il %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -155,6 +159,10 @@ %@: copied message info + + %d day + time interval + %d days %d giorni @@ -2715,12 +2723,18 @@ Questo è il tuo link una tantum! Creazione link… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder + Raccolta fondi su Wefunder No comment provided by engineer. Crowdfunding on Wefunder. + Raccolta fondi su Wefunder. No comment provided by engineer. @@ -4780,6 +4794,7 @@ Errore: %2$@ Group invitations + Inviti in gruppi No comment provided by engineer. @@ -6744,21 +6759,11 @@ alert button Apri migrazione ad un altro dispositivo authentication reason - - Open new channel - Apri il nuovo canale - new chat action - Open new chat Apri la nuova chat new chat action - - Open new group - Apri il nuovo gruppo - new chat action - Open to accept Apri per accettare @@ -8945,6 +8950,10 @@ copied message info Nome SimpleX non verificato alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation Invito SimpleX una tantum @@ -10098,6 +10107,10 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio Aggiornare le impostazioni? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions Condizioni aggiornate @@ -10664,6 +10677,26 @@ alert title Hai già un profilo chat con lo stesso nome da mostrare. Scegli un altro nome. No comment provided by engineer. + + You are a contributor + Sei un collaboratore + new chat alert + + + You are a member + Sei un membro + new chat alert + + + You are a moderator + Sei un moderatore + new chat alert + + + You are a subscriber + Sei iscritto/a + new chat alert + You are already connected to %@. Sei già connesso/a a %@. @@ -10706,6 +10739,21 @@ Repeat join request? Ripetere la richiesta di ingresso? new chat sheet title + + You are an admin + Sei un amministratore + new chat alert + + + You are an observer + Sei un osservatore + new chat alert + + + You are an owner + Sei un proprietario + new chat alert + You are connected to the server used to receive messages from this connection. Sei connesso/a al server usato per ricevere messaggi da questa connessione. @@ -10778,10 +10826,12 @@ Ripetere la richiesta di ingresso? You can now invest in SimpleX Chat + Ora puoi investire in SimpleX Chat No comment provided by engineer. You can now invest in SimpleX Chat! 🚀 + Ora puoi investire in SimpleX Chat! 🚀 No comment provided by engineer. @@ -11708,6 +11758,10 @@ pref value inoltrato No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group gruppo @@ -12116,9 +12170,9 @@ time to disappear salvato No comment provided by engineer. - - saved from %@ - salvato da %@ + + saved from + salvato da No comment provided by engineer. @@ -12215,6 +12269,10 @@ ultimo msg ricevuto: %2$@ non protetto No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile profilo del canale aggiornato diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff index 345e6836a6..5d9be60493 100644 --- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff +++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff @@ -39,6 +39,10 @@ %1$@ supported SimpleX Chat. The badge expired on %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -152,6 +156,10 @@ %@: copied message info + + %d day + time interval + %d days %d 日 @@ -2491,6 +2499,10 @@ This is your own one-time link! Creating link… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder No comment provided by engineer. @@ -6120,18 +6132,10 @@ alert button Open migration to another device authentication reason - - Open new channel - new chat action - Open new chat new chat action - - Open new group - new chat action - Open to accept No comment provided by engineer. @@ -8048,6 +8052,10 @@ copied message info SimpleX name not verified alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation SimpleX使い捨て招待リンク @@ -9061,6 +9069,10 @@ You will be prompted to complete authentication before this feature is enabled.< Update settings? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions No comment provided by engineer. @@ -9554,6 +9566,23 @@ alert title 同じ表示名前のチャットプロフィールが既にあります。別のを選んでください。 No comment provided by engineer. + + You are a contributor + new chat alert + + + You are a member + あなたはメンバーです + new chat alert + + + You are a moderator + new chat alert + + + You are a subscriber + new chat alert + You are already connected to %@. すでに %@ に接続されています。 @@ -9588,6 +9617,21 @@ alert title Repeat join request? new chat sheet title + + You are an admin + あなたは管理者です + new chat alert + + + You are an observer + あなたはオブザーバーです + new chat alert + + + You are an owner + あなたはオーナーです + new chat alert + You are connected to the server used to receive messages from this connection. subscription status explanation @@ -10506,6 +10550,10 @@ pref value forwarded No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group shown on group welcome message @@ -10879,8 +10927,8 @@ time to disappear saved No comment provided by engineer. - - saved from %@ + + saved from No comment provided by engineer. @@ -10965,6 +11013,10 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile rcv group event chat item 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 5ebd47c99a..d1b092f63b 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -39,6 +39,10 @@ %1$@ supported SimpleX Chat. The badge expired on %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -152,6 +156,10 @@ %@: copied message info + + %d day + time interval + %d days %d dagen @@ -2603,6 +2611,10 @@ Dit is uw eigen eenmalige link! Link maken… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder No comment provided by engineer. @@ -6508,18 +6520,10 @@ alert button Open de migratie naar een ander apparaat authentication reason - - Open new channel - new chat action - Open new chat new chat action - - Open new group - new chat action - Open to accept No comment provided by engineer. @@ -8613,6 +8617,10 @@ copied message info SimpleX name not verified alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation Eenmalige SimpleX uitnodiging @@ -9705,6 +9713,10 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc Instellingen actualiseren? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions Bijgewerkte voorwaarden @@ -10248,6 +10260,24 @@ alert title Je hebt al een chatprofiel met dezelfde weergave naam. Kies een andere naam. No comment provided by engineer. + + You are a contributor + new chat alert + + + You are a member + Je bent lid + new chat alert + + + You are a moderator + Je bent moderator + new chat alert + + + You are a subscriber + new chat alert + You are already connected to %@. U bent al verbonden met %@. @@ -10290,6 +10320,21 @@ Repeat join request? Deelnameverzoek herhalen? new chat sheet title + + You are an admin + Je bent beheerder + new chat alert + + + You are an observer + Je bent waarnemer + new chat alert + + + You are an owner + Je bent eigenaar + new chat alert + You are connected to the server used to receive messages from this connection. subscription status explanation @@ -11254,6 +11299,10 @@ pref value doorgestuurd No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group shown on group welcome message @@ -11651,9 +11700,9 @@ time to disappear opgeslagen No comment provided by engineer. - - saved from %@ - opgeslagen van %@ + + saved from + opgeslagen van No comment provided by engineer. @@ -11749,6 +11798,10 @@ laatst ontvangen bericht: %2$@ onbeschermd No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile rcv group event chat item diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff index 68f836184f..a48e4219d4 100644 --- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff +++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff @@ -39,6 +39,10 @@ %1$@ supported SimpleX Chat. The badge expired on %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -152,6 +156,10 @@ %@: copied message info + + %d day + time interval + %d days %d dni @@ -2622,6 +2630,10 @@ To jest twój jednorazowy link! Tworzenie linku… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder No comment provided by engineer. @@ -6565,20 +6577,11 @@ alert button Otwórz migrację na innym urządzeniu authentication reason - - Open new channel - new chat action - Open new chat Otwórz nowy czat new chat action - - Open new group - Otwórz nową grupę - new chat action - Open to accept Otwórz by zaakceptować @@ -8699,6 +8702,10 @@ copied message info SimpleX name not verified alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation Zaproszenie jednorazowe SimpleX @@ -9805,6 +9812,10 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.Zaktualizować ustawienia? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions Zaktualizowane warunki @@ -10357,6 +10368,24 @@ alert title Masz już profil czatu o tej samej nazwie wyświetlanej. Proszę wybrać inną nazwę. No comment provided by engineer. + + You are a contributor + new chat alert + + + You are a member + Jesteś członkiem + new chat alert + + + You are a moderator + Jesteś moderatorem + new chat alert + + + You are a subscriber + new chat alert + You are already connected to %@. Jesteś już połączony z %@. @@ -10399,6 +10428,21 @@ Repeat join request? Powtórzyć prośbę dołączenia? new chat sheet title + + You are an admin + Jesteś administratorem + new chat alert + + + You are an observer + Jesteś obserwatorem + new chat alert + + + You are an owner + Jesteś właścicielem + new chat alert + You are connected to the server used to receive messages from this connection. Jesteś połączony z serwerem służącym do odbierania wiadomości z tego połączenia. @@ -11374,6 +11418,10 @@ pref value przekazane dalej No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group grupa @@ -11776,9 +11824,9 @@ time to disappear zapisane No comment provided by engineer. - - saved from %@ - zapisane od %@ + + saved from + zapisane od No comment provided by engineer. @@ -11874,6 +11922,10 @@ ostatnia otrzymana wiadomość: %2$@ niezabezpieczony No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile rcv group event chat item 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 4d08db0a99..67d70d9708 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -40,6 +40,10 @@ %1$@ поддерживал(а) SimpleX Chat. Срок действия значка истёк %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -155,6 +159,10 @@ %@: copied message info + + %d day + time interval + %d days %d дней @@ -2715,6 +2723,10 @@ This is your own one-time link! Создаётся ссылка… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder No comment provided by engineer. @@ -6743,21 +6755,11 @@ alert button Открытие миграции на другое устройство authentication reason - - Open new channel - Открыть новый канал - new chat action - Open new chat Открыть новый чат new chat action - - Open new group - Открыть новую группу - new chat action - Open to accept Откройте чтобы принять @@ -8944,6 +8946,10 @@ copied message info SimpleX имя не проверено alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation SimpleX одноразовая ссылка @@ -10097,6 +10103,10 @@ You will be prompted to complete authentication before this feature is enabled.< Обновить настройки? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions Обновлённые условия @@ -10663,6 +10673,26 @@ alert title У Вас уже есть профиль с таким именем. Пожалуйста, выберите другое имя. No comment provided by engineer. + + You are a contributor + Вы соавтор + new chat alert + + + You are a member + Вы член группы + new chat alert + + + You are a moderator + Вы модератор + new chat alert + + + You are a subscriber + Вы подписчик + new chat alert + You are already connected to %@. Вы уже соединены с контактом %@. @@ -10705,6 +10735,21 @@ Repeat join request? Повторить запрос на вступление? new chat sheet title + + You are an admin + Вы админ + new chat alert + + + You are an observer + Вы читатель + new chat alert + + + You are an owner + Вы владелец + new chat alert + You are connected to the server used to receive messages from this connection. Вы подключены к серверу, используемому для приёма сообщений от этого соединения. @@ -11707,6 +11752,10 @@ pref value переслано No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group группа @@ -12115,9 +12164,9 @@ time to disappear сохранено No comment provided by engineer. - - saved from %@ - сохранено из %@ + + saved from + сохранено из No comment provided by engineer. @@ -12214,6 +12263,10 @@ last received msg: %2$@ незащищённый No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile обновил профиль канала diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff index 5859a228a3..b77da016c7 100644 --- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff +++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff @@ -36,6 +36,10 @@ %1$@ supported SimpleX Chat. The badge expired on %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -139,6 +143,10 @@ %@: copied message info + + %d day + time interval + %d days %d วัน @@ -2375,6 +2383,10 @@ This is your own one-time link! Creating link… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder No comment provided by engineer. @@ -5979,18 +5991,10 @@ alert button Open migration to another device authentication reason - - Open new channel - new chat action - Open new chat new chat action - - Open new group - new chat action - Open to accept No comment provided by engineer. @@ -7907,6 +7911,10 @@ copied message info SimpleX name not verified alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation คำเชิญ SimpleX แบบครั้งเดียว @@ -8918,6 +8926,10 @@ You will be prompted to complete authentication before this feature is enabled.< Update settings? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions No comment provided by engineer. @@ -9409,6 +9421,23 @@ alert title คุณมีโปรไฟล์แชทที่ใช้ชื่อแสดงเดียวกันอยู่แล้ว กรุณาเลือกชื่ออื่น No comment provided by engineer. + + You are a contributor + new chat alert + + + You are a member + คุณเป็นสมาชิก + new chat alert + + + You are a moderator + new chat alert + + + You are a subscriber + new chat alert + You are already connected to %@. คุณได้เชื่อมต่อกับ %@ แล้ว @@ -9443,6 +9472,21 @@ alert title Repeat join request? new chat sheet title + + You are an admin + คุณเป็นผู้ดูแลระบบ + new chat alert + + + You are an observer + คุณเป็นผู้สังเกตการณ์ + new chat alert + + + You are an owner + คุณเป็นเจ้าของ + new chat alert + You are connected to the server used to receive messages from this connection. subscription status explanation @@ -10356,6 +10400,10 @@ pref value forwarded No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group shown on group welcome message @@ -10729,8 +10777,8 @@ time to disappear saved No comment provided by engineer. - - saved from %@ + + saved from No comment provided by engineer. @@ -10815,6 +10863,10 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile rcv group event chat item 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 f6c20f8cdd..7b34d788cc 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -40,6 +40,10 @@ %1$@, SimpleX Chat'i destekledi. Rozetin süresi %2$@ tarihinde doldu. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -155,6 +159,10 @@ %@: copied message info + + %d day + time interval + %d days %d gün @@ -2633,6 +2641,10 @@ Bu senin kendi tek kullanımlık bağlantın! Link oluşturuluyor… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder No comment provided by engineer. @@ -6561,20 +6573,11 @@ alert button Başka bir cihaza açık geçiş authentication reason - - Open new channel - new chat action - Open new chat Yeni sohbet aç new chat action - - Open new group - Yeni grup aç - new chat action - Open to accept Kabul etmek için aç @@ -8689,6 +8692,10 @@ copied message info SimpleX name not verified alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation SimpleX tek kullanımlık davet @@ -9791,6 +9798,10 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec Ayarları güncelleyelim mi? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions Güncellenmiş koşullar @@ -10342,6 +10353,24 @@ alert title Aynı görünen ada sahip bir konuşma profilin zaten var. Lütfen başka bir ad seç. No comment provided by engineer. + + You are a contributor + new chat alert + + + You are a member + Üyesiniz + new chat alert + + + You are a moderator + Moderatörsünüz + new chat alert + + + You are a subscriber + new chat alert + You are already connected to %@. Zaten %@'a bağlısınız. @@ -10384,6 +10413,21 @@ Repeat join request? Katılma isteği tekrarlansın mı? new chat sheet title + + You are an admin + Yöneticisiniz + new chat alert + + + You are an observer + Gözlemcisiniz + new chat alert + + + You are an owner + Sahipsiniz + new chat alert + You are connected to the server used to receive messages from this connection. subscription status explanation @@ -11354,6 +11398,10 @@ pref value iletildi No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group grup @@ -11755,9 +11803,9 @@ time to disappear kaydedildi No comment provided by engineer. - - saved from %@ - %@ tarafından kaydedildi + + saved from + kaydedildi: No comment provided by engineer. @@ -11853,6 +11901,10 @@ son alınan msj: %2$@ korumasız No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile rcv group event chat item 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 1d6c687a94..e2df9d37af 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -40,6 +40,10 @@ %1$@ підтримував SimpleX Chat. Термін дії значка вичерпався %2$@. badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -155,6 +159,10 @@ %@: copied message info + + %d day + time interval + %d days %d днів @@ -2654,6 +2662,10 @@ This is your own one-time link! Створення посилання… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder No comment provided by engineer. @@ -6573,20 +6585,11 @@ alert button Відкрита міграція на інший пристрій authentication reason - - Open new channel - new chat action - Open new chat Відкрити новий чат new chat action - - Open new group - Відкрити нову групу - new chat action - Open to accept Відкрити для прийняття @@ -8699,6 +8702,10 @@ copied message info SimpleX name not verified alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation Одноразове запрошення SimpleX @@ -9799,6 +9806,10 @@ You will be prompted to complete authentication before this feature is enabled.< Оновити налаштування? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions Оновлені умови @@ -10350,6 +10361,24 @@ alert title Ви вже маєте профіль у чаті з таким самим іменем. Будь ласка, виберіть інше ім'я. No comment provided by engineer. + + You are a contributor + new chat alert + + + You are a member + Ви учасник + new chat alert + + + You are a moderator + Ви модератор + new chat alert + + + You are a subscriber + new chat alert + You are already connected to %@. Ви вже підключені до %@. @@ -10392,6 +10421,21 @@ Repeat join request? Повторити запит на приєднання? new chat sheet title + + You are an admin + Ви адмін + new chat alert + + + You are an observer + Ви спостерігач + new chat alert + + + You are an owner + Ви власник + new chat alert + You are connected to the server used to receive messages from this connection. subscription status explanation @@ -11362,6 +11406,10 @@ pref value переслано No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group група @@ -11762,9 +11810,9 @@ time to disappear збережено No comment provided by engineer. - - saved from %@ - збережено з %@ + + saved from + збережено з No comment provided by engineer. @@ -11860,6 +11908,10 @@ last received msg: %2$@ незахищені No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile rcv group event chat item diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff index c977009785..1f7e0c5fa2 100644 --- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff @@ -40,6 +40,10 @@ %1$@ 曾是 SimpleX Chat 支持者。徽章已于 %2$@ 过期。 badge alert + + %1$02d hrs %2$02d min %3$02d sec + countdown + %@ %@ @@ -155,6 +159,10 @@ %@: copied message info + + %d day + time interval + %d days %d 天 @@ -2710,6 +2718,10 @@ This is your own one-time link! 创建链接中… No comment provided by engineer. + + Crowdfunding investors can reserve names before the sale starts: [simplex.domains](https://simplex.domains/) + No comment provided by engineer. + Crowdfunding on Wefunder No comment provided by engineer. @@ -6725,21 +6737,11 @@ alert button 打开迁移到另一台设备 authentication reason - - Open new channel - 打开新频道 - new chat action - Open new chat 打开新聊天 new chat action - - Open new group - 打开新群 - new chat action - Open to accept 打开以接受 @@ -8913,6 +8915,10 @@ copied message info SimpleX 名称未验证 alert title + + SimpleX name sale starts in + No comment provided by engineer. + SimpleX one-time invitation SimpleX 一次性邀请 @@ -10056,6 +10062,10 @@ You will be prompted to complete authentication before this feature is enabled.< 更新设置? No comment provided by engineer. + + Update the app to register a SimpleX domain + No comment provided by engineer. + Updated conditions 条款已更新 @@ -10620,6 +10630,25 @@ alert title 您已经有一个显示名相同的聊天资料。请选择另一个名字。 No comment provided by engineer. + + You are a contributor + new chat alert + + + You are a member + 你是成员 + new chat alert + + + You are a moderator + 你是协管 + new chat alert + + + You are a subscriber + 你是订阅者 + new chat alert + You are already connected to %@. 您已经连接到 %@。 @@ -10662,6 +10691,21 @@ Repeat join request? 重复加入请求? new chat sheet title + + You are an admin + 你是管理员 + new chat alert + + + You are an observer + 你是观察者 + new chat alert + + + You are an owner + 你是群主 + new chat alert + You are connected to the server used to receive messages from this connection. 你已连接到用于接收该连接消息的服务器。 @@ -11662,6 +11706,10 @@ pref value 已转发 No comment provided by engineer. + + forwarded from + No comment provided by engineer. + group @@ -12070,9 +12118,9 @@ time to disappear 已保存 No comment provided by engineer. - - saved from %@ - 保存自 %@ + + saved from + 保存自 No comment provided by engineer. @@ -12168,6 +12216,10 @@ last received msg: %2$@ 未受保护 No comment provided by engineer. + + until you can register a SimpleX domain + No comment provided by engineer. + updated channel profile 频道更新了频道资料 diff --git a/apps/ios/SimpleX SE/fr.lproj/Localizable.strings b/apps/ios/SimpleX SE/fr.lproj/Localizable.strings index f20a8cfb99..338248b950 100644 --- a/apps/ios/SimpleX SE/fr.lproj/Localizable.strings +++ b/apps/ios/SimpleX SE/fr.lproj/Localizable.strings @@ -107,5 +107,5 @@ "Wrong database passphrase" = "Mauvaise phrase secrète pour la base de données"; /* No comment provided by engineer. */ -"You can allow sharing in Your privacy / SimpleX Lock settings." = "Vous pouvez autoriser le partage dans Votre vie privée / Réglages de verrouillage SimpleX."; +"You can allow sharing in Your privacy / SimpleX Lock settings." = "Vous pouvez autoriser le partage dans les paramètres Votre confidentialité / Verrouillage SimpleX."; diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 890a85fac1..418e1c99b5 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -183,8 +183,8 @@ 64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */; }; 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829982D54AEED006B9E89 /* libgmp.a */; }; 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829992D54AEEE006B9E89 /* libffi.a */; }; - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD-ghc9.6.3.a */; }; - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD.a */; }; + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ-ghc9.6.3.a */; }; + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ.a */; }; 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */; }; 64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */; }; 64D0C2C229FA57AB00B38D5F /* UserAddressLearnMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */; }; @@ -563,8 +563,8 @@ 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTimePicker.swift; sourceTree = ""; }; 64C829982D54AEED006B9E89 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; 64C829992D54AEEE006B9E89 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD-ghc9.6.3.a"; sourceTree = ""; }; - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD.a"; sourceTree = ""; }; + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ-ghc9.6.3.a"; sourceTree = ""; }; + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ.a"; sourceTree = ""; }; 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressView.swift; sourceTree = ""; }; 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressLearnMore.swift; sourceTree = ""; }; @@ -735,8 +735,8 @@ 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */, 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */, 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */, - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD-ghc9.6.3.a in Frameworks */, - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD.a in Frameworks */, + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ-ghc9.6.3.a in Frameworks */, + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ.a in Frameworks */, CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -822,8 +822,8 @@ 64C829992D54AEEE006B9E89 /* libffi.a */, 64C829982D54AEED006B9E89 /* libgmp.a */, 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */, - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD-ghc9.6.3.a */, - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.3-9pyEF8uuax6HMofQg4cpqD.a */, + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ-ghc9.6.3.a */, + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-7.1.0.4-JuaCEFy75SxELqTayb7fbQ.a */, ); path = Libraries; sourceTree = ""; @@ -2081,7 +2081,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 350; + CURRENT_PROJECT_VERSION = 352; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -2131,7 +2131,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 350; + CURRENT_PROJECT_VERSION = 352; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -2173,7 +2173,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 350; + CURRENT_PROJECT_VERSION = 352; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2193,7 +2193,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 350; + CURRENT_PROJECT_VERSION = 352; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2218,7 +2218,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 350; + CURRENT_PROJECT_VERSION = 352; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GCC_OPTIMIZATION_LEVEL = s; @@ -2255,7 +2255,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 350; + CURRENT_PROJECT_VERSION = 352; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_CODE_COVERAGE = NO; @@ -2292,7 +2292,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 350; + CURRENT_PROJECT_VERSION = 352; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2343,7 +2343,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 350; + CURRENT_PROJECT_VERSION = 352; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2397,7 +2397,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 350; + CURRENT_PROJECT_VERSION = 352; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -2431,7 +2431,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 350; + CURRENT_PROJECT_VERSION = 352; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index 7f9f1a4fcc..dee7ea6b32 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -302,7 +302,7 @@ public enum BadgeStatus: String, Codable { public struct BadgeInfo: Codable, Hashable { public var badgeType: BadgeType - public var badgeExpiry: Date? + public var badgeExpiry: Date public var badgeExtra: String } @@ -4328,13 +4328,15 @@ public enum MsgDirection: String, Decodable, Hashable { public enum CIForwardedFrom: Decodable, Hashable { case unknown case contact(chatName: String, msgDir: MsgDirection, contactId: Int64?, chatItemId: Int64?) - case group(chatName: String, msgDir: MsgDirection, groupId: Int64?, chatItemId: Int64?) + case group(chatName: String, msgDir: MsgDirection, groupId: Int64?, chatItemId: Int64?, memberId: String?, sharedMsgId_: String?, groupType: GroupType?) + case groupLink(chatName: String, msgDir: MsgDirection, groupLink: String, publicGroupId: String, memberId: String?, sharedMsgId: String, groupType: GroupType?) - var chatName: String { + public var chatName: String { switch self { case .unknown: "" case let .contact(chatName, _, _, _): chatName - case let .group(chatName, _, _, _): chatName + case let .group(chatName, _, _, _, _, _, _): chatName + case let .groupLink(chatName, _, _, _, _, _, _): chatName } } @@ -4345,17 +4347,23 @@ public enum CIForwardedFrom: Decodable, Hashable { if let contactId { (ChatType.direct, contactId, msgId) } else { nil } - case let .group(_, _, groupId, msgId): + case let .group(_, _, groupId, msgId, _, _, _): if let groupId { (ChatType.group, groupId, msgId) } else { nil } + case .groupLink: nil + } + } + + public var sourceGroupLink: String? { + switch self { + case let .groupLink(_, _, groupLink, _, _, _, _): groupLink + default: nil } } public func text(_ chatType: ChatType) -> LocalizedStringKey { - chatType == .local - ? (chatName == "" ? "saved" : "saved from \(chatName)") - : "forwarded" + chatType == .local ? "saved" : "forwarded" } } @@ -4677,6 +4685,7 @@ public struct CIFile: Decodable, Hashable { public var fileSource: CryptoFile? public var fileStatus: CIFileStatus public var fileProtocol: FileProtocol + public var fileExpires: Date? = nil public static func getSample(fileId: Int64 = 1, fileName: String = "test.txt", fileSize: Int64 = 100, filePath: String? = "test.txt", fileStatus: CIFileStatus = .rcvComplete) -> CIFile { let f: CryptoFile? @@ -4710,6 +4719,10 @@ public struct CIFile: Decodable, Hashable { } } + public var expired: Bool { + if let fileExpires { fileExpires < Date.now } else { false } + } + public var cancelAction: CancelAction? { get { switch self.fileStatus { @@ -4746,7 +4759,7 @@ public struct CIFile: Decodable, Hashable { case .sndCancelled: true case .sndError: true case .sndWarning: true - case .rcvInvitation: false + case .rcvInvitation: expired case .rcvAccepted: true case .rcvTransfer: true case .rcvAborted: true diff --git a/apps/ios/bg.lproj/Localizable.strings b/apps/ios/bg.lproj/Localizable.strings index 7956ef1c17..4eecbe2fdc 100644 --- a/apps/ios/bg.lproj/Localizable.strings +++ b/apps/ios/bg.lproj/Localizable.strings @@ -3516,10 +3516,10 @@ chat item action */ "Saved" = "Запазено"; /* No comment provided by engineer. */ -"Saved from" = "Запазено от"; +"saved from" = "запазено от"; /* No comment provided by engineer. */ -"saved from %@" = "запазено от %@"; +"Saved from" = "Запазено от"; /* message info title */ "Saved message" = "Запазено съобщение"; @@ -4393,6 +4393,9 @@ server test failure */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Вече имате чат профил със същото име. Моля, изберете друго име."; +/* new chat alert */ +"You are a member" = "Вие сте член"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Вече сте вече свързани с %@."; @@ -4414,6 +4417,15 @@ server test failure */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "Вече се присъединихте към групата!\nИзпрати отново заявката за присъединяване?"; +/* new chat alert */ +"You are an admin" = "Вие сте админ"; + +/* new chat alert */ +"You are an observer" = "Вие сте наблюдател"; + +/* new chat alert */ +"You are an owner" = "Вие сте собственик"; + /* No comment provided by engineer. */ "You are invited to group" = "Поканени сте в групата"; diff --git a/apps/ios/cs.lproj/Localizable.strings b/apps/ios/cs.lproj/Localizable.strings index 165177876c..d9d723be36 100644 --- a/apps/ios/cs.lproj/Localizable.strings +++ b/apps/ios/cs.lproj/Localizable.strings @@ -3505,9 +3505,21 @@ server test failure */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Již máte profil chatu se stejným zobrazovacím názvem. Zvolte prosím jiné jméno."; +/* new chat alert */ +"You are a member" = "Jste člen"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Již jste připojeni k %@."; +/* new chat alert */ +"You are an admin" = "Jste správce"; + +/* new chat alert */ +"You are an observer" = "Jste pozorovatel"; + +/* new chat alert */ +"You are an owner" = "Jste vlastník"; + /* No comment provided by engineer. */ "You are invited to group" = "Jste pozváni do skupiny"; diff --git a/apps/ios/de.lproj/Localizable.strings b/apps/ios/de.lproj/Localizable.strings index cda649f3b9..89dbd33ecc 100644 --- a/apps/ios/de.lproj/Localizable.strings +++ b/apps/ios/de.lproj/Localizable.strings @@ -1692,7 +1692,7 @@ server test step */ "Contact preferences" = "Kontakt-Präferenzen"; /* No comment provided by engineer. */ -"Contact requests in groups" = "KONTAKTANFRAGEN VON GRUPPEN"; +"Contact requests in groups" = "Kontaktanfragen in Gruppen"; /* No comment provided by engineer. */ "contact should accept…" = "Kontakt sollte annehmen…"; @@ -1814,6 +1814,12 @@ server test step */ /* No comment provided by engineer. */ "creator" = "Ersteller"; +/* No comment provided by engineer. */ +"Crowdfunding on Wefunder" = "Crowdfunding auf Wefunder"; + +/* No comment provided by engineer. */ +"Crowdfunding on Wefunder." = "Crowdfunding auf Wefunder."; + /* No comment provided by engineer. */ "Current conditions text couldn't be loaded, you can review conditions via this link:" = "Der Text der aktuellen Nutzungsbedingungen konnte nicht geladen werden. Sie können die Nutzungsbedingungen unter diesem Link einsehen:"; @@ -3153,6 +3159,9 @@ servers warning */ /* No comment provided by engineer. */ "Group invitation is no longer valid, it was removed by sender." = "Die Gruppeneinladung ist nicht mehr gültig, da sie vom Absender entfernt wurde."; +/* No comment provided by engineer. */ +"Group invitations" = "Gruppeneinladungen"; + /* No comment provided by engineer. */ "group is deleted" = "Gruppe wurde gelöscht"; @@ -4464,15 +4473,9 @@ alert button */ /* authentication reason */ "Open migration to another device" = "Migration auf ein anderes Gerät öffnen"; -/* new chat action */ -"Open new channel" = "Neuen Kanal öffnen"; - /* new chat action */ "Open new chat" = "Neuen Chat öffnen"; -/* new chat action */ -"Open new group" = "Neue Gruppe öffnen"; - /* No comment provided by engineer. */ "Open Settings" = "Geräte-Einstellungen öffnen"; @@ -5343,10 +5346,10 @@ chat item action */ "Saved" = "Abgespeichert"; /* No comment provided by engineer. */ -"Saved from" = "Abgespeichert von"; +"saved from" = "abgespeichert von"; /* No comment provided by engineer. */ -"saved from %@" = "abgespeichert von %@"; +"Saved from" = "Abgespeichert von"; /* message info title */ "Saved message" = "Gespeicherte Nachricht"; @@ -7013,6 +7016,18 @@ alert title */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Sie haben schon ein Chat-Profil mit dem gleichen Anzeigenamen. Bitte wählen Sie einen anderen Namen aus."; +/* new chat alert */ +"You are a contributor" = "Sie sind Mitwirkender"; + +/* new chat alert */ +"You are a member" = "Sie sind Mitglied"; + +/* new chat alert */ +"You are a moderator" = "Sie sind Moderator"; + +/* new chat alert */ +"You are a subscriber" = "Sie sind Abonnent"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Sie sind bereits mit %@ verbunden."; @@ -7037,6 +7052,15 @@ alert title */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "Sie sind bereits Mitglied dieser Gruppe!\nVerbindungsanfrage wiederholen?"; +/* new chat alert */ +"You are an admin" = "Sie sind Admin"; + +/* new chat alert */ +"You are an observer" = "Sie sind Beobachter"; + +/* new chat alert */ +"You are an owner" = "Sie sind Eigentümer"; + /* subscription status explanation */ "You are connected to the server used to receive messages from this connection." = "Sie sind mit dem Server verbunden, der für den Empfang von Nachrichten dieser Verbindung genutzt wird."; @@ -7088,6 +7112,12 @@ alert title */ /* notification body */ "You can now chat with %@" = "Sie können nun Nachrichten an %@ versenden"; +/* No comment provided by engineer. */ +"You can now invest in SimpleX Chat" = "Sie können nun in SimpleX-Chat investieren"; + +/* No comment provided by engineer. */ +"You can now invest in SimpleX Chat! 🚀" = "Sie können nun in SimpleX-Chat investieren! 🚀"; + /* No comment provided by engineer. */ "You can send messages to %@ from Archived contacts." = "Sie können aus den archivierten Kontakten heraus Nachrichten an %@ versenden."; @@ -7188,7 +7218,7 @@ alert title */ "You rejected group invitation" = "Sie haben die Gruppeneinladung abgelehnt"; /* snd group event chat item */ -"you removed %@" = "entfernt %@ aus der Gruppe"; +"you removed %@" = "Sie haben %@ aus der Gruppe entfernt"; /* No comment provided by engineer. */ "You sent group invitation" = "Sie haben eine Gruppeneinladung gesendet"; diff --git a/apps/ios/es.lproj/Localizable.strings b/apps/ios/es.lproj/Localizable.strings index e0d29f36d8..da5ba6c929 100644 --- a/apps/ios/es.lproj/Localizable.strings +++ b/apps/ios/es.lproj/Localizable.strings @@ -1814,6 +1814,12 @@ server test step */ /* No comment provided by engineer. */ "creator" = "creador"; +/* No comment provided by engineer. */ +"Crowdfunding on Wefunder" = "Crowdfunding en Wefunder"; + +/* No comment provided by engineer. */ +"Crowdfunding on Wefunder." = "Crowdfunding en Wefunder."; + /* No comment provided by engineer. */ "Current conditions text couldn't be loaded, you can review conditions via this link:" = "El texto con las condiciones actuales no se ha podido cargar, puedes revisar las condiciones en el siguiente enlace:"; @@ -3153,6 +3159,9 @@ servers warning */ /* No comment provided by engineer. */ "Group invitation is no longer valid, it was removed by sender." = "La invitación al grupo ya no es válida, ha sido eliminada por el remitente."; +/* No comment provided by engineer. */ +"Group invitations" = "Invitaciones en grupo"; + /* No comment provided by engineer. */ "group is deleted" = "el grupo ha sido eliminado"; @@ -4464,15 +4473,9 @@ alert button */ /* authentication reason */ "Open migration to another device" = "Abrir menú migración a otro dispositivo"; -/* new chat action */ -"Open new channel" = "Abrir canal nuevo"; - /* new chat action */ "Open new chat" = "Abrir chat nuevo"; -/* new chat action */ -"Open new group" = "Abrir grupo nuevo"; - /* No comment provided by engineer. */ "Open Settings" = "Abrir Configuración"; @@ -5343,10 +5346,10 @@ chat item action */ "Saved" = "Guardado"; /* No comment provided by engineer. */ -"Saved from" = "Guardado desde"; +"saved from" = "Guardado desde"; /* No comment provided by engineer. */ -"saved from %@" = "Guardado desde %@"; +"Saved from" = "Guardado desde"; /* message info title */ "Saved message" = "Mensaje guardado"; @@ -7013,6 +7016,18 @@ alert title */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Ya tienes un perfil con este nombre mostrado. Por favor, elige otro nombre."; +/* new chat alert */ +"You are a contributor" = "Eres colaborador"; + +/* new chat alert */ +"You are a member" = "Eres miembro"; + +/* new chat alert */ +"You are a moderator" = "Eres moderador"; + +/* new chat alert */ +"You are a subscriber" = "Eres suscriptor"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Ya estás conectado con %@."; @@ -7037,6 +7052,15 @@ alert title */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "¡En proceso de unirte al grupo!\n¿Repetir solicitud de admisión?"; +/* new chat alert */ +"You are an admin" = "Eres administrador"; + +/* new chat alert */ +"You are an observer" = "Eres observador"; + +/* new chat alert */ +"You are an owner" = "Eres propietario"; + /* subscription status explanation */ "You are connected to the server used to receive messages from this connection." = "Estás conectado al servidor usado para recibir mensajes de esta conexión."; @@ -7088,6 +7112,12 @@ alert title */ /* notification body */ "You can now chat with %@" = "Ya puedes chatear con %@"; +/* No comment provided by engineer. */ +"You can now invest in SimpleX Chat" = "Ahora puedes invertir en SimpleX Chat"; + +/* No comment provided by engineer. */ +"You can now invest in SimpleX Chat! 🚀" = "Ahora puedes invertir en SimpleX Chat! 🚀"; + /* No comment provided by engineer. */ "You can send messages to %@ from Archived contacts." = "Puedes enviar mensajes a %@ desde Contactos archivados."; diff --git a/apps/ios/fi.lproj/Localizable.strings b/apps/ios/fi.lproj/Localizable.strings index dfe1b6479d..0ec2565331 100644 --- a/apps/ios/fi.lproj/Localizable.strings +++ b/apps/ios/fi.lproj/Localizable.strings @@ -3141,9 +3141,21 @@ server test failure */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Sinulla on jo keskusteluprofiili samalla näyttönimellä. Valitse toinen nimi."; +/* new chat alert */ +"You are a member" = "Olet jäsen"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Olet jo muodostanut yhteyden %@:n kanssa."; +/* new chat alert */ +"You are an admin" = "Olet ylläpitäjä"; + +/* new chat alert */ +"You are an observer" = "Olet tarkkailija"; + +/* new chat alert */ +"You are an owner" = "Olet omistaja"; + /* No comment provided by engineer. */ "You are invited to group" = "Sinut on kutsuttu ryhmään"; diff --git a/apps/ios/fr.lproj/Localizable.strings b/apps/ios/fr.lproj/Localizable.strings index 51dce47465..3037b29aa9 100644 --- a/apps/ios/fr.lproj/Localizable.strings +++ b/apps/ios/fr.lproj/Localizable.strings @@ -5,7 +5,7 @@ "_italic_" = "\\_italique_"; /* No comment provided by engineer. */ -"- connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)!\n- delivery receipts (up to 20 members).\n- faster and more stable." = "- connexion au [service d'annuaire](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA) !\n- les accusés de réception (jusqu'à 20 membres).\n- plus rapide et plus stable."; +"- connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)!\n- delivery receipts (up to 20 members).\n- faster and more stable." = "- connexion au [service d'annuaire](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) (BÊTA) !\n- les accusés de réception (jusqu'à 20 membres).\n- plus rapide et plus stable."; /* No comment provided by engineer. */ "- more stable message delivery.\n- a bit better groups.\n- and more!" = "- une diffusion plus stable des messages.\n- des groupes un peu plus performants.\n- et bien d'autres choses encore !"; @@ -265,7 +265,7 @@ channel relay bar */ "%lld contact(s) selected" = "%lld contact·s sélectionné·s"; /* No comment provided by engineer. */ -"%lld file(s) with total size of %@" = "%lld fichier·s pour une taille totale de %@"; +"%lld file(s) with total size of %@" = "%lld fichier(s) pour une taille totale de %@"; /* No comment provided by engineer. */ "%lld group events" = "%lld événements de groupe"; @@ -602,7 +602,7 @@ swipe action */ "All app data is deleted." = "Toutes les données de l'application sont supprimées."; /* No comment provided by engineer. */ -"All chats and messages will be deleted - this cannot be undone!" = "Toutes les conversations et tous les messages seront supprimés - il est impossible de revenir en arrière !"; +"All chats and messages will be deleted - this cannot be undone!" = "Toutes les conversations et tous les messages seront supprimés — cette action est irréversible !"; /* alert message */ "All chats will be removed from the list %@, and the list deleted." = "Toutes les conversations seront supprimées de la liste %@ et la liste sera supprimée."; @@ -626,10 +626,10 @@ swipe action */ "All messages and files are sent **end-to-end encrypted**, with post-quantum security in direct messages." = "Tous les messages et fichiers sont envoyés **chiffrés de bout en bout**, avec une sécurité post-quantique dans les messages directs."; /* No comment provided by engineer. */ -"All messages will be deleted - this cannot be undone!" = "Tous les messages seront supprimés - il n'est pas possible de revenir en arrière !"; +"All messages will be deleted - this cannot be undone!" = "Tous les messages seront supprimés — cette action est irréversible !"; /* No comment provided by engineer. */ -"All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you." = "Tous les messages seront supprimés - impossible de revenir en arrière ! Les messages seront supprimés UNIQUEMENT pour vous."; +"All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you." = "Tous les messages seront supprimés — cette action est irréversible ! Les messages seront supprimés UNIQUEMENT pour vous."; /* No comment provided by engineer. */ "All new messages from %@ will be hidden!" = "Tous les nouveaux messages de %@ seront cachés !"; @@ -1062,7 +1062,7 @@ marked deleted chat item preview text */ "Businesses" = "Entreprises"; /* No comment provided by engineer. */ -"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Par profil de messagerie (par défaut) ou [par connexion](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)."; +"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Par profil de messagerie (par défaut) ou [par connexion](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BÊTA)."; /* No comment provided by engineer. */ "call" = "appeler"; @@ -1240,10 +1240,10 @@ alert subtitle */ "Channel webpage" = "Page Web du canal"; /* No comment provided by engineer. */ -"Channel will be deleted for all subscribers - this cannot be undone!" = "Le canal sera supprimé pour tous les abonné·es ; ceci ne peut pas être annulé !"; +"Channel will be deleted for all subscribers - this cannot be undone!" = "Le canal sera supprimé pour tous les abonnés — cette action est irréversible !"; /* No comment provided by engineer. */ -"Channel will be deleted for you - this cannot be undone!" = "Le canal sera supprimé pour vous ; ceci ne peut pas être annulé !"; +"Channel will be deleted for you - this cannot be undone!" = "Le canal sera supprimé pour vous — cette action est irréversible !"; /* alert message */ "Channel will start working with %d of %d relays. Continue?" = "Le canal commencera à fonctionner avec %1$d relais sur %2$d. Continuer ?"; @@ -1321,10 +1321,10 @@ alert subtitle */ "Chat theme" = "Thème de la conversation"; /* No comment provided by engineer. */ -"Chat will be deleted for all members - this cannot be undone!" = "La conversation sera supprimée pour tous les membres - cela ne peut pas être annulé !"; +"Chat will be deleted for all members - this cannot be undone!" = "La conversation sera supprimée pour tous les membres — cette action est irréversible !"; /* No comment provided by engineer. */ -"Chat will be deleted for you - this cannot be undone!" = "La conversation sera supprimée pour vous - il n'est pas possible de revenir en arrière !"; +"Chat will be deleted for you - this cannot be undone!" = "La conversation sera supprimée pour vous — cette action est irréversible !"; /* chat feature chat toolbar */ @@ -1698,7 +1698,7 @@ server test step */ "contact should accept…" = "Le contact devrait accepter…"; /* No comment provided by engineer. */ -"Contact will be deleted - this cannot be undone!" = "Le contact sera supprimé - il n'est pas possible de revenir en arrière !"; +"Contact will be deleted - this cannot be undone!" = "Le contact sera supprimé — cette action est irréversible !"; /* No comment provided by engineer. */ "Contacts" = "Contacts"; @@ -1814,6 +1814,12 @@ server test step */ /* No comment provided by engineer. */ "creator" = "créateur"; +/* No comment provided by engineer. */ +"Crowdfunding on Wefunder" = "Financement participatif sur Wefunder"; + +/* No comment provided by engineer. */ +"Crowdfunding on Wefunder." = "Financement participatif sur Wefunder."; + /* No comment provided by engineer. */ "Current conditions text couldn't be loaded, you can review conditions via this link:" = "Le texte sur les conditions actuelles n'a pas pu être chargé. Vous pouvez consulter les conditions en cliquant sur ce lien :"; @@ -2151,7 +2157,7 @@ alert button */ "Details" = "Détails"; /* No comment provided by engineer. */ -"Developer" = "Outils du développeur"; +"Developer" = "Outils développeur"; /* No comment provided by engineer. */ "Developer options" = "Options pour les développeurs"; @@ -2160,10 +2166,10 @@ alert button */ "Device" = "Appareil"; /* No comment provided by engineer. */ -"Device authentication is disabled. Turning off SimpleX Lock." = "L'authentification de l'appareil est désactivée. Désactivation de SimpleX Lock."; +"Device authentication is disabled. Turning off SimpleX Lock." = "L'authentification de l'appareil est désactivée. Désactivation du Verrouillage SimpleX."; /* No comment provided by engineer. */ -"Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication." = "L'authentification de l'appareil n'est pas activée. Vous pouvez activer SimpleX Lock via Paramètres, une fois que vous avez activé l'authentification de l'appareil."; +"Device authentication is not enabled. You can turn on SimpleX Lock via Settings, once you enable device authentication." = "L'authentification de l'appareil n'est pas activée. Vous pouvez activer le Verrouillage SimpleX dans les Paramètres une fois l'authentification de l'appareil activée."; /* No comment provided by engineer. */ "different migration in the app/database: %@ / %@" = "migration différente dans l'app/la base de données : %@ / %@"; @@ -2202,7 +2208,7 @@ alert button */ "Disable for all" = "Désactiver pour tous"; /* authentication reason */ -"Disable SimpleX Lock" = "Désactiver SimpleX Lock"; +"Disable SimpleX Lock" = "Désactiver le Verrouillage SimpleX"; /* No comment provided by engineer. */ "disabled" = "désactivé"; @@ -2362,7 +2368,7 @@ chat item action */ "Enable (keep overrides)" = "Activer (conserver les remplacements)"; /* channel creation warning */ -"Enable at least one chat relay in Network & Servers." = "Activez au moins un relais de messagerie dans Réseaux et serveurs."; +"Enable at least one chat relay in Network & Servers." = "Activez au moins un relais de messagerie dans Réseau et serveurs."; /* alert title */ "Enable automatic message deletion?" = "Activer la suppression automatique des messages ?"; @@ -2377,13 +2383,13 @@ chat item action */ "Enable disappearing messages by default." = "Activer les messages éphémères par défaut."; /* No comment provided by engineer. */ -"Enable Flux in Network & servers settings for better metadata privacy." = "Activez Flux dans les paramètres du réseau et des serveurs pour une meilleure confidentialité des métadonnées."; +"Enable Flux in Network & servers settings for better metadata privacy." = "Activez Flux dans les paramètres Réseau et serveurs pour une meilleure confidentialité des métadonnées."; /* No comment provided by engineer. */ "Enable for all" = "Activer pour tous"; /* No comment provided by engineer. */ -"Enable in direct chats (BETA)!" = "Activer dans les conversations directes (BETA) !"; +"Enable in direct chats (BETA)!" = "Activer dans les conversations directes (BÊTA) !"; /* No comment provided by engineer. */ "Enable instant notifications?" = "Activer les notifications instantanées ?"; @@ -2404,7 +2410,7 @@ chat item action */ "Enable self-destruct passcode" = "Activer le code d'autodestruction"; /* authentication reason */ -"Enable SimpleX Lock" = "Activer SimpleX Lock"; +"Enable SimpleX Lock" = "Activer le Verrouillage SimpleX"; /* No comment provided by engineer. */ "Enable TCP keep-alive" = "Activer le TCP keep-alive"; @@ -3106,7 +3112,7 @@ servers warning */ "Get notified when mentioned." = "Soyez averti·e quand vous êtes mentionné·e."; /* No comment provided by engineer. */ -"Get SimpleX name (BETA)" = "Obtenir un nom SimpleX (BETA)"; +"Get SimpleX name (BETA)" = "Obtenir un nom SimpleX (BÊTA)"; /* No comment provided by engineer. */ "Get started" = "Commençons"; @@ -3153,6 +3159,9 @@ servers warning */ /* No comment provided by engineer. */ "Group invitation is no longer valid, it was removed by sender." = "L'invitation du groupe n'est plus valide, elle a été supprimé par l'expéditeur."; +/* No comment provided by engineer. */ +"Group invitations" = "Invitations de groupe"; + /* No comment provided by engineer. */ "group is deleted" = "le groupe est supprimé"; @@ -3190,10 +3199,10 @@ servers warning */ "Group welcome message" = "Message d'accueil du groupe"; /* No comment provided by engineer. */ -"Group will be deleted for all members - this cannot be undone!" = "Le groupe va être supprimé pour tout les membres - impossible de revenir en arrière !"; +"Group will be deleted for all members - this cannot be undone!" = "Le groupe va être supprimé pour tout les membres — cette action est irréversible !"; /* No comment provided by engineer. */ -"Group will be deleted for you - this cannot be undone!" = "Le groupe va être supprimé pour vous - impossible de revenir en arrière !"; +"Group will be deleted for you - this cannot be undone!" = "Le groupe va être supprimé pour vous — cette action est irréversible !"; /* No comment provided by engineer. */ "Groups" = "Groupes"; @@ -3775,16 +3784,16 @@ servers warning */ "Member is deleted - can't accept request" = "Le membre est supprimé ; impossible d'accepter la demande"; /* alert message */ -"Member messages will be deleted - this cannot be undone!" = "Les messages des membres seront supprimés ; ceci ne peut pas être annulé !"; +"Member messages will be deleted - this cannot be undone!" = "Les messages des membres seront supprimés — cette action est irréversible !"; /* chat feature */ "Member reports" = "Signalements des membres"; /* alert message */ -"Member will be removed from chat - this cannot be undone!" = "Le membre sera retiré de la conversation - cette action est irréversible !"; +"Member will be removed from chat - this cannot be undone!" = "Le membre sera retiré de la conversation — cette action est irréversible !"; /* alert message */ -"Member will be removed from group - this cannot be undone!" = "Ce membre sera retiré du groupe - impossible de revenir en arrière !"; +"Member will be removed from group - this cannot be undone!" = "Ce membre sera retiré du groupe — cette action est irréversible !"; /* alert message */ "Member will join the group, accept member?" = "Le membre rejoindra le groupe ; accepter le membre ?"; @@ -4273,7 +4282,7 @@ servers warning */ "None of your servers are set to resolve SimpleX names. Configure servers, or use a connection link." = "Aucun serveur de résolution de noms SimpleX n'est configuré. Configurez des serveurs ou utilisez un lien de connexion."; /* No comment provided by engineer. */ -"Not a better lock on someone else's door. Not a nicer landlord that respects your privacy, but still keeps the record of all visitors. You are not a guest. You are home. No king can enter it - you are sovereign." = "Ce n’est pas une meilleure serrure sur la porte de quelqu’un d’autre. Ce n’est pas un propriétaire plus aimable qui respecte votre vie privée, mais qui tient tout de même un registre de tous les visiteurs. Vous n’êtes pas un·e invité·e, vous êtes chez vous. Aucun roi ne peut y entrer : c’est vous le souverain."; +"Not a better lock on someone else's door. Not a nicer landlord that respects your privacy, but still keeps the record of all visitors. You are not a guest. You are home. No king can enter it - you are sovereign." = "Ce n’est pas une meilleure serrure sur la porte de quelqu'un d'autre. Ni un propriétaire plus attentionné qui respecte votre vie privée, mais conserve toujours le registre de tous les visiteurs. Vous n'êtes pas un invité. Vous êtes chez vous. Aucun roi ne peut y entrer — vous êtes souverain."; /* alert title */ "Not all relays connected" = "Les relais ne sont pas tous connectés"; @@ -4464,15 +4473,9 @@ alert button */ /* authentication reason */ "Open migration to another device" = "Ouvrir le transfert vers un autre appareil"; -/* new chat action */ -"Open new channel" = "Ouvrir un nouveau canal"; - /* new chat action */ "Open new chat" = "Ouvrir une nouvelle conversation"; -/* new chat action */ -"Open new group" = "Ouvrir le nouveau groupe"; - /* No comment provided by engineer. */ "Open Settings" = "Ouvrir les Paramètres"; @@ -4711,7 +4714,7 @@ alert button */ "Previously connected servers" = "Serveurs précédemment connectés"; /* No comment provided by engineer. */ -"Privacy for your customers." = "Respect de la vie privée de vos clients."; +"Privacy for your customers." = "Confidentialité pour vos clients."; /* No comment provided by engineer. */ "Privacy policy and conditions of use." = "Politique de confidentialité et conditions d'utilisation."; @@ -5005,7 +5008,7 @@ swipe action */ "Relay test failed!" = "Échec du test de relais !"; /* alert message */ -"Relay will be removed from channel - this cannot be undone!" = "Le relais sera supprimé du canal ; cette action est irréversible !"; +"Relay will be removed from channel - this cannot be undone!" = "Le relais sera supprimé du canal — cette action est irréversible !"; /* alert message */ "Relays added: %@." = "Relais ajoutés : %@."; @@ -5215,7 +5218,7 @@ swipe action */ "Review members" = "Contrôler les membres"; /* admission stage description */ -"Review members before admitting (\"knocking\")." = "Contrôler les membres avant de les admettre (« toquer »)."; +"Review members before admitting (\"knocking\")." = "Examiner les membres avant leur admission (« frapper à la porte »)."; /* No comment provided by engineer. */ "reviewed by admins" = "révisé par les admins"; @@ -5343,10 +5346,10 @@ chat item action */ "Saved" = "Enregistré"; /* No comment provided by engineer. */ -"Saved from" = "Enregistré depuis"; +"saved from" = "enregistré à partir de"; /* No comment provided by engineer. */ -"saved from %@" = "enregistré à partir de %@"; +"Saved from" = "Enregistré depuis"; /* message info title */ "Saved message" = "Message enregistré"; @@ -5643,7 +5646,7 @@ chat item action */ "Servers info" = "Infos serveurs"; /* No comment provided by engineer. */ -"Servers statistics will be reset - this cannot be undone!" = "Les statistiques des serveurs seront réinitialisées - il n'est pas possible de revenir en arrière !"; +"Servers statistics will be reset - this cannot be undone!" = "Les statistiques des serveurs seront réinitialisées — cette action est irréversible !"; /* No comment provided by engineer. */ "Session code" = "Code de session"; @@ -5873,16 +5876,16 @@ copied message info */ "SimpleX links not allowed" = "Les liens SimpleX ne sont pas autorisés"; /* No comment provided by engineer. */ -"SimpleX Lock" = "SimpleX Lock"; +"SimpleX Lock" = "Verrouillage SimpleX"; /* No comment provided by engineer. */ -"SimpleX Lock mode" = "Mode de SimpleX Lock"; +"SimpleX Lock mode" = "Mode de Verrouillage SimpleX"; /* No comment provided by engineer. */ -"SimpleX Lock not enabled!" = "SimpleX Lock n'est pas activé !"; +"SimpleX Lock not enabled!" = "Le Verrouillage SimpleX n'est pas activé !"; /* No comment provided by engineer. */ -"SimpleX Lock turned on" = "SimpleX Lock activé"; +"SimpleX Lock turned on" = "Verrouillage SimpleX activé"; /* No comment provided by engineer. */ "SimpleX name" = "Nom SimpleX"; @@ -5900,7 +5903,7 @@ copied message info */ "SimpleX protocols reviewed by Trail of Bits." = "Protocoles SimpleX audité par Trail of Bits."; /* No comment provided by engineer. */ -"SimpleX public names (BETA)" = "Noms publics SimpleX (BETA)"; +"SimpleX public names (BETA)" = "Noms publics SimpleX (BÊTA)"; /* simplex link type */ "SimpleX relay address" = "Adresse relais SimpleX"; @@ -6039,7 +6042,7 @@ report reason */ "Subscriber reports" = "Signalements d'abonnés"; /* alert message */ -"Subscriber will be removed from channel - this cannot be undone!" = "L'abonné sera supprimé du canal ; cette action est irréversible !"; +"Subscriber will be removed from channel - this cannot be undone!" = "L'abonné sera supprimé du canal — cette action est irréversible !"; /* No comment provided by engineer. */ "Subscribers" = "Abonnés"; @@ -6328,16 +6331,16 @@ server test failure */ "They can be overridden in contact and group settings." = "Ils peuvent être modifiés dans les paramètres des contacts et des groupes."; /* No comment provided by engineer. */ -"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Cette action ne peut être annulée - tous les fichiers et médias reçus et envoyés seront supprimés. Les photos à faible résolution seront conservées."; +"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Cette action est irréversible — tous les fichiers et médias reçus et envoyés seront supprimés. Les photos à faible résolution seront conservées."; /* No comment provided by engineer. */ -"This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes." = "Cette action ne peut être annulée - les messages envoyés et reçus avant la date sélectionnée seront supprimés. Cela peut prendre plusieurs minutes."; +"This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes." = "Cette action est irréversible — les messages envoyés et reçus avant la date sélectionnée seront supprimés. Cela peut prendre plusieurs minutes."; /* alert message */ -"This action cannot be undone - the messages sent and received in this chat earlier than selected will be deleted." = "Cette action est irréversible : les messages envoyés et reçus dans cette conversation avant la date sélectionnée seront supprimés."; +"This action cannot be undone - the messages sent and received in this chat earlier than selected will be deleted." = "Cette action est irréversible — les messages envoyés et reçus dans cette conversation avant la date sélectionnée seront supprimés."; /* No comment provided by engineer. */ -"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Cette action ne peut être annulée - votre profil, vos contacts, vos messages et vos fichiers seront irréversiblement perdus."; +"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Cette action est irréversible — votre profil, vos contacts, vos messages et vos fichiers seront irréversiblement perdus."; /* badge alert */ "This badge could not be verified and may not be genuine." = "Ce badge n'a pas pu être vérifié et pourrait ne pas être authentique."; @@ -6419,7 +6422,7 @@ alert subtitle */ "To protect timezone, image/voice files use UTC." = "Pour préserver le fuseau horaire, les fichiers image/voix utilisent le système UTC."; /* No comment provided by engineer. */ -"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Pour protéger vos informations, activez la fonction SimpleX Lock.\nVous serez invité à confirmer l'authentification avant que cette fonction ne soit activée."; +"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Pour protéger vos informations, activez le Verrouillage SimpleX.\nUne authentification vous sera demandée avant que cette fonctionnalité ne soit activée."; /* No comment provided by engineer. */ "To protect your IP address, private routing uses your SMP servers to deliver messages." = "Pour protéger votre adresse IP, le routage privé utilise vos serveurs SMP pour délivrer les messages."; @@ -7013,6 +7016,18 @@ alert title */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Vous avez déjà un profil de messagerie avec le même nom d’affichage. Veuillez choisir un autre nom."; +/* new chat alert */ +"You are a contributor" = "Vous êtes contributeur"; + +/* new chat alert */ +"You are a member" = "Vous êtes membre"; + +/* new chat alert */ +"You are a moderator" = "Vous êtes modérateur"; + +/* new chat alert */ +"You are a subscriber" = "Vous êtes abonné·e"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Vous êtes déjà connecté·e à %@ via ce lien."; @@ -7037,6 +7052,15 @@ alert title */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "Vous êtes déjà membre de ce groupe !\nRépéter la demande d'adhésion ?"; +/* new chat alert */ +"You are an admin" = "Vous êtes admin"; + +/* new chat alert */ +"You are an observer" = "Vous êtes observateur"; + +/* new chat alert */ +"You are an owner" = "Vous êtes propriétaire"; + /* subscription status explanation */ "You are connected to the server used to receive messages from this connection." = "Vous êtes connecté au serveur utilisé pour recevoir les messages de cette connexion."; @@ -7074,7 +7098,7 @@ alert title */ "You can enable later via Settings" = "Vous pouvez l'activer ultérieurement via Paramètres"; /* No comment provided by engineer. */ -"You can enable them later via app Your privacy settings." = "Vous pourrez les activer plus tard dans les paramètres « Votre vie privée »."; +"You can enable them later via app Your privacy settings." = "Vous pouvez les activer plus tard dans les paramètres de confidentialité de l'application."; /* No comment provided by engineer. */ "You can give another try." = "Vous pouvez faire un nouvel essai."; @@ -7088,6 +7112,12 @@ alert title */ /* notification body */ "You can now chat with %@" = "Vous pouvez maintenant envoyer des messages à %@"; +/* No comment provided by engineer. */ +"You can now invest in SimpleX Chat" = "Vous pouvez désormais investir dans SimpleX Chat"; + +/* No comment provided by engineer. */ +"You can now invest in SimpleX Chat! 🚀" = "Vous pouvez désormais investir dans SimpleX Chat ! 🚀"; + /* No comment provided by engineer. */ "You can send messages to %@ from Archived contacts." = "Vous pouvez envoyer des messages à %@ à partir des contacts archivés."; @@ -7116,7 +7146,7 @@ alert title */ "You can support SimpleX starting from v7 of the app." = "Vous pouvez soutenir SimpleX à partir de la version 7 de l'application."; /* No comment provided by engineer. */ -"You can turn on SimpleX Lock via Settings." = "Vous pouvez activer SimpleX Lock dans les Paramètres."; +"You can turn on SimpleX Lock via Settings." = "Vous pouvez activer le Verrouillage SimpleX dans les Paramètres."; /* No comment provided by engineer. */ "You can use markdown to format messages:" = "Vous pouvez utiliser le format markdown pour mettre en forme les messages :"; @@ -7317,7 +7347,7 @@ alert title */ "Your preferences" = "Vos préférences"; /* No comment provided by engineer. */ -"Your privacy" = "Votre vie privée"; +"Your privacy" = "Votre confidentialité"; /* No comment provided by engineer. */ "Your profile" = "Votre profil"; diff --git a/apps/ios/hu.lproj/Localizable.strings b/apps/ios/hu.lproj/Localizable.strings index 2d719d6983..6806e210f9 100644 --- a/apps/ios/hu.lproj/Localizable.strings +++ b/apps/ios/hu.lproj/Localizable.strings @@ -1062,7 +1062,7 @@ marked deleted chat item preview text */ "Businesses" = "Üzleti"; /* No comment provided by engineer. */ -"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "A csevegési profillal (alapértelmezett), vagy a [kapcsolattal] (https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (béta)."; +"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "A csevegési profillal (alapértelmezés), vagy a [kapcsolattal](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (béta)."; /* No comment provided by engineer. */ "call" = "hívás"; @@ -1814,6 +1814,12 @@ server test step */ /* No comment provided by engineer. */ "creator" = "készítő"; +/* No comment provided by engineer. */ +"Crowdfunding on Wefunder" = "Közösségi finanszírozás a Wefunder oldalon"; + +/* No comment provided by engineer. */ +"Crowdfunding on Wefunder." = "Közösségi finanszírozás a Wefunder oldalon."; + /* No comment provided by engineer. */ "Current conditions text couldn't be loaded, you can review conditions via this link:" = "A jelenlegi feltételek szövegét nem sikerült betölteni, a feltételeket a következő hivatkozáson keresztül vizsgálhatja felül:"; @@ -1921,13 +1927,13 @@ server test step */ /* delete after time pref value */ -"default (%@)" = "alapértelmezett (%@)"; +"default (%@)" = "alapértelmezés (%@)"; /* No comment provided by engineer. */ -"default (no)" = "alapértelmezett (nem)"; +"default (no)" = "alapértelmezés (nem)"; /* No comment provided by engineer. */ -"default (yes)" = "alapértelmezett (igen)"; +"default (yes)" = "alapértelmezés (igen)"; /* alert action swipe action */ @@ -2374,7 +2380,7 @@ chat item action */ "Enable chats with admins?" = "Engedélyezi a csevegést az adminisztrátorokkal?"; /* No comment provided by engineer. */ -"Enable disappearing messages by default." = "Eltűnő üzenetek engedélyezése alapértelmezetten."; +"Enable disappearing messages by default." = "Eltűnő üzenetek engedélyezése alapértelmezésként."; /* No comment provided by engineer. */ "Enable Flux in Network & servers settings for better metadata privacy." = "A Flux kiszolgálókat engedélyezheti a beállításokban, a „Hálózat és kiszolgálók” menüben, a metaadatok jobb védelme érdekében."; @@ -3153,6 +3159,9 @@ servers warning */ /* No comment provided by engineer. */ "Group invitation is no longer valid, it was removed by sender." = "A csoportmeghívó már nem érvényes, a küldője eltávolította."; +/* No comment provided by engineer. */ +"Group invitations" = "Meghívások csoportokba"; + /* No comment provided by engineer. */ "group is deleted" = "csoport törölve"; @@ -3397,7 +3406,7 @@ servers warning */ "indirect (%d)" = "közvetett (%d)"; /* chat item action */ -"Info" = "Információ"; +"Info" = "Adatok"; /* No comment provided by engineer. */ "Initial role" = "Kezdeti szerepkör"; @@ -3850,7 +3859,7 @@ servers warning */ "Message may be delivered later if member becomes active." = "Az üzenet később is kézbesíthető, ha a tag aktívvá válik."; /* No comment provided by engineer. */ -"Message queue info" = "Üzenet várólista-információi"; +"Message queue info" = "Üzenet várólistaadatai"; /* chat feature */ "Message reactions" = "Üzenetreakciók"; @@ -4177,7 +4186,7 @@ servers warning */ "No contacts to add" = "Nincs hozzáadandó partner"; /* No comment provided by engineer. */ -"No delivery information" = "Nincs kézbesítési információ"; +"No delivery information" = "Nincsenek kézbesítési adatok"; /* No comment provided by engineer. */ "No device token!" = "Nincs készüléktoken!"; @@ -4198,7 +4207,7 @@ servers warning */ "No history" = "Nincsenek előzmények"; /* No comment provided by engineer. */ -"No info, try to reload" = "Nincs információ, próbálja meg újratölteni"; +"No info, try to reload" = "Nincsenek adatok, próbálja meg újratölteni"; /* servers error */ "No media & file servers." = "Nincsenek fájl- és médiakiszolgálók."; @@ -4464,15 +4473,9 @@ alert button */ /* authentication reason */ "Open migration to another device" = "Átköltöztetés indítása egy másik eszközre"; -/* new chat action */ -"Open new channel" = "Új csatorna megnyitása"; - /* new chat action */ "Open new chat" = "Új csevegés megnyitása"; -/* new chat action */ -"Open new group" = "Új csoport megnyitása"; - /* No comment provided by engineer. */ "Open Settings" = "Beállítások megnyitása"; @@ -4865,10 +4868,10 @@ alert title */ "Read more" = "Tudjon meg többet"; /* No comment provided by engineer. */ -"Read more in our GitHub repository." = "További információkat a GitHub-tárolónkban talál."; +"Read more in our GitHub repository." = "További tudnivalókat a GitHub-tárolónkban talál."; /* No comment provided by engineer. */ -"Read more in User Guide." = "További információkat a használati útmutatóban talál."; +"Read more in User Guide." = "További tudnivalókat a használati útmutatóban talál."; /* No comment provided by engineer. */ "Receipts are disabled" = "A kézbesítési jelentések le vannak tiltva"; @@ -5170,7 +5173,7 @@ swipe action */ "Reset to app theme" = "Alkalmazás témájának visszaállítása"; /* No comment provided by engineer. */ -"Reset to defaults" = "Visszaállítás alapértelmezettre"; +"Reset to defaults" = "Visszaállítás alapértelmezésre"; /* No comment provided by engineer. */ "Reset to user theme" = "Felhasználó által létrehozott téma visszaállítása"; @@ -5343,10 +5346,10 @@ chat item action */ "Saved" = "Mentett"; /* No comment provided by engineer. */ -"Saved from" = "Mentve innen"; +"saved from" = "mentve innen:"; /* No comment provided by engineer. */ -"saved from %@" = "mentve innen: %@"; +"Saved from" = "Mentve innen"; /* message info title */ "Saved message" = "Mentett üzenet"; @@ -5613,7 +5616,7 @@ chat item action */ "Server protocol changed." = "A kiszolgálóprotokoll módosult."; /* queue info */ -"server queue info: %@\n\nlast received msg: %@" = "kiszolgáló várólista-információi: %1$@\n\nutoljára fogadott üzenet: %2$@"; +"server queue info: %@\n\nlast received msg: %@" = "kiszolgáló várólistaadatai: %1$@\n\nutoljára fogadott üzenet: %2$@"; /* relay test error */ "Server requires authorization to connect to relay, check password." = "A kiszolgáló hitelesítést igényel az átjátszóhoz való kapcsolódáshoz, ellenőrizze a jelszavát."; @@ -5640,7 +5643,7 @@ chat item action */ "Servers" = "Kiszolgálók"; /* No comment provided by engineer. */ -"Servers info" = "Információk a kiszolgálókról"; +"Servers info" = "Kiszolgálóadatok"; /* No comment provided by engineer. */ "Servers statistics will be reset - this cannot be undone!" = "A kiszolgálók statisztikái visszaállnak – ez a művelet nem vonható vissza!"; @@ -7013,6 +7016,18 @@ alert title */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Már van egy csevegési profil ugyanezzel a megjelenítendő névvel. Válasszon egy másik nevet."; +/* new chat alert */ +"You are a contributor" = "Ön közreműködő"; + +/* new chat alert */ +"You are a member" = "Ön tag"; + +/* new chat alert */ +"You are a moderator" = "Ön moderátor"; + +/* new chat alert */ +"You are a subscriber" = "Ön feliratkozó"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Ön már kapcsolódott a következőhöz: %@."; @@ -7037,6 +7052,15 @@ alert title */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "A csatlakozás már folyamatban van a csoporthoz!\nMegismétli a csatlakozási kérést?"; +/* new chat alert */ +"You are an admin" = "Ön adminisztrátor"; + +/* new chat alert */ +"You are an observer" = "Ön megfigyelő"; + +/* new chat alert */ +"You are an owner" = "Ön tulajdonos"; + /* subscription status explanation */ "You are connected to the server used to receive messages from this connection." = "Ön kapcsolódott ahhoz a kiszolgálóhoz, amely az adott partnerétől érkező üzenetek fogadására szolgál."; @@ -7088,6 +7112,12 @@ alert title */ /* notification body */ "You can now chat with %@" = "Mostantól küldhet üzeneteket %@ számára"; +/* No comment provided by engineer. */ +"You can now invest in SimpleX Chat" = "Mostantól befektethet a SimpleX Chatbe"; + +/* No comment provided by engineer. */ +"You can now invest in SimpleX Chat! 🚀" = "Mostantól befektethet a SimpleX Chatbe! 🚀"; + /* No comment provided by engineer. */ "You can send messages to %@ from Archived contacts." = "Az „Archivált partnerekből” továbbra is küldhet üzeneteket neki: %@."; diff --git a/apps/ios/it.lproj/Localizable.strings b/apps/ios/it.lproj/Localizable.strings index c078f17a84..b9aafc7d4b 100644 --- a/apps/ios/it.lproj/Localizable.strings +++ b/apps/ios/it.lproj/Localizable.strings @@ -1814,6 +1814,12 @@ server test step */ /* No comment provided by engineer. */ "creator" = "creatore"; +/* No comment provided by engineer. */ +"Crowdfunding on Wefunder" = "Raccolta fondi su Wefunder"; + +/* No comment provided by engineer. */ +"Crowdfunding on Wefunder." = "Raccolta fondi su Wefunder."; + /* No comment provided by engineer. */ "Current conditions text couldn't be loaded, you can review conditions via this link:" = "Il testo delle condizioni attuali testo non è stato caricato, puoi consultare le condizioni tramite questo link:"; @@ -3153,6 +3159,9 @@ servers warning */ /* No comment provided by engineer. */ "Group invitation is no longer valid, it was removed by sender." = "L'invito al gruppo non è più valido, è stato rimosso dal mittente."; +/* No comment provided by engineer. */ +"Group invitations" = "Inviti in gruppi"; + /* No comment provided by engineer. */ "group is deleted" = "il gruppo è eliminato"; @@ -4464,15 +4473,9 @@ alert button */ /* authentication reason */ "Open migration to another device" = "Apri migrazione ad un altro dispositivo"; -/* new chat action */ -"Open new channel" = "Apri il nuovo canale"; - /* new chat action */ "Open new chat" = "Apri la nuova chat"; -/* new chat action */ -"Open new group" = "Apri il nuovo gruppo"; - /* No comment provided by engineer. */ "Open Settings" = "Apri le impostazioni"; @@ -5343,10 +5346,10 @@ chat item action */ "Saved" = "Salvato"; /* No comment provided by engineer. */ -"Saved from" = "Salvato da"; +"saved from" = "salvato da"; /* No comment provided by engineer. */ -"saved from %@" = "salvato da %@"; +"Saved from" = "Salvato da"; /* message info title */ "Saved message" = "Messaggio salvato"; @@ -7013,6 +7016,18 @@ alert title */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Hai già un profilo chat con lo stesso nome da mostrare. Scegli un altro nome."; +/* new chat alert */ +"You are a contributor" = "Sei un collaboratore"; + +/* new chat alert */ +"You are a member" = "Sei un membro"; + +/* new chat alert */ +"You are a moderator" = "Sei un moderatore"; + +/* new chat alert */ +"You are a subscriber" = "Sei iscritto/a"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Sei già connesso/a a %@."; @@ -7037,6 +7052,15 @@ alert title */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "Stai già entrando nel gruppo!\nRipetere la richiesta di ingresso?"; +/* new chat alert */ +"You are an admin" = "Sei un amministratore"; + +/* new chat alert */ +"You are an observer" = "Sei un osservatore"; + +/* new chat alert */ +"You are an owner" = "Sei un proprietario"; + /* subscription status explanation */ "You are connected to the server used to receive messages from this connection." = "Sei connesso/a al server usato per ricevere messaggi da questa connessione."; @@ -7088,6 +7112,12 @@ alert title */ /* notification body */ "You can now chat with %@" = "Ora puoi inviare messaggi a %@"; +/* No comment provided by engineer. */ +"You can now invest in SimpleX Chat" = "Ora puoi investire in SimpleX Chat"; + +/* No comment provided by engineer. */ +"You can now invest in SimpleX Chat! 🚀" = "Ora puoi investire in SimpleX Chat! 🚀"; + /* No comment provided by engineer. */ "You can send messages to %@ from Archived contacts." = "Puoi inviare messaggi a %@ dai contatti archiviati."; diff --git a/apps/ios/ja.lproj/Localizable.strings b/apps/ios/ja.lproj/Localizable.strings index 60ef7e2d36..9d5d160b0a 100644 --- a/apps/ios/ja.lproj/Localizable.strings +++ b/apps/ios/ja.lproj/Localizable.strings @@ -3475,9 +3475,21 @@ server test failure */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "同じ表示名前のチャットプロフィールが既にあります。別のを選んでください。"; +/* new chat alert */ +"You are a member" = "あなたはメンバーです"; + /* No comment provided by engineer. */ "You are already connected to %@." = "すでに %@ に接続されています。"; +/* new chat alert */ +"You are an admin" = "あなたは管理者です"; + +/* new chat alert */ +"You are an observer" = "あなたはオブザーバーです"; + +/* new chat alert */ +"You are an owner" = "あなたはオーナーです"; + /* No comment provided by engineer. */ "You are invited to group" = "グループ招待が届きました"; diff --git a/apps/ios/nl.lproj/Localizable.strings b/apps/ios/nl.lproj/Localizable.strings index 6715a09b80..4161bac952 100644 --- a/apps/ios/nl.lproj/Localizable.strings +++ b/apps/ios/nl.lproj/Localizable.strings @@ -4408,10 +4408,10 @@ chat item action */ "Saved" = "Opgeslagen"; /* No comment provided by engineer. */ -"Saved from" = "Opgeslagen van"; +"saved from" = "opgeslagen van"; /* No comment provided by engineer. */ -"saved from %@" = "opgeslagen van %@"; +"Saved from" = "Opgeslagen van"; /* message info title */ "Saved message" = "Opgeslagen bericht"; @@ -5706,6 +5706,12 @@ server test failure */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Je hebt al een chatprofiel met dezelfde weergave naam. Kies een andere naam."; +/* new chat alert */ +"You are a member" = "Je bent lid"; + +/* new chat alert */ +"You are a moderator" = "Je bent moderator"; + /* No comment provided by engineer. */ "You are already connected to %@." = "U bent al verbonden met %@."; @@ -5730,6 +5736,15 @@ server test failure */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "Je sluit je al aan bij de groep!\nDeelnameverzoek herhalen?"; +/* new chat alert */ +"You are an admin" = "Je bent beheerder"; + +/* new chat alert */ +"You are an observer" = "Je bent waarnemer"; + +/* new chat alert */ +"You are an owner" = "Je bent eigenaar"; + /* No comment provided by engineer. */ "You are invited to group" = "Je bent uitgenodigd voor de groep"; diff --git a/apps/ios/pl.lproj/Localizable.strings b/apps/ios/pl.lproj/Localizable.strings index 639d813104..3288d2545b 100644 --- a/apps/ios/pl.lproj/Localizable.strings +++ b/apps/ios/pl.lproj/Localizable.strings @@ -3900,9 +3900,6 @@ alert button */ /* new chat action */ "Open new chat" = "Otwórz nowy czat"; -/* new chat action */ -"Open new group" = "Otwórz nową grupę"; - /* No comment provided by engineer. */ "Open Settings" = "Otwórz Ustawienia"; @@ -4643,10 +4640,10 @@ chat item action */ "Saved" = "Zapisane"; /* No comment provided by engineer. */ -"Saved from" = "Zapisane od"; +"saved from" = "zapisane od"; /* No comment provided by engineer. */ -"saved from %@" = "zapisane od %@"; +"Saved from" = "Zapisane od"; /* message info title */ "Saved message" = "Zachowano wiadomość"; @@ -6056,6 +6053,12 @@ alert title */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Masz już profil czatu o tej samej nazwie wyświetlanej. Proszę wybrać inną nazwę."; +/* new chat alert */ +"You are a member" = "Jesteś członkiem"; + +/* new chat alert */ +"You are a moderator" = "Jesteś moderatorem"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Jesteś już połączony z %@."; @@ -6080,6 +6083,15 @@ alert title */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "Już dołączasz do grupy!\nPowtórzyć prośbę dołączenia?"; +/* new chat alert */ +"You are an admin" = "Jesteś administratorem"; + +/* new chat alert */ +"You are an observer" = "Jesteś obserwatorem"; + +/* new chat alert */ +"You are an owner" = "Jesteś właścicielem"; + /* subscription status explanation */ "You are connected to the server used to receive messages from this connection." = "Jesteś połączony z serwerem służącym do odbierania wiadomości z tego połączenia."; diff --git a/apps/ios/product/flows/connection.md b/apps/ios/product/flows/connection.md index 115e420f7c..7073e07070 100644 --- a/apps/ios/product/flows/connection.md +++ b/apps/ios/product/flows/connection.md @@ -113,7 +113,7 @@ Establishing contact between two SimpleX Chat users. SimpleX uses no user identi 1. When connecting to a channel link (`GroupShortLinkInfo.direct == false`): 2. `apiPrepareGroup(connLink:directLink:groupShortLinkData:)` is called with `directLink: false`, preparing the channel locally. 3. `groupShortLinkInfo.groupRelays` (hostnames) stored in `ChatModel.shared.channelRelayHostnames[groupId]`. -4. Pre-join UI shows channel icon and "Open new channel" (not "Open new group"). +4. Pre-join UI shows channel icon and "Open channel" (not "Open group"). 5. `apiConnectPreparedGroup(groupId:incognito:msg:)` returns `(GroupInfo, [RelayConnectionResult])`. 6. `RelayConnectionResult` contains `relayMember: GroupMember` and optional `relayError: ChatError?` per relay. 7. Relay members are upserted to `chatModel.groupMembers`; `channelRelayHostnames` entry is cleared. diff --git a/apps/ios/product/views/new-chat.md b/apps/ios/product/views/new-chat.md index 1ab84c098a..0d1e384325 100644 --- a/apps/ios/product/views/new-chat.md +++ b/apps/ios/product/views/new-chat.md @@ -118,10 +118,18 @@ When `planAndConnect` encounters a `.simplexLink(_, .relay, _, _)`, it shows a " | Context | Channel behavior | Group behavior | |---|---|---| | Prepare alert icon | `antenna.radiowaves.left.and.right.circle.fill` | `person.2.circle.fill` | -| Prepare alert title | "Open new channel" | "Open new group" | +| Prepare alert title | "Open channel" | "Open group" | | Error text | "Error opening channel" | "Error opening group" | | Own-link confirm | "This is your link for channel" with only "Open channel" + "Cancel" (no incognito/profile options) | Full incognito/profile selection | -| Known group alert | "Open channel" / "Open new channel" | "Open group" / "Open new group" | +| Known group alert | "Open channel", with the membership role line | "Open group", with the membership role line | + +The known group alert shows an information line with the user's role, in the +secondary color (matching the subscriber count): "You are a subscriber" / +"You are a contributor" for channels, "You are an observer" / "You are a +member" for groups, and "You are a moderator" / "You are an admin" / +"You are an owner" for both. The line is omitted for prepared chats +(`nextConnectPrepared`) and business chats, so the prepare and known alerts +differ only by this line. ### Pre-Join Relay Info diff --git a/apps/ios/ru.lproj/Localizable.strings b/apps/ios/ru.lproj/Localizable.strings index b60e4ab35e..db62641eb8 100644 --- a/apps/ios/ru.lproj/Localizable.strings +++ b/apps/ios/ru.lproj/Localizable.strings @@ -4464,15 +4464,9 @@ alert button */ /* authentication reason */ "Open migration to another device" = "Открытие миграции на другое устройство"; -/* new chat action */ -"Open new channel" = "Открыть новый канал"; - /* new chat action */ "Open new chat" = "Открыть новый чат"; -/* new chat action */ -"Open new group" = "Открыть новую группу"; - /* No comment provided by engineer. */ "Open Settings" = "Открыть Настройки"; @@ -5343,10 +5337,10 @@ chat item action */ "Saved" = "Сохранено"; /* No comment provided by engineer. */ -"Saved from" = "Сохранено из"; +"saved from" = "сохранено из"; /* No comment provided by engineer. */ -"saved from %@" = "сохранено из %@"; +"Saved from" = "Сохранено из"; /* message info title */ "Saved message" = "Сохранённое сообщение"; @@ -7013,6 +7007,18 @@ alert title */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "У Вас уже есть профиль с таким именем. Пожалуйста, выберите другое имя."; +/* new chat alert */ +"You are a contributor" = "Вы соавтор"; + +/* new chat alert */ +"You are a member" = "Вы член группы"; + +/* new chat alert */ +"You are a moderator" = "Вы модератор"; + +/* new chat alert */ +"You are a subscriber" = "Вы подписчик"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Вы уже соединены с контактом %@."; @@ -7037,6 +7043,15 @@ alert title */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "Вы уже вступаете в группу!\nПовторить запрос на вступление?"; +/* new chat alert */ +"You are an admin" = "Вы админ"; + +/* new chat alert */ +"You are an observer" = "Вы читатель"; + +/* new chat alert */ +"You are an owner" = "Вы владелец"; + /* subscription status explanation */ "You are connected to the server used to receive messages from this connection." = "Вы подключены к серверу, используемому для приёма сообщений от этого соединения."; diff --git a/apps/ios/spec/client/navigation.md b/apps/ios/spec/client/navigation.md index 920780cc0f..64d0940e39 100644 --- a/apps/ios/spec/client/navigation.md +++ b/apps/ios/spec/client/navigation.md @@ -344,7 +344,7 @@ Similarly, in `planAndConnect()` (`NewChatView.swift`), `.simplexLink(_, .relay, When `groupShortLinkInfo?.direct == false` (channel relay link), the prepare alert uses: - Channel icon: `antenna.radiowaves.left.and.right.circle.fill` -- Title: "Open new channel" +- Title: "Open channel" - Error: "Error opening channel" - `apiPrepareGroup` call passes `directLink: false` - Stores `groupShortLinkInfo.groupRelays` in `ChatModel.shared.channelRelayHostnames` @@ -355,7 +355,7 @@ For channels: shows "This is your link for channel" with only "Open channel" + " ### Known Group Alert (`showOpenKnownGroupAlert`) -For channels (`groupInfo.useRelays`): titles become "Open channel" / "Open new channel". +For channels (`groupInfo.useRelays`): the title is "Open channel"; for groups, "Open group"; business chats keep "Open chat" / "Open new chat". Unless the chat is merely prepared (`nextConnectPrepared`) or a business chat, the alert shows an information line with the user's membership role (`memberRoleInformation`) in the secondary color: subscriber/contributor for channels, observer/member for groups, moderator/admin/owner for both. --- diff --git a/apps/ios/th.lproj/Localizable.strings b/apps/ios/th.lproj/Localizable.strings index 8114685292..087baff8d8 100644 --- a/apps/ios/th.lproj/Localizable.strings +++ b/apps/ios/th.lproj/Localizable.strings @@ -3045,9 +3045,21 @@ server test failure */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "คุณมีโปรไฟล์แชทที่ใช้ชื่อแสดงเดียวกันอยู่แล้ว กรุณาเลือกชื่ออื่น"; +/* new chat alert */ +"You are a member" = "คุณเป็นสมาชิก"; + /* No comment provided by engineer. */ "You are already connected to %@." = "คุณได้เชื่อมต่อกับ %@ แล้ว"; +/* new chat alert */ +"You are an admin" = "คุณเป็นผู้ดูแลระบบ"; + +/* new chat alert */ +"You are an observer" = "คุณเป็นผู้สังเกตการณ์"; + +/* new chat alert */ +"You are an owner" = "คุณเป็นเจ้าของ"; + /* No comment provided by engineer. */ "You are invited to group" = "คุณได้รับเชิญให้เข้าร่วมกลุ่ม"; diff --git a/apps/ios/tr.lproj/Localizable.strings b/apps/ios/tr.lproj/Localizable.strings index bf570fa52e..9444453779 100644 --- a/apps/ios/tr.lproj/Localizable.strings +++ b/apps/ios/tr.lproj/Localizable.strings @@ -3886,9 +3886,6 @@ alert button */ /* new chat action */ "Open new chat" = "Yeni sohbet aç"; -/* new chat action */ -"Open new group" = "Yeni grup aç"; - /* No comment provided by engineer. */ "Open Settings" = "Ayarları aç"; @@ -4626,10 +4623,10 @@ chat item action */ "Saved" = "Kaydedildi"; /* No comment provided by engineer. */ -"Saved from" = "Tarafından kaydedildi"; +"saved from" = "kaydedildi:"; /* No comment provided by engineer. */ -"saved from %@" = "%@ tarafından kaydedildi"; +"Saved from" = "Tarafından kaydedildi"; /* message info title */ "Saved message" = "Kaydedilmiş mesaj"; @@ -6009,6 +6006,12 @@ alert title */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Aynı görünen ada sahip bir konuşma profilin zaten var. Lütfen başka bir ad seç."; +/* new chat alert */ +"You are a member" = "Üyesiniz"; + +/* new chat alert */ +"You are a moderator" = "Moderatörsünüz"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Zaten %@'a bağlısınız."; @@ -6033,6 +6036,15 @@ alert title */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "Gruba zaten katılıyorsunuz!\nKatılma isteği tekrarlansın mı?"; +/* new chat alert */ +"You are an admin" = "Yöneticisiniz"; + +/* new chat alert */ +"You are an observer" = "Gözlemcisiniz"; + +/* new chat alert */ +"You are an owner" = "Sahipsiniz"; + /* No comment provided by engineer. */ "You are invited to group" = "Gruba davet edildiniz"; diff --git a/apps/ios/uk.lproj/Localizable.strings b/apps/ios/uk.lproj/Localizable.strings index 55cce558f9..9046e21f9b 100644 --- a/apps/ios/uk.lproj/Localizable.strings +++ b/apps/ios/uk.lproj/Localizable.strings @@ -3919,9 +3919,6 @@ alert button */ /* new chat action */ "Open new chat" = "Відкрити новий чат"; -/* new chat action */ -"Open new group" = "Відкрити нову групу"; - /* No comment provided by engineer. */ "Open Settings" = "Відкрийте Налаштування"; @@ -4647,10 +4644,10 @@ chat item action */ "Saved" = "Збережено"; /* No comment provided by engineer. */ -"Saved from" = "Збережено з"; +"saved from" = "збережено з"; /* No comment provided by engineer. */ -"saved from %@" = "збережено з %@"; +"Saved from" = "Збережено з"; /* message info title */ "Saved message" = "Збережене повідомлення"; @@ -6024,6 +6021,12 @@ alert title */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "Ви вже маєте профіль у чаті з таким самим іменем. Будь ласка, виберіть інше ім'я."; +/* new chat alert */ +"You are a member" = "Ви учасник"; + +/* new chat alert */ +"You are a moderator" = "Ви модератор"; + /* No comment provided by engineer. */ "You are already connected to %@." = "Ви вже підключені до %@."; @@ -6048,6 +6051,15 @@ alert title */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "Ви вже приєдналися до групи!\nПовторити запит на приєднання?"; +/* new chat alert */ +"You are an admin" = "Ви адмін"; + +/* new chat alert */ +"You are an observer" = "Ви спостерігач"; + +/* new chat alert */ +"You are an owner" = "Ви власник"; + /* No comment provided by engineer. */ "You are invited to group" = "Запрошуємо вас до групи"; diff --git a/apps/ios/zh-Hans.lproj/Localizable.strings b/apps/ios/zh-Hans.lproj/Localizable.strings index 2781fce74a..4ef03cb433 100644 --- a/apps/ios/zh-Hans.lproj/Localizable.strings +++ b/apps/ios/zh-Hans.lproj/Localizable.strings @@ -4404,15 +4404,9 @@ alert button */ /* authentication reason */ "Open migration to another device" = "打开迁移到另一台设备"; -/* new chat action */ -"Open new channel" = "打开新频道"; - /* new chat action */ "Open new chat" = "打开新聊天"; -/* new chat action */ -"Open new group" = "打开新群"; - /* No comment provided by engineer. */ "Open Settings" = "打开设置"; @@ -5268,10 +5262,10 @@ chat item action */ "Saved" = "已保存"; /* No comment provided by engineer. */ -"Saved from" = "保存自"; +"saved from" = "保存自"; /* No comment provided by engineer. */ -"saved from %@" = "保存自 %@"; +"Saved from" = "保存自"; /* message info title */ "Saved message" = "已保存的消息"; @@ -6874,6 +6868,15 @@ alert title */ /* No comment provided by engineer. */ "You already have a chat profile with the same display name. Please choose another name." = "您已经有一个显示名相同的聊天资料。请选择另一个名字。"; +/* new chat alert */ +"You are a member" = "你是成员"; + +/* new chat alert */ +"You are a moderator" = "你是协管"; + +/* new chat alert */ +"You are a subscriber" = "你是订阅者"; + /* No comment provided by engineer. */ "You are already connected to %@." = "您已经连接到 %@。"; @@ -6898,6 +6901,15 @@ alert title */ /* new chat sheet title */ "You are already joining the group!\nRepeat join request?" = "您已经加入了这个群组!\n重复加入请求?"; +/* new chat alert */ +"You are an admin" = "你是管理员"; + +/* new chat alert */ +"You are an observer" = "你是观察者"; + +/* new chat alert */ +"You are an owner" = "你是群主"; + /* subscription status explanation */ "You are connected to the server used to receive messages from this connection." = "你已连接到用于接收该连接消息的服务器。"; diff --git a/apps/multiplatform/CODE.md b/apps/multiplatform/CODE.md index 26a36e75bb..67fa676414 100644 --- a/apps/multiplatform/CODE.md +++ b/apps/multiplatform/CODE.md @@ -289,6 +289,7 @@ desktop/src/jvmMain/kotlin/chat/simplex/desktop/ -- Desktop app (1 file) | common/.../common/StoreWindowState.kt (desktopMain) | spec/architecture.md | product/views/settings.md | | common/.../common/model/NtfManager.desktop.kt (desktopMain) | spec/services/notifications.md | product/flows/messaging.md | | common/.../common/views/helpers/AppUpdater.kt (desktopMain) | spec/architecture.md | product/views/settings.md | +| common/.../common/platform/AnimatedImage.desktop.kt (desktopMain) | spec/client/chat-view.md | product/views/chat.md | ### Haskell Core Sources (at `../../src/Simplex/Chat/` relative to `apps/multiplatform/`) diff --git a/apps/multiplatform/common/build.gradle.kts b/apps/multiplatform/common/build.gradle.kts index 43bc114f21..413667c968 100644 --- a/apps/multiplatform/common/build.gradle.kts +++ b/apps/multiplatform/common/build.gradle.kts @@ -72,7 +72,6 @@ kotlin { api("org.jetbrains.compose.ui:ui-text:${rootProject.extra["compose.version"] as String}") implementation("org.jetbrains.compose.material:material-icons-core:1.7.3") implementation("org.jetbrains.compose.material:material-icons-extended:1.7.3") - implementation("org.jetbrains.compose.components:components-animatedimage:${rootProject.extra["compose.version"] as String}") //Barcode api("org.boofcv:boofcv-core:1.1.3") implementation("com.godaddy.android.colorpicker:compose-color-picker-jvm:0.7.0") @@ -212,7 +211,7 @@ afterEvaluate { val fontLtGtRegex = Regex("[^>]*>.*<font[^>]*>.*</font>.*") val unbracketedColorRegex = Regex("color=#[abcdefABCDEF0-9]{3,6}") val correctHtmlRegex = Regex("[^>]*>.*.*.*|[^>]*>.*.*.*|[^>]*>.*.*.*|[^>]*>.*]*>.*.*") - val possibleFormat = listOf("s", "d", "1\$s", "2\$s", "3\$s", "4\$s", "1\$d", "2\$d", "3\$d", "4\$d", "2s", "f") + val possibleFormat = listOf("s", "d", "1\$s", "2\$s", "3\$s", "4\$s", "1\$d", "2\$d", "3\$d", "4\$d", "1\$02d", "2\$02d", "3\$02d", "2s", "f") fun String.id(): String = replace(" ImageGalleryProvider, smallView: Boolean, + blurred: State, // coil drives the animation itself here, so there is nothing to pause ImageView: @Composable (painter: Painter, onClick: () -> Unit) -> Unit ) { val context = LocalContext.current diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 11da8b874e..3ba5bcf6ad 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -2182,7 +2182,7 @@ enum class BadgeStatus { @Serializable data class BadgeInfo( val badgeType: BadgeType, - val badgeExpiry: Instant? = null, + val badgeExpiry: Instant, val badgeExtra: String = "" ) @@ -3925,13 +3925,15 @@ enum class MsgDirection { sealed class CIForwardedFrom { @Serializable @SerialName("unknown") object Unknown: CIForwardedFrom() @Serializable @SerialName("contact") class Contact(override val chatName: String, val msgDir: MsgDirection, val contactId: Long? = null, val chatItemId: Long? = null): CIForwardedFrom() - @Serializable @SerialName("group") class Group(override val chatName: String, val msgDir: MsgDirection, val groupId: Long? = null, val chatItemId: Long? = null): CIForwardedFrom() + @Serializable @SerialName("group") class Group(override val chatName: String, val msgDir: MsgDirection, val groupId: Long? = null, val chatItemId: Long? = null, val memberId: String? = null, val sharedMsgId_: String? = null, val groupType: GroupType? = null): CIForwardedFrom() + @Serializable @SerialName("groupLink") class GroupLink(override val chatName: String, val msgDir: MsgDirection, val groupLink: String, val publicGroupId: String, val memberId: String? = null, val sharedMsgId: String, val groupType: GroupType? = null): CIForwardedFrom() open val chatName: String get() = when (this) { Unknown -> "" is Contact -> chatName is Group -> chatName + is GroupLink -> chatName } val chatTypeApiIdMsgId: Triple? @@ -3939,18 +3941,15 @@ sealed class CIForwardedFrom { Unknown -> null is Contact -> if (contactId != null) Triple(ChatType.Direct, contactId, chatItemId) else null is Group -> if (groupId != null) Triple(ChatType.Group, groupId, chatItemId) else null + is GroupLink -> null } + val sourceGroupLink: String? + get() = if (this is GroupLink) groupLink else null + fun text(chatType: ChatType): String = - if (chatType == ChatType.Local) { - if (chatName.isEmpty()) { - generalGetString(MR.strings.saved_description) - } else { - generalGetString(MR.strings.saved_from_description).format(chatName) - } - } else { - generalGetString(MR.strings.forwarded_description) - } + if (chatType == ChatType.Local) generalGetString(MR.strings.saved_description) + else generalGetString(MR.strings.forwarded_description) } @Serializable @@ -4253,8 +4252,11 @@ data class CIFile( val fileSize: Long, val fileSource: CryptoFile? = null, val fileStatus: CIFileStatus, - val fileProtocol: FileProtocol + val fileProtocol: FileProtocol, + val fileExpires: Instant? = null ) { + val expired: Boolean = fileExpires != null && fileExpires < Clock.System.now() + val loaded: Boolean = when (fileStatus) { is CIFileStatus.SndStored -> true is CIFileStatus.SndTransfer -> true @@ -4304,7 +4306,7 @@ data class CIFile( is CIFileStatus.SndCancelled -> true is CIFileStatus.SndError -> true is CIFileStatus.SndWarning -> true - is CIFileStatus.RcvInvitation -> false + is CIFileStatus.RcvInvitation -> expired is CIFileStatus.RcvAccepted -> true is CIFileStatus.RcvTransfer -> true is CIFileStatus.RcvAborted -> true diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index c351ee3281..63d0f4f82a 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -1161,9 +1161,9 @@ object ChatController { return null } - suspend fun apiGetChatItemInfo(rh: Long?, type: ChatType, id: Long, scope: GroupChatScope?, itemId: Long): ChatItemInfo? { + suspend fun apiGetChatItemInfo(rh: Long?, type: ChatType, id: Long, scope: GroupChatScope?, itemId: Long): Pair? { val r = sendCmd(rh, CC.ApiGetChatItemInfo(type, id, scope, itemId)) - if (r is API.Result && r.res is CR.ApiChatItemInfo) return r.res.chatItemInfo + if (r is API.Result && r.res is CR.ApiChatItemInfo) return r.res.chatItem.chatItem to r.res.chatItemInfo apiErrorAlert("apiGetChatItemInfo", generalGetString(MR.strings.error_loading_details), r) return null } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemInfoView.kt index 64c6160665..554d79ebae 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatItemInfoView.kt @@ -273,6 +273,11 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools if (deleteAt != null) { InfoRow(stringResource(MR.strings.info_row_disappears_at), localTimestamp(deleteAt)) } + val file = ci.file + if (file?.fileExpires != null) { + val expiresRes = if (file.expired) MR.strings.info_row_file_expired else MR.strings.info_row_file_expires + InfoRow(stringResource(expiresRes), localTimestamp(file.fileExpires)) + } if (ci.meta.msgVerified?.verified == true) { val signedRes = if (sent) MR.strings.info_row_signed else MR.strings.info_row_signed_verified InfoRow(stringResource(signedRes), "", icon = painterResource(MR.images.ic_verified)) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt index 9bbfda558f..cb36d86230 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt @@ -699,7 +699,7 @@ fun ChatView( } }, showItemDetails = { cInfo, cItem -> - suspend fun loadChatItemInfo(): ChatItemInfo? = coroutineScope { + suspend fun loadChatItemInfo(): Pair? = coroutineScope { val ciInfo = chatModel.controller.apiGetChatItemInfo(chatRh, cInfo.chatType, cInfo.apiId, cInfo.groupChatScope(), cItem.id) if (ciInfo != null) { if (chatInfo is ChatInfo.Group) { @@ -717,11 +717,12 @@ fun ChatView( } ModalManager.end.showModalCloseable(endButtons = { ShareButton { - clipboard.shareText(itemInfoShareText(chatModel, cItem, initialCiInfo, chatModel.controller.appPrefs.developerTools.get())) + clipboard.shareText(itemInfoShareText(chatModel, initialCiInfo.first, initialCiInfo.second, chatModel.controller.appPrefs.developerTools.get())) } }) { close -> var ciInfo by remember(cItem.id) { mutableStateOf(initialCiInfo) } - ChatItemInfoView(chatRh, cItem, ciInfo, devTools = chatModel.controller.appPrefs.developerTools.get(), chatInfo) + val (item, info) = ciInfo + ChatItemInfoView(chatRh, item, info, devTools = chatModel.controller.appPrefs.developerTools.get(), chatInfo) LaunchedEffect(cItem.id) { withContext(Dispatchers.Default) { for (msg in controller.messagesChannel) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIFileView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIFileView.kt index 28afc0132f..8d107ae32a 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIFileView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIFileView.kt @@ -101,7 +101,7 @@ fun CIFileView( FileProtocol.LOCAL -> {} } file.fileStatus is CIFileStatus.RcvError -> - showFileErrorAlert(file.fileStatus.rcvFileError) + showFileErrorAlert(file.fileStatus.rcvFileError, file) file.fileStatus is CIFileStatus.RcvWarning -> showFileErrorAlert(file.fileStatus.rcvFileError, temporary = true) file.fileStatus is CIFileStatus.SndError -> @@ -157,10 +157,12 @@ fun CIFileView( is CIFileStatus.SndError -> fileIcon(innerIcon = painterResource(MR.images.ic_close)) is CIFileStatus.SndWarning -> fileIcon(innerIcon = painterResource(MR.images.ic_warning_filled)) is CIFileStatus.RcvInvitation -> - if (fileSizeValid(file, senderProfile)) - fileIcon(innerIcon = painterResource(MR.images.ic_arrow_downward), color = MaterialTheme.colors.primary, topPadding = 10.sp.toDp()) - else + if (!fileSizeValid(file, senderProfile)) fileIcon(innerIcon = painterResource(MR.images.ic_priority_high), color = WarningOrange) + else if (file.expired) + fileIcon(innerIcon = painterResource(MR.images.ic_close)) + else + fileIcon(innerIcon = painterResource(MR.images.ic_arrow_downward), color = MaterialTheme.colors.primary, topPadding = 10.sp.toDp()) is CIFileStatus.RcvAccepted -> fileIcon(innerIcon = painterResource(MR.images.ic_more_horiz)) is CIFileStatus.RcvTransfer -> if (file.fileProtocol == FileProtocol.XFTP && file.fileStatus.rcvProgress < file.fileStatus.rcvTotal) { @@ -241,7 +243,15 @@ fun CIFileView( fun fileSizeValid(file: CIFile, senderProfile: LocalProfile?): Boolean = file.fileSize <= getMaxFileSize(file.fileProtocol, senderProfile) -fun showFileErrorAlert(err: FileError, temporary: Boolean = false) { +fun showFileErrorAlert(err: FileError, file: CIFile? = null, temporary: Boolean = false) { + val fileExpires = file?.fileExpires + if (file != null && fileExpires != null && file.expired && (err is FileError.Auth || err is FileError.NoFile)) { + AlertManager.shared.showAlertMsg( + generalGetString(MR.strings.file_expired), + String.format(generalGetString(MR.strings.file_error_expired), localTimestamp(fileExpires)) + ) + return + } val title: String = generalGetString(if (temporary) MR.strings.temporary_file_error else MR.strings.file_error) val btn = err.moreInfoButton if (btn != null) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.kt index 7ce44475b5..fe6a1bf4b7 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.kt @@ -83,7 +83,11 @@ fun CIImageView( is CIFileStatus.SndCancelled -> fileIcon(painterResource(MR.images.ic_close), MR.strings.icon_descr_file) is CIFileStatus.SndError -> fileIcon(painterResource(MR.images.ic_close), MR.strings.icon_descr_file) is CIFileStatus.SndWarning -> fileIcon(painterResource(MR.images.ic_warning_filled), MR.strings.icon_descr_file) - is CIFileStatus.RcvInvitation -> fileIcon(painterResource(MR.images.ic_arrow_downward), MR.strings.icon_descr_asked_to_receive) + is CIFileStatus.RcvInvitation -> + if (file.expired && fileSizeValid(file, senderProfile)) + fileIcon(painterResource(MR.images.ic_close), MR.strings.icon_descr_file) + else + fileIcon(painterResource(MR.images.ic_arrow_downward), MR.strings.icon_descr_asked_to_receive) is CIFileStatus.RcvAccepted -> fileIcon(painterResource(MR.images.ic_more_horiz), MR.strings.icon_descr_waiting_for_image) is CIFileStatus.RcvTransfer -> progressIndicator() is CIFileStatus.RcvComplete -> {} @@ -210,7 +214,7 @@ fun CIImageView( val loaded = res.value if (loaded != null && file != null) { val (imageBitmap, data, _) = loaded - SimpleAndAnimatedImageView(data, imageBitmap, file, imageProvider, smallView, @Composable { painter, onClick -> ImageView(painter, image, file.fileSource, onClick) }) + SimpleAndAnimatedImageView(data, imageBitmap, file, imageProvider, smallView, blurred, @Composable { painter, onClick -> ImageView(painter, image, file.fileSource, onClick) }) } else { imageView(previewBitmap, onClick = { if (file != null) { @@ -239,7 +243,7 @@ fun CIImageView( FileProtocol.LOCAL -> {} } file.fileStatus is CIFileStatus.RcvError -> - showFileErrorAlert(file.fileStatus.rcvFileError) + showFileErrorAlert(file.fileStatus.rcvFileError, file) file.fileStatus is CIFileStatus.RcvWarning -> showFileErrorAlert(file.fileStatus.rcvFileError, temporary = true) file.fileStatus is CIFileStatus.SndError -> @@ -281,5 +285,6 @@ expect fun SimpleAndAnimatedImageView( file: CIFile?, imageProvider: () -> ImageGalleryProvider, smallView: Boolean, + blurred: State, ImageView: @Composable (painter: Painter, onClick: () -> Unit) -> Unit ) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIVideoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIVideoView.kt index 8ca0add460..20d9d4417a 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIVideoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIVideoView.kt @@ -135,10 +135,10 @@ fun CIVideoView( } // Do not show download icon when the view is blurred if (!smallView && (!showDownloadButton(file?.fileStatus) || !blurred.value)) { - fileStatusIcon(file, false) + fileStatusIcon(file, false, senderProfile) } else if (smallView && file?.showStatusIconInSmallView == true) { Box(Modifier.align(Alignment.Center)) { - fileStatusIcon(file, true) + fileStatusIcon(file, true, senderProfile) } } } @@ -486,7 +486,7 @@ private fun progressCircle(progress: Long, total: Long) { } @Composable -private fun fileStatusIcon(file: CIFile?, smallView: Boolean) { +private fun fileStatusIcon(file: CIFile?, smallView: Boolean, senderProfile: LocalProfile?) { if (file != null) { Box( Modifier @@ -525,7 +525,11 @@ private fun fileStatusIcon(file: CIFile?, smallView: Boolean) { showFileErrorAlert(file.fileStatus.sndFileError, temporary = true) } ) - is CIFileStatus.RcvInvitation -> fileIcon(painterResource(MR.images.ic_arrow_downward), MR.strings.icon_descr_video_asked_to_receive) + is CIFileStatus.RcvInvitation -> + if (file.expired && fileSizeValid(file, senderProfile)) + fileIcon(painterResource(MR.images.ic_close), MR.strings.icon_descr_file) + else + fileIcon(painterResource(MR.images.ic_arrow_downward), MR.strings.icon_descr_video_asked_to_receive) is CIFileStatus.RcvAccepted -> fileIcon(painterResource(MR.images.ic_more_horiz), MR.strings.icon_descr_waiting_for_video) is CIFileStatus.RcvTransfer -> if (file.fileProtocol == FileProtocol.XFTP && file.fileStatus.rcvProgress < file.fileStatus.rcvTotal) { @@ -541,7 +545,7 @@ private fun fileStatusIcon(file: CIFile?, smallView: Boolean) { painterResource(MR.images.ic_close), MR.strings.icon_descr_file, onClick = { - showFileErrorAlert(file.fileStatus.rcvFileError) + showFileErrorAlert(file.fileStatus.rcvFileError, file) } ) is CIFileStatus.RcvWarning -> diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIVoiceView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIVoiceView.kt index 136300e4ed..c3e1c92732 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIVoiceView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIVoiceView.kt @@ -412,7 +412,7 @@ private fun VoiceMsgIndicator( } ) file?.fileStatus is CIFileStatus.RcvInvitation -> - PlayPauseButton(audioPlaying, sent, 0f, strokeWidth, strokeColor, true, error, sizeMultiplier, { receiveFile(file.fileId) }, {}, longClick = longClick) + PlayPauseButton(audioPlaying, sent, 0f, strokeWidth, strokeColor, true, error, sizeMultiplier, { receiveFile(file.fileId) }, {}, longClick = longClick, icon = if (file.expired) MR.images.ic_close else MR.images.ic_play_arrow_filled) file?.fileStatus is CIFileStatus.RcvTransfer || file?.fileStatus is CIFileStatus.RcvAccepted -> VoiceMsgLoadingProgressIndicator(sizeMultiplier) file?.fileStatus is CIFileStatus.RcvAborted -> @@ -424,7 +424,7 @@ private fun VoiceMsgIndicator( sizeMultiplier, longClick, onClick = { - showFileErrorAlert(file.fileStatus.rcvFileError) + showFileErrorAlert(file.fileStatus.rcvFileError, file) } ) file != null && file.fileStatus is CIFileStatus.RcvWarning -> diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/FramedItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/FramedItemView.kt index cbd15aca67..c919859b1f 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/FramedItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/FramedItemView.kt @@ -23,6 +23,7 @@ import chat.simplex.common.platform.* import chat.simplex.common.ui.theme.* import chat.simplex.common.views.chat.* import chat.simplex.common.views.helpers.* +import chat.simplex.common.views.chatlist.openChat import chat.simplex.common.views.newchat.planAndConnect import chat.simplex.res.MR import kotlinx.coroutines.Dispatchers @@ -101,14 +102,35 @@ fun FramedItemView( } @Composable - fun FramedItemHeader(caption: String, italic: Boolean, icon: Painter? = null, pad: Boolean = false, iconColor: Color? = null) { + fun HeaderText(caption: String, italic: Boolean, fontSize: TextUnit = 12.sp, modifier: Modifier = Modifier) { + Text( + modifier = modifier, + text = buildAnnotatedString { + withStyle(SpanStyle(fontSize = fontSize, fontStyle = if (italic) FontStyle.Italic else FontStyle.Normal, color = MaterialTheme.colors.secondary)) { + append(caption) + } + }, + style = MaterialTheme.typography.body1.copy(lineHeight = 22.sp), + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + + @Composable + fun headerModifier(pad: Boolean, onClick: (() -> Unit)? = null): Modifier { val sentColor = MaterialTheme.appColors.sentQuote val receivedColor = MaterialTheme.appColors.receivedQuote + return Modifier + .background(if (sent) sentColor else receivedColor) + .fillMaxWidth() + .then(if (onClick != null) Modifier.clickable(onClick = onClick) else Modifier) + .padding(start = 8.dp, top = 6.dp, end = 12.dp, bottom = if (pad || (ci.quotedItem == null && ci.meta.itemForwarded == null)) 6.dp else 0.dp) + } + + @Composable + fun HeaderRow(modifier: Modifier, caption: String, italic: Boolean, icon: Painter?, iconColor: Color?) { Row( - Modifier - .background(if (sent) sentColor else receivedColor) - .fillMaxWidth() - .padding(start = 8.dp, top = 6.dp, end = 12.dp, bottom = if (pad || (ci.quotedItem == null && ci.meta.itemForwarded == null)) 6.dp else 0.dp), + modifier, horizontalArrangement = Arrangement.spacedBy(4.dp), verticalAlignment = Alignment.CenterVertically ) { @@ -120,19 +142,15 @@ fun FramedItemView( tint = iconColor ?: if (isInDarkTheme()) FileDark else FileLight ) } - Text( - buildAnnotatedString { - withStyle(SpanStyle(fontSize = 12.sp, fontStyle = if (italic) FontStyle.Italic else FontStyle.Normal, color = MaterialTheme.colors.secondary)) { - append(caption) - } - }, - style = MaterialTheme.typography.body1.copy(lineHeight = 22.sp), - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) + HeaderText(caption, italic) } } + @Composable + fun FramedItemHeader(caption: String, italic: Boolean, icon: Painter? = null, pad: Boolean = false, iconColor: Color? = null) { + HeaderRow(headerModifier(pad), caption, italic, icon, iconColor) + } + @Composable fun ciQuoteView(qi: CIQuote) { val sentColor = MaterialTheme.appColors.sentQuote @@ -293,8 +311,38 @@ fun FramedItemView( } } else { Header() - if (ci.meta.itemForwarded != null) { - FramedItemHeader(ci.meta.itemForwarded.text(chatInfo.chatType), true, painterResource(MR.images.ic_forward), pad = true) + val forwarded = ci.meta.itemForwarded + if (forwarded != null) { + val twoRowHeader = if (chatInfo.chatType == ChatType.Local) { + forwarded.chatTypeApiIdMsgId != null || forwarded.sourceGroupLink != null + } else { + when (forwarded) { + is CIForwardedFrom.Group -> forwarded.groupType != null + is CIForwardedFrom.GroupLink -> true + else -> false + } + } + if (twoRowHeader) { + val caption = stringResource(if (chatInfo.chatType == ChatType.Local) MR.strings.saved_from else MR.strings.forwarded_from) + Column( + headerModifier(pad = true, onClick = { + val target = forwarded.chatTypeApiIdMsgId + val link = forwarded.sourceGroupLink + if (target != null) { + val (chatType, apiId, itemId) = target + withBGApi { openChat(secondaryChatsCtx = null, chat.remoteHostId, chatType, apiId, itemId) } + } else if (link != null) { + withBGApi { planAndConnect(chat.remoteHostId, link, close = null) } + } + }), + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + HeaderRow(Modifier, caption, true, painterResource(MR.images.ic_forward), null) + HeaderText(forwarded.chatName, italic = false, fontSize = 15.sp, modifier = Modifier.offset(y = (-2).dp)) + } + } else { + FramedItemHeader(forwarded.text(chatInfo.chatType), true, painterResource(MR.images.ic_forward), pad = true) + } } } if (ci.file == null && ci.formattedText == null && !ci.meta.isLive && isShortEmoji(ci.content.text)) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ImageFullScreenView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ImageFullScreenView.kt index 8d96102daa..b1604adc84 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ImageFullScreenView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ImageFullScreenView.kt @@ -148,8 +148,6 @@ fun ImageFullScreenView(imageProvider: () -> ImageGalleryProvider, close: () -> ) } .fillMaxSize() - // LALAL - // https://github.com/JetBrains/compose-multiplatform/pull/2015/files#diff-841b3825c504584012e1d1c834d731bae794cce6acad425d81847c8bbbf239e0R24 if (media is ProviderMedia.Image) { val (data: ByteArray, imageBitmap: ImageBitmap) = media FullScreenImageView(modifier, data, imageBitmap) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt index f70e4d0048..62ba2c10f3 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt @@ -294,6 +294,7 @@ class AlertManager { nameCaption: String? = null, subtitle: String? = null, information: String? = null, + secondaryInformation: Boolean = false, confirmText: String? = generalGetString(MR.strings.connect_plan_open_chat), onConfirm: (() -> Unit)? = null, connectOtherButton: String? = null, @@ -378,6 +379,7 @@ class AlertManager { information, textAlign = TextAlign.Center, style = MaterialTheme.typography.body2, + color = if (secondaryInformation) MaterialTheme.colors.secondary else Color.Unspecified, maxLines = 3, modifier = Modifier.fillMaxWidth() ) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ChatInfoImage.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ChatInfoImage.kt index d2ee1db09c..31a6be5500 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ChatInfoImage.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/ChatInfoImage.kt @@ -231,10 +231,9 @@ fun showBadgeInfoAlert(name: String, badge: LocalBadge, uriHandler: UriHandler) ) else -> { // Supporter, Legend and unknown types use the supporter wording - val expiry = badge.badge.badgeExpiry val supports = - if (badge.status == BadgeStatus.Expired && expiry != null) - String.format(generalGetString(MR.strings.badge_supported_simplex), name, localDate(expiry)) + if (badge.status == BadgeStatus.Expired) + String.format(generalGetString(MR.strings.badge_supported_simplex), name, localDate(badge.badge.badgeExpiry)) else String.format(generalGetString(MR.strings.badge_supports_simplex), name) AlertManager.shared.showAlertMsg( diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt index 161681c91d..5e5769891a 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt @@ -656,11 +656,24 @@ private fun showOpenKnownGroupAlert(chatModel: ChatModel, rhId: Long?, close: (( }, nameCaption = planSimplexName?.shortStr, subtitle = subscriberCount, + information = if (groupInfo.nextConnectPrepared || groupInfo.businessChat != null) { + null + } else { + val isChannel = groupInfo.useRelays + generalGetString(when (groupInfo.membership.memberRole) { + GroupMemberRole.Observer -> if (isChannel) MR.strings.connect_plan_you_are_subscriber else MR.strings.connect_plan_you_are_observer + GroupMemberRole.Moderator -> MR.strings.connect_plan_you_are_moderator + GroupMemberRole.Admin -> MR.strings.connect_plan_you_are_admin + GroupMemberRole.Owner -> MR.strings.connect_plan_you_are_owner + else -> if (isChannel) MR.strings.connect_plan_you_are_contributor else MR.strings.connect_plan_you_are_member + }) + }, + secondaryInformation = true, confirmText = generalGetString( if (groupInfo.useRelays) { - if (groupInfo.nextConnectPrepared) MR.strings.connect_plan_open_new_channel else MR.strings.connect_plan_open_channel + MR.strings.connect_plan_open_channel } else if (groupInfo.businessChat == null) { - if (groupInfo.nextConnectPrepared) MR.strings.connect_plan_open_new_group else MR.strings.connect_plan_open_group + MR.strings.connect_plan_open_group } else { if (groupInfo.nextConnectPrepared) MR.strings.connect_plan_open_new_chat else MR.strings.connect_plan_open_chat } @@ -761,7 +774,7 @@ fun showPrepareGroupAlert( nameCaption = planSimplexName?.shortStr, subtitle = subscriberCount, information = ownerVerificationMessage(ownerVerification), - confirmText = generalGetString(if (isChannel) MR.strings.connect_plan_open_new_channel else MR.strings.connect_plan_open_new_group), + confirmText = generalGetString(if (isChannel) MR.strings.connect_plan_open_channel else MR.strings.connect_plan_open_group), onConfirm = { AlertManager.privacySensitive.hideAlert() withBGApi { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SetSimplexNameView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SetSimplexNameView.kt index 7ab1ffa33d..f2c7b02b42 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SetSimplexNameView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/SetSimplexNameView.kt @@ -14,7 +14,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.* +import androidx.compose.ui.unit.* import chat.simplex.common.platform.* import chat.simplex.common.ui.theme.* import chat.simplex.common.views.* @@ -24,10 +25,14 @@ import chat.simplex.res.MR import dev.icerock.moko.resources.compose.painterResource import dev.icerock.moko.resources.compose.stringResource import kotlinx.coroutines.* +import kotlinx.datetime.* // Each dot-separated label is ASCII letters/digits with single internal hyphens (mirrors simplexmq SimplexName.hs nameLabelP). private val simplexNameLabelRegex = Regex("[A-Za-z0-9]+(-[A-Za-z0-9]+)*") +private val simplexNameSaleStart = LocalDateTime(2026, 12, 12, 18, 0).toInstant(TimeZone.UTC) +private const val SIMPLEX_DOMAINS_URL = "https://simplex.domains/" + // Set the user's own (prefix "@") or a channel's (prefix "#") SimpleX name. // The field is prefilled with the full prefixed name; `save` receives the encoded name (or null to // clear) and returns true on success (it shows its own error alert otherwise). @@ -128,6 +133,13 @@ fun SetSimplexDomainView( } } + fun saleCountdown(msRemaining: Long): String { + val total = (msRemaining / 1000).coerceAtLeast(0) + val days = total / 86400 + val dayStr = String.format(generalGetString(if (days == 1L) MR.strings.ttl_day else MR.strings.ttl_days), days) + return dayStr + " " + String.format(generalGetString(MR.strings.countdown_hrs_min_sec), total / 3600 % 24, total / 60 % 60, total % 60) + } + ModalView(close = { onClose(close) }, cardScreen = true) { ColumnWithScrollBar { AppBarTitle(title) @@ -163,7 +175,7 @@ fun SetSimplexDomainView( SettingsActionItem( painterResource(MR.images.ic_open_in_new), stringResource(MR.strings.register_test_name), - { openBrowserAlert("https://github.com/simplex-chat/simplex-chat/blob/master/docs/guide/register-simplex-name.md", uriHandler) }, + { openBrowserAlert("https://simplex.domains/#testing", uriHandler) }, textColor = MaterialTheme.colors.primary, iconColor = MaterialTheme.colors.primary ) @@ -179,6 +191,35 @@ fun SetSimplexDomainView( } } } + SectionDividerSpaced() + val msToSaleStart = remember { mutableStateOf(simplexNameSaleStart.toEpochMilliseconds() - System.currentTimeMillis()) } + LaunchedEffect(Unit) { + while (msToSaleStart.value > 0) { + delay(1000) + msToSaleStart.value = simplexNameSaleStart.toEpochMilliseconds() - System.currentTimeMillis() + } + } + SectionView(stringResource(MR.strings.simplex_name_sales)) { + SectionItemView { + Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { + Text(saleCountdown(msToSaleStart.value)) + Text( + stringResource(if (msToSaleStart.value > 0) MR.strings.until_register_simplex_domain else MR.strings.update_app_register_simplex_domain), + color = MaterialTheme.colors.secondary, + fontSize = 12.sp + ) + } + } + } + SectionTextFooter(buildAnnotatedString { + append(generalGetString(MR.strings.simplex_name_sales_footer)) + append(" ") + withLink(LinkAnnotation.Url(SIMPLEX_DOMAINS_URL) { uriHandler.openUriCatching(SIMPLEX_DOMAINS_URL) }) { + withStyle(SpanStyle(color = MaterialTheme.colors.primary)) { + append("simplex.domains") + } + } + }) SectionBottomSpacer() } } diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml index 1d0004bb66..2ab1933418 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml @@ -1219,6 +1219,13 @@ تحديث إعدادات الشبكة؟ سيؤدي تحديث الإعدادات إلى إعادة توصيل العميل بجميع الخوادم. أنت المراقب + أنت المراقب + أنت عضو + أنت مُشرف + أنت المُدير + أنت المالك + أنت مشترك + أنت مساهم أنت مدعو إلى المجموعة في انتظار التأكيد… خطأ غير معروف في قاعدة البيانات: %s @@ -1710,7 +1717,7 @@ لا يستطيع المُستلم/ون معرفة مَن أرسل هذه الرسالة. حُفظت حُفظت مِن - حُفظت مِن %s + حُفظت مِن السماعة سماعة الأذن سماعات الرأس @@ -2484,7 +2491,7 @@ شارك الرابط القديم سيكون الرابط قصيراً، وسيتم مشاركة الملف التعريفي للمجموعة عبر الرابط. رقِّ رابط المجموعة - طلبات التواصل من المجموعات + طلبات التواصل في المجموعات حُذف العضو - لا يمكن قبول الطلب طُلب اتصال من المجموعة %1$s هذا الإعداد لملف تعريفك الحالي @@ -2906,4 +2913,6 @@ الأسماء العامة لقناتك أو لشركتك. خوادم الملفات خوادم الملفات: %s + دعوات المجموعات + مُحوّلة مِن diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/az/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/az/strings.xml new file mode 100644 index 0000000000..55344e5192 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/MR/az/strings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index d7e9fc936e..622ff9d9dc 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -20,6 +20,11 @@ Open new chat Open group Open new group + You are an observer + You are a member + You are a moderator + You are an admin + You are an owner Invalid link Please check that SimpleX link is correct. @@ -65,8 +70,9 @@ LIVE moderated forwarded + forwarded from saved - saved from %s + saved from invalid chat invalid data error showing message @@ -397,6 +403,11 @@ Get SimpleX name (BETA) Channel SimpleX name How to register a test name + SimpleX name sale starts in + until you can register a SimpleX domain + Update the app to register a SimpleX domain + %1$02d hrs %2$02d min %3$02d sec + Crowdfunding investors can reserve names before the sale starts: Remove name Save Edit @@ -686,6 +697,8 @@ Loading the file Please, wait while the file is being loaded from the linked mobile File error + File expired + File was available until %1$s. Temporary file error Open with %s @@ -2033,6 +2046,8 @@ Deleted at Moderated at Disappears at + File available until + File was available until Database ID: %d Record updated at: %s Message status: %s @@ -3170,6 +3185,8 @@ This is a chat relay address, it cannot be used to connect. Open channel Open new channel + You are a subscriber + You are a contributor Your channel %1$s!]]> Error opening channel diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml index 83e10a81c3..c79aa07a1e 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/bg/strings.xml @@ -1301,6 +1301,11 @@ Отключи Ще трябва да се идентифицирате, когато стартирате или възобновите приложението след 30 секунди във фонов режим. вие сте наблюдател + Вие сте наблюдател + Вие сте член + Вие сте модератор + Вие сте админ + Вие сте собственик Видео се свържете с разработчиците на SimpleX Chat, за да задавате въпроси и да получавате актуализации;.]]> иска да се свърже с вас! @@ -1723,7 +1728,7 @@ Препращане и запазване на съобщения Звуци по време на разговор запазено - запазено от %s + запазено от Запазено Запазено от Получателят(ите) не могат да видят от кого е това съобщение. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/bn/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/bn/strings.xml index bb448339bd..dfcfb1685c 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/bn/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/bn/strings.xml @@ -23,6 +23,7 @@ কলটি গৃহীত হয়েছে পূর্বনির্ধারিত সার্ভারগুলি যুক্ত করুন অ্যাডমিন + আপনি একজন অ্যাডমিন স্বাগত বার্তা যুক্ত করুন প্রোফাইল যুক্ত করুন আনুষঙ্গিক রং diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml index 1ab559c09c..3d49c533ff 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml @@ -1573,7 +1573,7 @@ Notes privades la recepció de fitxers encara no està suportada sol·licitada connexió - desat des de %s + desat des de Adreça de contacte SimpleX Enllaç de grup SimpleX Enllaços SimpleX @@ -1715,6 +1715,11 @@ La imatge no es pot descodificar. Si us plau, proveu amb una imatge diferent o contacteu amb els desenvolupadors. El vídeo no es pot descodificar. Si us plau, prova amb un vídeo diferent o contacta amb els desenvolupadors. ets observador + Ets observador + Ets membre + Ets moderador + Ets administrador + Ets propietari ets observador(a) Poseu-vos en contacte amb l\'administrador del grup. Només els propietaris del grup poden activar fitxers i mitjans. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml index 0fca3db40e..ff712dfec5 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml @@ -931,6 +931,11 @@ Moderovat Kontaktujte prosím správce skupiny. jste pozorovatel + Jste pozorovatel + Jste člen + Jste moderátor + Jste správce + Jste vlastník pozorovatel Zpráva bude smazána pro všechny členy. Zpráva bude pro všechny členy označena jako moderovaná. @@ -1693,7 +1698,7 @@ Spolehlivější síťové připojení. Povolit odesílat SimpleX odkazy. uloženo - Uloženo z %s + Uloženo z Uloženo Přeposláno Uloženo z @@ -2774,4 +2779,6 @@ O aplikaci odmítnuto odmítnuto operátorem relé + Pokročilé možnosti + Pokročilé nastavení diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/da/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/da/strings.xml index 21331d5889..82f8ae5770 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/da/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/da/strings.xml @@ -201,7 +201,7 @@ modereret videresendt gemt - gemt fra %s + gemt fra ugyldig chat ugyldige data fejl ved visning af besked @@ -635,6 +635,8 @@ du forlod kan ikke sende beskeder du er observatør + Du er observatør + Du er administrator gennemgået af administratorer medlemmet har en gammel version Billede diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml index 792b91edfd..a057fa5275 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml @@ -704,7 +704,7 @@ wurde über Ihren Gruppen-Link eingeladen Sie haben die Rolle von %s auf %s geändert Sie haben Ihre eigene Rolle auf %s geändert - entfernt %1$s aus der Gruppe. + Sie haben %1$s aus der Gruppe entfernt hat die Gruppe verlassen Gruppenprofil aktualisiert @@ -1012,6 +1012,13 @@ Moderieren Diese Nachricht wird für alle Mitglieder als moderiert gekennzeichnet. Sie sind Beobachter + Sie sind Beobachter + Sie sind Mitglied + Sie sind Moderator + Sie sind Admin + Sie sind Eigentümer + Sie sind Abonnent + Sie sind Mitwirkender Sie sind Beobachter Beobachter Anfängliche Rolle @@ -1805,7 +1812,7 @@ Kopfhörer Gelijktijdige ontvangst Empfänger können nicht sehen, von wem die Nachricht stammt. - abgespeichert von %s + abgespeichert von Abgespeichert abgespeichert Weitergeleitet @@ -2580,7 +2587,7 @@ Alten Link teilen Der Link wird gekürzt sein, und das Gruppen-Profil wird über den Link geteilt. Gruppen-Link aktualisieren - Kontaktanfragen von Gruppen + Kontaktanfragen in Gruppen Mitglied ist gelöscht - Anfrage kann nicht angenommen werden Angefragte Verbindung von Gruppe %1$s Diese Einstellung gilt für Ihr aktuelles Profil @@ -3003,4 +3010,11 @@ Öffentliche SimpleX-Namen (BETA) Datei-Server Datei-Server: %s + Gruppeneinladungen + weitergeleitet aus + %1$02d h %2$02d min %3$02d s + Crowdfunding-Investoren können vor Verkaufsbeginn Namen reservieren: + Der Verkauf von SimpleX-Namen startet in + bis Sie eine SimpleX-Domain registrieren können + Aktualisieren Sie die App, um eine SimpleX-Domain registrieren zu können diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/el/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/el/strings.xml index d9feb33f1a..73abd7d876 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/el/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/el/strings.xml @@ -2051,7 +2051,7 @@ αποθηκευμένο Αποθηκευμένο Αποθηκευμένο από - αποθηκευμένο από %s + αποθηκευμένο από Αποθηκευμένο μήνυμα Οι αποθηκευμένοι διακομιστές WebRTC ICE θα αφαιρεθούν. Αποθήκευση προφίλ ομάδας @@ -2429,6 +2429,11 @@ Δεν είσαι συνδεδεμένος στον διακομιστή που χρησιμοποιείται για τη λήψη μηνυμάτων από αυτή τη σύνδεση (δεν υπάρχει συνδρομή). Δεν είσαι συνδεδεμένος σε αυτούς τους διακομιστές. Για την παράδοση μηνυμάτων σε αυτούς, χρησιμοποιείται ιδιωτική δρομολόγηση. είσαι παρατηρητής + Είσαι παρατηρητής + Είσαι μέλος + Είσαι διαχειριστής + Είσαι διαχειριστής + Είσαι ιδιοκτήτης είσαι παρατηρητής μπλόκαρες %s Μπορείς να το αλλάξεις στις ρυθμίσεις Εμφάνισης. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml index a8cf66f595..9274b7a30d 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml @@ -1724,7 +1724,7 @@ todos los miembros Se permite enviar enlaces SimpleX. guardado - guardado desde %s + guardado desde Guardado Guardado desde Reenviado por @@ -2665,6 +2665,13 @@ Espera respuesta eres suscriptor + Eres observador + Eres miembro + Eres moderador + Eres administrador + Eres propietario + Eres suscriptor + Eres colaborador Puedes compartir el enlace o código QR. Cualquiera podrá unirse al canal. Te conectaste al canal mediante este enlace de servidor. Tu canal @@ -2931,4 +2938,11 @@ Gestiona tus servidores. Nombres públicos para tu canal o negocio. Nombres públicos SimpleX (BETA) + reenviado desde + Invitación de grupo + La venta de nombres SimpleX comienza en + hasta que puedas registrar un dominio SimpleX + Actualiza la app para poder registrar un dominio SimpleX + %1$02d hrs %2$02d min %3$02d seg + Los inversores de crowdfunding pueden reservar nombres antes del comienzo de la venta: diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml index 6e119a456a..b65fc5ab93 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml @@ -156,7 +156,7 @@ اجازه دهید تا اعلان‌ها را فوری دریافت کنید.]]> SimpleX در پس‌زمینه اجرا می‌شود و به جای استفاده از پوش نوتیفیکیشن، کار می‌کند.]]> ذخیره شده - ذخیره شده از %s + ذخیره شده از ذخیره شده از فرستاده شده رمزنگاری انتها به انتها با محرمانگی پیشرو، مردودسازی و بازیابی ورود غیرمجاز محافظت شده‌اند.]]> @@ -437,6 +437,11 @@ تایید شما ممکن نیست؛ لطفا دوباره امتحان کنید. فایل شما ناظر هستید + شما ناظر هستید + شما عضو هستید + شما مدیر هستید + شما مدیر هستید + شما صاحب هستید چت پاک شود؟ تمام پیام‌ها حذف خواهند شد - این عمل قابل برگشت نیست! حذف diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml index 7ae3f506a2..e5e7c525a5 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml @@ -1169,6 +1169,10 @@ SimpleX-taustapalvelu – se kuluttaa muutaman prosentin akusta päivässä.]]> Avaa olet tarkkailija + Olet tarkkailija + Olet jäsen + Olet ylläpitäjä + Olet omistaja Liikaa videoita! Ääniviesti Odottaa videota diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml index c9f85754da..bfbe32e819 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml @@ -94,15 +94,15 @@ nouveau message Nouvelle demande de contact Connecté - SimpleX Lock + Verrouillage SimpleX Activer - SimpleX Lock activé + Verrouillage SimpleX activé Il vous sera demandé de vous authentifier lorsque vous démarrez ou reprenez l\'application après 30 secondes en arrière-plan. Déverrouiller - Activer SimpleX Lock - Désactiver SimpleX Lock + Activer le Verrouillage SimpleX + Désactiver le Verrouillage SimpleX Authentification indisponible - L\'authentification de l\'appareil est désactivée. Désactivation de SimpleX Lock. + L\'authentification de l\'appareil est désactivée. Désactivation du Verrouillage SimpleX. Ouvrir la console de messagerie Erreur de distribution du message Il est fort probable que ce contact ait supprimé la connexion avec vous. @@ -120,9 +120,8 @@ Conversations Texte du message Caché - Pour protéger vos informations, activez la fonction SimpleX Lock. -\nVous serez invité à confirmer l\'authentification avant que cette fonction ne soit activée. - L\'authentification de l\'appareil n\'est pas activée. Vous pouvez activer SimpleX Lock via Paramètres, une fois que vous avez activé l\'authentification de l\'appareil. + Pour protéger vos informations, activez le Verrouillage SimpleX.\nUne authentification vous sera demandée avant que cette fonctionnalité ne soit activée. + L\'authentification de l\'appareil n\'est pas activée. Vous pouvez activer le Verrouillage SimpleX dans les Paramètres une fois l\'authentification de l\'appareil activée. La base de données ne fonctionne pas correctement. Appuyez ici pour en savoir plus. Appels SimpleX Chat Messages SimpleX Chat @@ -177,7 +176,7 @@ Fichier introuvable Erreur lors de la sauvegarde du fichier Supprimer le contact \? - Le contact et tous les messages seront supprimés - impossible de revenir en arrière ! + Le contact et tous les messages seront supprimés — cette action est irréversible ! Supprimer le contact Connecté Envoyer un message @@ -212,7 +211,7 @@ Accepter en incognito Rejeter Effacer la conversation \? - Tous les messages seront supprimés : impossible de revenir en arrière ! Les messages seront supprimés UNIQUEMENT pour vous. + Tous les messages seront supprimés — cette action est irréversible ! Les messages seront supprimés UNIQUEMENT pour vous. Effacer Supprimer Supprimer @@ -279,7 +278,7 @@ Connectez-vous en utilisant votre identifiant Confirmez vos identifiants Arrêter la messagerie - Le message sera supprimé - impossible de revenir en arrière ! + Le message sera supprimé — cette action est irréversible ! Le message sera marqué comme supprimé. Le·s destinataire·s pourrai·ent révéler ce message. modifié L\'image sera reçue quand votre contact sera en ligne, merci d\'attendre ou de revenir plus tard ! @@ -320,7 +319,7 @@ Accéder aux serveurs via un proxy SOCKS sur le port %d \? Le proxy doit être démarré avant d\'activer cette option. Utiliser les hôtes .onions Vos paramètres - SimpleX Lock + Verrouillage SimpleX Console de la messagerie Serveurs SMP Tester les serveurs @@ -448,7 +447,7 @@ Seuls les appareils clients stockent les profils des utilisateurs, les contacts, les groupes et les messages. GitHub repository.]]> Batterie peu utilisée. L\'app vérifie les messages toutes les 10 minutes. Vous risquez de manquer des appels ou des messages urgents.]]> - Consomme davantage de batterie L\'app fonctionne toujours en arrière-plan - les notifications s\'affichent instantanément.]]> + Consomme davantage de batterie ! L’application fonctionne toujours en arrière-plan — les notifications sont affichées instantanément.]]> %1$d message(s) manqué(s) ID du message incorrect Paramètres @@ -459,10 +458,10 @@ invité par votre lien de groupe vous avez changé d\'adresse Arrêtez la messagerie pour exporter, importer ou supprimer sa base de données. Vous ne pourrez pas recevoir ni envoyer de messages tant que la messagerie est arrêtée. - Cette action ne peut être annulée - les messages envoyés et reçus avant la date sélectionnée seront supprimés. Cela peut prendre plusieurs minutes. + Cette action est irréversible — les messages envoyés et reçus avant la date sélectionnée seront supprimés. Cela peut prendre plusieurs minutes. La base de données est chiffrée à l\'aide d\'une phrase secrète aléatoire, que vous pouvez modifier. Restaurer la sauvegarde de la base de données - La phrase secrète n\'a pas été trouvée dans le Keystore, veuillez la saisir manuellement. Cela a pu se produire si vous avez restauré les données de l\'app à l\'aide d\'un outil de sauvegarde. Si ce n\'est pas le cas, veuillez contacter les développeurs. + Phrase secrète introuvable dans le Keystore ; veuillez la saisir manuellement. Cela peut être arrivé si vous avez restauré les données de l\'application à l\'aide d\'un outil de sauvegarde. Si ce n\'est pas le cas, veuillez contacter les développeurs. Veuillez entrer le mot de passe précédent après avoir restauré la sauvegarde de la base de données. Cette action ne peut pas être annulée. Erreur de restauration de la base de données appel vidéo (chiffrement de bout en bout) @@ -481,7 +480,7 @@ Vidéo OFF Appel en cours Appel terminé - Votre vie privée + Votre confidentialité Appareil Conversations Outils du développeur @@ -527,7 +526,7 @@ Supprimer la base de données Erreur lors du démarrage de la messagerie Importer - Cette action ne peut être annulée : votre profil, vos contacts, vos messages et vos fichiers seront irréversiblement perdus. + Cette action est irréversible — votre profil, vos contacts, vos messages et vos fichiers seront irréversiblement perdus. Base de données de la messagerie supprimée Redémarrez l\'application pour créer un nouveau profil de messagerie. Vous devez utiliser la version la plus récente de votre base de données de messagerie sur un seul appareil UNIQUEMENT, sinon vous risquez de ne plus recevoir les messages de certains contacts. @@ -562,7 +561,7 @@ Erreur lors de l\'arrêt de la messagerie Erreur lors de l\'exportation de la base de données de la messagerie Importer la base de données de la messagerie ? - Votre base de données actuelle sera SUPPRIMÉE et REMPLACÉE par celle importée.\nCette action est irréversible : votre profil, vos contacts, vos messages et vos fichiers seront définitivement perdus. + Votre base de données actuelle sera SUPPRIMÉE et REMPLACÉE par celle importée.\nCette action est irréversible — votre profil, vos contacts, vos messages et vos fichiers seront définitivement perdus. Entrez la phrase secrète… Appel audio entrant %1$s veut se connecter à vous via @@ -611,7 +610,7 @@ Base de données de la messagerie importée Supprimer le profil de messagerie ? Supprimer les fichiers et médias \? - Cette action ne peut être annulée - tous les fichiers et médias reçus et envoyés seront supprimés. Les photos à faible résolution seront conservées. + Cette action est irréversible — tous les fichiers et médias reçus et envoyés seront supprimés. Les photos à faible résolution seront conservées. Aucun fichier reçu ou envoyé 1 mois %s seconde(s) @@ -658,7 +657,7 @@ a modifié votre rôle pour %s vous a retiré a supprimé le groupe - mise à jour du profil de groupe + a mis à jour le profil du groupe vous avez modifié le rôle de %s pour %s vous avez modifié votre rôle pour %s vous avez quitté @@ -711,11 +710,11 @@ Ignorer l’invitation de membres Sélectionnez des contacts Aucun contact sélectionné - %1$s MEMBRES + %1$s membres vous : %1$s Supprimer le groupe - Le groupe va être supprimé pour tout les membres - impossible de revenir en arrière ! - Le groupe va être supprimé pour vous - impossible de revenir en arrière ! + Le groupe va être supprimé pour tout les membres — cette action est irréversible ! + Le groupe va être supprimé pour vous — cette action est irréversible ! Quitter le groupe Supprimer le lien \? Supprimer le lien @@ -727,7 +726,7 @@ ID de base de données Retirer le membre Envoyer un message direct - Ce membre sera retiré du groupe - impossible de revenir en arrière ! + Ce membre sera retiré du groupe — cette action est irréversible ! Rôle Changer le rôle Changer @@ -884,7 +883,7 @@ Version de l\'app : v%s Version du cœur : v%s Nombre de PING - Toutes les discussions et tous les messages seront supprimés - il est impossible de revenir en arrière ! + Toutes les discussions et tous les messages seront supprimés — cette action est irréversible ! Effacer tous les fichiers Supprimer le profil de messagerie pour pour chaque profil de messagerie que vous avez dans l\'application.]]> @@ -909,7 +908,7 @@ Vous avez déjà un profil de messagerie avec ce même nom affiché. Veuillez choisir un autre nom. Nom d\'affichage en double ! Interface en français - Par profil de messagerie (par défaut) ou par connexion (BETA). + Par profil de messagerie (par défaut) ou par connexion (BÊTA). Interface en italien Brouillon de message D\'autres améliorations sont à venir ! @@ -929,6 +928,13 @@ Le message sera supprimé pour tous les membres. Le message sera marqué comme modéré pour tous les membres. vous êtes observateur + Vous êtes observateur + Vous êtes membre + Vous êtes modérateur(trice) + Vous êtes admin + Vous êtes propriétaire + Vous êtes abonné + Vous êtes contributeur Erreur lors de la mise à jour du lien de groupe Rôle initial Veuillez contacter l\'administrateur du groupe. @@ -1024,8 +1030,8 @@ Paramètres de proxy SOCKS Utiliser un proxy SOCKS Utiliser les hôtes .onion sur Non si le proxy SOCKS ne les prend pas en charge.]]> - Mode de SimpleX Lock - SimpleX Lock n\'est pas activé ! + Mode de Verrouillage SimpleX + Le Verrouillage SimpleX n\'est pas activé ! Authentification du système Authentification Échec de l’authentification @@ -1082,7 +1088,7 @@ Vous n\'avez pas pu être vérifié·e ; veuillez réessayer. %1$d messages n\'ont pas pu être déchiffrés. %1$d messages ignorés. - Vous pouvez activer SimpleX Lock dans les Paramètres. + Vous pouvez activer le Verrouillage SimpleX dans les Paramètres. Merci aux utilisateurs - contribuez via Weblate ! Vidéos et fichiers jusqu\'à 1Go Code d\'accès à l\'app @@ -1221,9 +1227,9 @@ Message envoyé aucun texte L\'importation a entraîné des erreurs non fatales : - Les notifications ne fonctionnent pas tant que vous ne relancez pas l\'application + Les notifications cesseront de fonctionner jusqu’à ce que vous relanciez l’application Arrêt \? - Mise à l\'arrêt + Arrêter l\'application Redémarrer App Abandonner @@ -1275,7 +1281,7 @@ L\'envoi d\'accusés de réception sera activé pour tous les contacts dans tous les profils de messagerie visibles. Ils peuvent être modifiés dans les paramètres des contacts et des groupes. Ces paramètres s\'appliquent à votre profil actuel - Vous pouvez les activer ultérieurement via les paramètres de Confidentialité et Sécurité de l\'application. + Vous pouvez les activer plus tard dans les paramètres de confidentialité de l\'application. Activer les accusés de réception \? Désactiver les accusés de réception \? L\'envoi d\'accusés de réception est activé pour les contacts de %d @@ -1364,14 +1370,12 @@ Arabe, bulgare, finnois, hébreu, thaï et ukrainien - grâce aux utilisateurs et à Weblate. Créer un nouveau profil sur l\'application de bureau. 💻 Basculer en mode incognito lors de la connexion. - - connexion au service d\'annuaire (BETA) ! -\n- accusés de réception (jusqu\'à 20 membres). -\n- plus rapide et plus stable. + - connexion au service d\'annuaire (BÊTA) ! \n- accusés de réception (jusqu\'à 20 membres). \n- plus rapide et plus stable. Ouvrir Erreur lors de la création du contact du membre Envoyer un message direct pour vous connecter envoyer pour se connecter - s\'est connecté.e de manière directe + a demandé une connexion Étendre Répéter la demande de connexion ? contact supprimé @@ -1456,7 +1460,7 @@ Chargement du fichier Connexion au PC Ordinateurs - Lier un portable + Lier un téléphone Utiliser depuis l’ordinateur Mobile connecté Code de session @@ -1470,7 +1474,7 @@ Connexion au PC Se déconnecter auteur - Connecté au portable + Connecté au téléphone Adresse du PC non valide Coller l\'adresse du PC Vérifier le code avec le PC @@ -1500,7 +1504,7 @@ Ouvrir le port de votre pare-feu erreur d\'affichage de contenu erreur d\'affichage de message - Vous pouvez le rendre visible à vos contacts SimpleX via Paramètres. + Vous pouvez le rendre visible à vos contacts SimpleX via les Paramètres. L\'historique n\'est pas envoyé aux nouveaux membres. Réessayer Caméra non disponible @@ -1554,7 +1558,7 @@ inconnu statut inconnu Connexion interrompue - Ancien membre %1$s + Membre %1$s La fonctions prend trop de temps à s\'exécuter : %1$d secondes : %2$s Fonction lente Afficher les appels d\'API lents @@ -1571,7 +1575,7 @@ Historique récent et bot d\'annuaire amélioré. La barre de recherche accepte les liens d\'invitation. Consommation réduite de la batterie. - Tous les messages seront supprimés - il n\'est pas possible de revenir en arrière ! + Tous les messages seront supprimés — cette action est irréversible ! Interface utilisateur en hongrois et en turc Notes privées Créé à @@ -1597,8 +1601,8 @@ Erreur lors du blocage du membre pour tous %d messages bloqués par l\'administrateur bloqué par l\'administrateur - %s bloqué - %s débloqué + a bloqué %s + a débloqué %s vous avez bloqué %s vous avez débloqué %s Message trop volumineux @@ -1635,7 +1639,7 @@ Supprimer la base de données de cet appareil Téléchargement de l\'archive Téléchargement des détails du lien - Activé dans les conversations directes (BETA) ! + Activé dans les conversations directes (BÊTA) ! Entrer la phrase secrète Erreur lors de la suppression de la base de données Erreur lors de l\'exportation de la base de données des chats @@ -1725,7 +1729,7 @@ Casque audio La source du message reste privée. enregistré - enregistré depuis %s + enregistré depuis Transféré Transféré depuis Le(s) destinataire(s) ne peut(vent) pas voir de qui provient ce message. @@ -1882,7 +1886,7 @@ Reconnecter le serveur pour forcer la livraison des messages. Utilise du trafic supplémentaire. Erreur de réinitialisation des statistiques Réinitialiser - Les statistiques des serveurs seront réinitialisées - il n\'est pas possible de revenir en arrière ! + Les statistiques des serveurs seront réinitialisées — cette action est irréversible ! Téléversé Statistiques détaillées Messages envoyés @@ -1979,7 +1983,7 @@ message ouvrir Confirmer la suppression du contact ? - Le contact sera supprimé - il n\'est pas possible de revenir en arrière ! + Le contact sera supprimé — cette action est irréversible ! Supprimer sans notification Garder la conversation Ne supprimer que la conversation @@ -2083,7 +2087,7 @@ Utilisez des identifiants de proxy différents pour chaque profil. Utiliser des identifiants aléatoires Nom d\'utilisateur - Les messages seront supprimés - il n\'est pas possible de revenir en arrière ! + Les messages seront supprimés — cette action est irréversible ! Base de données de la messagerie Mode système Serveur @@ -2165,8 +2169,8 @@ Ajout de serveurs de messages %s.]]> Appareils Xiaomi : veuillez activer le démarrage automatique dans les paramètres du système pour que les notifications fonctionnent.]]> - La conversation sera supprimée pour tous les membres ; cette action est irréversible ! - La conversation sera supprimée pour vous ; cette action est irréversible ! + La conversation sera supprimée pour tous les membres — cette action est irréversible ! + La conversation sera supprimée pour vous — cette action est irréversible ! Les conditions seront acceptées pour les opérateurs activés après 30 jours. La connexion nécessite une renégociation du chiffrement. avec un seul contact - partagez en personne ou via n\'importe quelle messagerie.]]> @@ -2210,7 +2214,7 @@ Les serveurs pour les nouveaux fichiers de votre profil de messagerie actuel Serveur de l\'opérateur Le protocole du serveur a été modifié. - Activer Flux + Activez Flux dans les paramètres Réseau et serveurs pour une meilleure confidentialité des métadonnées. Ce message a été supprimé ou n\'a pas encore été reçu. Appuyez sur Créer une adresse SimpleX dans le menu pour la créer ultérieurement. Partager publiquement votre adresse @@ -2292,7 +2296,7 @@ Nom de la liste... Quitter la conversation ? Vous ne recevrez plus de messages de cette conversation. L’historique sera conservé. - Le membre sera retiré de la conversation ; cette action est irréversible ! + Le membre sera retiré de la conversation — cette action est irréversible ! Votre profil de messagerie sera envoyé aux autres membres Vos serveurs Utiliser %s @@ -2380,7 +2384,7 @@ échoué échoué Fichiers - Les membres seront retirés du groupe - impossible de revenir en arrière! + Les membres seront retirés du groupe — cette action est irréversible ! Le membre va rejoindre le groupe, accepter le membre? Les messages de ces membres seront affichés! modérateurs @@ -2460,7 +2464,7 @@ Nom du canal SimpleX Canal temporairement indisponible Page web du canal - Le canal sera supprimé pour tous les abonnés ; cette action est irréversible ! + Le canal sera supprimé pour tous les abonnés — cette action est irréversible ! Lien Parce que nous avons détruit le pouvoir de vous identifier. Pour que votre pouvoir ne puisse jamais vous être enlevé. Bot @@ -2488,7 +2492,7 @@ Ce groupe nécessite une version plus récente de l\'application. Veuillez la mettre à jour pour le rejoindre. Erreur lors de la suppression du message Enregistrer le nom SimpleX ? - Obtenir le nom SimpleX (BETA) + Obtenir le nom SimpleX (BÊTA) Comment enregistrer un nom de test Supprimer le nom Rechercher des images @@ -2539,7 +2543,7 @@ (de la part du propriétaire) Vous pouvez consulter vos signalements dans la section Discuter avec les admins. Les messages de cette conversation ne seront jamais supprimés. - Cette action est irréversible : les messages envoyés et reçus dans cette conversation avant la date sélectionnée seront supprimés. + Cette action est irréversible — les messages envoyés et reçus dans cette conversation avant la date sélectionnée seront supprimés. Définir le nom de la conversation… Mettre tout en sourdine Les opérateurs s’engagent à :\n- Être indépendants\n- Réduire au minimum l’utilisation des métadonnées\n- Exécuter du code open source vérifié @@ -2552,7 +2556,7 @@ Discuter avec les admins Relais de messagerie Discuter avec un membre - Les membres seront retirés de la conversation ; cette action est irréversible ! + Les membres seront retirés de la conversation — cette action est irréversible ! L\'empreinte numérique dans l\'adresse du serveur ne correspond pas au certificat : %1$s. Délai d\'attente dépassé pour le routage privé L’empreinte de l’adresse du serveur de transfert ne correspond pas au certificat : %1$s. @@ -2651,9 +2655,285 @@ Saisissez le nom du profil… Migrer Vous êtes né·e sans compte. - Personne n\'a tracé vos conversations. Personne n\'a dressé la carte de vos déplacements. La confidentialité n\'a jamais été une fonctionnalité : c\'était un mode de vie. + Personne n\'a tracé vos conversations. Personne n\'a dressé la carte de vos déplacements. La confidentialité n\'a jamais été une fonctionnalité — c\'était un mode de vie. Puis nous sommes passés en ligne, et chaque plateforme a réclamé une partie de vous : votre nom, votre numéro, vos amis. Nous avons accepté que le prix à payer pour parler aux autres soit de permettre à quelqu\'un de savoir avec qui nous parlons. Chaque génération, humaine et technologique, a fonctionné ainsi : téléphone, email, messageries, réseaux sociaux. Il semblait que ce fût la seule voie possible. Il existe une autre voie. Un réseau sans numéros de téléphone. Sans noms d\'utilisateur. Sans comptes. Sans aucune identité utilisateur. Un réseau qui connecte les personnes et achemine des messages chiffrés sans savoir qui est connecté. - Pas une meilleure serrure sur la porte de quelqu\'un d\'autre. Ni un propriétaire plus sympa qui respecte votre vie privée, mais conserve tout de même la trace de tous les visiteurs. Vous n\'êtes pas un invité. Vous êtes chez vous. Aucun roi ne peut y entrer : vous êtes souverain. + Pas une meilleure serrure sur la porte de quelqu\'un d\'autre. Pas un propriétaire plus attentionné qui respecte votre vie privée, mais conserve toujours le registre de tous les visiteurs. Vous n\'êtes pas un invité. Vous êtes chez vous. Aucun roi ne peut y entrer — vous êtes souverain. Vos conversations vous appartiennent, comme c\'était toujours le cas avant Internet. Le réseau n\'est pas un lieu que vous visitez. C\'est un lieu que vous créez et possédez. Et personne ne peut vous l\'enlever, que vous le rendiez privé ou public. + Invitations de groupe + La plus ancienne liberté humaine : parler à une autre personne sans être surveillé — bâtie sur une infrastructure qui ne peut la trahir. + Soyez libre dans votre réseau. + Vous vous engagez à :\n- Ne publier que du contenu légal dans les groupes publics\n- Respecter les autres utilisateurs — pas de spam + Accepter + Les routeurs du réseau ne peuvent savoir\nqui parle à qui + Configurer les routeurs + Configurer les notifications + Engagements réseau + Ouvrir le lien externe ? + abandonné (%1$d tentatives) + erreur : %s + Erreur de message + L\'application a supprimé ce message après %1$d tentatives de réception. + Supprimer le suivi des liens + Demandes de contact dans les groupes + À propos + Contact + Soutenir le projet + Aide et support + Plus de confidentialité + Paramètres avancés + La phrase secrète dans le Keystore ne peut pas être lue. Cela peut être arrivé après une mise à jour du système incompatible avec l\'application. Si ce n\'est pas le cas, veuillez contacter les développeurs. + La phrase secrète dans le Keystore ne peut pas être lue ; veuillez la saisir manuellement. Cela peut être arrivé après une mise à jour du système incompatible avec l\'application. Si ce n\'est pas le cas, veuillez contacter les développeurs. + Barre inférieure + Barre supérieure + Quitter le canal ? + demande de connexion du groupe %1$s + a accepté %1$s + a supprimé le canal + a mis à jour le profil du canal + Un nouveau membre souhaite rejoindre le groupe. + vous avez accepté ce membre + %d événements de canal + abonné + en cours d\'examen + examen + Supprimer le canal + Annuler et supprimer le canal + Supprimer le canal ? + Le canal sera supprimé pour vous — cette action est irréversible ! + Quitter le canal + Modifier le profil du canal + Site web du groupe + Options avancées + https:// + Autoriser tout le monde à intégrer + Saisir l\'URL du site web + Elle sera affichée aux abonnés et utilisée pour autoriser le chargement de l\'aperçu. + Code de la page web + Ajoutez ce code à votre page web. Il affichera l\'aperçu de votre canal / groupe. + Copier le code + Créez une page web pour montrer l\'aperçu de votre canal aux visiteurs avant qu\'ils ne s\'abonnent. Hébergez-la vous-même ou utilisez n\'importe quel hébergement statique. + N\'importe quelle page web peut afficher l\'aperçu. + Seule la page ci-dessus peut afficher l\'aperçu. + Vous pouvez partager un lien ou un QR code — n\'importe qui pourra rejoindre le canal. + Seuls les propriétaires du canal peuvent modifier ses préférences. + Serveurs de fichiers + Serveurs de fichiers : %s + Supprimer l\'abonné ? + Supprimer les messages du membre ? + Supprimer les messages du membre + L\'abonné sera supprimé du canal — cette action est irréversible ! + Les messages du membre seront supprimés — cette action est irréversible ! + Débloquer ces membres pour tous ? + Le rôle sera modifié en %s. Tous les membres du canal en seront informés. + Nom complet du canal : + Description trop longue + Enregistrer le profil du canal + Erreur lors de l\'enregistrement du profil du canal + Conditions mises à jour + Pour résoudre les noms + Délai d\'expiration de la connexion TCP en arrière-plan + Délai d\'expiration du protocole en arrière-plan + Définir l\'admission des membres + Le délai avant disparition est défini uniquement pour les nouveaux contacts. + Interdire l\'envoi de fichiers et de médias. + Vous et votre contact pouvez envoyer des fichiers et des médias. + Vous seul pouvez envoyer des fichiers et des médias. + Seul votre contact peut envoyer des fichiers et des médias. + Les fichiers et les médias sont interdits dans cette conversation. + Le signalement des messages est interdit dans ce groupe. + Discuter avec les admins + Autoriser les membres à discuter avec les admins. + Interdire les conversations avec les admins. + Les membres peuvent discuter avec les admins. + transféré de + Les conversations avec les admins sont interdites. + Les conversations avec les admins dans les canaux publics ne sont pas chiffrées de bout en bout — utilisez-les uniquement avec des relais de messagerie de confiance. + Activer les conversations avec les admins ? + Activer + Signalements des abonnés + Autoriser l\'envoi de messages directs aux abonnés. + Interdire l\'envoi de messages directs aux abonnés. + Envoyer jusqu\'à 100 derniers messages aux nouveaux abonnés. + Ne pas envoyer l\'historique aux nouveaux abonnés. + Les abonnés peuvent envoyer des messages éphémères. + Les abonnés peuvent envoyer des messages directs. + Les messages directs entre abonnés sont interdits. + Les abonnés peuvent supprimer définitivement les messages envoyés. (24 heures) + Les abonnés peuvent ajouter des réactions aux messages. + Les abonnés peuvent envoyer des messages vocaux. + Les abonnés peuvent envoyer des fichiers et des médias. + Les abonnés peuvent envoyer des liens SimpleX. + Jusqu\'à 100 derniers messages sont envoyés aux nouveaux abonnés. + L\'historique n\'est pas envoyé aux nouveaux abonnés. + Autoriser les abonnés à discuter avec les admins. + Les abonnés peuvent discuter avec les admins. + Admission des membres + Examiner les membres avant leur admission (demande d\'entrée). + désactivé + Conversations avec les membres + Pas de conversations avec les membres + Les conversations avec les membres sont désactivées + Supprimer la conversation + Supprimer la conversation avec le membre ? + Discuter avec les admins + Accepter + Accepter en tant que membre + Accepter en tant qu\'observateur + Mentionner des membres 👋 + Envoyer des signalements privés + Organiser les conversations en listes + Noms de fichiers multimédias privés. + Définir l’expiration des messages dans les conversations. + Connectez-vous plus rapidement ! 🚀 + Discutez instantanément en appuyant sur Se connecter. + Discutez avec les membres avant qu’ils ne rejoignent. + Discuter avec les admins + Moins de trafic sur les réseaux mobiles. + Accueillez vos contacts 👋 + Définissez votre bio du profil et votre message d’accueil. + Gardez vos conversations propres + Activer par défaut les messages éphémères. + Catalan, indonésien, roumain et vietnamien — grâce à nos utilisateurs ! + Canaux publics — exprimez-vous librement 🚀 + Fiabilité : plusieurs relais par canal. + Souveraineté : vous pouvez gérer vos propres relais. + Sécurité : les propriétaires détiennent les clés du canal. + Confidentialité : pour les propriétaires et les abonnés. + Invitez plus facilement vos amis 👋 + Nous avons simplifié la connexion pour les nouveaux utilisateurs. + Liens web sécurisés + - activez l’envoi des aperçus de liens.\n- utilisez le proxy SOCKS s’il est activé.\n- empêchez le phishing par hyperliens.\n- supprimez le suivi des liens. + Gouvernance à but non lucratif + Pour que le réseau SimpleX perdure. + Noms publics SimpleX (BÊTA) + Noms publics pour votre canal ou votre entreprise. + De meilleurs canaux 📢 + Créer un aperçu web. + Gérez vos relais. + Ajoutez des contributeurs. + Plus facile à lire. + L\'envoi d\'un aperçu de lien peut révéler votre adresse IP au site web. Vous pourrez modifier cela dans les paramètres de confidentialité plus tard. + Vous pouvez mentionner jusqu\'à %1$s membres par message ! + Abonnés + %1$d abonné + %1$d abonnés + %1$d propriétaire + %1$d propriétaires + %1$d propriétaires et contributeurs + Relais de messagerie + Nouveau relais de messagerie + Votre nom de relais + Votre adresse de relais + Utiliser le relais + Utiliser pour les nouveaux canaux + Tester le relais pour récupérer son nom.]]> + Échec du test du relais ! + Obtenir le lien + Décoder le lien + En attente de la réponse + Vérifier + Nom de relais invalide ! + Adresse de relais invalide ! + Erreur lors de l\'ajout du relais + Relais de messagerie + Les relais de messagerie transmettent les messages dans les canaux que vous créez. + Relais de messagerie + Aucun relais de messagerie + Les relais de messagerie transmettent les messages aux abonnés du canal. + connexion en cours + en échec + supprimé par l\'opérateur + supprimé + invité + accepté + liste reconnue + inactif + rejeté + Statut + rejeté par l\'opérateur du relais + Tous les relais ont été supprimés + Tous les relais sont en échec + Aucun relais actif + %1$d relais supprimés + %1$d relais en échec + %1$d relais non actifs + %1$d/%2$d relais actifs, %3$d en échec + %1$d/%2$d relais actifs, %3$d supprimés + %1$d/%2$d relais actifs, %3$d erreurs + %1$d/%2$d relais actifs + %1$d/%2$d relais connectés, %3$d erreurs + %1$d/%2$d relais connectés, %3$d en échec + %1$d/%2$d relais connectés, %3$d supprimés + %1$d/%2$d relais connectés + Aucun relais + Ajoutez des relais pour rétablir la distribution des messages. + En attente que le propriétaire du canal ajoute des relais. + Propriétaire + Abonné + via %1$s + Les abonnés utilisent le lien du relais pour se connecter au canal.\nL’adresse du relais a été utilisée pour configurer ce relais pour le canal. + Vous vous êtes connecté au canal via ce lien de relais. + Supprimer l\'abonné + Supprimer le relais + Supprimer le relais ? + Le relais sera supprimé du canal — cette action est irréversible ! + Il s’agit du dernier relais actif. Sa suppression empêchera la distribution des messages aux abonnés. + Bloquer l\'abonné pour tout le monde ? + Créer un canal public + Créer un canal public + Création du canal + Erreur lors de la création du canal. + Résultats du relais : + La connexion a atteint la limite de messages non distribués + Erreur réseau + Erreur + Annuler la création du canal ? + Votre nouveau canal %1$s est connecté à %2$d relais sur %3$d.\nSi vous annulez, le canal sera supprimé — vous pourrez le recréer. + Activez au moins un relais de messagerie pour créer un canal. + Votre profil %1$s sera partagé avec les relais du canal et les abonnés.\nLes relais peuvent accéder aux messages du canal. + Configurer les relais + Ajouter un relais + Ajouter des relais + Aucun relais disponible + Erreur lors de l\'ajout de relais + Relais ajoutés : %1$s. + Sélectionner des relais + Aucun relais sélectionné + %d relais sélectionné(s) + Tous les relais ne sont pas connectés + Attendre + Le canal commencera à fonctionner avec %1$d relais sur %2$d. Continuer ? + Il s’agit d’une adresse de relais de messagerie, elle ne peut pas être utilisée pour se connecter. + Ouvrir le canal + Ouvrir un nouveau canal + %1$s !]]> + Erreur lors de l\'ouverture du canal + Débloquer l\'abonné pour tout le monde ? + Activer les aperçus de liens ? + L’aperçu du lien sera demandé via le proxy SOCKS. La résolution DNS peut néanmoins toujours être effectuée localement via votre résolveur DNS. + Activer + Désactiver + Réduire dans la zone de notification ? + Si vous choisissez Fermer, les messages ne seront pas reçus.\nVous pouvez modifier ce choix ultérieurement dans les paramètres d’apparence. + Fermer l\'application + Réduire dans la zone de notification + Afficher SimpleX + Quitter SimpleX + SimpleX — %d non lus + Fermer dans la zone de notification + Fonctionne en arrière-plan pour recevoir les messages + %s soutient SimpleX Chat. + %1$s a soutenu SimpleX Chat. Le badge a expiré le %2$s. + Vous pouvez soutenir SimpleX à partir de la version 7 de l’application. + %s a investi dans le financement participatif de SimpleX Chat. + Badge non vérifié + Ce badge n’a pas pu être vérifié et peut ne pas être authentique. + Le badge ne peut pas être vérifié + Le badge est signé avec une clé que cette version de l’application ne reconnaît pas. Mettez à jour l’application pour vérifier ce badge. + La vente du nom SimpleX commence dans + jusqu’à ce que vous puissiez enregistrer un domaine SimpleX + Mettez à jour l’application pour enregistrer un domaine SimpleX + %1$02d h %2$02d min %3$02d s + Les investisseurs du financement participatif peuvent réserver des noms avant le début de la vente : diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hi/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hi/strings.xml index f3b1df5a40..3f17a6d8a7 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hi/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hi/strings.xml @@ -283,6 +283,9 @@ सदस्य को समूह से निकाल दिया जाएगा - इसे पूर्ववत नहीं किया जा सकता! सदस्य सदस्य + आप सदस्य हैं + आप व्यवस्थापक हैं + आप स्वामी हैं खोजें बंद है संपर्क पते के माध्यम से कनेक्ट करें? diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hr/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hr/strings.xml index 2d29984da5..3493f56711 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hr/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hr/strings.xml @@ -590,7 +590,7 @@ Anonimni režim štiti Vašu privatnost koristeći novi nasumični profil za svaki kontakt. nedelje Interna greška - Sačuvano od %s + Sačuvano od sačuvano pozvan Sačuvana poruka @@ -1435,6 +1435,11 @@ Za pozive je potreban podrazumevani veb pretraživač. Molimo vas da konfigurišete podrazumevani pretraživač u sistemu i podelite više informacija sa programerima. odblokirali ste %s Vi ste posmatrač. + Vi ste posmatrač + Vi ste član + Vi ste moderator + Vi ste administrator + Vi ste vlasnik Unapređena privatnost i bezbednost Migriraj na drugi uređaj pomoću QR koda. odbijeno diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml index 950c9e193b..504d68b1a0 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml @@ -49,7 +49,7 @@ Alkalmazásadatok biztonsági mentése Az adatbázis előkészítése sikertelen Az összes partnerével továbbra is kapcsolatban marad. A profilfrissítés el lesz küldve a partnerei számára. - A csevegési profillal (alapértelmezett), vagy a kapcsolattal (béta). + A csevegési profillal (alapértelmezés), vagy a kapcsolattal (béta). Egy új, véletlenszerű profil lesz megosztva. A hangüzenetek küldése csak abban az esetben van engedélyezve, ha a partnere is engedélyezi. Alkalmazás összeállítási száma: %s @@ -445,7 +445,7 @@ Látható a helyi hálózaton Nem engedélyezem Az eltűnő üzenetek küldése le van tiltva ebben a csevegésben. - alapértelmezett (%s) + alapértelmezés (%s) duplikált üzenet Leválasztja a számítógépet? A számítógépes alkalmazás verziója (%s) nem kompatibilis ezzel az alkalmazással. @@ -690,7 +690,7 @@ új üzenet Régi adatbázis-archívum Speciális beállítások - Nincs kézbesítési információ + Nincsenek kézbesítési adatok moderált A tag el lesz távolítva a csoportból – ez a művelet nem vonható vissza! Győződjön meg arról, hogy a megadott XFTP-kiszolgálók címei megfelelő formátumúak, soronként elkülönítettek, és nincsenek duplikálva. @@ -841,7 +841,7 @@ Válaszul erre Név és üzenet Az értesítések csak az alkalmazás bezárásáig érkeznek! - Információ + Adatok Üzenetek és fájlok tag Privát kapcsolat létrehozása @@ -1127,6 +1127,13 @@ Üzenetek fogadása… %s és %s kapcsolódott Ön megfigyelő + Ön megfigyelő + Ön tag + Ön moderátor + Ön adminisztrátor + Ön tulajdonos + Ön feliratkozó + Ön közreműködő Port Jelkód beállítása Újdonságok @@ -1277,7 +1284,7 @@ Ön módosította a címet %s számára fájlok fogadása egyelőre még nem támogatott Csoportprofil mentése - Visszaállítás alapértelmezettre + Visszaállítás alapértelmezésre A partnere eltávolította ezt a hivatkozást, vagy egy egyszer használható meghívó volt, amit már felhasználtak.\nA kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy új hivatkozást. videóhívás (végpontok között NEM titkosított) Használat új kapcsolatokhoz @@ -1289,7 +1296,7 @@ A jelmondat nem található a Keystore-ban, ezért kézzel szükséges megadni. Ez akkor történhetett meg, ha visszaállította az alkalmazás adatait egy biztonsági mentési eszközzel. Ha nem így történt, akkor lépjen kapcsolatba a fejlesztőkkel. A partnereivel továbbra is kapcsolatban marad. A kiszolgálónak hitelesítésre van szüksége a feltöltéshez, ellenőrizze a jelszavát. - Az adatbázis nem működik megfelelően. Koppintson ide a további információkért + Az adatbázis nem működik megfelelően. Koppintson ide a további tudnivalókért A fájl küldése le fog állni. Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott partnerétől érkező üzenetek fogadására szolgál. Nem sikerült ellenőrizni; próbálja meg újra. @@ -1471,13 +1478,13 @@ A titkosítás működik, és új titkosítási egyezményre nincs szükség. Ez kapcsolati hibákat eredményezhet! Ez a művelet nem vonható vissza – profiljai, partnerei, üzenetei és fájljai véglegesen törölve lesznek. Bejegyzés frissítve - használati útmutatóban talál.]]> + használati útmutatóban talál.]]> A jelmondat a beállításokban egyszerű szövegként van tárolva. Konzol megjelenítése új ablakban Az előző üzenet kivonata különbözik. Ezek a beállítások csak a jelenlegi csevegési profiljára vonatkoznak Várjon, amíg a fájl betöltődik a társított hordozható eszközről - GitHub-tárolónkban talál.]]> + GitHub-tárolónkban talál.]]> Hiba történt a tartalom megjelenítésekor Hiba történt az üzenet megjelenítésekor Láthatóvá teheti a SimpleXbeli partnerei számára a beállításokban. @@ -1588,7 +1595,7 @@ Hívás vége Videóhívás Hiba történt a böngésző megnyitásakor - A hívásokhoz egy alapértelmezett webböngésző szükséges. Állítson be egy alapértelmezett webböngészőt az eszközön, és osszon meg további információkat a SimpleX Chat fejlesztőivel. + A hívásokhoz egy alapértelmezett webböngésző szükséges. Állítson be egy alapértelmezett webböngészőt az eszközön, és osszon meg további tudnivalókat a SimpleX Chat fejlesztőivel. Hálózati beállítások megerősítése Hiba történt a csevegési adatbázis exportálásakor Alkalmaz @@ -1694,7 +1701,7 @@ A SimpleX-hivatkozások küldése engedélyezve van. Számukra engedélyezve mentett - mentve innen: %s + mentve innen: Továbbítva innen A címzett(ek) nem látja(k), hogy kitől származik ez az üzenet. Mentett @@ -1798,10 +1805,10 @@ Csökkentett akkumulátor-használattal. Hiba történt a WebView előkészítésekor. Frissítse rendszerét az új verzióra. Lépjen kapcsolatba a fejlesztőkkel.\nHiba: %s Felhasználó által létrehozott téma visszaállítása - Üzenet várólista-információi + Üzenet várólistaadatai nincs Kézbesítési hibák felderítése - kiszolgáló várólista-információi: %1$s\n\nutoljára fogadott üzenet: %2$s + kiszolgáló várólistaadatai: %1$s\n\nutoljára fogadott üzenet: %2$s Érvénytelen kulcs vagy ismeretlen fájltöredékcím – valószínűleg a fájl törlődött. Ideiglenes fájlhiba Üzenet állapota @@ -1829,7 +1836,7 @@ letiltva inaktív Nagyítás - Információk a kiszolgálókról + Kiszolgálóadatok Kapcsolódás Hibák Függőben @@ -1894,7 +1901,7 @@ Hiba történt a kiszolgálókhoz való újrakapcsolódáskor Fájlok Betűméret - Nincs információ, próbálja meg újratölteni + Nincsenek adatok, próbálja meg újratölteni Korábban kapcsolódott kiszolgálók Privát útválasztási hiba Fogadott üzenetek @@ -1904,7 +1911,7 @@ Munkamenetek átvitele Összes kapcsolat Statisztikák - Információk megjelenítése a következőhöz + Kiszolgálóadatok megjelenítése a következőhöz A kiszolgáló verziója nem kompatibilis az alkalmazással: %1$s. Ön nem kapcsolódik ezekhez a kiszolgálókhoz. A privát útválasztás az üzenetek kézbesítésére szolgál. Aktív kapcsolatok száma @@ -2288,7 +2295,7 @@ Üzenetek törlésének letiltása Az ebben a csevegésben lévő üzenetek soha nem lesznek törölve. 1 év - alapértelmezett (%s) + alapértelmezés (%s) Csevegési üzenetek törlése az eszközről. Módosítja az automatikus üzenettörlést? Ez a művelet nem vonható vissza – a kiválasztott üzenettől korábban küldött és fogadott üzenetek törölve lesznek a csevegésből. @@ -2463,7 +2470,7 @@ Az üzeneteltűnési idő csak az új partnerekre vonatkozik. Inkognitóprofil használata Saját cím létrehozása - Eltűnő üzenetek engedélyezése alapértelmezetten. + Eltűnő üzenetek engedélyezése alapértelmezésként. Tartsa tisztán a csevegéseit Életrajz és üdvözlőüzenet beállítása a profilokhoz. Saját cím megosztása @@ -2476,7 +2483,7 @@ A hivatkozás rövid lesz és a csoportprofil meg lesz osztva a hivatkozáson keresztül. Régi cím megosztása Régi (hosszú) hivatkozás megosztása - Partneri kapcsolatkérések a csoportokból + Partneri kapcsolatkérések a csoportok tagjaitól A tag törölve lett – nem lehet elfogadni a kérést a(z) %1$s nevű csoportból partneri kapcsolatot kért Ez a beállítás a jelenlegi profiljára vonatkozik @@ -2899,4 +2906,11 @@ Nyilvános SimpleX-nevek (béta) Fájlkiszolgálók Fájlkiszolgálók: %s + Meghívások csoportokba + továbbítva innen + %1$02d óra %2$02d perc %3$02d mp + A közösségi finanszírozásban részt vevő befektetők már az értékesítés megkezdése előtt lefoglalhatnak SimpleX-neveket: + SimpleX-nevek értékesítésének kezdete: + egy SimpleX-domainnév regisztrációjáig + Frissítse az alkalmazást egy SimpleX-domainnév regisztrálásához diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml index 783b1a94c6..b5c35bc7c6 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml @@ -755,7 +755,7 @@ dimoderasi obrolan tidak valid diteruskan - disimpan dari %s + disimpan dari terima berkas belum didukung anda format pesan tak diketahui @@ -2010,6 +2010,13 @@ Kunci salah atau alamat potongan berkas tidak dikenal - kemungkinan berkas dihapus. Versi server tidak kompatibel dengan pengaturan jaringan. Anda adalah pengamat + Anda adalah pengamat + Anda adalah anggota + Anda adalah moderator + Anda adalah admin + Anda adalah pemilik + Anda adalah pelanggan + Anda adalah kontributor Untuk memulai obrolan baru Video Koneksi yang Anda terima akan dibatalkan! diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml index edb2686c98..16ba6db570 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml @@ -934,6 +934,13 @@ Il messaggio verrà eliminato per tutti i membri. Il messaggio sarà segnato come moderato per tutti i membri. sei un osservatore + Sei un osservatore + Sei un membro + Sei un moderatore + Sei un amministratore + Sei un proprietario + Sei iscritto/a + Sei un collaboratore Ruolo iniziale Errore nell\'aggiornamento del link del gruppo osservatore @@ -1732,7 +1739,7 @@ Inoltra I destinatari non possono vedere da chi proviene questo messaggio. Salvato - salvato da %s + salvato da Bluetooth Auricolari Cuffie @@ -2511,7 +2518,7 @@ Condividi il link vecchio Il link sarà breve e il profilo del gruppo verrà condiviso attraverso il link. Aggiorna il link del gruppo - Richieste di contatto dai gruppi + Richieste di contatto nei gruppi Il membro è eliminato - impossibile accettare la richiesta connessione richiesta dal gruppo %1$s Questa impostazione è per il tuo profilo attuale @@ -2934,4 +2941,11 @@ Aggiungi collaboratori. Server di file Server di file: %s + Inviti in gruppi + inoltrato da + %1$02d ore %2$02d min %3$02d sec + Gli investitori della raccolta fondi possono prenotare i nomi prima che inizi la vendita: + La vendita di nomi SimpleX inizia in + fino a quando potrai registrare un dominio SimpleX + Aggiorna l\'app per registrare un dominio SimpleX diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml index ea9e504e98..8487614c9a 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml @@ -1128,6 +1128,10 @@ %1$d הודעות שדולגו שבועות הינך צופה + הינך צופה + הינך חבר קבוצה + הינך מנהל + הינך בעלים אין באפשרותך לשלוח הודעות! סרטון נשלח הודעה קולית @@ -1767,7 +1771,7 @@ חיבור קווי סלולרי נשמר - נשמר מ%s + נשמר מ הועבר הועבר מחובר לרשת diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml index af501f9b20..1e0686d2de 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml @@ -990,6 +990,12 @@ ビデオ メッセージのハッシュ値問題 あなたはオブザーバーです + あなたはオブザーバーです + あなたはメンバーです + あなたはモデレーターです + あなたは管理者です + あなたはオーナーです + あなたは購読者です グループの管理者に連絡してください。 動画は相手がアップロードを完了した時点で受信するができます。 .onion hostを使用する、は「いいえ」に設定します。]]> @@ -1733,7 +1739,7 @@ より信頼性の高いネットワーク接続 ネットワーク管理 保存済 - %sから保存 + から保存 転送済 転送元 保存元 diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml index ea87347a13..a987a0c92e 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ko/strings.xml @@ -468,6 +468,10 @@ 나감 멤버 소유자 + 당신은 관찰자입니다 + 당신은 멤버입니다 + 당신은 관리자입니다 + 당신은 소유자입니다 그룹 삭제됨 초대됨 강퇴됨 diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml index 87a0afa005..aa1da521bb 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/lt/strings.xml @@ -1547,6 +1547,10 @@ Jums reikės autentifikuotis kai paleidžiate programėlę arba pratęsiate jos naudojimą po 30 sekundžių fone. Nėra istorijos esate stebėtojas + Esate stebėtojas + Esate narys + Esate administratorius + Esate savininkas (saugo tik grupės nariai) Jūsų SimpleX adresas Nuskanuoti serverio QR kodą @@ -1729,7 +1733,7 @@ Garsiakalbis Tinklo valdymas išsaugota - išsaugota iš %s + išsaugota iš Išsaugota Balso žinutės neleidžiamos WiFi diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/lv/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/lv/strings.xml index 26b4c51aa3..a6882871c7 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/lv/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/lv/strings.xml @@ -53,7 +53,7 @@ Jūs pārsūtīts saglabāts - saglabāts no %s + saglabāts no nederīga tērzēšana nederīgi dati kļūda, rādot ziņojumu @@ -283,6 +283,7 @@ Nevar nosūtīt ziņu, jūs esat izgājis Nevar nosūtīt ziņu Jūs esat vērotājs + Jūs esat vērotājs Pārbaudīts ar administratoriem Nevar nosūtīt ziņu, dalībniekam ir veca versija Nevar Nosūtīt Komandas Brīdinājuma Teksts diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml index 19aa92a4a0..008ad2bb81 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml @@ -295,6 +295,9 @@ സ്വാഗതം! ഈ വാചകം ക്രമീകരണങ്ങളിൽ ലഭ്യമാണ് നിങ്ങൾ നിരീക്ഷകനാണ് + നിങ്ങൾ നിരീക്ഷകനാണ് + നിങ്ങൾ അംഗമാണ് + നിങ്ങൾ ഉടമയാണ് തീർപ്പാക്കാത്തത് സന്ദേശം അയയ്ക്കുക തത്സമയ സന്ദേശം അയയ്ക്കുക diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/nb-rNO/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/nb-rNO/strings.xml index 1275c31573..eeddfd1b38 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/nb-rNO/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/nb-rNO/strings.xml @@ -61,6 +61,7 @@ Legg til velkomstmelding Legg til dine teammedlemmer i samtalene. administrator + Du er administrator administratorer Administratorer kan blokkere ett medlem for alle. Administratorer kan lage lenker for å bli med i grupper. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml index d162b8a44d..2ec65534a4 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/nl/strings.xml @@ -936,6 +936,11 @@ Waarnemer jij bent waarnemer je bent waarnemer + Je bent waarnemer + Je bent lid + Je bent moderator + Je bent beheerder + Je bent eigenaar Systeem Audio en video oproepen Bevestig wachtwoord @@ -1722,7 +1727,7 @@ Sta het verzenden van SimpleX-links toe. Leden kunnen SimpleX-links verzenden. opgeslagen - opgeslagen van %s + opgeslagen van Doorsturen Doorgestuurd Ontvanger(s) kunnen niet zien van wie dit bericht afkomstig is. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml index a25728ccaf..bf47cebdb5 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml @@ -179,6 +179,11 @@ Oczekiwanie na film Oczekiwanie na film jesteś obserwatorem + Jesteś obserwatorem + Jesteś członkiem + Jesteś moderatorem + Jesteś administratorem + Jesteś właścicielem Jesteś obserwatorem Połączony Obecnie maksymalny obsługiwany rozmiar pliku to %1$s. @@ -1731,7 +1736,7 @@ Przekaż wiadomość… Zapisane zapisane - zapisane od %s + zapisane od Bluetooth Przesyłaj dalej i zapisuj wiadomości Słuchawki douszne diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml index ff691624ce..7e807ff9b3 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml @@ -119,7 +119,7 @@ chamada aceita o contato tem criptografia de ponta a ponta o contato não tem criptografia de ponta a ponta - Preferências de contato + Preferências do contato Permitir apagar permanentemente as mensagens enviadas em até 24h. sempre Adicione servidores escaneando o QR Code. @@ -161,7 +161,7 @@ conectando apagado Conectar - Apagar + Excluir Conectar conectando chamada… Excluir perfil de chat? @@ -461,7 +461,7 @@ Você convidou seu contato QR Code inválido Mais - Você será conectado ao grupo quando o dispositivo que hospeda o grupo estiver online. Por favor, aguarde ou verifique mais tarde. + Você será conectado ao grupo quando o dispositivo que hospeda o grupo estiver online. Aguarde ou verifique mais tarde. Essa string não é um link de conexão! Quando disponível Compilação do aplicativo: %s @@ -502,7 +502,7 @@ Reinicie o aplicativo para usar o banco de dados importado. Reinicie o aplicativo para criar um novo perfil de chat. Essa ação não pode ser desfeita - todos os arquivos e mídias recebidos e enviados serão excluídos. Imagens de baixa resolução permanecerão. - Você deve usar a versão mais recente do banco de dados do chat em APENAS um dispositivo, caso contrário poderá parar de receber as mensagens de alguns contatos. + Você deve usar a versão mais recente do banco de dados do chat em APENAS um dispositivo. Caso contrário, poderá parar de receber mensagens de alguns contatos. Sem arquivos enviados ou recebidos Mensagens Esta configuração se aplica às mensagens do seu perfil atual @@ -630,7 +630,7 @@ Link inválido! Esse QR Code não é um link! Seu perfil de chat será enviado\nao seu contato - Você será conectado quando o dispositivo do seu contato estiver online, aguarde ou verifique mais tarde! + Você será conectado quando o dispositivo do seu contato estiver online. Aguarde ou verifique mais tarde. Como Teste do servidor falhou! Os hosts .onion não serão usados. @@ -813,7 +813,7 @@ SimpleX Somente os proprietários do grupo podem ativar mensagens de voz. você compartilhou um link de uso único - Você será conectado quando sua solicitação de conexão for aceita, aguarde ou verifique mais tarde! + Você será conectado quando sua solicitação de conexão for aceita. Aguarde ou verifique mais tarde. Configurações Defina a mensagem mostrada aos novos membros! Configurações @@ -874,6 +874,13 @@ Trocar Totalmente descentralizado — visível apenas para os membros. você é um observador + Você é um observador + Você é um membro + Você é um moderador + Você é um administrador + Você é um proprietário + Você é um inscrito + Você é um colaborador Mensagem de voz (%1$s) Compartilhar link Para proteger sua privacidade, o SimpleX usa IDs separados para cada um dos seus contatos. @@ -1439,7 +1446,7 @@ Uso de bateria do aplicativo / Irrestrito nas configurações do aplicativo.]]> Este grupo tem mais de %1$d membros; as confirmações de entrega não são enviadas. Carregando o arquivo - contato deletado + contato apagado Erro Este dispositivo Descobrir via rede local @@ -1706,7 +1713,7 @@ IU Persa Aviso de entrega de mensagem Erro: %1$s - Chave incorreta ou conexão desconhecida - provavelmente esta conexão foi excluída. + Chave incorreta ou conexão desconhecida - provavelmente essa conexão foi excluída. Esta conversa é protegida por criptografia de ponta a ponta. Repetir envio Erro de conexão ao servidor de encaminhamento %1$s. Por favor, tente mais tarde. @@ -1809,7 +1816,7 @@ Erro ao exportar banco de dados Erro ao verificar a senha: salvo - salvo de %s + salvo de Encaminhado de Mensagens de voz não permitidas Nova mensagem @@ -2518,7 +2525,7 @@ Endereço do contato contato desativado o contato não está pronto - Solicitações de contato de grupos + Solicitações de contato em grupos o contato deve aceitar… colaborador Copiar código @@ -2914,4 +2921,5 @@ Selo não verificado Não foi possível verificar este selo, que pode não ser legítimo. O selo é assinado com uma chave que esta versão do aplicativo não reconhece. Atualize o aplicativo para verificar este selo. + Convites em grupo diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml index 08285dbe78..6ab12f76f6 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml @@ -88,6 +88,9 @@ enviada você está convidado para o grupo você é observador + Você é observador + Você é membro + Você é administrador Notificações Desconectado Definir nome do contato… diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml index f691857fd3..f2437af22b 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml @@ -195,7 +195,7 @@ Repetă cererea de alăturare? Reporniți conversația salvat - salvat de la %s + salvat de la Salvează Salvat Salvat din @@ -2195,6 +2195,11 @@ Se opresc conversațiile Total ești observator + Ești observator + Ești membru + Ești moderator + Ești administrator + Ești proprietar Videoclipul nu poate fi decodificat. Vă rugăm să încercați un alt videoclip sau să contactați dezvoltatorii. Puteți copia și micșora dimensiunea mesajului pentru a-l trimite. aștept răspunsul… diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml index bd4d3c39ff..44f3d3858e 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml @@ -1799,7 +1799,7 @@ Более надёжное соединение с сетью. Статус сети сохранено - сохранено из %s + сохранено из Переслано Переслано из Получатели не видят от кого это сообщение. @@ -2771,6 +2771,13 @@ (от владельца) Ошибка при публикации канала Вы подписчик + Вы читатель + Вы член группы + Вы модератор + Вы админ + Вы владелец + Вы подписчик + Вы соавтор Новая одноразовая ссылка Или покажите QR лично или через видеозвонок. Используйте этот адрес в профиле социальных сетей, на сайте или в подписи email. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/sk/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/sk/strings.xml index ed729b3ce2..74db414936 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/sk/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/sk/strings.xml @@ -103,7 +103,7 @@ Adresa alebo jednorazový odkaz? Nastavenie adries Pridať server - Pridať servery skenovaním QR kódu. + Pridať servery skenovaním QR kódov. Pridať členov tímu Pridajte tento kód na vašu webovú stránku. Zobrazí ukážku vášho kanálu / skupiny. Pridať do iného zariadenia @@ -126,7 +126,7 @@ všetko Všetko Všetky dáta aplikácie sú vymazané. - Všetky chaty budú zo zoznamu %s odobrané, a zoznam bude vymazaný + Všetky chaty budú zo zoznamu %s odstránené, a zoznam bude vymazaný Všetky farebné režimy Všetky dáta sa pri zadaní vymažú. Všetky správy @@ -143,7 +143,7 @@ Povoliť posielať priame správy členom. Povoliť posielanie priamych správ odberateľom. Povoliť odberateľom chatovať so správcami. - Povoliť nezvratné mazanie odoslaných správ. (24 hodín) + Povoliť nezvratné vymazanie odoslaných správ. (24 hodín) Povoliť nahlasovanie správ moderátorom. Povoliť posielanie miznúcich správ. Povoliť posielanie súborov a médií. @@ -153,7 +153,7 @@ Povoliť kontaktom pridávať reakcie na správy. Všetky profily Všetky relé zlyhali - Všetky relé odobrané + Všetky relé odstránené Všetky servery Všetky Vaše kontakty, konverzácie a súbory budú bezpečne šifrované a oddelene nahraté na zvolené XFTP relé. Všetky Vaše kontakty zostanú pripojené. @@ -190,7 +190,7 @@ \nDostupné vo verzii v5.1 Späť Pozadie - Služba na pozadí je vždy spustená - notifikácia sa zobrazí hneď ako bude správa k dispozícii. + Služba na pozadí je vždy spustená - notifikácie budú zobrazené hneď ako budú správy k dispozícii. Pridať kontakt: vytvoriť novú pozvánku alebo sa pripojiť cez odkaz, ktorý ste obdržali.]]> Nesprávna adresa počítača Najlepšie pre batériu. Budete dostávať notifikácie len keď bude aplikácia bežať (ŽIADNA služba na pozadí).]]> @@ -214,8 +214,8 @@ Bot Vysielanie Otestujte relé pre načítanie jeho mena.]]> - Využíva viac batérie Aplikácia bude vždy bežať na pozadí - notifikácie sa zobrazia okamžite.]]> - Xiaomi zariadenie: prosím povoľte Spustenie na pozadí v systémových nastaveniach aby Vám fungovali notifikácie.]]> + Využíva viac batérie! Aplikácia bude vždy bežať na pozadí – notifikácie sa zobrazia okamžite.]]> + Xiaomi zariadenie: prosím povoľte Spustenie na pozadí v systémových nastaveniach aby vám fungovali notifikácie.]]> Zrušiť Zrušiť a odstrániť kanál Zrušiť vytvorenie kanálu? @@ -270,7 +270,7 @@ Prijať ako člena Prijať ako pozorovateľa Prijať podmienky - Prijať žiadosť o pripojenie? + Prijať žiadosť o spojenie? Prijať žiadosť o kontakt Prijať žiadosť o kontakt prijaté @@ -289,11 +289,11 @@ Všetky správy budú vymazané – toto je nezvratné! Správy sa vymažú IBA u vás. Povoliť miznúce správy, ale iba ak ich povolil váš kontakt. Povoliť súbory a médiá, ale iba ak ich povolil váš kontakt. - Povoliť nezvratné mazanie správ, ale iba ak ho povolil váš kontakt. (24 hodín) + Povoliť nezvratné vymazanie správ, ale iba ak ho povolil váš kontakt. (24 hodín) Povoliť reakcie na správy, ale iba ak ich povolil váš kontakt. Povoliť hlasové správy, ale iba ak ich povolil váš kontakt. Povoliť vašim kontaktom vám volať. - Povoliť vašim kontaktom nezvratne mazať poslané správy. (24 hodín) + Povoliť vašim kontaktom nezvratne vymazať poslané správy. (24 hodín) Povoliť vašim kontaktom posielať miznúce správy. Povoliť vašim kontaktom odosielať súbory a média. Povoliť vašim kontaktom posielať hlasové správy. @@ -320,7 +320,7 @@ prijal %1$s Chyby potvrdenia Pridajte adresu na váš profil, aby ju vaše SimpleX kontakty mohli zdieľať s ostatnými ľudmi. Aktualizácia profilu bude odoslaná vašim kontaktom. - Každá stránka môže zobraziť náhľad. + Každá webová stránka môže zobraziť náhľad. Zálohovať dáta aplikácie Migrácia dát aplikácie %s archivoval hlásenie @@ -402,7 +402,7 @@ Pripojiť Hlasové a video hovory hlasový hovor - hlasový hovor (nešifrovaný e2e) + hlasový hovor (není e2e šifrovaný) Hlasové a video hovory Povoľte v nasledujúcom dialógu okamžité prijímanie notifikácií.]]> Zničili sme silu vedieť, kto ste. Aby vám vašu moc nikto nemohol vziať. @@ -583,18 +583,25 @@ Vymazať správy Vymazať správy po Vymazať profil - Aplikácia už možno beží alebo sa nesprávne vypla. Zapnúť aj tak? + Aplikácia už možno beží alebo sa nesprávne vypla. Spustiť aj tak? Relácia aplikácie pre každý kontakt a každého člena skupiny.\nUpozornenie: ak máte veľa spojení, spotreba vašej batérie a internetu môže byť podstatne vyššia a niektoré spojenia môžu zlyhať.]]> zmenil rolu %s na %s zmenil vašu rolu na %s Zmeniť rolu Zmeniť rolu? - Chyba pri zmene roli + Chyba pri zmene role Rozšíriť výber rolí Počiatočná rola člen moderátor + Ste pozorovateľ + Ste člen + Ste moderátor + Ste správca + Ste majiteľ + Ste odberateľ + Ste prispievateľ moderátori Nová skupinová rola: Moderátor Nová rola člena @@ -657,10 +664,10 @@ Server vyžaduje overenie pre vytvorenie radov, skontrolujte heslo. Server vyžaduje overenie pre nahrávanie, skontrolujte heslo. Nastavte prístupovú frázu pre export - Aby ste odhalili svoj skrytý profil, zadajte celé heslo do vyhľadávacieho poľa na stránke profilov chatu. + Aby ste odhalili svoj skrytý profil, zadajte celé heslo do vyhľadávacieho poľa na stránke profilov chatov. Vaše prihlasovacie údaje môžu byť zaslané nešifrované. Android Keystore je použitý na bezpečné uloženie prístupovej frázy - umožňuje to fungovanie služby oznámení. - Android Keystore bude použitý na bezpečné uloženie prístupovej frázy potom ako reštartujete aplikáciu alebo zmeníte prístupovú frázu - umožní to fungovanie služby oznámení. + Android Keystore bude použitý na bezpečné uloženie prístupovej frázy po reštarte aplikácie alebo zmene prístupovej frázy - umožní to fungovanie služby oznámení. Upozornenie: ak stratíte vašu prístupovú frázu, NEBUDE možné ju obnoviť ani zmeniť.]]> Zmeniť prístupovú frázu k databáze? Potvrdiť novú prístupovú frázu… @@ -829,7 +836,7 @@ Naskenovať QR kód.]]> Počítač bol odpojený Odpojiť počítač? - Chyba zobrazenia notifikácie, kontaktujte vývojárov. + Chyba pri zobrazovaní notifikácie, kontaktujte vývojárov. Počítač nájdený Nekompatibilná verzia (nový)]]> @@ -951,7 +958,7 @@ Skrytie obrazovky aplikácie v zobrazení nedávnych aplikácií. Vylepšenie ochrany súkromia a zabezpečenia Vylepšená konfigurácia serverov - Nezvratné mazanie správ + Nezvratné vymazanie správ Živé správy Max. 40 sekúnd, prijíma sa okamžite. Návrh správy @@ -971,7 +978,7 @@ Overenie zabezpečenia pripojenia Hlasové správy S voliteľnou uvítaciou správou. - Vaše kontakty môžu povoliť úplné mazanie správ. + Vaše kontakty môžu povoliť úplné vymazanie správ. Preverenie bezpečnosti Povoliť v priamych chatoch (BETA)! Šifrovanie uložených súborov a médií @@ -1201,4 +1208,254 @@ Okamžité notifikácie Okamžité notifikácie! Okamžité notifikácie sú vypnuté! + duplikáty + Platnosť pozvánky vypršala! + pozvánka do skupiny %1$s + Pozvať + Pozvať + pozvaný + pozvané + pozval %1$s + Pozvať priateľov + Pozvať členov + Pozvať členov + Pozvať do chatu + Pozvať do skupiny + Nezvratné vymazanie správ je zakázané. + Nezvratné vymazanie správ je v tomto chate zakázané. + (toto zariadenie v%s)]]> + Veľký súbor! + Ďalšie informácie + Odkaz + Odkazy + Zoznam + Názov zoznamu... + ŽIVO + Živá správa! + Načítavam chaty… + Načítavam profil… + Načítavam súbor + Uistite sa, že konfigurácia proxy je správna. + Člen + Člen %1$s + Členovia môžu pridávať reakcie na správy. + chyba: %s + Chyba: %s + Zmieňte členov 👋 + správa + Správa + Správa preposlaná + Správa je príliš veľká! + Správa môže byť doručená neskôr až bude člen aktívny. + Reakcie na správy + Reakcie na správy sú zakázané. + Reakcie na správy sú v tomto chate zakázané. + Správy + Správy a súbory + end-to-end šifrovaním.]]> + Správy od %s budú zobrazené! + Správy od týchto členov budú zobrazené! + Tvar správ + Správy v tomto chate nebudú nikdy vymazané. + Text správy + Správa je príliš veľká + Mikrofón + minút + zmeškaný hovor + Zmeškaný hovor + nikdy + Nikdy + Nový chat + Nové v %s + nová správa + Nová správa + Nový server + OK + Otvoriť odkaz + Chyba pri prerušovaní zmeny adresy + Chyba pri pridávaní člena(ov) + Chyba pri pridávaní relé + Chyby + Chyba pri prijímaní podmienok + Chyba pri prijímaní žiadosti o kontakt + Chyba pri prijímaní člena + Chyba pri pridávaní relé + Chyba pri pridávaní serveru + Chyba pri blokovaní člena pre všetkých + Chyba pri zmene adresy + Chyba pri zmene profilu + Chyba pri zmene nastavení + Chyba pri pripájaní ku preposielaciemu serveru %1$s. Prosím, skúste to neskôr. + Pri pripájaní ku serveru používanému na príjem správ od tohto spojenia nastala nasledujúca chyba: %1$s. + Chyba pri vytváraní adresy + Chyba pri vytváraní kanálu + Chyba pri vytváraní zoznamu chatov + Chyba pri vytváraní odkazu na skupinu + Chyba pri vytváraní správy + Chyba pri vytváraní profilu! + Chyba pri vytváraní hlásenia + Chyba pri sťahovaní archívu + Chyba pri šifrovaní databázy + Chyba pri preposielaní správ + Chyba inicializácie WebView. Ujistite sa, že máte nainštalovaní WebView ktorý podporuje architektúru arm64.\nChyba: %s + Chyba pri načítavaní zoznamov chatov + Chyba pri načítavaní SMP serverov + Chyba pri načítavaní XFTP serverov + Chyba pri označovaní ako prečítané + Chyba pri otváraní prehliadača + Chyba pri otváraní kanálu + Chyba pri otváraní chatu + Chyba pri otváraní skupiny + Chyba pri odmietaní žiadosti o kontakt + Chyba pri odstraňovaní člena + Chyba pri resetovaní štatistík + Chyba pri odosielaní pozvánky + Chyba pri odosielaní správy + Chyba pri nastavovaní adresy + Chyba pri zdieľaní adresy + Chyba pri zdieľaní kanálu + chyba pri zobrazovaní obsahu + chyba pri zobrazovaní správy + Chyby v konfigurácii serverov. + Chyba pri spustení chatu + Chyba pri zastavovaní chatu + Chyba pri vymazávaní chatu + Chyba pri vymazávaní kontaktu + Chyba pri vymazávaní žiadosti o kontakt + Chyba pri vymazávaní databázy + Chyba pri vymazávaní skupiny + Chyba pri vymazávaní odkazu skupiny + Chyba pri vymazávaní správy + Chyba pri vymazávaní súkromných poznámok + Chyba pri vymazávaní používateľského profilu + Chyba pri ukladaní databázy + Chyba pri ukladaní súboru + Chyba pri ukladaní profilu skupiny + Chyba pri ukladaní ICE serverov + Chyba pri ukladaní mena + Chyba pri ukladaní proxy + Chyba pri ukladaní serverov + Chyba pri ukladaní nastavení + Chyba pri ukladaní nastavení + Chyba pri ukladaní SMP serverov + Chyba pri ukladaní XFTP serverov + Chyba pri aktualizovaní zoznamu chatov + Chyba pri aktualizovaní odkazu skupiny + Chyba pri aktualizovaní konfigurácie siete + Chyba pri aktualizovaní serveru + Chyba pri aktualizovaní súkromia používateľa + Neznáma chyba databázy: %s + Neznáma chyba + povolené pre vás + Povoliť pre všetkých + Povoliť pre všetky skupiny + Povoliť náhľady odkazov? + Experimentálne funkcie + neplatný chat + neplatné dáta + Neplatný odkaz + Neplatný odkaz! + neplatný formát správy + Neplatné meno! + Neplatný QR kód + Neplatný QR kód + Neplatná adresa relé! + Neplatná meno relé! + Neplatná adresa serveru! + nie + Nie + Nie + Nie + Žiadne aktívne relé + Žiadne dostupné relé + Žiadna služba na pozadí + Nikto nesledoval vaše konverzácie. Nikto nevytváral mapu miest, kde ste boli. Súkromie nebolo funkciou - bol to spôsob života. + Nie je povolené žiadne relé. + Žiadne chaty + Žiadne chaty v zozname %s. + Žiadne chaty s členmi + bez e2e šifrovania + Žiadne filtrované chaty + Žiadne filtrované kontakty + Žiadna história + Žiadna správa + Žiadne relé + Notifikácie + Notifikácie a batéria + Archív starej databázy + Jednorazová pozvánka + Jednorazová pozvánka + Jednorazový odkaz + Naraz sa dá poslať iba 10 obrázkov + Naraz sa dá poslať iba 10 videí + otvoriť + Otvoriť + Otvoriť + Otvoriť nastavenia aplikácie + Otvoriť zmeny + Otvoriť kanál + Otvoriť chat + Otvoriť čistý odkaz + Otvoriť podmienky + Otvoriť priečinok databázy + Otvoriť externý odkaz? + Otvoriť celý odkaz + Otvoriť nový kanál + Otvoriť nastavenia serveru + Otvoriť nastavenia + Otvorte SimpleX Chat na prijatie hovoru + Otvoriť webový odkaz? + Otvoriť pomocou %s + Alebo naskenovať QR kód + Alebo vložiť odkaz archívu + Chyba súboru + naskenovať QR kód vo video hovore, alebo váš kontakt môže zdieľať pozvánku.]]> + ukážte QR kód vo video hovore, alebo zdieľajte odkaz.]]> + Ak sa nemôžte stretnúť osobne, ukážte QR kód vo video hovore, alebo zdieľajte odkaz. + Ak ste dostali SimpleX Chat pozvánku, môžete ju otvoriť v prehliadači: + Nesprávny bezpečnostný kód + Farby rozhrania + mesiacov + Viac + Viac súkromia + nové + Nový jednorazový odkaz + Nová žiadosť o kontakt + Poznámky + iné chyby + Majiteľ + peer-to-peer + Pravidelné + Pravidelné notifikácie + Pravidelné notifikácie sú vypnuté! + člen má starú verziu + Člen je neaktívny + Člen je vymazaný - nemôže prijať žiadosť + Členovia môžu chatovať so správcami. + Členovia môžu nezvratne vymazať odoslané správy. (24 hodín) + Členovia môžu posielať priame správy. + Členovia môžu posielať miznúce správy. + Členovia môžu posielať súbory a médiá. + Členovia môžu posielať SimpleX odkazy. + Členovia môžu posielať hlasové správy. + Súkromné poznámky + QR kód + Náhodný + Uložiť + Uložiť + uložené + Uložené + Uložené správy + Uložiť zoznam + Uložiť servery + Uložiť servery? + Uložiť nastavenia? + Uložiť nastavenia SimpleX adresy + Uložiť SimpleX meno? + Uložiť uvítaciu správu? + Vaše SMP servery + Vaše XFTP servery + Vaše ICE servery + ICE servery (jeden na riadok) + Ujistite sa, že adresy WebRTC ICE serverov sú v správnom formáte, oddelené na riadkoch a nie sú duplikované. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml index ddc258490f..da2aea2868 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/th/strings.xml @@ -1078,6 +1078,10 @@ คุณไม่มีการแชท แชท คุณเป็นผู้สังเกตการณ์ + คุณเป็นผู้สังเกตการณ์ + คุณเป็นสมาชิก + คุณเป็นผู้ดูแลระบบ + คุณเป็นเจ้าของ ภาพไม่สามารถถอดรหัส ได้ โปรดลองใช้รูปภาพอื่นหรือติดต่อนักพัฒนา คุณไม่สามารถส่งข้อความได้! กําลังรอภาพ diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml index 2fff0e4082..bacc84b0f7 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml @@ -842,6 +842,13 @@ Gruba davetlisiniz Hiç sohbetiniz yok Gözlemcisiniz + Gözlemcisiniz + Üyesiniz + Yöneticisiniz + Yöneticisiniz + Sahipsiniz + Abonesiniz + Katkıda bulunansınız sen gözlemcisin Güvenlik kodunu görüntüle Sesli mesaj gönderebilmeniz için kişinizin de sesli mesaj göndermesine izin vermeniz gerekir. @@ -1720,7 +1727,7 @@ Litvanya Kullanıcı Arayüzü Diğer kaydedildi - %s tarafından kaydedildi + kaydedildi: İletildi Kaydedildi İndir diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml index 439be068fa..457fd4abe1 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml @@ -1155,6 +1155,12 @@ Забагато зображень! Забагато відео! ви спостерігач + Ви спостерігач + Ви учасник + Ви модератор + Ви адміністратор + Ви власник + Ви автор кольоровий дзвінок завершено %1$s помилка дзвінка @@ -1807,7 +1813,7 @@ Квадрат, коло або щось середнє між ними. Буде ввімкнено в прямих чатах! збережено - збережено з %s + збережено з Дротова мережа Ethernet Невідомі сервери! Без Tor або VPN ваша IP-адреса буде видимою для цих XFTP-ретрансляторів: diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml index 5d97b21a1f..aac2109d11 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml @@ -1594,7 +1594,7 @@ Các tùy chọn của cuộc trò chuyện được chọn không cho phép tin nhắn này. Quét mã QR đã lưu - đã lưu từ %s + đã lưu từ Đã lưu từ Quét mã QR từ máy tính Đã được bảo mật @@ -2213,6 +2213,12 @@ Bạn có thể tùy chỉnh các máy chủ thông qua cài đặt. Bạn có thể đặt tên kết nối, để nhớ xem đường dẫn đã được chia sẻ với ai. bạn là quan sát viên + Bạn là quan sát viên + Bạn là thành viên + Bạn là kiểm duyệt viên + Bạn là quản trị viên + Bạn là chủ sở hữu + Bạn là người theo dõi Bạn có thể sao chép và giảm kích thước tin nhắn để gửi nó đi. Bạn có thể bật chúng vào lúc sau thông qua cài đặt Quyền riêng tư & Bảo mật của ứng dụng. Bạn có thể ẩn hoặc tắt thông báo một hồ sơ người dùng - giữ nó trong phần menu. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml index 957d051898..831da9ca8c 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml @@ -927,6 +927,13 @@ 删除成员消息? 观察员 你是观察者 + 你是观察员 + 你是成员 + 你是协管 + 你是管理员 + 你是群主 + 你是订阅者 + 你是贡献者 更新群链接错误 你是观察员 初始角色 @@ -1718,7 +1725,7 @@ 已保存 已保存 保存自 - 保存自%s + 保存自 已转发 转发自 蓝牙 @@ -2498,7 +2505,7 @@ 欢迎联系人👋 来自%1$s群的连接请求 此设置用于当前个人资料 - 来自群的联络请求 + 群内的联络请求 成员被删除——无法接受请求 只有你的联系人允许的情况下才允许文件和媒体。 允许你的联系人发送文件和媒体。 @@ -2917,4 +2924,11 @@ SimpleX 公开名称 (测试) 文件服务器 文件服务器:%s + 群邀请 + 转发自 + %1$02d 小时 %2$02d 分钟 %3$02d 秒 + 众筹投资者可在销售开始前保留名称: + SimpleX 名称销售开始于 + 直到您可以注册 SimpleX 域名 + 更新应用来注册 SimpleX 域名 diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml index ad82cb8329..05e3cd8030 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml @@ -926,6 +926,13 @@ 該訊息將對所有成員標記為已移除。 你是觀察員 你是觀察員 + 你是觀察員 + 你是成員 + 你是審核員 + 你是管理員 + 你是擁有者 + 你是訂閱者 + 你是貢獻者 觀察員 更新群組連接時出錯 請聯絡群組管理員。 @@ -1935,7 +1942,7 @@ 已封存的報告 只有你和審核員能夠檢視 只有傳送者和審核員能夠檢視 - 已儲存自 %s + 已儲存自 此聊天受到端對端加密保護。 另一個原因 不當的個人檔案 diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/other/videoplayer/SkiaBitmapVideoSurface.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/other/videoplayer/SkiaBitmapVideoSurface.kt index f5bba2d344..26748b8425 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/other/videoplayer/SkiaBitmapVideoSurface.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/other/videoplayer/SkiaBitmapVideoSurface.kt @@ -8,6 +8,7 @@ import org.jetbrains.skia.Bitmap import org.jetbrains.skia.ColorAlphaType import org.jetbrains.skia.ColorType import org.jetbrains.skia.ImageInfo +import uk.co.caprica.vlcj.media.VideoOrientation import uk.co.caprica.vlcj.player.base.MediaPlayer import uk.co.caprica.vlcj.player.embedded.videosurface.CallbackVideoSurface import uk.co.caprica.vlcj.player.embedded.videosurface.VideoSurface @@ -22,10 +23,42 @@ import javax.swing.SwingUtilities // https://github.com/JetBrains/compose-multiplatform/pull/3336/files internal class SkiaBitmapVideoSurface : VideoSurface(VideoSurfaceAdapters.getVideoSurfaceAdapter()) { + private companion object { + // A received file declares its own size, and vlc allocates the buffer we ask for here (and we copy + // it into a java array of the same size), so an unbounded request is an out-of-memory from a message. + // Above the budget the picture is scaled down keeping its aspect - 4096x4096 of RV32 is 64 MB + const val MAX_BUFFER_PIXELS = 4096L * 4096L + val transposedOrientations = setOf( + VideoOrientation.LEFT_TOP, + VideoOrientation.LEFT_BOTTOM, + VideoOrientation.RIGHT_TOP, + VideoOrientation.RIGHT_BOTTOM, + ) + + // Keeps the aspect, never returns a side below 1, and keeps width * height * 4 inside an Int + fun boundedSize(width: Int, height: Int): Pair { + val w = width.coerceAtLeast(1) + val h = height.coerceAtLeast(1) + val pixels = w.toLong() * h.toLong() + if (pixels <= MAX_BUFFER_PIXELS) return w to h + val scale = kotlin.math.sqrt(MAX_BUFFER_PIXELS.toDouble() / pixels.toDouble()) + var sw = (w * scale).toInt().coerceAtLeast(1) + var sh = (h * scale).toInt().coerceAtLeast(1) + // Scaling both sides assumes both shrink; a side pinned at 1 only shrinks the area linearly, + // so a 2_000_000_000 x 1 declaration would still get 45 times the budget. Divide the budget + // by the pinned side instead + if (sw.toLong() * sh.toLong() > MAX_BUFFER_PIXELS) { + if (sw >= sh) sw = (MAX_BUFFER_PIXELS / sh).toInt() else sh = (MAX_BUFFER_PIXELS / sw).toInt() + } + return sw to sh + } + } + private val videoSurface = SkiaBitmapVideoSurface() @Volatile private var mediaPlayer: MediaPlayer? = null private lateinit var imageInfo: ImageInfo private lateinit var frameBytes: ByteArray + @Volatile private var allocated = false private val skiaBitmap: Bitmap = Bitmap() private val composeBitmap = mutableStateOf(null) @@ -49,19 +82,37 @@ internal class SkiaBitmapVideoSurface : VideoSurface(VideoSurfaceAdapters.getVid val tracks = player?.media()?.info()?.videoTracks() val playingTrack = player?.video()?.track() val track = tracks?.firstOrNull { it.id() == playingTrack } ?: tracks?.singleOrNull() - this.sourceWidth = track?.width()?.takeIf { it > 0 } ?: sourceWidth - this.sourceHeight = track?.height()?.takeIf { it > 0 } ?: sourceHeight - return RV32BufferFormat(this.sourceWidth, this.sourceHeight) + // Both track sides or neither: one side from the track and the other from the padded size libvlc + // passed never described the same picture, and transposing such a pair compounds the mismatch + val trackW = track?.width() ?: 0 + val trackH = track?.height() ?: 0 + val useTrack = trackW > 0 && trackH > 0 + val width = if (useTrack) trackW else sourceWidth + val height = if (useTrack) trackH else sourceHeight + // The track carries the size before rotation, but vlc rotates the picture before it reaches + // this buffer, so for the transposed orientations the picture arrives with the sides swapped. + // Only when the track's own sides are used: the size libvlc passed is already rotated + val transposed = useTrack && (track?.orientation() in transposedOrientations) + val orientedWidth = if (transposed) height else width + val orientedHeight = if (transposed) width else height + val (w, h) = boundedSize(orientedWidth, orientedHeight) + this.sourceWidth = w + this.sourceHeight = h + return RV32BufferFormat(w, h) } override fun allocatedBuffers(buffers: Array) { - frameBytes = buffers[0].run { ByteArray(remaining()).also(::get) } + // rewind first, as in display: remaining() on an already-read buffer would size this short + frameBytes = buffers[0].run { rewind(); ByteArray(remaining()).also(::get) } imageInfo = ImageInfo( sourceWidth, sourceHeight, ColorType.BGRA_8888, ColorAlphaType.PREMUL, ) + // Last, and volatile: vlc calls this on its own thread while display reads imageInfo and + // frameBytes on the event thread, and this write is what publishes them to it + this@SkiaBitmapVideoSurface.allocated = true } } @@ -71,11 +122,35 @@ internal class SkiaBitmapVideoSurface : VideoSurface(VideoSurfaceAdapters.getVid nativeBuffers: Array, bufferFormat: BufferFormat, ) { + // The native buffer belongs to vlc and is only guaranteed to exist for the duration of this + // callback, so everything that touches it has to happen here, on vlc's thread - deferred code + // would read through a pointer vlc may have freed on a format change. Only the copy is done + // here; skia and compose are event-thread objects and get the private copy + if (!this@SkiaBitmapVideoSurface.allocated) return + val info = imageInfo + // imageInfo comes from the format that was last allocated and this frame from the format it was + // rendered with; they differ across a renegotiation, and the pixels would be read with the + // wrong stride, so display only what matches + if (bufferFormat.width != info.width || bufferFormat.height != info.height) return + val rowBytes = info.width.toLong() * 4 + val needed = rowBytes * info.height + val buffer = nativeBuffers[0] + // rewind first: the same buffer is reused for every frame, so its position is at the end of + // the previous read and remaining() would be 0 + buffer.rewind() + // Capture the array: a renegotiation replaces the field with one of another size before the + // deferred install runs, and info's geometry must be read against the array it was copied into. + // The next frame's copy can overwrite it while the install reads - a torn frame at worst, since + // the geometry checks above hold for both frames of the same format + val bytes = frameBytes + if (needed > bytes.size || buffer.remaining().toLong() < needed) return + buffer.get(bytes, 0, needed.toInt()) SwingUtilities.invokeLater { - nativeBuffers[0].rewind() - nativeBuffers[0].get(frameBytes) - skiaBitmap.installPixels(imageInfo, frameBytes, bufferFormat.width * 4) - composeBitmap.value = skiaBitmap.asComposeImageBitmap() + // installPixels reports whether skia took the pixels; publishing the bitmap when it did not + // would hand compose a bitmap with no pixels behind it + if (skiaBitmap.installPixels(info, bytes, rowBytes.toInt())) { + composeBitmap.value = skiaBitmap.asComposeImageBitmap() + } } } } diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/AnimatedImage.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/AnimatedImage.desktop.kt new file mode 100644 index 0000000000..e12bae4280 --- /dev/null +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/AnimatedImage.desktop.kt @@ -0,0 +1,199 @@ +package chat.simplex.common.platform + +import androidx.compose.runtime.* +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.asComposeImageBitmap +import chat.simplex.common.simplexWindowState +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.first +import org.jetbrains.skia.Bitmap +import org.jetbrains.skia.Codec +import org.jetbrains.skia.ColorAlphaType +import org.jetbrains.skia.Data + +// Animated images are decoded from data received from other users, which is what the bounds below are for + +// In bytes as the file chooses the color type, 1920x1920 at 4 bytes a pixel is ~15MB +private const val MAX_ANIMATED_RASTER_BYTES: Long = 1920L * 1920 * 4 +// 65535x32 is only 2.1MP, so each side is bounded as well +private const val MAX_ANIMATED_SIDE = 4096 +// Skia copies the encoded bytes into native memory and scans them to count frames +private const val MAX_ANIMATED_FILE_SIZE = 32 * 1024 * 1024 +// Counting frames builds a table the codec holds while it plays, several times the file's size for minimal ones +private const val MAX_ANIMATED_FRAMES = 10_000 +// 10ms or less is how "as fast as possible" is written, and browsers substitute 100ms for it +private const val MAX_UNSPECIFIED_FRAME_DURATION_MS = 10 +private const val DEFAULT_FRAME_DURATION_MS = 100L +private const val MIN_FRAME_DURATION_MS = 20L +// A frame costing more than this holds most of a core to show under 10 frames a second +private const val MAX_FRAME_DECODE_MS = 100L +// Far above what a frame within the bounds above can cost, so only a stall reaches it +private const val MAX_WAITED_FRAME_COST_MS = 10 * MAX_FRAME_DECODE_MS +private const val SLOW_FRAME_COST = 2 +internal const val MAX_SLOW_FRAME_DEBT = 4 +private const val NO_PRIOR_FRAME = -1 +// A frame given no prior frame is rebuilt by recursing down its chain, so a long enough one overflows the +// native stack, which no catch can stop. Real animations rebuild nothing. +private const val MAX_REBUILT_FRAMES = 64 + +// Read once, as asking the codec about a frame allocates and the loop may repeat forever +private class Animation(val codec: Codec, val priorFrames: IntArray, val frameDelays: LongArray) + +/** + * The current frame of [data], or [still] when it is not an animation, falls outside the bounds above, or + * fails before showing a frame; after that it stops on the frame it reached. Decoding runs off the UI thread. + */ +@Composable +fun rememberAnimatedImage(data: ByteArray, still: ImageBitmap, hidden: () -> Boolean = { false }): ImageBitmap { + // Keyed as the decoding is, so frames are not written into a replaced state, and hidden is not a key so it + // pauses instead of restarting. Every frame is a new wrapper, and only its identity says the image changed. + val frame = remember(data, still) { mutableStateOf(still, neverEqualPolicy()) } + LaunchedEffect(data, still) { + withContext(animationDecoder) { + val animation = openAnimation(data) ?: return@withContext + try { + playFrames(animation, hidden) { frame.value = it } + } finally { + animation.codec.close() + } + } + } + return frame.value +} + +// Decoding several large animations must not starve the long running calls that share this pool +@OptIn(ExperimentalCoroutinesApi::class) +private val animationDecoder = Dispatchers.Default.limitedParallelism(2) + +private fun openAnimation(data: ByteArray): Animation? { + if (!looksAnimatable(data) || !fileSizeWithinBounds(data.size)) return null + var codec: Codec? = null + var animation: Animation? = null + try { + // Skia retains the encoded bytes, so this native buffer is freed as soon as the codec has taken it + val encoded = Data.makeFromBytes(data) + codec = try { + Codec.makeFromData(encoded) + } finally { + encoded.close() + } + animation = boundedAnimation(codec) + } catch (e: Throwable) { + Log.e(TAG, "Unable to read animated image: $e") + } + // The codec is only left open for an animation that took it, so no bound can return past closing it + if (animation == null) codec?.close() + return animation +} + +private fun boundedAnimation(codec: Codec): Animation? { + val info = codec.imageInfo + if (!rasterWithinBounds(info.width, info.height, info.bytesPerPixel)) return null + // Counting frames scans the file, while dimensions are only read from the header + val frameCount = codec.frameCount + if (!frameCountWithinBounds(frameCount)) return null + val requiredFrames = IntArray(frameCount) + val frameDelays = LongArray(frameCount) + for (i in 0 until frameCount) { + val frameInfo = codec.getFrameInfo(i) + requiredFrames[i] = frameInfo.requiredFrame + frameDelays[i] = frameDuration(frameInfo.duration) + } + if (!rebuiltFramesWithinBounds(requiredFrames)) return null + return Animation(codec, IntArray(frameCount) { priorFrame(it, requiredFrames[it]) }, frameDelays) +} + +internal fun looksAnimatable(data: ByteArray): Boolean = + data.startsWith("GIF8") || (data.startsWith("RIFF") && data.startsWith("WEBP", offset = 8)) + +private fun ByteArray.startsWith(ascii: String, offset: Int = 0): Boolean { + if (size < offset + ascii.length) return false + return ascii.indices.all { this[offset + it] == ascii[it].code.toByte() } +} + +internal fun rasterWithinBounds(width: Int, height: Int, bytesPerPixel: Int): Boolean { + if (width !in 1..MAX_ANIMATED_SIDE || height !in 1..MAX_ANIMATED_SIDE) return false + // 0 bytes per pixel would let any raster pass the bound below + if (bytesPerPixel < 1) return false + // The sides are bounded before they are multiplied, so the product cannot overflow + return width.toLong() * height * bytesPerPixel <= MAX_ANIMATED_RASTER_BYTES +} + +private suspend fun playFrames(animation: Animation, hidden: () -> Boolean, showFrame: (ImageBitmap) -> Unit) { + try { + val codec = animation.codec + val bitmap = Bitmap() + // The codec reports only the first frame's alpha type, and a frame with alpha cannot be read into an + // opaque bitmap. allocPixels returns false rather than throwing. + if (!bitmap.allocPixels(codec.imageInfo.withColorAlphaType(ColorAlphaType.PREMUL))) return + var loopsLeft = codec.repetitionCount // negative repeats forever + var debt = 0 + while (true) { + for (i in animation.priorFrames.indices) { + awaitFramesAreSeen(hidden) + val startedDecoding = System.nanoTime() + codec.readPixels(bitmap, i, animation.priorFrames[i]) + // Wall time, so a frame can overrun by being descheduled rather than by being expensive + val decodedIn = System.nanoTime() - startedDecoding + debt = slowFrameDebt(debt, decodedIn > MAX_FRAME_DECODE_MS * 1_000_000) + // The bitmap is never closed, as the wrapper points at its pixels and a frame may still be drawn + showFrame(bitmap.asComposeImageBitmap()) + if (debt >= MAX_SLOW_FRAME_DEBT) { + Log.d(TAG, "Animation too expensive to decode, stopping on this frame") + return + } + delay(frameWait(animation.frameDelays[i], decodedIn / 1_000_000)) + } + if (loopsLeft == 0) return + if (loopsLeft > 0) loopsLeft-- + } + } catch (e: CancellationException) { + throw e // the view is gone, not a decoding failure + } catch (e: Throwable) { + Log.e(TAG, "Unable to play animated image: $e") + } +} + +// Composition survives the window being minimized or hidden, and the caller knows when its image cannot be seen +private suspend fun awaitFramesAreSeen(hidden: () -> Boolean) { + if (framesAreSeen(hidden)) return + snapshotFlow { framesAreSeen(hidden) }.first { it } +} + +private fun framesAreSeen(hidden: () -> Boolean): Boolean = + simplexWindowState.windowVisible.value && !simplexWindowState.windowState.isMinimized && !hidden() + +// Waiting out the cost as well as the delay leaves an animation about half a decoder thread. The cost is +// wall time, so a stall is only waited out so far. +internal fun frameWait(delayMs: Long, costMs: Long): Long = + maxOf(delayMs, costMs.coerceAtMost(MAX_WAITED_FRAME_COST_MS)) + +internal fun fileSizeWithinBounds(size: Int): Boolean = size <= MAX_ANIMATED_FILE_SIZE + +// A file of no frames would spin the playback loop uncancellably, as it only suspends inside the range +internal fun frameCountWithinBounds(frameCount: Int): Boolean = frameCount in 2..MAX_ANIMATED_FRAMES + +// The frame the codec may decode this one from, which is the one before it when the bitmap still holds it. +// Rebuilding the chain instead costs 9.10ms a frame against 0.05ms, and Skia refuses a frame it did not ask for. +internal fun priorFrame(index: Int, requiredFrame: Int): Int = + if (requiredFrame == index - 1) index - 1 else NO_PRIOR_FRAME + +// requiredFrames is what each frame continues; one that continues nothing starts a chain of its own +internal fun rebuiltFramesWithinBounds(requiredFrames: IntArray): Boolean { + val chain = IntArray(requiredFrames.size) + requiredFrames.forEachIndexed { index, required -> + val continues = required in 0 until index + chain[index] = if (continues) chain[required] + 1 else 1 + if (continues && priorFrame(index, required) == NO_PRIOR_FRAME && chain[required] > MAX_REBUILT_FRAMES) return false + } + return true +} + +// Two expensive frames in a row reach the debt, and so do frames that alternate with cheap ones, which a +// count that reset would miss +internal fun slowFrameDebt(debt: Int, tooSlow: Boolean): Int = + (debt + if (tooSlow) SLOW_FRAME_COST else -1).coerceAtLeast(0) + +internal fun frameDuration(declaredMs: Int): Long = + if (declaredMs <= MAX_UNSPECIFIED_FRAME_DURATION_MS) DEFAULT_FRAME_DURATION_MS + else declaredMs.toLong().coerceAtLeast(MIN_FRAME_DURATION_MS) diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/VideoPlayer.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/VideoPlayer.desktop.kt index 768d2f421d..d9375f5d79 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/VideoPlayer.desktop.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/VideoPlayer.desktop.kt @@ -11,7 +11,6 @@ import uk.co.caprica.vlcj.media.Media import uk.co.caprica.vlcj.media.MediaEventAdapter import uk.co.caprica.vlcj.media.MediaParsedStatus import uk.co.caprica.vlcj.media.ParseFlag -import uk.co.caprica.vlcj.media.VideoOrientation import uk.co.caprica.vlcj.player.base.* import uk.co.caprica.vlcj.player.component.CallbackMediaPlayerComponent import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent @@ -232,7 +231,18 @@ actual class VideoPlayer actual constructor( player.media().startPaused(uri.toFile().absolutePath) val snap = withTimeoutOrNull(1500L) { while (surface.bitmap.value == null) delay(50) - surface.bitmap.value!!.toAwtImage() + // The render callback installs pixels into the surface bitmap on the event thread, so read it + // there too - converting off that thread races a resize on format renegotiation and segfaults + // inside skia while reading pixels of the previous, smaller buffer + val holder = java.util.concurrent.atomic.AtomicReference(null) + // invokeAndWait rethrows whatever the conversion threw, wrapped, and the callers of this have + // no handler; a frame that cannot be converted is a missing preview, not a failed send + try { + javax.swing.SwingUtilities.invokeAndWait { holder.set(surface.bitmap.value?.toAwtImage()) } + } catch (e: Exception) { + Log.e(TAG, "getBitmapFromVideo snapshot failed: ${e.stackTraceToString()}") + } + holder.get() } val orientation = player.media().info().videoTracks().firstOrNull()?.orientation() if (orientation == null) { @@ -242,17 +252,9 @@ actual class VideoPlayer actual constructor( return@withContext VideoPlayerInterface.PreviewAndDuration(preview = defaultPreview, timestamp = 0L, duration = 0L) } - val preview: ImageBitmap? = when (orientation) { - VideoOrientation.TOP_LEFT -> snap - VideoOrientation.TOP_RIGHT -> snap?.flip(false, true) - VideoOrientation.BOTTOM_LEFT -> snap?.flip(true, false) - VideoOrientation.BOTTOM_RIGHT -> snap?.rotate(180.0) - VideoOrientation.LEFT_TOP -> snap /* Transposed */ - VideoOrientation.LEFT_BOTTOM -> snap?.rotate(-90.0) - VideoOrientation.RIGHT_TOP -> snap?.rotate(90.0) - VideoOrientation.RIGHT_BOTTOM -> snap /* Anti-transposed */ - else -> snap - }?.toComposeImageBitmap() + // vlc applies the display matrix before the frame reaches the video surface, so the snapshot + // arrives upright; orienting it again here would undo that + val preview: ImageBitmap? = snap?.toComposeImageBitmap() val duration = player.duration.toLong() player.stop() putHelperPlayer(mediaComponent) diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.desktop.kt index b4a24e3572..98ffa7c8a4 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.desktop.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/CIImageView.desktop.kt @@ -1,6 +1,7 @@ package chat.simplex.common.views.chat.item import androidx.compose.runtime.Composable +import androidx.compose.runtime.State import androidx.compose.ui.graphics.* import androidx.compose.ui.graphics.painter.BitmapPainter import androidx.compose.ui.graphics.painter.Painter @@ -15,10 +16,15 @@ actual fun SimpleAndAnimatedImageView( file: CIFile?, imageProvider: () -> ImageGalleryProvider, smallView: Boolean, + blurred: State, ImageView: @Composable (painter: Painter, onClick: () -> Unit) -> Unit ) { - // LALAL make it animated too - ImageView(BitmapPainter(imageBitmap)) { + // The small view is the chat list preview, which the layout keeps on screen without pause, so it stays a + // still image. A full screen modal is shown beside the chat rather than in place of it, so this item keeps + // composing under one and would otherwise decode where nobody can see it. + val frame = if (smallView) imageBitmap + else rememberAnimatedImage(data, imageBitmap) { blurred.value || ModalManager.fullscreen.hasModalsOpen() } + ImageView(BitmapPainter(frame)) { if (getLoadedFilePath(file) != null) { ModalManager.fullscreen.showCustomModal(animated = false) { close -> ImageFullScreenView(imageProvider, close) diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/CIVideoView.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/CIVideoView.desktop.kt index bdfbf6863f..d60790b694 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/CIVideoView.desktop.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/CIVideoView.desktop.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.* import androidx.compose.runtime.* import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalWindowInfo import androidx.compose.ui.unit.Dp @@ -14,6 +15,8 @@ import java.awt.Window @Composable actual fun PlayerView(player: VideoPlayer, width: Dp, onClick: () -> Unit, onLongClick: () -> Unit, stop: () -> Unit) { Box { + // The preview this replaces while playing is drawn with FillWidth, so a video smaller than the + // item width has to grow the same way here - Fit would leave it at its own size in the middle SurfaceFromPlayer(player, Modifier .width(width) @@ -21,7 +24,8 @@ actual fun PlayerView(player: VideoPlayer, width: Dp, onClick: () -> Unit, onLon onLongClick = onLongClick, onClick = { if (player.player.isPlaying) stop() else onClick() } ) - .onRightClick(onLongClick) + .onRightClick(onLongClick), + contentScale = ContentScale.FillWidth ) } } diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/ImageFullScreenView.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/ImageFullScreenView.desktop.kt index bd395c2c97..9fb4afbf7d 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/ImageFullScreenView.desktop.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/views/chat/item/ImageFullScreenView.desktop.kt @@ -19,8 +19,10 @@ import kotlin.math.max @Composable actual fun FullScreenImageView(modifier: Modifier, data: ByteArray, imageBitmap: ImageBitmap) { + // Decoded once, as an animation recomposes this on every frame + val still = remember(data) { getBitmapFromByteArray(data, false) ?: MR.images.decentralized.image.toComposeImageBitmap() } Image( - getBitmapFromByteArray(data, false) ?: MR.images.decentralized.image.toComposeImageBitmap(), + rememberAnimatedImage(data, still), contentDescription = stringResource(MR.strings.image_descr), contentScale = ContentScale.Fit, modifier = modifier, @@ -41,7 +43,7 @@ actual fun FullScreenVideoView(player: VideoPlayer, modifier: Modifier, close: ( } @Composable -fun BoxScope.SurfaceFromPlayer(player: VideoPlayer, modifier: Modifier) { +fun BoxScope.SurfaceFromPlayer(player: VideoPlayer, modifier: Modifier, contentScale: ContentScale = ContentScale.Fit) { val surface = remember { SkiaBitmapVideoSurface().also { player.player.videoSurface().set(it) @@ -52,7 +54,7 @@ fun BoxScope.SurfaceFromPlayer(player: VideoPlayer, modifier: Modifier) { bitmap, modifier = modifier.align(Alignment.Center), contentDescription = null, - contentScale = ContentScale.Fit, + contentScale = contentScale, alignment = Alignment.Center, ) } diff --git a/apps/multiplatform/common/src/desktopTest/kotlin/chat/simplex/app/AnimatedImageBoundsTest.kt b/apps/multiplatform/common/src/desktopTest/kotlin/chat/simplex/app/AnimatedImageBoundsTest.kt new file mode 100644 index 0000000000..b79dd69779 --- /dev/null +++ b/apps/multiplatform/common/src/desktopTest/kotlin/chat/simplex/app/AnimatedImageBoundsTest.kt @@ -0,0 +1,252 @@ +package chat.simplex.app + +import chat.simplex.common.platform.MAX_SLOW_FRAME_DEBT +import chat.simplex.common.platform.frameWait +import chat.simplex.common.platform.fileSizeWithinBounds +import chat.simplex.common.platform.frameCountWithinBounds +import chat.simplex.common.platform.frameDuration +import chat.simplex.common.platform.looksAnimatable +import chat.simplex.common.platform.priorFrame +import chat.simplex.common.platform.rasterWithinBounds +import chat.simplex.common.platform.rebuiltFramesWithinBounds +import chat.simplex.common.platform.slowFrameDebt +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +// The bounds an animated image must satisfy, checked as arithmetic: skiko's native library is not on the +// test runtime classpath, and these numbers are the part that has to be right about someone else's file. +class AnimatedImageBoundsTest { + private val BYTES_PER_PIXEL = 4 // what a GIF or WebP decodes to + + @Test + fun testOrdinaryAnimationIsWithinBounds() { + assertTrue(rasterWithinBounds(64, 64, BYTES_PER_PIXEL)) + assertTrue(rasterWithinBounds(1244, 554, BYTES_PER_PIXEL)) + } + + @Test + fun testHugeDeclaredDimensionsAreRejected() { + // A 17GB raster, declared by a GIF of 35 bytes + assertFalse(rasterWithinBounds(65535, 65535, BYTES_PER_PIXEL)) + } + + @Test + fun testDimensionsOverRasterBudgetAreRejected() { + // Plausible-looking, but one raster of this size is ~64MB and a chat shows several at once + assertFalse(rasterWithinBounds(4000, 4000, BYTES_PER_PIXEL)) + } + + @Test + fun testAspectRatioIsBoundedOnEachSideSeparately() { + // Only 2.1MP, so the raster bound alone would animate this with a 65535-pixel scanline + assertFalse(rasterWithinBounds(65535, 32, BYTES_PER_PIXEL)) + assertFalse(rasterWithinBounds(32, 65535, BYTES_PER_PIXEL)) + assertTrue(rasterWithinBounds(3000, 500, BYTES_PER_PIXEL)) + assertTrue(rasterWithinBounds(4096, 900, BYTES_PER_PIXEL)) + } + + @Test + fun testBudgetBoundariesAreExact() { + assertTrue(rasterWithinBounds(1920, 1920, BYTES_PER_PIXEL)) + assertFalse(rasterWithinBounds(1921, 1920, BYTES_PER_PIXEL)) + assertFalse(rasterWithinBounds(4097, 100, BYTES_PER_PIXEL)) + } + + @Test + fun testEmptyDimensionsAreRejected() { + assertFalse(rasterWithinBounds(0, 64, BYTES_PER_PIXEL)) + assertFalse(rasterWithinBounds(64, 0, BYTES_PER_PIXEL)) + assertFalse(rasterWithinBounds(-1, 64, BYTES_PER_PIXEL)) + } + + @Test + fun testWiderColorTypesCountAgainstTheSameBudget() { + // The file chooses its color type, so the 1920x1920 that fits at four bytes is twice the raster at eight + assertFalse(rasterWithinBounds(1920, 1920, 8)) + assertTrue(rasterWithinBounds(1357, 1357, 8)) + // A color type claiming no bytes per pixel would otherwise make any raster look free + assertFalse(rasterWithinBounds(4096, 4096, 0)) + } + + @Test + fun testAnimatableContainersAreRecognized() { + assertTrue(looksAnimatable("GIF89a...".toByteArray())) + assertTrue(looksAnimatable("GIF87a...".toByteArray())) + assertTrue(looksAnimatable("RIFF????WEBPVP8X".toByteArray())) + } + + @Test + fun testPhotosNeverReachTheAnimationDecoder() { + assertFalse(looksAnimatable(bytes(0x89, 'P'.code, 'N'.code, 'G'.code, 0x0D, 0x0A, 0x1A, 0x0A))) + assertFalse(looksAnimatable(bytes(0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46))) + // A RIFF container that is not WebP, a wave file say + assertFalse(looksAnimatable("RIFF????WAVEfmt ".toByteArray())) + } + + @Test + fun testShortDataIsRejectedWithoutReadingPastTheEnd() { + assertFalse(looksAnimatable(ByteArray(0))) + assertFalse(looksAnimatable("GIF".toByteArray())) + // Long enough for the RIFF tag, too short for the format that follows it + assertFalse(looksAnimatable("RIFF".toByteArray())) + assertFalse(looksAnimatable("RIFF1234WEB".toByteArray())) + } + + @Test + fun testPriorFrameIsReusedOnlyWhenTheBitmapHoldsIt() { + assertEquals(4, priorFrame(5, 4)) + // An older required frame is no longer in the bitmap, which is also how a predecessor disposed to what + // came before it is skipped, as Skia never requires one + assertEquals(-1, priorFrame(5, 2)) + assertEquals(-1, priorFrame(5, -1)) + // For the first frame, -1 is both its required frame and no prior frame + assertEquals(-1, priorFrame(0, -1)) + } + + @Test + fun testOnlyFilesSmallEnoughToScanAreWithinBounds() { + assertTrue(fileSizeWithinBounds(0)) + // The largest animation in this repository + assertTrue(fileSizeWithinBounds(6_013_354)) + assertTrue(fileSizeWithinBounds(32 * 1024 * 1024)) + assertFalse(fileSizeWithinBounds(32 * 1024 * 1024 + 1)) + } + + @Test + fun testOnlyAnimationsWorthHoldingFramesForAreWithinBounds() { + assertFalse(frameCountWithinBounds(0)) + assertFalse(frameCountWithinBounds(1)) + assertFalse(frameCountWithinBounds(-1)) + assertTrue(frameCountWithinBounds(2)) + // The longest animation in this repository, and the bound itself + assertTrue(frameCountWithinBounds(1041)) + assertTrue(frameCountWithinBounds(10_000)) + assertFalse(frameCountWithinBounds(10_001)) + } + + @Test + fun testAnimationsThatRebuildNothingAreWithinBounds() { + // What a real animation looks like: each frame continues the one before it, so nothing is rebuilt + assertTrue(rebuiltFramesWithinBounds(IntArray(5000) { it - 1 })) + assertTrue(rebuiltFramesWithinBounds(intArrayOf(-1, -1, -1))) + } + + @Test + fun testShortRebuiltChainsAreWithinBounds() { + // A GIF disposing to what came before it: frame 2 continues frame 0, rebuilding two frames + assertTrue(rebuiltFramesWithinBounds(intArrayOf(-1, 0, 0, 2, 2, 4))) + } + + @Test + fun testLongRebuiltChainsAreRejected() { + // Alternating disposal makes every other frame rebuild the chain before it, which Skia recurses through: + // 8000 frames of that overflows the native stack and kills the app + val alternating = IntArray(8000) { if (it % 2 == 0) it - 2 else it - 1 } + assertFalse(rebuiltFramesWithinBounds(alternating)) + // The bound is on what a rebuild costs, not on how long the animation is + assertTrue(rebuiltFramesWithinBounds(IntArray(8000) { it - 1 })) + } + + @Test + fun testRebuiltChainBoundIsExact() { + fun chainOf(length: Int) = IntArray(length + 2) { if (it == length + 1) it - 2 else it - 1 } + assertTrue(rebuiltFramesWithinBounds(chainOf(64))) + assertFalse(rebuiltFramesWithinBounds(chainOf(65))) + } + + @Test + fun testFramesContinuingSomethingImpossibleStartTheirOwnChain() { + // A file is not trusted to say a frame continues itself, a later frame, or one that is not there + assertTrue(rebuiltFramesWithinBounds(IntArray(5000) { it })) + assertTrue(rebuiltFramesWithinBounds(IntArray(5000) { it + 1 })) + assertTrue(rebuiltFramesWithinBounds(IntArray(5000) { 9999 })) + } + + @Test + fun testAFrameCheaperThanItsDelayWaitsAsItAlwaysDid() { + assertEquals(70, frameWait(70, 0)) + assertEquals(70, frameWait(70, 2)) + assertEquals(70, frameWait(70, 70)) + } + + @Test + fun testAFrameDearerThanItsDelayIsWaitedOut() { + assertEquals(85, frameWait(20, 85)) + assertEquals(500, frameWait(20, 500)) + assertEquals(1000, frameWait(20, 1000)) + } + + @Test + fun testAStallIsNotWaitedOut() { + // Wall time counts a machine that suspended mid-decode, which the frame never spent + assertEquals(1000, frameWait(20, 30_000)) + assertEquals(1000, frameWait(20, 8L * 60 * 60 * 1000)) + assertEquals(5000, frameWait(5000, 30_000)) + } + + @Test + fun testTwoExpensiveFramesInARowStopTheAnimation() { + var debt = slowFrameDebt(0, tooSlow = true) + assertTrue(debt < MAX_SLOW_FRAME_DEBT) + debt = slowFrameDebt(debt, tooSlow = true) + assertTrue(debt >= MAX_SLOW_FRAME_DEBT) + } + + @Test + fun testAFrameThatOnlyOverranIsPaidOff() { + // One expensive frame among cheap ones is a busy machine, not an expensive animation + var debt = slowFrameDebt(0, tooSlow = true) + repeat(4) { debt = slowFrameDebt(debt, tooSlow = false) } + assertEquals(0, debt) + } + + @Test + fun testAlternatingExpensiveFramesStillStopTheAnimation() { + // Frames that alternate are never expensive twice in a row, which is what a count that resets would miss + var debt = 0 + var frames = 0 + while (debt < MAX_SLOW_FRAME_DEBT && frames < 100) { + debt = slowFrameDebt(debt, tooSlow = frames % 2 == 0) + frames++ + } + assertEquals(5, frames) + } + + @Test + fun testCheapFramesEarnNoCreditAgainstLaterExpensiveOnes() { + var debt = 0 + repeat(1000) { debt = slowFrameDebt(debt, tooSlow = false) } + assertEquals(0, debt) + debt = slowFrameDebt(debt, tooSlow = true) + debt = slowFrameDebt(debt, tooSlow = true) + assertTrue(debt >= MAX_SLOW_FRAME_DEBT) + } + + @Test + fun testFrameDurationSubstitutesTheDefaultForFramesInAHurry() { + // Skia reports a GIF delay in milliseconds, so "no delay" and "one centisecond" arrive as 0 and 10 + assertEquals(100, frameDuration(0)) + assertEquals(100, frameDuration(10)) + // Not expected from Skia, but read from the file + assertEquals(100, frameDuration(-1)) + } + + @Test + fun testFrameDurationKeepsAuthoredDelays() { + assertEquals(70, frameDuration(70)) + assertEquals(600, frameDuration(600)) + assertEquals(Int.MAX_VALUE.toLong(), frameDuration(Int.MAX_VALUE)) + } + + @Test + fun testFrameDurationRaisesDelaysBelowTheFloor() { + assertEquals(20, frameDuration(11)) + assertEquals(20, frameDuration(19)) + assertEquals(20, frameDuration(20)) + assertEquals(21, frameDuration(21)) + } + + private fun bytes(vararg values: Int): ByteArray = values.map { it.toByte() }.toByteArray() +} diff --git a/apps/multiplatform/external/nanohttpd/build.gradle.kts b/apps/multiplatform/external/nanohttpd/build.gradle.kts index fb24922208..7841d8f803 100644 --- a/apps/multiplatform/external/nanohttpd/build.gradle.kts +++ b/apps/multiplatform/external/nanohttpd/build.gradle.kts @@ -26,16 +26,25 @@ java { targetCompatibility = jvmVersion } -// Without this the jar records the build machine's timestamps, file order and file modes, -// which makes the desktop packages unreproducible -tasks.jar { - // Checked here and not during configuration, so that Android builds, which don't use nanohttpd, - // work without the submodule +val upstreamSources = sourceSets.main.get().java.matching { include("org/nanohttpd/**") } + +// compileJava and jar silently succeed without the sources, so the check needs its own task. +// It cannot run during configuration, Android builds must work without the submodule. +val checkUpstreamSources by tasks.registering { doFirst { - if (!upstream.file("core/src/main/java").asFile.isDirectory) { + if (upstreamSources.isEmpty) { throw GradleException("nanohttpd sources are missing, run: git submodule update --init --recursive") } } +} + +tasks.compileJava { + dependsOn(checkUpstreamSources) +} + +// Without this the jar records the build machine's timestamps, file order and file modes, +// which makes the desktop packages unreproducible +tasks.jar { isPreserveFileTimestamps = false isReproducibleFileOrder = true filePermissions { unix("644") } diff --git a/apps/multiplatform/gradle.properties b/apps/multiplatform/gradle.properties index a904d2859b..b3a8407839 100644 --- a/apps/multiplatform/gradle.properties +++ b/apps/multiplatform/gradle.properties @@ -24,11 +24,11 @@ android.nonTransitiveRClass=true kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.jvm.target=11 -android.version_name=7.1-beta.1 -android.version_code=374 +android.version_name=7.1-beta.2 +android.version_code=377 -desktop.version_name=7.1-beta.1 -desktop.version_code=158 +desktop.version_name=7.1-beta.2 +desktop.version_code=160 kotlin.version=2.1.20 gradle.plugin.version=8.7.0 diff --git a/apps/multiplatform/product/gaps.md b/apps/multiplatform/product/gaps.md index 25535d8003..aae24bdca8 100644 --- a/apps/multiplatform/product/gaps.md +++ b/apps/multiplatform/product/gaps.md @@ -222,9 +222,10 @@ Desktop users cannot send voice messages. The record button either does nothing Several other Desktop features are also marked with `LALAL` placeholders: - **QR Code Scanner** (`QRCodeScanner.desktop.kt:12`) -- scanning QR codes is not implemented on Desktop -- **Animated Drawables** (`Utils.desktop.kt:179`) -- animated image support (e.g., GIF in-line rendering) is not implemented -- **Animated Chat Images** (`CIImageView.desktop.kt:19`) -- animated image rendering in chat items -- **isImage detection** (`Images.desktop.kt:168`) -- image type detection (implemented but marked as incomplete) +- **Animated Drawables** (`Utils.desktop.kt:236`) -- `getDrawableFromUri` returns null, so `isAnimImage` falls back to the file extension +- **isImage detection** (`Images.desktop.kt:189`) -- image type detection (implemented but marked as incomplete) + +Desktop cannot decode WebP in chat: `decodeBoundedBufferedImage` (`Utils.desktop.kt:191`) reads through ImageIO, which has no WebP reader, so a received `.webp` renders only as the sender's preview and never opens full screen, and a picked one is skipped. Wallpapers and link previews decode WebP, as they read through Skia instead (`Images.desktop.kt:204`). Received GIFs do animate in chat items and full screen; the animated image decoder accepts WebP but is never reached for it. --- diff --git a/apps/multiplatform/product/views/chat.md b/apps/multiplatform/product/views/chat.md index 64abda7ee6..7862574f04 100644 --- a/apps/multiplatform/product/views/chat.md +++ b/apps/multiplatform/product/views/chat.md @@ -55,7 +55,7 @@ Each type has a dedicated composable in `views/chat/item/`: | Type | Composable | Description | |---|---|---| | Text | `FramedItemView` | Rendered with markdown (bold, italic, code, links, `@mentions`) via `CIMarkdownText` | -| Image | `CIImageView` | Thumbnail with tap-to-fullscreen via `ImageFullScreenView` | +| Image | `CIImageView` | Thumbnail with tap-to-fullscreen via `ImageFullScreenView`; animated GIFs play inline and full screen | | Video | `CIVideoView` | Video thumbnail with play button; inline playback via `VideoPlayerHolder` | | Voice | `CIVoiceView` | Waveform visualization with playback controls and duration | | File | `CIFileView` | File icon, name, size; download/open actions with progress indicator | diff --git a/apps/multiplatform/spec/client/chat-view.md b/apps/multiplatform/spec/client/chat-view.md index 728ace4936..a6691c2878 100644 --- a/apps/multiplatform/spec/client/chat-view.md +++ b/apps/multiplatform/spec/client/chat-view.md @@ -202,6 +202,18 @@ Long-press or right-click opens a dropdown menu with context-sensitive actions ( | `InvalidJSON` | -- | `CIInvalidJSONView` | `CIInvalidJSONView.kt` | | `CIMemberCreatedContact` | -- | `CIMemberCreatedContactView` | `CIMemberCreatedContactView.kt` | +### Animated Images + +`SimpleAndAnimatedImageView` is `expect`/`actual`. Android delegates to coil, which drives the animation +itself. Desktop decodes frames with Skia's `Codec` in `platform/AnimatedImage.desktop.kt`, where +`rememberAnimatedImage(data, still, hidden)` returns the frame to draw and falls back to the still image when +the data is not an animation, exceeds the decode bounds, or fails before showing a frame. Decoding runs off the UI thread +on two threads of the shared pool, and pauses while the window is minimized or hidden, while the image is behind the +privacy blur, and while a full screen modal covers the chat. An animation whose frames cost too much to +decode stops on the frame it reached rather than falling back to the still. The chat list preview (`smallView`) stays a +still image. Only GIF reaches this path: desktop decodes stills with ImageIO, which has no WebP reader, so a +received `.webp` renders only as the sender's preview and never opens full screen. + --- ## 6. Context Menu Actions diff --git a/apps/multiplatform/spec/impact.md b/apps/multiplatform/spec/impact.md index f808cf31ba..3a96638310 100644 --- a/apps/multiplatform/spec/impact.md +++ b/apps/multiplatform/spec/impact.md @@ -424,6 +424,7 @@ Path prefix: `common/src/desktopMain/kotlin/chat/simplex/common/` | `platform/Videos.desktop.kt` | PC10 | Low | Desktop video utilities | | `platform/Notifications.desktop.kt` | PC18 | Low | Desktop notification setup | | `platform/Images.desktop.kt` | PC10 | Low | Desktop image processing | +| `platform/AnimatedImage.desktop.kt` | PC10 | Low | Desktop animated image frame decoding (bounded) | | `platform/PlatformTextField.desktop.kt` | PC4 | Low | Desktop text field actual implementation | | `platform/Share.desktop.kt` | PC10 | Low | Desktop clipboard/share | | `platform/Back.desktop.kt` | PC1 | Low | Desktop back navigation | diff --git a/bots/api/TYPES.md b/bots/api/TYPES.md index 6064d79e5b..1ba260b3d3 100644 --- a/bots/api/TYPES.md +++ b/bots/api/TYPES.md @@ -400,7 +400,7 @@ BadSignature: **Record type**: - badgeType: [BadgeType](#badgetype) -- badgeExpiry: UTCTime? +- badgeExpiry: UTCTime - badgeExtra: string @@ -748,6 +748,7 @@ LocalRcv: - fileSource: [CryptoFile](#cryptofile)? - fileStatus: [CIFileStatus](#cifilestatus) - fileProtocol: [FileProtocol](#fileprotocol) +- fileExpires: UTCTime? --- @@ -833,6 +834,19 @@ Group: - msgDir: [MsgDirection](#msgdirection) - groupId: int64? - chatItemId: int64? +- memberId: string? +- sharedMsgId_: string? +- groupType: [GroupType](#grouptype)? + +GroupLink: +- type: "groupLink" +- chatName: string +- msgDir: [MsgDirection](#msgdirection) +- groupLink: string +- publicGroupId: string +- memberId: string? +- sharedMsgId: string +- groupType: [GroupType](#grouptype)? --- diff --git a/cabal.project b/cabal.project index fa144d6780..9c55ad7677 100644 --- a/cabal.project +++ b/cabal.project @@ -21,7 +21,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: 0d3cf39c27aec1c51c88d7bf3d6762bc22278967 + tag: 2d4b40e10475fd2d09c76c590df89f384ac45c85 source-repository-package type: git diff --git a/docs/CHAT-RELAY.md b/docs/CHAT-RELAY.md index a06c06026f..38c88d560e 100644 --- a/docs/CHAT-RELAY.md +++ b/docs/CHAT-RELAY.md @@ -1,6 +1,7 @@ --- title: Hosting your own Chat Relay -revision: 16.07.2026 +revision: 28.07.2026 +templateEngineOverride: md --- # Hosting your own Chat Relay @@ -20,6 +21,7 @@ This guide explains how to set up a chat relay on a Linux server, how to run it, - [Relay options](#relay-options) - [Get the relay address](#get-the-relay-address) - [Run relay commands](#run-relay-commands) +- [Run with Docker](#run-with-docker) - [Channel web previews](#channel-web-previews) - [Relay web options](#relay-web-options) - [Serve the previews with Caddy](#serve-the-previews-with-caddy) @@ -126,6 +128,73 @@ simplex-chat-relay -d /home/relay/relay -e "/set profile image file /home/relay/ systemctl start simplex-relay ``` +## Run with Docker + +The relay can also be built and run with Docker Compose, using PostgreSQL for storage. The files are in [`scripts/relay`](https://github.com/simplex-chat/simplex-chat/tree/master/scripts/relay). + +1. Clone the repository and switch to the relay directory: + + ```sh + git clone https://github.com/simplex-chat/simplex-chat + cd simplex-chat/scripts/relay + ``` + +2. Copy the example environment file, then set `RELAY_NAME`, `RELAY_WEB_DOMAIN` and `POSTGRES_PASSWORD` in it: + + ```sh + cp .env.example .env + ``` + +3. Create the directory for the previews and the CORS file, owned by the container's user (UID `1000`): + + ```sh + mkdir -p /var/www/relay-web-channels/channel + chown -R 1000:1000 /var/www/relay-web-channels + chmod 0755 /var/www/relay-web-channels + ``` + +4. Create the output directory for the relay address, then build and start: + + ```sh + mkdir -p out && chown 1000:1000 out + docker compose build + docker compose up -d + ``` + + The first build compiles from source and takes a while. + +5. Read the relay address, written on the first start: + + ```sh + cat out/relay-address.txt + ``` + +To give the relay a picture, put a small `.png`/`.jpg`/`.jpeg` file (large images are rejected) next to the compose file and add a `docker-compose.override.yml`: + +```yaml +services: + relay: + environment: + RELAY_IMAGE_FILE: /avatar.png + volumes: + - ./avatar.png:/avatar.png:ro +``` + +To run a one-off command against the relay's database, override the entrypoint: + +```sh +docker compose run --rm --entrypoint sh relay -c \ + 'simplex-chat-relay -d "$DB_CONN" -e "/set profile image file /avatar.png"' +``` + +Relay metrics from the database are published by [sql_exporter](https://github.com/burningalchemist/sql_exporter) on `127.0.0.1:9399/metrics`, with the queries in `sql_exporter.yml`. + +Relay database live in PostgreSQL docker volume. To print the full path to PostgreSQL database, execute in the host: + +```sh +docker volume inspect simplex-chat-relay_pgdata --format '{{.Mountpoint}}' +``` + ## Channel web previews Chat relays can render recent messages of its public channels as JSON files, which can be served over HTTPS using a web server to create channel web previews. This is optional. @@ -219,11 +288,9 @@ Create `/etc/systemd/system/simplex-cors-sync.service`: ```ini [Unit] Description=Sync SimpleX relay CORS config to Caddy -StartLimitIntervalSec=30 -StartLimitBurst=10 +StartLimitIntervalSec=0 [Service] Type=oneshot -ExecStartPre=/bin/sleep 2 ExecStart=/usr/local/bin/simplex-cors-sync.sh ``` @@ -236,6 +303,7 @@ After=caddy.service [Path] PathChanged=/var/www/relay-web-channels/cors.conf Unit=simplex-cors-sync.service +TriggerLimitIntervalSec=0 [Install] WantedBy=multi-user.target ``` diff --git a/packages/simplex-chat-client/types/typescript/package.json b/packages/simplex-chat-client/types/typescript/package.json index 4217b0e8fa..b0830995dd 100644 --- a/packages/simplex-chat-client/types/typescript/package.json +++ b/packages/simplex-chat-client/types/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@simplex-chat/types", - "version": "0.11.1", + "version": "0.11.2", "description": "TypeScript types for SimpleX Chat bot libraries", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/simplex-chat-client/types/typescript/src/types.ts b/packages/simplex-chat-client/types/typescript/src/types.ts index 1a84b42e08..eadfda7ba9 100644 --- a/packages/simplex-chat-client/types/typescript/src/types.ts +++ b/packages/simplex-chat-client/types/typescript/src/types.ts @@ -230,7 +230,7 @@ export interface AutoAccept { export interface BadgeInfo { badgeType: BadgeType - badgeExpiry?: string // ISO-8601 timestamp + badgeExpiry: string // ISO-8601 timestamp badgeExtra: string } @@ -692,6 +692,7 @@ export interface CIFile { fileSource?: CryptoFile fileStatus: CIFileStatus fileProtocol: FileProtocol + fileExpires?: string // ISO-8601 timestamp } export type CIFileStatus = @@ -803,10 +804,14 @@ export namespace CIFileStatus { } } -export type CIForwardedFrom = CIForwardedFrom.Unknown | CIForwardedFrom.Contact | CIForwardedFrom.Group +export type CIForwardedFrom = + | CIForwardedFrom.Unknown + | CIForwardedFrom.Contact + | CIForwardedFrom.Group + | CIForwardedFrom.GroupLink export namespace CIForwardedFrom { - export type Tag = "unknown" | "contact" | "group" + export type Tag = "unknown" | "contact" | "group" | "groupLink" interface Interface { type: Tag @@ -830,6 +835,20 @@ export namespace CIForwardedFrom { msgDir: MsgDirection groupId?: number // int64 chatItemId?: number // int64 + memberId?: string + sharedMsgId_?: string + groupType?: GroupType + } + + export interface GroupLink extends Interface { + type: "groupLink" + chatName: string + msgDir: MsgDirection + groupLink: string + publicGroupId: string + memberId?: string + sharedMsgId: string + groupType?: GroupType } } diff --git a/packages/simplex-chat-nodejs/package.json b/packages/simplex-chat-nodejs/package.json index 51311cfb5e..b578194679 100644 --- a/packages/simplex-chat-nodejs/package.json +++ b/packages/simplex-chat-nodejs/package.json @@ -1,6 +1,6 @@ { "name": "simplex-chat", - "version": "7.1.0-beta.1", + "version": "7.1.0-beta.2", "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ @@ -24,7 +24,7 @@ "docs": "typedoc" }, "dependencies": { - "@simplex-chat/types": "^0.11.1", + "@simplex-chat/types": "^0.11.2", "extract-zip": "^2.0.1", "fast-deep-equal": "^3.1.3", "node-addon-api": "^8.5.0" diff --git a/packages/simplex-chat-nodejs/src/download-libs.js b/packages/simplex-chat-nodejs/src/download-libs.js index 727e5164d5..3f10023f88 100644 --- a/packages/simplex-chat-nodejs/src/download-libs.js +++ b/packages/simplex-chat-nodejs/src/download-libs.js @@ -4,7 +4,7 @@ const path = require('path'); const extract = require('extract-zip'); const GITHUB_REPO = 'simplex-chat/simplex-chat-libs'; -const RELEASE_TAG = 'v7.1.0-beta.1'; +const RELEASE_TAG = 'v7.1.0-beta.2'; const BACKEND = (process.env.SIMPLEX_BACKEND || process.env.npm_config_simplex_backend || 'sqlite').toLowerCase(); if (BACKEND !== 'sqlite' && BACKEND !== 'postgres') { diff --git a/packages/simplex-chat-python/src/simplex_chat/_version.py b/packages/simplex-chat-python/src/simplex_chat/_version.py index 091488e2af..a335c71d03 100644 --- a/packages/simplex-chat-python/src/simplex_chat/_version.py +++ b/packages/simplex-chat-python/src/simplex_chat/_version.py @@ -5,5 +5,5 @@ Bump both together for normal releases. For wrapper-only fixes use a PEP 440 post-release: __version__ = "6.5.2.post1", LIBS_VERSION unchanged. """ -__version__ = "7.1.0b1" # PEP 440 — read by hatchling for wheel metadata -LIBS_VERSION = "7.1.0-beta.1" # simplex-chat-libs release tag (no 'v' prefix) +__version__ = "7.1.0b2" # PEP 440 — read by hatchling for wheel metadata +LIBS_VERSION = "7.1.0-beta.2" # simplex-chat-libs release tag (no 'v' prefix) diff --git a/packages/simplex-chat-python/src/simplex_chat/types/_types.py b/packages/simplex-chat-python/src/simplex_chat/types/_types.py index acf69deb14..74ffd4536b 100644 --- a/packages/simplex-chat-python/src/simplex_chat/types/_types.py +++ b/packages/simplex-chat-python/src/simplex_chat/types/_types.py @@ -170,7 +170,7 @@ class AutoAccept(TypedDict): class BadgeInfo(TypedDict): badgeType: "BadgeType" - badgeExpiry: NotRequired[str] # ISO-8601 timestamp + badgeExpiry: str # ISO-8601 timestamp badgeExtra: str class BadgeProof(TypedDict): @@ -481,6 +481,7 @@ class CIFile(TypedDict): fileSource: NotRequired["CryptoFile"] fileStatus: "CIFileStatus" fileProtocol: "FileProtocol" + fileExpires: NotRequired[str] # ISO-8601 timestamp class CIFileStatus_sndStored(TypedDict): type: Literal["sndStored"] @@ -572,10 +573,28 @@ class CIForwardedFrom_group(TypedDict): msgDir: "MsgDirection" groupId: NotRequired[int] # int64 chatItemId: NotRequired[int] # int64 + memberId: NotRequired[str] + sharedMsgId_: NotRequired[str] + groupType: NotRequired["GroupType"] -CIForwardedFrom = CIForwardedFrom_unknown | CIForwardedFrom_contact | CIForwardedFrom_group +class CIForwardedFrom_groupLink(TypedDict): + type: Literal["groupLink"] + chatName: str + msgDir: "MsgDirection" + groupLink: str + publicGroupId: str + memberId: NotRequired[str] + sharedMsgId: str + groupType: NotRequired["GroupType"] -CIForwardedFrom_Tag = Literal["unknown", "contact", "group"] +CIForwardedFrom = ( + CIForwardedFrom_unknown + | CIForwardedFrom_contact + | CIForwardedFrom_group + | CIForwardedFrom_groupLink +) + +CIForwardedFrom_Tag = Literal["unknown", "contact", "group", "groupLink"] class CIGroupInvitation(TypedDict): groupId: int # int64 diff --git a/plans/2026-08-11-desktop-animated-images.md b/plans/2026-08-11-desktop-animated-images.md new file mode 100644 index 0000000000..82a0257b28 --- /dev/null +++ b/plans/2026-08-11-desktop-animated-images.md @@ -0,0 +1,113 @@ +# Animated images on desktop + +## The problem + +`SimpleAndAnimatedImageView` on desktop drew a single `BitmapPainter` and carried the marker +`// LALAL make it animated too`. Android decodes animations with coil, iOS with SwiftyGif, and desktop showed +the first frame and stopped. `ImageFullScreenView` carried a matching marker over the image branch. + +## Why this shape + +**Skia's `Codec`, which skiko already puts on the desktop classpath.** No new dependency. It decodes both GIF +and animated WebP, reports per-frame durations and repeat counts, and supports random access into frames. + +**Not `components-animatedimage`** (declared and unused until this change removed it). Its `animate()` +ignores the result of `allocPixels` and decodes inside composition. A 35-byte GIF declaring 65535x65535 asks +for a 17GB raster; `allocPixels` returns false, and the following `readPixels` throws +`IllegalArgumentException` from inside the composition — a remote crash from anyone who can send a file. It +also decodes on the UI thread, measured at ~11ms per frame for a 1244x554 animation. + +## Bounds + +Everything below is decoded from bytes somebody else composed, so each bound answers a specific crafted +input, and anything outside them keeps showing the still image the chat already renders. Animation degrades +to a picture, never to an error, and failures are never alerted — an alert per malformed file would itself +let a sender disrupt the app. + +| Bound | What it answers | +| --- | --- | +| raster measured in bytes, sides multiplied as `Long` | `65535 * 65535` overflows `Int` to a negative number and would pass a naive budget check | +| per-side cap, independent of the raster bound | 65535x32 is only 2.1MP and would otherwise animate with a 65535-pixel scanline | +| bytes per pixel read from the codec | the file chooses its color type; the budget must not assume four bytes | +| file size checked before the bytes are copied natively | Skia copies the encoded bytes and scans them to count frames | +| magic-byte prefilter (`GIF8`, `RIFF....WEBP`) | photos are most of what a chat holds and none are animations; they never reach a second decoder | +| `allocPixels` result honoured | it reports failure by returning false, and reading into an unallocated bitmap throws | +| frame count bound | counting the frames also builds a table of them, which a file of minimal frames makes several times its own size, and the codec holds it for as long as the animation plays | +| rebuilt frame chain bound | a frame the codec is given no prior frame for is rebuilt from its whole chain, and Skia recurses to do it: frames alternating their disposal make that chain as long as the file likes, and 8000 frames of it overflows the native stack and kills the app, which no catch can prevent. Real animations rebuild nothing at all | +| destination allocated with a premultiplied alpha type | the codec reports the alpha type of the first frame, and a frame that has alpha cannot be read into an opaque bitmap | +| frame duration floor, and 100ms substituted for delays of 10ms and less | the frames a file is allowed can all declare no delay at all, and Skia reports the usual "as fast as possible" delay of one centisecond as 10ms | +| a frame is waited out for what it cost as well as what it asks for | one very expensive frame among cheap ones owes nothing once the cheap ones have paid the debt off, and held 96.7% of a decoder thread indefinitely; waiting out the cost leaves any animation about half of one | +| an animation that owes too much for its frames stops on the one it reached | frames that alternate expensive with cheap are never slow twice in a row, so a count that resets never stops them | +| every native call that reads the file is inside an exception boundary | the frame count, the frame table and the repeat count are read from it too | + +Long frame delays are honoured rather than clamped - they are the author's, and they cost only the codec, the +raster and the frame table staying alive while nothing decodes. + +## Cost, and the optimisations that were rejected + +A frame continues the one before it, and the codec has to be told that the bitmap already holds it. Without +that it decodes the whole chain back to the last independent frame, so a frame costs as much as its index and +a loop costs the square of the frame count. Measured over one loop of the GIFs in `images/`, decode only: + +| | frames | chain re-decoded | prior frame reused | +| --- | --- | --- | --- | +| files.gif | 196 | 5.93 ms/frame | 0.06 ms | +| connection.gif | 240 | 9.22 ms/frame | 0.09 ms | +| groups.gif | 309 | 9.10 ms/frame | 0.05 ms | +| user-addresses.gif | 1041 | 25.92 ms/frame, worst 77 ms | 0.04 ms | + +Pixels are identical either way. The cost of a frame is then its own, and an animation stops on the frame it +reached once it owes too much: a frame over 100ms counts double what a frame under it forgives. This is wall +time, so a single frame can overrun by being descheduled, and a busy machine should not turn a cheap +animation into a still - but a file whose frames alternate expensive and cheap is never slow twice in a row, +and a run of them is what a count that resets would miss. Measured on a 1920x1920 GIF of 400 such frames, which holds +67% of a core indefinitely against a count that resets. Frames tuned to stay just under the threshold owe +nothing at all, and one expensive frame among cheap enough ones owes nothing for long, which is why a frame +is also waited out for what it cost: a frame of 3s among four cheap ones drops from 96.7% of a decoder thread +to 49.3%, every frame at 99ms from 83.0% to 49.9%, and the GIFs in `images/` stay exactly where they were - +none of their frames decodes in as long as it asks to be shown, by three orders of magnitude. + +Two optimisations were measured and **rejected**. Both were measured before the prior frame was reused, so +their per-frame figures are against a decode that was two orders of magnitude more expensive; the conclusions +are kept because they are about ratios, but the numbers are worth taking again: + +- **Decoding at display size.** Scaled decode is supported at arbitrary sizes, but it costs CPU rather than + saving it: 2000x891 goes from 177.8ms to 300.3ms per frame (+68%) to save 59% of the raster — and it only + engages on the files that are already the most expensive. +- **Half-depth pixels.** Skia refuses `RGB_565` and `ARGB_4444` for GIF outright. It works only for opaque + WebP, at +11% decode for -50% raster, which does not justify a format-specific path. + +What was kept: decoding is confined to two threads of the shared pool, so untrusted decode work cannot starve +the long running calls that share it; and frames are only decoded while they can be seen — not while the app +is minimized or sits in the tray, not while the image is behind the privacy blur, where each frame would otherwise be +decoded, uploaded and then blurred away again for nobody, and not while a full screen modal covers the +chat, which is shown beside it rather than in place of it: the viewer would otherwise leave the same +animation decoding twice, and the rest of the chat decoding where nobody can see it. The chat list preview stays a still image for +the same reason: it is a 36sp box that the desktop layout keeps on screen the whole time, so animating it +would hold a raster and spend a frame of work per listed chat, without pause. + +## Verification + +- 20 000 fuzzed mutations (bit flips, truncations, header corruption) over a real corpus plus crafted hostile + files: no exception escapes the structure, no hangs. +- Frames advance, per-frame delays are read correctly, and the loop wraps back to frame 0 after a full cycle + with byte-identical pixels. +- An oversized animation is refused by the bounds and still renders through the existing still-image path. +- A GIF of 8000 frames alternating their disposal, which passes every other bound at an 8x8 raster, crashed + the process with SIGSEGV before the chain bound and is refused by it now, while the GIFs in `images/`, a + 1920x1920 animation and a GIF disposing to what came before it all still play. +- Every frame of the GIFs in `images/` decodes with the prior frame reused, with pixels identical to decoding + the chain, and a GIF whose first frame is opaque and disposed to the background decodes past its first frame + only into a premultiplied destination. +- Unit tests cover every bound as arithmetic - the raster, the frame count, the rebuilt chains, the frame + durations and the debt an expensive frame owes; skiko's native library is not on the test + runtime classpath, so decoding is measured with the library added to a standalone classpath. + +## Deliberately not in this change + +- **WebP still images do not decode on desktop at all.** Desktop decodes images with ImageIO, which has no + WebP reader, so a received `.webp` never loads and picking one to send is dropped. Both the chat item and + the full screen viewer reach this code only after that decode has succeeded, so until that separate fix + lands it is GIFs that animate in the app, and the WebP path here is exercised by measurement only. +- **The decode raster is left to the collector.** Releasing it explicitly needs to know which thread Compose + Desktop draws on, and skiko uses a different redrawer per platform; guessing risks a use-after-free. diff --git a/plans/2026-08-22-forward-link.md b/plans/2026-08-22-forward-link.md new file mode 100644 index 0000000000..091bfc60dd --- /dev/null +++ b/plans/2026-08-22-forward-link.md @@ -0,0 +1,185 @@ +# Forward attribution: `forwardLink` in MsgContainer + +When a message is forwarded from a channel (public group), the sending client +attaches the source channel's name, join link, identity and message id; +recipients see "forwarded from \" and can open or join the channel. + +- The link is attached whenever the source is a public group; for other sources + only `forward: true` is sent. +- `forward = Just True` is always set alongside `forwardLink`, so old clients + show plain "forwarded". +- The simplex name is not included: paired with a forwarder-chosen link it + would be an unverifiable claim. It can be added later as a verifiable claim. +- When a forwarded message is received in a group that prohibits SimpleX links + for the sender, the link is removed. + +## Protocol + +`Protocol.hs`. aeson ignores unknown fields and parses an absent field as +`Nothing`, so the addition is compatible in both directions. + +```haskell +data ForwardLink = ForwardLink + { displayName :: Text, + groupLink :: ShortLinkContact, + publicGroupId :: B64UrlByteString, -- the recipient looks up the local group by this id, then compares groupLink with the stored link + memberId :: Maybe MemberId, -- the author, only for items the author sent as themselves + msgId :: SharedMsgId -- the original item's SharedMsgId + } +``` + +`memberId` is absent for items sent as the channel: their authorship is the +channel's, and subscribers do not see the author's member id. The fill rule is +`chatItemMember` (Messages.hs:369): the member for received authored items, +the membership for own items sent as themselves, absent otherwise. + +- New field `forwardLink :: Maybe ForwardLink` in `MsgContainer` + (Protocol.hs:678) after `forward`; `mcSimple` (:695) sets + `forwardLink = Nothing`. +- `mcForward` (:716) takes `Maybe ForwardLink`: + `mcForward fl c = (mcSimple c) {forward = Just True, forwardLink = fl}`. +- JSON instances: `deriveJSON defaultJSON ''ForwardLink` before the + `''MsgContainer` splice (:899). + +## CIForwardedFrom + +`Messages.hs:1319`: + +```haskell + | CIFFGroup {chatName :: Text, msgDir :: MsgDirection, groupId :: Maybe GroupId, + chatItemId :: Maybe ChatItemId, memberId :: Maybe MemberId, + sharedMsgId_ :: Maybe SharedMsgId, groupType :: Maybe GroupType} + | CIFFGroupLink {chatName :: Text, msgDir :: MsgDirection, + groupLink :: ShortLinkContact, publicGroupId :: B64UrlByteString, + memberId :: Maybe MemberId, sharedMsgId :: SharedMsgId, + groupType :: Maybe GroupType} +``` + +Both variants retain the wire `memberId` and `sharedMsgId`, so a re-forward +re-serializes `ForwardLink` from the CIFF without item lookups. + +- `groupType` in `CIFFGroup` is present exactly when the sent message included + the link, so it doubles as that marker; the apps read it for the source type + icon without lookups. In `CIFFGroupLink` it mirrors the link's type so the + apps avoid inspecting the URI. +- `CIFFGroupLink` is the recipient's variant for an unknown channel; the user + opens it via the connection plan. +- New tag `CIFFGroupLink_` / `"groupLink"` in `CIForwardedFromTag` (:1325). + +## Sending + +`Commands.hs` `APIForwardChatItems`, `prepareForward` group branch (:1094-1110): + +- Local `ciff`: `CIFFGroup` with `memberId = memberId' <$> chatItemMember + gInfo ci`, the item's `itemSharedMsgId`, and `groupType = itemSharedMsgId *> + sourceGroupType gInfo` - `Just` the source profile's type under the same + condition in which `ciffForwardLink` later returns a link (the link value is + computed at the `mcForward` call site, after the `ciff` is built). +- The two `mcForward` call sites - `sendContactContentMessages.prepareMsgs` + (Commands.hs:4772) and `prepareGroupMsg` (Internal.hs:208-209), both matching + `(Nothing, Just _) -> pure (mcForward mc, Nothing)` on + `(quotedItemId, itemForwarded)` - compute the link from the + `CIForwardedFrom` in scope: `ciffForwardLink db ciff` returns the link for + `CIFFGroup` with `groupId` and `sharedMsgId` set, reading the group profile + (current name and link), for `CIFFGroupLink` from its stored fields, and + `Nothing` for other variants. Deriving from the stored `CIForwardedFrom` + attributes a re-forwarded message to the original source. +- `forwardCIFF` (:1130) already returns the original `CIForwardedFrom` when a + forwarded item is forwarded again, so a received `CIFFGroupLink` item is sent + onwards with the same link. + +## Receiving + +`Store/Messages.hs createNewRcvChatItem` (:563-572), inside the existing DB +transaction: + +```haskell +itemForwarded = case chatMsgEvent of + ACME _ (XMsgNew MsgContainer {forward, forwardLink}) | forward == Just True -> ... +``` + +1. `forwardLink = Nothing` -> `CIFFUnknown` (today's behavior). +2. Destination is a group where SimpleX links are prohibited for the sender -> + remove the link: store `CIFFGroup` with only the name and `msgDir = MDRcv` - + attribution text only. The check: the sender's role (the member's for + `CDGroupRcv`, `GROwner` for `CDChannelRcv` - a channel message is posted + with owner authority) against the group's SimplexLinks feature. Direct + chats: the link is kept. +3. Lookup by `publicGroupId`: `group_profiles.public_group_id` is a column + with an existing query that filters on it (Store/Groups.hs:2009-2015). New + query `getGroupViaPublicGroupId`; on a match, compare the received + `groupLink` with the stored one (`sameShortLinkContact`); when both match -> + `CIFFGroup` with `groupId`, the wire `memberId` and `msgId`, `groupType` + from the link's `ContactConnType` (equal to the stored link's type - + `sameShortLinkContact` compares it), and `chatItemId = ciId_` resolved by + the id query factored out of `getGroupChatItemBySharedMsgId` + (`getGroupChatItemBySharedMsgId_`). + The author scope: wire `memberId` absent -> `Nothing` (items sent as the + channel and own items are stored with `group_member_id` NULL); present -> + the member resolved by `member_id`, with the user's own membership mapped + to `Nothing`; an unknown member -> no item. +4. Lookup miss, or the link differs from the stored one -> `CIFFGroupLink` + with the wire fields. + +## DB + +`chat_items` persists `CIForwardedFrom` as columns (`fwd_from_tag, +fwd_from_chat_name, fwd_from_msg_dir, fwd_from_contact_id, fwd_from_group_id, +fwd_from_chat_item_id`, Store/Messages.hs:606). Migration (SQLite + Postgres, +same shape) adds: + +- `fwd_from_group_type TEXT` (`GroupType`'s `TextEncoding`) +- `fwd_from_group_link BLOB/BYTEA` (the `ToField (ConnShortLink c)` instance + stores `Binary . strEncode`, matching `short_link_contact`) +- `fwd_from_public_group_id BLOB/BYTEA` +- `fwd_from_member_id BLOB/BYTEA` +- `fwd_from_shared_msg_id BLOB/BYTEA` + +Code changes: the CIFF-to-row tuple (Store/Messages.hs:657-660), the +row-to-CIFF case (:2343-2344), the three SELECT lists (:2696, :3085, :3197), +and the INSERT statement in `createNewChatItem_`. Binary columns use `Binary` +on both backends. + +## View / UI + +- `View.hs:1010`: render the source name for `CIFFGroup` and `CIFFGroupLink`. +- `/item info` renders "forwarded from: #\" from `itemForwarded` + when the source item is not stored locally (`CIFFGroupLink` and link-removed + `CIFFGroup`). +- The `CIForwardedFrom` JSON reaches the apps in `CIMeta`: the iOS + (`ChatTypes.swift`) and Kotlin (`ChatModel.kt`) mirrors are extended with the + new field and variant. +- The sender and the recipient of a forwarded message see the same header; the + only difference between them is the goto arrow, shown where the original + item exists locally (`chatTypeApiIdMsgId`), in notes too. +- Two-row header at double the single-header height - row 1: forward icon + + "forwarded from" ("saved from" in notes); row 2: the name in the header text + style, starting under the forward icon. Rendered when the attribution is + part of the message - `CIFFGroupLink`, and `CIFFGroup` with `groupType` + present - and in notes whenever navigation is possible (a local target or a + link), items saved from contacts and p2p groups included. The whole header + opens the source: known - the chat, positioned at the original item when + `chatItemId` is present; unknown - `planAndConnect` with `groupLink`. +- All other forwards keep the single-line header: "forwarded" (p2p forwards + without attribution, the link-removed name-only `CIFFGroup`) or "saved" + (non-navigable notes items). The `forwarded_from_description` and + `saved_from_description` strings are removed; "forwarded from" and + "saved from" are added. +- The goto arrow beside the bubble applies only to locally resolved items + (`chatTypeApiIdMsgId`), never to joining. + +## Tests + +`ChatTests/Groups.hs`: +1. Forward from a channel to a direct chat: the recipient item includes + `CIFFGroupLink` with name/link/publicGroupId/msgId; the view shows + "forwarded from" with the name. +2. Forward to a group where the recipient is a member of the source channel: + the recipient stores `CIFFGroup` with the local groupId. +3. Destination group with SimpleX links prohibited: the link is removed; + attribution text only. +4. Forwarding a received forwarded item again sends the original channel's + link. +5. Old-client compatibility: a container with `forward: true` and no + `forwardLink` parses to `CIFFUnknown`. +6. Private (non-public) source group: the container includes no `forwardLink`. diff --git a/plans/2026-08-24-desktop-rotated-video-playback.md b/plans/2026-08-24-desktop-rotated-video-playback.md new file mode 100644 index 0000000000..0ef27efbaf --- /dev/null +++ b/plans/2026-08-24-desktop-rotated-video-playback.md @@ -0,0 +1,109 @@ +# Desktop: rotated videos squashed on playback, preview rotated twice, snapshot crash + +## Problem + +A video carrying rotation metadata - what a phone records in portrait - is squashed when it +plays in a chat item on desktop, while its preview looks correct. Re-sending such a video from +desktop produces a preview that is wrong for every recipient. Attaching one can take the app +down with a SIGSEGV inside skia. Separately, any video smaller than the width of the message +item plays at its own size in the middle of the item instead of filling it, though its preview +fills the width. + +## Cause + +Three defects, of different ages, on the path a frame takes from libvlc to the screen. + +**The buffer is sized from the wrong dimensions.** `SkiaBitmapVideoSurface` asks libvlc for a +buffer of `track.width() x track.height()`. The track carries the size before rotation, but vlc +applies the display matrix before the frame reaches the vmem callback, so the picture arriving +is transposed with respect to the buffer, and vlc stretches it to fill. Measured with a +1920x1080 HEVC file whose display matrix is -90: + +| source | value | +| -------------------------- | -------------------- | +| size libvlc offers | 1088x1920 (rotated) | +| `track.width()/height()` | 1920x1080 (coded) | +| buffer requested before fix | 1920x1080 | + +Asking for the track size was introduced to drop the decoder's padding (#7391); it is right for +an unrotated video and wrong for a rotated one, because it discards the orientation libvlc had +already applied. + +**The preview is oriented twice.** `previewAndDuration` takes a snapshot from the same surface +and then rotates it by hand. The snapshot arrives at 1080x1920 and already upright - dumping it +to a PNG confirms the content, not just the dimensions - and the manual rotation turns it back +to 1920x1080. Before this change the two errors cancelled: a wrongly shaped buffer plus a +manual rotation produced a preview that looked right, which is why the preview was correct while +playback was not. + +**The snapshot races the render callback.** The render callback installs pixels into the shared +bitmap on the event thread; the snapshot converted it on the preview thread. The format is +renegotiated several times per file, so a resize between `installPixels` and `readPixels` makes +skia read past the end of the buffer: + +``` +SIGSEGV ... C [libskiko-linux-x64.so+0x1e7807] sse2::load_8888(...) + at org.jetbrains.skia.Bitmap.readPixels + at chat.simplex.common.platform.VideoPlayer$Companion$getBitmapFromVideo$2$snap$1 +``` + +**Small videos do not fill the item.** The preview is drawn with `ContentScale.FillWidth` and +the playback surface with `ContentScale.Fit`. `Fit` never exceeds the height of the box, so a +320x240 video stays at its own size, centred, while its preview fills the width. This is only +visible for sources narrower than the item. + +## Fix + +Swap the requested width and height for the four transposed orientations, so the buffer matches +the picture vlc delivers, and keep the track size otherwise so the padding fix still holds. +Drop the manual orientation handling from the preview, since the frame is already upright. Read +the snapshot on the event thread, where the render callback writes it. Draw the inline playback +surface with `FillWidth`, as its preview is drawn. + +## Bounds + +The dimensions come from a received file, so they are attacker-chosen and are treated as such. + +- Both track sides are used or neither. One side from the track beside the other from libvlc's + padded size never described the same picture, and transposing such a pair compounds it. +- The requested area is capped, scaling down and keeping the aspect where both sides can shrink; + a side pinned at 1 takes the whole budget on the other side instead, since scaling cannot keep + the aspect of a 2000000000x1 declaration and hold the area at once. An unbounded request is an + out-of-memory from a message: 16000x16000 is 1 GB of RV32, requested from vlc and copied into + a java array of the same size. The cap also keeps `width * height * 4` inside an `Int`. +- Neither side can be zero, so a 1x4000 or 4000x1 file cannot produce an empty buffer. +- The sides are only swapped when the track's own sides are used. The size libvlc passes is + already rotated, so swapping that pair would recreate the squash for a file that declares a + rotation and a zero-sized track. +- A frame is dropped rather than displayed when it does not fill the bitmap skia is told to + read, when the format it was rendered with is not the one the bitmap was sized by, and before + any buffer has been allocated. The checks and the copy run inside the render callback, on + vlc's thread: the native buffer is only guaranteed to exist for the duration of the callback, + so code deferred to another thread would read through a pointer vlc may have freed on a format + change. Only the copied frame is handed to the event thread. +- The bitmap is published only when skia reports that it took the pixels, and a snapshot that + cannot be converted is logged and left empty rather than thrown into callers that have no + handler for it. + +## Testing + +Fifteen files covering 320x240 to 3840x2160, square, odd, and 1234x567 sizes, h264, vp9, av1 +and hevc, unrotated and 90/180/270, plus 1x4000, 4000x1 and 16000x16000. Checked that rotated +videos play upright and preview upright, that a re-sent video keeps its shape, that attaching +does not crash, that a 320x240 video fills the item, that the AV1 padding fix still holds, and +that the 16000x16000 file is scaled to the cap instead of allocating a gigabyte. + +## Android + +None of these reach android. The buffer format callback is desktop only - android renders +through exoplayer's `StyledPlayerView`, with no buffer for us to size - and its preview comes +from `MediaMetadataRetriever.getFrameAtTime`, which returns an oriented frame and is not +rotated again. The event thread race is skia and swing. Android already fills the item width +with `RESIZE_MODE_FIXED_WIDTH`, which is what the `FillWidth` change gives desktop. + +## Not addressed + +`CIVideoView` bounds the item's aspect ratio above at 2.33 but not below, so a 4000x1 video +still lays out with a height that rounds to zero. The snapshot's `invokeAndWait` is not +cancellable, so its 1.5s timeout cannot interrupt a wedged event thread. Both are outside the +functions this change touches. diff --git a/plans/2026-08-28-file-expiry-display.md b/plans/2026-08-28-file-expiry-display.md new file mode 100644 index 0000000000..3b6742c430 --- /dev/null +++ b/plans/2026-08-28-file-expiry-display.md @@ -0,0 +1,74 @@ +# File expiry display + +Show the sender and recipients when an XFTP file stops being downloadable. + +The value is the storage expiry the server grants. The agent already reports it in `SFDONE` as `Maybe GrantedStorageTime` (`GSTExpires { epochSeconds }`, absolute UTC). No simplexmq change. `Nothing` means unknown (a server or chunk below the storage-time version). + +## Protocol + +In `Simplex.Chat.Protocol`: + +- add optional `fileExpires :: Maybe UTCTime` to `XMsgFileDescr` +- encode with `"fileExpires" .=? fileExpires`, decode with `opt "fileExpires"` +- no chat version bump; an older app skips the field, an older sender omits it + +## Chat item file + +In `Simplex.Chat.Messages`: + +- add `fileExpires :: Maybe UTCTime` to `CIFile` +- add no `CIFileStatus`; the app derives the expired state from `fileExpires < now` + +## Store + +In the SQLite and PostgreSQL stores: + +- add a nullable `file_expires_at` column to `files`, typed as the other `files` timestamps; migration in both stores +- add `setFileExpires :: DB.Connection -> User -> FileTransferId -> UTCTime -> IO ()` +- read `file_expires_at` into `CIFile` in the file-row queries + +## Sender + +In `Simplex.Chat.Library.Subscriber`, `SFDONE` handler: + +- bind the granted time (currently dropped) +- convert `GSTExpires epochSeconds` to `UTCTime` and store it with `setFileExpires` +- thread the expiry through `sendFileDescriptions` into each `XMsgFileDescr` it builds + +## Recipient + +In `Simplex.Chat.Library.Subscriber`, `XMsgFileDescr` handling (direct and group): + +- take the received `fileExpires` and store it with `setFileExpires` + +## Apps + +Received files show the expiry; sent files are unchanged, they keep the checkmark. A tap still attempts the download: the receive actions, the download overlays, and the "Download file" menu item stay as they are. + +Model: + +- `CIFile` gets `fileExpires` — `Date?` in `SimpleXChat/ChatTypes.swift`, `Instant?` in `model/ChatModel.kt` +- `CIFile` gets `expired`, beside `loaded`: `fileExpires` is set and has passed + +Message information, in `ChatItemInfoView`, a row after "Disappears at": + +- "File can be received until