diff --git a/apps/ios/Shared/Model/AppAPITypes.swift b/apps/ios/Shared/Model/AppAPITypes.swift
index e93814ef84..2ddaf1d2af 100644
--- a/apps/ios/Shared/Model/AppAPITypes.swift
+++ b/apps/ios/Shared/Model/AppAPITypes.swift
@@ -69,6 +69,7 @@ enum ChatCommand: ChatCmdProtocol {
case apiAddMember(groupId: Int64, contactId: Int64, memberRole: GroupMemberRole)
case apiJoinGroup(groupId: Int64)
case apiAcceptMember(groupId: Int64, groupMemberId: Int64, memberRole: GroupMemberRole)
+ case apiDeleteMemberSupportChat(groupId: Int64, groupMemberId: Int64)
case apiMembersRole(groupId: Int64, memberIds: [Int64], memberRole: GroupMemberRole)
case apiBlockMembersForAll(groupId: Int64, memberIds: [Int64], blocked: Bool)
case apiRemoveMembers(groupId: Int64, memberIds: [Int64], withMessages: Bool)
@@ -250,6 +251,7 @@ enum ChatCommand: ChatCmdProtocol {
case let .apiAddMember(groupId, contactId, memberRole): return "/_add #\(groupId) \(contactId) \(memberRole)"
case let .apiJoinGroup(groupId): return "/_join #\(groupId)"
case let .apiAcceptMember(groupId, groupMemberId, memberRole): return "/_accept member #\(groupId) \(groupMemberId) \(memberRole.rawValue)"
+ case let .apiDeleteMemberSupportChat(groupId, groupMemberId): return "/_delete member chat #\(groupId) \(groupMemberId)"
case let .apiMembersRole(groupId, memberIds, memberRole): return "/_member role #\(groupId) \(memberIds.map({ "\($0)" }).joined(separator: ",")) \(memberRole.rawValue)"
case let .apiBlockMembersForAll(groupId, memberIds, blocked): return "/_block #\(groupId) \(memberIds.map({ "\($0)" }).joined(separator: ",")) blocked=\(onOff(blocked))"
case let .apiRemoveMembers(groupId, memberIds, withMessages): return "/_remove #\(groupId) \(memberIds.map({ "\($0)" }).joined(separator: ",")) messages=\(onOff(withMessages))"
@@ -425,6 +427,7 @@ enum ChatCommand: ChatCmdProtocol {
case .apiAddMember: return "apiAddMember"
case .apiJoinGroup: return "apiJoinGroup"
case .apiAcceptMember: return "apiAcceptMember"
+ case .apiDeleteMemberSupportChat: return "apiDeleteMemberSupportChat"
case .apiMembersRole: return "apiMembersRole"
case .apiBlockMembersForAll: return "apiBlockMembersForAll"
case .apiRemoveMembers: return "apiRemoveMembers"
@@ -851,6 +854,7 @@ enum ChatResponse2: Decodable, ChatAPIResult {
case leftMemberUser(user: UserRef, groupInfo: GroupInfo)
case groupMembers(user: UserRef, group: SimpleXChat.Group)
case memberAccepted(user: UserRef, groupInfo: GroupInfo, member: GroupMember)
+ case memberSupportChatDeleted(user: UserRef, groupInfo: GroupInfo, member: GroupMember)
case membersRoleUser(user: UserRef, groupInfo: GroupInfo, members: [GroupMember], toRole: GroupMemberRole)
case membersBlockedForAllUser(user: UserRef, groupInfo: GroupInfo, members: [GroupMember], blocked: Bool)
case groupUpdated(user: UserRef, toGroup: GroupInfo)
@@ -900,6 +904,7 @@ enum ChatResponse2: Decodable, ChatAPIResult {
case .leftMemberUser: "leftMemberUser"
case .groupMembers: "groupMembers"
case .memberAccepted: "memberAccepted"
+ case .memberSupportChatDeleted: "memberSupportChatDeleted"
case .membersRoleUser: "membersRoleUser"
case .membersBlockedForAllUser: "membersBlockedForAllUser"
case .groupUpdated: "groupUpdated"
@@ -945,6 +950,7 @@ enum ChatResponse2: Decodable, ChatAPIResult {
case let .leftMemberUser(u, groupInfo): return withUser(u, String(describing: groupInfo))
case let .groupMembers(u, group): return withUser(u, String(describing: group))
case let .memberAccepted(u, groupInfo, member): return withUser(u, "groupInfo: \(groupInfo)\nmember: \(member)")
+ case let .memberSupportChatDeleted(u, groupInfo, member): return withUser(u, "groupInfo: \(groupInfo)\nmember: \(member)")
case let .membersRoleUser(u, groupInfo, members, toRole): return withUser(u, "groupInfo: \(groupInfo)\nmembers: \(members)\ntoRole: \(toRole)")
case let .membersBlockedForAllUser(u, groupInfo, members, blocked): return withUser(u, "groupInfo: \(groupInfo)\nmember: \(members)\nblocked: \(blocked)")
case let .groupUpdated(u, toGroup): return withUser(u, String(describing: toGroup))
diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift
index 23a50ff07b..f8cb022095 100644
--- a/apps/ios/Shared/Model/ChatModel.swift
+++ b/apps/ios/Shared/Model/ChatModel.swift
@@ -1248,34 +1248,6 @@ final class Chat: ObservableObject, Identifiable, ChatLike {
)
}
- var userCanSend: Bool {
- switch chatInfo {
- case .direct: return true
- case let .group(groupInfo, groupChatScope):
- let m = groupInfo.membership
- return (m.memberActive && m.memberRole >= .member && !m.memberPending) || groupChatScope != nil
- case .local:
- return true
- default: return false
- }
- }
-
- var userIsObserver: Bool {
- switch chatInfo {
- case let .group(groupInfo, _):
- let m = groupInfo.membership
- return m.memberActive && m.memberRole == .observer
- default: return false
- }
- }
-
- var userIsPending: Bool {
- switch chatInfo {
- case let .group(groupInfo, _): groupInfo.membership.memberPending
- default: false
- }
- }
-
var unreadTag: Bool {
switch chatInfo.chatSettings?.enableNtfs {
case .all: chatStats.unreadChat || chatStats.unreadCount > 0
diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift
index 844f888e29..6b938aaa4d 100644
--- a/apps/ios/Shared/Model/SimpleXAPI.swift
+++ b/apps/ios/Shared/Model/SimpleXAPI.swift
@@ -1646,6 +1646,12 @@ func apiAcceptMember(_ groupId: Int64, _ groupMemberId: Int64, _ memberRole: Gro
throw r.unexpected
}
+func apiDeleteMemberSupportChat(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (GroupInfo, GroupMember) {
+ let r: ChatResponse2 = try await chatSendCmd(.apiDeleteMemberSupportChat(groupId: groupId, groupMemberId: groupMemberId))
+ if case let .memberSupportChatDeleted(_, groupInfo, member) = r { return (groupInfo, member) }
+ throw r.unexpected
+}
+
func apiRemoveMembers(_ groupId: Int64, _ memberIds: [Int64], _ withMessages: Bool = false) async throws -> (GroupInfo, [GroupMember]) {
let r: ChatResponse2 = try await chatSendCmd(.apiRemoveMembers(groupId: groupId, memberIds: memberIds, withMessages: withMessages), bgTask: false)
if case let .userDeletedMembers(_, updatedGroupInfo, members, _withMessages) = r { return (updatedGroupInfo, members) }
@@ -1689,8 +1695,8 @@ func apiListMembers(_ groupId: Int64) async -> [GroupMember] {
func filterMembersToAdd(_ ms: [GMember]) -> [Contact] {
let memberContactIds = ms.compactMap{ m in m.wrapped.memberCurrent ? m.wrapped.memberContactId : nil }
return ChatModel.shared.chats
- .compactMap{ $0.chatInfo.contact }
- .filter{ c in c.sendMsgEnabled && !c.nextSendGrpInv && !memberContactIds.contains(c.apiId) }
+ .compactMap{ c in c.chatInfo.sendMsgEnabled ? c.chatInfo.contact : nil }
+ .filter{ c in !c.nextSendGrpInv && !memberContactIds.contains(c.apiId) }
.sorted{ $0.displayName.lowercased() < $1.displayName.lowercased() }
}
@@ -2200,6 +2206,9 @@ func processReceivedMsg(_ res: ChatEvent) async {
m.decreaseGroupReportsCounter(item.deletedChatItem.chatInfo.id)
}
}
+ if let updatedChatInfo = items.last?.deletedChatItem.chatInfo {
+ m.updateChatInfo(updatedChatInfo)
+ }
}
case let .groupChatItemsDeleted(user, groupInfo, chatItemIDs, _, member_):
await groupChatItemsDeleted(user, groupInfo, chatItemIDs, member_)
diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift
index 190ca2ca40..8ce0c50849 100644
--- a/apps/ios/Shared/Views/Chat/ChatView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatView.swift
@@ -116,15 +116,25 @@ struct ChatView: View {
}
connectingText()
if selectedChatItems == nil {
+ let reason = chat.chatInfo.userCantSendReason
ComposeView(
chat: chat,
im: im,
composeState: $composeState,
keyboardVisible: $keyboardVisible,
keyboardHiddenDate: $keyboardHiddenDate,
- selectedRange: $selectedRange
+ selectedRange: $selectedRange,
+ disabledText: reason?.composeLabel
)
.disabled(!cInfo.sendMsgEnabled)
+ .if(!cInfo.sendMsgEnabled) { v in
+ v.disabled(true).onTapGesture {
+ AlertManager.shared.showAlertMsg(
+ title: "You can't send messages!",
+ message: reason?.alertMessage
+ )
+ }
+ }
} else {
SelectedItemsBottomToolbar(
im: im,
@@ -2267,6 +2277,7 @@ struct ChatView: View {
if deletedItem.isActiveReport {
m.decreaseGroupReportsCounter(chat.chatInfo.id)
}
+ m.updateChatInfo(itemDeletion.deletedChatItem.chatInfo)
}
}
}
@@ -2456,6 +2467,9 @@ private func deleteMessages(_ chat: Chat, _ deletingItems: [Int64], _ mode: CIDe
ChatModel.shared.decreaseGroupReportsCounter(chat.chatInfo.id)
}
}
+ if let updatedChatInfo = deletedItems.last?.deletedChatItem.chatInfo {
+ ChatModel.shared.updateChatInfo(updatedChatInfo)
+ }
}
await onSuccess()
} catch {
@@ -2487,6 +2501,9 @@ func archiveReports(_ chatInfo: ChatInfo, _ itemIds: [Int64], _ forAll: Bool, _
ChatModel.shared.decreaseGroupReportsCounter(chatInfo.id)
}
}
+ if let updatedChatInfo = deleted.last?.deletedChatItem.chatInfo {
+ ChatModel.shared.updateChatInfo(updatedChatInfo)
+ }
}
await onSuccess()
} catch {
diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift
index 7111524118..68a2f6d7b1 100644
--- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift
+++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift
@@ -328,6 +328,7 @@ struct ComposeView: View {
@Binding var keyboardVisible: Bool
@Binding var keyboardHiddenDate: Date
@Binding var selectedRange: NSRange
+ var disabledText: LocalizedStringKey? = nil
@State var linkUrl: URL? = nil
@State var hasSimplexLink: Bool = false
@@ -380,8 +381,8 @@ struct ComposeView: View {
Divider()
}
// preference checks should match checks in forwarding list
- let simplexLinkProhibited = hasSimplexLink && !chat.groupFeatureEnabled(.simplexLinks)
- let fileProhibited = composeState.attachmentPreview && !chat.groupFeatureEnabled(.files)
+ let simplexLinkProhibited = im.secondaryIMFilter == nil && hasSimplexLink && !chat.groupFeatureEnabled(.simplexLinks)
+ let fileProhibited = im.secondaryIMFilter == nil && composeState.attachmentPreview && !chat.groupFeatureEnabled(.files)
let voiceProhibited = composeState.voicePreview && !chat.chatInfo.featureEnabled(.voice)
if simplexLinkProhibited {
msgNotAllowedView("SimpleX links not allowed", icon: "link")
@@ -406,12 +407,13 @@ struct ComposeView: View {
Image(systemName: "paperclip")
.resizable()
}
- .disabled(composeState.attachmentDisabled || !chat.userCanSend || (chat.chatInfo.contact?.nextSendGrpInv ?? false))
+ .disabled(composeState.attachmentDisabled || !chat.chatInfo.sendMsgEnabled || (chat.chatInfo.contact?.nextSendGrpInv ?? false))
.frame(width: 25, height: 25)
.padding(.bottom, 16)
.padding(.leading, 12)
.tint(theme.colors.primary)
- if case let .group(g, _) = chat.chatInfo,
+ if im.secondaryIMFilter == nil,
+ case let .group(g, _) = chat.chatInfo,
!g.fullGroupPreferences.files.on(for: g.membership) {
b.disabled(true).onTapGesture {
AlertManager.shared.showAlertMsg(
@@ -452,36 +454,17 @@ struct ComposeView: View {
keyboardVisible: $keyboardVisible,
keyboardHiddenDate: $keyboardHiddenDate,
sendButtonColor: chat.chatInfo.incognito
- ? .indigo.opacity(colorScheme == .dark ? 1 : 0.7)
- : theme.colors.primary
+ ? .indigo.opacity(colorScheme == .dark ? 1 : 0.7)
+ : theme.colors.primary
)
.padding(.trailing, 12)
- .disabled(!chat.userCanSend)
+ .disabled(!chat.chatInfo.sendMsgEnabled)
- if im.secondaryIMFilter == nil {
- if chat.userIsPending {
- Text("reviewed by admins")
- .italic()
- .foregroundColor(theme.colors.secondary)
- .padding(.horizontal, 12)
- .onTapGesture {
- AlertManager.shared.showAlertMsg(
- title: "You can't send messages!",
- message: "Please contact group admin."
- )
- }
- } else if chat.userIsObserver {
- Text("you are observer")
- .italic()
- .foregroundColor(theme.colors.secondary)
- .padding(.horizontal, 12)
- .onTapGesture {
- AlertManager.shared.showAlertMsg(
- title: "You can't send messages!",
- message: "Please contact group admin."
- )
- }
- }
+ if let disabledText {
+ Text(disabledText)
+ .italic()
+ .foregroundColor(theme.colors.secondary)
+ .padding(.horizontal, 12)
}
}
}
@@ -507,8 +490,8 @@ struct ComposeView: View {
hasSimplexLink = false
}
}
- .onChange(of: chat.userCanSend) { canSend in
- if !canSend {
+ .onChange(of: chat.chatInfo.sendMsgEnabled) { sendEnabled in
+ if !sendEnabled {
cancelCurrentVoiceRecording()
clearCurrentDraft()
clearState()
diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextPendingMemberActionsView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextPendingMemberActionsView.swift
index 5f78581360..96915b342f 100644
--- a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextPendingMemberActionsView.swift
+++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextPendingMemberActionsView.swift
@@ -18,13 +18,13 @@ struct ContextPendingMemberActionsView: View {
var body: some View {
HStack(spacing: 0) {
ZStack {
- Text("Remove")
+ Text("Reject")
.foregroundColor(.red)
}
.frame(maxWidth: .infinity)
.contentShape(Rectangle())
.onTapGesture {
- showRemoveMemberAlert(groupInfo, member, dismiss: dismiss)
+ showRejectMemberAlert(groupInfo, member, dismiss: dismiss)
}
ZStack {
@@ -43,6 +43,15 @@ struct ContextPendingMemberActionsView: View {
}
}
+func showRejectMemberAlert(_ groupInfo: GroupInfo, _ member: GroupMember, dismiss: DismissAction? = nil) {
+ showAlert(
+ title: NSLocalizedString("Reject member?", comment: "alert title"),
+ buttonTitle: "Reject",
+ buttonAction: { removeMember(groupInfo, member, dismiss: dismiss) },
+ cancelButton: true
+ )
+}
+
func showAcceptMemberAlert(_ groupInfo: GroupInfo, _ member: GroupMember, dismiss: DismissAction? = nil) {
showAlert(
NSLocalizedString("Accept member", comment: "alert title"),
@@ -75,7 +84,7 @@ func acceptMember(_ groupInfo: GroupInfo, _ member: GroupMember, _ role: GroupMe
do {
let (gInfo, acceptedMember) = try await apiAcceptMember(groupInfo.groupId, member.groupMemberId, role)
await MainActor.run {
- _ = ChatModel.shared.upsertGroupMember(groupInfo, acceptedMember)
+ _ = ChatModel.shared.upsertGroupMember(gInfo, acceptedMember)
ChatModel.shared.updateGroup(gInfo)
dismiss?()
}
diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift
index d7b29a0ecb..e7b02c9aea 100644
--- a/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift
+++ b/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift
@@ -15,6 +15,7 @@ struct SendMessageView: View {
@Binding var composeState: ComposeState
@Binding var selectedRange: NSRange
@EnvironmentObject var theme: AppTheme
+ @Environment(\.isEnabled) var isEnabled
var sendMessage: (Int?) -> Void
var sendLiveMessage: (() async -> Void)? = nil
var updateLiveMessage: (() async -> Void)? = nil
@@ -255,6 +256,7 @@ struct SendMessageView: View {
}
private struct RecordVoiceMessageButton: View {
+ @Environment(\.isEnabled) var isEnabled
@EnvironmentObject var theme: AppTheme
var startVoiceMessageRecording: (() -> Void)?
var finishVoiceMessageRecording: (() -> Void)?
@@ -263,11 +265,11 @@ struct SendMessageView: View {
@State private var pressed: TimeInterval? = nil
var body: some View {
- Image(systemName: "mic.fill")
+ Image(systemName: isEnabled ? "mic.fill" : "mic")
.resizable()
.scaledToFit()
.frame(width: 20, height: 20)
- .foregroundColor(theme.colors.primary)
+ .foregroundColor(isEnabled ? theme.colors.primary : theme.colors.secondary)
.opacity(holdingVMR ? 0.7 : 1)
.disabled(disabled)
.frame(width: 31, height: 31)
@@ -352,7 +354,7 @@ struct SendMessageView: View {
Image(systemName: "bolt.fill")
.resizable()
.scaledToFit()
- .foregroundColor(theme.colors.primary)
+ .foregroundColor(isEnabled ? theme.colors.primary : theme.colors.secondary)
.frame(width: 20, height: 20)
}
.frame(width: 29, height: 29)
diff --git a/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift b/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift
index cd053cc9c8..7f3672ea17 100644
--- a/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift
+++ b/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift
@@ -100,14 +100,14 @@ struct MemberSupportView: View {
Label("Accept", systemImage: "checkmark")
}
.tint(theme.colors.primary)
+ } else {
+ Button {
+ showDeleteMemberSupportChatAlert(groupInfo, memberWithChat.wrapped)
+ } label: {
+ Label("Delete", systemImage: "trash")
+ }
+ .tint(.red)
}
-
- Button {
- showRemoveMemberAlert(groupInfo, memberWithChat.wrapped)
- } label: {
- Label("Remove", systemImage: "trash")
- }
- .tint(.red)
}
}
}
@@ -248,15 +248,37 @@ struct MemberSupportView: View {
}
}
-func showRemoveMemberAlert(_ groupInfo: GroupInfo, _ member: GroupMember, dismiss: DismissAction? = nil) {
+func showDeleteMemberSupportChatAlert(_ groupInfo: GroupInfo, _ member: GroupMember) {
showAlert(
- title: NSLocalizedString("Remove member?", comment: "alert title"),
- buttonTitle: "Remove",
- buttonAction: { removeMember(groupInfo, member, dismiss: dismiss) },
+ title: NSLocalizedString("Delete chat with member?", comment: "alert title"),
+ buttonTitle: "Delete",
+ buttonAction: { deleteMemberSupportChat(groupInfo, member) },
cancelButton: true
)
}
+func deleteMemberSupportChat(_ groupInfo: GroupInfo, _ member: GroupMember) {
+ Task {
+ do {
+ let (gInfo, updatedMember) = try await apiDeleteMemberSupportChat(groupInfo.groupId, member.groupMemberId)
+ await MainActor.run {
+ _ = ChatModel.shared.upsertGroupMember(gInfo, updatedMember)
+ ChatModel.shared.updateGroup(gInfo)
+ }
+ // TODO member row doesn't get removed from list (upsertGroupMember correctly sets supportChat to nil) - this repopulates list to fix it
+ await ChatModel.shared.loadGroupMembers(gInfo)
+ } catch let error {
+ logger.error("apiDeleteMemberSupportChat error: \(responseError(error))")
+ await MainActor.run {
+ showAlert(
+ NSLocalizedString("Error deleting chat with member", comment: "alert title"),
+ message: responseError(error)
+ )
+ }
+ }
+ }
+}
+
#Preview {
MemberSupportView(
groupInfo: GroupInfo.sampleData,
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 776199ac1f..b5a217d8c0 100644
--- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff
+++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff
@@ -554,6 +554,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsПриеми условията
@@ -575,6 +583,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsПриети условия
@@ -1535,11 +1547,23 @@ set passcode view
Chat will be deleted for you - this cannot be undone!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsЧатовеNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.No comment provided by engineer.
@@ -2300,6 +2324,10 @@ swipe action
Изтриване на чат профила?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?No comment provided by engineer.
@@ -2698,7 +2726,7 @@ swipe action
Don't show againНе показвай отново
- No comment provided by engineer.
+ alert actionDone
@@ -3006,6 +3034,10 @@ chat item action
Грешка при приемане на заявка за контактNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)Грешка при добавяне на член(ове)
@@ -3094,6 +3126,10 @@ chat item action
Грешка при изтриване на базата данниNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Грешка при изтриването на чата!
@@ -3196,7 +3232,7 @@ chat item action
Error removing memberГрешка при отстраняване на член
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4508,6 +4544,10 @@ This is your link for group %@!
ЧленNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveitem status text
@@ -4539,6 +4579,10 @@ This is your link for group %@!
Членът ще бъде премахнат от групата - това не може да бъде отменено!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.Членовете на групата могат да добавят реакции към съобщенията.
@@ -4931,6 +4975,10 @@ This is your link for group %@!
Нова членска роляNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageНово съобщение
@@ -4967,6 +5015,10 @@ This is your link for group %@!
No chats in list %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedНяма избрани контакти
@@ -5140,7 +5192,8 @@ This is your link for group %@!
OkОк
- alert button
+ alert action
+alert buttonOld database
@@ -5531,6 +5584,10 @@ Error: %@
Please try to disable and re-enable notfications.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.token info
@@ -5950,6 +6007,10 @@ swipe action
Отхвърли заявката за контактNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Реле сървър се използва само ако е необходимо. Друга страна може да наблюдава вашия IP адрес.
@@ -6053,6 +6114,10 @@ swipe action
Report reason?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.report reason
@@ -6157,6 +6222,14 @@ swipe action
Review conditionsNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokeОтзови
@@ -6210,6 +6283,10 @@ chat item action
Запази (и уведоми контактите)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactЗапази и уведоми контакта
@@ -6689,6 +6766,10 @@ chat item action
Задайте го вместо системната идентификация.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.No comment provided by engineer.
@@ -8343,6 +8424,10 @@ Repeat join request?
Можете да видите отново линкът за покана в подробностите за връзката.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!Не може да изпращате съобщения!
@@ -8635,6 +8720,10 @@ Repeat connection request?
по-горе, след това избери:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callобаждането прието
@@ -8644,6 +8733,10 @@ Repeat connection request?
accepted invitationchat list item title
+
+ accepted you
+ rcv group event chat item
+ adminадмин
@@ -8664,6 +8757,10 @@ Repeat connection request?
съгласуване на криптиране…chat item text
+
+ all
+ member criteria value
+ all membersвсички членове
@@ -8747,6 +8844,10 @@ marked deleted chat item preview text
повикване…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@отменен %@
@@ -8852,6 +8953,14 @@ marked deleted chat item preview text
името на контакта %1$@ е променено на %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionконтактът има e2e криптиране
@@ -8862,6 +8971,10 @@ marked deleted chat item preview text
контактът няма e2e криптиранеNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatorсъздател
@@ -9030,6 +9143,10 @@ pref value
групата е изтритаNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedпрофилът на групата е актуализиран
@@ -9153,6 +9270,10 @@ pref value
свързанrcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messageNo comment provided by engineer.
@@ -9216,6 +9337,10 @@ pref value
няма текстcopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerнаблюдател
@@ -9226,6 +9351,7 @@ pref value
изключеноenabled status
group pref value
+member criteria value
time to disappear
@@ -9274,6 +9400,10 @@ time to disappear
pending approvalNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionквантово устойчиво e2e криптиране
@@ -9313,6 +9443,10 @@ time to disappear
премахнат адрес за контактprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureпремахната профилна снимка
@@ -9323,10 +9457,22 @@ time to disappear
ви остраниrcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedзапазено
@@ -9508,6 +9654,10 @@ last received msg: %2$@
виеNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupвие сте поканени в групата
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 0400839cb0..fe0e02ccdf 100644
--- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff
+++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff
@@ -544,6 +544,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsNo comment provided by engineer.
@@ -564,6 +572,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsNo comment provided by engineer.
@@ -1456,11 +1468,23 @@ set passcode view
Chat will be deleted for you - this cannot be undone!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsChatyNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.No comment provided by engineer.
@@ -2193,6 +2217,10 @@ swipe action
Smazat chat profil?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?No comment provided by engineer.
@@ -2584,7 +2612,7 @@ swipe action
Don't show againZnovu neukazuj
- No comment provided by engineer.
+ alert actionDone
@@ -2878,6 +2906,10 @@ chat item action
Chyba při přijímání žádosti o kontaktNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)Chyba přidávání člena(ů)
@@ -2965,6 +2997,10 @@ chat item action
Chyba při mazání databáze chatuNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Chyba při mazání chatu!
@@ -3065,7 +3101,7 @@ chat item action
Error removing memberChyba při odebrání člena
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4333,6 +4369,10 @@ This is your link for group %@!
ČlenNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveitem status text
@@ -4364,6 +4404,10 @@ This is your link for group %@!
Člen bude odstraněn ze skupiny - toto nelze vzít zpět!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.Členové skupin mohou přidávat reakce na zprávy.
@@ -4739,6 +4783,10 @@ This is your link for group %@!
Nová role členaNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageNová zpráva
@@ -4775,6 +4823,10 @@ This is your link for group %@!
No chats in list %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedNebyl vybrán žádný kontakt
@@ -4945,7 +4997,8 @@ This is your link for group %@!
OkOk
- alert button
+ alert action
+alert buttonOld database
@@ -5320,6 +5373,10 @@ Error: %@
Please try to disable and re-enable notfications.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.token info
@@ -5731,6 +5788,10 @@ swipe action
Odmítnout žádost o kontaktNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Přenosový server se používá pouze v případě potřeby. Jiná strana může sledovat vaši IP adresu.
@@ -5829,6 +5890,10 @@ swipe action
Report reason?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.report reason
@@ -5932,6 +5997,14 @@ swipe action
Review conditionsNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokeOdvolat
@@ -5984,6 +6057,10 @@ chat item action
Uložit (a informovat kontakty)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactUložit a upozornit kontakt
@@ -6455,6 +6532,10 @@ chat item action
Nastavte jej namísto ověřování systému.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.No comment provided by engineer.
@@ -8044,6 +8125,10 @@ Repeat join request?
You can view invitation link again in connection details.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!Nemůžete posílat zprávy!
@@ -8330,6 +8415,10 @@ Repeat connection request?
výše, pak vyberte:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callpřijatý hovor
@@ -8339,6 +8428,10 @@ Repeat connection request?
accepted invitationchat list item title
+
+ accepted you
+ rcv group event chat item
+ adminsprávce
@@ -8358,6 +8451,10 @@ Repeat connection request?
povoluji šifrování…chat item text
+
+ all
+ member criteria value
+ all membersfeature role
@@ -8435,6 +8532,10 @@ marked deleted chat item preview text
volání…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@zrušeno %@
@@ -8539,6 +8640,14 @@ marked deleted chat item preview text
contact %1$@ changed to %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionkontakt má šifrování e2e
@@ -8549,6 +8658,10 @@ marked deleted chat item preview text
kontakt nemá šifrování e2eNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatortvůrce
@@ -8715,6 +8828,10 @@ pref value
skupina smazánaNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedprofil skupiny aktualizován
@@ -8837,6 +8954,10 @@ pref value
připojenorcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messageNo comment provided by engineer.
@@ -8900,6 +9021,10 @@ pref value
žádný textcopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerpozorovatel
@@ -8910,6 +9035,7 @@ pref value
vypnutoenabled status
group pref value
+member criteria value
time to disappear
@@ -8957,6 +9083,10 @@ time to disappear
pending approvalNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionchat item text
@@ -8994,6 +9124,10 @@ time to disappear
removed contact addressprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureprofile update event chat item
@@ -9003,10 +9137,22 @@ time to disappear
odstranil vásrcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedNo comment provided by engineer.
@@ -9178,6 +9324,10 @@ last received msg: %2$@
youNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupjste pozváni do skupiny
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 06fd7c5a1d..94d7c0b81b 100644
--- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff
+++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff
@@ -565,6 +565,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsNutzungsbedingungen akzeptieren
@@ -586,6 +594,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsAkzeptierte Nutzungsbedingungen
@@ -1582,11 +1594,23 @@ set passcode view
Der Chat wird für Sie gelöscht. Dies kann nicht rückgängig gemacht werden!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsChatsNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.Alle 20min Nachrichten überprüfen.
@@ -2402,6 +2426,10 @@ swipe action
Chat-Profil löschen?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?Chat löschen?
@@ -2825,7 +2853,7 @@ swipe action
Don't show againNicht nochmals anzeigen
- No comment provided by engineer.
+ alert actionDone
@@ -3143,6 +3171,10 @@ chat item action
Fehler beim Annehmen der KontaktanfrageNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)Fehler beim Hinzufügen von Mitgliedern
@@ -3238,6 +3270,10 @@ chat item action
Fehler beim Löschen der Chat-DatenbankNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Fehler beim Löschen des Chats!
@@ -3346,7 +3382,7 @@ chat item action
Error removing memberFehler beim Entfernen des Mitglieds
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4730,6 +4766,10 @@ Das ist Ihr Link für die Gruppe %@!
MitgliedNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveMitglied inaktiv
@@ -4765,6 +4805,10 @@ Das ist Ihr Link für die Gruppe %@!
Das Mitglied wird aus der Gruppe entfernt. Dies kann nicht rückgängig gemacht werden!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.Gruppenmitglieder können eine Reaktion auf Nachrichten geben.
@@ -5185,6 +5229,10 @@ Das ist Ihr Link für die Gruppe %@!
Neue MitgliedsrolleNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageNeue Nachricht
@@ -5225,6 +5273,10 @@ Das ist Ihr Link für die Gruppe %@!
Keine Chats in der Liste %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedKeine Kontakte ausgewählt
@@ -5417,7 +5469,8 @@ Das ist Ihr Link für die Gruppe %@!
OkOk
- alert button
+ alert action
+alert buttonOld database
@@ -5575,6 +5628,7 @@ Dies erfordert die Aktivierung eines VPNs.
Open link?
+ Link öffnen?alert title
@@ -5828,6 +5882,10 @@ Fehler: %@
Bitte versuchen Sie, die Benachrichtigungen zu deaktivieren und wieder zu aktivieren.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.Bitte warten Sie, bis die Token-Aktivierung abgeschlossen ist.
@@ -6281,6 +6339,10 @@ swipe action
Kontaktanfrage ablehnenNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Relais-Server werden nur genutzt, wenn sie benötigt werden. Ihre IP-Adresse kann von Anderen erfasst werden.
@@ -6391,6 +6453,10 @@ swipe action
Grund der Meldung?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.Spam melden: Nur Gruppenmoderatoren werden es sehen.
@@ -6506,6 +6572,14 @@ swipe action
Nutzungsbedingungen einsehenNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokeWiderrufen
@@ -6562,6 +6636,10 @@ chat item action
Speichern (und Kontakte benachrichtigen)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactSpeichern und Kontakt benachrichtigen
@@ -7077,6 +7155,10 @@ chat item action
Anstelle der System-Authentifizierung festlegen.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.Verfallsdatum von Nachrichten in Chats festlegen.
@@ -8839,6 +8921,10 @@ Verbindungsanfrage wiederholen?
Den Einladungslink können Sie in den Details der Verbindung nochmals sehen.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!Sie können keine Nachrichten versenden!
@@ -9078,7 +9164,7 @@ Verbindungsanfrage wiederholen?
Your profile is stored on your device and only shared with your contacts.
- Das Profil wird nur mit Ihren Kontakten geteilt.
+ Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt.No comment provided by engineer.
@@ -9141,6 +9227,10 @@ Verbindungsanfrage wiederholen?
Danach die gewünschte Aktion auswählen:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callAnruf angenommen
@@ -9151,6 +9241,10 @@ Verbindungsanfrage wiederholen?
Einladung angenommenchat list item title
+
+ accepted you
+ rcv group event chat item
+ adminAdmin
@@ -9171,6 +9265,10 @@ Verbindungsanfrage wiederholen?
Verschlüsselung zustimmen…chat item text
+
+ all
+ member criteria value
+ all membersAlle Mitglieder
@@ -9257,6 +9355,10 @@ marked deleted chat item preview text
Anrufen…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@abgebrochen %@
@@ -9362,6 +9464,14 @@ marked deleted chat item preview text
Der Kontaktname wurde von %1$@ auf %2$@ geändertprofile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionKontakt nutzt E2E-Verschlüsselung
@@ -9372,6 +9482,10 @@ marked deleted chat item preview text
Kontakt nutzt keine E2E-VerschlüsselungNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatorErsteller
@@ -9543,6 +9657,10 @@ pref value
Gruppe gelöschtNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedGruppenprofil aktualisiert
@@ -9668,6 +9786,10 @@ pref value
ist der Gruppe beigetretenrcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messageNachricht
@@ -9733,6 +9855,10 @@ pref value
Kein Textcopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerBeobachter
@@ -9743,6 +9869,7 @@ pref value
Ausenabled status
group pref value
+member criteria value
time to disappear
@@ -9795,6 +9922,10 @@ time to disappear
ausstehende GenehmigungNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionQuantum-resistente E2E-Verschlüsselung
@@ -9835,6 +9966,10 @@ time to disappear
Die Kontaktadresse wurde entferntprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureDas Profil-Bild wurde entfernt
@@ -9845,11 +9980,23 @@ time to disappear
hat Sie aus der Gruppe entferntrcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectZur Verbindung aufgefordertchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedabgespeichert
@@ -10039,6 +10186,10 @@ Zuletzt empfangene Nachricht: %2$@
ProfilNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupSie sind zu der Gruppe eingeladen
diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff
index fd71e0dee6..5982f620b8 100644
--- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff
+++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff
@@ -565,6 +565,16 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ Accept as observer
+ alert action
+ Accept conditionsAccept conditions
@@ -586,6 +596,11 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ Accept member
+ alert title
+ Accepted conditionsAccepted conditions
@@ -1582,11 +1597,26 @@ set passcode view
Chat will be deleted for you - this cannot be undone!No comment provided by engineer.
+
+ Chat with admins
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ Chat with member
+ No comment provided by engineer.
+ ChatsChatsNo comment provided by engineer.
+
+ Chats with members
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.Check messages every 20 min.
@@ -2402,6 +2432,11 @@ swipe action
Delete chat profile?No comment provided by engineer.
+
+ Delete chat with member?
+ Delete chat with member?
+ alert title
+ Delete chat?Delete chat?
@@ -2825,7 +2860,7 @@ swipe action
Don't show againDon't show again
- No comment provided by engineer.
+ alert actionDone
@@ -3143,6 +3178,11 @@ chat item action
Error accepting contact requestNo comment provided by engineer.
+
+ Error accepting member
+ Error accepting member
+ alert title
+ Error adding member(s)Error adding member(s)
@@ -3238,6 +3278,11 @@ chat item action
Error deleting chat databaseNo comment provided by engineer.
+
+ Error deleting chat with member
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Error deleting chat!
@@ -3346,7 +3391,7 @@ chat item action
Error removing memberError removing member
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4730,6 +4775,11 @@ This is your link for group %@!
MemberNo comment provided by engineer.
+
+ Member admission
+ Member admission
+ No comment provided by engineer.
+ Member inactiveMember inactive
@@ -4765,6 +4815,11 @@ This is your link for group %@!
Member will be removed from group - this cannot be undone!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.Members can add message reactions.
@@ -5185,6 +5240,11 @@ This is your link for group %@!
New member roleNo comment provided by engineer.
+
+ New member wants to join the group.
+ New member wants to join the group.
+ rcv group event chat item
+ New messageNew message
@@ -5225,6 +5285,11 @@ This is your link for group %@!
No chats in list %@No comment provided by engineer.
+
+ No chats with members
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedNo contacts selected
@@ -5417,7 +5482,8 @@ This is your link for group %@!
OkOk
- alert button
+ alert action
+alert buttonOld database
@@ -5829,6 +5895,11 @@ Error: %@
Please try to disable and re-enable notfications.token info
+
+ Please wait for group moderators to review your request to join the group.
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.Please wait for token activation to complete.
@@ -6282,6 +6353,11 @@ swipe action
Reject contact requestNo comment provided by engineer.
+
+ Reject member?
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Relay server is only used if necessary. Another party can observe your IP address.
@@ -6392,6 +6468,11 @@ swipe action
Report reason?No comment provided by engineer.
+
+ Report sent to moderators
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.Report spam: only group moderators will see it.
@@ -6507,6 +6588,16 @@ swipe action
Review conditionsNo comment provided by engineer.
+
+ Review members
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokeRevoke
@@ -6563,6 +6654,11 @@ chat item action
Save (and notify contacts)alert button
+
+ Save admission settings?
+ Save admission settings?
+ alert title
+ Save and notify contactSave and notify contact
@@ -7078,6 +7174,11 @@ chat item action
Set it instead of system authentication.No comment provided by engineer.
+
+ Set member admission
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.Set message expiration in chats.
@@ -8840,6 +8941,11 @@ Repeat join request?
You can view invitation link again in connection details.alert message
+
+ You can view your reports in Chat with admins.
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!You can't send messages!
@@ -9142,6 +9248,11 @@ Repeat connection request?
above, then choose:No comment provided by engineer.
+
+ accepted %@
+ accepted %@
+ rcv group event chat item
+ accepted callaccepted call
@@ -9152,6 +9263,11 @@ Repeat connection request?
accepted invitationchat list item title
+
+ accepted you
+ accepted you
+ rcv group event chat item
+ adminadmin
@@ -9172,6 +9288,11 @@ Repeat connection request?
agreeing encryption…chat item text
+
+ all
+ all
+ member criteria value
+ all membersall members
@@ -9258,6 +9379,11 @@ marked deleted chat item preview text
calling…call status
+
+ can't send messages
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@cancelled %@
@@ -9363,6 +9489,16 @@ marked deleted chat item preview text
contact %1$@ changed to %2$@profile update event chat item
+
+ contact deleted
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptioncontact has e2e encryption
@@ -9373,6 +9509,11 @@ marked deleted chat item preview text
contact has no e2e encryptionNo comment provided by engineer.
+
+ contact not ready
+ contact not ready
+ No comment provided by engineer.
+ creatorcreator
@@ -9544,6 +9685,11 @@ pref value
group deletedNo comment provided by engineer.
+
+ group is deleted
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedgroup profile updated
@@ -9669,6 +9815,11 @@ pref value
connectedrcv group event chat item
+
+ member has old version
+ member has old version
+ No comment provided by engineer.
+ messagemessage
@@ -9734,6 +9885,11 @@ pref value
no textcopied message info in history
+
+ not synchronized
+ not synchronized
+ No comment provided by engineer.
+ observerobserver
@@ -9744,6 +9900,7 @@ pref value
offenabled status
group pref value
+member criteria value
time to disappear
@@ -9796,6 +9953,11 @@ time to disappear
pending approvalNo comment provided by engineer.
+
+ pending review
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionquantum resistant e2e encryption
@@ -9836,6 +9998,11 @@ time to disappear
removed contact addressprofile update event chat item
+
+ removed from group
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureremoved profile picture
@@ -9846,11 +10013,26 @@ time to disappear
removed yourcv group event chat item
+
+ request to join rejected
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectrequested to connectchat list item title
+
+ review
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ reviewed by admins
+ No comment provided by engineer.
+ savedsaved
@@ -10040,6 +10222,11 @@ last received msg: %2$@
youNo comment provided by engineer.
+
+ you accepted this member
+ you accepted this member
+ snd group event chat item
+ you are invited to groupyou are invited to group
diff --git a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff
index d39fb61249..3c3ae9ff46 100644
--- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff
+++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff
@@ -565,6 +565,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsAceptar condiciones
@@ -586,6 +594,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsCondiciones aceptadas
@@ -1582,11 +1594,23 @@ set passcode view
El chat será eliminado para tí. ¡No puede deshacerse!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsChatsNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.Comprobar mensajes cada 20 min.
@@ -2402,6 +2426,10 @@ swipe action
¿Eliminar perfil?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?¿Eliminar chat?
@@ -2825,7 +2853,7 @@ swipe action
Don't show againNo volver a mostrar
- No comment provided by engineer.
+ alert actionDone
@@ -3143,6 +3171,10 @@ chat item action
Error al aceptar solicitud del contactoNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)Error al añadir miembro(s)
@@ -3238,6 +3270,10 @@ chat item action
Error al eliminar base de datosNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!¡Error al eliminar chat!
@@ -3346,7 +3382,7 @@ chat item action
Error removing memberError al expulsar miembro
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4730,6 +4766,10 @@ This is your link for group %@!
MiembroNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveMiembro inactivo
@@ -4765,6 +4805,10 @@ This is your link for group %@!
El miembro será expulsado del grupo. ¡No puede deshacerse!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.Los miembros pueden añadir reacciones a los mensajes.
@@ -5185,6 +5229,10 @@ This is your link for group %@!
Nuevo rol de miembroNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageMensaje nuevo
@@ -5225,6 +5273,10 @@ This is your link for group %@!
Sin chats en la lista %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedNingún contacto seleccionado
@@ -5417,7 +5469,8 @@ This is your link for group %@!
OkOk
- alert button
+ alert action
+alert buttonOld database
@@ -5828,6 +5881,10 @@ Error: %@
Por favor, intenta desactivar y reactivar las notificaciones.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.Por favor, espera a que el token de activación se complete.
@@ -6281,6 +6338,10 @@ swipe action
Rechazar solicitud de contactoNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.El servidor de retransmisión sólo se usa en caso de necesidad. Un tercero podría ver tu IP.
@@ -6391,6 +6452,10 @@ swipe action
¿Motivo del informe?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.Informar de spam: sólo los moderadores del grupo lo verán.
@@ -6506,6 +6571,14 @@ swipe action
Revisar condicionesNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokeRevocar
@@ -6562,6 +6635,10 @@ chat item action
Guardar (y notificar contactos)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactGuardar y notificar contacto
@@ -7077,6 +7154,10 @@ chat item action
Úsalo en lugar de la autenticación del sistema.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.Establece el vencimiento para los mensajes en los chats.
@@ -8839,6 +8920,10 @@ Repeat join request?
Podrás ver el enlace de invitación en detalles de conexión.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!¡No puedes enviar mensajes!
@@ -9141,6 +9226,10 @@ Repeat connection request?
y después elige:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callllamada aceptada
@@ -9151,6 +9240,10 @@ Repeat connection request?
invitación aceptadachat list item title
+
+ accepted you
+ rcv group event chat item
+ adminadministrador
@@ -9171,6 +9264,10 @@ Repeat connection request?
acordando cifrado…chat item text
+
+ all
+ member criteria value
+ all memberstodos los miembros
@@ -9257,6 +9354,10 @@ marked deleted chat item preview text
llamando…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@cancelado %@
@@ -9362,6 +9463,14 @@ marked deleted chat item preview text
el contacto %1$@ ha cambiado a %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionel contacto dispone de cifrado de extremo a extremo
@@ -9372,6 +9481,10 @@ marked deleted chat item preview text
el contacto no dispone de cifrado de extremo a extremoNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatorcreador
@@ -9543,6 +9656,10 @@ pref value
grupo eliminadoNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedperfil de grupo actualizado
@@ -9668,6 +9785,10 @@ pref value
conectadorcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messagemensaje
@@ -9733,6 +9854,10 @@ pref value
sin textocopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerobservador
@@ -9743,6 +9868,7 @@ pref value
desactivadoenabled status
group pref value
+member criteria value
time to disappear
@@ -9795,6 +9921,10 @@ time to disappear
pendiente de aprobaciónNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptioncifrado e2e resistente a tecnología cuántica
@@ -9835,6 +9965,10 @@ time to disappear
dirección de contacto eliminadaprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureha eliminado la imagen del perfil
@@ -9845,11 +9979,23 @@ time to disappear
te ha expulsadorcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectsolicitado para conectarchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedguardado
@@ -10039,6 +10185,10 @@ last received msg: %2$@
tuNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to grouphas sido invitado a un grupo
diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff
index a54666bb10..7c93c5b0bb 100644
--- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff
+++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff
@@ -527,6 +527,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsNo comment provided by engineer.
@@ -547,6 +555,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsNo comment provided by engineer.
@@ -1437,11 +1449,23 @@ set passcode view
Chat will be deleted for you - this cannot be undone!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsKeskustelutNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.No comment provided by engineer.
@@ -2174,6 +2198,10 @@ swipe action
Poista keskusteluprofiili?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?No comment provided by engineer.
@@ -2565,7 +2593,7 @@ swipe action
Don't show againÄlä näytä uudelleen
- No comment provided by engineer.
+ alert actionDone
@@ -2858,6 +2886,10 @@ chat item action
Virhe kontaktipyynnön hyväksymisessäNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)Virhe lisättäessä jäseniä
@@ -2944,6 +2976,10 @@ chat item action
Virhe keskustelujen tietokannan poistamisessaNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Virhe keskutelun poistamisessa!
@@ -3044,7 +3080,7 @@ chat item action
Error removing memberVirhe poistettaessa jäsentä
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4311,6 +4347,10 @@ This is your link for group %@!
JäsenNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveitem status text
@@ -4342,6 +4382,10 @@ This is your link for group %@!
Jäsen poistetaan ryhmästä - tätä ei voi perua!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.Ryhmän jäsenet voivat lisätä viestireaktioita.
@@ -4716,6 +4760,10 @@ This is your link for group %@!
Uusi jäsenrooliNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageUusi viesti
@@ -4752,6 +4800,10 @@ This is your link for group %@!
No chats in list %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedKontakteja ei ole valittu
@@ -4922,7 +4974,8 @@ This is your link for group %@!
OkOk
- alert button
+ alert action
+alert buttonOld database
@@ -5296,6 +5349,10 @@ Error: %@
Please try to disable and re-enable notfications.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.token info
@@ -5707,6 +5764,10 @@ swipe action
Hylkää yhteyspyyntöNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Välityspalvelinta käytetään vain tarvittaessa. Toinen osapuoli voi tarkkailla IP-osoitettasi.
@@ -5805,6 +5866,10 @@ swipe action
Report reason?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.report reason
@@ -5908,6 +5973,14 @@ swipe action
Review conditionsNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokePeruuta
@@ -5960,6 +6033,10 @@ chat item action
Tallenna (ja ilmoita kontakteille)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactTallenna ja ilmoita kontaktille
@@ -6430,6 +6507,10 @@ chat item action
Aseta se järjestelmän todennuksen sijaan.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.No comment provided by engineer.
@@ -8017,6 +8098,10 @@ Repeat join request?
You can view invitation link again in connection details.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!Et voi lähettää viestejä!
@@ -8303,6 +8388,10 @@ Repeat connection request?
edellä, valitse sitten:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callhyväksytty puhelu
@@ -8312,6 +8401,10 @@ Repeat connection request?
accepted invitationchat list item title
+
+ accepted you
+ rcv group event chat item
+ adminylläpitäjä
@@ -8331,6 +8424,10 @@ Repeat connection request?
hyväksyy salausta…chat item text
+
+ all
+ member criteria value
+ all membersfeature role
@@ -8408,6 +8505,10 @@ marked deleted chat item preview text
soittaa…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@peruutettu %@
@@ -8511,6 +8612,14 @@ marked deleted chat item preview text
contact %1$@ changed to %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionkontaktilla on e2e-salaus
@@ -8521,6 +8630,10 @@ marked deleted chat item preview text
kontaktilla ei ole e2e-salaustaNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatorluoja
@@ -8687,6 +8800,10 @@ pref value
ryhmä poistettuNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedryhmäprofiili päivitetty
@@ -8809,6 +8926,10 @@ pref value
yhdistettyrcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messageNo comment provided by engineer.
@@ -8872,6 +8993,10 @@ pref value
ei tekstiäcopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observertarkkailija
@@ -8882,6 +9007,7 @@ pref value
poisenabled status
group pref value
+member criteria value
time to disappear
@@ -8929,6 +9055,10 @@ time to disappear
pending approvalNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionchat item text
@@ -8966,6 +9096,10 @@ time to disappear
removed contact addressprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureprofile update event chat item
@@ -8975,10 +9109,22 @@ time to disappear
poisti sinutrcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedNo comment provided by engineer.
@@ -9149,6 +9295,10 @@ last received msg: %2$@
youNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupsinut on kutsuttu ryhmään
diff --git a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff
index 59bde0650e..80b3428cfe 100644
--- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff
+++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff
@@ -565,6 +565,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsAccepter les conditions
@@ -586,6 +594,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsConditions acceptées
@@ -1580,11 +1592,23 @@ set passcode view
Le discussion sera supprimé pour vous - il n'est pas possible de revenir en arrière !No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsDiscussionsNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.Consulter les messages toutes les 20 minutes.
@@ -2400,6 +2424,10 @@ swipe action
Supprimer le profil du chat ?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?Supprimer la discussion ?
@@ -2823,7 +2851,7 @@ swipe action
Don't show againNe plus afficher
- No comment provided by engineer.
+ alert actionDone
@@ -3141,6 +3169,10 @@ chat item action
Erreur de validation de la demande de contactNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)Erreur lors de l'ajout de membre·s
@@ -3236,6 +3268,10 @@ chat item action
Erreur lors de la suppression de la base de données du chatNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Erreur lors de la suppression du chat !
@@ -3344,7 +3380,7 @@ chat item action
Error removing memberErreur lors de la suppression d'un membre
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4712,6 +4748,10 @@ Voici votre lien pour le groupe %@ !
MembreNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveMembre inactif
@@ -4746,6 +4786,10 @@ Voici votre lien pour le groupe %@ !
Ce membre sera retiré du groupe - impossible de revenir en arrière !No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.Les membres du groupe peuvent ajouter des réactions aux messages.
@@ -5160,6 +5204,10 @@ Voici votre lien pour le groupe %@ !
Nouveau rôleNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageNouveau message
@@ -5197,6 +5245,10 @@ Voici votre lien pour le groupe %@ !
No chats in list %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedAucun contact sélectionné
@@ -5383,7 +5435,8 @@ Voici votre lien pour le groupe %@ !
OkOk
- alert button
+ alert action
+alert buttonOld database
@@ -5790,6 +5843,10 @@ Erreur : %@
Please try to disable and re-enable notfications.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.token info
@@ -6234,6 +6291,10 @@ swipe action
Rejeter la demande de contactNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Le serveur relais n'est utilisé que si nécessaire. Un tiers peut observer votre adresse IP.
@@ -6339,6 +6400,10 @@ swipe action
Report reason?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.report reason
@@ -6449,6 +6514,14 @@ swipe action
Vérifier les conditionsNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokeRévoquer
@@ -6505,6 +6578,10 @@ chat item action
Enregistrer (et en informer les contacts)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactEnregistrer et en informer le contact
@@ -7017,6 +7094,10 @@ chat item action
Il permet de remplacer l'authentification du système.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.No comment provided by engineer.
@@ -8762,6 +8843,10 @@ Répéter la demande d'adhésion ?
Vous pouvez à nouveau consulter le lien d'invitation dans les détails de la connexion.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!Vous ne pouvez pas envoyer de messages !
@@ -9063,6 +9148,10 @@ Répéter la demande de connexion ?
ci-dessus, puis choisissez :No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callappel accepté
@@ -9073,6 +9162,10 @@ Répéter la demande de connexion ?
invitation acceptéechat list item title
+
+ accepted you
+ rcv group event chat item
+ adminadmin
@@ -9093,6 +9186,10 @@ Répéter la demande de connexion ?
négociation du chiffrement…chat item text
+
+ all
+ member criteria value
+ all memberstous les membres
@@ -9178,6 +9275,10 @@ marked deleted chat item preview text
appel…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@annulé %@
@@ -9283,6 +9384,14 @@ marked deleted chat item preview text
le contact %1$@ est devenu %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionCe contact a le chiffrement de bout en bout
@@ -9293,6 +9402,10 @@ marked deleted chat item preview text
Ce contact n'a pas le chiffrement de bout en boutNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatorcréateur
@@ -9464,6 +9577,10 @@ pref value
groupe suppriméNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedmise à jour du profil de groupe
@@ -9589,6 +9706,10 @@ pref value
est connecté·ercv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messagemessage
@@ -9653,6 +9774,10 @@ pref value
aucun textecopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerobservateur
@@ -9663,6 +9788,7 @@ pref value
offenabled status
group pref value
+member criteria value
time to disappear
@@ -9713,6 +9839,10 @@ time to disappear
pending approvalNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionchiffrement e2e résistant post-quantique
@@ -9752,6 +9882,10 @@ time to disappear
suppression de l'adresse de contactprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile picturesuppression de la photo de profil
@@ -9762,11 +9896,23 @@ time to disappear
vous a retirércv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectdemande à se connecterchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedenregistré
@@ -9956,6 +10102,10 @@ dernier message reçu : %2$@
vousNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupvous êtes invité·e au groupe
diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff
index 78bee138e4..5fd4c21027 100644
--- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff
+++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff
@@ -565,6 +565,16 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ Befogadás tagként
+ alert action
+
+
+ Accept as observer
+ Befogadás megfigyelőként
+ alert action
+ Accept conditionsFeltételek elfogadása
@@ -586,6 +596,11 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ Tag befogadása
+ alert title
+ Accepted conditionsElfogadott feltételek
@@ -1582,11 +1597,26 @@ set passcode view
A csevegés törölve lesz az Ön számára – ez a művelet nem vonható vissza!No comment provided by engineer.
+
+ Chat with admins
+ Csevegés az adminisztrátorokkal
+ chat toolbar
+
+
+ Chat with member
+ Csevegés a taggal
+ No comment provided by engineer.
+ ChatsCsevegésekNo comment provided by engineer.
+
+ Chats with members
+ Csevegés a tagokkal
+ No comment provided by engineer.
+ Check messages every 20 min.Üzenetek ellenőrzése 20 percenként.
@@ -2240,7 +2270,7 @@ Ez a saját egyszer használható meghívója!
Database IDs and Transport isolation option.
- Adatbázis-azonosítók és átvitel-izolációs beállítások.
+ Adatbázis-azonosítók és átvitelelkülönítési beállítások.No comment provided by engineer.
@@ -2338,7 +2368,7 @@ Ez a saját egyszer használható meghívója!
Decryption error
- Titkosítás visszafejtési hiba
+ Titkosításvisszafejtési hibamessage decrypt error item
@@ -2402,6 +2432,11 @@ swipe action
Törli a csevegési profilt?No comment provided by engineer.
+
+ Delete chat with member?
+ Törli a taggal való csevegést?
+ alert title
+ Delete chat?Törli a csevegést?
@@ -2674,7 +2709,7 @@ swipe action
Different names, avatars and transport isolation.
- Különböző nevek, profilképek és átvitel-izoláció.
+ Különböző nevek, profilképek és átvitelizoláció.No comment provided by engineer.
@@ -2825,7 +2860,7 @@ swipe action
Don't show againNe mutasd újra
- No comment provided by engineer.
+ alert actionDone
@@ -3143,6 +3178,11 @@ chat item action
Hiba történt a meghívási kérés elfogadásakorNo comment provided by engineer.
+
+ Error accepting member
+ Hiba a tag befogadásakor
+ alert title
+ Error adding member(s)Hiba történt a tag(ok) hozzáadásakor
@@ -3238,6 +3278,11 @@ chat item action
Hiba történt a csevegési adatbázis törlésekorNo comment provided by engineer.
+
+ Error deleting chat with member
+ Hiba a taggal való csevegés törlésekor
+ alert title
+ Error deleting chat!Hiba történt a csevegés törlésekor!
@@ -3265,7 +3310,7 @@ chat item action
Error deleting user profile
- Hiba történt a felhasználó-profil törlésekor
+ Hiba történt a felhasználói profil törlésekorNo comment provided by engineer.
@@ -3346,7 +3391,7 @@ chat item action
Error removing memberHiba történt a tag eltávolításakor
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4449,7 +4494,7 @@ További fejlesztések hamarosan!
It can happen when you or your connection used the old database backup.
- Ez akkor fordulhat elő, ha Ön vagy a partnere régi adatbázis biztonsági mentést használt.
+ Ez akkor fordulhat elő, ha Ön vagy a partnere egy régi adatbázis biztonsági mentését használta.No comment provided by engineer.
@@ -4459,7 +4504,7 @@ További fejlesztések hamarosan!
3. The connection was compromised.
Ez akkor fordulhat elő, ha:
1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.
-2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere régebbi adatbázis biztonsági mentést használt.
+2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere egy régi adatbázis biztonsági mentését használta.
3. A kapcsolat sérült.No comment provided by engineer.
@@ -4730,6 +4775,11 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz!
TagNo comment provided by engineer.
+
+ Member admission
+ Tagbefogadás
+ No comment provided by engineer.
+ Member inactiveInaktív tag
@@ -4765,6 +4815,11 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz!
A tag el lesz távolítva a csoportból – ez a művelet nem vonható vissza!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ A tag csatlakozni akar a csoporthoz, befogadja a tagot?
+ alert message
+ Members can add message reactions.A tagok reakciókat adhatnak hozzá az üzenetekhez.
@@ -4942,12 +4997,12 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz!
Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.
- Az üzenetek, a fájlok és a hívások **végpontok közötti titkosítással**, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve.
+ Az üzenetek, a fájlok és a hívások **végpontok közötti titkosítással**, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve.No comment provided by engineer.Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.
- Az üzenetek, a fájlok és a hívások **végpontok közötti kvantumbiztos titkosítással**, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve.
+ Az üzenetek, a fájlok és a hívások **végpontok közötti kvantumbiztos titkosítással**, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve.No comment provided by engineer.
@@ -5185,6 +5240,11 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz!
Új tag szerepköreNo comment provided by engineer.
+
+ New member wants to join the group.
+ Új tag szeretne csatlakozni a csoporthoz.
+ rcv group event chat item
+ New messageÚj üzenet
@@ -5225,6 +5285,11 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz!
Nincsenek csevegések a(z) %@ nevű listábanNo comment provided by engineer.
+
+ No chats with members
+ Nincsenek csevegések a tagokkal
+ No comment provided by engineer.
+ No contacts selectedNincs partner kijelölve
@@ -5347,7 +5412,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz!
No user identifiers.
- Nincsenek felhasználó-azonosítók.
+ Nincsenek felhasználói azonosítók.No comment provided by engineer.
@@ -5417,7 +5482,8 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz!
OkRendben
- alert button
+ alert action
+alert buttonOld database
@@ -5575,6 +5641,7 @@ VPN engedélyezése szükséges.
Open link?
+ Megnyitja a hivatkozást?alert title
@@ -5828,6 +5895,11 @@ Hiba: %@
Próbálja meg letiltani és újra engedélyezni az értesítéseket.token info
+
+ Please wait for group moderators to review your request to join the group.
+ Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérelmét.
+ snd group event chat item
+ Please wait for token activation to complete.Várjon, amíg a token aktiválása befejeződik.
@@ -6281,14 +6353,19 @@ swipe action
Meghívási kérés elutasításaNo comment provided by engineer.
+
+ Reject member?
+ Elutasítja a tagot?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.
- A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címet.
+ A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét.No comment provided by engineer.Relay server protects your IP address, but it can observe the duration of the call.
- A továbbítókiszolgáló megvédi az Ön IP-címét, de megfigyelheti a hívás időtartamát.
+ A továbbítókiszolgáló megvédi az IP-címét, de megfigyelheti a hívás időtartamát.No comment provided by engineer.
@@ -6391,6 +6468,11 @@ swipe action
Jelentés indoklása?No comment provided by engineer.
+
+ Report sent to moderators
+ A jelentés el lett küldve a moderátoroknak
+ alert title
+ Report spam: only group moderators will see it.Kéretlen tartalom jelentése: csak a csoport moderátorai látják.
@@ -6506,6 +6588,16 @@ swipe action
Feltételek felülvizsgálataNo comment provided by engineer.
+
+ Review members
+ Tagok áttekintése
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ Tagok áttekintése a befogadás előtt (kopogtatás).
+ admission stage description
+ RevokeVisszavonás
@@ -6562,6 +6654,11 @@ chat item action
Mentés (és a partnerek értesítése)alert button
+
+ Save admission settings?
+ Elmenti a befogadási beállításokat?
+ alert title
+ Save and notify contactMentés és a partner értesítése
@@ -7077,6 +7174,11 @@ chat item action
Beállítás a rendszer-hitelesítés helyett.No comment provided by engineer.
+
+ Set member admission
+ Tagbefogadás beállítása
+ No comment provided by engineer.
+ Set message expiration in chats.Üzenetek eltűnési idejének módosítása a csevegésekben.
@@ -7335,7 +7437,7 @@ chat item action
SimpleX protocols reviewed by Trail of Bits.
- A SimpleX Chat biztonsága a Trail of Bits által lett felülvizsgálva.
+ A SimpleX-protokollokat a Trail of Bits auditálta.No comment provided by engineer.
@@ -8027,7 +8129,7 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll
Transport isolation
- Átvitel-izoláció
+ ÁtvitelelkülönítésNo comment provided by engineer.
@@ -8339,7 +8441,7 @@ A kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcso
Use private routing with unknown servers when IP address is not protected.
- Használjon privát útválasztást ismeretlen kiszolgálókkal, ha az IP-cím nem védett.
+ Használjon privát útválasztást az ismeretlen kiszolgálókkal, ha az IP-cím nem védett.No comment provided by engineer.
@@ -8624,12 +8726,12 @@ A kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcso
Without Tor or VPN, your IP address will be visible to file servers.
- Tor vagy VPN nélkül az Ön IP-címe látható lesz a fájlkiszolgálók számára.
+ Tor vagy VPN nélkül az IP-címe láthatóvá válik a fájlkiszolgálók számára.No comment provided by engineer.Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.
- Tor vagy VPN nélkül az Ön IP-címe látható lesz a következő XFTP-továbbítókiszolgálók számára: %@.
+ Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-továbbítókiszolgálók számára: %@.alert message
@@ -8839,6 +8941,11 @@ Megismétli a meghívási kérést?
A meghívási hivatkozást újra megtekintheti a kapcsolat részleteinél.alert message
+
+ You can view your reports in Chat with admins.
+ A jelentéseket megtekintheti a „Csevegés az adminisztrátorokkal” menüben.
+ alert message
+ You can't send messages!Nem lehet üzeneteket küldeni!
@@ -9078,7 +9185,7 @@ Megismétli a meghívási kérést?
Your profile is stored on your device and only shared with your contacts.
- A profilja csak a partnereivel van megosztva.
+ A profilja az eszközén van tárolva és csak a partnereivel van megosztva.No comment provided by engineer.
@@ -9141,6 +9248,11 @@ Megismétli a meghívási kérést?
gombra fent, majd válassza ki:No comment provided by engineer.
+
+ accepted %@
+ befogadta őt: %@
+ rcv group event chat item
+ accepted callfogadott hívás
@@ -9151,6 +9263,11 @@ Megismétli a meghívási kérést?
elfogadott meghívóchat list item title
+
+ accepted you
+ befogadta Önt
+ rcv group event chat item
+ adminadminisztrátor
@@ -9171,6 +9288,11 @@ Megismétli a meghívási kérést?
titkosítás elfogadása…chat item text
+
+ all
+ összes
+ member criteria value
+ all membersösszes tag
@@ -9257,6 +9379,11 @@ marked deleted chat item preview text
hívás…call status
+
+ can't send messages
+ nem lehet üzeneteket küldeni
+ No comment provided by engineer.
+ cancelled %@%@ visszavonva
@@ -9362,6 +9489,16 @@ marked deleted chat item preview text
%1$@ a következőre módosította a nevét: %2$@profile update event chat item
+
+ contact deleted
+ partner törölve
+ No comment provided by engineer.
+
+
+ contact disabled
+ partner letiltva
+ No comment provided by engineer.
+ contact has e2e encryptiona partner e2e titkosítással rendelkezik
@@ -9372,6 +9509,11 @@ marked deleted chat item preview text
a partner nem rendelkezik e2e titkosítássalNo comment provided by engineer.
+
+ contact not ready
+ a kapcsolat nem áll készen
+ No comment provided by engineer.
+ creatorkészítő
@@ -9543,6 +9685,11 @@ pref value
a csoport törölveNo comment provided by engineer.
+
+ group is deleted
+ csoport törölve
+ No comment provided by engineer.
+ group profile updatedcsoportprofil frissítve
@@ -9668,6 +9815,11 @@ pref value
kapcsolódottrcv group event chat item
+
+ member has old version
+ a tag régi verziót használ
+ No comment provided by engineer.
+ messageüzenet
@@ -9733,6 +9885,11 @@ pref value
nincs szövegcopied message info in history
+
+ not synchronized
+ nincs szinkronizálva
+ No comment provided by engineer.
+ observermegfigyelő
@@ -9743,6 +9900,7 @@ pref value
kikapcsolvaenabled status
group pref value
+member criteria value
time to disappear
@@ -9795,6 +9953,11 @@ time to disappear
jóváhagyásra várNo comment provided by engineer.
+
+ pending review
+ függőben lévő áttekintés
+ No comment provided by engineer.
+ quantum resistant e2e encryptionvégpontok közötti kvantumbiztos titkosítás
@@ -9835,6 +9998,11 @@ time to disappear
eltávolította a kapcsolattartási címetprofile update event chat item
+
+ removed from group
+ eltávolítva a csoportból
+ No comment provided by engineer.
+ removed profile pictureeltávolította a profilképét
@@ -9845,11 +10013,26 @@ time to disappear
eltávolította Öntrcv group event chat item
+
+ request to join rejected
+ csatlakozási kérelem elutasítva
+ No comment provided by engineer.
+ requested to connectFüggőben lévő meghívási kérelemchat list item title
+
+ review
+ áttekintés
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ áttekintve a moderátorok által
+ No comment provided by engineer.
+ savedmentett
@@ -10039,6 +10222,11 @@ utoljára fogadott üzenet: %2$@
ÖnNo comment provided by engineer.
+
+ you accepted this member
+ Ön befogadta ezt a tagot
+ snd group event chat item
+ you are invited to groupÖn meghívást kapott a csoportba
diff --git a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff
index cf5f61918f..d672a0da4f 100644
--- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff
+++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff
@@ -565,6 +565,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsAccetta le condizioni
@@ -586,6 +594,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsCondizioni accettate
@@ -1582,11 +1594,23 @@ set passcode view
La chat verrà eliminata solo per te, non è reversibile!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsChatNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.Controlla i messaggi ogni 20 min.
@@ -2402,6 +2426,10 @@ swipe action
Eliminare il profilo di chat?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?Eliminare la chat?
@@ -2825,7 +2853,7 @@ swipe action
Don't show againNon mostrare più
- No comment provided by engineer.
+ alert actionDone
@@ -3143,6 +3171,10 @@ chat item action
Errore nell'accettazione della richiesta di contattoNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)Errore di aggiunta membro/i
@@ -3238,6 +3270,10 @@ chat item action
Errore nell'eliminazione del database della chatNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Errore nell'eliminazione della chat!
@@ -3346,7 +3382,7 @@ chat item action
Error removing memberErrore nella rimozione del membro
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4730,6 +4766,10 @@ Questo è il tuo link per il gruppo %@!
MembroNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveMembro inattivo
@@ -4765,6 +4805,10 @@ Questo è il tuo link per il gruppo %@!
Il membro verrà rimosso dal gruppo, non è reversibile!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.I membri del gruppo possono aggiungere reazioni ai messaggi.
@@ -5185,6 +5229,10 @@ Questo è il tuo link per il gruppo %@!
Nuovo ruolo del membroNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageNuovo messaggio
@@ -5225,6 +5273,10 @@ Questo è il tuo link per il gruppo %@!
Nessuna chat nell'elenco %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedNessun contatto selezionato
@@ -5417,7 +5469,8 @@ Questo è il tuo link per il gruppo %@!
OkOk
- alert button
+ alert action
+alert buttonOld database
@@ -5575,6 +5628,7 @@ Richiede l'attivazione della VPN.
Open link?
+ Aprire il link?alert title
@@ -5828,6 +5882,10 @@ Errore: %@
Prova a disattivare e riattivare le notifiche.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.Attendi il completamento dell'attivazione del token.
@@ -6281,6 +6339,10 @@ swipe action
Rifiuta la richiesta di contattoNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Il server relay viene usato solo se necessario. Un altro utente può osservare il tuo indirizzo IP.
@@ -6391,6 +6453,10 @@ swipe action
Motivo della segnalazione?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.Segnala spam: solo i moderatori del gruppo lo vedranno.
@@ -6506,6 +6572,14 @@ swipe action
Leggi le condizioniNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokeRevoca
@@ -6562,6 +6636,10 @@ chat item action
Salva (e avvisa i contatti)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactSalva e avvisa il contatto
@@ -7077,6 +7155,10 @@ chat item action
Impostalo al posto dell'autenticazione di sistema.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.Imposta la scadenza dei messaggi nelle chat.
@@ -8839,6 +8921,10 @@ Ripetere la richiesta di ingresso?
Puoi vedere di nuovo il link di invito nei dettagli di connessione.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!Non puoi inviare messaggi!
@@ -9141,6 +9227,10 @@ Ripetere la richiesta di connessione?
sopra, quindi scegli:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callchiamata accettata
@@ -9151,6 +9241,10 @@ Ripetere la richiesta di connessione?
invito accettatochat list item title
+
+ accepted you
+ rcv group event chat item
+ adminamministratore
@@ -9171,6 +9265,10 @@ Ripetere la richiesta di connessione?
concordando la crittografia…chat item text
+
+ all
+ member criteria value
+ all memberstutti i membri
@@ -9257,6 +9355,10 @@ marked deleted chat item preview text
chiamata…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@annullato %@
@@ -9362,6 +9464,14 @@ marked deleted chat item preview text
contatto %1$@ cambiato in %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionil contatto ha la crittografia e2e
@@ -9372,6 +9482,10 @@ marked deleted chat item preview text
il contatto non ha la crittografia e2eNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatorcreatore
@@ -9543,6 +9657,10 @@ pref value
gruppo eliminatoNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedprofilo del gruppo aggiornato
@@ -9668,6 +9786,10 @@ pref value
si è connesso/arcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messagemessaggio
@@ -9733,6 +9855,10 @@ pref value
nessun testocopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerosservatore
@@ -9743,6 +9869,7 @@ pref value
offenabled status
group pref value
+member criteria value
time to disappear
@@ -9795,6 +9922,10 @@ time to disappear
in attesa di approvazioneNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptioncrittografia e2e resistente alla quantistica
@@ -9835,6 +9966,10 @@ time to disappear
indirizzo di contatto rimossoprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureimmagine del profilo rimossa
@@ -9845,11 +9980,23 @@ time to disappear
ti ha rimosso/arcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectrichiesto di connettersichat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedsalvato
@@ -10039,6 +10186,10 @@ ultimo msg ricevuto: %2$@
tuNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupsei stato/a invitato/a al gruppo
diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff
index 27134216a7..2a7bfa8df1 100644
--- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff
+++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff
@@ -561,6 +561,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsNo comment provided by engineer.
@@ -581,6 +589,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsNo comment provided by engineer.
@@ -1488,11 +1500,23 @@ set passcode view
Chat will be deleted for you - this cannot be undone!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsチャットNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.No comment provided by engineer.
@@ -2244,6 +2268,10 @@ swipe action
チャットのプロフィールを削除しますか?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?No comment provided by engineer.
@@ -2637,7 +2665,7 @@ swipe action
Don't show again次から表示しない
- No comment provided by engineer.
+ alert actionDone
@@ -2931,6 +2959,10 @@ chat item action
連絡先リクエストの承諾にエラー発生No comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)メンバー追加にエラー発生
@@ -3018,6 +3050,10 @@ chat item action
チャットデータベース削除にエラー発生No comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!チャット削除にエラー発生!
@@ -3117,7 +3153,7 @@ chat item action
Error removing memberメンバー除名にエラー発生
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4384,6 +4420,10 @@ This is your link for group %@!
メンバーNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveitem status text
@@ -4415,6 +4455,10 @@ This is your link for group %@!
メンバーをグループから除名する (※元に戻せません※)!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.グループメンバーはメッセージへのリアクションを追加できます。
@@ -4792,6 +4836,10 @@ This is your link for group %@!
新しいメンバーの役割No comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New message新しいメッセージ
@@ -4828,6 +4876,10 @@ This is your link for group %@!
No chats in list %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selected連絡先が選択されてません
@@ -4998,7 +5050,8 @@ This is your link for group %@!
OkOK
- alert button
+ alert action
+alert buttonOld database
@@ -5373,6 +5426,10 @@ Error: %@
Please try to disable and re-enable notfications.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.token info
@@ -5784,6 +5841,10 @@ swipe action
連絡要求を拒否するNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.中継サーバーは必要な場合にのみ使用されます。 別の当事者があなたの IP アドレスを監視できます。
@@ -5882,6 +5943,10 @@ swipe action
Report reason?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.report reason
@@ -5985,6 +6050,14 @@ swipe action
Review conditionsNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ Revoke取り消す
@@ -6037,6 +6110,10 @@ chat item action
保存(連絡先に通知)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contact保存して、連絡先にに知らせる
@@ -6500,6 +6577,10 @@ chat item action
システム認証の代わりに設定します。No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.No comment provided by engineer.
@@ -8088,6 +8169,10 @@ Repeat join request?
You can view invitation link again in connection details.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!メッセージを送信できませんでした!
@@ -8374,6 +8459,10 @@ Repeat connection request?
上で選んでください:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted call受けた通話
@@ -8383,6 +8472,10 @@ Repeat connection request?
accepted invitationchat list item title
+
+ accepted you
+ rcv group event chat item
+ admin管理者
@@ -8402,6 +8495,10 @@ Repeat connection request?
暗号化に同意しています…chat item text
+
+ all
+ member criteria value
+ all membersfeature role
@@ -8479,6 +8576,10 @@ marked deleted chat item preview text
発信中…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@キャンセルされました %@
@@ -8582,6 +8683,14 @@ marked deleted chat item preview text
contact %1$@ changed to %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryption連絡先はエンドツーエンド暗号化があります
@@ -8592,6 +8701,10 @@ marked deleted chat item preview text
連絡先はエンドツーエンド暗号化がありませんNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creator作成者
@@ -8758,6 +8871,10 @@ pref value
グループ削除済みNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedグループのプロフィールが更新されました
@@ -8880,6 +8997,10 @@ pref value
接続中rcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messageNo comment provided by engineer.
@@ -8943,6 +9064,10 @@ pref value
テキストなしcopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerオブザーバー
@@ -8953,6 +9078,7 @@ pref value
オフenabled status
group pref value
+member criteria value
time to disappear
@@ -9000,6 +9126,10 @@ time to disappear
pending approvalNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionchat item text
@@ -9037,6 +9167,10 @@ time to disappear
removed contact addressprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureprofile update event chat item
@@ -9046,10 +9180,22 @@ time to disappear
あなたを除名しましたrcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedNo comment provided by engineer.
@@ -9220,6 +9366,10 @@ last received msg: %2$@
youNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupグループ招待が届きました
diff --git a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff
index 4008c57ac0..d0b430cf02 100644
--- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff
+++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff
@@ -565,6 +565,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsAccepteer voorwaarden
@@ -586,6 +594,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsGeaccepteerde voorwaarden
@@ -1581,11 +1593,23 @@ set passcode view
De chat wordt voor je verwijderd - dit kan niet ongedaan worden gemaakt!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsChatsNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.Controleer uw berichten elke 20 minuten.
@@ -2401,6 +2425,10 @@ swipe action
Chatprofiel verwijderen?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?Chat verwijderen?
@@ -2824,7 +2852,7 @@ swipe action
Don't show againNiet meer weergeven
- No comment provided by engineer.
+ alert actionDone
@@ -3142,6 +3170,10 @@ chat item action
Fout bij het accepteren van een contactverzoekNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)Fout bij het toevoegen van leden
@@ -3237,6 +3269,10 @@ chat item action
Fout bij het verwijderen van de chat databaseNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Fout bij verwijderen gesprek!
@@ -3345,7 +3381,7 @@ chat item action
Error removing memberFout bij verwijderen van lid
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4729,6 +4765,10 @@ Dit is jouw link voor groep %@!
LidNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveLid inactief
@@ -4764,6 +4804,10 @@ Dit is jouw link voor groep %@!
Lid wordt uit de groep verwijderd, dit kan niet ongedaan worden gemaakt!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.Groepsleden kunnen bericht reacties toevoegen.
@@ -5184,6 +5228,10 @@ Dit is jouw link voor groep %@!
Nieuwe leden rolNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messagenieuw bericht
@@ -5224,6 +5272,10 @@ Dit is jouw link voor groep %@!
Geen chats in lijst %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedGeen contacten geselecteerd
@@ -5416,7 +5468,8 @@ Dit is jouw link voor groep %@!
OkOK
- alert button
+ alert action
+alert buttonOld database
@@ -5827,6 +5880,10 @@ Fout: %@
Probeer meldingen uit en weer in te schakelen.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.Wacht tot de tokenactivering voltooid is.
@@ -6280,6 +6337,10 @@ swipe action
Contactverzoek afwijzenNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Relay server wordt alleen gebruikt als dat nodig is. Een andere partij kan uw IP-adres zien.
@@ -6390,6 +6451,10 @@ swipe action
Reden melding?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.Spam melden: alleen groepsmoderators kunnen het zien.
@@ -6505,6 +6570,14 @@ swipe action
Voorwaarden bekijkenNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokeIntrekken
@@ -6561,6 +6634,10 @@ chat item action
Bewaar (en informeer contacten)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactOpslaan en Contact melden
@@ -7076,6 +7153,10 @@ chat item action
Stel het in in plaats van systeemverificatie.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.Stel de berichtvervaldatum in chats in.
@@ -8832,6 +8913,10 @@ Deelnameverzoek herhalen?
U kunt de uitnodigingslink opnieuw bekijken in de verbindingsdetails.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!Je kunt geen berichten versturen!
@@ -9134,6 +9219,10 @@ Verbindingsverzoek herhalen?
hier boven, kies dan:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callgeaccepteerde oproep
@@ -9144,6 +9233,10 @@ Verbindingsverzoek herhalen?
geaccepteerde uitnodigingchat list item title
+
+ accepted you
+ rcv group event chat item
+ adminBeheerder
@@ -9164,6 +9257,10 @@ Verbindingsverzoek herhalen?
versleuteling overeenkomen…chat item text
+
+ all
+ member criteria value
+ all membersalle leden
@@ -9250,6 +9347,10 @@ marked deleted chat item preview text
bellen…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@geannuleerd %@
@@ -9355,6 +9456,14 @@ marked deleted chat item preview text
contactpersoon %1$@ gewijzigd in %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptioncontact heeft e2e-codering
@@ -9365,6 +9474,10 @@ marked deleted chat item preview text
contact heeft geen e2e versleutelingNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatorcreator
@@ -9536,6 +9649,10 @@ pref value
groep verwijderdNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedgroep profiel bijgewerkt
@@ -9661,6 +9778,10 @@ pref value
is toegetredenrcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messagebericht
@@ -9726,6 +9847,10 @@ pref value
geen tekstcopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerWaarnemer
@@ -9736,6 +9861,7 @@ pref value
uitenabled status
group pref value
+member criteria value
time to disappear
@@ -9788,6 +9914,10 @@ time to disappear
in afwachting van goedkeuringNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionquantum bestendige e2e-codering
@@ -9828,6 +9958,10 @@ time to disappear
contactadres verwijderdprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureprofielfoto verwijderd
@@ -9838,11 +9972,23 @@ time to disappear
heeft je verwijderdrcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectverzocht om verbinding te makenchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedopgeslagen
@@ -10032,6 +10178,10 @@ laatst ontvangen bericht: %2$@
jijNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupje bent uitgenodigd voor de groep
diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff
index 175c8b4112..3255489efd 100644
--- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff
+++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff
@@ -565,6 +565,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsZaakceptuj warunki
@@ -586,6 +594,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsZaakceptowano warunki
@@ -1575,11 +1587,23 @@ set passcode view
Czat zostanie usunięty dla Ciebie – tej operacji nie można cofnąć!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsCzatyNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.Sprawdzaj wiadomości co 20 min.
@@ -2374,6 +2398,10 @@ swipe action
Usunąć profil czatu?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?No comment provided by engineer.
@@ -2787,7 +2815,7 @@ swipe action
Don't show againNie pokazuj ponownie
- No comment provided by engineer.
+ alert actionDone
@@ -3100,6 +3128,10 @@ chat item action
Błąd przyjmowania prośby o kontaktNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)Błąd dodawania członka(ów)
@@ -3191,6 +3223,10 @@ chat item action
Błąd usuwania bazy danych czatuNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Błąd usuwania czatu!
@@ -3297,7 +3333,7 @@ chat item action
Error removing memberBłąd usuwania członka
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4641,6 +4677,10 @@ To jest twój link do grupy %@!
CzłonekNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveCzłonek nieaktywny
@@ -4673,6 +4713,10 @@ To jest twój link do grupy %@!
Członek zostanie usunięty z grupy - nie można tego cofnąć!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.Członkowie grupy mogą dodawać reakcje wiadomości.
@@ -5083,6 +5127,10 @@ To jest twój link do grupy %@!
Nowa rola członkaNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageNowa wiadomość
@@ -5119,6 +5167,10 @@ To jest twój link do grupy %@!
No chats in list %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedNie wybrano kontaktów
@@ -5298,7 +5350,8 @@ To jest twój link do grupy %@!
OkOk
- alert button
+ alert action
+alert buttonOld database
@@ -5698,6 +5751,10 @@ Błąd: %@
Please try to disable and re-enable notfications.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.token info
@@ -6140,6 +6197,10 @@ swipe action
Odrzuć prośbę kontaktuNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Serwer przekaźnikowy jest używany tylko w razie potrzeby. Inna strona może obserwować Twój adres IP.
@@ -6245,6 +6306,10 @@ swipe action
Report reason?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.report reason
@@ -6354,6 +6419,14 @@ swipe action
Review conditionsNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokeOdwołaj
@@ -6410,6 +6483,10 @@ chat item action
Zapisz (i powiadom kontakty)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactZapisz i powiadom kontakt
@@ -6918,6 +6995,10 @@ chat item action
Ustaw go zamiast uwierzytelniania systemowego.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.No comment provided by engineer.
@@ -8630,6 +8711,10 @@ Powtórzyć prośbę dołączenia?
Możesz zobaczyć link zaproszenia ponownie w szczegółach połączenia.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!Nie możesz wysyłać wiadomości!
@@ -8930,6 +9015,10 @@ Powtórzyć prośbę połączenia?
powyżej, a następnie wybierz:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callzaakceptowane połączenie
@@ -8939,6 +9028,10 @@ Powtórzyć prośbę połączenia?
accepted invitationchat list item title
+
+ accepted you
+ rcv group event chat item
+ adminadministrator
@@ -8959,6 +9052,10 @@ Powtórzyć prośbę połączenia?
uzgadnianie szyfrowania…chat item text
+
+ all
+ member criteria value
+ all memberswszyscy członkowie
@@ -9044,6 +9141,10 @@ marked deleted chat item preview text
dzwonie…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@anulowany %@
@@ -9149,6 +9250,14 @@ marked deleted chat item preview text
kontakt %1$@ zmieniony na %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionkontakt posiada szyfrowanie e2e
@@ -9159,6 +9268,10 @@ marked deleted chat item preview text
kontakt nie posiada szyfrowania e2eNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatortwórca
@@ -9330,6 +9443,10 @@ pref value
grupa usuniętaNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedzaktualizowano profil grupy
@@ -9455,6 +9572,10 @@ pref value
połączonyrcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messagewiadomość
@@ -9519,6 +9640,10 @@ pref value
brak tekstucopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerobserwator
@@ -9529,6 +9654,7 @@ pref value
wyłączonyenabled status
group pref value
+member criteria value
time to disappear
@@ -9579,6 +9705,10 @@ time to disappear
pending approvalNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionkwantowo odporne szyfrowanie e2e
@@ -9618,6 +9748,10 @@ time to disappear
usunięto adres kontaktuprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureusunięto zdjęcie profilu
@@ -9628,10 +9762,22 @@ time to disappear
usunął cięrcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedzapisane
@@ -9821,6 +9967,10 @@ ostatnia otrzymana wiadomość: %2$@
TyNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupjesteś zaproszony do grupy
diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff
index 419fa75375..651d9a7063 100644
--- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff
+++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff
@@ -565,6 +565,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsПринять условия
@@ -586,6 +594,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsПринятые условия
@@ -1581,11 +1593,23 @@ set passcode view
Разговор будет удален для Вас - это действие нельзя отменить!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsЧатыNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.Проверять сообщения каждые 20 минут.
@@ -2401,6 +2425,10 @@ swipe action
Удалить профиль?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?Удалить разговор?
@@ -2822,7 +2850,7 @@ swipe action
Don't show againНе показывать
- No comment provided by engineer.
+ alert actionDone
@@ -3139,6 +3167,10 @@ chat item action
Ошибка при принятии запроса на соединениеNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)No comment provided by engineer.
@@ -3232,6 +3264,10 @@ chat item action
Ошибка при удалении данных чатаNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Ошибка при удалении чата!
@@ -3339,7 +3375,7 @@ chat item action
Error removing member
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4714,6 +4750,10 @@ This is your link for group %@!
MemberNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveitem status text
@@ -4744,6 +4784,10 @@ This is your link for group %@!
Member will be removed from group - this cannot be undone!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.No comment provided by engineer.
@@ -5153,6 +5197,10 @@ This is your link for group %@!
New member roleNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageНовое сообщение
@@ -5193,6 +5241,10 @@ This is your link for group %@!
Нет чатов в списке %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedКонтакты не выбраны
@@ -5382,7 +5434,8 @@ This is your link for group %@!
OkОк
- alert button
+ alert action
+alert buttonOld database
@@ -5792,6 +5845,10 @@ Error: %@
Попробуйте выключить и снова включить уведомления.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.Пожалуйста, дождитесь завершения активации токена.
@@ -6244,6 +6301,10 @@ swipe action
Отклонить запросNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Relay сервер используется только при необходимости. Другая сторона может видеть Ваш IP адрес.
@@ -6352,6 +6413,10 @@ swipe action
Причина сообщения?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.Пожаловаться на спам: увидят только модераторы группы.
@@ -6467,6 +6532,14 @@ swipe action
Посмотреть условияNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokeОтозвать
@@ -6523,6 +6596,10 @@ chat item action
Сохранить (и уведомить контакты)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactСохранить и уведомить контакт
@@ -7036,6 +7113,10 @@ chat item action
Установите код вместо системной аутентификации.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.Установите срок хранения сообщений в чатах.
@@ -8781,6 +8862,10 @@ Repeat join request?
Вы можете увидеть ссылку-приглашение снова открыв соединение.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!Вы не можете отправлять сообщения!
@@ -9081,6 +9166,10 @@ Repeat connection request?
наверху, затем выберите:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callпринятый звонок
@@ -9091,6 +9180,10 @@ Repeat connection request?
принятое приглашениеchat list item title
+
+ accepted you
+ rcv group event chat item
+ adminадмин
@@ -9111,6 +9204,10 @@ Repeat connection request?
шифрование согласовывается…chat item text
+
+ all
+ member criteria value
+ all membersfeature role
@@ -9196,6 +9293,10 @@ marked deleted chat item preview text
входящий звонок…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@отменил(a) %@
@@ -9301,6 +9402,14 @@ marked deleted chat item preview text
контакт %1$@ изменён на %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionу контакта есть e2e шифрование
@@ -9311,6 +9420,10 @@ marked deleted chat item preview text
у контакта нет e2e шифрованияNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatorсоздатель
@@ -9482,6 +9595,10 @@ pref value
группа удаленаNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedпрофиль группы обновлен
@@ -9605,6 +9722,10 @@ pref value
соединен(а)rcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messageнаписать
@@ -9670,6 +9791,10 @@ pref value
нет текстаcopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerчитатель
@@ -9680,6 +9805,7 @@ pref value
нетenabled status
group pref value
+member criteria value
time to disappear
@@ -9732,6 +9858,10 @@ time to disappear
ожидает утвержденияNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionквантово-устойчивое e2e шифрование
@@ -9772,6 +9902,10 @@ time to disappear
удалён адрес контактаprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureудалена картинка профиля
@@ -9782,11 +9916,23 @@ time to disappear
удалил(а) Вас из группыrcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectзапрошено соединениеchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedсохранено
@@ -9976,6 +10122,10 @@ last received msg: %2$@
ВыNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupВы приглашены в группу
diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff
index 671dd87d7d..528219b13a 100644
--- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff
+++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff
@@ -520,6 +520,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsNo comment provided by engineer.
@@ -539,6 +547,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsNo comment provided by engineer.
@@ -1429,11 +1441,23 @@ set passcode view
Chat will be deleted for you - this cannot be undone!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsแชทNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.No comment provided by engineer.
@@ -2162,6 +2186,10 @@ swipe action
ลบโปรไฟล์แชทไหม?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?No comment provided by engineer.
@@ -2551,7 +2579,7 @@ swipe action
Don't show againไม่ต้องแสดงอีก
- No comment provided by engineer.
+ alert actionDone
@@ -2843,6 +2871,10 @@ chat item action
เกิดข้อผิดพลาดในการรับคำขอติดต่อNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)เกิดข้อผิดพลาดในการเพิ่มสมาชิก
@@ -2928,6 +2960,10 @@ chat item action
เกิดข้อผิดพลาดในการลบฐานข้อมูลแชทNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!เกิดข้อผิดพลาดในการลบแชท!
@@ -3028,7 +3064,7 @@ chat item action
Error removing memberเกิดข้อผิดพลาดในการลบสมาชิก
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4293,6 +4329,10 @@ This is your link for group %@!
สมาชิกNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveitem status text
@@ -4324,6 +4364,10 @@ This is your link for group %@!
สมาชิกจะถูกลบออกจากกลุ่ม - ไม่สามารถยกเลิกได้!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.สมาชิกกลุ่มสามารถเพิ่มการแสดงปฏิกิริยาต่อข้อความได้
@@ -4697,6 +4741,10 @@ This is your link for group %@!
บทบาทของสมาชิกใหม่No comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageข้อความใหม่
@@ -4733,6 +4781,10 @@ This is your link for group %@!
No chats in list %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedไม่ได้เลือกผู้ติดต่อ
@@ -4902,7 +4954,8 @@ This is your link for group %@!
Okตกลง
- alert button
+ alert action
+alert buttonOld database
@@ -5274,6 +5327,10 @@ Error: %@
Please try to disable and re-enable notfications.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.token info
@@ -5683,6 +5740,10 @@ swipe action
ปฏิเสธคำขอติดต่อNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.ใช้เซิร์ฟเวอร์รีเลย์ในกรณีที่จำเป็นเท่านั้น บุคคลอื่นสามารถสังเกตที่อยู่ IP ของคุณได้
@@ -5781,6 +5842,10 @@ swipe action
Report reason?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.report reason
@@ -5884,6 +5949,14 @@ swipe action
Review conditionsNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ Revokeถอน
@@ -5936,6 +6009,10 @@ chat item action
บันทึก (และแจ้งผู้ติดต่อ)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactบันทึกและแจ้งผู้ติดต่อ
@@ -6404,6 +6481,10 @@ chat item action
ตั้งแทนการรับรองความถูกต้องของระบบNo comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.No comment provided by engineer.
@@ -7986,6 +8067,10 @@ Repeat join request?
You can view invitation link again in connection details.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!คุณไม่สามารถส่งข้อความได้!
@@ -8270,6 +8355,10 @@ Repeat connection request?
ด้านบน จากนั้นเลือก:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callรับสายแล้ว
@@ -8279,6 +8368,10 @@ Repeat connection request?
accepted invitationchat list item title
+
+ accepted you
+ rcv group event chat item
+ adminผู้ดูแลระบบ
@@ -8298,6 +8391,10 @@ Repeat connection request?
เห็นด้วยกับการ encryption…chat item text
+
+ all
+ member criteria value
+ all membersfeature role
@@ -8375,6 +8472,10 @@ marked deleted chat item preview text
กำลังโทร…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@ยกเลิก %@
@@ -8478,6 +8579,14 @@ marked deleted chat item preview text
contact %1$@ changed to %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionผู้ติดต่อมีการ encrypt จากต้นจนจบ
@@ -8488,6 +8597,10 @@ marked deleted chat item preview text
ผู้ติดต่อไม่มีการ encrypt จากต้นจนจบNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatorผู้สร้าง
@@ -8653,6 +8766,10 @@ pref value
ลบกลุ่มแล้วNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedอัปเดตโปรไฟล์กลุ่มแล้ว
@@ -8775,6 +8892,10 @@ pref value
เชื่อมต่อสำเร็จrcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messageNo comment provided by engineer.
@@ -8838,6 +8959,10 @@ pref value
ไม่มีข้อความcopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerผู้สังเกตการณ์
@@ -8848,6 +8973,7 @@ pref value
ปิดenabled status
group pref value
+member criteria value
time to disappear
@@ -8895,6 +9021,10 @@ time to disappear
pending approvalNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionchat item text
@@ -8932,6 +9062,10 @@ time to disappear
removed contact addressprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureprofile update event chat item
@@ -8941,10 +9075,22 @@ time to disappear
ลบคุณออกแล้วrcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedNo comment provided by engineer.
@@ -9115,6 +9261,10 @@ last received msg: %2$@
youNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupคุณได้รับเชิญให้เข้าร่วมกลุ่ม
diff --git a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff
index bbee40c2b9..d17a272016 100644
--- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff
+++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff
@@ -563,6 +563,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsKoşulları kabul et
@@ -584,6 +592,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsKabul edilmiş koşullar
@@ -1557,11 +1569,23 @@ set passcode view
Sohbet senden silinecek - bu geri alınamaz!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsSohbetlerNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.Her 20 dakikada mesajları kontrol et.
@@ -2364,6 +2388,10 @@ swipe action
Sohbet profili silinsin mi?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?Sohbet silinsin mi?
@@ -2780,7 +2808,7 @@ swipe action
Don't show againYeniden gösterme
- No comment provided by engineer.
+ alert actionDone
@@ -3095,6 +3123,10 @@ chat item action
Bağlantı isteği kabul edilirken hata oluştuNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)Üye(ler) eklenirken hata oluştu
@@ -3187,6 +3219,10 @@ chat item action
Sohbet veritabanı silinirken sorun oluştuNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Sohbet silinirken hata oluştu!
@@ -3294,7 +3330,7 @@ chat item action
Error removing memberKişiyi silerken sorun oluştu
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4653,6 +4689,10 @@ Bu senin grup için bağlantın %@!
KişiNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveÜye inaktif
@@ -4686,6 +4726,10 @@ Bu senin grup için bağlantın %@!
Üye gruptan çıkarılacaktır - bu geri alınamaz!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.Grup üyeleri mesaj tepkileri ekleyebilir.
@@ -5096,6 +5140,10 @@ Bu senin grup için bağlantın %@!
Yeni üye rolüNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageYeni mesaj
@@ -5132,6 +5180,10 @@ Bu senin grup için bağlantın %@!
No chats in list %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedHiçbir kişi seçilmedi
@@ -5311,7 +5363,8 @@ Bu senin grup için bağlantın %@!
OkTamam
- alert button
+ alert action
+alert buttonOld database
@@ -5711,6 +5764,10 @@ Hata: %@
Please try to disable and re-enable notfications.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.token info
@@ -6153,6 +6210,10 @@ swipe action
Bağlanma isteğini reddetNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Yönlendirici sunucusu yalnızca gerekli olduğunda kullanılır. Başka bir taraf IP adresinizi gözlemleyebilir.
@@ -6258,6 +6319,10 @@ swipe action
Report reason?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.report reason
@@ -6367,6 +6432,14 @@ swipe action
Review conditionsNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ Revokeİptal et
@@ -6423,6 +6496,10 @@ chat item action
Kaydet (ve kişilere bildir)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactKaydet ve kişilere bildir
@@ -6931,6 +7008,10 @@ chat item action
Sistem kimlik doğrulaması yerine ayarla.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.No comment provided by engineer.
@@ -8646,6 +8727,10 @@ Katılma isteği tekrarlansın mı?
Bağlantı detaylarından davet bağlantısını yeniden görüntüleyebilirsin.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!Mesajlar gönderemezsiniz!
@@ -8945,6 +9030,10 @@ Bağlantı isteği tekrarlansın mı?
yukarı çıkın, ardından seçin:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callkabul edilen arama
@@ -8954,6 +9043,10 @@ Bağlantı isteği tekrarlansın mı?
accepted invitationchat list item title
+
+ accepted you
+ rcv group event chat item
+ adminyönetici
@@ -8974,6 +9067,10 @@ Bağlantı isteği tekrarlansın mı?
şifreleme kabul ediliyor…chat item text
+
+ all
+ member criteria value
+ all membersbütün üyeler
@@ -9059,6 +9156,10 @@ marked deleted chat item preview text
aranıyor…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@%@ iptal edildi
@@ -9164,6 +9265,14 @@ marked deleted chat item preview text
%1$@ kişisi %2$@ olarak değiştiprofile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionkişi uçtan uca şifrelemeye sahiptir
@@ -9174,6 +9283,10 @@ marked deleted chat item preview text
kişi uçtan uca şifrelemeye sahip değildirNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatoroluşturan
@@ -9345,6 +9458,10 @@ pref value
grup silindiNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedgrup profili güncellendi
@@ -9470,6 +9587,10 @@ pref value
bağlanıldırcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messagemesaj
@@ -9534,6 +9655,10 @@ pref value
metin yokcopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observergözlemci
@@ -9544,6 +9669,7 @@ pref value
kapalıenabled status
group pref value
+member criteria value
time to disappear
@@ -9594,6 +9720,10 @@ time to disappear
pending approvalNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionkuantuma dayanıklı e2e şifreleme
@@ -9633,6 +9763,10 @@ time to disappear
kişi adresi silindiprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureprofil fotoğrafı silindi
@@ -9643,10 +9777,22 @@ time to disappear
sen kaldırıldınrcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedkaydedildi
@@ -9836,6 +9982,10 @@ son alınan msj: %2$@
senNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupgruba davet edildiniz
diff --git a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff
index c0375e3b02..687393cfab 100644
--- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff
+++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff
@@ -563,6 +563,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditionsПрийняти умови
@@ -584,6 +592,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditionsПрийняті умови
@@ -1557,11 +1569,23 @@ set passcode view
Чат буде видалено для вас - цю дію неможливо скасувати!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ ChatsЧатиNo comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.Перевіряйте повідомлення кожні 20 хв.
@@ -2364,6 +2388,10 @@ swipe action
Видалити профіль чату?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?Видалити чат?
@@ -2781,7 +2809,7 @@ swipe action
Don't show againБільше не показувати
- No comment provided by engineer.
+ alert actionDone
@@ -3096,6 +3124,10 @@ chat item action
Помилка при прийнятті запиту на контактNo comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)Помилка додавання користувача(ів)
@@ -3188,6 +3220,10 @@ chat item action
Помилка видалення бази даних чатуNo comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!Помилка видалення чату!
@@ -3295,7 +3331,7 @@ chat item action
Error removing memberПомилка видалення учасника
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4654,6 +4690,10 @@ This is your link for group %@!
УчасникNo comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactiveКористувач неактивний
@@ -4688,6 +4728,10 @@ This is your link for group %@!
Учасник буде видалений з групи - це неможливо скасувати!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.Учасники групи можуть додавати реакції на повідомлення.
@@ -5102,6 +5146,10 @@ This is your link for group %@!
Нова роль учасникаNo comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New messageНове повідомлення
@@ -5139,6 +5187,10 @@ This is your link for group %@!
No chats in list %@No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selectedНе вибрано жодного контакту
@@ -5325,7 +5377,8 @@ This is your link for group %@!
OkГаразд
- alert button
+ alert action
+alert buttonOld database
@@ -5732,6 +5785,10 @@ Error: %@
Please try to disable and re-enable notfications.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.token info
@@ -6176,6 +6233,10 @@ swipe action
Відхилити запит на контактNo comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.Релейний сервер використовується тільки в разі потреби. Інша сторона може бачити вашу IP-адресу.
@@ -6281,6 +6342,10 @@ swipe action
Report reason?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.report reason
@@ -6391,6 +6456,14 @@ swipe action
Умови переглядуNo comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ RevokeВідкликати
@@ -6447,6 +6520,10 @@ chat item action
Зберегти (і повідомити контактам)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contactЗберегти та повідомити контакт
@@ -6959,6 +7036,10 @@ chat item action
Встановіть його замість аутентифікації системи.No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.No comment provided by engineer.
@@ -8704,6 +8785,10 @@ Repeat join request?
Ви можете переглянути посилання на запрошення ще раз у деталях підключення.alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!Ви не можете надсилати повідомлення!
@@ -9005,6 +9090,10 @@ Repeat connection request?
вище, а потім обирайте:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted callприйнято виклик
@@ -9015,6 +9104,10 @@ Repeat connection request?
прийняте запрошенняchat list item title
+
+ accepted you
+ rcv group event chat item
+ adminадмін
@@ -9035,6 +9128,10 @@ Repeat connection request?
узгодження шифрування…chat item text
+
+ all
+ member criteria value
+ all membersвсі учасники
@@ -9120,6 +9217,10 @@ marked deleted chat item preview text
дзвоніть…call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@скасовано %@
@@ -9225,6 +9326,14 @@ marked deleted chat item preview text
контакт %1$@ змінено на %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryptionконтакт має шифрування e2e
@@ -9235,6 +9344,10 @@ marked deleted chat item preview text
контакт не має шифрування e2eNo comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creatorтворець
@@ -9406,6 +9519,10 @@ pref value
групу видаленоNo comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updatedоновлено профіль групи
@@ -9531,6 +9648,10 @@ pref value
з'єднанийrcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ messageповідомлення
@@ -9595,6 +9716,10 @@ pref value
без текстуcopied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observerспостерігач
@@ -9605,6 +9730,7 @@ pref value
вимкненоenabled status
group pref value
+member criteria value
time to disappear
@@ -9655,6 +9781,10 @@ time to disappear
pending approvalNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryptionквантово-стійке шифрування e2e
@@ -9694,6 +9824,10 @@ time to disappear
видалено контактну адресуprofile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile pictureвидалено зображення профілю
@@ -9704,11 +9838,23 @@ time to disappear
прибрали васrcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectзапит на підключенняchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ savedзбережено
@@ -9898,6 +10044,10 @@ last received msg: %2$@
тиNo comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to groupвас запрошують до групи
diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff
index d5411f86e3..06ce8d4950 100644
--- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff
+++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff
@@ -565,6 +565,14 @@ time interval
accept incoming call via notification
swipe action
+
+ Accept as member
+ alert action
+
+
+ Accept as observer
+ alert action
+ Accept conditions接受条款
@@ -586,6 +594,10 @@ swipe action
accept contact request via notification
swipe action
+
+ Accept member
+ alert title
+ Accepted conditions已接受的条款
@@ -1582,11 +1594,23 @@ set passcode view
将为你删除聊天 - 此操作无法撤销!No comment provided by engineer.
+
+ Chat with admins
+ chat toolbar
+
+
+ Chat with member
+ No comment provided by engineer.
+ Chats聊天No comment provided by engineer.
+
+ Chats with members
+ No comment provided by engineer.
+ Check messages every 20 min.每 20 分钟检查消息。
@@ -2401,6 +2425,10 @@ swipe action
删除聊天资料?No comment provided by engineer.
+
+ Delete chat with member?
+ alert title
+ Delete chat?删除聊天?
@@ -2824,7 +2852,7 @@ swipe action
Don't show again不再显示
- No comment provided by engineer.
+ alert actionDone
@@ -3142,6 +3170,10 @@ chat item action
接受联系人请求错误No comment provided by engineer.
+
+ Error accepting member
+ alert title
+ Error adding member(s)添加成员错误
@@ -3236,6 +3268,10 @@ chat item action
删除聊天数据库错误No comment provided by engineer.
+
+ Error deleting chat with member
+ alert title
+ Error deleting chat!删除聊天错误!
@@ -3344,7 +3380,7 @@ chat item action
Error removing member删除成员错误
- No comment provided by engineer.
+ alert titleError reordering lists
@@ -4728,6 +4764,10 @@ This is your link for group %@!
成员No comment provided by engineer.
+
+ Member admission
+ No comment provided by engineer.
+ Member inactive成员不活跃
@@ -4763,6 +4803,10 @@ This is your link for group %@!
成员将被移出群组——此操作无法撤消!No comment provided by engineer.
+
+ Member will join the group, accept member?
+ alert message
+ Members can add message reactions.群组成员可以添加信息回应。
@@ -5183,6 +5227,10 @@ This is your link for group %@!
新成员角色No comment provided by engineer.
+
+ New member wants to join the group.
+ rcv group event chat item
+ New message新消息
@@ -5223,6 +5271,10 @@ This is your link for group %@!
列表 %@ 中无聊天No comment provided by engineer.
+
+ No chats with members
+ No comment provided by engineer.
+ No contacts selected未选择联系人
@@ -5415,7 +5467,8 @@ This is your link for group %@!
Ok好的
- alert button
+ alert action
+alert buttonOld database
@@ -5823,6 +5876,10 @@ Error: %@
Please try to disable and re-enable notfications.token info
+
+ Please wait for group moderators to review your request to join the group.
+ snd group event chat item
+ Please wait for token activation to complete.token info
@@ -6265,6 +6322,10 @@ swipe action
拒绝联系人请求No comment provided by engineer.
+
+ Reject member?
+ alert title
+ Relay server is only used if necessary. Another party can observe your IP address.中继服务器仅在必要时使用。其他人可能会观察到您的IP地址。
@@ -6369,6 +6430,10 @@ swipe action
Report reason?No comment provided by engineer.
+
+ Report sent to moderators
+ alert title
+ Report spam: only group moderators will see it.report reason
@@ -6479,6 +6544,14 @@ swipe action
审阅条款No comment provided by engineer.
+
+ Review members
+ admission stage
+
+
+ Review members before admitting ("knocking").
+ admission stage description
+ Revoke吊销
@@ -6534,6 +6607,10 @@ chat item action
保存(并通知联系人)alert button
+
+ Save admission settings?
+ alert title
+ Save and notify contact保存并通知联系人
@@ -7041,6 +7118,10 @@ chat item action
设置它以代替系统身份验证。No comment provided by engineer.
+
+ Set member admission
+ No comment provided by engineer.
+ Set message expiration in chats.No comment provided by engineer.
@@ -8750,6 +8831,10 @@ Repeat join request?
您可以在连接详情中再次查看邀请链接。alert message
+
+ You can view your reports in Chat with admins.
+ alert message
+ You can't send messages!您无法发送消息!
@@ -9045,6 +9130,10 @@ Repeat connection request?
上面,然后选择:No comment provided by engineer.
+
+ accepted %@
+ rcv group event chat item
+ accepted call已接受通话
@@ -9054,6 +9143,10 @@ Repeat connection request?
accepted invitationchat list item title
+
+ accepted you
+ rcv group event chat item
+ admin管理员
@@ -9074,6 +9167,10 @@ Repeat connection request?
同意加密…chat item text
+
+ all
+ member criteria value
+ all members所有成员
@@ -9159,6 +9256,10 @@ marked deleted chat item preview text
呼叫中……call status
+
+ can't send messages
+ No comment provided by engineer.
+ cancelled %@已取消 %@
@@ -9264,6 +9365,14 @@ marked deleted chat item preview text
联系人 %1$@ 已更改为 %2$@profile update event chat item
+
+ contact deleted
+ No comment provided by engineer.
+
+
+ contact disabled
+ No comment provided by engineer.
+ contact has e2e encryption联系人具有端到端加密
@@ -9274,6 +9383,10 @@ marked deleted chat item preview text
联系人没有端到端加密No comment provided by engineer.
+
+ contact not ready
+ No comment provided by engineer.
+ creator创建者
@@ -9445,6 +9558,10 @@ pref value
群组已删除No comment provided by engineer.
+
+ group is deleted
+ No comment provided by engineer.
+ group profile updated群组资料已更新
@@ -9570,6 +9687,10 @@ pref value
已连接rcv group event chat item
+
+ member has old version
+ No comment provided by engineer.
+ message消息
@@ -9634,6 +9755,10 @@ pref value
无文本copied message info in history
+
+ not synchronized
+ No comment provided by engineer.
+ observer观察者
@@ -9644,6 +9769,7 @@ pref value
关闭enabled status
group pref value
+member criteria value
time to disappear
@@ -9694,6 +9820,10 @@ time to disappear
pending approvalNo comment provided by engineer.
+
+ pending review
+ No comment provided by engineer.
+ quantum resistant e2e encryption抗量子端到端加密
@@ -9733,6 +9863,10 @@ time to disappear
删除了联系地址profile update event chat item
+
+ removed from group
+ No comment provided by engineer.
+ removed profile picture删除了资料图片
@@ -9743,10 +9877,22 @@ time to disappear
已将您移除rcv group event chat item
+
+ request to join rejected
+ No comment provided by engineer.
+ requested to connectchat list item title
+
+ review
+ No comment provided by engineer.
+
+
+ reviewed by admins
+ No comment provided by engineer.
+ saved已保存
@@ -9936,6 +10082,10 @@ last received msg: %2$@
您No comment provided by engineer.
+
+ you accepted this member
+ snd group event chat item
+ you are invited to group您被邀请加入群组
diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj
index 650d2c9bd2..9e339af004 100644
--- a/apps/ios/SimpleX.xcodeproj/project.pbxproj
+++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj
@@ -184,8 +184,8 @@
64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */; };
64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829982D54AEED006B9E89 /* libgmp.a */; };
64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829992D54AEEE006B9E89 /* libffi.a */; };
- 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a */; };
- 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a */; };
+ 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a */; };
+ 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a */; };
64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */; };
64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */; };
64D0C2C229FA57AB00B38D5F /* UserAddressLearnMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */; };
@@ -553,8 +553,8 @@
64C3B0202A0D359700E19930 /* CustomTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTimePicker.swift; sourceTree = ""; };
64C829982D54AEED006B9E89 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; };
64C829992D54AEEE006B9E89 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; };
- 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a"; sourceTree = ""; };
- 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a"; sourceTree = ""; };
+ 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a"; sourceTree = ""; };
+ 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a"; sourceTree = ""; };
64C8299C2D54AEEE006B9E89 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; };
64D0C2BF29F9688300B38D5F /* UserAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressView.swift; sourceTree = ""; };
64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressLearnMore.swift; sourceTree = ""; };
@@ -712,8 +712,8 @@
64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */,
64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */,
64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */,
- 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a in Frameworks */,
- 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a in Frameworks */,
+ 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a in Frameworks */,
+ 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a in Frameworks */,
CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -798,8 +798,8 @@
64C829992D54AEEE006B9E89 /* libffi.a */,
64C829982D54AEED006B9E89 /* libgmp.a */,
64C8299C2D54AEEE006B9E89 /* libgmpxx.a */,
- 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a */,
- 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a */,
+ 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a */,
+ 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a */,
);
path = Libraries;
sourceTree = "";
@@ -2001,7 +2001,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 277;
+ CURRENT_PROJECT_VERSION = 278;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -2026,7 +2026,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES_THIN;
- MARKETING_VERSION = 6.3.4;
+ MARKETING_VERSION = 6.4;
OTHER_LDFLAGS = "-Wl,-stack_size,0x1000000";
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
@@ -2051,7 +2051,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 277;
+ CURRENT_PROJECT_VERSION = 278;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -2076,7 +2076,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES;
- MARKETING_VERSION = 6.3.4;
+ MARKETING_VERSION = 6.4;
OTHER_LDFLAGS = "-Wl,-stack_size,0x1000000";
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
@@ -2093,11 +2093,11 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 277;
+ CURRENT_PROJECT_VERSION = 278;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
- MARKETING_VERSION = 6.3.4;
+ MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.Tests-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -2113,11 +2113,11 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 277;
+ CURRENT_PROJECT_VERSION = 278;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
- MARKETING_VERSION = 6.3.4;
+ MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.Tests-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -2138,7 +2138,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 277;
+ CURRENT_PROJECT_VERSION = 278;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GCC_OPTIMIZATION_LEVEL = s;
@@ -2153,7 +2153,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
- MARKETING_VERSION = 6.3.4;
+ MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -2175,7 +2175,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 277;
+ CURRENT_PROJECT_VERSION = 278;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_CODE_COVERAGE = NO;
@@ -2190,7 +2190,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
- MARKETING_VERSION = 6.3.4;
+ MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -2212,7 +2212,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 277;
+ CURRENT_PROJECT_VERSION = 278;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -2238,7 +2238,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
- MARKETING_VERSION = 6.3.4;
+ MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -2263,7 +2263,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 277;
+ CURRENT_PROJECT_VERSION = 278;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -2289,7 +2289,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
- MARKETING_VERSION = 6.3.4;
+ MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -2314,7 +2314,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 277;
+ CURRENT_PROJECT_VERSION = 278;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -2329,7 +2329,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
- MARKETING_VERSION = 6.3.4;
+ MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-SE";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -2348,7 +2348,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 277;
+ CURRENT_PROJECT_VERSION = 278;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -2363,7 +2363,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
- MARKETING_VERSION = 6.3.4;
+ MARKETING_VERSION = 6.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-SE";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift
index d068b50412..9a82c912dd 100644
--- a/apps/ios/SimpleXChat/ChatTypes.swift
+++ b/apps/ios/SimpleXChat/ChatTypes.swift
@@ -15,6 +15,9 @@ public let CREATE_MEMBER_CONTACT_VERSION = 2
// version to receive reports (MCReport)
public let REPORTS_VERSION = 12
+// support group knocking (MsgScope)
+public let GROUP_KNOCKING_VERSION = 15
+
public let contentModerationPostLink = URL(string: "https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#preventing-server-abuse-without-compromising-e2e-encryption")!
public struct User: Identifiable, Decodable, UserLike, NamedChat, Hashable {
@@ -1333,19 +1336,55 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
}
}
- public var sendMsgEnabled: Bool {
+ public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? {
get {
switch self {
- case let .direct(contact): return contact.sendMsgEnabled
- case let .group(groupInfo, _): return groupInfo.sendMsgEnabled
- case let .local(noteFolder): return noteFolder.sendMsgEnabled
- case let .contactRequest(contactRequest): return contactRequest.sendMsgEnabled
- case let .contactConnection(contactConnection): return contactConnection.sendMsgEnabled
- case .invalidJSON: return false
+ case let .direct(contact):
+ // TODO [short links] this will have additional statuses for pending contact requests before they are accepted
+ if contact.nextSendGrpInv { return nil }
+ if !contact.active { return ("contact deleted", nil) }
+ if !contact.sndReady { return ("contact not ready", nil) }
+ if contact.activeConn?.connectionStats?.ratchetSyncSendProhibited ?? false { return ("not synchronized", nil) }
+ if contact.activeConn?.connDisabled ?? true { return ("contact disabled", nil) }
+ return nil
+ case let .group(groupInfo, groupChatScope):
+ if groupInfo.membership.memberActive {
+ switch(groupChatScope) {
+ case .none:
+ if groupInfo.membership.memberPending { return ("reviewed by admins", "Please contact group admin.") }
+ if groupInfo.membership.memberRole == .observer { return ("you are observer", "Please contact group admin.") }
+ return nil
+ case let .some(.memberSupport(groupMember_: .some(supportMember))):
+ if supportMember.versionRange.maxVersion < GROUP_KNOCKING_VERSION && !supportMember.memberPending {
+ return ("member has old version", nil)
+ }
+ return nil
+ case .some(.memberSupport(groupMember_: .none)):
+ return nil
+ }
+ } else {
+ switch groupInfo.membership.memberStatus {
+ case .memRejected: return ("request to join rejected", nil)
+ case .memGroupDeleted: return ("group is deleted", nil)
+ case .memRemoved: return ("removed from group", nil)
+ case .memLeft: return ("you left", nil)
+ default: return ("can't send messages", nil)
+ }
+ }
+ case .local:
+ return nil
+ case .contactRequest:
+ return ("can't send messages", nil)
+ case .contactConnection:
+ return ("can't send messages", nil)
+ case .invalidJSON:
+ return ("can't send messages", nil)
}
}
}
+ public var sendMsgEnabled: Bool { userCantSendReason == nil }
+
public var incognito: Bool {
get {
switch self {
@@ -1681,15 +1720,6 @@ public struct Contact: Identifiable, Decodable, NamedChat, Hashable {
public var ready: Bool { get { activeConn?.connStatus == .ready } }
public var sndReady: Bool { get { ready || activeConn?.connStatus == .sndReady } }
public var active: Bool { get { contactStatus == .active } }
- public var sendMsgEnabled: Bool { get {
- (
- sndReady
- && active
- && !(activeConn?.connectionStats?.ratchetSyncSendProhibited ?? false)
- && !(activeConn?.connDisabled ?? true)
- )
- || nextSendGrpInv
- } }
public var nextSendGrpInv: Bool { get { contactGroupMemberId != nil && !contactGrpInvSent } }
public var displayName: String { localAlias == "" ? profile.displayName : localAlias }
public var fullName: String { get { profile.fullName } }
@@ -1868,7 +1898,6 @@ public struct UserContactRequest: Decodable, NamedChat, Hashable {
public var id: ChatId { get { "<@\(contactRequestId)" } }
public var apiId: Int64 { get { contactRequestId } }
var ready: Bool { get { true } }
- public var sendMsgEnabled: Bool { get { false } }
public var displayName: String { get { profile.displayName } }
public var fullName: String { get { profile.fullName } }
public var image: String? { get { profile.image } }
@@ -1900,7 +1929,6 @@ public struct PendingContactConnection: Decodable, NamedChat, Hashable {
public var id: ChatId { get { ":\(pccConnId)" } }
public var apiId: Int64 { get { pccConnId } }
var ready: Bool { get { false } }
- public var sendMsgEnabled: Bool { get { false } }
var localDisplayName: String {
get { String.localizedStringWithFormat(NSLocalizedString("connection:%@", comment: "connection information"), pccConnId) }
}
@@ -2030,7 +2058,6 @@ public struct GroupInfo: Identifiable, Decodable, NamedChat, Hashable {
public var id: ChatId { get { "#\(groupId)" } }
public var apiId: Int64 { get { groupId } }
public var ready: Bool { get { true } }
- public var sendMsgEnabled: Bool { get { membership.memberActive } }
public var displayName: String { localAlias == "" ? groupProfile.displayName : localAlias }
public var fullName: String { get { groupProfile.fullName } }
public var image: String? { get { groupProfile.image } }
@@ -2469,7 +2496,6 @@ public struct NoteFolder: Identifiable, Decodable, NamedChat, Hashable {
public var id: ChatId { get { "*\(noteFolderId)" } }
public var apiId: Int64 { get { noteFolderId } }
public var ready: Bool { get { true } }
- public var sendMsgEnabled: Bool { get { true } }
public var displayName: String { get { ChatInfo.privateNotesChatName } }
public var fullName: String { get { "" } }
public var image: String? { get { nil } }
diff --git a/apps/ios/SimpleXChat/ChatUtils.swift b/apps/ios/SimpleXChat/ChatUtils.swift
index f27485a0f6..6f80629932 100644
--- a/apps/ios/SimpleXChat/ChatUtils.swift
+++ b/apps/ios/SimpleXChat/ChatUtils.swift
@@ -82,9 +82,9 @@ public func foundChat(_ chat: ChatLike, _ searchStr: String) -> Bool {
private func canForwardToChat(_ cInfo: ChatInfo) -> Bool {
switch cInfo {
- case let .direct(contact): contact.sendMsgEnabled && !contact.nextSendGrpInv
- case let .group(groupInfo, _): groupInfo.sendMsgEnabled
- case let .local(noteFolder): noteFolder.sendMsgEnabled
+ case let .direct(contact): cInfo.sendMsgEnabled && !contact.nextSendGrpInv
+ case .group: cInfo.sendMsgEnabled
+ case .local: cInfo.sendMsgEnabled
case .contactRequest: false
case .contactConnection: false
case .invalidJSON: false
diff --git a/apps/ios/bg.lproj/Localizable.strings b/apps/ios/bg.lproj/Localizable.strings
index e4bc8f2150..47f1390e0b 100644
--- a/apps/ios/bg.lproj/Localizable.strings
+++ b/apps/ios/bg.lproj/Localizable.strings
@@ -1485,7 +1485,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "Не активирай";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Не показвай отново";
/* No comment provided by engineer. */
@@ -1777,7 +1777,7 @@ chat item action */
/* alert title */
"Error receiving file" = "Грешка при получаване на файл";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Грешка при отстраняване на член";
/* No comment provided by engineer. */
@@ -2747,6 +2747,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "изключено";
@@ -2759,7 +2760,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "предлага %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Ок";
/* No comment provided by engineer. */
@@ -3156,7 +3158,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "Острани член";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "Острани член?";
/* No comment provided by engineer. */
@@ -3776,9 +3778,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Старата база данни не бе премахната по време на миграцията, тя може да бъде изтрита.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "Профилът се споделя само с вашите контакти.";
-
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Втората отметка, която пропуснахме! ✅";
@@ -4446,10 +4445,10 @@ chat item action */
"Your profile **%@** will be shared." = "Вашият профил **%@** ще бъде споделен.";
/* No comment provided by engineer. */
-"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Вашият профил се съхранява на вашето устройство и се споделя само с вашите контакти. SimpleX сървърите не могат да видят вашия профил.";
+"Your profile is stored on your device and only shared with your contacts." = "Профилът се споделя само с вашите контакти.";
/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Вашият профил, контакти и доставени съобщения се съхраняват на вашето устройство.";
+"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Вашият профил се съхранява на вашето устройство и се споделя само с вашите контакти. SimpleX сървърите не могат да видят вашия профил.";
/* No comment provided by engineer. */
"Your random profile" = "Вашият автоматично генериран профил";
diff --git a/apps/ios/cs.lproj/Localizable.strings b/apps/ios/cs.lproj/Localizable.strings
index 08a94615a3..cc19af7a74 100644
--- a/apps/ios/cs.lproj/Localizable.strings
+++ b/apps/ios/cs.lproj/Localizable.strings
@@ -1127,7 +1127,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "Nepovolovat";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Znovu neukazuj";
/* No comment provided by engineer. */
@@ -1367,7 +1367,7 @@ swipe action */
/* alert title */
"Error receiving file" = "Chyba při příjmu souboru";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Chyba při odebrání člena";
/* No comment provided by engineer. */
@@ -2145,6 +2145,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "vypnuto";
@@ -2157,7 +2158,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "nabídl %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Ok";
/* No comment provided by engineer. */
@@ -2476,7 +2478,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "Odstranit člena";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "Odebrat člena?";
/* No comment provided by engineer. */
@@ -2988,9 +2990,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Stará databáze nebyla během přenášení odstraněna, lze ji smazat.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "Profil je sdílen pouze s vašimi kontakty.";
-
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Druhé zaškrtnutí jsme přehlédli! ✅";
@@ -3472,10 +3471,10 @@ chat item action */
"Your profile **%@** will be shared." = "Váš profil **%@** bude sdílen.";
/* No comment provided by engineer. */
-"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Váš profil je uložen ve vašem zařízení a sdílen pouze s vašimi kontakty. Servery SimpleX nevidí váš profil.";
+"Your profile is stored on your device and only shared with your contacts." = "Profil je sdílen pouze s vašimi kontakty.";
/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Váš profil, kontakty a doručené zprávy jsou uloženy ve vašem zařízení.";
+"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Váš profil je uložen ve vašem zařízení a sdílen pouze s vašimi kontakty. Servery SimpleX nevidí váš profil.";
/* No comment provided by engineer. */
"Your random profile" = "Váš náhodný profil";
diff --git a/apps/ios/de.lproj/Localizable.strings b/apps/ios/de.lproj/Localizable.strings
index 8da7835c43..71cfaa841b 100644
--- a/apps/ios/de.lproj/Localizable.strings
+++ b/apps/ios/de.lproj/Localizable.strings
@@ -1872,7 +1872,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Verpassen Sie keine wichtigen Nachrichten.";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Nicht nochmals anzeigen";
/* No comment provided by engineer. */
@@ -2236,7 +2236,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Fehler beim Registrieren für Benachrichtigungen";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Fehler beim Entfernen des Mitglieds";
/* alert title */
@@ -3587,6 +3587,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "Aus";
@@ -3599,7 +3600,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "angeboten %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Ok";
/* No comment provided by engineer. */
@@ -3695,6 +3697,9 @@ time to disappear */
/* No comment provided by engineer. */
"Open group" = "Gruppe öffnen";
+/* alert title */
+"Open link?" = "Link öffnen?";
+
/* authentication reason */
"Open migration to another device" = "Migration auf ein anderes Gerät öffnen";
@@ -4170,7 +4175,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "Mitglied entfernen";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "Das Mitglied entfernen?";
/* No comment provided by engineer. */
@@ -5100,9 +5105,6 @@ report reason */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Die alte Datenbank wurde während der Migration nicht entfernt. Sie kann gelöscht werden.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "Das Profil wird nur mit Ihren Kontakten geteilt.";
-
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Dieselben Nutzungsbedingungen gelten auch für den Betreiber **%@**.";
@@ -5991,15 +5993,15 @@ report reason */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Ihr Profil **%@** wird geteilt.";
+/* No comment provided by engineer. */
+"Your profile is stored on your device and only shared with your contacts." = "Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt.";
+
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt. SimpleX-Server können Ihr Profil nicht einsehen.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Ihr Profil wurde geändert. Wenn Sie es speichern, wird das aktualisierte Profil an alle Ihre Kontakte gesendet.";
-/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Ihr Profil, Ihre Kontakte und zugestellten Nachrichten werden auf Ihrem Gerät gespeichert.";
-
/* No comment provided by engineer. */
"Your random profile" = "Ihr Zufallsprofil";
diff --git a/apps/ios/es.lproj/Localizable.strings b/apps/ios/es.lproj/Localizable.strings
index 28ba0f0642..9ae294f6ef 100644
--- a/apps/ios/es.lproj/Localizable.strings
+++ b/apps/ios/es.lproj/Localizable.strings
@@ -1872,7 +1872,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "No pierdas los mensajes importantes.";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "No volver a mostrar";
/* No comment provided by engineer. */
@@ -2236,7 +2236,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Error al registrarse para notificaciones";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Error al expulsar miembro";
/* alert title */
@@ -3587,6 +3587,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "desactivado";
@@ -3599,7 +3600,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "ofrecido %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Ok";
/* No comment provided by engineer. */
@@ -4170,7 +4172,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "Expulsar miembro";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "¿Expulsar miembro?";
/* No comment provided by engineer. */
@@ -5100,9 +5102,6 @@ report reason */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "La base de datos antigua no se eliminó durante la migración, puede eliminarse.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "El perfil sólo se comparte con tus contactos.";
-
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Las mismas condiciones se aplicarán al operador **%@**.";
@@ -5991,15 +5990,15 @@ report reason */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "El perfil **%@** será compartido.";
+/* No comment provided by engineer. */
+"Your profile is stored on your device and only shared with your contacts." = "El perfil sólo se comparte con tus contactos.";
+
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Tu perfil es almacenado en tu dispositivo y solamente se comparte con tus contactos. Los servidores SimpleX no pueden ver tu perfil.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Tu perfil ha sido modificado. Si lo guardas la actualización será enviada a todos tus contactos.";
-/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Tu perfil, contactos y mensajes se almacenan en tu dispositivo.";
-
/* No comment provided by engineer. */
"Your random profile" = "Tu perfil aleatorio";
diff --git a/apps/ios/fi.lproj/Localizable.strings b/apps/ios/fi.lproj/Localizable.strings
index 4891c7fb26..3aa3bdbc42 100644
--- a/apps/ios/fi.lproj/Localizable.strings
+++ b/apps/ios/fi.lproj/Localizable.strings
@@ -1073,7 +1073,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "Älä salli";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Älä näytä uudelleen";
/* No comment provided by engineer. */
@@ -1307,7 +1307,7 @@ swipe action */
/* alert title */
"Error receiving file" = "Virhe tiedoston vastaanottamisessa";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Virhe poistettaessa jäsentä";
/* No comment provided by engineer. */
@@ -2079,6 +2079,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "pois";
@@ -2091,7 +2092,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "tarjottu %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Ok";
/* No comment provided by engineer. */
@@ -2407,7 +2409,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "Poista jäsen";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "Poista jäsen?";
/* No comment provided by engineer. */
@@ -2910,9 +2912,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Vanhaa tietokantaa ei poistettu siirron aikana, se voidaan kuitenkin poistaa.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "Profiili jaetaan vain kontaktiesi kanssa.";
-
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Toinen kuittaus, joka uupui! ✅";
@@ -3391,10 +3390,10 @@ chat item action */
"Your profile **%@** will be shared." = "Profiilisi **%@** jaetaan.";
/* No comment provided by engineer. */
-"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Profiilisi tallennetaan laitteeseesi ja jaetaan vain yhteystietojesi kanssa. SimpleX-palvelimet eivät näe profiiliasi.";
+"Your profile is stored on your device and only shared with your contacts." = "Profiili jaetaan vain kontaktiesi kanssa.";
/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Profiilisi, kontaktisi ja toimitetut viestit tallennetaan laitteellesi.";
+"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Profiilisi tallennetaan laitteeseesi ja jaetaan vain yhteystietojesi kanssa. SimpleX-palvelimet eivät näe profiiliasi.";
/* No comment provided by engineer. */
"Your random profile" = "Satunnainen profiilisi";
diff --git a/apps/ios/fr.lproj/Localizable.strings b/apps/ios/fr.lproj/Localizable.strings
index 4dd75039dc..55a76aaa37 100644
--- a/apps/ios/fr.lproj/Localizable.strings
+++ b/apps/ios/fr.lproj/Localizable.strings
@@ -1863,7 +1863,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Ne manquez pas les messages importants.";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Ne plus afficher";
/* No comment provided by engineer. */
@@ -2227,7 +2227,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Erreur lors de l'inscription aux notifications";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Erreur lors de la suppression d'un membre";
/* alert title */
@@ -3479,6 +3479,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "off";
@@ -3491,7 +3492,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "propose %1$@ : %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Ok";
/* No comment provided by engineer. */
@@ -4014,7 +4016,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "Retirer le membre";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "Retirer ce membre ?";
/* No comment provided by engineer. */
@@ -4883,9 +4885,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "L'ancienne base de données n'a pas été supprimée lors de la migration, elle peut être supprimée.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "Le profil n'est partagé qu'avec vos contacts.";
-
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Les mêmes conditions s'appliquent à l'opérateur **%@**.";
@@ -5741,15 +5740,15 @@ chat item action */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Votre profil **%@** sera partagé.";
+/* No comment provided by engineer. */
+"Your profile is stored on your device and only shared with your contacts." = "Le profil n'est partagé qu'avec vos contacts.";
+
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Votre profil est stocké sur votre appareil et est seulement partagé avec vos contacts. Les serveurs SimpleX ne peuvent pas voir votre profil.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Votre profil a été modifié. Si vous l'enregistrez, le profil mis à jour sera envoyé à tous vos contacts.";
-/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Votre profil, vos contacts et les messages reçus sont stockés sur votre appareil.";
-
/* No comment provided by engineer. */
"Your random profile" = "Votre profil aléatoire";
diff --git a/apps/ios/hu.lproj/Localizable.strings b/apps/ios/hu.lproj/Localizable.strings
index 5a9b6b4e38..9a1da01665 100644
--- a/apps/ios/hu.lproj/Localizable.strings
+++ b/apps/ios/hu.lproj/Localizable.strings
@@ -345,6 +345,12 @@ accept incoming call via notification
swipe action */
"Accept" = "Elfogadás";
+/* alert action */
+"Accept as member" = "Befogadás tagként";
+
+/* alert action */
+"Accept as observer" = "Befogadás megfigyelőként";
+
/* No comment provided by engineer. */
"Accept conditions" = "Feltételek elfogadása";
@@ -358,6 +364,12 @@ swipe action */
swipe action */
"Accept incognito" = "Elfogadás inkognitóban";
+/* alert title */
+"Accept member" = "Tag befogadása";
+
+/* rcv group event chat item */
+"accepted %@" = "befogadta őt: %@";
+
/* call status */
"accepted call" = "fogadott hívás";
@@ -367,6 +379,9 @@ swipe action */
/* chat list item title */
"accepted invitation" = "elfogadott meghívó";
+/* rcv group event chat item */
+"accepted you" = "befogadta Önt";
+
/* No comment provided by engineer. */
"Acknowledged" = "Visszaigazolt";
@@ -463,6 +478,9 @@ swipe action */
/* chat item text */
"agreeing encryption…" = "titkosítás elfogadása…";
+/* member criteria value */
+"all" = "összes";
+
/* No comment provided by engineer. */
"All" = "Összes";
@@ -905,6 +923,9 @@ marked deleted chat item preview text */
/* No comment provided by engineer. */
"Can't message member" = "Nem lehet üzenetet küldeni a tagnak";
+/* No comment provided by engineer. */
+"can't send messages" = "nem lehet üzeneteket küldeni";
+
/* alert action
alert button */
"Cancel" = "Mégse";
@@ -1042,9 +1063,18 @@ set passcode view */
/* No comment provided by engineer. */
"Chat will be deleted for you - this cannot be undone!" = "A csevegés törölve lesz az Ön számára – ez a művelet nem vonható vissza!";
+/* chat toolbar */
+"Chat with admins" = "Csevegés az adminisztrátorokkal";
+
+/* No comment provided by engineer. */
+"Chat with member" = "Csevegés a taggal";
+
/* No comment provided by engineer. */
"Chats" = "Csevegések";
+/* No comment provided by engineer. */
+"Chats with members" = "Csevegés a tagokkal";
+
/* No comment provided by engineer. */
"Check messages every 20 min." = "Üzenetek ellenőrzése 20 percenként.";
@@ -1333,9 +1363,15 @@ set passcode view */
/* No comment provided by engineer. */
"Contact already exists" = "A partner már létezik";
+/* No comment provided by engineer. */
+"contact deleted" = "partner törölve";
+
/* No comment provided by engineer. */
"Contact deleted!" = "Partner törölve!";
+/* No comment provided by engineer. */
+"contact disabled" = "partner letiltva";
+
/* No comment provided by engineer. */
"contact has e2e encryption" = "a partner e2e titkosítással rendelkezik";
@@ -1354,6 +1390,9 @@ set passcode view */
/* No comment provided by engineer. */
"Contact name" = "Csak név";
+/* No comment provided by engineer. */
+"contact not ready" = "a kapcsolat nem áll készen";
+
/* No comment provided by engineer. */
"Contact preferences" = "Partnerbeállítások";
@@ -1505,7 +1544,7 @@ set passcode view */
"Database ID: %d" = "Adatbázis-azonosító: %d";
/* No comment provided by engineer. */
-"Database IDs and Transport isolation option." = "Adatbázis-azonosítók és átvitel-izolációs beállítások.";
+"Database IDs and Transport isolation option." = "Adatbázis-azonosítók és átvitelelkülönítési beállítások.";
/* No comment provided by engineer. */
"Database is encrypted using a random passphrase, you can change it." = "Az adatbázis egy véletlenszerű jelmondattal van titkosítva, amelyet szabadon módosíthat.";
@@ -1550,7 +1589,7 @@ set passcode view */
"Decentralized" = "Decentralizált";
/* message decrypt error item */
-"Decryption error" = "Titkosítás visszafejtési hiba";
+"Decryption error" = "Titkosításvisszafejtési hiba";
/* No comment provided by engineer. */
"decryption errors" = "visszafejtési hibák";
@@ -1602,6 +1641,9 @@ swipe action */
/* No comment provided by engineer. */
"Delete chat profile?" = "Törli a csevegési profilt?";
+/* alert title */
+"Delete chat with member?" = "Törli a taggal való csevegést?";
+
/* No comment provided by engineer. */
"Delete chat?" = "Törli a csevegést?";
@@ -1777,7 +1819,7 @@ swipe action */
"different migration in the app/database: %@ / %@" = "különböző átköltöztetés az alkalmazásban/adatbázisban: %@ / %@";
/* No comment provided by engineer. */
-"Different names, avatars and transport isolation." = "Különböző nevek, profilképek és átvitel-izoláció.";
+"Different names, avatars and transport isolation." = "Különböző nevek, profilképek és átvitelizoláció.";
/* connection level description */
"direct" = "közvetlen";
@@ -1872,7 +1914,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Ne maradjon le a fontos üzenetekről.";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Ne mutasd újra";
/* No comment provided by engineer. */
@@ -2116,6 +2158,9 @@ chat item action */
/* No comment provided by engineer. */
"Error accepting contact request" = "Hiba történt a meghívási kérés elfogadásakor";
+/* alert title */
+"Error accepting member" = "Hiba a tag befogadásakor";
+
/* No comment provided by engineer. */
"Error adding member(s)" = "Hiba történt a tag(ok) hozzáadásakor";
@@ -2173,6 +2218,9 @@ chat item action */
/* No comment provided by engineer. */
"Error deleting chat database" = "Hiba történt a csevegési adatbázis törlésekor";
+/* alert title */
+"Error deleting chat with member" = "Hiba a taggal való csevegés törlésekor";
+
/* No comment provided by engineer. */
"Error deleting chat!" = "Hiba történt a csevegés törlésekor!";
@@ -2189,7 +2237,7 @@ chat item action */
"Error deleting token" = "Hiba történt a token törlésekor";
/* No comment provided by engineer. */
-"Error deleting user profile" = "Hiba történt a felhasználó-profil törlésekor";
+"Error deleting user profile" = "Hiba történt a felhasználói profil törlésekor";
/* No comment provided by engineer. */
"Error downloading the archive" = "Hiba történt az archívum letöltésekor";
@@ -2236,7 +2284,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Hiba történt az értesítések regisztrálásakor";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Hiba történt a tag eltávolításakor";
/* alert title */
@@ -2610,6 +2658,9 @@ snd error text */
/* No comment provided by engineer. */
"Group invitation is no longer valid, it was removed by sender." = "A csoportmeghívó már nem érvényes, a küldője eltávolította.";
+/* No comment provided by engineer. */
+"group is deleted" = "csoport törölve";
+
/* No comment provided by engineer. */
"Group link" = "Csoporthivatkozás";
@@ -2956,10 +3007,10 @@ snd error text */
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Lehetővé teszi, hogy egyetlen csevegési profilon belül több névtelen kapcsolat legyen, anélkül, hogy megosztott adatok lennének közöttük.";
/* No comment provided by engineer. */
-"It can happen when you or your connection used the old database backup." = "Ez akkor fordulhat elő, ha Ön vagy a partnere régi adatbázis biztonsági mentést használt.";
+"It can happen when you or your connection used the old database backup." = "Ez akkor fordulhat elő, ha Ön vagy a partnere egy régi adatbázis biztonsági mentését használta.";
/* No comment provided by engineer. */
-"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere régebbi adatbázis biztonsági mentést használt.\n3. A kapcsolat sérült.";
+"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere egy régi adatbázis biztonsági mentését használta.\n3. A kapcsolat sérült.";
/* No comment provided by engineer. */
"It protects your IP address and connections." = "Védi az IP-címét és a kapcsolatait.";
@@ -3138,9 +3189,15 @@ snd error text */
/* profile update event chat item */
"member %@ changed to %@" = "%1$@ a következőre módosította a nevét: %2$@";
+/* No comment provided by engineer. */
+"Member admission" = "Tagbefogadás";
+
/* rcv group event chat item */
"member connected" = "kapcsolódott";
+/* No comment provided by engineer. */
+"member has old version" = "a tag régi verziót használ";
+
/* item status text */
"Member inactive" = "Inaktív tag";
@@ -3162,6 +3219,9 @@ snd error text */
/* No comment provided by engineer. */
"Member will be removed from group - this cannot be undone!" = "A tag el lesz távolítva a csoportból – ez a művelet nem vonható vissza!";
+/* alert message */
+"Member will join the group, accept member?" = "A tag csatlakozni akar a csoporthoz, befogadja a tagot?";
+
/* No comment provided by engineer. */
"Members can add message reactions." = "A tagok reakciókat adhatnak hozzá az üzenetekhez.";
@@ -3274,10 +3334,10 @@ snd error text */
"Messages were deleted after you selected them." = "Az üzeneteket törölték miután kijelölte őket.";
/* No comment provided by engineer. */
-"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti titkosítással**, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve.";
+"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti titkosítással**, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve.";
/* No comment provided by engineer. */
-"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti kvantumbiztos titkosítással**, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve.";
+"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti kvantumbiztos titkosítással**, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve.";
/* No comment provided by engineer. */
"Migrate device" = "Eszköz átköltöztetése";
@@ -3432,6 +3492,9 @@ snd error text */
/* No comment provided by engineer. */
"New member role" = "Új tag szerepköre";
+/* rcv group event chat item */
+"New member wants to join the group." = "Új tag szeretne csatlakozni a csoporthoz.";
+
/* notification */
"new message" = "új üzenet";
@@ -3471,6 +3534,9 @@ snd error text */
/* No comment provided by engineer. */
"No chats in list %@" = "Nincsenek csevegések a(z) %@ nevű listában";
+/* No comment provided by engineer. */
+"No chats with members" = "Nincsenek csevegések a tagokkal";
+
/* No comment provided by engineer. */
"No contacts selected" = "Nincs partner kijelölve";
@@ -3550,11 +3616,14 @@ snd error text */
"No unread chats" = "Nincsenek olvasatlan csevegések";
/* No comment provided by engineer. */
-"No user identifiers." = "Nincsenek felhasználó-azonosítók.";
+"No user identifiers." = "Nincsenek felhasználói azonosítók.";
/* No comment provided by engineer. */
"Not compatible!" = "Nem kompatibilis!";
+/* No comment provided by engineer. */
+"not synchronized" = "nincs szinkronizálva";
+
/* No comment provided by engineer. */
"Notes" = "Jegyzetek";
@@ -3587,6 +3656,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "kikapcsolva";
@@ -3599,7 +3669,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "ajánlotta: %1$@, ekkor: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Rendben";
/* No comment provided by engineer. */
@@ -3695,6 +3766,9 @@ time to disappear */
/* No comment provided by engineer. */
"Open group" = "Csoport megnyitása";
+/* alert title */
+"Open link?" = "Megnyitja a hivatkozást?";
+
/* authentication reason */
"Open migration to another device" = "Átköltöztetés indítása egy másik eszközre";
@@ -3797,6 +3871,9 @@ time to disappear */
/* No comment provided by engineer. */
"pending approval" = "jóváhagyásra vár";
+/* No comment provided by engineer. */
+"pending review" = "függőben lévő áttekintés";
+
/* No comment provided by engineer. */
"Periodic" = "Időszakos";
@@ -3866,6 +3943,9 @@ time to disappear */
/* token info */
"Please try to disable and re-enable notfications." = "Próbálja meg letiltani és újra engedélyezni az értesítéseket.";
+/* snd group event chat item */
+"Please wait for group moderators to review your request to join the group." = "Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérelmét.";
+
/* token info */
"Please wait for token activation to complete." = "Várjon, amíg a token aktiválása befejeződik.";
@@ -4146,6 +4226,9 @@ swipe action */
/* No comment provided by engineer. */
"Reject contact request" = "Meghívási kérés elutasítása";
+/* alert title */
+"Reject member?" = "Elutasítja a tagot?";
+
/* No comment provided by engineer. */
"rejected" = "elutasítva";
@@ -4153,10 +4236,10 @@ swipe action */
"rejected call" = "elutasított hívás";
/* No comment provided by engineer. */
-"Relay server is only used if necessary. Another party can observe your IP address." = "A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címet.";
+"Relay server is only used if necessary. Another party can observe your IP address." = "A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét.";
/* No comment provided by engineer. */
-"Relay server protects your IP address, but it can observe the duration of the call." = "A továbbítókiszolgáló megvédi az Ön IP-címét, de megfigyelheti a hívás időtartamát.";
+"Relay server protects your IP address, but it can observe the duration of the call." = "A továbbítókiszolgáló megvédi az IP-címét, de megfigyelheti a hívás időtartamát.";
/* No comment provided by engineer. */
"Remove" = "Eltávolítás";
@@ -4185,6 +4268,9 @@ swipe action */
/* profile update event chat item */
"removed contact address" = "eltávolította a kapcsolattartási címet";
+/* No comment provided by engineer. */
+"removed from group" = "eltávolítva a csoportból";
+
/* profile update event chat item */
"removed profile picture" = "eltávolította a profilképét";
@@ -4233,6 +4319,9 @@ swipe action */
/* No comment provided by engineer. */
"Report reason?" = "Jelentés indoklása?";
+/* alert title */
+"Report sent to moderators" = "A jelentés el lett küldve a moderátoroknak";
+
/* report reason */
"Report spam: only group moderators will see it." = "Kéretlen tartalom jelentése: csak a csoport moderátorai látják.";
@@ -4248,6 +4337,9 @@ swipe action */
/* No comment provided by engineer. */
"Reports" = "Jelentések";
+/* No comment provided by engineer. */
+"request to join rejected" = "csatlakozási kérelem elutasítva";
+
/* chat list item title */
"requested to connect" = "Függőben lévő meghívási kérelem";
@@ -4302,9 +4394,21 @@ swipe action */
/* chat item action */
"Reveal" = "Felfedés";
+/* No comment provided by engineer. */
+"review" = "áttekintés";
+
/* No comment provided by engineer. */
"Review conditions" = "Feltételek felülvizsgálata";
+/* admission stage */
+"Review members" = "Tagok áttekintése";
+
+/* admission stage description */
+"Review members before admitting (\"knocking\")." = "Tagok áttekintése a befogadás előtt (kopogtatás).";
+
+/* No comment provided by engineer. */
+"reviewed by admins" = "áttekintve a moderátorok által";
+
/* No comment provided by engineer. */
"Revoke" = "Visszavonás";
@@ -4333,6 +4437,9 @@ chat item action */
/* alert button */
"Save (and notify contacts)" = "Mentés (és a partnerek értesítése)";
+/* alert title */
+"Save admission settings?" = "Elmenti a befogadási beállításokat?";
+
/* alert button */
"Save and notify contact" = "Mentés és a partner értesítése";
@@ -4669,6 +4776,9 @@ chat item action */
/* No comment provided by engineer. */
"Set it instead of system authentication." = "Beállítás a rendszer-hitelesítés helyett.";
+/* No comment provided by engineer. */
+"Set member admission" = "Tagbefogadás beállítása";
+
/* No comment provided by engineer. */
"Set message expiration in chats." = "Üzenetek eltűnési idejének módosítása a csevegésekben.";
@@ -4830,7 +4940,7 @@ chat item action */
"SimpleX one-time invitation" = "Egyszer használható SimpleX-meghívó";
/* No comment provided by engineer. */
-"SimpleX protocols reviewed by Trail of Bits." = "A SimpleX Chat biztonsága a Trail of Bits által lett felülvizsgálva.";
+"SimpleX protocols reviewed by Trail of Bits." = "A SimpleX-protokollokat a Trail of Bits auditálta.";
/* No comment provided by engineer. */
"Simplified incognito mode" = "Egyszerűsített inkognitómód";
@@ -5100,9 +5210,6 @@ report reason */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "A régi adatbázis nem lett eltávolítva az átköltöztetéskor, ezért törölhető.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "A profilja csak a partnereivel van megosztva.";
-
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Ugyanezek a feltételek lesznek elfogadva a következő üzemeltető számára is: **%@**.";
@@ -5263,7 +5370,7 @@ report reason */
"Total" = "Összes kapcsolat";
/* No comment provided by engineer. */
-"Transport isolation" = "Átvitel-izoláció";
+"Transport isolation" = "Átvitelelkülönítés";
/* No comment provided by engineer. */
"Transport sessions" = "Munkamenetek átvitele";
@@ -5458,7 +5565,7 @@ report reason */
"Use only local notifications?" = "Csak helyi értesítések használata?";
/* No comment provided by engineer. */
-"Use private routing with unknown servers when IP address is not protected." = "Használjon privát útválasztást ismeretlen kiszolgálókkal, ha az IP-cím nem védett.";
+"Use private routing with unknown servers when IP address is not protected." = "Használjon privát útválasztást az ismeretlen kiszolgálókkal, ha az IP-cím nem védett.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Használjon privát útválasztást ismeretlen kiszolgálókkal.";
@@ -5680,10 +5787,10 @@ report reason */
"With reduced battery usage." = "Csökkentett akkumulátor-használattal.";
/* No comment provided by engineer. */
-"Without Tor or VPN, your IP address will be visible to file servers." = "Tor vagy VPN nélkül az Ön IP-címe látható lesz a fájlkiszolgálók számára.";
+"Without Tor or VPN, your IP address will be visible to file servers." = "Tor vagy VPN nélkül az IP-címe láthatóvá válik a fájlkiszolgálók számára.";
/* alert message */
-"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Tor vagy VPN nélkül az Ön IP-címe látható lesz a következő XFTP-továbbítókiszolgálók számára: %@.";
+"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-továbbítókiszolgálók számára: %@.";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Érvénytelen adatbázis-jelmondat";
@@ -5712,6 +5819,9 @@ report reason */
/* No comment provided by engineer. */
"You accepted connection" = "Kapcsolat létrehozása";
+/* snd group event chat item */
+"you accepted this member" = "Ön befogadta ezt a tagot";
+
/* No comment provided by engineer. */
"You allow" = "Ön engedélyezi";
@@ -5823,6 +5933,9 @@ report reason */
/* alert message */
"You can view invitation link again in connection details." = "A meghívási hivatkozást újra megtekintheti a kapcsolat részleteinél.";
+/* alert message */
+"You can view your reports in Chat with admins." = "A jelentéseket megtekintheti a „Csevegés az adminisztrátorokkal” menüben.";
+
/* No comment provided by engineer. */
"You can't send messages!" = "Nem lehet üzeneteket küldeni!";
@@ -5991,15 +6104,15 @@ report reason */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "A(z) **%@** nevű profilja meg lesz osztva.";
+/* No comment provided by engineer. */
+"Your profile is stored on your device and only shared with your contacts." = "A profilja az eszközén van tárolva és csak a partnereivel van megosztva.";
+
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "A profilja az eszközén van tárolva és csak a partnereivel van megosztva. A SimpleX-kiszolgálók nem láthatják a profilját.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "A profilja módosult. Ha elmenti, a profilfrissítés el lesz küldve a partnerei számára.";
-/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "A profilja, a partnerei és az elküldött üzenetei a saját eszközén vannak tárolva.";
-
/* No comment provided by engineer. */
"Your random profile" = "Véletlenszerű profil";
diff --git a/apps/ios/it.lproj/Localizable.strings b/apps/ios/it.lproj/Localizable.strings
index b914a06079..996484aea0 100644
--- a/apps/ios/it.lproj/Localizable.strings
+++ b/apps/ios/it.lproj/Localizable.strings
@@ -1872,7 +1872,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Non perdere messaggi importanti.";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Non mostrare più";
/* No comment provided by engineer. */
@@ -2236,7 +2236,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Errore di registrazione per le notifiche";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Errore nella rimozione del membro";
/* alert title */
@@ -3587,6 +3587,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "off";
@@ -3599,7 +3600,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "offerto %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Ok";
/* No comment provided by engineer. */
@@ -3695,6 +3697,9 @@ time to disappear */
/* No comment provided by engineer. */
"Open group" = "Apri gruppo";
+/* alert title */
+"Open link?" = "Aprire il link?";
+
/* authentication reason */
"Open migration to another device" = "Apri migrazione ad un altro dispositivo";
@@ -4170,7 +4175,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "Rimuovi membro";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "Rimuovere il membro?";
/* No comment provided by engineer. */
@@ -5100,9 +5105,6 @@ report reason */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Il database vecchio non è stato rimosso durante la migrazione, può essere eliminato.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "Il profilo è condiviso solo con i tuoi contatti.";
-
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Le stesse condizioni si applicheranno all'operatore **%@**.";
@@ -5991,15 +5993,15 @@ report reason */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Verrà condiviso il tuo profilo **%@**.";
+/* No comment provided by engineer. */
+"Your profile is stored on your device and only shared with your contacts." = "Il profilo è condiviso solo con i tuoi contatti.";
+
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Il tuo profilo è memorizzato sul tuo dispositivo e condiviso solo con i tuoi contatti. I server di SimpleX non possono vedere il tuo profilo.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Il tuo profilo è stato cambiato. Se lo salvi, il profilo aggiornato verrà inviato a tutti i tuoi contatti.";
-/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Il tuo profilo, i contatti e i messaggi recapitati sono memorizzati sul tuo dispositivo.";
-
/* No comment provided by engineer. */
"Your random profile" = "Il tuo profilo casuale";
diff --git a/apps/ios/ja.lproj/Localizable.strings b/apps/ios/ja.lproj/Localizable.strings
index d214f88e1c..8e4b071f88 100644
--- a/apps/ios/ja.lproj/Localizable.strings
+++ b/apps/ios/ja.lproj/Localizable.strings
@@ -1277,7 +1277,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "有効にしない";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "次から表示しない";
/* No comment provided by engineer. */
@@ -1514,7 +1514,7 @@ swipe action */
/* alert title */
"Error receiving file" = "ファイル受信にエラー発生";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "メンバー除名にエラー発生";
/* No comment provided by engineer. */
@@ -2295,6 +2295,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "オフ";
@@ -2307,7 +2308,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "提供された %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "OK";
/* No comment provided by engineer. */
@@ -2626,7 +2628,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "メンバーを除名する";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "メンバーを除名しますか?";
/* No comment provided by engineer. */
@@ -3111,9 +3113,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "古いデータベースは移行時に削除されなかったので、削除することができます。";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "プロフィールは連絡先にしか共有されません。";
-
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "長らくお待たせしました! ✅";
@@ -3592,10 +3591,10 @@ chat item action */
"Your profile **%@** will be shared." = "あなたのプロファイル **%@** が共有されます。";
/* No comment provided by engineer. */
-"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "プロフィールはデバイスに保存され、連絡先とのみ共有されます。 SimpleX サーバーはあなたのプロファイルを参照できません。";
+"Your profile is stored on your device and only shared with your contacts." = "プロフィールは連絡先にしか共有されません。";
/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "あなたのプロフィール、連絡先、送信したメッセージがご自分の端末に保存されます。";
+"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "プロフィールはデバイスに保存され、連絡先とのみ共有されます。 SimpleX サーバーはあなたのプロファイルを参照できません。";
/* No comment provided by engineer. */
"Your random profile" = "あなたのランダム・プロフィール";
diff --git a/apps/ios/nl.lproj/Localizable.strings b/apps/ios/nl.lproj/Localizable.strings
index 232de56641..f0ca51fffb 100644
--- a/apps/ios/nl.lproj/Localizable.strings
+++ b/apps/ios/nl.lproj/Localizable.strings
@@ -1869,7 +1869,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Mis geen belangrijke berichten.";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Niet meer weergeven";
/* No comment provided by engineer. */
@@ -2233,7 +2233,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "Fout bij registreren voor meldingen";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Fout bij verwijderen van lid";
/* alert title */
@@ -3584,6 +3584,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "uit";
@@ -3596,7 +3597,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "voorgesteld %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "OK";
/* No comment provided by engineer. */
@@ -4167,7 +4169,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "Lid verwijderen";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "Lid verwijderen?";
/* No comment provided by engineer. */
@@ -5091,9 +5093,6 @@ report reason */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "De oude database is niet verwijderd tijdens de migratie, deze kan worden verwijderd.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "Het profiel wordt alleen gedeeld met uw contacten.";
-
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Dezelfde voorwaarden gelden voor operator **%@**.";
@@ -5970,15 +5969,15 @@ report reason */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Uw profiel **%@** wordt gedeeld.";
+/* No comment provided by engineer. */
+"Your profile is stored on your device and only shared with your contacts." = "Het profiel wordt alleen gedeeld met uw contacten.";
+
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Uw profiel wordt op uw apparaat opgeslagen en alleen gedeeld met uw contacten. SimpleX servers kunnen uw profiel niet zien.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Je profiel is gewijzigd. Als je het opslaat, wordt het bijgewerkte profiel naar al je contacten verzonden.";
-/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Uw profiel, contacten en afgeleverde berichten worden op uw apparaat opgeslagen.";
-
/* No comment provided by engineer. */
"Your random profile" = "Je willekeurige profiel";
diff --git a/apps/ios/pl.lproj/Localizable.strings b/apps/ios/pl.lproj/Localizable.strings
index 31a9b87662..e3582c7647 100644
--- a/apps/ios/pl.lproj/Localizable.strings
+++ b/apps/ios/pl.lproj/Localizable.strings
@@ -1761,7 +1761,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "Nie włączaj";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Nie pokazuj ponownie";
/* No comment provided by engineer. */
@@ -2092,7 +2092,7 @@ chat item action */
/* No comment provided by engineer. */
"Error reconnecting servers" = "Błąd ponownego łączenia serwerów";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Błąd usuwania członka";
/* No comment provided by engineer. */
@@ -3236,6 +3236,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "wyłączony";
@@ -3248,7 +3249,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "zaoferował %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Ok";
/* No comment provided by engineer. */
@@ -3744,7 +3746,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "Usuń członka";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "Usunąć członka?";
/* No comment provided by engineer. */
@@ -4556,9 +4558,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Stara baza danych nie została usunięta podczas migracji, można ją usunąć.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "Profil jest udostępniany tylko Twoim kontaktom.";
-
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Drugi tik, który przegapiliśmy! ✅";
@@ -5354,15 +5353,15 @@ chat item action */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Twój profil **%@** zostanie udostępniony.";
+/* No comment provided by engineer. */
+"Your profile is stored on your device and only shared with your contacts." = "Profil jest udostępniany tylko Twoim kontaktom.";
+
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Twój profil jest przechowywany na urządzeniu i udostępniany tylko Twoim kontaktom. Serwery SimpleX nie mogą zobaczyć Twojego profilu.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Twój profil został zmieniony. Jeśli go zapiszesz, zaktualizowany profil zostanie wysłany do wszystkich kontaktów.";
-/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Twój profil, kontakty i dostarczone wiadomości są przechowywane na Twoim urządzeniu.";
-
/* No comment provided by engineer. */
"Your random profile" = "Twój losowy profil";
diff --git a/apps/ios/ru.lproj/Localizable.strings b/apps/ios/ru.lproj/Localizable.strings
index cb837836ff..c14c7a7e9f 100644
--- a/apps/ios/ru.lproj/Localizable.strings
+++ b/apps/ios/ru.lproj/Localizable.strings
@@ -1860,7 +1860,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "Не пропустите важные сообщения.";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Не показывать";
/* No comment provided by engineer. */
@@ -3482,6 +3482,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "нет";
@@ -3494,7 +3495,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "предложил(a) %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Ок";
/* No comment provided by engineer. */
@@ -4956,9 +4958,6 @@ report reason */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Предыдущая версия данных чата не удалена при перемещении, её можно удалить.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "Ваш профиль храниться на Вашем устройстве и отправляется только контактам.";
-
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Те же самые условия будут приняты для оператора **%@**.";
@@ -5811,15 +5810,15 @@ report reason */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Будет отправлен Ваш профиль **%@**.";
+/* No comment provided by engineer. */
+"Your profile is stored on your device and only shared with your contacts." = "Ваш профиль храниться на Вашем устройстве и отправляется только контактам.";
+
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Ваш профиль хранится на Вашем устройстве и отправляется только Вашим контактам. SimpleX серверы не могут получить доступ к Вашему профилю.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Ваш профиль был изменен. Если вы сохраните его, обновленный профиль будет отправлен всем вашим контактам.";
-/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Ваш профиль, контакты и доставленные сообщения хранятся на Вашем устройстве.";
-
/* No comment provided by engineer. */
"Your random profile" = "Случайный профиль";
diff --git a/apps/ios/th.lproj/Localizable.strings b/apps/ios/th.lproj/Localizable.strings
index 57c0466eb9..d6e48caf86 100644
--- a/apps/ios/th.lproj/Localizable.strings
+++ b/apps/ios/th.lproj/Localizable.strings
@@ -1028,7 +1028,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "อย่าเปิดใช้งาน";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "ไม่ต้องแสดงอีก";
/* No comment provided by engineer. */
@@ -1256,7 +1256,7 @@ swipe action */
/* alert title */
"Error receiving file" = "เกิดข้อผิดพลาดในการรับไฟล์";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "เกิดข้อผิดพลาดในการลบสมาชิก";
/* No comment provided by engineer. */
@@ -2016,6 +2016,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "ปิด";
@@ -2028,7 +2029,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "เสนอแล้ว %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "ตกลง";
/* No comment provided by engineer. */
@@ -2338,7 +2340,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "ลบสมาชิกออก";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "ลบสมาชิกออก?";
/* No comment provided by engineer. */
@@ -2829,9 +2831,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "ฐานข้อมูลเก่าไม่ได้ถูกลบในระหว่างการย้ายข้อมูล แต่สามารถลบได้";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "โปรไฟล์นี้แชร์กับผู้ติดต่อของคุณเท่านั้น";
-
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "ขีดที่สองที่เราพลาด! ✅";
@@ -3292,10 +3291,10 @@ chat item action */
"Your privacy" = "ความเป็นส่วนตัวของคุณ";
/* No comment provided by engineer. */
-"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "โปรไฟล์ของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณและแชร์กับผู้ติดต่อของคุณเท่านั้น เซิร์ฟเวอร์ SimpleX ไม่สามารถดูโปรไฟล์ของคุณได้";
+"Your profile is stored on your device and only shared with your contacts." = "โปรไฟล์นี้แชร์กับผู้ติดต่อของคุณเท่านั้น";
/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "โปรไฟล์ รายชื่อผู้ติดต่อ และข้อความที่ส่งของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณ";
+"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "โปรไฟล์ของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณและแชร์กับผู้ติดต่อของคุณเท่านั้น เซิร์ฟเวอร์ SimpleX ไม่สามารถดูโปรไฟล์ของคุณได้";
/* No comment provided by engineer. */
"Your random profile" = "โปรไฟล์แบบสุ่มของคุณ";
diff --git a/apps/ios/tr.lproj/Localizable.strings b/apps/ios/tr.lproj/Localizable.strings
index e3bb11d1cc..2433c9ae58 100644
--- a/apps/ios/tr.lproj/Localizable.strings
+++ b/apps/ios/tr.lproj/Localizable.strings
@@ -1740,7 +1740,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "Etkinleştirme";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Yeniden gösterme";
/* No comment provided by engineer. */
@@ -2083,7 +2083,7 @@ chat item action */
/* No comment provided by engineer. */
"Error reconnecting servers" = "Hata sunuculara yeniden bağlanılıyor";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Kişiyi silerken sorun oluştu";
/* No comment provided by engineer. */
@@ -3272,6 +3272,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "kapalı";
@@ -3284,7 +3285,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "%1$@: %2$@ teklif etti";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Tamam";
/* No comment provided by engineer. */
@@ -3780,7 +3782,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "Kişiyi sil";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "Kişi silinsin mi?";
/* No comment provided by engineer. */
@@ -4601,9 +4603,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Eski veritabanı geçiş sırasında kaldırılmadı, silinebilir.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "Profil sadece kişilerinle paylaşılacak.";
-
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Özlediğimiz ikinci tik! ✅";
@@ -5399,15 +5398,15 @@ chat item action */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Profiliniz **%@** paylaşılacaktır.";
+/* No comment provided by engineer. */
+"Your profile is stored on your device and only shared with your contacts." = "Profil sadece kişilerinle paylaşılacak.";
+
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Profiliniz cihazınızda saklanır ve sadece kişilerinizle paylaşılır. SimpleX sunucuları profilinizi göremez.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Profiliniz değiştirildi. Kaydederseniz, güncellenmiş profil tüm kişilerinize gönderilecektir.";
-/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Profiliniz, kişileriniz ve gönderilmiş mesajlar cihazınızda saklanır.";
-
/* No comment provided by engineer. */
"Your random profile" = "Rasgele profiliniz";
diff --git a/apps/ios/uk.lproj/Localizable.strings b/apps/ios/uk.lproj/Localizable.strings
index 734b8dda82..6e6197cdb7 100644
--- a/apps/ios/uk.lproj/Localizable.strings
+++ b/apps/ios/uk.lproj/Localizable.strings
@@ -1746,7 +1746,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't enable" = "Не вмикати";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "Більше не показувати";
/* No comment provided by engineer. */
@@ -2089,7 +2089,7 @@ chat item action */
/* No comment provided by engineer. */
"Error reconnecting servers" = "Помилка перепідключення серверів";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "Помилка видалення учасника";
/* No comment provided by engineer. */
@@ -3317,6 +3317,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "вимкнено";
@@ -3329,7 +3330,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "запропонував %1$@: %2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "Гаразд";
/* No comment provided by engineer. */
@@ -3852,7 +3854,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "Видалити учасника";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "Видалити учасника?";
/* No comment provided by engineer. */
@@ -4721,9 +4723,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "Стара база даних не була видалена під час міграції, її можна видалити.";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "Профіль доступний лише вашим контактам.";
-
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Такі ж умови діятимуть і для оператора **%@**.";
@@ -5579,15 +5578,15 @@ chat item action */
/* No comment provided by engineer. */
"Your profile **%@** will be shared." = "Ваш профіль **%@** буде опублікований.";
+/* No comment provided by engineer. */
+"Your profile is stored on your device and only shared with your contacts." = "Профіль доступний лише вашим контактам.";
+
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Ваш профіль зберігається на вашому пристрої і доступний лише вашим контактам. Сервери SimpleX не бачать ваш профіль.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Ваш профіль було змінено. Якщо ви збережете його, оновлений профіль буде надіслано всім вашим контактам.";
-/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "Ваш профіль, контакти та доставлені повідомлення зберігаються на вашому пристрої.";
-
/* No comment provided by engineer. */
"Your random profile" = "Ваш випадковий профіль";
diff --git a/apps/ios/zh-Hans.lproj/Localizable.strings b/apps/ios/zh-Hans.lproj/Localizable.strings
index e3f9669d9f..9df0e04717 100644
--- a/apps/ios/zh-Hans.lproj/Localizable.strings
+++ b/apps/ios/zh-Hans.lproj/Localizable.strings
@@ -1866,7 +1866,7 @@ swipe action */
/* No comment provided by engineer. */
"Don't miss important messages." = "不错过重要消息。";
-/* No comment provided by engineer. */
+/* alert action */
"Don't show again" = "不再显示";
/* No comment provided by engineer. */
@@ -2227,7 +2227,7 @@ chat item action */
/* alert title */
"Error registering for notifications" = "注册消息推送出错";
-/* No comment provided by engineer. */
+/* alert title */
"Error removing member" = "删除成员错误";
/* alert title */
@@ -3575,6 +3575,7 @@ snd error text */
/* enabled status
group pref value
+member criteria value
time to disappear */
"off" = "关闭";
@@ -3587,7 +3588,8 @@ time to disappear */
/* feature offered item */
"offered %@: %@" = "已提供 %1$@:%2$@";
-/* alert button */
+/* alert action
+alert button */
"Ok" = "好的";
/* No comment provided by engineer. */
@@ -4107,7 +4109,7 @@ swipe action */
/* No comment provided by engineer. */
"Remove member" = "删除成员";
-/* No comment provided by engineer. */
+/* alert title */
"Remove member?" = "删除成员吗?";
/* No comment provided by engineer. */
@@ -4922,9 +4924,6 @@ chat item action */
/* No comment provided by engineer. */
"The old database was not removed during the migration, it can be deleted." = "旧数据库在迁移过程中没有被移除,可以删除。";
-/* No comment provided by engineer. */
-"Your profile is stored on your device and only shared with your contacts." = "该资料仅与您的联系人共享。";
-
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "我们错过的第二个\"√\"!✅";
@@ -5697,10 +5696,10 @@ chat item action */
"Your profile **%@** will be shared." = "您的个人资料 **%@** 将被共享。";
/* No comment provided by engineer. */
-"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "您的资料存储在您的设备上并仅与您的联系人共享。 SimpleX 服务器无法看到您的资料。";
+"Your profile is stored on your device and only shared with your contacts." = "该资料仅与您的联系人共享。";
/* No comment provided by engineer. */
-"Your profile, contacts and delivered messages are stored on your device." = "您的资料、联系人和发送的消息存储在您的设备上。";
+"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "您的资料存储在您的设备上并仅与您的联系人共享。 SimpleX 服务器无法看到您的资料。";
/* No comment provided by engineer. */
"Your random profile" = "您的随机资料";
diff --git a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt
index 3263e559b7..4f48ccca52 100644
--- a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt
+++ b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt
@@ -42,7 +42,6 @@ import chat.simplex.common.views.helpers.*
import chat.simplex.res.MR
import dev.icerock.moko.resources.StringResource
import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.filter
import java.lang.reflect.Field
import java.net.URI
@@ -51,11 +50,10 @@ import java.net.URI
actual fun PlatformTextField(
composeState: MutableState,
sendMsgEnabled: Boolean,
+ disabledText: String?,
sendMsgButtonDisabled: Boolean,
textStyle: MutableState,
showDeleteTextButton: MutableState,
- userIsObserver: Boolean,
- userIsPending: Boolean,
placeholder: String,
showVoiceButton: Boolean,
onMessageChange: (ComposeMessage) -> Unit,
@@ -198,18 +196,16 @@ actual fun PlatformTextField(
showDeleteTextButton.value = it.lineCount >= 4 && !cs.inProgress
}
if (composeState.value.preview is ComposePreview.VoicePreview) {
- ComposeOverlay(MR.strings.voice_message_send_text, textStyle, padding)
- } else if (userIsPending) {
- ComposeOverlay(MR.strings.reviewed_by_admins, textStyle, padding)
- } else if (userIsObserver) {
- ComposeOverlay(MR.strings.you_are_observer, textStyle, padding)
+ ComposeOverlay(generalGetString(MR.strings.voice_message_send_text), textStyle, padding)
+ } else if (disabledText != null) {
+ ComposeOverlay(disabledText, textStyle, padding)
}
}
@Composable
-private fun ComposeOverlay(textId: StringResource, textStyle: MutableState, padding: PaddingValues) {
+private fun ComposeOverlay(text: String, textStyle: MutableState, padding: PaddingValues) {
Text(
- generalGetString(textId),
+ text,
Modifier.padding(padding),
color = MaterialTheme.colors.secondary,
style = textStyle.value.copy(fontStyle = FontStyle.Italic)
diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt
index 9329fe5dda..270b3a73b2 100644
--- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt
+++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt
@@ -1272,7 +1272,6 @@ interface SomeChat {
val apiId: Long
val ready: Boolean
val chatDeleted: Boolean
- val sendMsgEnabled: Boolean
val incognito: Boolean
fun featureEnabled(feature: ChatFeature): Boolean
val timedMessagesTTL: Int?
@@ -1296,19 +1295,6 @@ data class Chat(
else -> false
}
- val userIsObserver: Boolean get() = when(chatInfo) {
- is ChatInfo.Group -> {
- val m = chatInfo.groupInfo.membership
- m.memberActive && m.memberRole == GroupMemberRole.Observer
- }
- else -> false
- }
-
- val userIsPending: Boolean get() = when(chatInfo) {
- is ChatInfo.Group -> chatInfo.groupInfo.membership.memberPending
- else -> false
- }
-
val unreadTag: Boolean get() = when (chatInfo.chatSettings?.enableNtfs) {
All -> chatStats.unreadChat || chatStats.unreadCount > 0
Mentions -> chatStats.unreadChat || chatStats.unreadMentions > 0
@@ -1365,7 +1351,6 @@ sealed class ChatInfo: SomeChat, NamedChat {
override val apiId get() = contact.apiId
override val ready get() = contact.ready
override val chatDeleted get() = contact.chatDeleted
- override val sendMsgEnabled get() = contact.sendMsgEnabled
override val incognito get() = contact.incognito
override fun featureEnabled(feature: ChatFeature) = contact.featureEnabled(feature)
override val timedMessagesTTL: Int? get() = contact.timedMessagesTTL
@@ -1390,7 +1375,6 @@ sealed class ChatInfo: SomeChat, NamedChat {
override val apiId get() = groupInfo.apiId
override val ready get() = groupInfo.ready
override val chatDeleted get() = groupInfo.chatDeleted
- override val sendMsgEnabled get() = groupInfo.sendMsgEnabled
override val incognito get() = groupInfo.incognito
override fun featureEnabled(feature: ChatFeature) = groupInfo.featureEnabled(feature)
override val timedMessagesTTL: Int? get() = groupInfo.timedMessagesTTL
@@ -1414,7 +1398,6 @@ sealed class ChatInfo: SomeChat, NamedChat {
override val apiId get() = noteFolder.apiId
override val ready get() = noteFolder.ready
override val chatDeleted get() = noteFolder.chatDeleted
- override val sendMsgEnabled get() = noteFolder.sendMsgEnabled
override val incognito get() = noteFolder.incognito
override fun featureEnabled(feature: ChatFeature) = noteFolder.featureEnabled(feature)
override val timedMessagesTTL: Int? get() = noteFolder.timedMessagesTTL
@@ -1438,7 +1421,6 @@ sealed class ChatInfo: SomeChat, NamedChat {
override val apiId get() = contactRequest.apiId
override val ready get() = contactRequest.ready
override val chatDeleted get() = contactRequest.chatDeleted
- override val sendMsgEnabled get() = contactRequest.sendMsgEnabled
override val incognito get() = contactRequest.incognito
override fun featureEnabled(feature: ChatFeature) = contactRequest.featureEnabled(feature)
override val timedMessagesTTL: Int? get() = contactRequest.timedMessagesTTL
@@ -1462,7 +1444,6 @@ sealed class ChatInfo: SomeChat, NamedChat {
override val apiId get() = contactConnection.apiId
override val ready get() = contactConnection.ready
override val chatDeleted get() = contactConnection.chatDeleted
- override val sendMsgEnabled get() = contactConnection.sendMsgEnabled
override val incognito get() = contactConnection.incognito
override fun featureEnabled(feature: ChatFeature) = contactConnection.featureEnabled(feature)
override val timedMessagesTTL: Int? get() = contactConnection.timedMessagesTTL
@@ -1491,7 +1472,6 @@ sealed class ChatInfo: SomeChat, NamedChat {
override val id get() = "?$apiId"
override val ready get() = false
override val chatDeleted get() = false
- override val sendMsgEnabled get() = false
override val incognito get() = false
override fun featureEnabled(feature: ChatFeature) = false
override val timedMessagesTTL: Int? get() = null
@@ -1506,6 +1486,66 @@ sealed class ChatInfo: SomeChat, NamedChat {
}
}
+ val userCantSendReason: Pair?
+ get() {
+ when (this) {
+ is Direct -> {
+ // TODO [short links] this will have additional statuses for pending contact requests before they are accepted
+ if (contact.nextSendGrpInv) return null
+ if (!contact.active) return generalGetString(MR.strings.cant_send_message_contact_deleted) to null
+ if (!contact.sndReady) return generalGetString(MR.strings.cant_send_message_contact_not_ready) to null
+ if (contact.activeConn?.connectionStats?.ratchetSyncSendProhibited == true) return generalGetString(MR.strings.cant_send_message_contact_not_synchronized) to null
+ if (contact.activeConn?.connDisabled == true) return generalGetString(MR.strings.cant_send_message_contact_disabled) to null
+ return null
+ }
+ is Group -> {
+ if (groupInfo.membership.memberActive) {
+ when (groupChatScope) {
+ null -> {
+ if (groupInfo.membership.memberPending) {
+ return generalGetString(MR.strings.reviewed_by_admins) to generalGetString(MR.strings.observer_cant_send_message_desc)
+ }
+ if (groupInfo.membership.memberRole == GroupMemberRole.Observer) {
+ return generalGetString(MR.strings.observer_cant_send_message_title) to generalGetString(MR.strings.observer_cant_send_message_desc)
+ }
+ return null
+ }
+ is GroupChatScopeInfo.MemberSupport ->
+ if (groupChatScope.groupMember_ != null) {
+ if (
+ groupChatScope.groupMember_.versionRange.maxVersion < GROUP_KNOCKING_VERSION
+ && !groupChatScope.groupMember_.memberPending
+ ) {
+ return generalGetString(MR.strings.cant_send_message_member_has_old_version) to null
+ }
+ return null
+ } else {
+ return null
+ }
+ }
+ } else {
+ return when (groupInfo.membership.memberStatus) {
+ GroupMemberStatus.MemRejected -> generalGetString(MR.strings.cant_send_message_rejected) to null
+ GroupMemberStatus.MemGroupDeleted -> generalGetString(MR.strings.cant_send_message_group_deleted) to null
+ GroupMemberStatus.MemRemoved -> generalGetString(MR.strings.cant_send_message_mem_removed) to null
+ GroupMemberStatus.MemLeft -> generalGetString(MR.strings.cant_send_message_you_left) to null
+ else -> generalGetString(MR.strings.cant_send_message_generic) to null
+ }
+ }
+ }
+ is Local ->
+ return null
+ is ContactRequest ->
+ return generalGetString(MR.strings.cant_send_message_generic) to null
+ is ContactConnection ->
+ return generalGetString(MR.strings.cant_send_message_generic) to null
+ is InvalidJSON ->
+ return generalGetString(MR.strings.cant_send_message_generic) to null
+ }
+ }
+
+ val sendMsgEnabled get() = userCantSendReason == null
+
fun groupChatScope(): GroupChatScope? = when (this) {
is Group -> groupChatScope?.toChatScope()
else -> null
@@ -1538,16 +1578,6 @@ sealed class ChatInfo: SomeChat, NamedChat {
is InvalidJSON -> updatedAt
}
- val userCanSend: Boolean
- get() = when (this) {
- is ChatInfo.Direct -> true
- is ChatInfo.Group ->
- (groupInfo.membership.memberRole >= GroupMemberRole.Member && !groupInfo.membership.memberPending)
- || groupChatScope != null
- is ChatInfo.Local -> true
- else -> false
- }
-
val chatTags: List?
get() = when (this) {
is Direct -> contact.chatTags
@@ -1624,13 +1654,6 @@ data class Contact(
override val ready get() = activeConn?.connStatus == ConnStatus.Ready
val sndReady get() = ready || activeConn?.connStatus == ConnStatus.SndReady
val active get() = contactStatus == ContactStatus.Active
- override val sendMsgEnabled get() = (
- sndReady
- && active
- && !(activeConn?.connectionStats?.ratchetSyncSendProhibited ?: false)
- && !(activeConn?.connDisabled ?: true)
- )
- || nextSendGrpInv
val nextSendGrpInv get() = contactGroupMemberId != null && !contactGrpInvSent
override val incognito get() = contactConnIncognito
override fun featureEnabled(feature: ChatFeature) = when (feature) {
@@ -1865,7 +1888,6 @@ data class GroupInfo (
override val apiId get() = groupId
override val ready get() = membership.memberActive
override val chatDeleted get() = false
- override val sendMsgEnabled get() = membership.memberActive
override val incognito get() = membership.memberIncognito
override fun featureEnabled(feature: ChatFeature) = when (feature) {
ChatFeature.TimedMessages -> fullGroupPreferences.timedMessages.on
@@ -1997,7 +2019,8 @@ data class GroupMember (
val memberContactId: Long? = null,
val memberContactProfileId: Long,
var activeConn: Connection? = null,
- val supportChat: GroupSupportChat? = null
+ val supportChat: GroupSupportChat? = null,
+ val memberChatVRange: VersionRange
): NamedChat {
val id: String get() = "#$groupId @$groupMemberId"
val ready get() = activeConn?.connStatus == ConnStatus.Ready
@@ -2111,6 +2134,8 @@ data class GroupMember (
&& userRole >= GroupMemberRole.Moderator && userRole >= memberRole && groupInfo.membership.memberActive
}
+ val versionRange: VersionRange = activeConn?.peerChatVRange ?: memberChatVRange
+
val memberIncognito = memberProfile.profileId != memberContactProfileId
companion object {
@@ -2128,7 +2153,8 @@ data class GroupMember (
memberProfile = LocalProfile.sampleData,
memberContactId = 1,
memberContactProfileId = 1L,
- activeConn = Connection.sampleData
+ activeConn = Connection.sampleData,
+ memberChatVRange = VersionRange(minVersion = 1, maxVersion = 15)
)
}
}
@@ -2287,7 +2313,6 @@ class NoteFolder(
override val apiId get() = noteFolderId
override val chatDeleted get() = false
override val ready get() = true
- override val sendMsgEnabled get() = true
override val incognito get() = false
override fun featureEnabled(feature: ChatFeature) = feature == ChatFeature.Voice
override val timedMessagesTTL: Int? get() = null
@@ -2323,7 +2348,6 @@ class UserContactRequest (
override val apiId get() = contactRequestId
override val chatDeleted get() = false
override val ready get() = true
- override val sendMsgEnabled get() = false
override val incognito get() = false
override fun featureEnabled(feature: ChatFeature) = false
override val timedMessagesTTL: Int? get() = null
@@ -2362,7 +2386,6 @@ class PendingContactConnection(
override val apiId get() = pccConnId
override val chatDeleted get() = false
override val ready get() = false
- override val sendMsgEnabled get() = false
override val incognito get() = customUserProfileId != null
override fun featureEnabled(feature: ChatFeature) = false
override val timedMessagesTTL: Int? get() = null
diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt
index 12c93888ee..7cb2d9fe5e 100644
--- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt
+++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt
@@ -58,6 +58,9 @@ typealias ChatCtrl = Long
// version range that supports establishing direct connection with a group member (xGrpDirectInvVRange in core)
val CREATE_MEMBER_CONTACT_VERSION = 2
+// support group knocking (MsgScope)
+val GROUP_KNOCKING_VERSION = 15
+
enum class CallOnLockScreen {
DISABLE,
SHOW,
@@ -1911,6 +1914,13 @@ object ChatController {
return null
}
+ suspend fun apiDeleteMemberSupportChat(rh: Long?, groupId: Long, groupMemberId: Long): Pair? {
+ val r = sendCmd(rh, CC.ApiDeleteMemberSupportChat(groupId, groupMemberId))
+ if (r is API.Result && r.res is CR.MemberSupportChatDeleted) return r.res.groupInfo to r.res.member
+ apiErrorAlert("apiDeleteMemberSupportChat", generalGetString(MR.strings.error_deleting_member_support_chat), r)
+ return null
+ }
+
suspend fun apiRemoveMembers(rh: Long?, groupId: Long, memberIds: List, withMessages: Boolean = false): Pair>? {
val r = sendCmd(rh, CC.ApiRemoveMembers(groupId, memberIds, withMessages))
if (r is API.Result && r.res is CR.UserDeletedMembers) return r.res.groupInfo to r.res.members
@@ -2523,6 +2533,11 @@ object ChatController {
}
}
}
+ r.chatItemDeletions.lastOrNull()?.deletedChatItem?.chatInfo?.let { updatedChatInfo ->
+ withContext(Dispatchers.Main) {
+ chatModel.chatsContext.updateChatInfo(rhId, updatedChatInfo)
+ }
+ }
}
is CR.GroupChatItemsDeleted -> {
groupChatItemsDeleted(rhId, r)
@@ -3342,6 +3357,7 @@ sealed class CC {
class ApiAddMember(val groupId: Long, val contactId: Long, val memberRole: GroupMemberRole): CC()
class ApiJoinGroup(val groupId: Long): CC()
class ApiAcceptMember(val groupId: Long, val groupMemberId: Long, val memberRole: GroupMemberRole): CC()
+ class ApiDeleteMemberSupportChat(val groupId: Long, val groupMemberId: Long): CC()
class ApiMembersRole(val groupId: Long, val memberIds: List, val memberRole: GroupMemberRole): CC()
class ApiBlockMembersForAll(val groupId: Long, val memberIds: List, val blocked: Boolean): CC()
class ApiRemoveMembers(val groupId: Long, val memberIds: List, val withMessages: Boolean): CC()
@@ -3528,6 +3544,7 @@ sealed class CC {
is ApiAddMember -> "/_add #$groupId $contactId ${memberRole.memberRole}"
is ApiJoinGroup -> "/_join #$groupId"
is ApiAcceptMember -> "/_accept member #$groupId $groupMemberId ${memberRole.memberRole}"
+ is ApiDeleteMemberSupportChat -> "/_delete member chat #$groupId $groupMemberId"
is ApiMembersRole -> "/_member role #$groupId ${memberIds.joinToString(",")} ${memberRole.memberRole}"
is ApiBlockMembersForAll -> "/_block #$groupId ${memberIds.joinToString(",")} blocked=${onOff(blocked)}"
is ApiRemoveMembers -> "/_remove #$groupId ${memberIds.joinToString(",")} messages=${onOff(withMessages)}"
@@ -3692,6 +3709,7 @@ sealed class CC {
is ApiAddMember -> "apiAddMember"
is ApiJoinGroup -> "apiJoinGroup"
is ApiAcceptMember -> "apiAcceptMember"
+ is ApiDeleteMemberSupportChat -> "apiDeleteMemberSupportChat"
is ApiMembersRole -> "apiMembersRole"
is ApiBlockMembersForAll -> "apiBlockMembersForAll"
is ApiRemoveMembers -> "apiRemoveMembers"
@@ -5846,6 +5864,7 @@ sealed class CR {
@Serializable @SerialName("groupDeletedUser") class GroupDeletedUser(val user: UserRef, val groupInfo: GroupInfo): CR()
@Serializable @SerialName("joinedGroupMemberConnecting") class JoinedGroupMemberConnecting(val user: UserRef, val groupInfo: GroupInfo, val hostMember: GroupMember, val member: GroupMember): CR()
@Serializable @SerialName("memberAccepted") class MemberAccepted(val user: UserRef, val groupInfo: GroupInfo, val member: GroupMember): CR()
+ @Serializable @SerialName("memberSupportChatDeleted") class MemberSupportChatDeleted(val user: UserRef, val groupInfo: GroupInfo, val member: GroupMember): CR()
@Serializable @SerialName("memberAcceptedByOther") class MemberAcceptedByOther(val user: UserRef, val groupInfo: GroupInfo, val acceptingMember: GroupMember, val member: GroupMember): CR()
@Serializable @SerialName("memberRole") class MemberRole(val user: UserRef, val groupInfo: GroupInfo, val byMember: GroupMember, val member: GroupMember, val fromRole: GroupMemberRole, val toRole: GroupMemberRole): CR()
@Serializable @SerialName("membersRoleUser") class MembersRoleUser(val user: UserRef, val groupInfo: GroupInfo, val members: List, val toRole: GroupMemberRole): CR()
@@ -6024,6 +6043,7 @@ sealed class CR {
is GroupDeletedUser -> "groupDeletedUser"
is JoinedGroupMemberConnecting -> "joinedGroupMemberConnecting"
is MemberAccepted -> "memberAccepted"
+ is MemberSupportChatDeleted -> "memberSupportChatDeleted"
is MemberAcceptedByOther -> "memberAcceptedByOther"
is MemberRole -> "memberRole"
is MembersRoleUser -> "membersRoleUser"
@@ -6195,6 +6215,7 @@ sealed class CR {
is GroupDeletedUser -> withUser(user, json.encodeToString(groupInfo))
is JoinedGroupMemberConnecting -> withUser(user, "groupInfo: $groupInfo\nhostMember: $hostMember\nmember: $member")
is MemberAccepted -> withUser(user, "groupInfo: $groupInfo\nmember: $member")
+ is MemberSupportChatDeleted -> withUser(user, "groupInfo: $groupInfo\nmember: $member")
is MemberAcceptedByOther -> withUser(user, "groupInfo: $groupInfo\nacceptingMember: $acceptingMember\nmember: $member")
is MemberRole -> withUser(user, "groupInfo: $groupInfo\nbyMember: $byMember\nmember: $member\nfromRole: $fromRole\ntoRole: $toRole")
is MembersRoleUser -> withUser(user, "groupInfo: $groupInfo\nmembers: $members\ntoRole: $toRole")
diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt
index 3502d7049c..6b301b9df4 100644
--- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt
+++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt
@@ -12,11 +12,10 @@ import java.net.URI
expect fun PlatformTextField(
composeState: MutableState,
sendMsgEnabled: Boolean,
+ disabledText: String?,
sendMsgButtonDisabled: Boolean,
textStyle: MutableState,
showDeleteTextButton: MutableState,
- userIsObserver: Boolean,
- userIsPending: Boolean,
placeholder: String,
showVoiceButton: Boolean,
onMessageChange: (ComposeMessage) -> Unit,
diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt
index c82cb49a4a..37aa7fc1d1 100644
--- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt
+++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt
@@ -99,13 +99,11 @@ fun TerminalLayout(
isDirectChat = false,
liveMessageAlertShown = SharedPreference(get = { false }, set = {}),
sendMsgEnabled = true,
+ userCantSendReason = null,
sendButtonEnabled = true,
nextSendGrpInv = false,
needToAllowVoiceToContact = false,
allowedVoiceByPrefs = false,
- userIsObserver = false,
- userIsPending = false,
- userCanSend = true,
allowVoiceToContact = {},
placeholder = "",
sendMessage = { sendCommand() },
diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt
index fc26a9c8a3..2ca0dcc35d 100644
--- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt
+++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt
@@ -455,6 +455,7 @@ fun ChatView(
if (deletedItem.isActiveReport) {
chatModel.chatsContext.decreaseGroupReportsCounter(chatRh, chatInfo.id)
}
+ chatModel.chatsContext.updateChatInfo(chatRh, deleted.deletedChatItem.chatInfo)
}
withContext(Dispatchers.Main) {
if (toChatItem != null) {
@@ -784,7 +785,7 @@ fun ChatLayout(
Modifier
.fillMaxWidth()
.desktopOnExternalDrag(
- enabled = remember(attachmentDisabled.value, chatInfo.value?.userCanSend) { mutableStateOf(!attachmentDisabled.value && chatInfo.value?.userCanSend == true) }.value,
+ enabled = remember(attachmentDisabled.value, chatInfo.value?.sendMsgEnabled) { mutableStateOf(!attachmentDisabled.value && chatInfo.value?.sendMsgEnabled == true) }.value,
onFiles = { paths -> composeState.onFilesAttached(paths.map { it.toURI() }) },
onImage = { file -> CoroutineScope(Dispatchers.IO).launch { composeState.processPickedMedia(listOf(file.toURI()), null) } },
onText = {
@@ -2672,6 +2673,9 @@ private fun deleteMessages(chatRh: Long?, chatInfo: ChatInfo, itemIds: List
+ chatModel.chatsContext.updateChatInfo(chatRh, updatedChatInfo)
+ }
}
withContext(Dispatchers.Main) {
for (di in deleted) {
@@ -2712,6 +2716,9 @@ private fun archiveReports(chatRh: Long?, chatInfo: ChatInfo, itemIds: List
+ chatModel.chatsContext.updateChatInfo(chatRh, updatedChatInfo)
+ }
}
withContext(Dispatchers.Main) {
for (di in deleted) {
diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextPendingMemberActionsView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextPendingMemberActionsView.kt
index 401509a171..3c3f99ad94 100644
--- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextPendingMemberActionsView.kt
+++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextPendingMemberActionsView.kt
@@ -13,6 +13,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import chat.simplex.common.model.*
import chat.simplex.common.platform.chatModel
+import chat.simplex.common.views.chat.group.removeMember
import chat.simplex.common.views.chat.group.removeMemberDialog
import chat.simplex.common.views.helpers.*
import chat.simplex.res.MR
@@ -44,12 +45,12 @@ fun ComposeContextPendingMemberActionsView(
.fillMaxHeight()
.weight(1F)
.clickable {
- removeMemberDialog(rhId, groupInfo, member, chatModel, close = { ModalManager.end.closeModal() })
+ rejectMemberDialog(rhId, member, chatModel, close = { ModalManager.end.closeModal() })
},
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
- Text(stringResource(MR.strings.remove_pending_member_button), color = Color.Red)
+ Text(stringResource(MR.strings.reject_pending_member_button), color = Color.Red)
}
Column(
@@ -69,6 +70,17 @@ fun ComposeContextPendingMemberActionsView(
}
}
+fun rejectMemberDialog(rhId: Long?, member: GroupMember, chatModel: ChatModel, close: (() -> Unit)? = null) {
+ AlertManager.shared.showAlertDialog(
+ title = generalGetString(MR.strings.reject_pending_member_alert_title),
+ confirmText = generalGetString(MR.strings.reject_pending_member_button),
+ onConfirm = {
+ removeMember(rhId, member, chatModel, close)
+ },
+ destructive = true,
+ )
+}
+
fun acceptMemberDialog(rhId: Long?, groupInfo: GroupInfo, member: GroupMember, close: (() -> Unit)? = null) {
AlertManager.shared.showAlertDialogButtonsColumn(
title = generalGetString(MR.strings.accept_pending_member_alert_title),
@@ -105,12 +117,9 @@ private fun acceptMember(rhId: Long?, groupInfo: GroupInfo, member: GroupMember,
val r = chatModel.controller.apiAcceptMember(rhId, groupInfo.groupId, member.groupMemberId, role)
if (r != null) {
withContext(Dispatchers.Main) {
- chatModel.chatsContext.upsertGroupMember(rhId, groupInfo, r.second)
+ chatModel.chatsContext.upsertGroupMember(rhId, r.first, r.second)
chatModel.chatsContext.updateGroup(rhId, r.first)
}
- withContext(Dispatchers.Main) {
- chatModel.secondaryChatsContext.value?.upsertGroupMember(rhId, groupInfo, r.second)
- }
}
close?.invoke()
}
diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt
index f377540a95..ca6279fd88 100644
--- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt
+++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt
@@ -1010,10 +1010,8 @@ fun ComposeView(
chatModel.sharedContent.value = null
}
- val userCanSend = rememberUpdatedState(chat.chatInfo.userCanSend)
val sendMsgEnabled = rememberUpdatedState(chat.chatInfo.sendMsgEnabled)
- val userIsObserver = rememberUpdatedState(chat.userIsObserver)
- val userIsPending = rememberUpdatedState(chat.userIsPending)
+ val userCantSendReason = rememberUpdatedState(chat.chatInfo.userCantSendReason)
val nextSendGrpInv = rememberUpdatedState(chat.nextSendGrpInv)
Column {
@@ -1039,8 +1037,8 @@ fun ComposeView(
if (ctx is ComposeContextItem.ReportedItem) {
ReportReasonView(ctx.reason)
}
- val simplexLinkProhibited = hasSimplexLink.value && !chat.groupFeatureEnabled(GroupFeature.SimplexLinks)
- val fileProhibited = composeState.value.attachmentPreview && !chat.groupFeatureEnabled(GroupFeature.Files)
+ val simplexLinkProhibited = chatsCtx.secondaryContextFilter == null && hasSimplexLink.value && !chat.groupFeatureEnabled(GroupFeature.SimplexLinks)
+ val fileProhibited = chatsCtx.secondaryContextFilter == null && composeState.value.attachmentPreview && !chat.groupFeatureEnabled(GroupFeature.Files)
val voiceProhibited = composeState.value.preview is ComposePreview.VoicePreview && !chat.chatInfo.featureEnabled(ChatFeature.Voice)
if (composeState.value.preview !is ComposePreview.VoicePreview || composeState.value.editing) {
if (simplexLinkProhibited) {
@@ -1069,7 +1067,10 @@ fun ComposeView(
Surface(color = MaterialTheme.colors.background, contentColor = MaterialTheme.colors.onBackground) {
Divider()
Row(Modifier.padding(end = 8.dp), verticalAlignment = Alignment.Bottom) {
- val isGroupAndProhibitedFiles = chat.chatInfo is ChatInfo.Group && !chat.chatInfo.groupInfo.fullGroupPreferences.files.on(chat.chatInfo.groupInfo.membership)
+ val isGroupAndProhibitedFiles =
+ chatsCtx.secondaryContextFilter == null
+ && chat.chatInfo is ChatInfo.Group
+ && !chat.chatInfo.groupInfo.fullGroupPreferences.files.on(chat.chatInfo.groupInfo.membership)
val attachmentClicked = if (isGroupAndProhibitedFiles) {
{
AlertManager.shared.showAlertMsg(
@@ -1083,7 +1084,6 @@ fun ComposeView(
val attachmentEnabled =
!composeState.value.attachmentDisabled
&& sendMsgEnabled.value
- && userCanSend.value
&& !isGroupAndProhibitedFiles
&& !nextSendGrpInv.value
IconButton(
@@ -1129,8 +1129,8 @@ fun ComposeView(
}
}
- LaunchedEffect(rememberUpdatedState(chat.chatInfo.userCanSend).value) {
- if (!chat.chatInfo.userCanSend) {
+ LaunchedEffect(rememberUpdatedState(chat.chatInfo.sendMsgEnabled).value) {
+ if (!chat.chatInfo.sendMsgEnabled) {
clearCurrentDraft()
clearState()
}
@@ -1186,14 +1186,12 @@ fun ComposeView(
chat.chatInfo is ChatInfo.Direct,
liveMessageAlertShown = chatModel.controller.appPrefs.liveMessageAlertShown,
sendMsgEnabled = sendMsgEnabled.value,
+ userCantSendReason = userCantSendReason.value,
sendButtonEnabled = sendMsgEnabled.value && !(simplexLinkProhibited || fileProhibited || voiceProhibited),
nextSendGrpInv = nextSendGrpInv.value,
needToAllowVoiceToContact,
allowedVoiceByPrefs,
allowVoiceToContact = ::allowVoiceToContact,
- userIsObserver = if (chatsCtx.secondaryContextFilter == null) userIsObserver.value else false,
- userIsPending = if (chatsCtx.secondaryContextFilter == null) userIsPending.value else false,
- userCanSend = userCanSend.value,
sendButtonColor = sendButtonColor,
timedMessageAllowed = timedMessageAllowed,
customDisappearingMessageTimePref = chatModel.controller.appPrefs.customDisappearingMessageTime,
diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt
index f2e636a01a..5710f09ed5 100644
--- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt
+++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt
@@ -39,13 +39,11 @@ fun SendMsgView(
isDirectChat: Boolean,
liveMessageAlertShown: SharedPreference,
sendMsgEnabled: Boolean,
+ userCantSendReason: Pair?,
sendButtonEnabled: Boolean,
nextSendGrpInv: Boolean,
needToAllowVoiceToContact: Boolean,
allowedVoiceByPrefs: Boolean,
- userIsObserver: Boolean,
- userIsPending: Boolean,
- userCanSend: Boolean,
sendButtonColor: Color = MaterialTheme.colors.primary,
allowVoiceToContact: () -> Unit,
timedMessageAllowed: Boolean = false,
@@ -81,15 +79,14 @@ fun SendMsgView(
(!allowedVoiceByPrefs && cs.preview is ComposePreview.VoicePreview) ||
cs.endLiveDisabled ||
!sendButtonEnabled
- val clicksOnTextFieldDisabled = !sendMsgEnabled || cs.preview is ComposePreview.VoicePreview || !userCanSend || cs.inProgress
+ val clicksOnTextFieldDisabled = !sendMsgEnabled || cs.preview is ComposePreview.VoicePreview || cs.inProgress
PlatformTextField(
composeState,
sendMsgEnabled,
+ disabledText = userCantSendReason?.first,
sendMsgButtonDisabled,
textStyle,
showDeleteTextButton,
- userIsObserver,
- userIsPending,
if (clicksOnTextFieldDisabled) "" else placeholder,
showVoiceButton,
onMessageChange,
@@ -102,16 +99,23 @@ fun SendMsgView(
}
}
if (clicksOnTextFieldDisabled) {
- Box(
- Modifier
- .matchParentSize()
- .clickable(enabled = !userCanSend, indication = null, interactionSource = remember { MutableInteractionSource() }, onClick = {
- AlertManager.shared.showAlertMsg(
- title = generalGetString(MR.strings.observer_cant_send_message_title),
- text = generalGetString(MR.strings.observer_cant_send_message_desc)
- )
- })
- )
+ if (userCantSendReason != null) {
+ Box(
+ Modifier
+ .matchParentSize()
+ .clickable(indication = null, interactionSource = remember { MutableInteractionSource() }, onClick = {
+ AlertManager.shared.showAlertMsg(
+ title = generalGetString(MR.strings.cant_send_message_alert_title),
+ text = userCantSendReason.second
+ )
+ })
+ )
+ } else {
+ Box(
+ Modifier
+ .matchParentSize()
+ )
+ }
}
if (showDeleteTextButton.value) {
DeleteTextButton(composeState)
@@ -135,11 +139,11 @@ fun SendMsgView(
Row(verticalAlignment = Alignment.CenterVertically) {
val stopRecOnNextClick = remember { mutableStateOf(false) }
when {
- needToAllowVoiceToContact || !allowedVoiceByPrefs || !userCanSend -> {
- DisallowedVoiceButton(userCanSend) {
+ needToAllowVoiceToContact || !allowedVoiceByPrefs -> {
+ DisallowedVoiceButton {
if (needToAllowVoiceToContact) {
showNeedToAllowVoiceAlert(allowVoiceToContact)
- } else if (!allowedVoiceByPrefs) {
+ } else {
showDisabledVoiceAlert(isDirectChat)
}
}
@@ -155,7 +159,7 @@ fun SendMsgView(
&& cs.contextItem is ComposeContextItem.NoContextItem
) {
Spacer(Modifier.width(12.dp))
- StartLiveMessageButton(userCanSend) {
+ StartLiveMessageButton {
if (composeState.value.preview is ComposePreview.NoPreview) {
startLiveMessage(scope, sendLiveMessage, updateLiveMessage, sendButtonSize, sendButtonAlpha, composeState, liveMessageAlertShown)
}
@@ -343,8 +347,8 @@ private fun RecordVoiceView(recState: MutableState, stopRecOnNex
}
@Composable
-private fun DisallowedVoiceButton(enabled: Boolean, onClick: () -> Unit) {
- IconButton(onClick, Modifier.size(36.dp), enabled = enabled) {
+private fun DisallowedVoiceButton(onClick: () -> Unit) {
+ IconButton(onClick, Modifier.size(36.dp)) {
Icon(
painterResource(MR.images.ic_keyboard_voice),
stringResource(MR.strings.icon_descr_record_voice_message),
@@ -460,14 +464,13 @@ private fun SendMsgButton(
}
@Composable
-private fun StartLiveMessageButton(enabled: Boolean, onClick: () -> Unit) {
+private fun StartLiveMessageButton(onClick: () -> Unit) {
val interactionSource = remember { MutableInteractionSource() }
val ripple = remember { ripple(bounded = false, radius = 24.dp) }
Box(
modifier = Modifier.requiredSize(36.dp)
.clickable(
onClick = onClick,
- enabled = enabled,
role = Role.Button,
interactionSource = interactionSource,
indication = ripple
@@ -477,7 +480,7 @@ private fun StartLiveMessageButton(enabled: Boolean, onClick: () -> Unit) {
Icon(
BoltFilled,
stringResource(MR.strings.icon_descr_send_message),
- tint = if (enabled) MaterialTheme.colors.primary else MaterialTheme.colors.secondary,
+ tint = MaterialTheme.colors.primary,
modifier = Modifier
.size(36.dp)
.padding(4.dp)
@@ -576,13 +579,11 @@ fun PreviewSendMsgView() {
isDirectChat = true,
liveMessageAlertShown = SharedPreference(get = { true }, set = { }),
sendMsgEnabled = true,
+ userCantSendReason = null,
sendButtonEnabled = true,
nextSendGrpInv = false,
needToAllowVoiceToContact = false,
allowedVoiceByPrefs = true,
- userIsObserver = false,
- userIsPending = false,
- userCanSend = true,
allowVoiceToContact = {},
timedMessageAllowed = false,
placeholder = "",
@@ -613,13 +614,11 @@ fun PreviewSendMsgViewEditing() {
isDirectChat = true,
liveMessageAlertShown = SharedPreference(get = { true }, set = { }),
sendMsgEnabled = true,
+ userCantSendReason = null,
sendButtonEnabled = true,
nextSendGrpInv = false,
needToAllowVoiceToContact = false,
allowedVoiceByPrefs = true,
- userIsObserver = false,
- userIsPending = false,
- userCanSend = true,
allowVoiceToContact = {},
timedMessageAllowed = false,
placeholder = "",
@@ -650,13 +649,11 @@ fun PreviewSendMsgViewInProgress() {
isDirectChat = true,
liveMessageAlertShown = SharedPreference(get = { true }, set = { }),
sendMsgEnabled = true,
+ userCantSendReason = null,
sendButtonEnabled = true,
nextSendGrpInv = false,
needToAllowVoiceToContact = false,
allowedVoiceByPrefs = true,
- userIsObserver = false,
- userIsPending = false,
- userCanSend = true,
allowVoiceToContact = {},
timedMessageAllowed = false,
placeholder = "",
diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt
index 48c1ba5200..827af085ea 100644
--- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt
+++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/AddGroupMembersView.kt
@@ -103,8 +103,9 @@ fun getContactsToAdd(chatModel: ChatModel, search: String): List {
.asSequence()
.map { it.chatInfo }
.filterIsInstance()
+ .filter { it.sendMsgEnabled }
.map { it.contact }
- .filter { c -> c.sendMsgEnabled && !c.nextSendGrpInv && c.contactId !in memberContactIds && c.anyNameContains(s)
+ .filter { c -> !c.nextSendGrpInv && c.contactId !in memberContactIds && c.anyNameContains(s)
}
.sortedBy { it.displayName.lowercase() }
.toList()
diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt
index 0ce0f8fa3c..e56bc36562 100644
--- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt
+++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt
@@ -245,29 +245,28 @@ fun removeMemberDialog(rhId: Long?, groupInfo: GroupInfo, member: GroupMember, c
text = generalGetString(messageId),
confirmText = generalGetString(MR.strings.remove_member_confirmation),
onConfirm = {
- withBGApi {
- val r = chatModel.controller.apiRemoveMembers(rhId, member.groupId, listOf(member.groupMemberId))
- if (r != null) {
- val (updatedGroupInfo, removedMembers) = r
- withContext(Dispatchers.Main) {
- chatModel.chatsContext.updateGroup(rhId, updatedGroupInfo)
- removedMembers.forEach { removedMember ->
- chatModel.chatsContext.upsertGroupMember(rhId, updatedGroupInfo, removedMember)
- }
- }
- withContext(Dispatchers.Main) {
- removedMembers.forEach { removedMember ->
- chatModel.secondaryChatsContext.value?.upsertGroupMember(rhId, updatedGroupInfo, removedMember)
- }
- }
- }
- close?.invoke()
- }
+ removeMember(rhId, member, chatModel, close)
},
destructive = true,
)
}
+fun removeMember(rhId: Long?, member: GroupMember, chatModel: ChatModel, close: (() -> Unit)? = null) {
+ withBGApi {
+ val r = chatModel.controller.apiRemoveMembers(rhId, member.groupId, listOf(member.groupMemberId))
+ if (r != null) {
+ val (updatedGroupInfo, removedMembers) = r
+ withContext(Dispatchers.Main) {
+ chatModel.chatsContext.updateGroup(rhId, updatedGroupInfo)
+ removedMembers.forEach { removedMember ->
+ chatModel.chatsContext.upsertGroupMember(rhId, updatedGroupInfo, removedMember)
+ }
+ }
+ }
+ close?.invoke()
+ }
+}
+
@Composable
fun GroupMemberInfoLayout(
rhId: Long?,
diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberSupportView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberSupportView.kt
index 0ef63a2a11..298a545c8c 100644
--- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberSupportView.kt
+++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberSupportView.kt
@@ -28,7 +28,7 @@ import chat.simplex.common.views.chat.item.ItemAction
import chat.simplex.common.views.chatlist.*
import chat.simplex.res.MR
import dev.icerock.moko.resources.compose.painterResource
-import kotlinx.coroutines.launch
+import kotlinx.coroutines.*
@Composable
fun ModalData.MemberSupportView(
@@ -269,14 +269,34 @@ private fun DropDownMenuForSupportChat(rhId: Long?, member: GroupMember, groupIn
acceptMemberDialog(rhId, groupInfo, member)
showMenu.value = false
})
+ } else {
+ ItemAction(stringResource(MR.strings.delete_member_support_chat_button), painterResource(MR.images.ic_delete), color = MaterialTheme.colors.error, onClick = {
+ deleteMemberSupportChatDialog(rhId, groupInfo, member)
+ showMenu.value = false
+ })
+ }
+ }
+}
+
+fun deleteMemberSupportChatDialog(rhId: Long?, groupInfo: GroupInfo, member: GroupMember) {
+ AlertManager.shared.showAlertDialog(
+ title = generalGetString(MR.strings.delete_member_support_chat_alert_title),
+ confirmText = generalGetString(MR.strings.delete_member_support_chat_button),
+ onConfirm = {
+ deleteMemberSupportChat(rhId, groupInfo, member)
+ },
+ destructive = true,
+ )
+}
+
+private fun deleteMemberSupportChat(rhId: Long?, groupInfo: GroupInfo, member: GroupMember) {
+ withBGApi {
+ val r = chatModel.controller.apiDeleteMemberSupportChat(rhId, groupInfo.groupId, member.groupMemberId)
+ if (r != null) {
+ withContext(Dispatchers.Main) {
+ chatModel.chatsContext.upsertGroupMember(rhId, r.first, r.second)
+ chatModel.chatsContext.updateGroup(rhId, r.first)
+ }
}
- ItemAction(stringResource(MR.strings.remove_pending_member_button), painterResource(MR.images.ic_delete), color = MaterialTheme.colors.error, onClick = {
- removeMemberDialog(rhId, groupInfo, member, chatModel)
- showMenu.value = false
- })
- // TODO [knocking] mark read, mark unread
- // ItemAction(stringResource(MR.strings.mark_unread), painterResource(MR.images.ic_mark_chat_unread), onClick = {
- // showMenu.value = false
- // })
}
}
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml
index 12016794ee..b5bf2efaff 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml
@@ -159,6 +159,7 @@
Error adding member(s)Error joining groupError accepting member
+ Error deleting chat with memberCannot receive fileSender cancelled file transfer.Unknown servers!
@@ -491,10 +492,6 @@
Decoding errorThe image cannot be decoded. Please, try a different image or contact developers.The video cannot be decoded. Please, try a different video or contact developers.
- you are observer
- reviewed by admins
- You can\'t send messages!
- Please contact group admin.Files and media prohibited!Only group owners can enable files and media.Send direct message to connect
@@ -516,6 +513,22 @@
Report sent to moderatorsYou can view your reports in Chat with admins.
+ You can\'t send messages!
+ contact not ready
+ contact deleted
+ not synchronized
+ contact disabled
+ you are observer
+ Please contact group admin.
+ request to join rejected
+ group is deleted
+ removed from group
+ you left
+ can\'t send messages
+ you are observer
+ reviewed by admins
+ member has old version
+
ImageWaiting for image
@@ -2176,10 +2189,13 @@
Chats with membersNo chats with members
+ Delete chat
+ Delete chat with member?Chat with admins
- Remove
+ Reject
+ Reject member?AcceptAccept memberMember will join the group, accept member?
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml
index 6646720c5c..fbb9f94a64 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml
@@ -1465,7 +1465,7 @@
Profil erstellen%s und %sIhrer Gruppe beitreten?
- %1$s.]]>
+ %1$s.]]>Das ist Ihr eigener Einmal-Link!%d Nachrichten als gelöscht markiertGruppe besteht bereits!
@@ -2462,4 +2462,37 @@
AusTCP-Port 443 nur für voreingestellte Server verwenden.Voreingestellte Server
+ %d Chats mit Mitgliedern
+ %d Chat(s)
+ Meldung wurde an die Moderatoren gesendet
+ Sie haben dieses Mitglied übernommen
+ Überprüfung der Mitglieder vor der Aufnahme (Anklopfen).
+ Überprüfung der Mitglieder
+ alle
+ Aus
+ Als Beobachter übernehmen
+ Mitglied übernehmen
+ Chats mit Mitgliedern
+ Chat mit Administratoren
+ Keine Chats mit Mitgliedern
+ Entfernen
+ hat Sie übernommen
+ Chat mit einem Mitglied
+ %d Nachrichten
+ Ein Mitglied wird der Gruppe beitreten. Übernehmen?
+ Ein neues Mitglied will der Gruppe beitreten.
+ Überprüfung
+ Von Administratoren überprüft
+ Aufnahme von Mitgliedern festlegen
+ Speichern der Aufnahme-Einstellungen?
+ Sie können Ihre Meldungen im Chat mit den Administratoren sehen.
+ Chat mit Administratoren
+ %1$s übernommen
+ Als Mitglied übernehmen
+ Fehler beim Übernehmen eines Mitglieds
+ Aufnahme von Mitgliedern
+ Ausstehende Überprüfung
+ Chat mit einem Mitglied
+ Übernehmen
+ Bitte warten Sie auf die Überprüfung Ihrer Anfrage durch die Gruppen-Moderatoren, um der Gruppe beitreten zu können.
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml
index c8897c4063..1a1ca0e8a6 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml
@@ -350,7 +350,7 @@
Az adatbázis titkosítási jelmondata frissülni fog és a beállításokban lesz tárolva.Adatbázis-azonosítóAdatbázis-azonosító: %d
- Adatbázis-azonosítók és átvitel-izolációs beállítások.
+ Adatbázis-azonosítók és átvitelelkülönítési beállítások.Az adatbázis titkosítási jelmondata frissülni fog és a Keystore-ban lesz tárolva.Az adatbázis titkosítva lesz, a jelmondat pedig a beállításokban lesz tárolva.Kiszolgáló törlése
@@ -366,7 +366,7 @@
%dmpKézbesítési jelentések!Az eszközön nincs beállítva a képernyőzár. A SimpleX-zár az „Adatvédelem és biztonság” menüben kapcsolható be, miután beállította a képernyőzárat az eszközén.
- Titkosítás visszafejtési hiba
+ Titkosításvisszafejtési hibaEltűnik: %sszerkesztveTörlés
@@ -532,7 +532,7 @@
Fájlok és médiatartalmakKONZOLHOZNem sikerült a titkosítást újraegyeztetni.
- Hiba történt a felhasználó-profil törlésekor
+ Hiba történt a felhasználóprofil törlésekorCsoporttag általi javítás nem támogatottAdja meg az üdvözlőüzenetet…Titkosított adatbázis
@@ -676,7 +676,7 @@
Csevegési profil létrehozásaVédett a kéretlen tartalommal szembenHordozható eszközök leválasztása
- Különböző nevek, profilképek és átvitel-izoláció.
+ Különböző nevek, profilképek és átvitelelkülönítés.Elutasítás esetén a feladó NEM kap értesítést.Szerepkörválasztó kibontásaA kép akkor érkezik meg, amikor a küldője elérhető lesz, várjon, vagy ellenőrizze később!
@@ -716,7 +716,7 @@
Hamarosan további fejlesztések érkeznek!A reakciók hozzáadása az üzenetekhez le van tiltva ebben a csevegésben.Helytelen biztonsági kód!
- Ez akkor fordulhat elő, ha Ön vagy a partnere régi adatbázis biztonsági mentést használt.
+ Ez akkor fordulhat elő, ha Ön vagy a partnere egy régi adatbázis biztonsági mentését használta.Új számítógép-alkalmazás!Most már az adminisztrátorok is:\n- törölhetik a tagok üzeneteit.\n- letilthatnak tagokat (megfigyelő szerepkör)meghívta őt: %1$s
@@ -810,7 +810,7 @@
%s ajánlottaCsoport elhagyása%s összes üzenete meg fog jelenni!
- Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Nem sikerült visszafejteni az üzenetet, mert Ön, vagy a partnere régebbi adatbázis biztonsági mentést használt.\n3. A kapcsolat sérült.
+ Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere egy régi adatbázis biztonsági mentését használta.\n3. A kapcsolat sérült.megfigyelőinkognitó a csoporthivatkozáson keresztülOnion-kiszolgálók használata, ha azok rendelkezésre állnak.
@@ -1026,7 +1026,7 @@
frissítette a csoport profiljátSIMPLEX CHAT TÁMOGATÁSASimpleX Chat szolgáltatás
- Nem lehet üzeneteket küldeni!
+ Ön megfigyelő%s hitelesítveJelszó a megjelenítéshezAdatvédelem és biztonság
@@ -1203,7 +1203,7 @@
Ön eltávolította őt: %1$sJelmondat mentése és a csevegés megnyitásaMenti a beállításokat?
- Nincsenek felhasználó-azonosítók.
+ Nincsenek felhasználói azonosítók.A közvetlen üzenetek küldése a tagok között le van tiltva.SOCKS-proxy használata?Hangszóró kikapcsolva
@@ -1345,7 +1345,7 @@
%1$s nevű csoporthoz.]]>Amikor az alkalmazás futInkognitóprofilt használ ehhez a csoporthoz – fő profilja megosztásának elkerülése érdekében a meghívók küldése le van tiltva
- Átvitel-izoláció
+ ÁtvitelelkülönítésAkkor lesz kapcsolódva, ha a meghívási kérése el lesz fogadva, várjon, vagy ellenőrizze később!A hangüzenetek küldése le van tiltva.Alkalmazás akkumulátor-használata / Korlátlan módot az alkalmazás beállításaiban.]]>
@@ -1364,8 +1364,8 @@
Adatainak védelme érdekében a SimpleX külön üzenet-azonosítókat használ minden egyes kapcsolatához.(a megosztáshoz a partnerével)Csoportmeghívó elküldve
- Frissíti az átvitel-izoláció módját?
- Átvitel-izoláció
+ Frissíti az átvitelelkülönítési módot?
+ ÁtvitelelkülönítésEttől a csoporttól nem fog értesítéseket kapni. A csevegési előzmények megmaradnak.A csevegési adatbázis nem titkosított – állítson be egy jelmondatot annak védelméhez.Közvetlen internetkapcsolat használata?
@@ -1395,7 +1395,7 @@
a SimpleX Chat fejlesztőivel, ahol bármiről kérdezhet és értesülhet a friss hírekről.]]>Nem kötelező üdvözlőüzenettel.Ismeretlen adatbázishiba: %s
- Elrejtheti vagy lenémíthatja a felhasználó-profiljait – koppintson (vagy számítógép-alkalmazásban kattintson) hosszan a profilra a felugró menühöz.
+ Elrejtheti vagy lenémíthatja a felhasználóprofiljait – koppintson (vagy számítógép-alkalmazásban kattintson) hosszan a profilra a felugró menühöz.Inkognitóra váltás kapcsolódáskor.Megoszthat egy hivatkozást vagy QR-kódot – így bárki csatlakozhat a csoporthoz. Ha a csoportot Ön később törli, akkor nem fogja elveszíteni annak tagjait.Ön csatlakozott ehhez a csoporthoz
@@ -1435,7 +1435,7 @@
A kézbesítési jelentések le vannak tiltva %d csoportbanNéhány nem végzetes hiba történt az importáláskor:Köszönet a felhasználóknak a Weblate-en való közreműködésért!
- A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címet.
+ A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét.Beállítás a rendszer-hitelesítés helyett.A fogadási cím egy másik kiszolgálóra fog módosulni. A cím módosítása a feladó online állapotba kerülése után fejeződik be.A csevegés megállítása a csevegési adatbázis exportálásához, importálásához vagy törléséhez. A csevegés megállításakor nem tud üzeneteket fogadni és küldeni.
@@ -1444,7 +1444,7 @@
Jelmondat mentése a beállításokbanEnnek a csoportnak több mint %1$d tagja van, a kézbesítési jelentések nem lesznek elküldve.A második jelölés, amit kihagytunk! ✅
- A továbbítókiszolgáló megvédi az Ön IP-címét, de megfigyelheti a hívás időtartamát.
+ A továbbítókiszolgáló megvédi az IP-címét, de megfigyelheti a hívás időtartamát.Az utolsó üzenet tervezetének megőrzése a mellékletekkel együtt.A mentett WebRTC ICE-kiszolgálók el lesznek távolítva.A kézbesítési jelentések engedélyezve vannak %d csoportban
@@ -1664,8 +1664,8 @@
Ez a csevegés végpontok közötti titkosítással védett.Átköltöztetési párbeszédablak megnyitásaEz a csevegés végpontok közötti kvantumbiztos titkosítással védett.
- végpontok közötti titkosítással, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve.]]>
- végpontok közötti kvantumbiztos titkosítással, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve.]]>
+ végpontok közötti titkosítással, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve.]]>
+ végpontok közötti kvantumbiztos titkosítással, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve.]]>Hiba történt az értesítés megjelenítésekor, lépjen kapcsolatba a fejlesztőkkel.Keresse meg ezt az engedélyt az Android beállításaiban, és adja meg kézzel.Engedélyezés a beállításokban
@@ -1749,14 +1749,14 @@
Az IP-cím védelmének érdekében a privát útválasztás az SMP-kiszolgálókat használja az üzenetek kézbesítéséhez.Üzenet-útválasztási tartalékPRIVÁT ÜZENET-ÚTVÁLASZTÁS
- Használjon privát útválasztást ismeretlen kiszolgálókkal, ha az IP-cím nem védett.
+ Használjon privát útválasztást az ismeretlen kiszolgálókkal, ha az IP-cím nem védett.NE küldjön üzeneteket közvetlenül, még akkor sem, ha a saját kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.
- Tor vagy VPN nélkül az Ön IP-címe látható lesz a fájlkiszolgálók számára.
+ Tor vagy VPN nélkül az IP-címe láthatóvá válik a fájlkiszolgálók számára.FÁJLOKIP-cím védelmeAz alkalmazás kérni fogja az ismeretlen fájlkiszolgálókról történő letöltések megerősítését (kivéve, ha az .onion vagy a SOCKS-proxy engedélyezve van).Ismeretlen kiszolgálók!
- Tor vagy VPN nélkül az Ön IP-címe látható lesz a következő XFTP-továbbítókiszolgálók számára:\n%1$s.
+ Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-továbbítókiszolgálók számára:\n%1$s.Összes színmódFeketeSzínmód
@@ -2072,7 +2072,7 @@
Hang/Videó váltása hívás közben.Csevegési profilváltás az egyszer használható meghívókhoz.Továbbfejlesztett biztonság ✅
- A SimpleX Chat biztonsága a Trail of Bits által lett felülvizsgálva.
+ A SimpleX-protokollokat a Trail of Bits auditálta.Hiba történt a kiszolgálók mentésekorNincsenek üzenet-kiszolgálók.Nincsenek üzenetfogadási kiszolgálók.
@@ -2354,4 +2354,53 @@
KikapcsolvaElőre beállított kiszolgálókA 443-as TCP-port használata kizárólag az előre beállított kiszolgálokhoz.
+ Hiba a tag befogadásakor
+ %d csevegés a tagokkal
+ %d üzenet
+ 1 csevegés egy taggal
+ %d csevegés
+ A jelentés el lett küldve a moderátoroknak
+ A jelentéseket megtekintheti a „Csevegés az adminisztrátorokkal” menüben.
+ függőben lévő áttekintés
+ áttekintés
+ Csevegés az adminisztrátorokkal
+ Csevegés a tagokkal
+ Tagbefogadás
+ Nincsenek csevegések a tagokkal
+ Tagok áttekintése
+ Tagok áttekintése a befogadás előtt (kopogtatás).
+ Csevegés az adminisztrátorokkal
+ A tag csatlakozni akar a csoporthoz, befogadja a tagot?
+ Eltávolítás
+ Befogadás
+ Tag befogadása
+ összes
+ Csevegés a taggal
+ Új tag szeretne csatlakozni a csoporthoz.
+ kikapcsolva
+ Befogadás megfigyelőként
+ Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérelmét.
+ befogadta Önt
+ Tagbefogadás beállítása
+ Elmenti a befogadási beállításokat?
+ Ön befogadta ezt a tagot
+ Befogadás tagként
+ befogadta őt: %1$s
+ áttekintve a moderátorok által
+ nem lehet üzeneteket küldeni
+ partner letiltva
+ csoport törölve
+ eltávolítva a csoportból
+ csatlakozási kérelem elutasítva
+ Ön elhagyta a csoportot
+ a tag régi verziót használ
+ Hiba a taggal való csevegés törlésekor
+ Ön nem tud üzeneteket küldeni!
+ a kapcsolat nem áll készen
+ nincs szinkronizálva
+ Törli a taggal való csevegést?
+ partner törölve
+ Csevegés törlése
+ Elutasítás
+ Elutasítja a tagot?
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml
index a269149e99..b69ed8405f 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml
@@ -434,7 +434,7 @@
Panggilan berlangsungMenghubungkan panggilanPesan yang terlewati
- Hash dari pesan sebelumnya berbeda.\"
+ Hash dari pesan sebelumnya berbeda.Privasi & keamananEnkripsi berkas lokalTerima gambar otomatis
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml
index 6c086835ea..bf920e2fca 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml
@@ -2391,4 +2391,37 @@
OffServer preimpostatiUsa la porta TCP 443 solo per i server preimpostati.
+ 1 chat con un membro
+ %d chat
+ %d chat con membri
+ %d messaggi
+ Salvare le impostazioni di ammissione?
+ ha accettato %1$s
+ ti ha accettato/a
+ Attendi che i moderatori del gruppo revisionino la tua richiesta di entrare nel gruppo.
+ hai accettato questo membro
+ revisiona
+ Ammissione del membro
+ Nessuna chat con membri
+ off
+ Revisiona i membri
+ Revisiona i membri prima di ammetterli (bussare).
+ Accetta
+ Chat con amministratori
+ Rimuovi
+ Il membro entrerà nel gruppo, accettarlo?
+ revisionato dagli amministratori
+ Accetta membro
+ Chatta con gli amministratori
+ Accetta come osservatore
+ Il nuovo membro vuole entrare nel gruppo.
+ tutti
+ Chatta con il membro
+ Chat con membri
+ Errore di accettazione del membro
+ Accetta come membro
+ Imposta l\'ammissione del membro
+ Segnalazione inviata ai moderatori
+ in attesa di revisione
+ Puoi vedere i tuoi resoconti nella chat con gli amministratori.
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml
index 549cb01b63..a962298f19 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml
@@ -459,7 +459,7 @@
Створитибез зашифрування e2eконтакт має зашифрування e2e
- Хеш попереднього повідомлення інший.\"
+ Хеш попереднього повідомлення інший.Підтвердити парольНовий парольПерезапустити
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml
index 28a5f6f50d..a72a4938c2 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml
@@ -2375,4 +2375,37 @@
关闭预设服务器仅预设服务器使用 TCP 协议 443 端口。
+ 接受成员出错
+ 举报已发送至 moderators
+ %d 个聊天
+ 和成员的 %d 个聊天
+ %d 条消息
+ 接受了 %1$s
+ 接受了你
+ 你接受了该成员
+ 新成员要加入本群。
+ 审核
+ 待审核
+ 全部
+ 成员准入
+ 关闭
+ 删除
+ 接受
+ 和成员聊天
+ 和管理员聊天
+ 没有和成员的聊天
+ 接受为成员
+ 接受成员
+ 成员将加入本群,接受成员吗?
+ 由管理员审核
+ 设置成员入群准许
+ 和成员聊天
+ 和管理员聊天
+ 准许入群前审核成员(knocking)。
+ 请等待群的 moderator 审核你加入该群的请求。
+ 审核成员
+ 保存入群设置?
+ 你可以在和管理员和聊天中查看你的举报。
+ 接受为观察员
+ 和一名成员的一个聊天
diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt
index 03bc497699..41964b7d18 100644
--- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt
+++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt
@@ -44,11 +44,10 @@ import kotlin.text.substring
actual fun PlatformTextField(
composeState: MutableState,
sendMsgEnabled: Boolean,
+ disabledText: String?,
sendMsgButtonDisabled: Boolean,
textStyle: MutableState,
showDeleteTextButton: MutableState,
- userIsObserver: Boolean,
- userIsPending: Boolean,
placeholder: String,
showVoiceButton: Boolean,
onMessageChange: (ComposeMessage) -> Unit,
@@ -204,18 +203,16 @@ actual fun PlatformTextField(
)
showDeleteTextButton.value = cs.message.text.split("\n").size >= 4 && !cs.inProgress
if (composeState.value.preview is ComposePreview.VoicePreview) {
- ComposeOverlay(MR.strings.voice_message_send_text, textStyle, padding)
- } else if (userIsPending) {
- ComposeOverlay(MR.strings.reviewed_by_admins, textStyle, padding)
- } else if (userIsObserver) {
- ComposeOverlay(MR.strings.you_are_observer, textStyle, padding)
+ ComposeOverlay(generalGetString(MR.strings.voice_message_send_text), textStyle, padding)
+ } else if (disabledText != null) {
+ ComposeOverlay(disabledText, textStyle, padding)
}
}
@Composable
-private fun ComposeOverlay(textId: StringResource, textStyle: MutableState, padding: PaddingValues) {
+private fun ComposeOverlay(text: String, textStyle: MutableState, padding: PaddingValues) {
Text(
- generalGetString(textId),
+ text,
Modifier.padding(padding),
color = MaterialTheme.colors.secondary,
style = textStyle.value.copy(fontStyle = FontStyle.Italic)
diff --git a/apps/multiplatform/gradle.properties b/apps/multiplatform/gradle.properties
index 18add58bcf..4623752b32 100644
--- a/apps/multiplatform/gradle.properties
+++ b/apps/multiplatform/gradle.properties
@@ -24,11 +24,11 @@ android.nonTransitiveRClass=true
kotlin.mpp.androidSourceSetLayoutVersion=2
kotlin.jvm.target=11
-android.version_name=6.3.4
-android.version_code=288
+android.version_name=6.4-beta.0
+android.version_code=290
-desktop.version_name=6.3.4
-desktop.version_code=101
+desktop.version_name=6.4-beta.0
+desktop.version_code=102
kotlin.version=1.9.23
gradle.plugin.version=8.2.0
diff --git a/cabal.project b/cabal.project
index 44305353f2..48b75a86cd 100644
--- a/cabal.project
+++ b/cabal.project
@@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd
source-repository-package
type: git
location: https://github.com/simplex-chat/simplexmq.git
- tag: f44ea0a6d8eec8abf4af177ebeb91629f7d89165
+ tag: d352d518c2b3a42bc7a298954dde799422e1457f
source-repository-package
type: git
diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix
index 0c29b47a36..68a6054ef0 100644
--- a/scripts/nix/sha256map.nix
+++ b/scripts/nix/sha256map.nix
@@ -1,5 +1,5 @@
{
- "https://github.com/simplex-chat/simplexmq.git"."f44ea0a6d8eec8abf4af177ebeb91629f7d89165" = "1biq1kq33v7hnacbhllry9n5c6dmh9dyqnz8hc5abgsv1z38qb1a";
+ "https://github.com/simplex-chat/simplexmq.git"."d352d518c2b3a42bc7a298954dde799422e1457f" = "1rha84pfpaqx3mf218szkfra334vhijqf17hanxqmp1sicfbf1x3";
"https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38";
"https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d";
"https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl";
diff --git a/simplex-chat.cabal b/simplex-chat.cabal
index 7b09e9c926..553f2ec6cd 100644
--- a/simplex-chat.cabal
+++ b/simplex-chat.cabal
@@ -5,7 +5,7 @@ cabal-version: 1.12
-- see: https://github.com/sol/hpack
name: simplex-chat
-version: 6.4.0.1
+version: 6.4.0.2
category: Web, System, Services, Cryptography
homepage: https://github.com/simplex-chat/simplex-chat#readme
author: simplex.chat
diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs
index 7653322c8d..97bf26fd84 100644
--- a/src/Simplex/Chat/Controller.hs
+++ b/src/Simplex/Chat/Controller.hs
@@ -360,6 +360,7 @@ data ChatCommand
| APIAddMember GroupId ContactId GroupMemberRole
| APIJoinGroup {groupId :: GroupId, enableNtfs :: MsgFilter}
| APIAcceptMember GroupId GroupMemberId GroupMemberRole
+ | APIDeleteMemberSupportChat GroupId GroupMemberId
| APIMembersRole GroupId (NonEmpty GroupMemberId) GroupMemberRole
| APIBlockMembersForAll GroupId (NonEmpty GroupMemberId) Bool
| APIRemoveMembers {groupId :: GroupId, groupMemberIds :: Set GroupMemberId, withMessages :: Bool}
@@ -469,7 +470,7 @@ data ChatCommand
| ForwardMessage {toChatName :: ChatName, fromContactName :: ContactName, forwardedMsg :: Text}
| ForwardGroupMessage {toChatName :: ChatName, fromGroupName :: GroupName, fromMemberName_ :: Maybe ContactName, forwardedMsg :: Text}
| ForwardLocalMessage {toChatName :: ChatName, forwardedMsg :: Text}
- | SendMessage ChatName Text
+ | SendMessage SendName Text
| SendMemberContactMessage GroupName ContactName Text
| SendLiveMessage ChatName Text
| SendMessageQuote {contactName :: ContactName, msgDir :: AMsgDirection, quotedMsg :: Text, message :: Text}
@@ -483,6 +484,7 @@ data ChatCommand
| NewGroup IncognitoEnabled GroupProfile
| AddMember GroupName ContactName GroupMemberRole
| JoinGroup {groupName :: GroupName, enableNtfs :: MsgFilter}
+ | AcceptMember GroupName ContactName GroupMemberRole
| MemberRole GroupName ContactName GroupMemberRole
| BlockForAll GroupName ContactName Bool
| RemoveMembers {groupName :: GroupName, members :: Set ContactName, withMessages :: Bool}
@@ -703,6 +705,7 @@ data ChatResponse
| CRNetworkStatuses {user_ :: Maybe User, networkStatuses :: [ConnNetworkStatus]}
| CRJoinedGroupMember {user :: User, groupInfo :: GroupInfo, member :: GroupMember}
| CRMemberAccepted {user :: User, groupInfo :: GroupInfo, member :: GroupMember}
+ | CRMemberSupportChatDeleted {user :: User, groupInfo :: GroupInfo, member :: GroupMember}
| CRMembersRoleUser {user :: User, groupInfo :: GroupInfo, members :: [GroupMember], toRole :: GroupMemberRole}
| CRMembersBlockedForAllUser {user :: User, groupInfo :: GroupInfo, members :: [GroupMember], blocked :: Bool}
| CRGroupUpdated {user :: User, fromGroup :: GroupInfo, toGroup :: GroupInfo, member_ :: Maybe GroupMember}
@@ -838,7 +841,7 @@ data ChatEvent
| CEvtRemoteHostConnected {remoteHost :: RemoteHostInfo}
| CEvtRemoteHostStopped {remoteHostId_ :: Maybe RemoteHostId, rhsState :: RemoteHostSessionState, rhStopReason :: RemoteHostStopReason}
| CEvtRemoteCtrlFound {remoteCtrl :: RemoteCtrlInfo, ctrlAppInfo_ :: Maybe CtrlAppInfo, appVersion :: AppVersion, compatible :: Bool}
- | CEvtRemoteCtrlSessionCode {remoteCtrl_ :: Maybe RemoteCtrlInfo, sessionCode :: Text}
+ | CEvtRemoteCtrlSessionCode {remoteCtrl_ :: Maybe RemoteCtrlInfo, sessionCode :: Text}
| CEvtRemoteCtrlStopped {rcsState :: RemoteCtrlSessionState, rcStopReason :: RemoteCtrlStopReason}
| CEvtContactPQEnabled {user :: User, contact :: Contact, pqEnabled :: PQEncryption}
| CEvtContactDisabled {user :: User, contact :: Contact}
diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs
index f1ef1f369f..20f9468cd6 100644
--- a/src/Simplex/Chat/Library/Commands.hs
+++ b/src/Simplex/Chat/Library/Commands.hs
@@ -27,6 +27,7 @@ import Control.Monad.Reader
import qualified Data.Aeson as J
import Data.Attoparsec.ByteString.Char8 (Parser)
import qualified Data.Attoparsec.ByteString.Char8 as A
+import qualified Data.Attoparsec.Combinator as A
import qualified Data.ByteString.Base64 as B64
import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.Char8 as B
@@ -1031,8 +1032,9 @@ processChatCommand' vr = \case
user <- getUserByGroupId db chatId
gInfo <- getGroupInfo db vr user chatId
pure (user, gInfo)
+ chatScopeInfo <- mapM (getChatScopeInfo vr user) scope
(timedItems, gInfo') <- withFastStore $ \db -> do
- (timedItems, gInfo') <- updateGroupChatItemsReadList db vr user gInfo scope itemIds
+ (timedItems, gInfo') <- updateGroupChatItemsReadList db vr user gInfo chatScopeInfo itemIds
timedItems' <- liftIO $ setGroupChatItemsDeleteAt db user chatId timedItems =<< getCurrentTime
pure (timedItems', gInfo')
forM_ timedItems $ \(itemId, deleteAt) -> startProximateTimedItemThread user (chatRef, itemId) deleteAt
@@ -1848,10 +1850,10 @@ processChatCommand' vr = \case
forwardedItemId <- withFastStore $ \db -> getLocalChatItemIdByText' db user folderId forwardedMsg
toChatRef <- getChatRef user toChatName
processChatCommand $ APIForwardChatItems toChatRef (ChatRef CTLocal folderId Nothing) (forwardedItemId :| []) Nothing
- SendMessage (ChatName cType name) msg -> withUser $ \user -> do
+ SendMessage sendName msg -> withUser $ \user -> do
let mc = MCText msg
- case cType of
- CTDirect ->
+ case sendName of
+ SNDirect name ->
withFastStore' (\db -> runExceptT $ getContactIdByName db user name) >>= \case
Right ctId -> do
let sendRef = SRDirect ctId
@@ -1866,18 +1868,18 @@ processChatCommand' vr = \case
throwChatError $ CEContactNotFound name (Just suspectedMember)
_ ->
throwChatError $ CEContactNotFound name Nothing
- CTGroup -> do
- (gId, mentions) <- withFastStore $ \db -> do
+ SNGroup name scope_ -> do
+ (gId, cScope_, mentions) <- withFastStore $ \db -> do
gId <- getGroupIdByName db user name
- (gId,) <$> liftIO (getMessageMentions db user gId msg)
- let sendRef = SRGroup gId Nothing
+ cScope_ <-
+ forM scope_ $ \(GSNMemberSupport mName_) ->
+ GCSMemberSupport <$> mapM (getGroupMemberIdByName db user gId) mName_
+ (gId,cScope_,) <$> liftIO (getMessageMentions db user gId msg)
+ let sendRef = SRGroup gId cScope_
processChatCommand $ APISendMessages sendRef False Nothing [ComposedMessage Nothing Nothing mc mentions]
- CTLocal
- | name == "" -> do
- folderId <- withFastStore (`getUserNoteFolderId` user)
- processChatCommand $ APICreateChatItems folderId [composedMessage Nothing mc]
- | otherwise -> throwCmdError "not supported"
- _ -> throwCmdError "not supported"
+ SNLocal -> do
+ folderId <- withFastStore (`getUserNoteFolderId` user)
+ processChatCommand $ APICreateChatItems folderId [composedMessage Nothing mc]
SendMemberContactMessage gName mName msg -> withUser $ \user -> do
(gId, mId) <- getGroupAndMemberId user gName mName
m <- withFastStore $ \db -> getGroupMember db vr user gId mId
@@ -2079,6 +2081,9 @@ processChatCommand' vr = \case
forM_ (memberConn m) $ \mConn -> do
let msg2 = XMsgNew $ MCSimple $ extMsgContent (MCText acceptedToGroupMessage) Nothing
void $ sendDirectMemberMessage mConn msg2 groupId
+ when (memberCategory m == GCInviteeMember) $ do
+ introduceToRemaining vr user gInfo m {memberRole = role}
+ when (groupFeatureAllowed SGFHistory gInfo) $ sendHistory user gInfo m
(m', gInfo') <- withFastStore' $ \db -> do
m' <- updateGroupMemberAccepted db user m newMemberStatus role
gInfo' <- updateGroupMembersRequireAttention db user gInfo m m'
@@ -2094,6 +2099,12 @@ processChatCommand' vr = \case
Just c | connReady c -> GSMemConnected
_ -> GSMemAnnounced
_ -> throwCmdError "member should be pending approval and invitee, or pending review and not invitee"
+ APIDeleteMemberSupportChat groupId gmId -> withUser $ \user -> do
+ (gInfo, m) <- withFastStore $ \db -> (,) <$> getGroupInfo db vr user groupId <*> getGroupMemberById db vr user gmId
+ when (isNothing $ supportChat m) $ throwCmdError "member has no support chat"
+ when (memberPending m) $ throwCmdError "member is pending"
+ (gInfo', m') <- withFastStore' $ \db -> deleteGroupMemberSupportChat db user gInfo m
+ pure $ CRMemberSupportChatDeleted user gInfo' m'
APIMembersRole groupId memberIds newRole -> withUser $ \user ->
withGroupLock "memberRole" groupId . procCmd $ do
g@(Group gInfo members) <- withFastStore $ \db -> getGroup db vr user groupId
@@ -2229,7 +2240,7 @@ processChatCommand' vr = \case
deleted = deleted1 <> deleted2 <> deleted3 <> deleted4
-- Read group info with updated membersRequireAttention
gInfo' <- withFastStore $ \db -> getGroupInfo db vr user groupId
- let acis' = map (updateCIGroupInfo gInfo') acis
+ let acis' = map (updateACIGroupInfo gInfo') acis
unless (null acis') $ toView $ CEvtNewChatItems user acis'
unless (null errs) $ toView $ CEvtChatErrors errs
when withMessages $ deleteMessages user gInfo' deleted
@@ -2289,11 +2300,6 @@ processChatCommand' vr = \case
-- instead we re-read it once after deleting all members before response.
void $ deleteOrUpdateMemberRecordIO db user gInfo m
pure m {memberStatus = GSMemRemoved}
- updateCIGroupInfo :: GroupInfo -> AChatItem -> AChatItem
- updateCIGroupInfo gInfo' = \case
- AChatItem SCTGroup SMDSnd (GroupChat _gInfo chatScopeInfo) ci ->
- AChatItem SCTGroup SMDSnd (GroupChat gInfo' chatScopeInfo) ci
- aci -> aci
deleteMessages user gInfo@GroupInfo {membership} ms
| groupFeatureMemberAllowed SGFFullDelete membership gInfo = deleteGroupMembersCIs user gInfo ms membership
| otherwise = markGroupMembersCIsDeleted user gInfo ms membership
@@ -2328,6 +2334,7 @@ processChatCommand' vr = \case
JoinGroup gName enableNtfs -> withUser $ \user -> do
groupId <- withFastStore $ \db -> getGroupIdByName db user gName
processChatCommand $ APIJoinGroup groupId enableNtfs
+ AcceptMember gName gMemberName memRole -> withMemberName gName gMemberName $ \gId gMemberId -> APIAcceptMember gId gMemberId memRole
MemberRole gName gMemberName memRole -> withMemberName gName gMemberName $ \gId gMemberId -> APIMembersRole gId [gMemberId] memRole
BlockForAll gName gMemberName blocked -> withMemberName gName gMemberName $ \gId gMemberId -> APIBlockMembersForAll gId [gMemberId] blocked
RemoveMembers gName gMemberNames withMessages -> withUser $ \user -> do
@@ -2418,7 +2425,8 @@ processChatCommand' vr = \case
when (contactGrpInvSent ct) $ throwCmdError "x.grp.direct.inv already sent"
case memberConn m of
Just mConn -> do
- let msg = XGrpDirectInv cReq msgContent_
+ -- TODO [knocking] send in correct scope - modiy API
+ let msg = XGrpDirectInv cReq msgContent_ Nothing
(sndMsg, _, _) <- sendDirectMemberMessage mConn msg groupId
withFastStore' $ \db -> setContactGrpInvSent db ct True
let ct' = ct {contactGrpInvSent = True}
@@ -3369,7 +3377,7 @@ processChatCommand' vr = \case
Nothing -> Just GRAuthor
Just (GCSMemberSupport Nothing)
| memberPending membership -> Nothing
- | otherwise -> Just GRAuthor
+ | otherwise -> Just GRObserver
Just (GCSMemberSupport (Just _gmId)) -> Just GRModerator
assertGroupContentAllowed :: CM ()
assertGroupContentAllowed =
@@ -3380,7 +3388,7 @@ processChatCommand' vr = \case
findProhibited :: [ComposedMessageReq] -> Maybe GroupFeature
findProhibited =
foldr'
- (\(ComposedMessage {fileSource, msgContent = mc}, _, (_, ft), _) acc -> prohibitedGroupContent gInfo membership mc ft fileSource True <|> acc)
+ (\(ComposedMessage {fileSource, msgContent = mc}, _, (_, ft), _) acc -> prohibitedGroupContent gInfo membership chatScopeInfo mc ft fileSource True <|> acc)
Nothing
processComposedMessages :: CM ChatResponse
processComposedMessages = do
@@ -4100,6 +4108,7 @@ chatCommandP =
"/_add #" *> (APIAddMember <$> A.decimal <* A.space <*> A.decimal <*> memberRole),
"/_join #" *> (APIJoinGroup <$> A.decimal <*> pure MFAll), -- needs to be changed to support in UI
"/_accept member #" *> (APIAcceptMember <$> A.decimal <* A.space <*> A.decimal <*> memberRole),
+ "/_delete member chat #" *> (APIDeleteMemberSupportChat <$> A.decimal <* A.space <*> A.decimal),
"/_member role #" *> (APIMembersRole <$> A.decimal <*> _strP <*> memberRole),
"/_block #" *> (APIBlockMembersForAll <$> A.decimal <*> _strP <* " blocked=" <*> onOffP),
"/_remove #" *> (APIRemoveMembers <$> A.decimal <*> _strP <*> (" messages=" *> onOffP <|> pure False)),
@@ -4187,6 +4196,7 @@ chatCommandP =
"/_group " *> (APINewGroup <$> A.decimal <*> incognitoOnOffP <* A.space <*> jsonP),
("/add " <|> "/a ") *> char_ '#' *> (AddMember <$> displayNameP <* A.space <* char_ '@' <*> displayNameP <*> (memberRole <|> pure GRMember)),
("/join " <|> "/j ") *> char_ '#' *> (JoinGroup <$> displayNameP <*> (" mute" $> MFNone <|> pure MFAll)),
+ "/accept member " *> char_ '#' *> (AcceptMember <$> displayNameP <* A.space <* char_ '@' <*> displayNameP <*> (memberRole <|> pure GRMember)),
("/member role " <|> "/mr ") *> char_ '#' *> (MemberRole <$> displayNameP <* A.space <* char_ '@' <*> displayNameP <*> memberRole),
"/block for all #" *> (BlockForAll <$> displayNameP <* A.space <*> (char_ '@' *> displayNameP) <*> pure True),
"/unblock for all #" *> (BlockForAll <$> displayNameP <* A.space <*> (char_ '@' *> displayNameP) <*> pure False),
@@ -4233,8 +4243,7 @@ chatCommandP =
ForwardGroupMessage <$> chatNameP <* " <- #" <*> displayNameP <* A.space <* A.char '@' <*> (Just <$> displayNameP) <* A.space <*> msgTextP,
ForwardGroupMessage <$> chatNameP <* " <- #" <*> displayNameP <*> pure Nothing <* A.space <*> msgTextP,
ForwardLocalMessage <$> chatNameP <* " <- * " <*> msgTextP,
- SendMessage <$> chatNameP <* A.space <*> msgTextP,
- "/* " *> (SendMessage (ChatName CTLocal "") <$> msgTextP),
+ SendMessage <$> sendNameP <* A.space <*> msgTextP,
"@#" *> (SendMemberContactMessage <$> displayNameP <* A.space <* char_ '@' <*> displayNameP <* A.space <*> msgTextP),
"/live " *> (SendLiveMessage <$> chatNameP <*> (A.space *> msgTextP <|> pure "")),
(">@" <|> "> @") *> sendMsgQuote (AMsgDirection SMDRcv),
@@ -4437,14 +4446,27 @@ chatCommandP =
chatNameP' = ChatName <$> (chatTypeP <|> pure CTDirect) <*> displayNameP
chatRefP = do
chatTypeP >>= \case
- CTGroup -> ChatRef CTGroup <$> A.decimal <*> (Just <$> gcScopeP <|> pure Nothing)
+ CTGroup -> ChatRef CTGroup <$> A.decimal <*> optional gcScopeP
cType -> (\chatId -> ChatRef cType chatId Nothing) <$> A.decimal
sendRefP =
(A.char '@' $> SRDirect <*> A.decimal)
- <|> (A.char '#' $> SRGroup <*> A.decimal <*> (Just <$> gcScopeP <|> pure Nothing))
- gcScopeP =
- ("(_support:" *> (GCSMemberSupport . Just <$> A.decimal) <* ")")
- <|> ("(_support)" $> (GCSMemberSupport Nothing))
+ <|> (A.char '#' $> SRGroup <*> A.decimal <*> optional gcScopeP)
+ gcScopeP = "(_support" *> (GCSMemberSupport <$> optional (A.char ':' *> A.decimal)) <* A.char ')'
+ sendNameP =
+ (A.char '@' $> SNDirect <*> displayNameP)
+ <|> (A.char '#' $> SNGroup <*> displayNameP <*> gScopeNameP)
+ <|> ("/*" $> SNLocal)
+ gScopeNameP =
+ (supportPfx *> (Just . GSNMemberSupport <$> optional supportMember) <* A.char ')')
+ -- this branch fails on "(support" followed by incorrect syntax,
+ -- to avoid sending message to the whole group as `optional gScopeNameP` would do
+ <|> (optional supportPfx >>= mapM (\_ -> fail "bad chat scope"))
+ where
+ supportPfx = A.takeWhile isSpace *> "(support"
+ supportMember = safeDecodeUtf8 <$> (A.char ':' *> A.takeWhile isSpace *> (A.take . lengthTillLastParen =<< A.lookAhead displayNameP_))
+ lengthTillLastParen s = case B.unsnoc s of
+ Just (_, ')') -> B.length s - 1
+ _ -> B.length s
msgCountP = A.space *> A.decimal <|> pure 10
ciTTLDecimal = ("default" $> Nothing) <|> (Just <$> A.decimal)
ciTTL =
@@ -4510,7 +4532,11 @@ chatCommandP =
char_ = optional . A.char
displayNameP :: Parser Text
-displayNameP = safeDecodeUtf8 <$> (quoted '\'' <|> takeNameTill (\c -> isSpace c || c == ','))
+displayNameP = safeDecodeUtf8 <$> displayNameP_
+{-# INLINE displayNameP #-}
+
+displayNameP_ :: Parser ByteString
+displayNameP_ = quoted '\'' <|> takeNameTill (\c -> isSpace c || c == ',')
where
takeNameTill p =
A.peekChar' >>= \c ->
diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs
index 6200fb2435..bdc5e4b920 100644
--- a/src/Simplex/Chat/Library/Internal.hs
+++ b/src/Simplex/Chat/Library/Internal.hs
@@ -37,7 +37,7 @@ import Data.Foldable (foldr')
import Data.Functor (($>))
import Data.Functor.Identity
import Data.Int (Int64)
-import Data.List (find, mapAccumL, partition)
+import Data.List (find, foldl', mapAccumL, partition)
import Data.List.NonEmpty (NonEmpty (..), (<|))
import qualified Data.List.NonEmpty as L
import Data.Map.Strict (Map)
@@ -323,12 +323,12 @@ quoteContent mc qmc ciFile_
qFileName = maybe qText (T.pack . getFileName) ciFile_
qTextOrFile = if T.null qText then qFileName else qText
-prohibitedGroupContent :: GroupInfo -> GroupMember -> MsgContent -> Maybe MarkdownList -> Maybe f -> Bool -> Maybe GroupFeature
-prohibitedGroupContent gInfo@GroupInfo {membership = GroupMember {memberRole = userRole}} m mc ft file_ sent
+prohibitedGroupContent :: GroupInfo -> GroupMember -> Maybe GroupChatScopeInfo -> MsgContent -> Maybe MarkdownList -> Maybe f -> Bool -> Maybe GroupFeature
+prohibitedGroupContent gInfo@GroupInfo {membership = GroupMember {memberRole = userRole}} m scopeInfo mc ft file_ sent
| isVoice mc && not (groupFeatureMemberAllowed SGFVoice m gInfo) = Just GFVoice
- | not (isVoice mc) && isJust file_ && not (groupFeatureMemberAllowed SGFFiles m gInfo) = Just GFFiles
- | isReport mc && (badReportUser || not (groupFeatureAllowed SGFReports gInfo)) = Just GFReports
- | prohibitedSimplexLinks gInfo m ft = Just GFSimplexLinks
+ | isNothing scopeInfo && not (isVoice mc) && isJust file_ && not (groupFeatureMemberAllowed SGFFiles m gInfo) = Just GFFiles
+ | isNothing scopeInfo && isReport mc && (badReportUser || not (groupFeatureAllowed SGFReports gInfo)) = Just GFReports
+ | isNothing scopeInfo && prohibitedSimplexLinks gInfo m ft = Just GFSimplexLinks
| otherwise = Nothing
where
-- admins cannot send reports, non-admins cannot receive reports
@@ -459,7 +459,14 @@ deleteGroupCIs user gInfo chatScopeInfo items byGroupMember_ deletedTs = do
deleteCIFiles user ciFilesInfo
(errs, deletions) <- lift $ partitionEithers <$> withStoreBatch' (\db -> map (deleteItem db) items)
unless (null errs) $ toView $ CEvtChatErrors errs
- pure deletions
+ vr <- chatVersionRange
+ deletions' <- case chatScopeInfo of
+ Nothing -> pure deletions
+ Just scopeInfo@GCSIMemberSupport {groupMember_} -> do
+ let decStats = countDeletedUnreadItems groupMember_ deletions
+ gInfo' <- withFastStore' $ \db -> updateGroupScopeUnreadStats db vr user gInfo scopeInfo decStats
+ pure $ map (updateDeletionGroupInfo gInfo') deletions
+ pure deletions'
where
deleteItem :: DB.Connection -> CChatItem 'CTGroup -> IO ChatItemDeletion
deleteItem db (CChatItem md ci) = do
@@ -467,6 +474,32 @@ deleteGroupCIs user gInfo chatScopeInfo items byGroupMember_ deletedTs = do
Just m -> Just <$> updateGroupChatItemModerated db user gInfo ci m deletedTs
Nothing -> Nothing <$ deleteGroupChatItem db user gInfo ci
pure $ groupDeletion md gInfo chatScopeInfo ci ci'
+ countDeletedUnreadItems :: Maybe GroupMember -> [ChatItemDeletion] -> (Int, Int, Int)
+ countDeletedUnreadItems scopeMember_ = foldl' countItem (0, 0, 0)
+ where
+ countItem :: (Int, Int, Int) -> ChatItemDeletion -> (Int, Int, Int)
+ countItem (!unread, !unanswered, !mentions) ChatItemDeletion {deletedChatItem}
+ | aChatItemIsRcvNew deletedChatItem =
+ let unread' = unread + 1
+ unanswered' = case (scopeMember_, aChatItemRcvFromMember deletedChatItem) of
+ (Just scopeMember, Just rcvFromMember)
+ | groupMemberId' rcvFromMember == groupMemberId' scopeMember -> unanswered + 1
+ _ -> unanswered
+ mentions' = if isACIUserMention deletedChatItem then mentions + 1 else mentions
+ in (unread', unanswered', mentions')
+ | otherwise = (unread, unanswered, mentions)
+ updateDeletionGroupInfo :: GroupInfo -> ChatItemDeletion -> ChatItemDeletion
+ updateDeletionGroupInfo gInfo' ChatItemDeletion {deletedChatItem, toChatItem} =
+ ChatItemDeletion
+ { deletedChatItem = updateACIGroupInfo gInfo' deletedChatItem,
+ toChatItem = updateACIGroupInfo gInfo' <$> toChatItem
+ }
+
+updateACIGroupInfo :: GroupInfo -> AChatItem -> AChatItem
+updateACIGroupInfo gInfo' = \case
+ AChatItem SCTGroup dir (GroupChat _gInfo chatScopeInfo) ci ->
+ AChatItem SCTGroup dir (GroupChat gInfo' chatScopeInfo) ci
+ aci -> aci
deleteGroupMemberCIs :: MsgDirectionI d => User -> GroupInfo -> GroupMember -> GroupMember -> SMsgDirection d -> CM ()
deleteGroupMemberCIs user gInfo member byGroupMember msgDir = do
diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs
index 12e6263ba0..80e287f414 100644
--- a/src/Simplex/Chat/Library/Subscriber.hs
+++ b/src/Simplex/Chat/Library/Subscriber.hs
@@ -871,9 +871,11 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
logInfo $ "group msg=" <> tshow tag <> " " <> eInfo
(m'', conn', msg@RcvMessage {chatMsgEvent = ACME _ event}) <- saveGroupRcvMsg user groupId m' conn msgMeta msgBody chatMsg
case event of
- XMsgNew mc -> memberCanSend m'' $ newGroupContentMessage gInfo' m'' mc msg brokerTs False
- XMsgFileDescr sharedMsgId fileDescr -> memberCanSend m'' $ groupMessageFileDescription gInfo' m'' sharedMsgId fileDescr
- XMsgUpdate sharedMsgId mContent mentions ttl live msgScope -> memberCanSend m'' $ groupMessageUpdate gInfo' m'' sharedMsgId mContent mentions msgScope msg brokerTs ttl live
+ XMsgNew mc -> memberCanSend m'' scope $ newGroupContentMessage gInfo' m'' mc msg brokerTs False
+ where ExtMsgContent {scope} = mcExtMsgContent mc
+ -- file description is always allowed, to allow sending files to support scope
+ XMsgFileDescr sharedMsgId fileDescr -> groupMessageFileDescription gInfo' m'' sharedMsgId fileDescr
+ XMsgUpdate sharedMsgId mContent mentions ttl live msgScope -> memberCanSend m'' msgScope $ groupMessageUpdate gInfo' m'' sharedMsgId mContent mentions msgScope msg brokerTs ttl live
XMsgDel sharedMsgId memberId -> groupMessageDelete gInfo' m'' sharedMsgId memberId msg brokerTs
XMsgReact sharedMsgId (Just memberId) reaction add -> groupMsgReaction gInfo' m'' sharedMsgId memberId reaction add msg brokerTs
-- TODO discontinue XFile
@@ -895,7 +897,8 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
XGrpDel -> xGrpDel gInfo' m'' msg brokerTs
XGrpInfo p' -> xGrpInfo gInfo' m'' p' msg brokerTs
XGrpPrefs ps' -> xGrpPrefs gInfo' m'' ps'
- XGrpDirectInv connReq mContent_ -> memberCanSend m'' $ xGrpDirectInv gInfo' m'' conn' connReq mContent_ msg brokerTs
+ -- TODO [knocking] why don't we forward these messages?
+ XGrpDirectInv connReq mContent_ msgScope -> memberCanSend m'' msgScope $ xGrpDirectInv gInfo' m'' conn' connReq mContent_ msg brokerTs
XGrpMsgForward memberId msg' msgTs -> xGrpMsgForward gInfo' m'' memberId msg' msgTs
XInfoProbe probe -> xInfoProbe (COMGroupMember m'') probe
XInfoProbeCheck probeHash -> xInfoProbeCheck (COMGroupMember m'') probeHash
@@ -1252,10 +1255,12 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
toViewTE $ TERejectingGroupJoinRequestMember user gInfo mem rjctReason
_ -> toView $ CEvtReceivedContactRequest user cReq
- memberCanSend :: GroupMember -> CM () -> CM ()
- memberCanSend m@GroupMember {memberRole} a
- | memberRole > GRObserver || memberPending m = a
- | otherwise = messageError "member is not allowed to send messages"
+ memberCanSend :: GroupMember -> Maybe MsgScope -> CM () -> CM ()
+ memberCanSend m@GroupMember {memberRole} msgScope a = case msgScope of
+ Just MSMember {} -> a
+ Nothing
+ | memberRole > GRObserver || memberPending m -> a
+ | otherwise -> messageError "member is not allowed to send messages"
processConnMERR :: ConnectionEntity -> Connection -> AgentErrorType -> CM ()
processConnMERR connEntity conn err = do
@@ -1643,62 +1648,60 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
e -> throwError e
newGroupContentMessage :: GroupInfo -> GroupMember -> MsgContainer -> RcvMessage -> UTCTime -> Bool -> CM ()
- newGroupContentMessage gInfo m@GroupMember {memberId, memberRole} mc msg@RcvMessage {sharedMsgId_} brokerTs forwarded
- | blockedByAdmin m = createBlockedByAdmin
- | otherwise = case prohibitedGroupContent gInfo m content ft_ fInv_ False of
- Just f -> rejected f
- Nothing ->
- withStore' (\db -> getCIModeration db vr user gInfo memberId sharedMsgId_) >>= \case
- Just ciModeration -> do
- applyModeration ciModeration
- withStore' $ \db -> deleteCIModeration db gInfo memberId sharedMsgId_
- Nothing -> createContentItem
+ newGroupContentMessage gInfo m@GroupMember {memberId, memberRole} mc msg@RcvMessage {sharedMsgId_} brokerTs forwarded = do
+ (gInfo', m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_
+ if blockedByAdmin m'
+ then createBlockedByAdmin gInfo' m' scopeInfo
+ else
+ case prohibitedGroupContent gInfo' m' scopeInfo content ft_ fInv_ False of
+ Just f -> rejected gInfo' m' scopeInfo f
+ Nothing ->
+ withStore' (\db -> getCIModeration db vr user gInfo' memberId sharedMsgId_) >>= \case
+ Just ciModeration -> do
+ applyModeration gInfo' m' scopeInfo ciModeration
+ withStore' $ \db -> deleteCIModeration db gInfo' memberId sharedMsgId_
+ Nothing -> createContentItem gInfo' m' scopeInfo
where
- rejected f = newChatItem (ciContentNoParse $ CIRcvGroupFeatureRejected f) Nothing Nothing False
- timed' = if forwarded then rcvCITimed_ (Just Nothing) itemTTL else rcvGroupCITimed gInfo itemTTL
+ rejected gInfo' m' scopeInfo f = newChatItem gInfo' m' scopeInfo (ciContentNoParse $ CIRcvGroupFeatureRejected f) Nothing Nothing False
+ timed' gInfo' = if forwarded then rcvCITimed_ (Just Nothing) itemTTL else rcvGroupCITimed gInfo' itemTTL
live' = fromMaybe False live_
ExtMsgContent content mentions fInv_ itemTTL live_ msgScope_ = mcExtMsgContent mc
ts@(_, ft_) = msgContentTexts content
- saveRcvCI gInfo' scopeInfo m' = saveRcvChatItem' user (CDGroupRcv gInfo' scopeInfo m') msg sharedMsgId_ brokerTs
- createBlockedByAdmin
- | groupFeatureAllowed SGFFullDelete gInfo = do
- (gInfo', m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_
+ saveRcvCI gInfo' m' scopeInfo = saveRcvChatItem' user (CDGroupRcv gInfo' scopeInfo m') msg sharedMsgId_ brokerTs
+ createBlockedByAdmin gInfo' m' scopeInfo
+ | groupFeatureAllowed SGFFullDelete gInfo' = do
-- ignores member role when blocked by admin
- (ci, cInfo) <- saveRcvCI gInfo' scopeInfo m' (ciContentNoParse CIRcvBlocked) Nothing timed' False M.empty
+ (ci, cInfo) <- saveRcvCI gInfo' m' scopeInfo (ciContentNoParse CIRcvBlocked) Nothing (timed' gInfo') False M.empty
ci' <- withStore' $ \db -> updateGroupCIBlockedByAdmin db user gInfo' ci brokerTs
groupMsgToView cInfo ci'
| otherwise = do
- file_ <- processFileInv
- (ci, cInfo) <- createNonLive file_
- ci' <- withStore' $ \db -> markGroupCIBlockedByAdmin db user gInfo ci
+ file_ <- processFileInv m'
+ (ci, cInfo) <- createNonLive gInfo' m' scopeInfo file_
+ ci' <- withStore' $ \db -> markGroupCIBlockedByAdmin db user gInfo' ci
groupMsgToView cInfo ci'
- applyModeration CIModeration {moderatorMember = moderator@GroupMember {memberRole = moderatorRole}, moderatedAt}
+ applyModeration gInfo' m' scopeInfo CIModeration {moderatorMember = moderator@GroupMember {memberRole = moderatorRole}, moderatedAt}
| moderatorRole < GRModerator || moderatorRole < memberRole =
- createContentItem
- | groupFeatureMemberAllowed SGFFullDelete moderator gInfo = do
- (gInfo', m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_
- (ci, cInfo) <- saveRcvCI gInfo' scopeInfo m' (ciContentNoParse CIRcvModerated) Nothing timed' False M.empty
+ createContentItem gInfo' m' scopeInfo
+ | groupFeatureMemberAllowed SGFFullDelete moderator gInfo' = do
+ (ci, cInfo) <- saveRcvCI gInfo' m' scopeInfo (ciContentNoParse CIRcvModerated) Nothing (timed' gInfo') False M.empty
ci' <- withStore' $ \db -> updateGroupChatItemModerated db user gInfo' ci moderator moderatedAt
groupMsgToView cInfo ci'
| otherwise = do
- (gInfo', _m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_
- file_ <- processFileInv
- (ci, _cInfo) <- createNonLive file_
+ file_ <- processFileInv m'
+ (ci, _cInfo) <- createNonLive gInfo' m' scopeInfo file_
deletions <- markGroupCIsDeleted user gInfo' scopeInfo [CChatItem SMDRcv ci] (Just moderator) moderatedAt
toView $ CEvtChatItemsDeleted user deletions False False
- createNonLive file_ = do
- (gInfo', m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_
- saveRcvCI gInfo' scopeInfo m' (CIRcvMsgContent content, ts) (snd <$> file_) timed' False mentions
- createContentItem = do
- file_ <- processFileInv
- newChatItem (CIRcvMsgContent content, ts) (snd <$> file_) timed' live'
- when (showMessages $ memberSettings m) $ autoAcceptFile file_
- processFileInv =
- processFileInvitation fInv_ content $ \db -> createRcvGroupFileTransfer db userId m
- newChatItem ciContent ciFile_ timed_ live = do
- let mentions' = if showMessages (memberSettings m) then mentions else []
- (gInfo', m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_
- (ci, cInfo) <- saveRcvCI gInfo' scopeInfo m' ciContent ciFile_ timed_ live mentions'
+ createNonLive gInfo' m' scopeInfo file_ = do
+ saveRcvCI gInfo' m' scopeInfo (CIRcvMsgContent content, ts) (snd <$> file_) (timed' gInfo') False mentions
+ createContentItem gInfo' m' scopeInfo = do
+ file_ <- processFileInv m'
+ newChatItem gInfo' m' scopeInfo (CIRcvMsgContent content, ts) (snd <$> file_) (timed' gInfo') live'
+ when (showMessages $ memberSettings m') $ autoAcceptFile file_
+ processFileInv m' =
+ processFileInvitation fInv_ content $ \db -> createRcvGroupFileTransfer db userId m'
+ newChatItem gInfo' m' scopeInfo ciContent ciFile_ timed_ live = do
+ let mentions' = if showMessages (memberSettings m') then mentions else []
+ (ci, cInfo) <- saveRcvCI gInfo' m' scopeInfo ciContent ciFile_ timed_ live mentions'
ci' <- blockedMember m' ci $ withStore' $ \db -> markGroupChatItemBlocked db user gInfo' ci
reactions <- maybe (pure []) (\sharedMsgId -> withStore' $ \db -> getGroupCIReactions db gInfo' memberId sharedMsgId) sharedMsgId_
groupMsgToView cInfo ci' {reactions}
@@ -2123,14 +2126,14 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
membership' <- withStore' $ \db -> updateGroupMemberAccepted db user membership GSMemConnected role
-- create item in both scopes
let gInfo' = gInfo {membership = membership'}
- createInternalChatItem user (CDGroupRcv gInfo' Nothing m) (CIRcvGroupEvent RGEUserAccepted) Nothing
- let scopeInfo = Just $ GCSIMemberSupport {groupMember_ = Nothing}
- createInternalChatItem user (CDGroupRcv gInfo' scopeInfo m) (CIRcvGroupEvent RGEUserAccepted) Nothing
- toView $ CEvtUserJoinedGroup user gInfo' m
- let cd = CDGroupRcv gInfo' Nothing m
+ cd = CDGroupRcv gInfo' Nothing m
createInternalChatItem user cd (CIRcvGroupE2EEInfo E2EInfo {pqEnabled = PQEncOff}) Nothing
createGroupFeatureItems user cd CIRcvGroupFeature gInfo'
maybeCreateGroupDescrLocal gInfo' m
+ createInternalChatItem user cd (CIRcvGroupEvent RGEUserAccepted) Nothing
+ let scopeInfo = Just $ GCSIMemberSupport {groupMember_ = Nothing}
+ createInternalChatItem user (CDGroupRcv gInfo' scopeInfo m) (CIRcvGroupEvent RGEUserAccepted) Nothing
+ toView $ CEvtUserJoinedGroup user gInfo' m
GAPendingReview -> do
membership' <- withStore' $ \db -> updateGroupMemberAccepted db user membership GSMemPendingReview role
let gInfo' = gInfo {membership = membership'}
@@ -2839,9 +2842,11 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
let body = LB.toStrict $ J.encode msg
rcvMsg@RcvMessage {chatMsgEvent = ACME _ event} <- saveGroupFwdRcvMsg user groupId m author body chatMsg
case event of
- XMsgNew mc -> memberCanSend author $ newGroupContentMessage gInfo author mc rcvMsg msgTs True
- XMsgFileDescr sharedMsgId fileDescr -> memberCanSend author $ groupMessageFileDescription gInfo author sharedMsgId fileDescr
- XMsgUpdate sharedMsgId mContent mentions ttl live msgScope -> memberCanSend author $ groupMessageUpdate gInfo author sharedMsgId mContent mentions msgScope rcvMsg msgTs ttl live
+ XMsgNew mc -> memberCanSend author scope $ newGroupContentMessage gInfo author mc rcvMsg msgTs True
+ where ExtMsgContent {scope} = mcExtMsgContent mc
+ -- file description is always allowed, to allow sending files to support scope
+ XMsgFileDescr sharedMsgId fileDescr -> groupMessageFileDescription gInfo author sharedMsgId fileDescr
+ XMsgUpdate sharedMsgId mContent mentions ttl live msgScope -> memberCanSend author msgScope $ groupMessageUpdate gInfo author sharedMsgId mContent mentions msgScope rcvMsg msgTs ttl live
XMsgDel sharedMsgId memId -> groupMessageDelete gInfo author sharedMsgId memId rcvMsg msgTs
XMsgReact sharedMsgId (Just memId) reaction add -> groupMsgReaction gInfo author sharedMsgId memId reaction add rcvMsg msgTs
XFileCancel sharedMsgId -> xFileCancelGroup gInfo author sharedMsgId
diff --git a/src/Simplex/Chat/Messages.hs b/src/Simplex/Chat/Messages.hs
index 00dd999139..dfd37527d1 100644
--- a/src/Simplex/Chat/Messages.hs
+++ b/src/Simplex/Chat/Messages.hs
@@ -83,6 +83,16 @@ instance TextEncoding GroupChatScopeTag where
data ChatName = ChatName {chatType :: ChatType, chatName :: Text}
deriving (Show)
+data SendName
+ = SNDirect ContactName
+ | SNGroup GroupName (Maybe GroupScopeName)
+ | SNLocal
+ deriving (Show)
+
+data GroupScopeName
+ = GSNMemberSupport (Maybe ContactName)
+ deriving (Show)
+
chatTypeStr :: ChatType -> Text
chatTypeStr = \case
CTDirect -> "@"
@@ -205,6 +215,9 @@ data CIMentionMember = CIMentionMember
}
deriving (Eq, Show)
+isACIUserMention :: AChatItem -> Bool
+isACIUserMention (AChatItem _ _ _ ci) = isUserMention ci
+
isUserMention :: ChatItem c d -> Bool
isUserMention ChatItem {meta = CIMeta {userMention}} = userMention
@@ -285,6 +298,16 @@ chatItemMember GroupInfo {membership} ChatItem {chatDir} = case chatDir of
CIGroupSnd -> membership
CIGroupRcv m -> m
+chatItemRcvFromMember :: ChatItem c d -> Maybe GroupMember
+chatItemRcvFromMember ChatItem {chatDir} = case chatDir of
+ CIGroupRcv m -> Just m
+ _ -> Nothing
+
+chatItemIsRcvNew :: ChatItem c d -> Bool
+chatItemIsRcvNew ChatItem {meta = CIMeta {itemStatus}} = case itemStatus of
+ CISRcvNew -> True
+ _ -> False
+
ciReactionAllowed :: ChatItem c d -> Bool
ciReactionAllowed ChatItem {meta = CIMeta {itemDeleted = Just _}} = False
ciReactionAllowed ChatItem {content} = isJust $ ciMsgContent content
@@ -385,6 +408,12 @@ aChatItemTs (AChatItem _ _ _ ci) = chatItemTs' ci
aChatItemDir :: AChatItem -> MsgDirection
aChatItemDir (AChatItem _ sMsgDir _ _) = toMsgDirection sMsgDir
+aChatItemRcvFromMember :: AChatItem -> Maybe GroupMember
+aChatItemRcvFromMember (AChatItem _ _ _ ci) = chatItemRcvFromMember ci
+
+aChatItemIsRcvNew :: AChatItem -> Bool
+aChatItemIsRcvNew (AChatItem _ _ _ ci) = chatItemIsRcvNew ci
+
updateFileStatus :: forall c d. ChatItem c d -> CIFileStatus d -> ChatItem c d
updateFileStatus ci@ChatItem {file} status = case file of
Just f -> ci {file = Just (f :: CIFile d) {fileStatus = status}}
@@ -956,7 +985,10 @@ ciStatusNew = case msgDirection @d of
ciCreateStatus :: forall d. MsgDirectionI d => CIContent d -> CIStatus d
ciCreateStatus content = case msgDirection @d of
SMDSnd -> ciStatusNew
- SMDRcv -> if ciRequiresAttention content then ciStatusNew else CISRcvRead
+ SMDRcv
+ | isCIReport content -> CISRcvRead
+ | ciRequiresAttention content -> ciStatusNew
+ | otherwise -> CISRcvRead
membersGroupItemStatus :: [(GroupSndStatus, Int)] -> CIStatus 'MDSnd
membersGroupItemStatus memStatusCounts
diff --git a/src/Simplex/Chat/Messages/CIContent.hs b/src/Simplex/Chat/Messages/CIContent.hs
index cc2f97ac44..cc6529831c 100644
--- a/src/Simplex/Chat/Messages/CIContent.hs
+++ b/src/Simplex/Chat/Messages/CIContent.hs
@@ -182,6 +182,9 @@ ciMsgContent = \case
CIRcvMsgContent mc -> Just mc
_ -> Nothing
+isCIReport :: CIContent d -> Bool
+isCIReport = maybe False isReport . ciMsgContent
+
data MsgDecryptError
= MDERatchetHeader
| MDETooManySkipped
diff --git a/src/Simplex/Chat/Protocol.hs b/src/Simplex/Chat/Protocol.hs
index 57383e7b11..151b1b0d27 100644
--- a/src/Simplex/Chat/Protocol.hs
+++ b/src/Simplex/Chat/Protocol.hs
@@ -361,7 +361,7 @@ data ChatMsgEvent (e :: MsgEncoding) where
XGrpDel :: ChatMsgEvent 'Json
XGrpInfo :: GroupProfile -> ChatMsgEvent 'Json
XGrpPrefs :: GroupPreferences -> ChatMsgEvent 'Json
- XGrpDirectInv :: ConnReqInvitation -> Maybe MsgContent -> ChatMsgEvent 'Json
+ XGrpDirectInv :: ConnReqInvitation -> Maybe MsgContent -> Maybe MsgScope -> ChatMsgEvent 'Json
XGrpMsgForward :: MemberId -> ChatMessage 'Json -> UTCTime -> ChatMsgEvent 'Json
XInfoProbe :: Probe -> ChatMsgEvent 'Json
XInfoProbeCheck :: ProbeHash -> ChatMsgEvent 'Json
@@ -1011,7 +1011,7 @@ toCMEventTag msg = case msg of
XGrpDel -> XGrpDel_
XGrpInfo _ -> XGrpInfo_
XGrpPrefs _ -> XGrpPrefs_
- XGrpDirectInv _ _ -> XGrpDirectInv_
+ XGrpDirectInv {} -> XGrpDirectInv_
XGrpMsgForward {} -> XGrpMsgForward_
XInfoProbe _ -> XInfoProbe_
XInfoProbeCheck _ -> XInfoProbeCheck_
@@ -1083,7 +1083,14 @@ appJsonToCM AppMessageJson {v, msgId, event, params} = do
msg = \case
XMsgNew_ -> XMsgNew <$> JT.parseEither parseMsgContainer params
XMsgFileDescr_ -> XMsgFileDescr <$> p "msgId" <*> p "fileDescr"
- XMsgUpdate_ -> XMsgUpdate <$> p "msgId" <*> p "content" <*> (fromMaybe M.empty <$> opt "mentions") <*> opt "ttl" <*> opt "live" <*> opt "scope"
+ XMsgUpdate_ -> do
+ msgId' <- p "msgId"
+ content <- p "content"
+ mentions <- fromMaybe M.empty <$> opt "mentions"
+ ttl <- opt "ttl"
+ live <- opt "live"
+ scope <- opt "scope"
+ pure XMsgUpdate {msgId = msgId', content, mentions, ttl, live, scope}
XMsgDel_ -> XMsgDel <$> p "msgId" <*> opt "memberId"
XMsgDeleted_ -> pure XMsgDeleted
XMsgReact_ -> XMsgReact <$> p "msgId" <*> opt "memberId" <*> p "reaction" <*> p "add"
@@ -1114,7 +1121,7 @@ appJsonToCM AppMessageJson {v, msgId, event, params} = do
XGrpDel_ -> pure XGrpDel
XGrpInfo_ -> XGrpInfo <$> p "groupProfile"
XGrpPrefs_ -> XGrpPrefs <$> p "groupPreferences"
- XGrpDirectInv_ -> XGrpDirectInv <$> p "connReq" <*> opt "content"
+ XGrpDirectInv_ -> XGrpDirectInv <$> p "connReq" <*> opt "content" <*> opt "scope"
XGrpMsgForward_ -> XGrpMsgForward <$> p "memberId" <*> p "msg" <*> p "msgTs"
XInfoProbe_ -> XInfoProbe <$> p "probe"
XInfoProbeCheck_ -> XInfoProbeCheck <$> p "probeHash"
@@ -1147,7 +1154,7 @@ chatToAppMessage ChatMessage {chatVRange, msgId, chatMsgEvent} = case encoding @
params = \case
XMsgNew container -> msgContainerJSON container
XMsgFileDescr msgId' fileDescr -> o ["msgId" .= msgId', "fileDescr" .= fileDescr]
- XMsgUpdate msgId' content mentions ttl live scope -> o $ ("ttl" .=? ttl) $ ("live" .=? live) $ ("scope" .=? scope) $ ("mentions" .=? nonEmptyMap mentions) ["msgId" .= msgId', "content" .= content]
+ XMsgUpdate {msgId = msgId', content, mentions, ttl, live, scope} -> o $ ("ttl" .=? ttl) $ ("live" .=? live) $ ("scope" .=? scope) $ ("mentions" .=? nonEmptyMap mentions) ["msgId" .= msgId', "content" .= content]
XMsgDel msgId' memberId -> o $ ("memberId" .=? memberId) ["msgId" .= msgId']
XMsgDeleted -> JM.empty
XMsgReact msgId' memberId reaction add -> o $ ("memberId" .=? memberId) ["msgId" .= msgId', "reaction" .= reaction, "add" .= add]
@@ -1178,7 +1185,7 @@ chatToAppMessage ChatMessage {chatVRange, msgId, chatMsgEvent} = case encoding @
XGrpDel -> JM.empty
XGrpInfo p -> o ["groupProfile" .= p]
XGrpPrefs p -> o ["groupPreferences" .= p]
- XGrpDirectInv connReq content -> o $ ("content" .=? content) ["connReq" .= connReq]
+ XGrpDirectInv connReq content scope -> o $ ("content" .=? content) $ ("scope" .=? scope) ["connReq" .= connReq]
XGrpMsgForward memberId msg msgTs -> o ["memberId" .= memberId, "msg" .= msg, "msgTs" .= msgTs]
XInfoProbe probe -> o ["probe" .= probe]
XInfoProbeCheck probeHash -> o ["probeHash" .= probeHash]
diff --git a/src/Simplex/Chat/Remote.hs b/src/Simplex/Chat/Remote.hs
index b71b103919..f6c94badfe 100644
--- a/src/Simplex/Chat/Remote.hs
+++ b/src/Simplex/Chat/Remote.hs
@@ -75,11 +75,11 @@ remoteFilesFolder = "simplex_v1_files"
-- when acting as host
minRemoteCtrlVersion :: AppVersion
-minRemoteCtrlVersion = AppVersion [6, 4, 0, 1]
+minRemoteCtrlVersion = AppVersion [6, 4, 0, 2]
-- when acting as controller
minRemoteHostVersion :: AppVersion
-minRemoteHostVersion = AppVersion [6, 4, 0, 1]
+minRemoteHostVersion = AppVersion [6, 4, 0, 2]
currentAppVersion :: AppVersion
currentAppVersion = AppVersion SC.version
diff --git a/src/Simplex/Chat/Store/Groups.hs b/src/Simplex/Chat/Store/Groups.hs
index 68fdb5c0be..6c66ea0e64 100644
--- a/src/Simplex/Chat/Store/Groups.hs
+++ b/src/Simplex/Chat/Store/Groups.hs
@@ -80,6 +80,7 @@ module Simplex.Chat.Store.Groups
updateGroupMemberStatus,
updateGroupMemberStatusById,
updateGroupMemberAccepted,
+ deleteGroupMemberSupportChat,
updateGroupMembersRequireAttention,
decreaseGroupMembersRequireAttention,
increaseGroupMembersRequireAttention,
@@ -1231,6 +1232,36 @@ updateGroupMemberAccepted db User {userId} m@GroupMember {groupMemberId} status
(status, role, currentTs, userId, groupMemberId)
pure m {memberStatus = status, memberRole = role, updatedAt = currentTs}
+deleteGroupMemberSupportChat :: DB.Connection -> User -> GroupInfo -> GroupMember -> IO (GroupInfo, GroupMember)
+deleteGroupMemberSupportChat db user g m@GroupMember {groupMemberId} = do
+ let requiredAttention = gmRequiresAttention m
+ currentTs <- getCurrentTime
+ DB.execute
+ db
+ [sql|
+ DELETE FROM chat_items
+ WHERE group_scope_group_member_id = ?
+ |]
+ (Only groupMemberId)
+ DB.execute
+ db
+ [sql|
+ UPDATE group_members
+ SET support_chat_ts = NULL,
+ support_chat_items_unread = 0,
+ support_chat_items_member_attention = 0,
+ support_chat_items_mentions = 0,
+ support_chat_last_msg_from_member_ts = NULL,
+ updated_at = ?
+ WHERE group_member_id = ?
+ |]
+ (currentTs, groupMemberId)
+ let m' = m {supportChat = Nothing, updatedAt = currentTs}
+ g' <- if requiredAttention
+ then decreaseGroupMembersRequireAttention db user g
+ else pure g
+ pure (g', m')
+
updateGroupMembersRequireAttention :: DB.Connection -> User -> GroupInfo -> GroupMember -> GroupMember -> IO GroupInfo
updateGroupMembersRequireAttention db user g member member'
| nowRequires && not didRequire =
diff --git a/src/Simplex/Chat/Store/Messages.hs b/src/Simplex/Chat/Store/Messages.hs
index d6affc4f12..a9bd03ed0e 100644
--- a/src/Simplex/Chat/Store/Messages.hs
+++ b/src/Simplex/Chat/Store/Messages.hs
@@ -80,6 +80,7 @@ module Simplex.Chat.Store.Messages
updateGroupChatItemsRead,
getGroupUnreadTimedItems,
updateGroupChatItemsReadList,
+ updateGroupScopeUnreadStats,
setGroupChatItemsDeleteAt,
updateLocalChatItemsRead,
getChatRefViaItemId,
@@ -2018,13 +2019,17 @@ getGroupUnreadTimedItems db User {userId} groupId =
|]
(userId, groupId, CISRcvNew)
-updateGroupChatItemsReadList :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> Maybe GroupChatScope -> NonEmpty ChatItemId -> ExceptT StoreError IO ([(ChatItemId, Int)], GroupInfo)
-updateGroupChatItemsReadList db vr user@User {userId} g@GroupInfo {groupId, membership, membersRequireAttention} scope itemIds = do
+updateGroupChatItemsReadList :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> Maybe GroupChatScopeInfo -> NonEmpty ChatItemId -> ExceptT StoreError IO ([(ChatItemId, Int)], GroupInfo)
+updateGroupChatItemsReadList db vr user@User {userId} g@GroupInfo {groupId} scopeInfo_ itemIds = do
currentTs <- liftIO getCurrentTime
-- Possible improvement is to differentiate retrieval queries for each scope,
-- but we rely on UI to not pass item IDs from incorrect scope.
readItemsData <- liftIO $ catMaybes . L.toList <$> mapM (getUpdateGroupItem currentTs) itemIds
- g' <- updateChatStats readItemsData
+ g' <- case scopeInfo_ of
+ Nothing -> pure g
+ Just scopeInfo@GCSIMemberSupport {groupMember_} -> do
+ let decStats = countReadItems groupMember_ readItemsData
+ liftIO $ updateGroupScopeUnreadStats db vr user g scopeInfo decStats
pure (timedItems readItemsData, g')
where
getUpdateGroupItem :: UTCTime -> ChatItemId -> IO (Maybe (ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt))
@@ -2038,67 +2043,58 @@ updateGroupChatItemsReadList db vr user@User {userId} g@GroupInfo {groupId, memb
RETURNING chat_item_id, timed_ttl, timed_delete_at, group_member_id, user_mention
|]
(CISRcvRead, currentTs, userId, groupId, CISRcvNew, itemId)
- updateChatStats :: [(ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt)] -> ExceptT StoreError IO GroupInfo
- updateChatStats readItemsData = case scope of
- Nothing -> pure g
- Just GCSMemberSupport {groupMemberId_} -> case groupMemberId_ of
- Nothing -> do
- membership' <- updateGMStats membership
- pure g {membership = membership'}
- Just groupMemberId -> do
- member <- getGroupMemberById db vr user groupMemberId
- member' <- updateGMStats member
- let didRequire = gmRequiresAttention member
- nowRequires = gmRequiresAttention member'
- if (not nowRequires && didRequire)
- then do
- liftIO $
- DB.execute
- db
- [sql|
- UPDATE groups
- SET members_require_attention = members_require_attention - 1
- WHERE user_id = ? AND group_id = ?
- |]
- (userId, groupId)
- pure g {membersRequireAttention = membersRequireAttention - 1}
- else
- pure g
- where
- updateGMStats GroupMember {groupMemberId} = do
- let unread = length readItemsData
- (unanswered, mentions) = decStats
- liftIO $
- DB.execute
- db
- [sql|
- UPDATE group_members
- SET support_chat_items_unread = support_chat_items_unread - ?,
- support_chat_items_member_attention = support_chat_items_member_attention - ?,
- support_chat_items_mentions = support_chat_items_mentions - ?
- WHERE group_member_id = ?
- |]
- (unread, unanswered, mentions, groupMemberId)
- getGroupMemberById db vr user groupMemberId
- where
- decStats :: (Int, Int)
- decStats = foldl' countItem (0, 0) readItemsData
- where
- countItem :: (Int, Int) -> (ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt) -> (Int, Int)
- countItem (!unanswered, !mentions) (_, _, _, itemGMId_, userMention_) =
- let unanswered' = case (groupMemberId_, itemGMId_) of
- (Just scopeGMId, Just itemGMId) | itemGMId == scopeGMId -> unanswered + 1
- _ -> unanswered
- mentions' = case userMention_ of
- Just (BI True) -> mentions + 1
- _ -> mentions
- in (unanswered', mentions')
+ countReadItems :: Maybe GroupMember -> [(ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt)] -> (Int, Int, Int)
+ countReadItems scopeMember_ readItemsData =
+ let unread = length readItemsData
+ (unanswered, mentions) = foldl' countItem (0, 0) readItemsData
+ in (unread, unanswered, mentions)
+ where
+ countItem :: (Int, Int) -> (ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt) -> (Int, Int)
+ countItem (!unanswered, !mentions) (_, _, _, itemGMId_, userMention_) =
+ let unanswered' = case (scopeMember_, itemGMId_) of
+ (Just scopeMember, Just itemGMId) | itemGMId == groupMemberId' scopeMember -> unanswered + 1
+ _ -> unanswered
+ mentions' = case userMention_ of
+ Just (BI True) -> mentions + 1
+ _ -> mentions
+ in (unanswered', mentions')
timedItems :: [(ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt)] -> [(ChatItemId, Int)]
timedItems = foldl' addTimedItem []
where
addTimedItem acc (itemId, Just ttl, Nothing, _, _) = (itemId, ttl) : acc
addTimedItem acc _ = acc
+updateGroupScopeUnreadStats :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> GroupChatScopeInfo -> (Int, Int, Int) -> IO GroupInfo
+updateGroupScopeUnreadStats db vr user g@GroupInfo {membership} scopeInfo (unread, unanswered, mentions) =
+ case scopeInfo of
+ GCSIMemberSupport {groupMember_} -> case groupMember_ of
+ Nothing -> do
+ membership' <- updateGMStats membership
+ pure g {membership = membership'}
+ Just member -> do
+ member' <- updateGMStats member
+ let didRequire = gmRequiresAttention member
+ nowRequires = gmRequiresAttention member'
+ if (not nowRequires && didRequire)
+ then decreaseGroupMembersRequireAttention db user g
+ else pure g
+ where
+ updateGMStats m@GroupMember {groupMemberId} = do
+ currentTs <- getCurrentTime
+ DB.execute
+ db
+ [sql|
+ UPDATE group_members
+ SET support_chat_items_unread = support_chat_items_unread - ?,
+ support_chat_items_member_attention = support_chat_items_member_attention - ?,
+ support_chat_items_mentions = support_chat_items_mentions - ?,
+ updated_at = ?
+ WHERE group_member_id = ?
+ |]
+ (unread, unanswered, mentions, currentTs, groupMemberId)
+ m_ <- runExceptT $ getGroupMemberById db vr user groupMemberId
+ pure $ either (const m) id m_ -- Left shouldn't happen, but types require it
+
deriving instance Show BoolInt
setGroupChatItemsDeleteAt :: DB.Connection -> User -> GroupId -> [(ChatItemId, Int)] -> UTCTime -> IO [(ChatItemId, UTCTime)]
diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt
index 44b915a8fe..b0e98856d9 100644
--- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt
+++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt
@@ -1,21 +1,3 @@
-Query:
- UPDATE groups
- SET members_require_attention = members_require_attention - 1
- WHERE user_id = ? AND group_id = ?
-
-Plan:
-SEARCH groups USING INTEGER PRIMARY KEY (rowid=?)
-
-Query:
- UPDATE group_members
- SET support_chat_items_unread = support_chat_items_unread - ?,
- support_chat_items_member_attention = support_chat_items_member_attention - ?,
- support_chat_items_mentions = support_chat_items_mentions - ?
- WHERE group_member_id = ?
-
-Plan:
-SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?)
-
Query:
UPDATE groups
SET chat_ts = ?,
@@ -1321,6 +1303,17 @@ Query:
Plan:
SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?)
+Query:
+ UPDATE group_members
+ SET support_chat_items_unread = support_chat_items_unread - ?,
+ support_chat_items_member_attention = support_chat_items_member_attention - ?,
+ support_chat_items_mentions = support_chat_items_mentions - ?,
+ updated_at = ?
+ WHERE group_member_id = ?
+
+Plan:
+SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?)
+
Query:
UPDATE group_profiles
SET display_name = ?, full_name = ?, description = ?, image = ?, preferences = ?, member_admission = ?, updated_at = ?
@@ -3482,6 +3475,21 @@ Query:
Plan:
SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?)
+Query:
+ DELETE FROM chat_items
+ WHERE group_scope_group_member_id = ?
+
+Plan:
+SEARCH chat_items USING COVERING INDEX idx_chat_items_group_scope_group_member_id (group_scope_group_member_id=?)
+SEARCH chat_item_mentions USING COVERING INDEX idx_chat_item_mentions_chat_item_id (chat_item_id=?)
+SEARCH group_snd_item_statuses USING COVERING INDEX idx_group_snd_item_statuses_chat_item_id (chat_item_id=?)
+SEARCH chat_item_versions USING COVERING INDEX idx_chat_item_versions_chat_item_id (chat_item_id=?)
+SEARCH calls USING COVERING INDEX idx_calls_chat_item_id (chat_item_id=?)
+SEARCH chat_item_messages USING COVERING INDEX sqlite_autoindex_chat_item_messages_2 (chat_item_id=?)
+SEARCH chat_items USING COVERING INDEX idx_chat_items_fwd_from_chat_item_id (fwd_from_chat_item_id=?)
+SEARCH files USING COVERING INDEX idx_files_chat_item_id (chat_item_id=?)
+SEARCH groups USING COVERING INDEX idx_groups_chat_item_id (chat_item_id=?)
+
Query:
DELETE FROM chat_items
WHERE user_id = ? AND contact_id = ? AND chat_item_id = ?
@@ -4405,6 +4413,19 @@ Query:
Plan:
SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?)
+Query:
+ UPDATE group_members
+ SET support_chat_ts = NULL,
+ support_chat_items_unread = 0,
+ support_chat_items_member_attention = 0,
+ support_chat_items_mentions = 0,
+ support_chat_last_msg_from_member_ts = NULL,
+ updated_at = ?
+ WHERE group_member_id = ?
+
+Plan:
+SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?)
+
Query:
UPDATE group_profiles
SET preferences = ?, updated_at = ?
diff --git a/src/Simplex/Chat/View.hs b/src/Simplex/Chat/View.hs
index 2e08afeaef..c13b164693 100644
--- a/src/Simplex/Chat/View.hs
+++ b/src/Simplex/Chat/View.hs
@@ -192,7 +192,7 @@ chatResponseToView hu cfg@ChatConfig {logLevel, showReactions, testView} liveIte
CRSentConfirmation u _ -> ttyUser u ["confirmation sent!"]
CRSentInvitation u _ customUserProfile -> ttyUser u $ viewSentInvitation customUserProfile testView
CRSentInvitationToContact u _c customUserProfile -> ttyUser u $ viewSentInvitation customUserProfile testView
- CRItemsReadForChat u chatId -> ttyUser u ["items read for chat"]
+ CRItemsReadForChat u _chatId -> ttyUser u ["items read for chat"]
CRContactDeleted u c -> ttyUser u [ttyContact' c <> ": contact is deleted"]
CRChatCleared u chatInfo -> ttyUser u $ viewChatCleared chatInfo
CRAcceptingContactRequest u c -> ttyUser u $ viewAcceptingContactRequest c
@@ -222,6 +222,7 @@ chatResponseToView hu cfg@ChatConfig {logLevel, showReactions, testView} liveIte
CRNetworkStatuses u statuses -> if testView then ttyUser' u $ viewNetworkStatuses statuses else []
CRJoinedGroupMember u g m -> ttyUser u $ viewJoinedGroupMember g m
CRMemberAccepted u g m -> ttyUser u $ viewMemberAccepted g m
+ CRMemberSupportChatDeleted u g m -> ttyUser u [ttyGroup' g <> ": " <> ttyMember m <> " support chat deleted"]
CRMembersRoleUser u g members r' -> ttyUser u $ viewMemberRoleUserChanged g members r'
CRMembersBlockedForAllUser u g members blocked -> ttyUser u $ viewMembersBlockedForAllUser g members blocked
CRGroupUpdated u g g' m -> ttyUser u $ viewGroupUpdated g g' m
diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs
index ea83a10cba..1cf6d0d0d6 100644
--- a/tests/ChatTests/Groups.hs
+++ b/tests/ChatTests/Groups.hs
@@ -195,7 +195,9 @@ chatGroupTests = do
describe "group scoped messages" $ do
it "should send scoped messages to support (single moderator)" testScopedSupportSingleModerator
it "should send scoped messages to support (many moderators)" testScopedSupportManyModerators
- it "should correctly maintain unread stats for support chats" testScopedSupportUnreadStats
+ it "should send messages to admins and members" testSupportCLISendCommand
+ it "should correctly maintain unread stats for support chats on reading chat items" testScopedSupportUnreadStatsOnRead
+ it "should correctly maintain unread stats for support chats on deleting chat items" testScopedSupportUnreadStatsOnDelete
testGroupCheckMessages :: HasCallStack => TestParams -> IO ()
testGroupCheckMessages =
@@ -3009,7 +3011,7 @@ testGLinkApproveMember =
alice <# "#team (support: cath) cath> proofs"
-- accept member
- alice ##> "/_accept member #1 3 member"
+ alice ##> "/accept member #team cath"
concurrentlyN_
[ alice <## "#team: cath accepted",
cath
@@ -3117,6 +3119,10 @@ testGLinkReviewMember =
(bob )
+ -- deleting support chat with pending member is prohibited
+ alice ##> "/_delete member chat #1 5"
+ alice <## "bad chat command: member is pending"
+
-- accept member
dan ##> "/_accept member #1 5 member"
concurrentlyN_
@@ -6922,6 +6928,9 @@ testScopedSupportSingleModerator =
cath ##> "/_send #1(_support:3) text 5"
cath <## "#team: you have insufficient permissions for this action, the required role is moderator"
+ alice ##> "/_delete member chat #1 2"
+ alice <## "#team: bob support chat deleted"
+
testScopedSupportManyModerators :: HasCallStack => TestParams -> IO ()
testScopedSupportManyModerators =
testChat4 aliceProfile bobProfile cathProfile danProfile $ \alice bob cath dan -> do
@@ -6980,8 +6989,29 @@ testScopedSupportManyModerators =
cath ##> "/member support chats #team"
cath <## "bob (Bob) (id 3): unread: 0, require attention: 0, mentions: 0"
-testScopedSupportUnreadStats :: HasCallStack => TestParams -> IO ()
-testScopedSupportUnreadStats =
+testSupportCLISendCommand :: HasCallStack => TestParams -> IO ()
+testSupportCLISendCommand =
+ testChat2 aliceProfile bobProfile $ \alice bob -> do
+ createGroup2' "team" alice (bob, GRObserver) True
+
+ alice #> "#team 1"
+ bob <# "#team alice> 1"
+
+ bob ##> "#team 2"
+ bob <## "#team: you don't have permission to send messages"
+ (alice )
+
+ alice #> "#team (support: bob) 3"
+ bob <# "#team (support) alice> 3"
+
+ bob #> "#team (support) 4"
+ alice <# "#team (support: bob) bob> 4"
+
+ bob ##> "#team (support 4"
+ bob <## "bad chat command: Failed reading: empty"
+
+testScopedSupportUnreadStatsOnRead :: HasCallStack => TestParams -> IO ()
+testScopedSupportUnreadStatsOnRead =
testChatOpts4 opts aliceProfile bobProfile cathProfile danProfile $ \alice bob cath dan -> do
createGroup4 "team" alice (bob, GRMember) (cath, GRMember) (dan, GRModerator)
@@ -7120,3 +7150,33 @@ testScopedSupportUnreadStats =
{ markRead = False
}
+testScopedSupportUnreadStatsOnDelete :: HasCallStack => TestParams -> IO ()
+testScopedSupportUnreadStatsOnDelete =
+ testChatOpts2 opts aliceProfile bobProfile $ \alice bob -> do
+ createGroup2 "team" alice bob
+
+ alice ##> "/set delete #team on"
+ alice <## "updated group preferences:"
+ alice <## "Full deletion: on"
+ bob <## "alice updated group #team:"
+ bob <## "updated group preferences:"
+ bob <## "Full deletion: on"
+
+ bob #> "#team (support) 1"
+ alice <# "#team (support: bob) bob> 1"
+
+ msgIdBob <- lastItemId bob
+
+ alice ##> "/member support chats #team"
+ alice <## "bob (Bob) (id 2): unread: 1, require attention: 1, mentions: 0"
+
+ bob #$> ("/_delete item #1(_support) " <> msgIdBob <> " broadcast", id, "message deleted")
+ alice <# "#team (support: bob) bob> [deleted] 1"
+
+ alice ##> "/member support chats #team"
+ alice <## "bob (Bob) (id 2): unread: 0, require attention: 0, mentions: 0"
+ where
+ opts =
+ testOpts
+ { markRead = False
+ }
diff --git a/tests/ProtocolTests.hs b/tests/ProtocolTests.hs
index a54a9dd36e..61e75d116b 100644
--- a/tests/ProtocolTests.hs
+++ b/tests/ProtocolTests.hs
@@ -292,10 +292,10 @@ decodeChatMessageTest = describe "Chat message encoding/decoding" $ do
==# XGrpDel
it "x.grp.direct.inv" $
"{\"v\":\"1\",\"event\":\"x.grp.direct.inv\",\"params\":{\"connReq\":\"simplex:/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-4%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D2-3%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D\", \"content\":{\"text\":\"hello\",\"type\":\"text\"}}}"
- #==# XGrpDirectInv testConnReq (Just $ MCText "hello")
+ #==# XGrpDirectInv testConnReq (Just $ MCText "hello") Nothing
it "x.grp.direct.inv without content" $
"{\"v\":\"1\",\"event\":\"x.grp.direct.inv\",\"params\":{\"connReq\":\"simplex:/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-4%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D2-3%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D\"}}"
- #==# XGrpDirectInv testConnReq Nothing
+ #==# XGrpDirectInv testConnReq Nothing Nothing
-- it "x.grp.msg.forward"
-- $ "{\"v\":\"1\",\"event\":\"x.grp.msg.forward\",\"params\":{\"msgForward\":{\"memberId\":\"AQIDBA==\",\"msg\":\"{\"v\":\"1\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"}}}\",\"msgTs\":\"1970-01-01T00:00:01.000000001Z\"}}}"
-- #==# XGrpMsgForward
diff --git a/website/langs/hu.json b/website/langs/hu.json
index 9dfd3d9f65..a55136d26a 100644
--- a/website/langs/hu.json
+++ b/website/langs/hu.json
@@ -31,7 +31,7 @@
"hero-overlay-2-textlink": "Hogyan működik a SimpleX?",
"hero-overlay-3-textlink": "Biztonsági felmérések",
"hero-2-header": "Privát kapcsolat létrehozása",
- "hero-2-header-desc": "A videó bemutatja, hogyan kapcsolódhat a partneréhez egy egyszer használható QR-kód segítségével, személyesen vagy videokapcsolaton keresztül. Ugyanakkor egy meghívási hivatkozás megosztásával is kapcsolódhat.",
+ "hero-2-header-desc": "A videó bemutatja, hogyan kapcsolódhat a partneréhez egy egyszer használható QR-kód segítségével, személyesen vagy videóhíváson keresztül. Ugyanakkor egy meghívási hivatkozás megosztásával is kapcsolódhat.",
"hero-overlay-1-title": "Hogyan működik a SimpleX?",
"hero-overlay-2-title": "Miért ártanak a felhasználói azonosítók az adatvédelemnek?",
"hero-overlay-3-title": "Biztonsági felmérések",
@@ -40,14 +40,14 @@
"feature-3-title": "E2E-titkosított decentralizált csoportok — csak a felhasználók tudják, hogy ezek léteznek",
"feature-4-title": "E2E-titkosított hangüzenetek",
"feature-5-title": "Eltűnő üzenetek",
- "feature-6-title": "E2E-titkosított hang- és videohívások",
+ "feature-6-title": "E2E-titkosított hang- és videóhívások",
"feature-7-title": "Hordozható titkosított alkalmazás-adattárolás — profil átköltöztetése egy másik eszközre",
"feature-8-title": "Az inkognitómód — egyedülálló a SimpleX Chatben",
"simplex-network-overlay-1-title": "Összehasonlítás más P2P-üzenetküldő protokollokkal",
"simplex-private-1-title": "2 rétegű végpontok közötti titkosítás",
"simplex-private-2-title": "További rétege a kiszolgáló-titkosítás",
- "simplex-private-4-title": "Nem kötelező hozzáférés Tor-on keresztül",
- "simplex-private-5-title": "Több rétegű tartalom kitöltés",
+ "simplex-private-4-title": "Hozzáférés Tor-hálózaton keresztül (nem kötelező)",
+ "simplex-private-5-title": "Több rétegű tartalomkitöltés",
"simplex-private-6-title": "Sávon kívüli kulcscsere",
"simplex-private-7-title": "Üzenetintegritás hitelesítés",
"simplex-private-8-title": "Üzenetek keverése a korreláció csökkentése érdekében",
@@ -59,14 +59,14 @@
"simplex-private-card-3-point-1": "A kliens és a kiszolgálók közötti kapcsolatokhoz csak az erős algoritmusokkal rendelkező TLS 1.2/1.3 protokollt használja.",
"simplex-private-card-3-point-2": "A kiszolgáló ujjlenyomata és a csatornakötés megakadályozza a MITM- és a visszajátszási támadásokat.",
"simplex-private-card-3-point-3": "Az újrakapcsolódás le van tiltva a munkamenet elleni támadások megelőzése érdekében.",
- "simplex-private-card-4-point-1": "Az IP-címe védelme érdekében a kiszolgálókat a Tor-on vagy más átvitel-átfedő-hálózaton keresztül is elérheti.",
+ "simplex-private-card-4-point-1": "Az IP-címe védelme érdekében a kiszolgálókat a Tor hálózaton vagy más átvitelátfedő hálózaton keresztül is elérheti.",
"simplex-private-card-6-point-1": "Számos kommunikációs hálózat sebezhető a kiszolgálók vagy a hálózat-szolgáltatók MITM-támadásaival szemben.",
"simplex-private-card-6-point-2": "Ennek megakadályozása érdekében a SimpleX-alkalmazások egyszeri kulcsokat adnak át sávon kívül, amikor egy címet hivatkozásként vagy QR-kódként oszt meg.",
"simplex-private-card-7-point-1": "Az integritás garantálása érdekében az üzenetek sorszámozással vannak ellátva, és tartalmazzák az előző üzenet hasítóértékét.",
"simplex-private-card-7-point-2": "Ha bármilyen üzenetet hozzáadnak, eltávolítanak vagy módosítanak, a címzett értesítést kap róla.",
"simplex-private-card-8-point-1": "A SimpleX-kiszolgálók alacsony késleltetésű keverési csomópontokként működnek — a bejövő és kimenő üzenetek sorrendje eltérő.",
"simplex-private-card-9-point-1": "Minden üzenetsorbaállítás egy irányba továbbítja az üzeneteket, a különböző küldési és vételi címekkel.",
- "simplex-private-card-9-point-2": "A hagyományos üzenetküldőkhöz képest csökkenti a támadási vektorokat és a rendelkezésre álló metaadatokat.",
+ "simplex-private-card-9-point-2": "Kevesebb támadási felülettel rendelkezik, mint a hagyományos üzenetváltó alkalmazások, és kevesebb metaadatot tesz elérhetővé.",
"simplex-private-card-10-point-1": "A SimpleX ideiglenes, névtelen, páros címeket és hitelesítő adatokat használ minden egyes felhasználói kapcsolathoz vagy csoporttaghoz.",
"simplex-private-card-10-point-2": "Lehetővé teszi az üzenetek felhasználói profilazonosítók nélküli kézbesítését, ami az alternatíváknál jobb metaadat-védelmet biztosít.",
"privacy-matters-1-overlay-1-title": "Az adatvédelemmel pénzt spórol meg",
@@ -95,7 +95,7 @@
"hero-overlay-card-2-p-3": "Még a Tor v3 szolgáltatásokat használó, legprivátabb alkalmazások esetében is, ha két különböző kapcsolattartóval beszél ugyanazon a profilon keresztül, bizonyítani tudják, hogy ugyanahhoz a személyhez kapcsolódnak.",
"hero-overlay-card-2-p-4": "A SimpleX úgy védekezik ezen támadások ellen, hogy nem tartalmaz felhasználói azonosítókat. Ha pedig használja az inkognitómódot, akkor minden egyes létrejött kapcsolatban más-más felhasználó név jelenik meg, így elkerülhető a közöttük lévő összefüggések teljes bizonyítása.",
"hero-overlay-card-3-p-1": "Trail of Bits egy vezető biztonsági és technológiai tanácsadó cég, amelynek az ügyfelei közé tartoznak nagy technológiai cégek, kormányzati ügynökségek és jelentős blokklánc projektek.",
- "hero-overlay-card-3-p-2": "A Trail of Bits 2022 novemberében áttekintette a SimpleX-platform kriptográfiai és hálózati komponenseit. További információk.",
+ "hero-overlay-card-3-p-2": "A Trail of Bits 2022 novemberében auditálta a SimpleX-platform kriptográfiai és hálózati komponenseit. További információk.",
"simplex-network-overlay-card-1-li-1": "A P2P-hálózatok az üzenetek továbbítására a DHT valamelyik változatát használják. A DHT kialakításakor egyensúlyt kell teremteni a kézbesítési garancia és a késleltetés között. A SimpleX jobb kézbesítési garanciával és alacsonyabb késleltetéssel rendelkezik, mint a P2P, mivel az üzenet redundánsan, a címzett által kiválasztott kiszolgálók segítségével több kiszolgálón keresztül párhuzamosan továbbítható. A P2P-hálózatokban az üzenet O(log N) csomóponton halad át szekvenciálisan, az algoritmus által kiválasztott csomópontok segítségével.",
"simplex-network-overlay-card-1-li-2": "A SimpleX kialakítása a legtöbb P2P-hálózattól eltérően nem rendelkezik semmiféle globális felhasználói azonosítóval, még ideiglenessel sem, és csak az üzenetekhez használ ideiglenes, páros azonosítókat, ami jobb névtelenséget és metaadatvédelmet biztosít.",
"simplex-network-overlay-card-1-li-3": "A P2P nem oldja meg a MITM-támadás problémát, és a legtöbb létező implementáció nem használ sávon kívüli üzeneteket a kezdeti kulcscseréhez. A SimpleX a kezdeti kulcscseréhez sávon kívüli üzeneteket, vagy bizonyos esetekben már meglévő biztonságos és megbízható kapcsolatokat használ.",
@@ -139,7 +139,7 @@
"sign-up-to-receive-our-updates": "Regisztráljon a hírleveleinkre, hogy ne maradjon le semmiről",
"enter-your-email-address": "Adja meg az e-mail-címét",
"get-simplex": "A SimpleX számítógépes alkalmazásának letöltése",
- "why-simplex-is-unique": "Mitől egyedülálló a SimpleX",
+ "why-simplex-is-unique": "A SimpleX mitől egyedülálló",
"learn-more": "Tudjon meg többet",
"more-info": "További információ",
"hide-info": "Információ elrejtése",
@@ -164,7 +164,7 @@
"simplex-chat-for-the-terminal": "SimpleX Chat a terminálhoz",
"copy-the-command-below-text": "másolja be az alábbi parancsot, és használja a csevegésben:",
"privacy-matters-section-header": "Miért számít az adatvédelem",
- "privacy-matters-section-subheader": "A metaadatok védelmének megőrzése — kivel beszélget — megvédi a következőktől:",
+ "privacy-matters-section-subheader": "A metaadatok — pédául, hogy kivel beszélget — védelmének megőrzése biztonságot nyújt a következők ellen:",
"privacy-matters-section-label": "Győződjön meg arról, hogy az üzenetváltó-alkalmazás amit használ nem fér hozzá az adataihoz!",
"simplex-private-section-header": "Mitől lesz a SimpleX privát",
"simplex-network-section-header": "SimpleX-hálózat",
@@ -202,7 +202,7 @@
"guide-dropdown-3": "Titkos csoportok",
"guide-dropdown-4": "Csevegési profilok",
"guide-dropdown-5": "Adatkezelés",
- "guide-dropdown-6": "Hang- és videó hívások",
+ "guide-dropdown-6": "Hang- és videóhívások",
"guide-dropdown-7": "Adatvédelem és biztonság",
"guide-dropdown-8": "Alkalmazás beállításai",
"guide": "Útmutató",
@@ -223,8 +223,8 @@
"contact-hero-header": "Kapott egy meghívót a SimpleX Chaten való beszélgetéshez",
"invitation-hero-header": "Kapott egy egyszer használható meghívót a SimpleX Chaten való beszélgetéshez",
"simplex-network-overlay-card-1-li-4": "A P2P-megvalósításokat egyes internetszolgáltatók blokkolhatják (mint például a BitTorrent). A SimpleX átvitel-független — a szabványos webes protokollokon, például WebSocketsen keresztül is működik.",
- "simplex-private-card-4-point-2": "A SimpleX Tor-on keresztüli használatához telepítse az Orbot alkalmazást és engedélyezze a SOCKS5 proxyt (vagy a VPN-t az iOS-ban).",
- "simplex-private-card-5-point-1": "A SimpleX minden titkosítási réteghez tartalomkitöltést használ, hogy meghiúsítsa az üzenetméret ellen irányuló támadásokat.",
+ "simplex-private-card-4-point-2": "A SimpleX, Tor-hálózaton keresztüli használatához telepítse az Orbot alkalmazást és engedélyezze a SOCKS5 proxyt (vagy a VPN-t az iOS-ban).",
+ "simplex-private-card-5-point-1": "A SimpleX minden titkosítási réteghez tartalomkitöltést használ az üzenetméretre irányuló támadások meghiúsítása érdekében.",
"simplex-private-card-5-point-2": "A kiszolgálók és a hálózatot megfigyelők számára a különböző méretű üzenetek egyformának tűnnek.",
"privacy-matters-1-title": "Hirdetés és árdiszkrimináció",
"hero-overlay-card-1-p-3": "Ön határozza meg, hogy melyik kiszolgáló(ka)t használja az üzenetek fogadására, a kapcsolatokhoz — azokat a kiszolgálókat, amelyeket az üzenetek küldésére használ. Minden beszélgetés két különböző kiszolgálót használ.",
@@ -232,7 +232,7 @@
"chat-bot-example": "Példa csevegési botra",
"simplex-private-3-title": "Biztonságos, hitelesített TLS adatátvitel",
"github-repository": "GitHub tárolójában",
- "tap-to-close": "Koppintson a bezáráshoz",
+ "tap-to-close": "Bezárás",
"simplex-network-1-header": "A P2P-hálózatokkal ellentétben",
"simplex-network-1-overlay-linktext": "a P2P-hálózatok problémái",
"comparison-point-3-text": "Függés a DNS-től",
@@ -254,6 +254,6 @@
"simplex-chat-via-f-droid": "SimpleX Chat az F-Droidon keresztül",
"simplex-chat-repo": "A SimpleX Chat tárolója",
"stable-and-beta-versions-built-by-developers": "A fejlesztők által készített stabil és béta verziók",
- "hero-overlay-card-3-p-3": "A Trail of Bits 2024 júliusában felülvizsgálta a SimpleX hálózati protokollok kriptográfiai felépítését. Tudjon meg többet.",
+ "hero-overlay-card-3-p-3": "A Trail of Bits 2024 júliusában ismét auditálta a SimpleX-protokollok kriptográfiai és hálózati komponenseit. További információk.",
"docs-dropdown-14": "SimpleX üzleti célra"
-}
+}
\ No newline at end of file
diff --git a/website/langs/ru.json b/website/langs/ru.json
index 335b19ab11..7f8e191ccd 100644
--- a/website/langs/ru.json
+++ b/website/langs/ru.json
@@ -149,7 +149,7 @@
"back-to-top": "Вернуться к началу",
"simplex-network-1-desc": "Все сообщения отправляются через серверы, что обеспечивает лучшую конфиденциальность метаданных и надежную асинхронную доставку сообщений, избегая при этом многих",
"simplex-chat-repo": "Репозиторий SimpleX Chat",
- "simplex-private-card-6-point-1": "Многие коммуникационные платформы уязвимы для MITM-атак со стороны серверов или сетевых провайдеров.",
+ "simplex-private-card-6-point-1": "Многие коммуникационные сети уязвимы для MITM-атак со стороны серверов или сетевых провайдеров.",
"privacy-matters-3-overlay-1-linkText": "Конфиденциальность защищает Вашу свободу",
"simplex-unique-overlay-card-1-p-2": "Для доставки сообщений SimpleX использует попарные, анонимные адреса однонаправленных очередей сообщений, раздельные для полученных и отправленных сообщений, обычно через разные серверы.",
"simplex-unique-overlay-card-3-p-4": "Со стороны не видно разницы между отправлением или получением сообщений — если кто-то наблюдает за этим, он не cможет легко определить, кто с кем общается, даже если протокол TLS будет скомпрометирован.",