diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 2727fc4add..62ecc20447 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -9,6 +9,7 @@ on:
tags:
- "v*"
- "!*-fdroid"
+ - "!*-armv7a"
pull_request:
jobs:
diff --git a/README.md b/README.md
index 254a66c2bc..91b015f7f2 100644
--- a/README.md
+++ b/README.md
@@ -72,7 +72,7 @@ You must:
Messages not following these rules will be deleted, the right to send messages may be revoked, and the access to the new members to the group may be temporarily restricted, to prevent re-joining under a different name - our imperfect group moderation does not have a better solution at the moment.
-You can join an English-speaking users group if you want to ask any questions: [#SimpleX-Group-4](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2Fw2GlucRXtRVgYnbt_9ZP-kmt76DekxxS%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA0tJhTyMGUxznwmjb7aT24P1I1Wry_iURTuhOFlMb1Eo%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22WoPxjFqGEDlVazECOSi2dg%3D%3D%22%7D)
+You can join an English-speaking users group if you want to ask any questions: [#SimpleX users group](https://simplex.chat/contact#/?v=1-4&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2Fos8FftfoV8zjb2T89fUEjJtF7y64p5av%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAQqMgh0fw2lPhjn3PDIEfAKA_E0-gf8Hr8zzhYnDivRs%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22lBPiveK2mjfUH43SN77R0w%3D%3D%22%7D)
There is also a group [#simplex-devs](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2F6eHqy7uAbZPOcA6qBtrQgQquVlt4Ll91%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAqV_pg3FF00L98aCXp4D3bOs4Sxv_UmSd-gb0juVoQVs%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22XonlixcHBIb2ijCehbZoiw%3D%3D%22%7D) for developers who build on SimpleX platform:
@@ -127,6 +127,7 @@ Join our translators to help SimpleX grow!
|🇫🇮 fi|Suomi | |[](https://hosted.weblate.org/projects/simplex-chat/android/fi/) [](https://hosted.weblate.org/projects/simplex-chat/ios/fi/)|[](https://hosted.weblate.org/projects/simplex-chat/website/fi/)||
|🇫🇷 fr|Français |[ishi_sama](https://github.com/ishi-sama)|[](https://hosted.weblate.org/projects/simplex-chat/android/fr/) [](https://hosted.weblate.org/projects/simplex-chat/ios/fr/)|[](https://hosted.weblate.org/projects/simplex-chat/website/fr/)|[✓](https://github.com/simplex-chat/simplex-chat/tree/master/docs/lang/fr)|
|🇮🇱 he|עִברִית | |[](https://hosted.weblate.org/projects/simplex-chat/android/he/) -|||
+|🇭🇺 hu|Magyar | |[](https://hosted.weblate.org/projects/simplex-chat/android/hu/) -|||
|🇮🇹 it|Italiano |[unbranched](https://github.com/unbranched)|[](https://hosted.weblate.org/projects/simplex-chat/android/it/) [](https://hosted.weblate.org/projects/simplex-chat/ios/it/)|[](https://hosted.weblate.org/projects/simplex-chat/website/it/)||
|🇯🇵 ja|日本語 | |[](https://hosted.weblate.org/projects/simplex-chat/android/ja/) [](https://hosted.weblate.org/projects/simplex-chat/ios/ja/)|[](https://hosted.weblate.org/projects/simplex-chat/website/ja/)||
|🇳🇱 nl|Nederlands|[mika-nl](https://github.com/mika-nl)|[](https://hosted.weblate.org/projects/simplex-chat/android/nl/) [](https://hosted.weblate.org/projects/simplex-chat/ios/nl/)|[](https://hosted.weblate.org/projects/simplex-chat/website/nl/)||
@@ -134,6 +135,7 @@ Join our translators to help SimpleX grow!
|🇧🇷 pt-BR|Português||[](https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/) -|[](https://hosted.weblate.org/projects/simplex-chat/website/pt_BR/)||
|🇷🇺 ru|Русский ||[](https://hosted.weblate.org/projects/simplex-chat/android/ru/) [](https://hosted.weblate.org/projects/simplex-chat/ios/ru/)|||
|🇹🇭 th|ภาษาไทย |[titapa-punpun](https://github.com/titapa-punpun)|[](https://hosted.weblate.org/projects/simplex-chat/android/th/) [](https://hosted.weblate.org/projects/simplex-chat/ios/th/)|||
+|🇹🇷 tr|Türkçe | |[](https://hosted.weblate.org/projects/simplex-chat/android/tr/) [](https://hosted.weblate.org/projects/simplex-chat/ios/tr/)|||
|🇺🇦 uk|Українська| |[](https://hosted.weblate.org/projects/simplex-chat/android/uk/) [](https://hosted.weblate.org/projects/simplex-chat/ios/uk/)|[](https://hosted.weblate.org/projects/simplex-chat/website/uk/)||
|🇨🇳 zh-CHS|简体中文|[sith-on-mars](https://github.com/sith-on-mars)
[](https://hosted.weblate.org/projects/simplex-chat/website/zh_Hans/)||
diff --git a/apps/ios/Shared/ContentView.swift b/apps/ios/Shared/ContentView.swift
index c3a8ec2809..45e0332dab 100644
--- a/apps/ios/Shared/ContentView.swift
+++ b/apps/ios/Shared/ContentView.swift
@@ -186,7 +186,7 @@ struct ContentView: View {
.onAppear {
requestNtfAuthorization()
// Local Authentication notice is to be shown on next start after onboarding is complete
- if (!prefLANoticeShown && prefShowLANotice && !chatModel.chats.isEmpty) {
+ if (!prefLANoticeShown && prefShowLANotice && chatModel.chats.count > 2) {
prefLANoticeShown = true
alertManager.showAlert(laNoticeAlert())
} else if !chatModel.showCallView && CallController.shared.activeCallInvitation == nil {
diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift
index e5022751cd..c31ad579ab 100644
--- a/apps/ios/Shared/Model/ChatModel.swift
+++ b/apps/ios/Shared/Model/ChatModel.swift
@@ -60,6 +60,7 @@ final class ChatModel: ObservableObject {
@Published var laRequest: LocalAuthRequest?
// list of chat "previews"
@Published var chats: [Chat] = []
+ @Published var deletedChats: Set = []
// map of connections network statuses, key is agent connection id
@Published var networkStatuses: Dictionary = [:]
// current chat
@@ -138,7 +139,7 @@ final class ChatModel: ObservableObject {
}
func removeUser(_ user: User) {
- if let i = getUserIndex(user), users[i].user.userId != currentUser?.userId {
+ if let i = getUserIndex(user) {
users.remove(at: i)
}
}
@@ -755,6 +756,8 @@ final class Chat: ObservableObject, Identifiable {
case let .group(groupInfo):
let m = groupInfo.membership
return m.memberActive && m.memberRole >= .member
+ case .local:
+ return true
default: return false
}
}
diff --git a/apps/ios/Shared/Model/ImageUtils.swift b/apps/ios/Shared/Model/ImageUtils.swift
index 41d741e7e6..6437597b19 100644
--- a/apps/ios/Shared/Model/ImageUtils.swift
+++ b/apps/ios/Shared/Model/ImageUtils.swift
@@ -158,7 +158,8 @@ func imageHasAlpha(_ img: UIImage) -> Bool {
return false
}
-func saveFileFromURL(_ url: URL, encrypted: Bool) -> CryptoFile? {
+func saveFileFromURL(_ url: URL) -> CryptoFile? {
+ let encrypted = privacyEncryptLocalFilesGroupDefault.get()
let savedFile: CryptoFile?
if url.startAccessingSecurityScopedResource() {
do {
@@ -185,10 +186,19 @@ func saveFileFromURL(_ url: URL, encrypted: Bool) -> CryptoFile? {
func moveTempFileFromURL(_ url: URL) -> CryptoFile? {
do {
+ let encrypted = privacyEncryptLocalFilesGroupDefault.get()
let fileName = uniqueCombine(url.lastPathComponent)
- try FileManager.default.moveItem(at: url, to: getAppFilePath(fileName))
+ let savedFile: CryptoFile?
+ if encrypted {
+ let cfArgs = try encryptCryptoFile(fromPath: url.path, toPath: getAppFilePath(fileName).path)
+ try FileManager.default.removeItem(atPath: url.path)
+ savedFile = CryptoFile(filePath: fileName, cryptoArgs: cfArgs)
+ } else {
+ try FileManager.default.moveItem(at: url, to: getAppFilePath(fileName))
+ savedFile = CryptoFile.plain(fileName)
+ }
ChatModel.shared.filesToDelete.remove(url)
- return CryptoFile.plain(fileName)
+ return savedFile
} catch {
logger.error("ImageUtils.moveTempFileFromURL error: \(error.localizedDescription)")
return nil
diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift
index ee31dd65c1..24a77cb3d3 100644
--- a/apps/ios/Shared/Model/SimpleXAPI.swift
+++ b/apps/ios/Shared/Model/SimpleXAPI.swift
@@ -365,6 +365,13 @@ func apiSendMessage(type: ChatType, id: Int64, file: CryptoFile?, quotedItemId:
}
}
+func apiCreateChatItem(noteFolderId: Int64, file: CryptoFile?, msg: MsgContent) async -> ChatItem? {
+ let r = await chatSendCmd(.apiCreateChatItem(noteFolderId: noteFolderId, file: file, msg: msg))
+ if case let .newChatItem(_, aChatItem) = r { return aChatItem.chatItem }
+ createChatItemErrorAlert(r)
+ return nil
+}
+
private func sendMessageErrorAlert(_ r: ChatResponse) {
logger.error("apiSendMessage error: \(String(describing: r))")
AlertManager.shared.showAlertMsg(
@@ -373,6 +380,14 @@ private func sendMessageErrorAlert(_ r: ChatResponse) {
)
}
+private func createChatItemErrorAlert(_ r: ChatResponse) {
+ logger.error("apiCreateChatItem error: \(String(describing: r))")
+ AlertManager.shared.showAlertMsg(
+ title: "Error creating message",
+ message: "Error: \(String(describing: r))"
+ )
+}
+
func apiUpdateChatItem(type: ChatType, id: Int64, itemId: Int64, msg: MsgContent, live: Bool = false) async throws -> ChatItem {
let r = await chatSendCmd(.apiUpdateChatItem(type: type, id: id, itemId: itemId, msg: msg, live: live), bgDelay: msgDelay)
if case let .chatItemUpdated(_, aChatItem) = r { return aChatItem.chatItem }
@@ -691,6 +706,9 @@ func apiConnectContactViaAddress(incognito: Bool, contactId: Int64) async -> (Co
}
func apiDeleteChat(type: ChatType, id: Int64, notify: Bool? = nil) async throws {
+ let chatId = type.rawValue + id.description
+ DispatchQueue.main.async { ChatModel.shared.deletedChats.insert(chatId) }
+ defer { DispatchQueue.main.async { ChatModel.shared.deletedChats.remove(chatId) } }
let r = await chatSendCmd(.apiDeleteChat(type: type, id: id, notify: notify), bgTask: false)
if case .direct = type, case .contactDeleted = r { return }
if case .contactConnection = type, case .contactConnectionDeleted = r { return }
@@ -852,8 +870,8 @@ func apiChatUnread(type: ChatType, id: Int64, unreadChat: Bool) async throws {
try await sendCommandOkResp(.apiChatUnread(type: type, id: id, unreadChat: unreadChat))
}
-func receiveFile(user: any UserLike, fileId: Int64, encrypted: Bool, auto: Bool = false) async {
- if let chatItem = await apiReceiveFile(fileId: fileId, encrypted: encrypted, auto: auto) {
+func receiveFile(user: any UserLike, fileId: Int64, auto: Bool = false) async {
+ if let chatItem = await apiReceiveFile(fileId: fileId, encrypted: privacyEncryptLocalFilesGroupDefault.get(), auto: auto) {
await chatItemSimpleUpdate(user, chatItem)
}
}
@@ -1123,6 +1141,12 @@ func apiMemberRole(_ groupId: Int64, _ memberId: Int64, _ memberRole: GroupMembe
throw r
}
+func apiBlockMemberForAll(_ groupId: Int64, _ memberId: Int64, _ blocked: Bool) async throws -> GroupMember {
+ let r = await chatSendCmd(.apiBlockMemberForAll(groupId: groupId, memberId: memberId, blocked: blocked), bgTask: false)
+ if case let .memberBlockedForAllUser(_, _, member, _) = r { return member }
+ throw r
+}
+
func leaveGroup(_ groupId: Int64) async {
do {
let groupInfo = try await apiLeaveGroup(groupId)
@@ -1321,8 +1345,12 @@ private func changeActiveUser_(_ userId: Int64, viewPwd: String?) throws {
try getUserChatData()
}
-func changeActiveUserAsync_(_ userId: Int64, viewPwd: String?) async throws {
- let currentUser = try await apiSetActiveUserAsync(userId, viewPwd: viewPwd)
+func changeActiveUserAsync_(_ userId: Int64?, viewPwd: String?) async throws {
+ let currentUser = if let userId = userId {
+ try await apiSetActiveUserAsync(userId, viewPwd: viewPwd)
+ } else {
+ try apiGetActiveUser()
+ }
let users = try await listUsersAsync()
await MainActor.run {
let m = ChatModel.shared
@@ -1331,7 +1359,7 @@ func changeActiveUserAsync_(_ userId: Int64, viewPwd: String?) async throws {
}
try await getUserChatDataAsync()
await MainActor.run {
- if var (_, invitation) = ChatModel.shared.callInvitations.first(where: { _, inv in inv.user.userId == userId }) {
+ if let currentUser = currentUser, var (_, invitation) = ChatModel.shared.callInvitations.first(where: { _, inv in inv.user.userId == userId }) {
invitation.user = currentUser
activateCall(invitation)
}
@@ -1347,14 +1375,21 @@ func getUserChatData() throws {
}
private func getUserChatDataAsync() async throws {
- let userAddress = try await apiGetUserAddressAsync()
- let chatItemTTL = try await getChatItemTTLAsync()
- let chats = try await apiGetChatsAsync()
- await MainActor.run {
- let m = ChatModel.shared
- m.userAddress = userAddress
- m.chatItemTTL = chatItemTTL
- m.chats = chats.map { Chat.init($0) }
+ let m = ChatModel.shared
+ if m.currentUser != nil {
+ let userAddress = try await apiGetUserAddressAsync()
+ let chatItemTTL = try await getChatItemTTLAsync()
+ let chats = try await apiGetChatsAsync()
+ await MainActor.run {
+ m.userAddress = userAddress
+ m.chatItemTTL = chatItemTTL
+ m.chats = chats.map { Chat.init($0) }
+ }
+ } else {
+ await MainActor.run {
+ m.userAddress = nil
+ m.chats = []
+ }
}
}
@@ -1513,7 +1548,7 @@ func processReceivedMsg(_ res: ChatResponse) async {
}
if let file = cItem.autoReceiveFile() {
Task {
- await receiveFile(user: user, fileId: file.fileId, encrypted: cItem.encryptLocalFile, auto: true)
+ await receiveFile(user: user, fileId: file.fileId, auto: true)
}
}
if cItem.showNotification {
@@ -1651,6 +1686,13 @@ func processReceivedMsg(_ res: ChatResponse) async {
_ = m.upsertGroupMember(groupInfo, member)
}
}
+ case let .memberBlockedForAll(user, groupInfo, byMember: _, member: member, blocked: _):
+ if active(user) {
+ await MainActor.run {
+ m.updateGroup(groupInfo)
+ _ = m.upsertGroupMember(groupInfo, member)
+ }
+ }
case let .newMemberContactReceivedInv(user, contact, _, _):
if active(user) {
await MainActor.run {
diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift
index 4ae2296f46..c94ba3f830 100644
--- a/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift
@@ -52,7 +52,7 @@ struct CIFileView: View {
private var itemInteractive: Bool {
if let file = file {
switch (file.fileStatus) {
- case .sndStored: return false
+ case .sndStored: return file.fileProtocol == .local
case .sndTransfer: return false
case .sndComplete: return false
case .sndCancelled: return false
@@ -85,8 +85,7 @@ struct CIFileView: View {
Task {
logger.debug("CIFileView fileAction - in .rcvInvitation, in Task")
if let user = m.currentUser {
- let encrypted = privacyEncryptLocalFilesGroupDefault.get()
- await receiveFile(user: user, fileId: file.fileId, encrypted: encrypted)
+ await receiveFile(user: user, fileId: file.fileId)
}
}
} else {
@@ -108,12 +107,18 @@ struct CIFileView: View {
title: "Waiting for file",
message: "File will be received when your contact is online, please wait or check later!"
)
+ case .local: ()
}
case .rcvComplete:
logger.debug("CIFileView fileAction - in .rcvComplete")
if let fileSource = getLoadedFileSource(file) {
saveCryptoFile(fileSource)
}
+ case .sndStored:
+ logger.debug("CIFileView fileAction - in .sndStored")
+ if file.fileProtocol == .local, let fileSource = getLoadedFileSource(file) {
+ saveCryptoFile(fileSource)
+ }
default: break
}
}
@@ -126,11 +131,13 @@ struct CIFileView: View {
switch file.fileProtocol {
case .xftp: progressView()
case .smp: fileIcon("doc.fill")
+ case .local: fileIcon("doc.fill")
}
case let .sndTransfer(sndProgress, sndTotal):
switch file.fileProtocol {
case .xftp: progressCircle(sndProgress, sndTotal)
case .smp: progressView()
+ case .local: EmptyView()
}
case .sndComplete: fileIcon("doc.fill", innerIcon: "checkmark", innerIconSize: 10)
case .sndCancelled: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift
index 9ae52ae01b..c7e89fc5ed 100644
--- a/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItem/CIImageView.swift
@@ -38,7 +38,7 @@ struct CIImageView: View {
case .rcvInvitation:
Task {
if let user = m.currentUser {
- await receiveFile(user: user, fileId: file.fileId, encrypted: chatItem.encryptLocalFile)
+ await receiveFile(user: user, fileId: file.fileId)
}
}
case .rcvAccepted:
@@ -53,6 +53,7 @@ struct CIImageView: View {
title: "Waiting for image",
message: "Image will be received when your contact is online, please wait or check later!"
)
+ case .local: ()
}
case .rcvTransfer: () // ?
case .rcvComplete: () // ?
@@ -90,6 +91,7 @@ struct CIImageView: View {
switch file.fileProtocol {
case .xftp: progressView()
case .smp: EmptyView()
+ case .local: EmptyView()
}
case .sndTransfer: progressView()
case .sndComplete: fileIcon("checkmark", 10, 13)
diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift
index be8b25a0fc..a824ddc49f 100644
--- a/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItem/CIVideoView.swift
@@ -26,6 +26,8 @@ struct CIVideoView: View {
@State private var player: AVPlayer?
@State private var fullPlayer: AVPlayer?
@State private var url: URL?
+ @State private var urlDecrypted: URL?
+ @State private var decryptionInProgress: Bool = false
@State private var showFullScreenPlayer = false
@State private var timeObserver: Any? = nil
@State private var fullScreenTimeObserver: Any? = nil
@@ -39,8 +41,12 @@ struct CIVideoView: View {
self._videoWidth = videoWidth
self.scrollProxy = scrollProxy
if let url = getLoadedVideo(chatItem.file) {
- self._player = State(initialValue: VideoPlayerView.getOrCreatePlayer(url, false))
- self._fullPlayer = State(initialValue: AVPlayer(url: url))
+ let decrypted = chatItem.file?.fileSource?.cryptoArgs == nil ? url : chatItem.file?.fileSource?.decryptedGet()
+ self._urlDecrypted = State(initialValue: decrypted)
+ if let decrypted = decrypted {
+ self._player = State(initialValue: VideoPlayerView.getOrCreatePlayer(decrypted, false))
+ self._fullPlayer = State(initialValue: AVPlayer(url: decrypted))
+ }
self._url = State(initialValue: url)
}
if let data = Data(base64Encoded: dropImagePrefix(image)),
@@ -53,8 +59,10 @@ struct CIVideoView: View {
let file = chatItem.file
ZStack {
ZStack(alignment: .topLeading) {
- if let file = file, let preview = preview, let player = player, let url = url {
- videoView(player, url, file, preview, duration)
+ if let file = file, let preview = preview, let player = player, let decrypted = urlDecrypted {
+ videoView(player, decrypted, file, preview, duration)
+ } else if let file = file, let defaultPreview = preview, file.loaded && urlDecrypted == nil {
+ videoViewEncrypted(file, defaultPreview, duration)
} else if let data = Data(base64Encoded: dropImagePrefix(image)),
let uiImage = UIImage(data: data) {
imageView(uiImage)
@@ -62,7 +70,7 @@ struct CIVideoView: View {
if let file = file {
switch file.fileStatus {
case .rcvInvitation:
- receiveFileIfValidSize(file: file, encrypted: false, receiveFile: receiveFile)
+ receiveFileIfValidSize(file: file, receiveFile: receiveFile)
case .rcvAccepted:
switch file.fileProtocol {
case .xftp:
@@ -75,6 +83,7 @@ struct CIVideoView: View {
title: "Waiting for video",
message: "Video will be received when your contact is online, please wait or check later!"
)
+ case .local: ()
}
case .rcvTransfer: () // ?
case .rcvComplete: () // ?
@@ -88,7 +97,7 @@ struct CIVideoView: View {
}
if let file = file, case .rcvInvitation = file.fileStatus {
Button {
- receiveFileIfValidSize(file: file, encrypted: false, receiveFile: receiveFile)
+ receiveFileIfValidSize(file: file, receiveFile: receiveFile)
} label: {
playPauseIcon("play.fill")
}
@@ -96,12 +105,46 @@ struct CIVideoView: View {
}
}
+ private func videoViewEncrypted(_ file: CIFile, _ defaultPreview: UIImage, _ duration: Int) -> some View {
+ return ZStack(alignment: .topTrailing) {
+ ZStack(alignment: .center) {
+ let canBePlayed = !chatItem.chatDir.sent || file.fileStatus == CIFileStatus.sndComplete || (file.fileStatus == .sndStored && file.fileProtocol == .local)
+ imageView(defaultPreview)
+ .fullScreenCover(isPresented: $showFullScreenPlayer) {
+ if let decrypted = urlDecrypted {
+ fullScreenPlayer(decrypted)
+ }
+ }
+ .onTapGesture {
+ decrypt(file: file) {
+ showFullScreenPlayer = urlDecrypted != nil
+ }
+ }
+ if !decryptionInProgress {
+ Button {
+ decrypt(file: file) {
+ if let decrypted = urlDecrypted {
+ videoPlaying = true
+ player?.play()
+ }
+ }
+ } label: {
+ playPauseIcon(canBePlayed ? "play.fill" : "play.slash")
+ }
+ .disabled(!canBePlayed)
+ } else {
+ videoDecryptionProgress()
+ }
+ }
+ }
+ }
+
private func videoView(_ player: AVPlayer, _ url: URL, _ file: CIFile, _ preview: UIImage, _ duration: Int) -> some View {
let w = preview.size.width <= preview.size.height ? maxWidth * 0.75 : maxWidth
DispatchQueue.main.async { videoWidth = w }
return ZStack(alignment: .topTrailing) {
ZStack(alignment: .center) {
- let canBePlayed = !chatItem.chatDir.sent || file.fileStatus == CIFileStatus.sndComplete
+ let canBePlayed = !chatItem.chatDir.sent || file.fileStatus == CIFileStatus.sndComplete || (file.fileStatus == .sndStored && file.fileProtocol == .local)
VideoPlayerView(player: player, url: url, showControls: false)
.frame(width: w, height: w * preview.size.height / preview.size.width)
.onChange(of: m.stopPreviousRecPlay) { playingUrl in
@@ -159,6 +202,16 @@ struct CIVideoView: View {
.clipShape(Circle())
}
+ private func videoDecryptionProgress(_ color: Color = .white) -> some View {
+ ProgressView()
+ .progressViewStyle(.circular)
+ .frame(width: 12, height: 12)
+ .tint(color)
+ .frame(width: 40, height: 40)
+ .background(Color.black.opacity(0.35))
+ .clipShape(Circle())
+ }
+
private func durationProgress() -> some View {
HStack {
Text("\(durationText(videoPlaying ? progress : duration))")
@@ -202,11 +255,13 @@ struct CIVideoView: View {
switch file.fileProtocol {
case .xftp: progressView()
case .smp: EmptyView()
+ case .local: EmptyView()
}
case let .sndTransfer(sndProgress, sndTotal):
switch file.fileProtocol {
case .xftp: progressCircle(sndProgress, sndTotal)
case .smp: progressView()
+ case .local: EmptyView()
}
case .sndComplete: fileIcon("checkmark", 10, 13)
case .sndCancelled: fileIcon("xmark", 10, 13)
@@ -257,10 +312,10 @@ struct CIVideoView: View {
}
// TODO encrypt: where file size is checked?
- private func receiveFileIfValidSize(file: CIFile, encrypted: Bool, receiveFile: @escaping (User, Int64, Bool, Bool) async -> Void) {
+ private func receiveFileIfValidSize(file: CIFile, receiveFile: @escaping (User, Int64, Bool) async -> Void) {
Task {
if let user = m.currentUser {
- await receiveFile(user, file.fileId, encrypted, false)
+ await receiveFile(user, file.fileId, false)
}
}
}
@@ -323,6 +378,22 @@ struct CIVideoView: View {
}
}
+ private func decrypt(file: CIFile, completed: (() -> Void)? = nil) {
+ if decryptionInProgress { return }
+ decryptionInProgress = true
+ Task {
+ urlDecrypted = await file.fileSource?.decryptedGetOrCreate(&ChatModel.shared.filesToDelete)
+ await MainActor.run {
+ if let decrypted = urlDecrypted {
+ player = VideoPlayerView.getOrCreatePlayer(decrypted, false)
+ fullPlayer = AVPlayer(url: decrypted)
+ }
+ decryptionInProgress = true
+ completed?()
+ }
+ }
+ }
+
private func addObserver(_ player: AVPlayer, _ url: URL) {
timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(seconds: 0.01, preferredTimescale: CMTimeScale(NSEC_PER_SEC)), queue: .main) { time in
if let item = player.currentItem {
diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIVoiceView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIVoiceView.swift
index 2e54ba4143..3aecb65ebd 100644
--- a/apps/ios/Shared/Views/Chat/ChatItem/CIVoiceView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItem/CIVoiceView.swift
@@ -221,7 +221,7 @@ struct VoiceMessagePlayer: View {
Button {
Task {
if let user = chatModel.currentUser {
- await receiveFile(user: user, fileId: recordingFile.fileId, encrypted: privacyEncryptLocalFilesGroupDefault.get())
+ await receiveFile(user: user, fileId: recordingFile.fileId)
}
}
} label: {
diff --git a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
index 7b5dd40e97..f7775a7cdd 100644
--- a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
@@ -9,6 +9,8 @@
import SwiftUI
import SimpleXChat
+let notesChatColorLight = Color(.sRGB, red: 0.27, green: 0.72, blue: 1, opacity: 0.21)
+let notesChatColorDark = Color(.sRGB, red: 0.27, green: 0.72, blue: 1, opacity: 0.19)
let sentColorLight = Color(.sRGB, red: 0.27, green: 0.72, blue: 1, opacity: 0.12)
let sentColorDark = Color(.sRGB, red: 0.27, green: 0.72, blue: 1, opacity: 0.17)
private let sentQuoteColorLight = Color(.sRGB, red: 0.27, green: 0.72, blue: 1, opacity: 0.11)
@@ -44,7 +46,9 @@ struct FramedItemView: View {
framedItemHeader(icon: "flag", caption: Text("moderated by \(byGroupMember.displayName)").italic())
case .blocked:
framedItemHeader(icon: "hand.raised", caption: Text("blocked").italic())
- default:
+ case .blockedByAdmin:
+ framedItemHeader(icon: "hand.raised", caption: Text("blocked by admin").italic())
+ case .deleted:
framedItemHeader(icon: "trash", caption: Text("marked deleted").italic())
}
} else if chatItem.meta.isLive {
diff --git a/apps/ios/Shared/Views/Chat/ChatItem/MarkedDeletedItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/MarkedDeletedItemView.swift
index c6af95e6f6..dfa4a97fc2 100644
--- a/apps/ios/Shared/Views/Chat/ChatItem/MarkedDeletedItemView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItem/MarkedDeletedItemView.swift
@@ -33,6 +33,7 @@ struct MarkedDeletedItemView: View {
var i = m.getChatItemIndex(chatItem) {
var moderated = 0
var blocked = 0
+ var blockedByAdmin = 0
var deleted = 0
var moderatedBy: Set = []
while i < m.reversedChatItems.count,
@@ -44,16 +45,19 @@ struct MarkedDeletedItemView: View {
moderated += 1
moderatedBy.insert(byGroupMember.displayName)
case .blocked: blocked += 1
+ case .blockedByAdmin: blockedByAdmin += 1
case .deleted: deleted += 1
}
i += 1
}
- let total = moderated + blocked + deleted
+ let total = moderated + blocked + blockedByAdmin + deleted
return total <= 1
? markedDeletedText
: total == moderated
? "\(total) messages moderated by \(moderatedBy.joined(separator: ", "))"
- : total == blocked
+ : total == blockedByAdmin
+ ? "\(total) messages blocked by admin"
+ : total == blocked + blockedByAdmin
? "\(total) messages blocked"
: "\(total) messages marked deleted"
} else {
@@ -65,7 +69,8 @@ struct MarkedDeletedItemView: View {
switch chatItem.meta.itemDeleted {
case let .moderated(_, byGroupMember): "moderated by \(byGroupMember.displayName)"
case .blocked: "blocked"
- default: "marked deleted"
+ case .blockedByAdmin: "blocked by admin"
+ case .deleted, nil: "marked deleted"
}
}
}
diff --git a/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift b/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift
index 69cfcd2caf..8dd43cc01b 100644
--- a/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift
@@ -53,7 +53,9 @@ struct ChatItemInfoView: View {
}
private var title: String {
- ci.chatDir.sent
+ ci.localNote
+ ? NSLocalizedString("Saved message", comment: "message info title")
+ : ci.chatDir.sent
? NSLocalizedString("Sent message", comment: "message info title")
: NSLocalizedString("Received message", comment: "message info title")
}
@@ -110,7 +112,11 @@ struct ChatItemInfoView: View {
.bold()
.padding(.bottom)
- infoRow("Sent at", localTimestamp(meta.itemTs))
+ if ci.localNote {
+ infoRow("Created at", localTimestamp(meta.itemTs))
+ } else {
+ infoRow("Sent at", localTimestamp(meta.itemTs))
+ }
if !ci.chatDir.sent {
infoRow("Received at", localTimestamp(meta.createdAt))
}
@@ -350,7 +356,12 @@ struct ChatItemInfoView: View {
private func itemInfoShareText() -> String {
let meta = ci.meta
var shareText: [String] = [String.localizedStringWithFormat(NSLocalizedString("# %@", comment: "copied message info title, # "), title), ""]
- shareText += [String.localizedStringWithFormat(NSLocalizedString("Sent at: %@", comment: "copied message info"), localTimestamp(meta.itemTs))]
+ shareText += [String.localizedStringWithFormat(
+ ci.localNote
+ ? NSLocalizedString("Created at: %@", comment: "copied message info")
+ : NSLocalizedString("Sent at: %@", comment: "copied message info"),
+ localTimestamp(meta.itemTs))
+ ]
if !ci.chatDir.sent {
shareText += [String.localizedStringWithFormat(NSLocalizedString("Received at: %@", comment: "copied message info"), localTimestamp(meta.createdAt))]
}
diff --git a/apps/ios/Shared/Views/Chat/ChatItemView.swift b/apps/ios/Shared/Views/Chat/ChatItemView.swift
index 657df60654..8f67a8f737 100644
--- a/apps/ios/Shared/Views/Chat/ChatItemView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItemView.swift
@@ -109,6 +109,7 @@ struct ChatItemContentView: View {
case let .rcvGroupFeatureRejected(feature): chatFeatureView(feature, .red)
case .sndModerated: deletedItemView()
case .rcvModerated: deletedItemView()
+ case .rcvBlocked: deletedItemView()
case let .invalidJSON(json): CIInvalidJSONView(json: json)
}
}
diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift
index a09c5643b6..af53e7e476 100644
--- a/apps/ios/Shared/Views/Chat/ChatView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatView.swift
@@ -151,6 +151,8 @@ struct ChatView: View {
)
)
}
+ } else if case .local = cInfo {
+ ChatInfoToolbar(chat: chat)
}
}
ToolbarItem(placement: .navigationBarTrailing) {
@@ -205,6 +207,8 @@ struct ChatView: View {
Image(systemName: "ellipsis")
}
}
+ case .local:
+ searchButton()
default:
EmptyView()
}
@@ -636,7 +640,7 @@ struct ChatView: View {
Button("Delete for me", role: .destructive) {
deleteMessage(.cidmInternal)
}
- if let di = deletingItem, di.meta.editable {
+ if let di = deletingItem, di.meta.editable && !di.localNote {
Button(broadcastDeleteButtonText, role: .destructive) {
deleteMessage(.cidmBroadcast)
}
@@ -720,7 +724,7 @@ struct ChatView: View {
}
menu.append(rm)
}
- if ci.meta.itemDeleted == nil && !ci.isLiveDummy && !live {
+ if ci.meta.itemDeleted == nil && !ci.isLiveDummy && !live && !ci.localNote {
menu.append(replyUIAction(ci))
}
let fileSource = getLoadedFileSource(ci.file)
@@ -748,9 +752,9 @@ struct ChatView: View {
if revealed {
menu.append(hideUIAction())
}
- if ci.meta.itemDeleted == nil,
+ if ci.meta.itemDeleted == nil && !ci.localNote,
let file = ci.file,
- let cancelAction = file.cancelAction {
+ let cancelAction = file.cancelAction {
menu.append(cancelFileUIAction(file.fileId, cancelAction))
}
if !live || !ci.meta.isLive {
diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift
index d089c7d6fe..b597926093 100644
--- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift
+++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift
@@ -295,7 +295,7 @@ struct ComposeView: View {
sendMessage(ttl: ttl)
resetLinkPreview()
},
- sendLiveMessage: sendLiveMessage,
+ sendLiveMessage: chat.chatInfo.chatType != .local ? sendLiveMessage : nil,
updateLiveMessage: updateLiveMessage,
cancelLiveMessage: {
composeState.liveMessage = nil
@@ -689,7 +689,7 @@ struct ComposeView: View {
let file = voiceCryptoFile(recordingFileName)
sent = await send(.voice(text: msgText, duration: duration), quoted: quoted, file: file, ttl: ttl)
case let .filePreview(_, file):
- if let savedFile = saveFileFromURL(file, encrypted: privacyEncryptLocalFilesGroupDefault.get()) {
+ if let savedFile = saveFileFromURL(file) {
sent = await send(.file(msgText), quoted: quoted, file: savedFile, live: live, ttl: ttl)
}
}
@@ -792,15 +792,17 @@ struct ComposeView: View {
}
func send(_ mc: MsgContent, quoted: Int64?, file: CryptoFile? = nil, live: Bool = false, ttl: Int?) async -> ChatItem? {
- if let chatItem = await apiSendMessage(
- type: chat.chatInfo.chatType,
- id: chat.chatInfo.apiId,
- file: file,
- quotedItemId: quoted,
- msg: mc,
- live: live,
- ttl: ttl
- ) {
+ if let chatItem = chat.chatInfo.chatType == .local
+ ? await apiCreateChatItem(noteFolderId: chat.chatInfo.apiId, file: file, msg: mc)
+ : await apiSendMessage(
+ type: chat.chatInfo.chatType,
+ id: chat.chatInfo.apiId,
+ file: file,
+ quotedItemId: quoted,
+ msg: mc,
+ live: live,
+ ttl: ttl
+ ) {
await MainActor.run {
chatModel.removeLiveDummy(animated: false)
chatModel.addChatItem(chat.chatInfo, chatItem)
diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift
index 09ead880ad..3879e78d3d 100644
--- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift
+++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift
@@ -36,6 +36,8 @@ struct GroupChatInfoView: View {
case largeGroupReceiptsDisabled
case blockMemberAlert(mem: GroupMember)
case unblockMemberAlert(mem: GroupMember)
+ case blockForAllAlert(mem: GroupMember)
+ case unblockForAllAlert(mem: GroupMember)
case removeMemberAlert(mem: GroupMember)
case error(title: LocalizedStringKey, error: LocalizedStringKey)
@@ -48,6 +50,8 @@ struct GroupChatInfoView: View {
case .largeGroupReceiptsDisabled: return "largeGroupReceiptsDisabled"
case let .blockMemberAlert(mem): return "blockMemberAlert \(mem.groupMemberId)"
case let .unblockMemberAlert(mem): return "unblockMemberAlert \(mem.groupMemberId)"
+ case let .blockForAllAlert(mem): return "blockForAllAlert \(mem.groupMemberId)"
+ case let .unblockForAllAlert(mem): return "unblockForAllAlert \(mem.groupMemberId)"
case let .removeMemberAlert(mem): return "removeMemberAlert \(mem.groupMemberId)"
case let .error(title, _): return "error \(title)"
}
@@ -143,6 +147,8 @@ struct GroupChatInfoView: View {
case .largeGroupReceiptsDisabled: return largeGroupReceiptsDisabledAlert()
case let .blockMemberAlert(mem): return blockMemberAlert(groupInfo, mem)
case let .unblockMemberAlert(mem): return unblockMemberAlert(groupInfo, mem)
+ case let .blockForAllAlert(mem): return blockForAllAlert(groupInfo, mem)
+ case let .unblockForAllAlert(mem): return unblockForAllAlert(groupInfo, mem)
case let .removeMemberAlert(mem): return removeMemberAlert(mem)
case let .error(title, error): return Alert(title: Text(title), message: Text(error))
}
@@ -226,13 +232,10 @@ struct GroupChatInfoView: View {
.foregroundColor(.secondary)
}
Spacer()
- let role = member.memberRole
- if role == .owner || role == .admin {
- Text(member.memberRole.text)
- .foregroundColor(.secondary)
- }
+ memberInfo(member)
}
+ // revert from this:
if user {
v
} else if member.canBeRemoved(groupInfo: groupInfo) {
@@ -240,6 +243,43 @@ struct GroupChatInfoView: View {
} else {
blockSwipe(member, v)
}
+ // revert to this: vvv
+// if user {
+// v
+// } else if groupInfo.membership.memberRole >= .admin {
+// // TODO if there are more actions, refactor with lists of swipeActions
+// let canBlockForAll = member.canBlockForAll(groupInfo: groupInfo)
+// let canRemove = member.canBeRemoved(groupInfo: groupInfo)
+// if canBlockForAll && canRemove {
+// removeSwipe(member, blockForAllSwipe(member, v))
+// } else if canBlockForAll {
+// blockForAllSwipe(member, v)
+// } else if canRemove {
+// removeSwipe(member, v)
+// } else {
+// v
+// }
+// } else {
+// if !member.blockedByAdmin {
+// blockSwipe(member, v)
+// } else {
+// v
+// }
+// }
+ // ^^^
+ }
+
+ @ViewBuilder private func memberInfo(_ member: GroupMember) -> some View {
+ if member.blocked {
+ Text("blocked")
+ .foregroundColor(.secondary)
+ } else {
+ let role = member.memberRole
+ if [.owner, .admin, .observer].contains(role) {
+ Text(member.memberRole.text)
+ .foregroundColor(.secondary)
+ }
+ }
}
private func blockSwipe(_ member: GroupMember, _ v: V) -> some View {
@@ -260,6 +300,24 @@ struct GroupChatInfoView: View {
}
}
+ private func blockForAllSwipe(_ member: GroupMember, _ v: V) -> some View {
+ v.swipeActions(edge: .leading) {
+ if member.blockedByAdmin {
+ Button {
+ alert = .unblockForAllAlert(mem: member)
+ } label: {
+ Label("Unblock for all", systemImage: "hand.raised.slash").foregroundColor(.accentColor)
+ }
+ } else {
+ Button {
+ alert = .blockForAllAlert(mem: member)
+ } label: {
+ Label("Block for all", systemImage: "hand.raised").foregroundColor(.secondary)
+ }
+ }
+ }
+ }
+
private func removeSwipe(_ member: GroupMember, _ v: V) -> some View {
v.swipeActions(edge: .trailing) {
Button(role: .destructive) {
diff --git a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift
index 7e336c3328..d2b0f77393 100644
--- a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift
+++ b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift
@@ -27,6 +27,8 @@ struct GroupMemberInfoView: View {
enum GroupMemberInfoViewAlert: Identifiable {
case blockMemberAlert(mem: GroupMember)
case unblockMemberAlert(mem: GroupMember)
+ case blockForAllAlert(mem: GroupMember)
+ case unblockForAllAlert(mem: GroupMember)
case removeMemberAlert(mem: GroupMember)
case changeMemberRoleAlert(mem: GroupMember, role: GroupMemberRole)
case switchAddressAlert
@@ -39,6 +41,8 @@ struct GroupMemberInfoView: View {
switch self {
case let .blockMemberAlert(mem): return "blockMemberAlert \(mem.groupMemberId)"
case let .unblockMemberAlert(mem): return "unblockMemberAlert \(mem.groupMemberId)"
+ case let .blockForAllAlert(mem): return "blockForAllAlert \(mem.groupMemberId)"
+ case let .unblockForAllAlert(mem): return "unblockForAllAlert \(mem.groupMemberId)"
case let .removeMemberAlert(mem): return "removeMemberAlert \(mem.groupMemberId)"
case let .changeMemberRoleAlert(mem, role): return "changeMemberRoleAlert \(mem.groupMemberId) \(role.rawValue)"
case .switchAddressAlert: return "switchAddressAlert"
@@ -164,6 +168,7 @@ struct GroupMemberInfoView: View {
}
}
+ // revert from this:
Section {
if member.memberSettings.showMessages {
blockMemberButton(member)
@@ -171,9 +176,16 @@ struct GroupMemberInfoView: View {
unblockMemberButton(member)
}
if member.canBeRemoved(groupInfo: groupInfo) {
- removeMemberButton(member)
+ removeMemberButton(member)
}
}
+ // revert to this: vvv
+// if groupInfo.membership.memberRole >= .admin {
+// adminDestructiveSection(member)
+// } else {
+// nonAdminBlockSection(member)
+// }
+ // ^^^
if developerTools {
Section("For console") {
@@ -216,6 +228,8 @@ struct GroupMemberInfoView: View {
switch(alertItem) {
case let .blockMemberAlert(mem): return blockMemberAlert(groupInfo, mem)
case let .unblockMemberAlert(mem): return unblockMemberAlert(groupInfo, mem)
+ case let .blockForAllAlert(mem): return blockForAllAlert(groupInfo, mem)
+ case let .unblockForAllAlert(mem): return unblockForAllAlert(groupInfo, mem)
case let .removeMemberAlert(mem): return removeMemberAlert(mem)
case let .changeMemberRoleAlert(mem, _): return changeMemberRoleAlert(mem)
case .switchAddressAlert: return switchAddressAlert(switchMemberAddress)
@@ -385,6 +399,55 @@ struct GroupMemberInfoView: View {
}
}
+ @ViewBuilder private func adminDestructiveSection(_ mem: GroupMember) -> some View {
+ let canBlockForAll = mem.canBlockForAll(groupInfo: groupInfo)
+ let canRemove = mem.canBeRemoved(groupInfo: groupInfo)
+ if canBlockForAll || canRemove {
+ Section {
+ if canBlockForAll {
+ if mem.blockedByAdmin {
+ unblockForAllButton(mem)
+ } else {
+ blockForAllButton(mem)
+ }
+ }
+ if canRemove {
+ removeMemberButton(mem)
+ }
+ }
+ }
+ }
+
+ private func nonAdminBlockSection(_ mem: GroupMember) -> some View {
+ Section {
+ if mem.blockedByAdmin {
+ Label("Blocked by admin", systemImage: "hand.raised")
+ .foregroundColor(.secondary)
+ } else if mem.memberSettings.showMessages {
+ blockMemberButton(mem)
+ } else {
+ unblockMemberButton(mem)
+ }
+ }
+ }
+
+ private func blockForAllButton(_ mem: GroupMember) -> some View {
+ Button(role: .destructive) {
+ alert = .blockForAllAlert(mem: mem)
+ } label: {
+ Label("Block for all", systemImage: "hand.raised")
+ .foregroundColor(.red)
+ }
+ }
+
+ private func unblockForAllButton(_ mem: GroupMember) -> some View {
+ Button {
+ alert = .unblockForAllAlert(mem: mem)
+ } label: {
+ Label("Unblock for all", systemImage: "hand.raised.slash")
+ }
+ }
+
private func blockMemberButton(_ mem: GroupMember) -> some View {
Button(role: .destructive) {
alert = .blockMemberAlert(mem: mem)
@@ -560,6 +623,41 @@ func updateMemberSettings(_ gInfo: GroupInfo, _ member: GroupMember, _ memberSet
}
}
+func blockForAllAlert(_ gInfo: GroupInfo, _ mem: GroupMember) -> Alert {
+ Alert(
+ title: Text("Block member for all?"),
+ message: Text("All new messages from \(mem.chatViewName) will be hidden!"),
+ primaryButton: .destructive(Text("Block for all")) {
+ blockMemberForAll(gInfo, mem, true)
+ },
+ secondaryButton: .cancel()
+ )
+}
+
+func unblockForAllAlert(_ gInfo: GroupInfo, _ mem: GroupMember) -> Alert {
+ Alert(
+ title: Text("Unblock member for all?"),
+ message: Text("Messages from \(mem.chatViewName) will be shown!"),
+ primaryButton: .default(Text("Unblock for all")) {
+ blockMemberForAll(gInfo, mem, false)
+ },
+ secondaryButton: .cancel()
+ )
+}
+
+func blockMemberForAll(_ gInfo: GroupInfo, _ member: GroupMember, _ blocked: Bool) {
+ Task {
+ do {
+ let updatedMember = try await apiBlockMemberForAll(gInfo.groupId, member.groupMemberId, blocked)
+ await MainActor.run {
+ _ = ChatModel.shared.upsertGroupMember(gInfo, updatedMember)
+ }
+ } catch let error {
+ logger.error("apiBlockMemberForAll error: \(responseError(error))")
+ }
+ }
+}
+
struct GroupMemberInfoView_Previews: PreviewProvider {
static var previews: some View {
GroupMemberInfoView(
diff --git a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift
index 18464b3bb5..7fbc1e4ac8 100644
--- a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift
+++ b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift
@@ -44,6 +44,8 @@ struct ChatListNavLink: View {
contactNavLink(contact)
case let .group(groupInfo):
groupNavLink(groupInfo)
+ case let .local(noteFolder):
+ noteFolderNavLink(noteFolder)
case let .contactRequest(cReq):
contactRequestNavLink(cReq)
case let .contactConnection(cConn):
@@ -195,6 +197,24 @@ struct ChatListNavLink: View {
}
}
+ @ViewBuilder private func noteFolderNavLink(_ noteFolder: NoteFolder) -> some View {
+ NavLinkPlain(
+ tag: chat.chatInfo.id,
+ selection: $chatModel.chatId,
+ label: { ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) },
+ disabled: !noteFolder.ready
+ )
+ .frame(height: rowHeights[dynamicTypeSize])
+ .swipeActions(edge: .leading, allowsFullSwipe: true) {
+ markReadButton()
+ }
+ .swipeActions(edge: .trailing, allowsFullSwipe: true) {
+ if !chat.chatItems.isEmpty {
+ clearNoteFolderButton()
+ }
+ }
+ }
+
private func joinGroupButton() -> some View {
Button {
inProgress = true
@@ -253,6 +273,15 @@ struct ChatListNavLink: View {
.tint(Color.orange)
}
+ private func clearNoteFolderButton() -> some View {
+ Button {
+ AlertManager.shared.showAlert(clearNoteFolderAlert())
+ } label: {
+ Label("Clear", systemImage: "gobackward")
+ }
+ .tint(Color.orange)
+ }
+
private func leaveGroupChatButton(_ groupInfo: GroupInfo) -> some View {
Button {
AlertManager.shared.showAlert(leaveGroupAlert(groupInfo))
@@ -357,6 +386,17 @@ struct ChatListNavLink: View {
)
}
+ private func clearNoteFolderAlert() -> Alert {
+ Alert(
+ title: Text("Clear private notes?"),
+ message: Text("All messages will be deleted - this cannot be undone!"),
+ primaryButton: .destructive(Text("Clear")) {
+ Task { await clearChat(chat) }
+ },
+ secondaryButton: .cancel()
+ )
+ }
+
private func leaveGroupAlert(_ groupInfo: GroupInfo) -> Alert {
Alert(
title: Text("Leave group?"),
diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift
index 62955a1040..22807f6182 100644
--- a/apps/ios/Shared/Views/ChatList/ChatListView.swift
+++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift
@@ -160,7 +160,7 @@ struct ChatListView: View {
ForEach(cs, id: \.viewId) { chat in
ChatListNavLink(chat: chat)
.padding(.trailing, -16)
- .disabled(chatModel.chatRunning != true)
+ .disabled(chatModel.chatRunning != true || chatModel.deletedChats.contains(chat.chatInfo.id))
}
.offset(x: -8)
}
@@ -247,6 +247,8 @@ struct ChatListView: View {
return s == ""
? (filtered(chat) || gInfo.membership.memberStatus == .memInvited)
: viewNameContains(cInfo, s)
+ case .local:
+ return s == "" || viewNameContains(cInfo, s)
case .contactRequest:
return s == "" || viewNameContains(cInfo, s)
case let .contactConnection(conn):
diff --git a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift
index 13d91881e6..186a709ce8 100644
--- a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift
+++ b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift
@@ -13,6 +13,7 @@ struct ChatPreviewView: View {
@EnvironmentObject var chatModel: ChatModel
@ObservedObject var chat: Chat
@Binding var progressByTimeout: Bool
+ @State var deleting: Bool = false
@Environment(\.colorScheme) var colorScheme
var darkGreen = Color(red: 0, green: 0.5, blue: 0)
@@ -55,6 +56,9 @@ struct ChatPreviewView: View {
.frame(maxHeight: .infinity)
}
.padding(.bottom, -8)
+ .onChange(of: chatModel.deletedChats.contains(chat.chatInfo.id)) { contains in
+ deleting = contains
+ }
}
@ViewBuilder private func chatPreviewImageOverlayIcon() -> some View {
@@ -87,13 +91,13 @@ struct ChatPreviewView: View {
let t = Text(chat.chatInfo.chatViewName).font(.title3).fontWeight(.bold)
switch chat.chatInfo {
case let .direct(contact):
- previewTitle(contact.verified == true ? verifiedIcon + t : t)
+ previewTitle(contact.verified == true ? verifiedIcon + t : t).foregroundColor(deleting ? Color.secondary : nil)
case let .group(groupInfo):
let v = previewTitle(t)
switch (groupInfo.membership.memberStatus) {
- case .memInvited: v.foregroundColor(chat.chatInfo.incognito ? .indigo : .accentColor)
+ case .memInvited: v.foregroundColor(deleting ? .secondary : chat.chatInfo.incognito ? .indigo : .accentColor)
case .memAccepted: v.foregroundColor(.secondary)
- default: v
+ default: if deleting { v.foregroundColor(.secondary) } else { v }
}
default: previewTitle(t)
}
@@ -130,9 +134,9 @@ struct ChatPreviewView: View {
.foregroundColor(.white)
.padding(.horizontal, 4)
.frame(minWidth: 18, minHeight: 18)
- .background(chat.chatInfo.ntfsEnabled ? Color.accentColor : Color.secondary)
+ .background(chat.chatInfo.ntfsEnabled || chat.chatInfo.chatType == .local ? Color.accentColor : Color.secondary)
.cornerRadius(10)
- } else if !chat.chatInfo.ntfsEnabled {
+ } else if !chat.chatInfo.ntfsEnabled && chat.chatInfo.chatType != .local {
Image(systemName: "speaker.slash.fill")
.foregroundColor(.secondary)
} else if chat.chatInfo.chatSettings?.favorite ?? false {
diff --git a/apps/ios/Shared/Views/Helpers/ChatInfoImage.swift b/apps/ios/Shared/Views/Helpers/ChatInfoImage.swift
index 1b344148c0..e253cdd72c 100644
--- a/apps/ios/Shared/Views/Helpers/ChatInfoImage.swift
+++ b/apps/ios/Shared/Views/Helpers/ChatInfoImage.swift
@@ -10,6 +10,7 @@ import SwiftUI
import SimpleXChat
struct ChatInfoImage: View {
+ @Environment(\.colorScheme) var colorScheme
@ObservedObject var chat: Chat
var color = Color(uiColor: .tertiarySystemGroupedBackground)
@@ -18,13 +19,16 @@ struct ChatInfoImage: View {
switch chat.chatInfo {
case .direct: iconName = "person.crop.circle.fill"
case .group: iconName = "person.2.circle.fill"
+ case .local: iconName = "folder.circle.fill"
case .contactRequest: iconName = "person.crop.circle.fill"
default: iconName = "circle.fill"
}
+ let notesColor = colorScheme == .light ? notesChatColorLight : notesChatColorDark
+ let iconColor = if case .local = chat.chatInfo { notesColor } else { color }
return ProfileImage(
imageStr: chat.chatInfo.image,
iconName: iconName,
- color: color
+ color: iconColor
)
}
}
diff --git a/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift b/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift
index 59c2b25b6d..ece10e46dd 100644
--- a/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift
+++ b/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift
@@ -314,6 +314,37 @@ private let versionDescriptions: [VersionDescription] = [
),
]
),
+ VersionDescription(
+ version: "v5.5",
+ post: URL(string: "https://simplex.chat/blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.html"),
+ features: [
+ FeatureDescription(
+ icon: "folder",
+ title: "Private notes",
+ description: "With encrypted files and media."
+ ),
+ FeatureDescription(
+ icon: "link",
+ title: "Paste link to connect!",
+ description: "Search bar accepts invitation links."
+ ),
+ FeatureDescription(
+ icon: "bubble.left.and.bubble.right",
+ title: "Join group conversations",
+ description: "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)."
+ ),
+ FeatureDescription(
+ icon: "battery.50",
+ title: "Improved message delivery",
+ description: "With reduced battery usage."
+ ),
+ FeatureDescription(
+ icon: "character",
+ title: "Turkish interface",
+ description: "Thanks to the users – [contribute via Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!"
+ ),
+ ]
+ )
]
private let lastVersion = versionDescriptions.last!.version
diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift
index b73d6b867d..a691e6afc9 100644
--- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift
+++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift
@@ -159,37 +159,42 @@ struct SettingsView: View {
}
@ViewBuilder func settingsView() -> some View {
- let user: User = chatModel.currentUser!
+ let user = chatModel.currentUser
NavigationView {
List {
Section("You") {
- NavigationLink {
- UserProfile()
- .navigationTitle("Your current profile")
- } label: {
- ProfilePreview(profileOf: user)
- .padding(.leading, -8)
+ if let user = user {
+ NavigationLink {
+ UserProfile()
+ .navigationTitle("Your current profile")
+ } label: {
+ ProfilePreview(profileOf: user)
+ .padding(.leading, -8)
+ }
}
NavigationLink {
- UserProfilesView()
+ UserProfilesView(showSettings: $showSettings)
} label: {
settingsRow("person.crop.rectangle.stack") { Text("Your chat profiles") }
}
- NavigationLink {
- UserAddressView(shareViaProfile: chatModel.currentUser!.addressShared)
- .navigationTitle("SimpleX address")
- .navigationBarTitleDisplayMode(.large)
- } label: {
- settingsRow("qrcode") { Text("Your SimpleX address") }
- }
- NavigationLink {
- PreferencesView(profile: user.profile, preferences: user.fullPreferences, currentPreferences: user.fullPreferences)
- .navigationTitle("Your preferences")
- } label: {
- settingsRow("switch.2") { Text("Chat preferences") }
+ if let user = user {
+ NavigationLink {
+ UserAddressView(shareViaProfile: user.addressShared)
+ .navigationTitle("SimpleX address")
+ .navigationBarTitleDisplayMode(.large)
+ } label: {
+ settingsRow("qrcode") { Text("Your SimpleX address") }
+ }
+
+ NavigationLink {
+ PreferencesView(profile: user.profile, preferences: user.fullPreferences, currentPreferences: user.fullPreferences)
+ .navigationTitle("Your preferences")
+ } label: {
+ settingsRow("switch.2") { Text("Chat preferences") }
+ }
}
NavigationLink {
@@ -250,12 +255,14 @@ struct SettingsView: View {
}
Section("Help") {
- NavigationLink {
- ChatHelp(showSettings: $showSettings)
- .navigationTitle("Welcome \(user.displayName)!")
- .frame(maxHeight: .infinity, alignment: .top)
- } label: {
- settingsRow("questionmark") { Text("How to use it") }
+ if let user = user {
+ NavigationLink {
+ ChatHelp(showSettings: $showSettings)
+ .navigationTitle("Welcome \(user.displayName)!")
+ .frame(maxHeight: .infinity, alignment: .top)
+ } label: {
+ settingsRow("questionmark") { Text("How to use it") }
+ }
}
NavigationLink {
WhatsNewView(viaSettings: true)
diff --git a/apps/ios/Shared/Views/UserSettings/UserProfilesView.swift b/apps/ios/Shared/Views/UserSettings/UserProfilesView.swift
index f6c7bf37e8..f2cac59dae 100644
--- a/apps/ios/Shared/Views/UserSettings/UserProfilesView.swift
+++ b/apps/ios/Shared/Views/UserSettings/UserProfilesView.swift
@@ -8,6 +8,7 @@ import SimpleXChat
struct UserProfilesView: View {
@EnvironmentObject private var m: ChatModel
+ @Binding var showSettings: Bool
@Environment(\.editMode) private var editMode
@AppStorage(DEFAULT_SHOW_HIDDEN_PROFILES_NOTICE) private var showHiddenProfilesNotice = true
@AppStorage(DEFAULT_SHOW_MUTE_PROFILE_ALERT) private var showMuteProfileAlert = true
@@ -25,7 +26,6 @@ struct UserProfilesView: View {
private enum UserProfilesAlert: Identifiable {
case deleteUser(user: User, delSMPQueues: Bool)
- case cantDeleteLastUser
case hiddenProfilesNotice
case muteProfileAlert
case activateUserError(error: String)
@@ -34,7 +34,6 @@ struct UserProfilesView: View {
var id: String {
switch self {
case let .deleteUser(user, delSMPQueues): return "deleteUser \(user.userId) \(delSMPQueues)"
- case .cantDeleteLastUser: return "cantDeleteLastUser"
case .hiddenProfilesNotice: return "hiddenProfilesNotice"
case .muteProfileAlert: return "muteProfileAlert"
case let .activateUserError(err): return "activateUserError \(err)"
@@ -78,7 +77,7 @@ struct UserProfilesView: View {
Section {
let users = filteredUsers()
let v = ForEach(users) { u in
- userView(u.user, allowDelete: users.count > 1)
+ userView(u.user)
}
if #available(iOS 16, *) {
v.onDelete { indexSet in
@@ -146,13 +145,6 @@ struct UserProfilesView: View {
},
secondaryButton: .cancel()
)
- case .cantDeleteLastUser:
- return Alert(
- title: Text("Can't delete user profile!"),
- message: m.users.count > 1
- ? Text("There should be at least one visible user profile.")
- : Text("There should be at least one user profile.")
- )
case .hiddenProfilesNotice:
return Alert(
title: Text("Make profile private!"),
@@ -280,11 +272,21 @@ struct UserProfilesView: View {
if let newActive = m.users.first(where: { u in !u.user.activeUser && !u.user.hidden }) {
try await changeActiveUserAsync_(newActive.user.userId, viewPwd: nil)
try await deleteUser()
+ } else {
+ // Deleting the last visible user while having hidden one(s)
+ try await deleteUser()
+ try await changeActiveUserAsync_(nil, viewPwd: nil)
+ await MainActor.run {
+ onboardingStageDefault.set(.step1_SimpleXInfo)
+ m.onboardingStage = .step1_SimpleXInfo
+ showSettings = false
+ }
}
} else {
try await deleteUser()
}
} catch let error {
+ logger.error("Error deleting user profile: \(error)")
let a = getErrorAlert(error, "Error deleting user profile")
alert = .error(title: a.title, error: a.message)
}
@@ -295,7 +297,7 @@ struct UserProfilesView: View {
}
}
- @ViewBuilder private func userView(_ user: User, allowDelete: Bool) -> some View {
+ @ViewBuilder private func userView(_ user: User) -> some View {
let v = Button {
Task {
do {
@@ -323,9 +325,7 @@ struct UserProfilesView: View {
}
}
}
- .disabled(user.activeUser)
.foregroundColor(.primary)
- .deleteDisabled(!allowDelete)
.swipeActions(edge: .leading, allowsFullSwipe: true) {
if user.hidden {
Button("Unhide") {
@@ -361,8 +361,6 @@ struct UserProfilesView: View {
}
if #available(iOS 16, *) {
v
- } else if !allowDelete {
- v
} else {
v.swipeActions(edge: .trailing, allowsFullSwipe: true) {
Button("Delete", role: .destructive) {
@@ -373,12 +371,8 @@ struct UserProfilesView: View {
}
private func confirmDeleteUser(_ user: User) {
- if m.users.count > 1 && (user.hidden || visibleUsersCount > 1) {
- showDeleteConfirmation = true
- userToDelete = user
- } else {
- alert = .cantDeleteLastUser
- }
+ showDeleteConfirmation = true
+ userToDelete = user
}
private func setUserPrivacy(_ user: User, successAlert: UserProfilesAlert? = nil, _ api: @escaping () async throws -> User) {
@@ -409,6 +403,6 @@ public func chatPasswordHash(_ pwd: String, _ salt: String) -> String {
struct UserProfilesView_Previews: PreviewProvider {
static var previews: some View {
- UserProfilesView()
+ UserProfilesView(showSettings: Binding.constant(true))
}
}
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 506df8cf17..85e4ebb985 100644
--- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff
+++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff
@@ -89,6 +89,7 @@
%@ and %@
+ %@ и %@No comment provided by engineer.
@@ -103,6 +104,7 @@
%@ connected
+ %@ свързанNo comment provided by engineer.
@@ -132,6 +134,7 @@
%@, %@ and %lld members
+ %@, %@ и %lld членовеNo comment provided by engineer.
@@ -201,6 +204,7 @@
%lld group events
+ %lld групови събитияNo comment provided by engineer.
@@ -210,14 +214,21 @@
%lld messages blocked
+ %lld блокирани съобщения
+ No comment provided by engineer.
+
+
+ %lld messages blocked by adminNo comment provided by engineer.%lld messages marked deleted
+ %lld съобщения, маркирани като изтритиNo comment provided by engineer.%lld messages moderated by %@
+ %lld съобщения, модерирани от %@No comment provided by engineer.
@@ -292,10 +303,12 @@
(new)
+ (ново)No comment provided by engineer.(this device v%@)
+ (това устройство v%@)No comment provided by engineer.
@@ -305,6 +318,7 @@
**Add contact**: to create a new invitation link, or connect via a link you received.
+ **Добави контакт**: за създаване на нов линк или свързване чрез получен линк за връзка.No comment provided by engineer.
@@ -314,6 +328,7 @@
**Create group**: to create a new group.
+ **Създай група**: за създаване на нова група.No comment provided by engineer.
@@ -365,7 +380,7 @@
- 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.
- - свържете се с [директория за услуги](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjd LW3%23%2F%3Fv%3D1-2%26dh %3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (БЕТА)!
+ - свържете се с [директория за услуги](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) (БЕТА)!
- потвърждениe за доставка (до 20 члена).
- по-бързо и по-стабилно.No comment provided by engineer.
@@ -383,6 +398,9 @@
- optionally notify deleted contacts.
- profile names with spaces.
- and more!
+ - по желание уведомете изтритите контакти.
+- имена на профили с интервали.
+- и още!No comment provided by engineer.
@@ -401,6 +419,7 @@
0 sec
+ 0 секtime to disappear
@@ -550,6 +569,7 @@
Add contact
+ Добави контактNo comment provided by engineer.
@@ -622,6 +642,10 @@
Всички членове на групата ще останат свързани.No comment provided by engineer.
+
+ All messages will be deleted - this cannot be undone!
+ No comment provided by engineer.
+ All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you.Всички съобщения ще бъдат изтрити - това не може да бъде отменено! Съобщенията ще бъдат изтрити САМО за вас.
@@ -629,6 +653,7 @@
All new messages from %@ will be hidden!
+ Всички нови съобщения от %@ ще бъдат скрити!No comment provided by engineer.
@@ -656,9 +681,9 @@
Позволи изчезващи съобщения само ако вашият контакт ги разрешава.No comment provided by engineer.
-
- Allow irreversible message deletion only if your contact allows it to you.
- Позволи необратимо изтриване на съобщение само ако вашият контакт го рарешава.
+
+ Allow irreversible message deletion only if your contact allows it to you. (24 hours)
+ Позволи необратимо изтриване на съобщение само ако вашият контакт го рарешава. (24 часа)No comment provided by engineer.
@@ -681,9 +706,9 @@
Разреши изпращането на изчезващи съобщения.No comment provided by engineer.
-
- Allow to irreversibly delete sent messages.
- Позволи необратимо изтриване на изпратените съобщения.
+
+ Allow to irreversibly delete sent messages. (24 hours)
+ Позволи необратимо изтриване на изпратените съобщения. (24 часа)No comment provided by engineer.
@@ -716,9 +741,9 @@
Позволи на вашите контакти да ви се обаждат.No comment provided by engineer.
-
- Allow your contacts to irreversibly delete sent messages.
- Позволи на вашите контакти да изтриват необратимо изпратените съобщения.
+
+ Allow your contacts to irreversibly delete sent messages. (24 hours)
+ Позволи на вашите контакти да изтриват необратимо изпратените съобщения. (24 часа)No comment provided by engineer.
@@ -738,10 +763,12 @@
Already connecting!
+ В процес на свързване!No comment provided by engineer.Already joining the group!
+ Вече се присъединихте към групата!No comment provided by engineer.
@@ -866,6 +893,7 @@
Bad desktop address
+ Грешен адрес на настолното устройствоNo comment provided by engineer.
@@ -880,6 +908,7 @@
Better groups
+ По-добри групиNo comment provided by engineer.
@@ -889,18 +918,34 @@
Block
+ Блокирай
+ No comment provided by engineer.
+
+
+ Block for allNo comment provided by engineer.Block group members
+ Блокиране на членове на групатаNo comment provided by engineer.Block member
+ Блокирай член
+ No comment provided by engineer.
+
+
+ Block member for all?No comment provided by engineer.Block member?
+ Блокирай члена?
+ No comment provided by engineer.
+
+
+ Blocked by adminNo comment provided by engineer.
@@ -908,9 +953,9 @@
И вие, и вашият контакт можете да добавяте реакции към съобщението.No comment provided by engineer.
-
- Both you and your contact can irreversibly delete sent messages.
- И вие, и вашият контакт можете да изтриете необратимо изпратените съобщения.
+
+ Both you and your contact can irreversibly delete sent messages. (24 hours)
+ И вие, и вашият контакт можете да изтриете необратимо изпратените съобщения. (24 часа)No comment provided by engineer.
@@ -950,11 +995,7 @@
Camera not available
- No comment provided by engineer.
-
-
- Can't delete user profile!
- Потребителският профил не може да се изтрие!
+ Камерата е неодстъпнаNo comment provided by engineer.
@@ -1070,6 +1111,7 @@
Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat.
+ Чатът е спрян. Ако вече сте използвали тази база данни на друго устройство, трябва да я прехвърлите обратно, преди да стартирате чата отново.No comment provided by engineer.
@@ -1117,6 +1159,10 @@
Изчисти разговора?No comment provided by engineer.
+
+ Clear private notes?
+ No comment provided by engineer.
+ Clear verificationИзчисти проверката
@@ -1174,6 +1220,7 @@
Connect automatically
+ Автоматично свъзрванеNo comment provided by engineer.
@@ -1183,24 +1230,31 @@
Connect to desktop
+ Свързване с настолно устройствоNo comment provided by engineer.Connect to yourself?
+ Свърване със себе си?No comment provided by engineer.Connect to yourself?
This is your own SimpleX address!
+ Свърване със себе си?
+Това е вашият личен SimpleX адрес!No comment provided by engineer.Connect to yourself?
This is your own one-time link!
+ Свърване със себе си?
+Това е вашят еднократен линк за връзка!No comment provided by engineer.Connect via contact address
+ Свързване чрез адрес за контактNo comment provided by engineer.
@@ -1215,14 +1269,17 @@ This is your own one-time link!
Connect with %@
+ Свързване с %@No comment provided by engineer.Connected desktop
+ Свързано настолно устройствоNo comment provided by engineer.Connected to desktop
+ Свързан с настолно устройствоNo comment provided by engineer.
@@ -1237,6 +1294,7 @@ This is your own one-time link!
Connecting to desktop
+ Свързване с настолно устройствоNo comment provided by engineer.
@@ -1261,6 +1319,7 @@ This is your own one-time link!
Connection terminated
+ Връзката е прекратенаNo comment provided by engineer.
@@ -1330,6 +1389,7 @@ This is your own one-time link!
Correct name to %@?
+ Поправи име на %@?No comment provided by engineer.
@@ -1344,6 +1404,7 @@ This is your own one-time link!
Create a group using a random profile.
+ Създай група с автоматично генериран профилл.No comment provided by engineer.
@@ -1358,6 +1419,7 @@ This is your own one-time link!
Create group
+ Създай групаNo comment provided by engineer.
@@ -1377,6 +1439,7 @@ This is your own one-time link!
Create profile
+ Създай профилNo comment provided by engineer.
@@ -1394,6 +1457,14 @@ This is your own one-time link!
Създай своя профилNo comment provided by engineer.
+
+ Created at
+ No comment provided by engineer.
+
+
+ Created at: %@
+ copied message info
+ Created on %@Създаден на %@
@@ -1401,6 +1472,7 @@ This is your own one-time link!
Creating link…
+ Линкът се създава…No comment provided by engineer.
@@ -1543,6 +1615,7 @@ This is your own one-time link!
Delete %lld messages?
+ Изтриване на %lld съобщения?No comment provided by engineer.
@@ -1572,6 +1645,7 @@ This is your own one-time link!
Delete and notify contact
+ Изтрий и уведоми контактNo comment provided by engineer.
@@ -1607,6 +1681,8 @@ This is your own one-time link!
Delete contact?
This cannot be undone!
+ Изтрий контакт?
+Това не може да бъде отменено!No comment provided by engineer.
@@ -1751,14 +1827,17 @@ This cannot be undone!
Desktop address
+ Адрес на настолно устройствоNo comment provided by engineer.Desktop app version %@ is not compatible with this app.
+ Версията на настолното приложение %@ не е съвместима с това приложение.No comment provided by engineer.Desktop devices
+ Настолни устройстваNo comment provided by engineer.
@@ -1853,6 +1932,7 @@ This cannot be undone!
Disconnect desktop?
+ Прекъсни връзката с настолното устройство?No comment provided by engineer.
@@ -1862,6 +1942,7 @@ This cannot be undone!
Discover via local network
+ Открий през локалната мрежаNo comment provided by engineer.
@@ -1874,6 +1955,11 @@ This cannot be undone!
ОтложиNo comment provided by engineer.
+
+ Do not send history to new members.
+ Не изпращай история на нови членове.
+ No comment provided by engineer.
+ Don't create addressНе създавай адрес
@@ -1901,7 +1987,7 @@ This cannot be undone!
Duplicate display name!
- Дублирано показвано име!
+ Дублирано име!No comment provided by engineer.
@@ -1946,6 +2032,7 @@ This cannot be undone!
Enable camera access
+ Разреши достъпа до камератаNo comment provided by engineer.
@@ -2015,6 +2102,7 @@ This cannot be undone!
Encrypted message: app is stopped
+ Криптирано съобщение: приложението е спряноnotification
@@ -2044,10 +2132,12 @@ This cannot be undone!
Encryption re-negotiation error
+ Грешка при повторно договаряне на криптиранеmessage decrypt error itemEncryption re-negotiation failed.
+ Неуспешно повторно договаряне на криптирането.No comment provided by engineer.
@@ -2062,6 +2152,7 @@ This cannot be undone!
Enter group name…
+ Въведи име на групата…No comment provided by engineer.
@@ -2081,6 +2172,7 @@ This cannot be undone!
Enter this device name…
+ Въведи името на това устройство…No comment provided by engineer.
@@ -2095,6 +2187,7 @@ This cannot be undone!
Enter your name…
+ Въведи своето име…No comment provided by engineer.
@@ -2157,6 +2250,10 @@ This cannot be undone!
Грешка при създаване на контакт с членNo comment provided by engineer.
+
+ Error creating message
+ No comment provided by engineer.
+ Error creating profile!Грешка при създаване на профил!
@@ -2244,6 +2341,7 @@ This cannot be undone!
Error opening chat
+ Грешка при отваряне на чатаNo comment provided by engineer.
@@ -2288,6 +2386,7 @@ This cannot be undone!
Error scanning code: %@
+ Грешка при сканиране на кода: %@No comment provided by engineer.
@@ -2382,6 +2481,7 @@ This cannot be undone!
Expand
+ Разшириchat item action
@@ -2416,6 +2516,7 @@ This cannot be undone!
Faster joining and more reliable messages.
+ По-бързо присъединяване и по-надеждни съобщения.No comment provided by engineer.
@@ -2515,6 +2616,7 @@ This cannot be undone!
Found desktop
+ Намерено настолно устройствоNo comment provided by engineer.
@@ -2539,6 +2641,7 @@ This cannot be undone!
Fully decentralized – visible only to members.
+ Напълно децентрализирана – видима е само за членовете.No comment provided by engineer.
@@ -2563,15 +2666,17 @@ This cannot be undone!
Group already exists
+ Групата вече съществуваNo comment provided by engineer.Group already exists!
+ Групата вече съществува!No comment provided by engineer.Group display name
- Показвано име на групата
+ Име на групатаNo comment provided by engineer.
@@ -2614,9 +2719,9 @@ This cannot be undone!
Членовете на групата могат да добавят реакции към съобщенията.No comment provided by engineer.
-
- Group members can irreversibly delete sent messages.
- Членовете на групата могат необратимо да изтриват изпратените съобщения.
+
+ Group members can irreversibly delete sent messages. (24 hours)
+ Членовете на групата могат необратимо да изтриват изпратените съобщения. (24 часа)No comment provided by engineer.
@@ -2724,6 +2829,11 @@ This cannot be undone!
ИсторияNo comment provided by engineer.
+
+ History is not sent to new members.
+ Историята не се изпраща на нови членове.
+ No comment provided by engineer.
+ How SimpleX worksКак работи SimpleX
@@ -2814,6 +2924,10 @@ This cannot be undone!
Импортиране на база данниNo comment provided by engineer.
+
+ Improved message delivery
+ No comment provided by engineer.
+ Improved privacy and securityПодобрена поверителност и сигурност
@@ -2836,6 +2950,7 @@ This cannot be undone!
Incognito groups
+ Инкогнито групиNo comment provided by engineer.
@@ -2870,6 +2985,7 @@ This cannot be undone!
Incompatible version
+ Несъвместима версияNo comment provided by engineer.
@@ -2916,6 +3032,7 @@ This cannot be undone!
Invalid QR code
+ Невалиден QR кодNo comment provided by engineer.
@@ -2923,16 +3040,24 @@ This cannot be undone!
Невалиден линк за връзкаNo comment provided by engineer.
+
+ Invalid display name!
+ Невалидно име!
+ No comment provided by engineer.
+ Invalid link
+ Невалиден линкNo comment provided by engineer.Invalid name!
+ Невалидно име!No comment provided by engineer.Invalid response
+ Невалиден отговорNo comment provided by engineer.
@@ -3026,8 +3151,13 @@ This cannot be undone!
Влез в групатаNo comment provided by engineer.
+
+ Join group conversations
+ No comment provided by engineer.
+ Join group?
+ Влез в групата?No comment provided by engineer.
@@ -3037,11 +3167,14 @@ This cannot be undone!
Join with current profile
+ Присъединяване с текущия профилNo comment provided by engineer.Join your group?
This is your link for group %@!
+ Влез в твоята група?
+Това е вашят линк за група %@!No comment provided by engineer.
@@ -3051,14 +3184,17 @@ This is your link for group %@!
Keep
+ ЗапазиNo comment provided by engineer.Keep the app open to use it from desktop
+ Дръжте приложението отворено, за да го използвате от настолното устройствоNo comment provided by engineer.Keep unused invitation?
+ Запази неизползваната покана за връзка?No comment provided by engineer.
@@ -3123,14 +3259,17 @@ This is your link for group %@!
Link mobile and desktop apps! 🔗
+ Свържете мобилни и настолни приложения! 🔗No comment provided by engineer.Linked desktop options
+ Настройки на запомнени настолни устройстваNo comment provided by engineer.Linked desktops
+ Запомнени настолни устройстваNo comment provided by engineer.
@@ -3290,6 +3429,7 @@ This is your link for group %@!
Messages from %@ will be shown!
+ Съобщенията от %@ ще бъдат показани!No comment provided by engineer.
@@ -3389,6 +3529,7 @@ This is your link for group %@!
New chat
+ Нов чатNo comment provided by engineer.
@@ -3413,7 +3554,7 @@ This is your link for group %@!
New display name
- Ново показвано име
+ Ново имеNo comment provided by engineer.
@@ -3493,6 +3634,7 @@ This is your link for group %@!
Not compatible!
+ Несъвместим!No comment provided by engineer.
@@ -3516,6 +3658,7 @@ This is your link for group %@!
OK
+ ОКNo comment provided by engineer.
@@ -3583,9 +3726,9 @@ This is your link for group %@!
Само вие можете да добавяте реакции на съобщенията.No comment provided by engineer.
-
- Only you can irreversibly delete messages (your contact can mark them for deletion).
- Само вие можете необратимо да изтриете съобщения (вашият контакт може да ги маркира за изтриване).
+
+ Only you can irreversibly delete messages (your contact can mark them for deletion). (24 hours)
+ Само вие можете необратимо да изтриете съобщения (вашият контакт може да ги маркира за изтриване). (24 часа)No comment provided by engineer.
@@ -3608,9 +3751,9 @@ This is your link for group %@!
Само вашият контакт може да добавя реакции на съобщенията.No comment provided by engineer.
-
- Only your contact can irreversibly delete messages (you can mark them for deletion).
- Само вашият контакт може необратимо да изтрие съобщения (можете да ги маркирате за изтриване).
+
+ Only your contact can irreversibly delete messages (you can mark them for deletion). (24 hours)
+ Само вашият контакт може необратимо да изтрие съобщения (можете да ги маркирате за изтриване). (24 часа)No comment provided by engineer.
@@ -3650,6 +3793,7 @@ This is your link for group %@!
Open group
+ Отвори групаNo comment provided by engineer.
@@ -3664,14 +3808,17 @@ This is your link for group %@!
Opening app…
+ Приложението се отваря…No comment provided by engineer.Or scan QR code
+ Или сканирай QR кодNo comment provided by engineer.Or show this code
+ Или покажи този кодNo comment provided by engineer.
@@ -3714,8 +3861,13 @@ This is your link for group %@!
Парола за показванеNo comment provided by engineer.
+
+ Past member %@
+ past/unknown group member
+ Paste desktop address
+ Постави адрес на настолно устройствоNo comment provided by engineer.
@@ -3723,8 +3875,13 @@ This is your link for group %@!
Постави изображениеNo comment provided by engineer.
+
+ Paste link to connect!
+ No comment provided by engineer.
+ Paste the link you received
+ Постави получения линкNo comment provided by engineer.
@@ -3765,6 +3922,8 @@ This is your link for group %@!
Please contact developers.
Error: %@
+ Моля, свържете се с разработчиците.
+Грешка: %@No comment provided by engineer.
@@ -3852,6 +4011,10 @@ Error: %@
Поверителни имена на файловеNo comment provided by engineer.
+
+ Private notes
+ name of notes to self
+ Profile and server connectionsПрофилни и сървърни връзки
@@ -3864,10 +4027,12 @@ Error: %@
Profile name
+ Име на профилаNo comment provided by engineer.Profile name:
+ Име на профила:No comment provided by engineer.
@@ -3972,6 +4137,7 @@ Error: %@
Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).
+ Прочетете повече в [Ръководство за потребителя](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).No comment provided by engineer.
@@ -4029,6 +4195,10 @@ Error: %@
Получаване чрез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.
+ Recipients see updates as you type them.Получателите виждат актуализации, докато ги въвеждате.
@@ -4121,10 +4291,12 @@ Error: %@
Repeat connection request?
+ Изпрати отново заявката за свързване?No comment provided by engineer.Repeat join request?
+ Изпрати отново заявката за присъединяване?No comment provided by engineer.
@@ -4184,6 +4356,7 @@ Error: %@
Retry
+ Опитай отновоNo comment provided by engineer.
@@ -4311,6 +4484,10 @@ Error: %@
Запазените WebRTC ICE сървъри ще бъдат премахнатиNo comment provided by engineer.
+
+ Saved message
+ message info title
+ Scan QR codeСканирай QR код
@@ -4318,6 +4495,7 @@ Error: %@
Scan QR code from desktop
+ Сканирай QR код от настолното устройствоNo comment provided by engineer.
@@ -4340,8 +4518,13 @@ Error: %@
ТърсенеNo comment provided by engineer.
+
+ Search bar accepts invitation links.
+ No comment provided by engineer.
+ Search or paste SimpleX link
+ Търсене или поставяне на SimpleX линкNo comment provided by engineer.
@@ -4449,6 +4632,11 @@ Error: %@
Изпрати от галерия или персонализирани клавиатури.No comment provided by engineer.
+
+ Send up to 100 last messages to new members.
+ Изпращане до последните 100 съобщения на нови членове.
+ No comment provided by engineer.
+ Sender cancelled file transfer.Подателят отмени прехвърлянето на файла.
@@ -4546,6 +4734,7 @@ Error: %@
Session code
+ Код на сесиятаNo comment provided by engineer.
@@ -4620,6 +4809,7 @@ Error: %@
Share this 1-time invite link
+ Сподели този еднократен линк за връзкаNo comment provided by engineer.
@@ -4749,6 +4939,7 @@ Error: %@
Start chat?
+ Стартирай чата?No comment provided by engineer.
@@ -4858,6 +5049,7 @@ Error: %@
Tap to Connect
+ Докосни за свързванеNo comment provided by engineer.
@@ -4877,10 +5069,12 @@ Error: %@
Tap to paste link
+ Докосни за поставяне на линк за връзкаNo comment provided by engineer.Tap to scan
+ Докосни за сканиранеNo comment provided by engineer.
@@ -4947,6 +5141,7 @@ It can happen because of some bug or when the connection is compromised.
The code you scanned is not a SimpleX link QR code.
+ QR кодът, който сканирахте, не е SimpleX линк за връзка.No comment provided by engineer.
@@ -5016,6 +5211,7 @@ It can happen because of some bug or when the connection is compromised.
The text you pasted is not a SimpleX link.
+ Текстът, който поставихте, не е SimpleX линк за връзка.No comment provided by engineer.
@@ -5023,16 +5219,6 @@ It can happen because of some bug or when the connection is compromised.Тема
No comment provided by engineer.
-
- There should be at least one user profile.
- Трябва да има поне един потребителски профил.
- No comment provided by engineer.
-
-
- There should be at least one visible user profile.
- Трябва да има поне един видим потребителски профил.
- No comment provided by engineer.
- These settings are for your current profile **%@**.Тези настройки са за текущия ви профил **%@**.
@@ -5060,6 +5246,12 @@ It can happen because of some bug or when the connection is compromised.
This device name
+ Името на това устройство
+ No comment provided by engineer.
+
+
+ This display name is invalid. Please choose another name.
+ Това име е невалидно. Моля, изберете друго име.No comment provided by engineer.
@@ -5074,10 +5266,12 @@ It can happen because of some bug or when the connection is compromised.
This is your own SimpleX address!
+ Това е вашият личен SimpleX адрес!No comment provided by engineer.This is your own one-time link!
+ Това е вашят еднократен линк за връзка!No comment provided by engineer.
@@ -5097,6 +5291,7 @@ It can happen because of some bug or when the connection is compromised.
To hide unwanted messages.
+ Скриване на нежелани съобщения.No comment provided by engineer.
@@ -5161,6 +5356,10 @@ You will be prompted to complete authentication before this feature is enabled.<
Опит за свързване със сървъра, използван за получаване на съобщения от този контакт.No comment provided by engineer.
+
+ Turkish interface
+ No comment provided by engineer.
+ Turn offИзключи
@@ -5178,14 +5377,25 @@ You will be prompted to complete authentication before this feature is enabled.<
Unblock
+ Отблокирай
+ No comment provided by engineer.
+
+
+ Unblock for allNo 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.
@@ -5252,10 +5462,12 @@ To connect, please ask your contact to create another connection link and check
Unlink
+ ЗабравиNo comment provided by engineer.Unlink desktop?
+ Забрави настолно устройство?No comment provided by engineer.
@@ -5278,6 +5490,11 @@ To connect, please ask your contact to create another connection link and check
НепрочетеноNo comment provided by engineer.
+
+ Up to 100 last messages are sent to new members.
+ На новите членове се изпращат до последните 100 съобщения.
+ No comment provided by engineer.
+ UpdateАктуализация
@@ -5350,6 +5567,7 @@ To connect, please ask your contact to create another connection link and check
Use from desktop
+ Използвай от настолно устройствоNo comment provided by engineer.
@@ -5364,6 +5582,7 @@ To connect, please ask your contact to create another connection link and check
Use only local notifications?
+ Използвай само локални известия?No comment provided by engineer.
@@ -5388,10 +5607,12 @@ To connect, please ask your contact to create another connection link and check
Verify code with desktop
+ Потвръди кода с настолното устройствоNo comment provided by engineer.Verify connection
+ Потвръди връзкитеNo comment provided by engineer.
@@ -5401,6 +5622,7 @@ To connect, please ask your contact to create another connection link and check
Verify connections
+ Потвръди връзкитеNo comment provided by engineer.
@@ -5415,6 +5637,7 @@ To connect, please ask your contact to create another connection link and check
Via secure quantum resistant protocol.
+ Чрез сигурен квантово устойчив протокол.No comment provided by engineer.
@@ -5442,6 +5665,11 @@ To connect, please ask your contact to create another connection link and check
Виж кода за сигурностNo comment provided by engineer.
+
+ Visible history
+ Видима история
+ chat feature
+ Voice messagesГласови съобщения
@@ -5469,6 +5697,7 @@ To connect, please ask your contact to create another connection link and check
Waiting for desktop...
+ Изчакване на настолно устройство…No comment provided by engineer.
@@ -5526,11 +5755,19 @@ To connect, please ask your contact to create another connection link and check
Когато споделяте инкогнито профил с някого, този профил ще се използва за групите, в които той ви кани.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.
+ Wrong database passphraseГрешна парола за базата данни
@@ -5563,7 +5800,7 @@ To connect, please ask your contact to create another connection link and check
You already have a chat profile with the same display name. Please choose another name.
- Вече имате чат профил със същото показвано име. Моля, изберете друго име.
+ Вече имате чат профил със същото име. Моля, изберете друго име.No comment provided by engineer.
@@ -5573,31 +5810,39 @@ To connect, please ask your contact to create another connection link and check
You are already connecting to %@.
+ Вече се свързвате с %@.No comment provided by engineer.You are already connecting via this one-time link!
+ Вече се свързвате чрез този еднократен линк за връзка!No comment provided by engineer.You are already in group %@.
+ Вече сте в група %@.No comment provided by engineer.You are already joining the group %@.
+ Вече се присъединявате към групата %@.No comment provided by engineer.You are already joining the group via this link!
+ Вие вече се присъединявате към групата чрез този линк!No comment provided by engineer.You are already joining the group via this link.
+ Вие вече се присъединявате към групата чрез този линк.No comment provided by engineer.You are already joining the group!
Repeat join request?
+ Вече се присъединихте към групата!
+Изпрати отново заявката за присъединяване?No comment provided by engineer.
@@ -5637,6 +5882,7 @@ Repeat join request?
You can make it visible to your SimpleX contacts via Settings.
+ Можете да го направите видим за вашите контакти в SimpleX чрез Настройки.No comment provided by engineer.
@@ -5681,6 +5927,7 @@ Repeat join request?
You can view invitation link again in connection details.
+ Можете да видите отново линкът за покана в подробностите за връзката.No comment provided by engineer.
@@ -5700,11 +5947,14 @@ Repeat join request?
You have already requested connection via this address!
+ Вече сте заявили връзка през този адрес!No comment provided by engineer.You have already requested connection!
Repeat connection request?
+ Вече сте направили заявката за връзка!
+Изпрати отново заявката за свързване?No comment provided by engineer.
@@ -5759,6 +6009,7 @@ Repeat connection request?
You will be connected when group link host's device is online, please wait or check later!
+ Ще бъдете свързани, когато устройството на хоста на груповата връзка е онлайн, моля, изчакайте или проверете по-късно!No comment provided by engineer.
@@ -5778,6 +6029,7 @@ Repeat connection request?
You will connect to all group members.
+ Ще се свържете с всички членове на групата.No comment provided by engineer.
@@ -5894,6 +6146,7 @@ You can cancel this connection and remove the contact (and try later with a new
Your profile
+ Вашият профилNo comment provided by engineer.
@@ -5990,6 +6243,7 @@ SimpleX сървърите не могат да видят вашия профи
and %lld other events
+ и %lld други събитияNo comment provided by engineer.
@@ -5999,6 +6253,7 @@ SimpleX сървърите не могат да видят вашия профи
author
+ авторmember role
@@ -6013,8 +6268,17 @@ SimpleX сървърите не могат да видят вашия профи
blocked
+ блокиранNo comment provided by engineer.
+
+ blocked %@
+ rcv group event chat item
+
+
+ blocked by admin
+ blocked chat item
+ boldудебелен
@@ -6135,6 +6399,10 @@ SimpleX сървърите не могат да видят вашия профи
връзка:%@connection information
+
+ contact %1$@ changed to %2$@
+ profile update event chat item
+ contact has e2e encryptionконтактът има e2e криптиране
@@ -6187,6 +6455,7 @@ SimpleX сървърите не могат да видят вашия профи
deleted contact
+ изтрит контактrcv direct event chat item
@@ -6404,6 +6673,10 @@ SimpleX сървърите не могат да видят вашия профи
членmember role
+
+ member %1$@ changed to %2$@
+ profile update event chat item
+ connectedсвързан
@@ -6526,6 +6799,14 @@ SimpleX сървърите не могат да видят вашия профи
отстранен %@rcv group event chat item
+
+ removed contact address
+ profile update event chat item
+
+
+ removed profile picture
+ profile update event chat item
+ removed youви острани
@@ -6556,6 +6837,14 @@ SimpleX сървърите не могат да видят вашия профи
изпрати лично съобщениеNo comment provided by engineer.
+
+ set new contact address
+ profile update event chat item
+
+
+ set new profile picture
+ profile update event chat item
+ starting…стартиране…
@@ -6571,18 +6860,31 @@ SimpleX сървърите не могат да видят вашия профи
този контактnotification title
+
+ unblocked %@
+ rcv group event chat item
+ unknownнеизвестенconnection info
+
+ unknown status
+ No comment provided by engineer.
+ updated group profileактуализиран профил на групатаrcv group event chat item
+
+ updated profile
+ profile update event chat item
+ v%@
+ v%@No comment provided by engineer.
@@ -6650,6 +6952,10 @@ SimpleX сървърите не могат да видят вашия профи
вие сте наблюдателNo comment provided by engineer.
+
+ you blocked %@
+ snd group event chat item
+ you changed addressпроменихте адреса
@@ -6690,6 +6996,10 @@ SimpleX сървърите не могат да видят вашия профи
споделихте еднократен инкогнито линк за връзкаchat list item description
+
+ you unblocked %@
+ snd group event chat item
+ you: вие:
@@ -6724,6 +7034,7 @@ SimpleX сървърите не могат да видят вашия профи
SimpleX uses local network access to allow using user chat profile via desktop app on the same network.
+ SimpleX използва достъп до локална мрежа, за да позволи използването на потребителския чат профил чрез настолно приложение в същата мрежа.Privacy - Local Network Usage Description
diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff
index 076c2c97fb..a376c86ad1 100644
--- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff
+++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff
@@ -89,6 +89,7 @@
%@ and %@
+ %@ a %@No comment provided by engineer.
@@ -103,6 +104,7 @@
%@ connected
+ %@ připojenNo comment provided by engineer.
@@ -212,6 +214,10 @@
%lld messages blockedNo comment provided by engineer.
+
+ %lld messages blocked by admin
+ No comment provided by engineer.
+ %lld messages marked deletedNo comment provided by engineer.
@@ -365,7 +371,7 @@
- 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.
- - připojit k [adresářová služba](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.cibule) (BETA)!
+ - připojit k [adresářová služba](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)!
- doručenky (až 20 členů).
- Rychlejší a stabilnější.No comment provided by engineer.
@@ -622,6 +628,10 @@
Všichni členové skupiny zůstanou připojeni.No comment provided by engineer.
+
+ All messages will be deleted - this cannot be undone!
+ No comment provided by engineer.
+ All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you.Všechny zprávy budou smazány – tuto akci nelze vrátit zpět! Zprávy budou smazány POUZE pro vás.
@@ -656,9 +666,9 @@
Povolte mizící zprávy, pouze pokud vám to váš kontakt dovolí.No comment provided by engineer.
-
- Allow irreversible message deletion only if your contact allows it to you.
- Povolte nevratné smazání zprávy pouze v případě, že vám to váš kontakt dovolí.
+
+ Allow irreversible message deletion only if your contact allows it to you. (24 hours)
+ Povolte nevratné smazání zprávy pouze v případě, že vám to váš kontakt dovolí. (24 hodin)No comment provided by engineer.
@@ -681,9 +691,9 @@
Povolit odesílání mizících zpráv.No comment provided by engineer.
-
- Allow to irreversibly delete sent messages.
- Povolit nevratné smazání odeslaných zpráv.
+
+ Allow to irreversibly delete sent messages. (24 hours)
+ Povolit nevratné smazání odeslaných zpráv. (24 hodin)No comment provided by engineer.
@@ -716,9 +726,9 @@
Povolte svým kontaktům vám volat.No comment provided by engineer.
-
- Allow your contacts to irreversibly delete sent messages.
- Umožněte svým kontaktům nevratně odstranit odeslané zprávy.
+
+ Allow your contacts to irreversibly delete sent messages. (24 hours)
+ Umožněte svým kontaktům nevratně odstranit odeslané zprávy. (24 hodin)No comment provided by engineer.
@@ -891,6 +901,10 @@
BlockNo comment provided by engineer.
+
+ Block for all
+ No comment provided by engineer.
+ Block group membersNo comment provided by engineer.
@@ -899,18 +913,26 @@
Block memberNo comment provided by engineer.
+
+ Block member for all?
+ No comment provided by engineer.
+ Block member?No comment provided by engineer.
+
+ Blocked by admin
+ No comment provided by engineer.
+ Both you and your contact can add message reactions.Vy i váš kontakt můžete přidávat reakce na zprávy.No comment provided by engineer.
-
- Both you and your contact can irreversibly delete sent messages.
- Vy i váš kontakt můžete nevratně mazat odeslané zprávy.
+
+ Both you and your contact can irreversibly delete sent messages. (24 hours)
+ Vy i váš kontakt můžete nevratně mazat odeslané zprávy. (24 hodin)No comment provided by engineer.
@@ -952,11 +974,6 @@
Camera not availableNo comment provided by engineer.
-
- Can't delete user profile!
- Nemohu smazat uživatelský profil!
- No comment provided by engineer.
- Can't invite contact!Nelze pozvat kontakt!
@@ -1117,6 +1134,10 @@
Vyčistit konverzaci?No comment provided by engineer.
+
+ Clear private notes?
+ No comment provided by engineer.
+ Clear verificationZrušte ověření
@@ -1394,6 +1415,14 @@ This is your own one-time link!
Vytvořte si profilNo comment provided by engineer.
+
+ Created at
+ No comment provided by engineer.
+
+
+ Created at: %@
+ copied message info
+ Created on %@Vytvořeno na %@
@@ -1874,6 +1903,10 @@ This cannot be undone!
Udělat pozdějiNo comment provided by engineer.
+
+ Do not send history to new members.
+ No comment provided by engineer.
+ Don't create addressNevytvářet adresu
@@ -2157,6 +2190,10 @@ This cannot be undone!
Chyba vytvoření kontaktu členaNo comment provided by engineer.
+
+ Error creating message
+ No comment provided by engineer.
+ Error creating profile!Chyba při vytváření profilu!
@@ -2614,9 +2651,9 @@ This cannot be undone!
Členové skupin mohou přidávat reakce na zprávy.No comment provided by engineer.
-
- Group members can irreversibly delete sent messages.
- Členové skupiny mohou nevratně mazat odeslané zprávy.
+
+ Group members can irreversibly delete sent messages. (24 hours)
+ Členové skupiny mohou nevratně mazat odeslané zprávy. (24 hodin)No comment provided by engineer.
@@ -2724,6 +2761,10 @@ This cannot be undone!
HistorieNo comment provided by engineer.
+
+ History is not sent to new members.
+ No comment provided by engineer.
+ How SimpleX worksJak SimpleX funguje
@@ -2814,6 +2855,10 @@ This cannot be undone!
Import databázeNo comment provided by engineer.
+
+ Improved message delivery
+ No comment provided by engineer.
+ Improved privacy and securityVylepšená ochrana soukromí a zabezpečení
@@ -2923,6 +2968,10 @@ This cannot be undone!
Neplatný odkaz na spojeníNo comment provided by engineer.
+
+ Invalid display name!
+ No comment provided by engineer.
+ Invalid linkNo comment provided by engineer.
@@ -3026,6 +3075,10 @@ This cannot be undone!
Připojit ke skupiněNo comment provided by engineer.
+
+ Join group conversations
+ No comment provided by engineer.
+ Join group?No comment provided by engineer.
@@ -3583,9 +3636,9 @@ This is your link for group %@!
Reakce na zprávy můžete přidávat pouze vy.No comment provided by engineer.
-
- Only you can irreversibly delete messages (your contact can mark them for deletion).
- Nevratně mazat zprávy můžete pouze vy (váš kontakt je může označit ke smazání).
+
+ Only you can irreversibly delete messages (your contact can mark them for deletion). (24 hours)
+ Nevratně mazat zprávy můžete pouze vy (váš kontakt je může označit ke smazání). (24 hodin)No comment provided by engineer.
@@ -3608,9 +3661,9 @@ This is your link for group %@!
Reakce na zprávy může přidávat pouze váš kontakt.No comment provided by engineer.
-
- Only your contact can irreversibly delete messages (you can mark them for deletion).
- Nevratně mazat zprávy může pouze váš kontakt (vy je můžete označit ke smazání).
+
+ Only your contact can irreversibly delete messages (you can mark them for deletion). (24 hours)
+ Nevratně mazat zprávy může pouze váš kontakt (vy je můžete označit ke smazání). (24 hodin)No comment provided by engineer.
@@ -3714,6 +3767,10 @@ This is your link for group %@!
Heslo k zobrazeníNo comment provided by engineer.
+
+ Past member %@
+ past/unknown group member
+ Paste desktop addressNo comment provided by engineer.
@@ -3723,6 +3780,10 @@ This is your link for group %@!
Vložit obrázekNo comment provided by engineer.
+
+ Paste link to connect!
+ No comment provided by engineer.
+ Paste the link you receivedNo comment provided by engineer.
@@ -3852,6 +3913,10 @@ Error: %@
Soukromé názvy souborůNo comment provided by engineer.
+
+ Private notes
+ name of notes to self
+ Profile and server connectionsProfil a připojení k serveru
@@ -4029,6 +4094,10 @@ Error: %@
Příjem přesNo 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.
+ Recipients see updates as you type them.Příjemci uvidí aktualizace během jejich psaní.
@@ -4311,6 +4380,10 @@ Error: %@
Uložené servery WebRTC ICE budou odstraněnyNo comment provided by engineer.
+
+ Saved message
+ message info title
+ Scan QR codeSkenovat QR kód
@@ -4340,6 +4413,10 @@ Error: %@
HledatNo comment provided by engineer.
+
+ Search bar accepts invitation links.
+ No comment provided by engineer.
+ Search or paste SimpleX linkNo comment provided by engineer.
@@ -4449,6 +4526,10 @@ Error: %@
Odeslat je z galerie nebo vlastní klávesnice.No comment provided by engineer.
+
+ Send up to 100 last messages to new members.
+ No comment provided by engineer.
+ Sender cancelled file transfer.Odesílatel zrušil přenos souboru.
@@ -5023,16 +5104,6 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
TémaNo comment provided by engineer.
-
- There should be at least one user profile.
- Měl by tam být alespoň jeden uživatelský profil.
- No comment provided by engineer.
-
-
- There should be at least one visible user profile.
- Měl by tam být alespoň jeden viditelný uživatelský profil.
- No comment provided by engineer.
- These settings are for your current profile **%@**.Toto nastavení je pro váš aktuální profil **%@**.
@@ -5062,6 +5133,10 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
This device nameNo 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.Tato skupina má více než %lld členů, potvrzení o doručení nejsou odesílány.
@@ -5161,6 +5236,10 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření.
Pokus o připojení k serveru používanému pro příjem zpráv od tohoto kontaktu.No comment provided by engineer.
+
+ Turkish interface
+ No comment provided by engineer.
+ Turn offVypnout
@@ -5180,10 +5259,18 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření.
UnblockNo comment provided by engineer.
+
+ Unblock for all
+ No comment provided by engineer.
+ Unblock memberNo comment provided by engineer.
+
+ Unblock member for all?
+ No comment provided by engineer.
+ Unblock member?No comment provided by engineer.
@@ -5278,6 +5365,10 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
NepřečtenýNo comment provided by engineer.
+
+ Up to 100 last messages are sent to new members.
+ No comment provided by engineer.
+ UpdateAktualizovat
@@ -5442,6 +5533,10 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
Zobrazení bezpečnostního kóduNo comment provided by engineer.
+
+ Visible history
+ chat feature
+ Voice messagesHlasové zprávy
@@ -5526,11 +5621,19 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
Pokud s někým sdílíte inkognito profil, bude tento profil použit pro skupiny, do kterých vás pozve.No comment provided by engineer.
+
+ With encrypted files and media.
+ No comment provided by engineer.
+ With optional welcome message.S volitelnou uvítací zprávou.No comment provided by engineer.
+
+ With reduced battery usage.
+ No comment provided by engineer.
+ Wrong database passphraseŠpatná přístupová fráze k databázi
@@ -6015,6 +6118,14 @@ Servery SimpleX nevidí váš profil.
blockedNo comment provided by engineer.
+
+ blocked %@
+ rcv group event chat item
+
+
+ blocked by admin
+ blocked chat item
+ boldtučně
@@ -6135,6 +6246,10 @@ Servery SimpleX nevidí váš profil.
připojení:%@connection information
+
+ contact %1$@ changed to %2$@
+ profile update event chat item
+ contact has e2e encryptionkontakt má šifrování e2e
@@ -6403,6 +6518,10 @@ Servery SimpleX nevidí váš profil.
členmember role
+
+ member %1$@ changed to %2$@
+ profile update event chat item
+ connectedpřipojeno
@@ -6525,6 +6644,14 @@ Servery SimpleX nevidí váš profil.
odstraněno %@rcv group event chat item
+
+ removed contact address
+ profile update event chat item
+
+
+ removed profile picture
+ profile update event chat item
+ removed youodstranil vás
@@ -6555,6 +6682,14 @@ Servery SimpleX nevidí váš profil.
odeslat přímou zprávuNo comment provided by engineer.
+
+ set new contact address
+ profile update event chat item
+
+
+ set new profile picture
+ profile update event chat item
+ starting…začíná…
@@ -6570,16 +6705,28 @@ Servery SimpleX nevidí váš profil.
tento kontaktnotification title
+
+ unblocked %@
+ rcv group event chat item
+ unknownneznámýconnection info
+
+ unknown status
+ No comment provided by engineer.
+ updated group profileaktualizoval profil skupinyrcv group event chat item
+
+ updated profile
+ profile update event chat item
+ v%@No comment provided by engineer.
@@ -6649,6 +6796,10 @@ Servery SimpleX nevidí váš profil.
jste pozorovatelNo comment provided by engineer.
+
+ you blocked %@
+ snd group event chat item
+ you changed addresszměnili jste adresu
@@ -6689,6 +6840,10 @@ Servery SimpleX nevidí váš profil.
sdíleli jste jednorázový odkaz inkognitochat list item description
+
+ you unblocked %@
+ snd group event chat item
+ you: vy:
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 2b877c32d2..54b6088d96 100644
--- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff
+++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff
@@ -49,7 +49,7 @@
## History
- ## Vergangenheit
+ ## Nachrichtenverlaufcopied message info
@@ -217,6 +217,10 @@
%lld Nachrichten blockiertNo comment provided by engineer.
+
+ %lld messages blocked by admin
+ No comment provided by engineer.
+ %lld messages marked deleted%lld Nachrichten als gelöscht markiert
@@ -314,15 +318,17 @@
**Add contact**: to create a new invitation link, or connect via a link you received.
+ **Kontakt hinzufügen**: Um einen neuen Einladungslink zu erstellen oder eine Verbindung über einen Link herzustellen, den Sie erhalten haben.No comment provided by engineer.**Add new contact**: to create your one-time QR Code or link for your contact.
- **Fügen Sie einen neuen Kontakt hinzu**: Erzeugen Sie einen Einmal-QR-Code oder -Link für Ihren Kontakt.
+ **Neuen Kontakt hinzufügen**: Um einen Einmal-QR-Code oder -Link für Ihren Kontakt zu erzeugen.No comment provided by engineer.**Create group**: to create a new group.
+ **Gruppe erstellen**: Um eine neue Gruppe zu erstellen.No comment provided by engineer.
@@ -401,9 +407,9 @@
- voice messages up to 5 minutes.
- custom time to disappear.
- editing history.
- - Bis zu 5 Minuten lange Sprachnachrichten.
-- Zeitdauer für verschwindende Nachrichten anpassen.
-- Nachrichten-Historie bearbeiten.
+ - Bis zu 5 Minuten lange Sprachnachrichten
+- Zeitdauer für verschwindende Nachrichten anpassen
+- Nachrichtenverlauf bearbeitenNo comment provided by engineer.
@@ -507,12 +513,12 @@
Abort changing address
- Wechsel der Adresse abbrechen
+ Wechsel der Empfängeradresse abbrechenNo comment provided by engineer.Abort changing address?
- Wechsel der Adresse abbrechen?
+ Wechsel der Empfängeradresse abbrechen?No comment provided by engineer.
@@ -558,11 +564,12 @@
Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.
- Fügen Sie die Adresse zu Ihrem Profil hinzu, damit Ihre Kontakte sie mit anderen Personen teilen können. Es wird eine Profilaktualisierung an Ihre Kontakte gesendet.
+ Fügen Sie die Adresse Ihrem Profil hinzu, damit Ihre Kontakte sie mit anderen Personen teilen können. Es wird eine Profilaktualisierung an Ihre Kontakte gesendet.No comment provided by engineer.Add contact
+ Kontakt hinzufügenNo comment provided by engineer.
@@ -602,7 +609,7 @@
Address change will be aborted. Old receiving address will be used.
- Der Wechsel der Adresse wird abgebrochen. Die bisherige Adresse wird weiter verwendet.
+ Der Wechsel der Empfängeradresse wird abgebrochen. Die bisherige Adresse wird weiter verwendet.No comment provided by engineer.
@@ -635,6 +642,10 @@
Alle Gruppenmitglieder bleiben verbunden.No comment provided by engineer.
+
+ All messages will be deleted - this cannot be undone!
+ No comment provided by engineer.
+ All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you.Alle Nachrichten werden gelöscht - dies kann nicht rückgängig gemacht werden! Die Nachrichten werden NUR bei Ihnen gelöscht.
@@ -667,12 +678,12 @@
Allow disappearing messages only if your contact allows it to you.
- Erlauben Sie verschwindende Nachrichten nur dann, wenn es Ihnen Ihr Kontakt ebenfalls erlaubt.
+ Erlauben Sie verschwindende Nachrichten nur dann, wenn es Ihr Kontakt ebenfalls erlaubt.No comment provided by engineer.
-
- Allow irreversible message deletion only if your contact allows it to you.
- Erlauben Sie das unwiederbringliche Löschen von Nachrichten nur dann, wenn es Ihnen Ihr Kontakt ebenfalls erlaubt.
+
+ Allow irreversible message deletion only if your contact allows it to you. (24 hours)
+ Erlauben Sie das unwiederbringliche Löschen von Nachrichten nur dann, wenn es Ihnen Ihr Kontakt ebenfalls erlaubt. (24 Stunden)No comment provided by engineer.
@@ -695,9 +706,9 @@
Das Senden von verschwindenden Nachrichten erlauben.No comment provided by engineer.
-
- Allow to irreversibly delete sent messages.
- Unwiederbringliches löschen von gesendeten Nachrichten erlauben.
+
+ Allow to irreversibly delete sent messages. (24 hours)
+ Unwiederbringliches löschen von gesendeten Nachrichten erlauben. (24 Stunden)No comment provided by engineer.
@@ -730,9 +741,9 @@
Erlaubt Ihren Kontakten Sie anzurufen.No comment provided by engineer.
-
- Allow your contacts to irreversibly delete sent messages.
- Erlauben Sie Ihren Kontakten gesendete Nachrichten unwiederbringlich zu löschen.
+
+ Allow your contacts to irreversibly delete sent messages. (24 hours)
+ Erlauben Sie Ihren Kontakten gesendete Nachrichten unwiederbringlich zu löschen. (24 Stunden)No comment provided by engineer.
@@ -910,6 +921,10 @@
BlockierenNo comment provided by engineer.
+
+ Block for all
+ No comment provided by engineer.
+ Block group membersGruppenmitglieder blockieren
@@ -920,19 +935,27 @@
Mitglied blockierenNo comment provided by engineer.
+
+ Block member for all?
+ No comment provided by engineer.
+ Block member?Mitglied blockieren?No comment provided by engineer.
+
+ Blocked by admin
+ No comment provided by engineer.
+ Both you and your contact can add message reactions.Sowohl Sie, als auch Ihr Kontakt können Reaktionen auf Nachrichten geben.No comment provided by engineer.
-
- Both you and your contact can irreversibly delete sent messages.
- Sowohl Ihr Kontakt, als auch Sie können gesendete Nachrichten unwiederbringlich löschen.
+
+ Both you and your contact can irreversibly delete sent messages. (24 hours)
+ Sowohl Ihr Kontakt, als auch Sie können gesendete Nachrichten unwiederbringlich löschen. (24 Stunden)No comment provided by engineer.
@@ -972,11 +995,7 @@
Camera not available
- No comment provided by engineer.
-
-
- Can't delete user profile!
- Das Benutzerprofil kann nicht gelöscht werden!
+ Kamera nicht verfügbarNo comment provided by engineer.
@@ -1092,6 +1111,7 @@
Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat.
+ Der Chat ist angehalten. Wenn Sie diese Datenbank bereits auf einem anderen Gerät genutzt haben, sollten Sie diese vor dem Starten des Chats wieder zurückspielen.No comment provided by engineer.
@@ -1139,6 +1159,10 @@
Unterhaltung löschen?No comment provided by engineer.
+
+ Clear private notes?
+ No comment provided by engineer.
+ Clear verificationÜberprüfung zurücknehmen
@@ -1217,7 +1241,7 @@
Connect to yourself?
This is your own SimpleX address!
- Mit Ihnen selbst verbinden?
+ Sich mit Ihnen selbst verbinden?
Das ist Ihre eigene SimpleX-Adresse!No comment provided by engineer.
@@ -1433,6 +1457,14 @@ Das ist Ihr eigener Einmal-Link!
Erstellen Sie Ihr ProfilNo comment provided by engineer.
+
+ Created at
+ No comment provided by engineer.
+
+
+ Created at: %@
+ copied message info
+ Created on %@Erstellt am %@
@@ -1440,6 +1472,7 @@ Das ist Ihr eigener Einmal-Link!
Creating link…
+ Link wird erstellt…No comment provided by engineer.
@@ -1869,7 +1902,7 @@ Das kann nicht rückgängig gemacht werden!
Disappearing messages
- verschwindende Nachrichten
+ Verschwindende Nachrichtenchat feature
@@ -1922,6 +1955,11 @@ Das kann nicht rückgängig gemacht werden!
Später wiederholenNo comment provided by engineer.
+
+ Do not send history to new members.
+ Den Nachrichtenverlauf nicht an neue Mitglieder senden.
+ No comment provided by engineer.
+ Don't create addressKeine Adresse erstellt
@@ -1994,6 +2032,7 @@ Das kann nicht rückgängig gemacht werden!
Enable camera access
+ Kamera-Zugriff aktivierenNo comment provided by engineer.
@@ -2063,6 +2102,7 @@ Das kann nicht rückgängig gemacht werden!
Encrypted message: app is stopped
+ Verschlüsselte Nachricht: Die App ist angehaltennotification
@@ -2177,7 +2217,7 @@ Das kann nicht rückgängig gemacht werden!
Error changing address
- Fehler beim Wechseln der Adresse
+ Fehler beim Wechseln der EmpfängeradresseNo comment provided by engineer.
@@ -2210,6 +2250,10 @@ Das kann nicht rückgängig gemacht werden!
Fehler beim Anlegen eines Mitglied-KontaktesNo comment provided by engineer.
+
+ Error creating message
+ No comment provided by engineer.
+ Error creating profile!Fehler beim Erstellen des Profils!
@@ -2297,6 +2341,7 @@ Das kann nicht rückgängig gemacht werden!
Error opening chat
+ Fehler beim Öffnen des ChatsNo comment provided by engineer.
@@ -2341,6 +2386,7 @@ Das kann nicht rückgängig gemacht werden!
Error scanning code: %@
+ Fehler beim Scannen des Codes: %@No comment provided by engineer.
@@ -2673,9 +2719,9 @@ Das kann nicht rückgängig gemacht werden!
Gruppenmitglieder können eine Reaktion auf Nachrichten geben.No comment provided by engineer.
-
- Group members can irreversibly delete sent messages.
- Gruppenmitglieder können gesendete Nachrichten unwiederbringlich löschen.
+
+ Group members can irreversibly delete sent messages. (24 hours)
+ Gruppenmitglieder können gesendete Nachrichten unwiederbringlich löschen. (24 Stunden)No comment provided by engineer.
@@ -2780,7 +2826,12 @@ Das kann nicht rückgängig gemacht werden!
History
- Vergangenheit
+ Nachrichtenverlauf
+ No comment provided by engineer.
+
+
+ History is not sent to new members.
+ Der Nachrichtenverlauf wird nicht an neue Gruppenmitglieder gesendet.No comment provided by engineer.
@@ -2873,6 +2924,10 @@ Das kann nicht rückgängig gemacht werden!
Datenbank importierenNo comment provided by engineer.
+
+ Improved message delivery
+ No comment provided by engineer.
+ Improved privacy and securityVerbesserte Privatsphäre und Sicherheit
@@ -2977,6 +3032,7 @@ Das kann nicht rückgängig gemacht werden!
Invalid QR code
+ Ungültiger QR-CodeNo comment provided by engineer.
@@ -2984,8 +3040,14 @@ Das kann nicht rückgängig gemacht werden!
Ungültiger VerbindungslinkNo comment provided by engineer.
+
+ Invalid display name!
+ Ungültiger Anzeigename!
+ No comment provided by engineer.
+ Invalid link
+ Ungültiger LinkNo comment provided by engineer.
@@ -2995,6 +3057,7 @@ Das kann nicht rückgängig gemacht werden!
Invalid response
+ Ungültige ReaktionNo comment provided by engineer.
@@ -3088,6 +3151,10 @@ Das kann nicht rückgängig gemacht werden!
Treten Sie der Gruppe beiNo comment provided by engineer.
+
+ Join group conversations
+ No comment provided by engineer.
+ Join group?Der Gruppe beitreten?
@@ -3117,6 +3184,7 @@ Das ist Ihr Link für die Gruppe %@!
Keep
+ BehaltenNo comment provided by engineer.
@@ -3126,6 +3194,7 @@ Das ist Ihr Link für die Gruppe %@!
Keep unused invitation?
+ Nicht genutzte Einladung behalten?No comment provided by engineer.
@@ -3260,7 +3329,7 @@ Das ist Ihr Link für die Gruppe %@!
Make sure WebRTC ICE server addresses are in correct format, line separated and are not duplicated.
- Stellen Sie sicher, dass die WebRTC ICE-Server Adressen das richtige Format haben, zeilenweise angeordnet und nicht doppelt vorhanden sind.
+ Stellen Sie sicher, dass die WebRTC ICE-Server Adressen das richtige Format haben, zeilenweise getrennt und nicht doppelt vorhanden sind.No comment provided by engineer.
@@ -3460,6 +3529,7 @@ Das ist Ihr Link für die Gruppe %@!
New chat
+ Neuer ChatNo comment provided by engineer.
@@ -3549,7 +3619,7 @@ Das ist Ihr Link für die Gruppe %@!
No history
- Keine Vergangenheit
+ Kein NachrichtenverlaufNo comment provided by engineer.
@@ -3588,6 +3658,7 @@ Das ist Ihr Link für die Gruppe %@!
OK
+ OKNo comment provided by engineer.
@@ -3655,9 +3726,9 @@ Das ist Ihr Link für die Gruppe %@!
Nur Sie können Reaktionen auf Nachrichten geben.No comment provided by engineer.
-
- Only you can irreversibly delete messages (your contact can mark them for deletion).
- Nur Sie können Nachrichten unwiederbringlich löschen (Ihr Kontakt kann sie zum Löschen markieren).
+
+ Only you can irreversibly delete messages (your contact can mark them for deletion). (24 hours)
+ Nur Sie können Nachrichten unwiederbringlich löschen (Ihr Kontakt kann sie zum Löschen markieren). (24 Stunden)No comment provided by engineer.
@@ -3680,9 +3751,9 @@ Das ist Ihr Link für die Gruppe %@!
Nur Ihr Kontakt kann Reaktionen auf Nachrichten geben.No comment provided by engineer.
-
- Only your contact can irreversibly delete messages (you can mark them for deletion).
- Nur Ihr Kontakt kann Nachrichten unwiederbringlich löschen (Sie können sie zum Löschen markieren).
+
+ Only your contact can irreversibly delete messages (you can mark them for deletion). (24 hours)
+ Nur Ihr Kontakt kann Nachrichten unwiederbringlich löschen (Sie können sie zum Löschen markieren). (24 Stunden)No comment provided by engineer.
@@ -3737,14 +3808,17 @@ Das ist Ihr Link für die Gruppe %@!
Opening app…
+ App wird geöffnet…No comment provided by engineer.Or scan QR code
+ Oder den QR-Code scannenNo comment provided by engineer.Or show this code
+ Oder diesen QR-Code anzeigenNo comment provided by engineer.
@@ -3787,6 +3861,10 @@ Das ist Ihr Link für die Gruppe %@!
Passwort anzeigenNo comment provided by engineer.
+
+ Past member %@
+ past/unknown group member
+ Paste desktop addressDesktop-Adresse einfügen
@@ -3797,8 +3875,13 @@ Das ist Ihr Link für die Gruppe %@!
Bild einfügenNo comment provided by engineer.
+
+ Paste link to connect!
+ No comment provided by engineer.
+ Paste the link you received
+ Fügen Sie den erhaltenen Link einNo comment provided by engineer.
@@ -3839,6 +3922,8 @@ Das ist Ihr Link für die Gruppe %@!
Please contact developers.
Error: %@
+ Bitte nehmen Sie Kontakt mit den Entwicklern auf.
+Fehler: %@No comment provided by engineer.
@@ -3926,6 +4011,10 @@ Error: %@
Neutrale DateinamenNo comment provided by engineer.
+
+ Private notes
+ name of notes to self
+ Profile and server connectionsProfil und Serververbindungen
@@ -4048,6 +4137,7 @@ Error: %@
Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).
+ Lesen Sie mehr dazu im [Benutzerhandbuch](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).No comment provided by engineer.
@@ -4105,6 +4195,10 @@ Error: %@
Empfangen überNo 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.
+ Recipients see updates as you type them.Die Empfänger sehen Nachrichtenaktualisierungen, während Sie sie eingeben.
@@ -4262,6 +4356,7 @@ Error: %@
Retry
+ WiederholenNo comment provided by engineer.
@@ -4389,6 +4484,10 @@ Error: %@
Gespeicherte WebRTC ICE-Server werden entferntNo comment provided by engineer.
+
+ Saved message
+ message info title
+ Scan QR codeQR-Code scannen
@@ -4419,8 +4518,13 @@ Error: %@
SucheNo comment provided by engineer.
+
+ Search bar accepts invitation links.
+ No comment provided by engineer.
+ Search or paste SimpleX link
+ Suchen oder fügen Sie den SimpleX-Link einNo comment provided by engineer.
@@ -4528,6 +4632,11 @@ Error: %@
Senden Sie diese aus dem Fotoalbum oder von individuellen Tastaturen.No comment provided by engineer.
+
+ Send up to 100 last messages to new members.
+ Bis zu 100 der letzten Nachrichten an neue Gruppenmitglieder senden.
+ No comment provided by engineer.
+ Sender cancelled file transfer.Der Absender hat die Dateiübertragung abgebrochen.
@@ -4700,6 +4809,7 @@ Error: %@
Share this 1-time invite link
+ Teilen Sie diesen Einmal-EinladungslinkNo comment provided by engineer.
@@ -4829,6 +4939,7 @@ Error: %@
Start chat?
+ Chat starten?No comment provided by engineer.
@@ -4938,12 +5049,12 @@ Error: %@
Tap to Connect
- Zum Verbinden antippen
+ Zum Verbinden tippenNo comment provided by engineer.Tap to activate profile.
- Tippen Sie auf das Profil um es zu aktivieren.
+ Zum Aktivieren des Profils tippen.No comment provided by engineer.
@@ -4953,20 +5064,22 @@ Error: %@
Tap to join incognito
- Tippen, um Inkognito beizutreten
+ Zum Inkognito beitreten tippenNo comment provided by engineer.Tap to paste link
+ Zum Link einfügen tippenNo comment provided by engineer.Tap to scan
+ Zum Scannen tippenNo comment provided by engineer.Tap to start a new chat
- Tippen, um einen neuen Chat zu starten
+ Zum Starten eines neuen Chats tippenNo comment provided by engineer.
@@ -5028,6 +5141,7 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
The code you scanned is not a SimpleX link QR code.
+ Der von Ihnen gescannte Code ist kein SimpleX-Link-QR-Code.No comment provided by engineer.
@@ -5092,11 +5206,12 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
The servers for new connections of your current chat profile **%@**.
- Server der neuen Verbindungen von Ihrem aktuellen Chat-Profil **%@**.
+ Mögliche Server für neue Verbindungen von Ihrem aktuellen Chat-Profil **%@**.No comment provided by engineer.The text you pasted is not a SimpleX link.
+ Der von Ihnen eingefügte Text ist kein SimpleX-Link.No comment provided by engineer.
@@ -5104,16 +5219,6 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
DesignNo comment provided by engineer.
-
- There should be at least one user profile.
- Es muss mindestens ein Benutzer-Profil vorhanden sein.
- No comment provided by engineer.
-
-
- There should be at least one visible user profile.
- Es muss mindestens ein sichtbares Benutzer-Profil vorhanden sein.
- No comment provided by engineer.
- These settings are for your current profile **%@**.Diese Einstellungen betreffen Ihr aktuelles Profil **%@**.
@@ -5144,6 +5249,11 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
Dieser GerätenameNo comment provided by engineer.
+
+ This display name is invalid. Please choose another name.
+ Der Anzeigename ist ungültig. Bitte wählen Sie einen anderen Namen.
+ No comment provided by engineer.
+ This group has over %lld members, delivery receipts are not sent.Es werden keine Empfangsbestätigungen gesendet, da diese Gruppe über %lld Mitglieder hat.
@@ -5246,6 +5356,10 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
Versuche die Verbindung mit dem Server aufzunehmen, der für den Empfang von Nachrichten mit diesem Kontakt genutzt wird.No comment provided by engineer.
+
+ Turkish interface
+ No comment provided by engineer.
+ Turn offAbschalten
@@ -5266,11 +5380,19 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
FreigebenNo comment provided by engineer.
+
+ Unblock for all
+ No comment provided by engineer.
+ Unblock memberMitglied freigebenNo comment provided by engineer.
+
+ Unblock member for all?
+ No comment provided by engineer.
+ Unblock member?Mitglied freigeben?
@@ -5368,6 +5490,11 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
UngelesenNo comment provided by engineer.
+
+ Up to 100 last messages are sent to new members.
+ Bis zu 100 der letzten Nachrichten werden an neue Mitglieder gesendet.
+ No comment provided by engineer.
+ UpdateAktualisieren
@@ -5455,6 +5582,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
Use only local notifications?
+ Nur lokale Benachrichtigungen nutzen?No comment provided by engineer.
@@ -5537,6 +5665,11 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
Schauen Sie sich den Sicherheitscode anNo comment provided by engineer.
+
+ Visible history
+ Sichtbarer Nachrichtenverlauf
+ chat feature
+ Voice messagesSprachnachrichten
@@ -5622,11 +5755,19 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
Wenn Sie ein Inkognito-Profil mit Jemandem teilen, wird dieses Profil auch für die Gruppen verwendet, für die Sie von diesem Kontakt eingeladen werden.No comment provided by engineer.
+
+ With encrypted files and media.
+ No comment provided by engineer.
+ With optional welcome message.Mit optionaler Begrüßungsmeldung.No comment provided by engineer.
+
+ With reduced battery usage.
+ No comment provided by engineer.
+ Wrong database passphraseFalsches Datenbank-Passwort
@@ -5644,7 +5785,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
You
- Ihre Daten
+ ProfilNo comment provided by engineer.
@@ -5741,6 +5882,7 @@ Verbindungsanfrage wiederholen?
You can make it visible to your SimpleX contacts via Settings.
+ Sie können sie über Einstellungen für Ihre SimpleX-Kontakte sichtbar machen.No comment provided by engineer.
@@ -5785,6 +5927,7 @@ Verbindungsanfrage wiederholen?
You can view invitation link again in connection details.
+ Den Einladungslink können Sie in den Details der Verbindung nochmals sehen.No comment provided by engineer.
@@ -5896,12 +6039,12 @@ Verbindungsanfrage wiederholen?
You will stop receiving messages from this group. Chat history will be preserved.
- Sie werden von dieser Gruppe keine Nachrichten mehr erhalten. Der Chatverlauf wird beibehalten.
+ Sie werden von dieser Gruppe keine Nachrichten mehr erhalten. Der Nachrichtenverlauf wird beibehalten.No comment provided by engineer.You won't lose your contacts if you later delete your address.
- Sie werden Ihre mit dieser Adresse verbundenen Kontakte nicht verlieren, wenn Sie diese Adresse später löschen.
+ Sie werden Ihre damit verbundenen Kontakte nicht verlieren, wenn Sie diese Adresse später löschen.No comment provided by engineer.
@@ -6040,7 +6183,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.
Your settings
- Ihre Einstellungen
+ EinstellungenNo comment provided by engineer.
@@ -6128,6 +6271,14 @@ SimpleX-Server können Ihr Profil nicht einsehen.
blockiertNo comment provided by engineer.
+
+ blocked %@
+ rcv group event chat item
+
+
+ blocked by admin
+ blocked chat item
+ boldfett
@@ -6155,7 +6306,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.
changed address for you
- wechselte die Adresse für Sie
+ Wechselte die Empfängeradresse von Ihnenchat item text
@@ -6170,12 +6321,12 @@ SimpleX-Server können Ihr Profil nicht einsehen.
changing address for %@…
- Adresse von %@ wechseln…
+ Empfängeradresse für %@ wechseln wird gestartet…chat item textchanging address…
- Wechsel der Adresse…
+ Wechsel der Empfängeradresse wurde gestartet…chat item text
@@ -6248,6 +6399,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.
Verbindung:%@connection information
+
+ contact %1$@ changed to %2$@
+ profile update event chat item
+ contact has e2e encryptionKontakt nutzt E2E-Verschlüsselung
@@ -6518,6 +6673,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.
Mitgliedmember role
+
+ member %1$@ changed to %2$@
+ profile update event chat item
+ connectedist der Gruppe beigetreten
@@ -6640,6 +6799,14 @@ SimpleX-Server können Ihr Profil nicht einsehen.
hat %@ aus der Gruppe entferntrcv group event chat item
+
+ removed contact address
+ profile update event chat item
+
+
+ removed profile picture
+ profile update event chat item
+ removed youhat Sie aus der Gruppe entfernt
@@ -6670,6 +6837,14 @@ SimpleX-Server können Ihr Profil nicht einsehen.
Direktnachricht sendenNo comment provided by engineer.
+
+ set new contact address
+ profile update event chat item
+
+
+ set new profile picture
+ profile update event chat item
+ starting…Verbindung wird gestartet…
@@ -6685,16 +6860,28 @@ SimpleX-Server können Ihr Profil nicht einsehen.
Dieser Kontaktnotification title
+
+ unblocked %@
+ rcv group event chat item
+ unknownUnbekanntconnection info
+
+ unknown status
+ No comment provided by engineer.
+ updated group profileAktualisiertes Gruppenprofilrcv group event chat item
+
+ updated profile
+ profile update event chat item
+ v%@v%@
@@ -6765,14 +6952,18 @@ SimpleX-Server können Ihr Profil nicht einsehen.
Sie sind BeobachterNo comment provided by engineer.
+
+ you blocked %@
+ snd group event chat item
+ you changed address
- Sie haben die Adresse gewechselt
+ Die Empfängeradresse wurde gewechseltchat item textyou changed address for %@
- Sie haben die Adresse für %@ gewechselt
+ Die Empfängeradresse für %@ wurde gewechseltchat item text
@@ -6805,6 +6996,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.
Sie haben Inkognito einen Einmal-Link geteiltchat list item description
+
+ you unblocked %@
+ snd group event chat item
+ you: Sie:
diff --git a/apps/ios/SimpleX Localizations/el.xcloc/Localized Contents/el.xliff b/apps/ios/SimpleX Localizations/el.xcloc/Localized Contents/el.xliff
index c6dcc84e99..18051ae350 100644
--- a/apps/ios/SimpleX Localizations/el.xcloc/Localized Contents/el.xliff
+++ b/apps/ios/SimpleX Localizations/el.xcloc/Localized Contents/el.xliff
@@ -66,20 +66,24 @@ Available in v5.1
%@ είναι συνδεδεμένο!notification title
-
+ %@ is not verified
+ %@ δεν είναι επαληθευμένοNo comment provided by engineer.
-
+ %@ is verified
+ %@ είναι επαληθευμένοNo comment provided by engineer.
-
+ %@ servers
+ %@ διακομιστέςNo comment provided by engineer.
-
+ %@ wants to connect!
+ %@ θέλει να συνδεθεί!notification title
@@ -4214,6 +4218,21 @@ SimpleX servers cannot see your profile.
%@ και %@ συνδεδεμένοNo comment provided by engineer.
+
+ %@:
+ %@:
+ copied message info
+
+
+ %@, %@ and %lld members
+ %@, %@ και %lld μέλη
+ No comment provided by engineer.
+
+
+ %@, %@ and %lld other members connected
+ %@, %@ και %lld άλλα μέλη συνδέθηκαν
+ No comment provided by engineer.
+