Compare commits

..

1 Commits

Author SHA1 Message Date
Levitating Pineapple 00905ad790 ios: update profile edit sheet design 2024-09-12 14:31:27 +03:00
101 changed files with 2272 additions and 5230 deletions
+69 -122
View File
@@ -357,12 +357,6 @@ func apiGetChatItemInfo(type: ChatType, id: Int64, itemId: Int64) async throws -
throw r
}
func apiPlanForwardChatItems(type: ChatType, id: Int64, itemIds: [Int64]) async throws -> ([Int64], ForwardConfirmation?) {
let r = await chatSendCmd(.apiPlanForwardChatItems(toChatType: type, toChatId: id, itemIds: itemIds))
if case let .forwardPlan(_, chatItemIds, forwardConfimation) = r { return (chatItemIds, forwardConfimation) }
throw r
}
func apiForwardChatItems(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemIds: [Int64], ttl: Int?) async -> [ChatItem]? {
let cmd: ChatCommand = .apiForwardChatItems(toChatType: toChatType, toChatId: toChatId, fromChatType: fromChatType, fromChatId: fromChatId, itemIds: itemIds, ttl: ttl)
return await processSendMessageCmd(toChatType: toChatType, cmd: cmd)
@@ -1045,122 +1039,77 @@ func standaloneFileInfo(url: String, ctrl: chat_ctrl? = nil) async -> MigrationF
}
func receiveFile(user: any UserLike, fileId: Int64, userApprovedRelays: Bool = false, auto: Bool = false) async {
await receiveFiles(
user: user,
fileIds: [fileId],
userApprovedRelays: userApprovedRelays,
if let chatItem = await apiReceiveFile(
fileId: fileId,
userApprovedRelays: userApprovedRelays || !privacyAskToApproveRelaysGroupDefault.get(),
encrypted: privacyEncryptLocalFilesGroupDefault.get(),
auto: auto
)
) {
await chatItemSimpleUpdate(user, chatItem)
}
}
func receiveFiles(user: any UserLike, fileIds: [Int64], userApprovedRelays: Bool = false, auto: Bool = false) async {
var fileIdsToApprove = [Int64]()
var srvsToApprove = Set<String>()
var otherFileErrs = [ChatResponse]()
for fileId in fileIds {
let r = await chatSendCmd(
.receiveFile(
fileId: fileId,
userApprovedRelays: userApprovedRelays || !privacyAskToApproveRelaysGroupDefault.get(),
encrypted: privacyEncryptLocalFilesGroupDefault.get(),
inline: nil
func apiReceiveFile(fileId: Int64, userApprovedRelays: Bool, encrypted: Bool, inline: Bool? = nil, auto: Bool = false) async -> AChatItem? {
let r = await chatSendCmd(.receiveFile(fileId: fileId, userApprovedRelays: userApprovedRelays, encrypted: encrypted, inline: inline))
let am = AlertManager.shared
if case let .rcvFileAccepted(_, chatItem) = r { return chatItem }
if case .rcvFileAcceptedSndCancelled = r {
logger.debug("apiReceiveFile error: sender cancelled file transfer")
if !auto {
am.showAlertMsg(
title: "Cannot receive file",
message: "Sender cancelled file transfer."
)
)
switch r {
case let .rcvFileAccepted(_, chatItem):
await chatItemSimpleUpdate(user, chatItem)
default:
if let chatError = chatError(r) {
switch chatError {
case let .fileNotApproved(fileId, unknownServers):
fileIdsToApprove.append(fileId)
srvsToApprove.formUnion(unknownServers)
default:
otherFileErrs.append(r)
}
}
}
}
if !auto {
let otherErrsStr = if otherFileErrs.isEmpty {
""
} else if otherFileErrs.count == 1 {
"\(otherFileErrs[0])"
} else if otherFileErrs.count == 2 {
"\(otherFileErrs[0])\n\(otherFileErrs[1])"
} else {
"\(otherFileErrs[0])\n\(otherFileErrs[1])\nand \(otherFileErrs.count - 2) other error(s)"
} else if let networkErrorAlert = networkErrorAlert(r) {
logger.error("apiReceiveFile network error: \(String(describing: r))")
if !auto {
am.showAlert(networkErrorAlert)
}
// If there are not approved files, alert is shown the same way both in case of singular and plural files reception
if !fileIdsToApprove.isEmpty {
let srvs = srvsToApprove
.map { s in
} else {
switch chatError(r) {
case .fileCancelled:
logger.debug("apiReceiveFile ignoring fileCancelled error")
case .fileAlreadyReceiving:
logger.debug("apiReceiveFile ignoring fileAlreadyReceiving error")
case let .fileNotApproved(fileId, unknownServers):
logger.debug("apiReceiveFile fileNotApproved error")
if !auto {
let srvs = unknownServers.map { s in
if let srv = parseServerAddress(s), !srv.hostnames.isEmpty {
srv.hostnames[0]
} else {
serverHost(s)
}
}
.sorted()
.joined(separator: ", ")
let fIds = fileIdsToApprove
await MainActor.run {
showAlert(
title: NSLocalizedString("Unknown servers!", comment: "alert title"),
message: (
NSLocalizedString("Without Tor or VPN, your IP address will be visible to these XFTP relays: \(srvs).", comment: "alert message") +
(otherErrsStr != "" ? "\n\n" + NSLocalizedString("Other file errors:\n\(otherErrsStr)", comment: "alert message") : "")
),
buttonTitle: NSLocalizedString("Download", comment: "alert button"),
buttonAction: {
Task {
logger.debug("apiReceiveFile fileNotApproved alert - in Task")
if let user = ChatModel.shared.currentUser {
await receiveFiles(user: user, fileIds: fIds, userApprovedRelays: true)
am.showAlert(Alert(
title: Text("Unknown servers!"),
message: Text("Without Tor or VPN, your IP address will be visible to these XFTP relays: \(srvs.sorted().joined(separator: ", "))."),
primaryButton: .default(
Text("Download"),
action: {
Task {
logger.debug("apiReceiveFile fileNotApproved alert - in Task")
if let user = ChatModel.shared.currentUser {
await receiveFile(user: user, fileId: fileId, userApprovedRelays: true)
}
}
}
},
cancelButton: true
)
),
secondaryButton: .cancel()
))
}
} else if otherFileErrs.count == 1 { // If there is a single other error, we differentiate on it
let errorResponse = otherFileErrs.first!
switch errorResponse {
case let .rcvFileAcceptedSndCancelled(_, rcvFileTransfer):
logger.debug("receiveFiles error: sender cancelled file transfer \(rcvFileTransfer.fileId)")
await MainActor.run {
showAlert(
NSLocalizedString("Cannot receive file", comment: "alert title"),
message: NSLocalizedString("Sender cancelled file transfer.", comment: "alert message")
)
}
default:
if let chatError = chatError(errorResponse) {
switch chatError {
case .fileCancelled, .fileAlreadyReceiving:
logger.debug("receiveFiles ignoring FileCancelled or FileAlreadyReceiving error")
default:
await MainActor.run {
showAlert(
NSLocalizedString("Error receiving file", comment: "alert title"),
message: responseError(errorResponse)
)
}
}
}
}
} else if otherFileErrs.count > 1 { // If there are multiple other errors, we show general alert
await MainActor.run {
showAlert(
NSLocalizedString("Error receiving file", comment: "alert title"),
message: NSLocalizedString("File errors:\n\(otherErrsStr)", comment: "alert message")
default:
logger.error("apiReceiveFile error: \(String(describing: r))")
if !auto {
am.showAlertMsg(
title: "Error receiving file",
message: "Error: \(responseError(r))"
)
}
}
}
return nil
}
func cancelFile(user: User, fileId: Int64) async {
@@ -1872,25 +1821,23 @@ func processReceivedMsg(_ res: ChatResponse) async {
NtfManager.shared.notifyMessageReceived(user, cInfo, cItem)
}
}
case let .chatItemsStatusesUpdated(user, chatItems):
for chatItem in chatItems {
let cInfo = chatItem.chatInfo
let cItem = chatItem.chatItem
if !cItem.isDeletedContent && active(user) {
await MainActor.run { m.updateChatItem(cInfo, cItem, status: cItem.meta.itemStatus) }
}
if let endTask = m.messageDelivery[cItem.id] {
switch cItem.meta.itemStatus {
case .sndNew: ()
case .sndSent: endTask()
case .sndRcvd: endTask()
case .sndErrorAuth: endTask()
case .sndError: endTask()
case .sndWarning: endTask()
case .rcvNew: ()
case .rcvRead: ()
case .invalid: ()
}
case let .chatItemStatusUpdated(user, aChatItem):
let cInfo = aChatItem.chatInfo
let cItem = aChatItem.chatItem
if !cItem.isDeletedContent && active(user) {
await MainActor.run { m.updateChatItem(cInfo, cItem, status: cItem.meta.itemStatus) }
}
if let endTask = m.messageDelivery[cItem.id] {
switch cItem.meta.itemStatus {
case .sndNew: ()
case .sndSent: endTask()
case .sndRcvd: endTask()
case .sndErrorAuth: endTask()
case .sndError: endTask()
case .sndWarning: endTask()
case .rcvNew: ()
case .rcvRead: ()
case .invalid: ()
}
}
case let .chatItemUpdated(user, aChatItem):
@@ -214,12 +214,10 @@ struct ActiveCallView: View {
ChatReceiver.shared.messagesChannel = nil
return
}
if case let .chatItemsStatusesUpdated(_, chatItems) = msg,
chatItems.contains(where: { ci in
ci.chatInfo.id == call.contact.id &&
ci.chatItem.content.isSndCall &&
ci.chatItem.meta.itemStatus.isSndRcvd
}) {
if case let .chatItemStatusUpdated(_, msg) = msg,
msg.chatInfo.id == call.contact.id,
case .sndCall = msg.chatItem.content,
case .sndRcvd = msg.chatItem.meta.itemStatus {
CallSoundsPlayer.shared.startInCallSound()
ChatReceiver.shared.messagesChannel = nil
}
@@ -14,7 +14,7 @@ struct ChatItemForwardingView: View {
@EnvironmentObject var theme: AppTheme
@Environment(\.dismiss) var dismiss
var chatItems: [ChatItem]
var ci: ChatItem
var fromChatInfo: ChatInfo
@Binding var composeState: ComposeState
@@ -73,14 +73,11 @@ struct ChatItemForwardingView: View {
}
@ViewBuilder private func forwardListChatView(_ chat: Chat) -> some View {
let prohibited = chatItems.map { ci in
chat.prohibitedByPref(
hasSimplexLink: hasSimplexLink(ci.content.msgContent?.text),
isMediaOrFileAttachment: ci.content.msgContent?.isMediaOrFileAttachment ?? false,
isVoice: ci.content.msgContent?.isVoice ?? false
)
}.contains(true)
let prohibited = chat.prohibitedByPref(
hasSimplexLink: hasSimplexLink(ci.content.msgContent?.text),
isMediaOrFileAttachment: ci.content.msgContent?.isMediaOrFileAttachment ?? false,
isVoice: ci.content.msgContent?.isVoice ?? false
)
Button {
if prohibited {
alert = SomeAlert(
@@ -96,10 +93,10 @@ struct ChatItemForwardingView: View {
composeState = ComposeState(
message: composeState.message,
preview: composeState.linkPreview != nil ? composeState.preview : .noPreview,
contextItem: .forwardingItems(chatItems: chatItems, fromChatInfo: fromChatInfo)
contextItem: .forwardingItem(chatItem: ci, fromChatInfo: fromChatInfo)
)
} else {
composeState = ComposeState.init(forwardingItems: chatItems, fromChatInfo: fromChatInfo)
composeState = ComposeState.init(forwardingItem: ci, fromChatInfo: fromChatInfo)
ItemsModel.shared.loadOpenChat(chat.id)
}
}
@@ -126,7 +123,7 @@ struct ChatItemForwardingView: View {
#Preview {
ChatItemForwardingView(
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello")],
ci: ChatItem.getSample(1, .directSnd, .now, "hello"),
fromChatInfo: .direct(contact: Contact.sampleData),
composeState: Binding.constant(ComposeState(message: "hello"))
).environmentObject(CurrentColors.toAppTheme())
+10 -148
View File
@@ -42,7 +42,6 @@ struct ChatView: View {
@State private var showGroupLinkSheet: Bool = false
@State private var groupLink: String?
@State private var groupLinkMemberRole: GroupMemberRole = .member
@State private var forwardedChatItems: [ChatItem] = []
@State private var selectedChatItems: Set<Int64>? = nil
@State private var showDeleteSelectedMessages: Bool = false
@State private var allowToDeleteSelectedMessagesForAll: Bool = false
@@ -99,8 +98,7 @@ struct ChatView: View {
if case let .group(groupInfo) = chat.chatInfo {
showModerateSelectedMessagesAlert(groupInfo)
}
},
forwardItems: forwardSelectedMessages
}
)
}
}
@@ -137,22 +135,6 @@ struct ChatView: View {
}
}
}
.sheet(isPresented: Binding(
get: { !forwardedChatItems.isEmpty },
set: { isPresented in
if !isPresented {
forwardedChatItems = []
selectedChatItems = nil
}
}
)) {
if #available(iOS 16.0, *) {
ChatItemForwardingView(chatItems: forwardedChatItems, fromChatInfo: chat.chatInfo, composeState: $composeState)
.presentationDetents([.fraction(0.8)])
} else {
ChatItemForwardingView(chatItems: forwardedChatItems, fromChatInfo: chat.chatInfo, composeState: $composeState)
}
}
.onAppear {
selectedChatItems = nil
initChatView()
@@ -429,8 +411,7 @@ struct ChatView: View {
composeState: $composeState,
selectedMember: $selectedMember,
revealedChatItem: $revealedChatItem,
selectedChatItems: $selectedChatItems,
forwardedChatItems: $forwardedChatItems
selectedChatItems: $selectedChatItems
)
.id(ci.id) // Required to trigger `onAppear` on iOS15
} loadPage: {
@@ -720,116 +701,6 @@ struct ChatView: View {
}
}
private func forwardSelectedMessages() {
Task {
do {
if let selectedChatItems {
let (validItems, confirmation) = try await apiPlanForwardChatItems(
type: chat.chatInfo.chatType,
id: chat.chatInfo.apiId,
itemIds: Array(selectedChatItems)
)
if let confirmation {
if validItems.count > 0 {
showAlert(
String.localizedStringWithFormat(
NSLocalizedString("Forward %d message(s)?", comment: "alert title"),
validItems.count
),
message: forwardConfirmationText(confirmation) + "\n" +
NSLocalizedString("Forward messages without files?", comment: "alert message")
) {
switch confirmation {
case let .filesNotAccepted(fileIds):
[forwardAction(validItems), downloadAction(fileIds), cancelAlertAction]
default:
[forwardAction(validItems), cancelAlertAction]
}
}
} else {
showAlert(
NSLocalizedString("Nothing to forward!", comment: "alert title"),
message: forwardConfirmationText(confirmation)
) {
switch confirmation {
case let .filesNotAccepted(fileIds):
[downloadAction(fileIds), cancelAlertAction]
default:
[okAlertAction]
}
}
}
} else {
await openForwardingSheet(validItems)
}
}
} catch {
logger.error("Plan forward chat items failed: \(error.localizedDescription)")
}
}
func forwardConfirmationText(_ fc: ForwardConfirmation) -> String {
switch fc {
case let .filesNotAccepted(fileIds):
String.localizedStringWithFormat(
NSLocalizedString("%d file(s) were not downloaded.", comment: "forward confirmation reason"),
fileIds.count
)
case let .filesInProgress(filesCount):
String.localizedStringWithFormat(
NSLocalizedString("%d file(s) are still being downloaded.", comment: "forward confirmation reason"),
filesCount
)
case let .filesMissing(filesCount):
String.localizedStringWithFormat(
NSLocalizedString("%d file(s) were deleted.", comment: "forward confirmation reason"),
filesCount
)
case let .filesFailed(filesCount):
String.localizedStringWithFormat(
NSLocalizedString("%d file(s) failed to download.", comment: "forward confirmation reason"),
filesCount
)
}
}
func forwardAction(_ items: [Int64]) -> UIAlertAction {
UIAlertAction(
title: NSLocalizedString("Forward messages", comment: "alert action"),
style: .default,
handler: { _ in Task { await openForwardingSheet(items) } }
)
}
func downloadAction(_ fileIds: [Int64]) -> UIAlertAction {
UIAlertAction(
title: NSLocalizedString("Download files", comment: "alert action"),
style: .default,
handler: { _ in
Task {
if let user = ChatModel.shared.currentUser {
await receiveFiles(user: user, fileIds: fileIds)
}
}
}
)
}
func openForwardingSheet(_ items: [Int64]) async {
let im = ItemsModel.shared
var items = Set(items)
var fci = [ChatItem]()
for reversedChatItem in im.reversedChatItems {
if items.contains(reversedChatItem.id) {
items.remove(reversedChatItem.id)
fci.insert(reversedChatItem, at: 0)
}
if items.isEmpty { break }
}
await MainActor.run { forwardedChatItems = fci }
}
}
private func loadChatItems(_ cInfo: ChatInfo) {
Task {
if loadingItems || firstPage { return }
@@ -891,11 +762,10 @@ struct ChatView: View {
@State private var showDeleteMessages = false
@State private var showChatItemInfoSheet: Bool = false
@State private var chatItemInfo: ChatItemInfo?
@State private var showTranslationSheet: Bool = false
@State private var showForwardingSheet: Bool = false
@State private var msgWidth: CGFloat = 0
@Binding var selectedChatItems: Set<Int64>?
@Binding var forwardedChatItems: [ChatItem]
@State private var allowMenu: Bool = true
@State private var markedRead = false
@@ -1209,9 +1079,12 @@ struct ChatView: View {
}) {
ChatItemInfoView(ci: ci, chatItemInfo: $chatItemInfo)
}
.sheet(isPresented: $showTranslationSheet) {
if #available(iOS 18.0, *) {
TranslateView(source: ci.text).presentationDetents([.medium, .large])
.sheet(isPresented: $showForwardingSheet) {
if #available(iOS 16.0, *) {
ChatItemForwardingView(ci: ci, fromChatInfo: chat.chatInfo, composeState: $composeState)
.presentationDetents([.fraction(0.8)])
} else {
ChatItemForwardingView(ci: ci, fromChatInfo: chat.chatInfo, composeState: $composeState)
}
}
}
@@ -1270,9 +1143,6 @@ struct ChatView: View {
shareButton(ci)
copyButton(ci)
}
if #available(iOS 18.0, *) {
if !ci.text.isEmpty { translateButton(ci) }
}
if let fileSource = fileSource, fileExists {
if case .image = ci.content.msgContent, let image = getLoadedImage(ci.file) {
if image.imageData != nil {
@@ -1357,7 +1227,7 @@ struct ChatView: View {
var forwardButton: Button<some View> {
Button {
forwardedChatItems = [chatItem]
showForwardingSheet = true
} label: {
Label(
NSLocalizedString("Forward", comment: "chat item action"),
@@ -1457,14 +1327,6 @@ struct ChatView: View {
}
}
private func translateButton(_ ci: ChatItem) -> Button<some View> {
Button {
showTranslationSheet = true
} label: {
Label("Translate", systemImage: "globe")
}
}
func saveButton(image: UIImage) -> Button<some View> {
Button {
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
@@ -23,7 +23,7 @@ enum ComposeContextItem {
case noContextItem
case quotedItem(chatItem: ChatItem)
case editingItem(chatItem: ChatItem)
case forwardingItems(chatItems: [ChatItem], fromChatInfo: ChatInfo)
case forwardingItem(chatItem: ChatItem, fromChatInfo: ChatInfo)
}
enum VoiceMessageRecordingState {
@@ -73,10 +73,10 @@ struct ComposeState {
}
}
init(forwardingItems: [ChatItem], fromChatInfo: ChatInfo) {
init(forwardingItem: ChatItem, fromChatInfo: ChatInfo) {
self.message = ""
self.preview = .noPreview
self.contextItem = .forwardingItems(chatItems: forwardingItems, fromChatInfo: fromChatInfo)
self.contextItem = .forwardingItem(chatItem: forwardingItem, fromChatInfo: fromChatInfo)
self.voiceMessageRecordingState = .noRecording
}
@@ -112,7 +112,7 @@ struct ComposeState {
var forwarding: Bool {
switch contextItem {
case .forwardingItems: return true
case .forwardingItem: return true
default: return false
}
}
@@ -167,13 +167,6 @@ struct ComposeState {
}
}
var manyMediaPreviews: Bool {
switch preview {
case let .mediaPreviews(mediaPreviews): return mediaPreviews.count > 1
default: return false
}
}
var attachmentDisabled: Bool {
if editing || forwarding || liveMessage != nil || inProgress { return true }
switch preview {
@@ -694,7 +687,7 @@ struct ComposeView: View {
case let .quotedItem(chatItem: quotedItem):
ContextItemView(
chat: chat,
contextItems: [quotedItem],
contextItem: quotedItem,
contextIcon: "arrowshape.turn.up.left",
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) }
)
@@ -702,17 +695,18 @@ struct ComposeView: View {
case let .editingItem(chatItem: editingItem):
ContextItemView(
chat: chat,
contextItems: [editingItem],
contextItem: editingItem,
contextIcon: "pencil",
cancelContextItem: { clearState() }
)
Divider()
case let .forwardingItems(chatItems, _):
case let .forwardingItem(chatItem: forwardedItem, _):
ContextItemView(
chat: chat,
contextItems: chatItems,
contextItem: forwardedItem,
contextIcon: "arrowshape.turn.up.forward",
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) }
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) },
showSender: false
)
Divider()
}
@@ -736,11 +730,10 @@ struct ComposeView: View {
}
if chat.chatInfo.contact?.nextSendGrpInv ?? false {
await sendMemberContactInvitation()
} else if case let .forwardingItems(chatItems, fromChatInfo) = composeState.contextItem {
// Composed text is send as a reply to the last forwarded item
sent = await forwardItems(chatItems, fromChatInfo, ttl).last
} else if case let .forwardingItem(ci, fromChatInfo) = composeState.contextItem {
sent = await forwardItem(ci, fromChatInfo, ttl)
if !composeState.message.isEmpty {
_ = await send(checkLinkPreview(), quoted: sent?.id, live: false, ttl: ttl)
sent = await send(checkLinkPreview(), quoted: sent?.id, live: false, ttl: ttl)
}
} else if case let .editingItem(ci) = composeState.contextItem {
sent = await updateMessage(ci, live: live)
@@ -757,28 +750,27 @@ struct ComposeView: View {
sent = await send(.text(msgText), quoted: quoted, live: live, ttl: ttl)
case .linkPreview:
sent = await send(checkLinkPreview(), quoted: quoted, live: live, ttl: ttl)
case let .mediaPreviews(media):
case let .mediaPreviews(mediaPreviews: media):
// TODO batch send: batch media previews
let last = media.count - 1
var msgs: [ComposedMessage] = []
if last >= 0 {
for i in 0..<last {
if i > 0 {
// Sleep to allow `progressByTimeout` update be rendered
try? await Task.sleep(nanoseconds: 100_000000)
}
if let (fileSource, msgContent) = mediaContent(media[i], text: "") {
msgs.append(ComposedMessage(fileSource: fileSource, msgContent: msgContent))
if case (_, .video(_, _, _)) = media[i] {
sent = await sendVideo(media[i], ttl: ttl)
} else {
sent = await sendImage(media[i], ttl: ttl)
}
_ = try? await Task.sleep(nanoseconds: 100_000000)
}
if let (fileSource, msgContent) = mediaContent(media[last], text: msgText) {
msgs.append(ComposedMessage(fileSource: fileSource, quotedItemId: quoted, msgContent: msgContent))
if case (_, .video(_, _, _)) = media[last] {
sent = await sendVideo(media[last], text: msgText, quoted: quoted, live: live, ttl: ttl)
} else {
sent = await sendImage(media[last], text: msgText, quoted: quoted, live: live, ttl: ttl)
}
}
if msgs.isEmpty {
msgs = [ComposedMessage(quotedItemId: quoted, msgContent: .text(msgText))]
if sent == nil {
sent = await send(.text(msgText), quoted: quoted, live: live, ttl: ttl)
}
sent = await send(msgs, live: live, ttl: ttl).last
case let .voicePreview(recordingFileName, duration):
stopPlayback.toggle()
let file = voiceCryptoFile(recordingFileName)
@@ -800,20 +792,6 @@ struct ComposeView: View {
}
return sent
func mediaContent(_ media: (String, UploadContent?), text: String) -> (CryptoFile?, MsgContent)? {
let (previewImage, uploadContent) = media
return switch uploadContent {
case let .simpleImage(image):
(saveImage(image), .image(text: text, image: previewImage))
case let .animatedImage(image):
(saveAnimImage(image), .image(text: text, image: previewImage))
case let .video(_, url, duration):
(moveTempFileFromURL(url), .video(text: text, image: previewImage, duration: duration))
case .none:
nil
}
}
func sending() async {
await MainActor.run { composeState.inProgress = true }
}
@@ -877,6 +855,23 @@ struct ComposeView: View {
}
}
func sendImage(_ imageData: (String, UploadContent?), text: String = "", quoted: Int64? = nil, live: Bool = false, ttl: Int?) async -> ChatItem? {
let (image, data) = imageData
if let data = data, let savedFile = saveAnyImage(data) {
return await send(.image(text: text, image: image), quoted: quoted, file: savedFile, live: live, ttl: ttl)
}
return nil
}
func sendVideo(_ imageData: (String, UploadContent?), text: String = "", quoted: Int64? = nil, live: Bool = false, ttl: Int?) async -> ChatItem? {
let (image, data) = imageData
if case let .video(_, url, duration) = data, let savedFile = moveTempFileFromURL(url) {
ChatModel.shared.filesToDelete.remove(url)
return await send(.video(text: text, image: image, duration: duration), quoted: quoted, file: savedFile, live: live, ttl: ttl)
}
return nil
}
func voiceCryptoFile(_ fileName: String) -> CryptoFile? {
if !privacyEncryptLocalFilesGroupDefault.get() {
return CryptoFile.plain(fileName)
@@ -893,22 +888,17 @@ struct ComposeView: View {
}
func send(_ mc: MsgContent, quoted: Int64?, file: CryptoFile? = nil, live: Bool = false, ttl: Int?) async -> ChatItem? {
await send(
[ComposedMessage(fileSource: file, quotedItemId: quoted, msgContent: mc)],
live: live,
ttl: ttl
).first
}
func send(_ msgs: [ComposedMessage], live: Bool, ttl: Int?) async -> [ChatItem] {
if let chatItems = chat.chatInfo.chatType == .local
? await apiCreateChatItems(noteFolderId: chat.chatInfo.apiId, composedMessages: msgs)
? await apiCreateChatItems(
noteFolderId: chat.chatInfo.apiId,
composedMessages: [ComposedMessage(fileSource: file, msgContent: mc)]
)
: await apiSendMessages(
type: chat.chatInfo.chatType,
id: chat.chatInfo.apiId,
live: live,
ttl: ttl,
composedMessages: msgs
composedMessages: [ComposedMessage(fileSource: file, quotedItemId: quoted, msgContent: mc)]
) {
await MainActor.run {
chatModel.removeLiveDummy(animated: false)
@@ -916,43 +906,33 @@ struct ComposeView: View {
chatModel.addChatItem(chat.chatInfo, chatItem)
}
}
return chatItems
// UI only supports sending one item at a time
return chatItems.first
}
for msg in msgs {
if let file = msg.fileSource {
removeFile(file.filePath)
}
if let file = file {
removeFile(file.filePath)
}
return []
return nil
}
func forwardItems(_ forwardedItems: [ChatItem], _ fromChatInfo: ChatInfo, _ ttl: Int?) async -> [ChatItem] {
func forwardItem(_ forwardedItem: ChatItem, _ fromChatInfo: ChatInfo, _ ttl: Int?) async -> ChatItem? {
if let chatItems = await apiForwardChatItems(
toChatType: chat.chatInfo.chatType,
toChatId: chat.chatInfo.apiId,
fromChatType: fromChatInfo.chatType,
fromChatId: fromChatInfo.apiId,
itemIds: forwardedItems.map { $0.id },
itemIds: [forwardedItem.id],
ttl: ttl
) {
await MainActor.run {
for chatItem in chatItems {
chatModel.addChatItem(chat.chatInfo, chatItem)
}
if forwardedItems.count != chatItems.count {
showAlert(
String.localizedStringWithFormat(
NSLocalizedString("%d messages not forwarded", comment: "alert title"),
forwardedItems.count - chatItems.count
),
message: NSLocalizedString("Messages were deleted after you selected them.", comment: "alert message")
)
}
}
return chatItems
} else {
return []
// TODO batch send: forward multiple messages
return chatItems.first
}
return nil
}
func checkLinkPreview() -> MsgContent {
@@ -969,6 +949,14 @@ struct ComposeView: View {
return .text(msgText)
}
}
func saveAnyImage(_ img: UploadContent) -> CryptoFile? {
switch img {
case let .simpleImage(image): return saveImage(image)
case let .animatedImage(image): return saveAnimImage(image)
default: return nil
}
}
}
private func startVoiceMessageRecording() async {
@@ -12,7 +12,7 @@ import SimpleXChat
struct ContextItemView: View {
@EnvironmentObject var theme: AppTheme
@ObservedObject var chat: Chat
let contextItems: [ChatItem]
let contextItem: ChatItem
let contextIcon: String
let cancelContextItem: () -> Void
var showSender: Bool = true
@@ -24,22 +24,13 @@ struct ContextItemView: View {
.aspectRatio(contentMode: .fit)
.frame(width: 16, height: 16)
.foregroundColor(theme.colors.secondary)
if let singleItem = contextItems.first, contextItems.count == 1 {
if showSender, let sender = singleItem.memberDisplayName {
VStack(alignment: .leading, spacing: 4) {
Text(sender).font(.caption).foregroundColor(theme.colors.secondary)
msgContentView(lines: 2, contextItem: singleItem)
}
} else {
msgContentView(lines: 3, contextItem: singleItem)
}
if showSender, let sender = contextItem.memberDisplayName {
VStack(alignment: .leading, spacing: 4) {
Text(sender).font(.caption).foregroundColor(theme.colors.secondary)
msgContentView(lines: 2)
}
} else {
Text(
chat.chatInfo.chatType == .local
? "Saving \(contextItems.count) messages"
: "Forwarding \(contextItems.count) messages"
)
.italic()
msgContentView(lines: 3)
}
Spacer()
Button {
@@ -54,32 +45,23 @@ struct ContextItemView: View {
.padding(12)
.frame(minHeight: 54)
.frame(maxWidth: .infinity)
.background(background)
.background(chatItemFrameColor(contextItem, theme))
}
private var background: Color {
contextItems.first
.map { chatItemFrameColor($0, theme) }
?? Color(uiColor: .tertiarySystemBackground)
}
private func msgContentView(lines: Int, contextItem: ChatItem) -> some View {
contextMsgPreview(contextItem)
private func msgContentView(lines: Int) -> some View {
contextMsgPreview()
.multilineTextAlignment(isRightToLeft(contextItem.text) ? .trailing : .leading)
.lineLimit(lines)
}
private func contextMsgPreview(_ contextItem: ChatItem) -> Text {
private func contextMsgPreview() -> Text {
return attachment() + messageText(contextItem.text, contextItem.formattedText, nil, preview: true, showSecrets: false, secondaryColor: theme.colors.secondary)
func attachment() -> Text {
let isFileLoaded = if let fileSource = getLoadedFileSource(contextItem.file) {
FileManager.default.fileExists(atPath: getAppFilePath(fileSource.filePath).path)
} else { false }
switch contextItem.content.msgContent {
case .file: return isFileLoaded ? image("doc.fill") : Text("")
case .file: return image("doc.fill")
case .image: return image("photo")
case .voice: return isFileLoaded ? image("play.fill") : Text("")
case .voice: return image("play.fill")
default: return Text("")
}
}
@@ -93,6 +75,6 @@ struct ContextItemView: View {
struct ContextItemView_Previews: PreviewProvider {
static var previews: some View {
let contextItem: ChatItem = ChatItem.getSample(1, .directSnd, .now, "hello")
return ContextItemView(chat: Chat.sampleData, contextItems: [contextItem], contextIcon: "pencil.circle", cancelContextItem: {})
return ContextItemView(chat: Chat.sampleData, contextItem: contextItem, contextIcon: "pencil.circle", cancelContextItem: {})
}
}
@@ -227,7 +227,6 @@ struct SendMessageView: View {
!composeState.editing {
if case .noContextItem = composeState.contextItem,
!composeState.voicePreview,
!composeState.manyMediaPreviews,
let send = sendLiveMessage,
let update = updateLiveMessage {
Button {
@@ -32,15 +32,12 @@ struct SelectedItemsBottomToolbar: View {
var deleteItems: (Bool) -> Void
var moderateItems: () -> Void
//var shareItems: () -> Void
var forwardItems: () -> Void
@State var deleteEnabled: Bool = false
@State var deleteForEveryoneEnabled: Bool = false
@State var canModerate: Bool = false
@State var moderateEnabled: Bool = false
@State var forwardEnabled: Bool = false
@State var allButtonsDisabled = false
var body: some View {
@@ -53,7 +50,6 @@ struct SelectedItemsBottomToolbar: View {
} label: {
Image(systemName: "trash")
.resizable()
.scaledToFit()
.frame(width: 20, height: 20, alignment: .center)
.foregroundColor(!deleteEnabled || allButtonsDisabled ? theme.colors.secondary: .red)
}
@@ -65,24 +61,24 @@ struct SelectedItemsBottomToolbar: View {
} label: {
Image(systemName: "flag")
.resizable()
.scaledToFit()
.frame(width: 20, height: 20, alignment: .center)
.foregroundColor(!moderateEnabled || allButtonsDisabled ? theme.colors.secondary : .red)
}
.disabled(!moderateEnabled || allButtonsDisabled)
.opacity(canModerate ? 1 : 0)
Spacer()
Button {
forwardItems()
//shareItems()
} label: {
Image(systemName: "arrowshape.turn.up.forward")
Image(systemName: "square.and.arrow.up")
.resizable()
.scaledToFit()
.frame(width: 20, height: 20, alignment: .center)
.foregroundColor(!forwardEnabled || allButtonsDisabled ? theme.colors.secondary : theme.colors.primary)
.foregroundColor(allButtonsDisabled ? theme.colors.secondary : theme.colors.primary)
}
.disabled(!forwardEnabled || allButtonsDisabled)
.disabled(allButtonsDisabled)
.opacity(0)
}
.frame(maxHeight: .infinity)
.padding([.leading, .trailing], 12)
@@ -110,16 +106,15 @@ struct SelectedItemsBottomToolbar: View {
if let selected = selectedItems {
let me: Bool
let onlyOwnGroupItems: Bool
(deleteEnabled, deleteForEveryoneEnabled, me, onlyOwnGroupItems, forwardEnabled, selectedChatItems) = chatItems.reduce((true, true, true, true, true, [])) { (r, ci) in
(deleteEnabled, deleteForEveryoneEnabled, me, onlyOwnGroupItems, selectedChatItems) = chatItems.reduce((true, true, true, true, [])) { (r, ci) in
if selected.contains(ci.id) {
var (de, dee, me, onlyOwnGroupItems, fe, sel) = r
var (de, dee, me, onlyOwnGroupItems, sel) = r
de = de && ci.canBeDeletedForSelf
dee = dee && ci.meta.deletable && !ci.localNote
onlyOwnGroupItems = onlyOwnGroupItems && ci.chatDir == .groupSnd
me = me && ci.content.msgContent != nil && ci.memberToModerate(chatInfo) != nil
fe = fe && ci.content.msgContent != nil && ci.meta.itemDeleted == nil && !ci.isLiveDummy
sel.insert(ci.id) // we are collecting new selected items here to account for any changes in chat items list
return (de, dee, me, onlyOwnGroupItems, fe, sel)
return (de, dee, me, onlyOwnGroupItems, sel)
} else {
return r
}
@@ -1,73 +0,0 @@
//
// TranslateView.swift
// SimpleX
//
// Created by user on 19/09/2024.
// Copyright © 2024 SimpleX Chat. All rights reserved.
//
import SwiftUI
import Translation
@available(iOS 18.0, *)
struct TranslateView: View {
let source: String
@State private var supprtedLanguages = [Locale.Language]()
@State private var target: String?
@State private var configuration = TranslationSession.Configuration()
var body: some View {
NavigationStack {
List {
Section {
languagePicker("From", selection: $configuration.source)
Text(source).foregroundStyle(.secondary).lineLimit(1)
}
Section {
languagePicker("To ", selection: $configuration.target)
if let target {
Text(target)
} else {
ProgressView()
}
} footer: {
Text("\(Image(systemName: "info.circle")) Uses on device translation")
}
}
.navigationTitle("Translate")
}
.task { supprtedLanguages = await LanguageAvailability().supportedLanguages }
.translationTask(configuration) { session in
do {
target = nil
let response = try await session.translate(source)
await MainActor.run {
configuration.source = response.sourceLanguage
configuration.target = response.targetLanguage
target = response.targetText
}
} catch {
print(error)
}
}
}
@ViewBuilder
private func languagePicker(_ label: String, selection: Binding<Locale.Language?>) -> some View {
Picker(label, selection: selection) {
Text("Detect language").tag(Optional<Locale.Language>.none)
ForEach(supprtedLanguages, id: \.self) { language in
Text(title(for: language)).tag(language)
}
}
}
private func title(for language: Locale.Language) -> String {
if let code = language.languageCode,
let string = Locale.current.localizedString(forLanguageCode: code.identifier) {
string
} else {
language.minimalIdentifier
}
}
}
@@ -66,7 +66,7 @@ struct ChatListView: View {
case .address:
NavigationView {
UserAddressView(shareViaProfile: currentUser.addressShared)
.navigationTitle("SimpleX address")
.navigationTitle("Public address")
.navigationBarTitleDisplayMode(.large)
.modifier(ThemedBackground(grouped: true))
}
@@ -78,7 +78,7 @@ struct ChatListView: View {
NavigationView {
UserProfile()
.navigationTitle("Your current profile")
.modifier(ThemedBackground(grouped: true))
.modifier(ThemedBackground())
}
case .chatPreferences:
NavigationView {
@@ -407,18 +407,12 @@ struct ServersSummaryView: View {
struct SubscriptionStatusIndicatorView: View {
@EnvironmentObject var m: ChatModel
@EnvironmentObject var theme: AppTheme
var subs: SMPServerSubs
var hasSess: Bool
var body: some View {
let (color, variableValue, opacity, _) = subscriptionStatusColorAndPercentage(
online: m.networkInfo.online,
usesProxy: networkUseOnionHostsGroupDefault.get() != .no || groupDefaults.string(forKey: GROUP_DEFAULT_NETWORK_SOCKS_PROXY) != nil,
subs: subs,
hasSess: hasSess,
primaryColor: theme.colors.primary
)
let onionHosts = networkUseOnionHostsGroupDefault.get()
let (color, variableValue, opacity, _) = subscriptionStatusColorAndPercentage(m.networkInfo.online, onionHosts, subs, hasSess)
if #available(iOS 16.0, *) {
Image(systemName: "dot.radiowaves.up.forward", variableValue: variableValue)
.foregroundColor(color)
@@ -431,32 +425,26 @@ struct SubscriptionStatusIndicatorView: View {
struct SubscriptionStatusPercentageView: View {
@EnvironmentObject var m: ChatModel
@EnvironmentObject var theme: AppTheme
var subs: SMPServerSubs
var hasSess: Bool
var body: some View {
let (_, _, _, statusPercent) = subscriptionStatusColorAndPercentage(
online: m.networkInfo.online,
usesProxy: networkUseOnionHostsGroupDefault.get() != .no || groupDefaults.string(forKey: GROUP_DEFAULT_NETWORK_SOCKS_PROXY) != nil,
subs: subs,
hasSess: hasSess,
primaryColor: theme.colors.primary
)
let onionHosts = networkUseOnionHostsGroupDefault.get()
let (_, _, _, statusPercent) = subscriptionStatusColorAndPercentage(m.networkInfo.online, onionHosts, subs, hasSess)
Text(verbatim: "\(Int(floor(statusPercent * 100)))%")
.foregroundColor(.secondary)
.font(.caption)
}
}
func subscriptionStatusColorAndPercentage(online: Bool, usesProxy: Bool, subs: SMPServerSubs, hasSess: Bool, primaryColor: Color) -> (Color, Double, Double, Double) {
func subscriptionStatusColorAndPercentage(_ online: Bool, _ onionHosts: OnionHosts, _ subs: SMPServerSubs, _ hasSess: Bool) -> (Color, Double, Double, Double) {
func roundedToQuarter(_ n: Double) -> Double {
n >= 1 ? 1
: n <= 0 ? 0
: (n * 4).rounded() / 4
}
let activeColor: Color = usesProxy ? .indigo : primaryColor
let activeColor: Color = onionHosts == .require ? .indigo : .accentColor
let noConnColorAndPercent: (Color, Double, Double, Double) = (Color(uiColor: .tertiaryLabel), 1, 1, 0)
let activeSubsRounded = roundedToQuarter(subs.shareOfActive)
@@ -49,7 +49,7 @@ struct UserPicker: View {
activeSheet = .currentProfile
}
openSheetOnTap(title: m.userAddress == nil ? "Create SimpleX address" : "Your SimpleX address", icon: "qrcode") {
openSheetOnTap(title: m.userAddress == nil ? "Create public address" : "Your public address", icon: "qrcode") {
activeSheet = .address
}
@@ -270,12 +270,12 @@ struct DatabaseView: View {
case let .archiveImportedWithErrors(errs):
return Alert(
title: Text("Chat database imported"),
message: Text("Restart the app to use imported chat database") + Text(verbatim: "\n") + Text("Some non-fatal errors occurred during import:") + archiveErrorsText(errs)
message: Text("Restart the app to use imported chat database") + Text(verbatim: "\n\n") + Text("Some non-fatal errors occurred during import:") + archiveErrorsText(errs)
)
case let .archiveExportedWithErrors(archivePath, errs):
return Alert(
title: Text("Chat database exported"),
message: Text("You may save the exported archive.") + Text(verbatim: "\n") + Text("Some file(s) were not exported:") + archiveErrorsText(errs),
message: Text("You may save the exported archive.") + Text(verbatim: "\n\n") + Text("Some file(s) were not exported:") + archiveErrorsText(errs),
dismissButton: .default(Text("Continue")) {
showShareSheet(items: [archivePath])
}
+1 -17
View File
@@ -47,24 +47,8 @@ func showAlert(
buttonAction()
})
if cancelButton {
alert.addAction(cancelAlertAction)
alert.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: "alert button"), style: .cancel))
}
topController.present(alert, animated: true)
}
}
func showAlert(
_ title: String,
message: String? = nil,
actions: () -> [UIAlertAction] = { [okAlertAction] }
) {
if let topController = getTopViewController() {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
for action in actions() { alert.addAction(action) }
topController.present(alert, animated: true)
}
}
let okAlertAction = UIAlertAction(title: NSLocalizedString("Ok", comment: "alert button"), style: .default)
let cancelAlertAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: "alert button"), style: .cancel)
@@ -177,7 +177,7 @@ struct MigrateFromDevice: View {
case let .archiveExportedWithErrors(archivePath, errs):
return Alert(
title: Text("Chat database exported"),
message: Text("You may migrate the exported database.") + Text(verbatim: "\n") + Text("Some file(s) were not exported:") + archiveErrorsText(errs),
message: Text("You may migrate the exported database.") + Text(verbatim: "\n\n") + Text("Some file(s) were not exported:") + archiveErrorsText(errs),
dismissButton: .default(Text("Continue")) {
Task { await uploadArchive(path: archivePath) }
}
@@ -529,15 +529,9 @@ struct MigrateFromDevice: View {
}
case let .sndStandaloneFileComplete(_, fileTransferMeta, rcvURIs):
let cfg = getNetCfg()
let proxy: NetworkProxy? = if cfg.socksProxy == nil {
nil
} else {
networkProxyDefault.get()
}
let data = MigrationFileLinkData.init(
networkConfig: MigrationFileLinkData.NetworkConfig(
socksProxy: cfg.socksProxy,
networkProxy: proxy,
hostMode: cfg.hostMode,
requiredHostMode: cfg.requiredHostMode
)
@@ -571,7 +571,7 @@ struct MigrateToDevice: View {
AlertManager.shared.showAlert(
Alert(
title: Text("Error migrating settings"),
message: Text ("Some app settings were not migrated.") + Text("\n") + Text(responseError(error)))
message: Text ("Not all settings were migrated. Repeat migration if you need them.") + Text("\n\n") + Text(responseError(error)))
)
}
hideView()
@@ -36,10 +36,6 @@ struct AdvancedNetworkSettings: View {
@State private var showSettingsAlert: NetworkSettingsAlert?
@State private var onionHosts: OnionHosts = .no
@State private var showSaveDialog = false
@State private var netProxy = networkProxyDefault.get()
@State private var currentNetProxy = networkProxyDefault.get()
@State private var useNetProxy = false
@State private var netProxyAuth = false
var body: some View {
VStack {
@@ -106,76 +102,6 @@ struct AdvancedNetworkSettings: View {
.foregroundColor(theme.colors.secondary)
}
Section {
Toggle("Use SOCKS proxy", isOn: $useNetProxy)
Group {
TextField("IP address", text: $netProxy.host)
TextField(
"Port",
text: Binding(
get: { netProxy.port > 0 ? "\(netProxy.port)" : "" },
set: { s in
netProxy.port = if let port = Int(s), port > 0 {
port
} else {
0
}
}
)
)
Toggle("Proxy requires password", isOn: $netProxyAuth)
if netProxyAuth {
TextField("Username", text: $netProxy.username)
PassphraseField(
key: $netProxy.password,
placeholder: "Password",
valid: NetworkProxy.validCredential(netProxy.password)
)
}
}
.if(!useNetProxy) { $0.foregroundColor(theme.colors.secondary) }
.disabled(!useNetProxy)
} header: {
HStack {
Text("SOCKS proxy").foregroundColor(theme.colors.secondary)
if useNetProxy && !netProxy.valid {
Spacer()
Image(systemName: "exclamationmark.circle.fill").foregroundColor(.red)
}
}
} footer: {
if netProxyAuth {
Text("Your credentials may be sent unencrypted.")
.foregroundColor(theme.colors.secondary)
} else {
Text("Do not use credentials with proxy.")
.foregroundColor(theme.colors.secondary)
}
}
.onChange(of: useNetProxy) { useNetProxy in
netCfg.socksProxy = useNetProxy && currentNetProxy.valid
? currentNetProxy.toProxyString()
: nil
netProxy = currentNetProxy
netProxyAuth = netProxy.username != "" || netProxy.password != ""
}
.onChange(of: netProxyAuth) { netProxyAuth in
if netProxyAuth {
netProxy.auth = currentNetProxy.auth
netProxy.username = currentNetProxy.username
netProxy.password = currentNetProxy.password
} else {
netProxy.auth = .username
netProxy.username = ""
netProxy.password = ""
}
}
.onChange(of: netProxy) { netProxy in
netCfg.socksProxy = useNetProxy && netProxy.valid
? netProxy.toProxyString()
: nil
}
Section {
Picker("Use .onion hosts", selection: $onionHosts) {
ForEach(OnionHosts.values, id: \.self) { Text($0.text) }
@@ -230,19 +156,19 @@ struct AdvancedNetworkSettings: View {
Section {
Button("Reset to defaults") {
updateNetCfgView(NetCfg.defaults, NetworkProxy.def)
updateNetCfgView(NetCfg.defaults)
}
.disabled(netCfg == NetCfg.defaults)
Button("Set timeouts for proxy/VPN") {
updateNetCfgView(netCfg.withProxyTimeouts, netProxy)
updateNetCfgView(netCfg.withProxyTimeouts)
}
.disabled(netCfg.hasProxyTimeouts)
Button("Save and reconnect") {
showSettingsAlert = .update
}
.disabled(netCfg == currentNetCfg || (useNetProxy && !netProxy.valid))
.disabled(netCfg == currentNetCfg)
}
}
}
@@ -256,8 +182,7 @@ struct AdvancedNetworkSettings: View {
if cfgLoaded { return }
cfgLoaded = true
currentNetCfg = getNetCfg()
currentNetProxy = networkProxyDefault.get()
updateNetCfgView(currentNetCfg, currentNetProxy)
updateNetCfgView(currentNetCfg)
}
.alert(item: $showSettingsAlert) { a in
switch a {
@@ -281,7 +206,7 @@ struct AdvancedNetworkSettings: View {
if netCfg == currentNetCfg {
dismiss()
cfgLoaded = false
} else if !useNetProxy || netProxy.valid {
} else {
showSaveDialog = true
}
})
@@ -296,26 +221,18 @@ struct AdvancedNetworkSettings: View {
}
}
private func updateNetCfgView(_ cfg: NetCfg, _ proxy: NetworkProxy) {
private func updateNetCfgView(_ cfg: NetCfg) {
netCfg = cfg
netProxy = proxy
onionHosts = OnionHosts(netCfg: netCfg)
enableKeepAlive = netCfg.enableKeepAlive
keepAliveOpts = netCfg.tcpKeepAlive ?? KeepAliveOpts.defaults
useNetProxy = netCfg.socksProxy != nil
netProxyAuth = switch netProxy.auth {
case .username: netProxy.username != "" || netProxy.password != ""
case .isolate: false
}
}
private func saveNetCfg() -> Bool {
do {
try setNetworkConfig(netCfg)
currentNetCfg = netCfg
setNetCfg(netCfg, networkProxy: useNetProxy ? netProxy : nil)
currentNetProxy = netProxy
networkProxyDefault.set(netProxy)
setNetCfg(netCfg)
return true
} catch let error {
let err = responseError(error)
@@ -19,15 +19,9 @@ extension AppSettings {
val.hostMode = .publicHost
val.requiredHostMode = true
}
if val.socksProxy != nil {
val.socksProxy = networkProxy?.toProxyString()
setNetCfg(val, networkProxy: networkProxy)
} else {
val.socksProxy = nil
setNetCfg(val, networkProxy: nil)
}
val.socksProxy = nil
setNetCfg(val)
}
if let val = networkProxy { networkProxyDefault.set(val) }
if let val = privacyEncryptLocalFiles { privacyEncryptLocalFilesGroupDefault.set(val) }
if let val = privacyAskToApproveRelays { privacyAskToApproveRelaysGroupDefault.set(val) }
if let val = privacyAcceptImages {
@@ -69,7 +63,6 @@ extension AppSettings {
let def = UserDefaults.standard
var c = AppSettings.defaults
c.networkConfig = getNetCfg()
c.networkProxy = networkProxyDefault.get()
c.privacyEncryptLocalFiles = privacyEncryptLocalFilesGroupDefault.get()
c.privacyAskToApproveRelays = privacyAskToApproveRelaysGroupDefault.get()
c.privacyAcceptImages = privacyAcceptImagesGroupDefault.get()
@@ -75,8 +75,6 @@ let DEFAULT_SYSTEM_DARK_THEME = "systemDarkTheme"
let DEFAULT_CURRENT_THEME_IDS = "currentThemeIds"
let DEFAULT_THEME_OVERRIDES = "themeOverrides"
let DEFAULT_NETWORK_PROXY = "networkProxy"
let ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN = "androidCallOnLockScreen"
let defaultChatItemRoundness: Double = 0.75
@@ -253,7 +251,6 @@ public class CodableDefault<T: Codable> {
}
}
let networkProxyDefault: CodableDefault<NetworkProxy> = CodableDefault(defaults: UserDefaults.standard, forKey: DEFAULT_NETWORK_PROXY, withDefault: NetworkProxy.def)
struct SettingsView: View {
@Environment(\.colorScheme) var colorScheme
@@ -229,7 +229,7 @@ struct UserAddressView: View {
}
}
} label: {
Label("Create SimpleX address", systemImage: "qrcode")
Label("Create public address", systemImage: "qrcode")
}
}
File diff suppressed because one or more lines are too long
@@ -1007,10 +1007,6 @@
<target>Автоматично приемане на изображения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Назад</target>
@@ -1175,7 +1171,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Отказ</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1318,10 +1314,6 @@
<target>Чат настройки</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<note>No comment provided by engineer.</note>
@@ -2797,10 +2789,6 @@ This is your own one-time link!</source>
<target>Грешка при зареждане на %@ сървъри</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Грешка при отваряне на чата</target>
@@ -3222,6 +3210,11 @@ Error: %2$@</source>
<target>Пълно име (незадължително)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Пълно име:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>Напълно децентрализирана – видима е само за членовете.</target>
@@ -4914,6 +4907,16 @@ Error: %@</source>
<target>Профилни изображения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Име на профила</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Име на профила:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Профилна парола</target>
@@ -5221,10 +5224,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Премахване</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<note>No comment provided by engineer.</note>
@@ -5410,13 +5409,12 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Запази</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Запази (и уведоми контактите)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5442,6 +5440,11 @@ Enable in *Network &amp; servers* settings.</source>
<target>Запази архив</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Запази настройките за автоматично приемане</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Запази профила на групата</target>
@@ -5477,15 +5480,16 @@ Enable in *Network &amp; servers* settings.</source>
<target>Запази сървърите?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Запази настройките?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Запази съобщението при посрещане?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Запазено</target>
@@ -5901,10 +5905,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Настройки</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Променете формата на профилните изображения</target>
@@ -6101,10 +6101,6 @@ Enable in *Network &amp; servers* settings.</source>
<source>Soft</source>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<note>No comment provided by engineer.</note>
@@ -6463,10 +6459,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Текстът, който поставихте, не е SimpleX линк за връзка.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<note>No comment provided by engineer.</note>
@@ -7519,10 +7511,6 @@ Repeat connection request?</source>
<target>Вашата чат база данни не е криптирана - задайте парола, за да я криптирате.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Вашите чат профили</target>
@@ -7577,15 +7565,13 @@ Repeat connection request?</source>
<target>Вашият профил **%@** ще бъде споделен.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Вашият профил се съхранява на вашето устройство и се споделя само с вашите контакти. SimpleX сървърите не могат да видят вашия профил.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Вашият профил се съхранява на вашето устройство и се споделя само с вашите контакти.
SimpleX сървърите не могат да видят вашия профил.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Вашият профил, контакти и доставени съобщения се съхраняват на вашето устройство.</target>
@@ -977,10 +977,6 @@
<target>Automaticky přijímat obrázky</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Zpět</target>
@@ -1135,7 +1131,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Zrušit</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1274,10 +1270,6 @@
<target>Předvolby chatu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<note>No comment provided by engineer.</note>
@@ -2702,10 +2694,6 @@ This is your own one-time link!</source>
<target>Chyba načítání %@ serverů</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<note>No comment provided by engineer.</note>
@@ -3111,6 +3099,11 @@ Error: %2$@</source>
<target>Celé jméno (volitelně)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Celé jméno:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<note>No comment provided by engineer.</note>
@@ -4736,6 +4729,14 @@ Error: %@</source>
<source>Profile images</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Heslo profilu</target>
@@ -5037,10 +5038,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Odstranit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<note>No comment provided by engineer.</note>
@@ -5219,13 +5216,12 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Uložit</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Uložit (a informovat kontakty)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5251,6 +5247,11 @@ Enable in *Network &amp; servers* settings.</source>
<target>Uložit archiv</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Uložit nastavení automatického přijímání</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Uložení profilu skupiny</target>
@@ -5286,15 +5287,16 @@ Enable in *Network &amp; servers* settings.</source>
<target>Uložit servery?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Uložit nastavení?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Uložit uvítací zprávu?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
@@ -5701,10 +5703,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Nastavení</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<note>No comment provided by engineer.</note>
@@ -5896,10 +5894,6 @@ Enable in *Network &amp; servers* settings.</source>
<source>Soft</source>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<note>No comment provided by engineer.</note>
@@ -6249,10 +6243,6 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
<source>The text you pasted is not a SimpleX link.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<note>No comment provided by engineer.</note>
@@ -7250,10 +7240,6 @@ Repeat connection request?</source>
<target>Vaše chat databáze není šifrována – nastavte přístupovou frázi pro její šifrování.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Vaše chat profily</target>
@@ -7307,15 +7293,13 @@ Repeat connection request?</source>
<target>Váš profil **%@** bude sdílen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Váš profil je uložen ve vašem zařízení a sdílen pouze s vašimi kontakty. Servery SimpleX nevidí váš profil.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Váš profil je uložen ve vašem zařízení a sdílen pouze s vašimi kontakty.
Servery SimpleX nevidí váš profil.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Váš profil, kontakty a doručené zprávy jsou uloženy ve vašem zařízení.</target>
@@ -1024,10 +1024,6 @@
<target>Bilder automatisch akzeptieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Zurück</target>
@@ -1201,7 +1197,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Abbrechen</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1349,10 +1345,6 @@
<target>Chat-Präferenzen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Chat-Design</target>
@@ -1405,22 +1397,22 @@
</trans-unit>
<trans-unit id="Clear" xml:space="preserve">
<source>Clear</source>
<target>Entfernen</target>
<target>Löschen</target>
<note>swipe action</note>
</trans-unit>
<trans-unit id="Clear conversation" xml:space="preserve">
<source>Clear conversation</source>
<target>Chat-Inhalte entfernen</target>
<target>Chatinhalte löschen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Clear conversation?" xml:space="preserve">
<source>Clear conversation?</source>
<target>Chat-Inhalte entfernen?</target>
<target>Unterhaltung löschen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Clear private notes?" xml:space="preserve">
<source>Clear private notes?</source>
<target>Private Notizen entfernen?</target>
<target>Private Notizen löschen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Clear verification" xml:space="preserve">
@@ -1734,7 +1726,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Conversation deleted!" xml:space="preserve">
<source>Conversation deleted!</source>
<target>Chat-Inhalte entfernt!</target>
<target>Unterhaltung gelöscht!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Copy" xml:space="preserve">
@@ -2878,10 +2870,6 @@ Das ist Ihr eigener Einmal-Link!</target>
<target>Fehler beim Laden von %@ Servern</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Fehler beim Öffnen des Chats</target>
@@ -3321,6 +3309,11 @@ Fehler: %2$@</target>
<target>Vollständiger Name (optional)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Vollständiger Name:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>Vollständig dezentralisiert – nur für Mitglieder sichtbar.</target>
@@ -3478,7 +3471,7 @@ Fehler: %2$@</target>
</trans-unit>
<trans-unit id="Group will be deleted for you - this cannot be undone!" xml:space="preserve">
<source>Group will be deleted for you - this cannot be undone!</source>
<target>Die Gruppe wird nur bei Ihnen gelöscht. Dies kann nicht rückgängig gemacht werden!</target>
<target>Die Gruppe wird für Sie gelöscht. Dies kann nicht rückgängig gemacht werden!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Help" xml:space="preserve">
@@ -3933,7 +3926,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Keep conversation" xml:space="preserve">
<source>Keep conversation</source>
<target>Chat-Inhalte beibehalten</target>
<target>Unterhaltung behalten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
@@ -4635,7 +4628,7 @@ Dies erfordert die Aktivierung eines VPNs.</target>
</trans-unit>
<trans-unit id="Only delete conversation" xml:space="preserve">
<source>Only delete conversation</source>
<target>Nur die Chat-Inhalte löschen</target>
<target>Nur die Unterhaltung löschen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can change group preferences." xml:space="preserve">
@@ -5052,6 +5045,16 @@ Fehler: %@</target>
<target>Profil-Bilder</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Profilname</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Profilname:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Passwort für Profil</target>
@@ -5176,7 +5179,7 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
</trans-unit>
<trans-unit id="Reachable chat toolbar" xml:space="preserve">
<source>Reachable chat toolbar</source>
<target>Chat-Symbolleiste unten</target>
<target>Erreichbare Chat-Symbolleiste</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React…" xml:space="preserve">
@@ -5375,10 +5378,6 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<target>Entfernen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<target>Bild entfernen</target>
@@ -5572,13 +5571,12 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Speichern</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Speichern (und Kontakte benachrichtigen)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5605,6 +5603,11 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<target>Archiv speichern</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Einstellungen von "Automatisch akzeptieren" speichern</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Gruppenprofil speichern</target>
@@ -5640,15 +5643,16 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<target>Alle Server speichern?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Einstellungen speichern?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Begrüßungsmeldung speichern?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Abgespeichert</target>
@@ -5716,7 +5720,7 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
</trans-unit>
<trans-unit id="Search or paste SimpleX link" xml:space="preserve">
<source>Search or paste SimpleX link</source>
<target>Suchen oder SimpleX-Link einfügen</target>
<target>Suchen oder fügen Sie den SimpleX-Link ein</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Secondary" xml:space="preserve">
@@ -6088,10 +6092,6 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<target>Einstellungen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Form der Profil-Bilder</target>
@@ -6296,10 +6296,6 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<target>Weich</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Einzelne Datei(en) wurde(n) nicht exportiert:</target>
@@ -6628,7 +6624,7 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
</trans-unit>
<trans-unit id="The messages will be deleted for all members." xml:space="preserve">
<source>The messages will be deleted for all members.</source>
<target>Die Nachrichten werden für alle Gruppenmitglieder gelöscht.</target>
<target>Die Nachrichten werden für alle Mitglieder gelöscht werden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The messages will be marked as moderated for all members." xml:space="preserve">
@@ -6671,10 +6667,6 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
<target>Der von Ihnen eingefügte Text ist kein SimpleX-Link.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<target>Design</target>
@@ -7131,7 +7123,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
</trans-unit>
<trans-unit id="Use the app with one hand." xml:space="preserve">
<source>Use the app with one hand.</source>
<target>Die App mit einer Hand bedienen.</target>
<target>Die App mit einer Hand nutzen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -7563,7 +7555,7 @@ Verbindungsanfrage wiederholen?</target>
</trans-unit>
<trans-unit id="You can still view conversation with %@ in the list of chats." xml:space="preserve">
<source>You can still view conversation with %@ in the list of chats.</source>
<target>Sie können in der Chat-Liste weiterhin die Unterhaltung mit %@ einsehen.</target>
<target>Sie können in der Chatliste weiterhin die Unterhaltung mit %@ einsehen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can turn on SimpleX Lock via Settings." xml:space="preserve">
@@ -7758,10 +7750,6 @@ Verbindungsanfrage wiederholen?</target>
<target>Ihre Chat-Datenbank ist nicht verschlüsselt. Bitte legen Sie ein Passwort fest, um sie zu schützen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Ihre Chat-Profile</target>
@@ -7816,15 +7804,13 @@ Verbindungsanfrage wiederholen?</target>
<target>Ihr Profil **%@** wird geteilt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt. SimpleX-Server können Ihr Profil nicht einsehen.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt.
SimpleX-Server können Ihr Profil nicht einsehen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Ihr Profil, Ihre Kontakte und zugestellten Nachrichten werden auf Ihrem Gerät gespeichert.</target>
@@ -1025,11 +1025,6 @@
<target>Auto-accept images</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<target>Auto-accept settings</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Back</target>
@@ -1203,7 +1198,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Cancel</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1351,11 +1346,6 @@
<target>Chat preferences</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<target>Chat preferences were changed.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Chat theme</target>
@@ -2884,11 +2874,6 @@ This is your own one-time link!</target>
<target>Error loading %@ servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<target>Error migrating settings</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Error opening chat</target>
@@ -3329,6 +3314,11 @@ Error: %2$@</target>
<target>Full name (optional)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Full name:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>Fully decentralized – visible only to members.</target>
@@ -5061,6 +5051,16 @@ Error: %@</target>
<target>Profile images</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Profile name</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Profile name:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Profile password</target>
@@ -5384,11 +5384,6 @@ Enable in *Network &amp; servers* settings.</target>
<target>Remove</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<target>Remove archive?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<target>Remove image</target>
@@ -5582,13 +5577,12 @@ Enable in *Network &amp; servers* settings.</target>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Save</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Save (and notify contacts)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5615,6 +5609,11 @@ Enable in *Network &amp; servers* settings.</target>
<target>Save archive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Save auto-accept settings</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Save group profile</target>
@@ -5650,16 +5649,16 @@ Enable in *Network &amp; servers* settings.</target>
<target>Save servers?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Save settings?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Save welcome message?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<target>Save your profile?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Saved</target>
@@ -6100,11 +6099,6 @@ Enable in *Network &amp; servers* settings.</target>
<target>Settings</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<target>Settings were changed.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Shape profile images</target>
@@ -6310,11 +6304,6 @@ Enable in *Network &amp; servers* settings.</target>
<target>Soft</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<target>Some app settings were not migrated.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Some file(s) were not exported:</target>
@@ -6687,11 +6676,6 @@ It can happen because of some bug or when the connection is compromised.</target
<target>The text you pasted is not a SimpleX link.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<target>The uploaded database archive will be permanently removed from the servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<target>Themes</target>
@@ -7775,11 +7759,6 @@ Repeat connection request?</target>
<target>Your chat database is not encrypted - set passphrase to encrypt it.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<target>Your chat preferences</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Your chat profiles</target>
@@ -7835,16 +7814,13 @@ Repeat connection request?</target>
<target>Your profile **%@** will be shared.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<target>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Your profile, contacts and delivered messages are stored on your device.</target>
@@ -1024,10 +1024,6 @@
<target>Aceptar imágenes automáticamente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Volver</target>
@@ -1201,7 +1197,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Cancelar</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1349,10 +1345,6 @@
<target>Preferencias de Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Tema de chat</target>
@@ -2878,10 +2870,6 @@ This is your own one-time link!</source>
<target>Error al cargar servidores %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Error al abrir chat</target>
@@ -3321,6 +3309,11 @@ Error: %2$@</target>
<target>Nombre completo (opcional)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Nombre completo:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>Completamente descentralizado y sólo visible para los miembros.</target>
@@ -5052,6 +5045,16 @@ Error: %@</target>
<target>Forma de los perfiles</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Nombre del perfil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Nombre del perfil:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Contraseña del perfil</target>
@@ -5375,10 +5378,6 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<target>Eliminar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<target>Eliminar imagen</target>
@@ -5572,13 +5571,12 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Guardar</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Guardar (y notificar contactos)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5605,6 +5603,11 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<target>Guardar archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Guardar configuración de auto aceptar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Guardar perfil de grupo</target>
@@ -5640,15 +5643,16 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<target>¿Guardar servidores?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>¿Guardar configuración?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>¿Guardar mensaje de bienvenida?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Guardado</target>
@@ -6088,10 +6092,6 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<target>Configuración</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Dar forma a las imágenes de perfil</target>
@@ -6296,10 +6296,6 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<target>Suave</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Algunos archivos no han sido exportados:</target>
@@ -6671,10 +6667,6 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
<target>El texto pegado no es un enlace SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<target>Temas</target>
@@ -7758,10 +7750,6 @@ Repeat connection request?</source>
<target>La base de datos no está cifrada - establece una contraseña para cifrarla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Mis perfiles</target>
@@ -7816,15 +7804,13 @@ Repeat connection request?</source>
<target>El perfil **%@** será compartido.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Tu perfil es almacenado en tu dispositivo y solamente se comparte con tus contactos. Los servidores SimpleX no pueden ver tu perfil.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Tu perfil es almacenado en tu dispositivo y solamente se comparte con tus contactos.
Los servidores SimpleX no pueden ver tu perfil.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Tu perfil, contactos y mensajes se almacenan en tu dispositivo.</target>
@@ -971,10 +971,6 @@
<target>Hyväksy kuvat automaattisesti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Takaisin</target>
@@ -1128,7 +1124,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Peruuta</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1267,10 +1263,6 @@
<target>Chat-asetukset</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<note>No comment provided by engineer.</note>
@@ -2693,10 +2685,6 @@ This is your own one-time link!</source>
<target>Virhe %@-palvelimien lataamisessa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<note>No comment provided by engineer.</note>
@@ -3101,6 +3089,11 @@ Error: %2$@</source>
<target>Koko nimi (valinnainen)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Koko nimi:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<note>No comment provided by engineer.</note>
@@ -4724,6 +4717,14 @@ Error: %@</source>
<source>Profile images</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Profiilin salasana</target>
@@ -5025,10 +5026,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Poista</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<note>No comment provided by engineer.</note>
@@ -5207,13 +5204,12 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Tallenna</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Tallenna (ja ilmoita kontakteille)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5239,6 +5235,11 @@ Enable in *Network &amp; servers* settings.</source>
<target>Tallenna arkisto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Tallenna automaattisen hyväksynnän asetukset</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Tallenna ryhmäprofiili</target>
@@ -5274,15 +5275,16 @@ Enable in *Network &amp; servers* settings.</source>
<target>Tallenna palvelimet?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Tallenna asetukset?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Tallenna tervetuloviesti?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
@@ -5688,10 +5690,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Asetukset</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<note>No comment provided by engineer.</note>
@@ -5882,10 +5880,6 @@ Enable in *Network &amp; servers* settings.</source>
<source>Soft</source>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<note>No comment provided by engineer.</note>
@@ -6235,10 +6229,6 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.</t
<source>The text you pasted is not a SimpleX link.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<note>No comment provided by engineer.</note>
@@ -7235,10 +7225,6 @@ Repeat connection request?</source>
<target>Keskustelut-tietokantasi ei ole salattu - aseta tunnuslause sen salaamiseksi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Keskusteluprofiilisi</target>
@@ -7292,15 +7278,13 @@ Repeat connection request?</source>
<target>Profiilisi **%@** jaetaan.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Profiilisi tallennetaan laitteeseesi ja jaetaan vain yhteystietojesi kanssa. SimpleX-palvelimet eivät näe profiiliasi.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Profiilisi tallennetaan laitteeseesi ja jaetaan vain yhteystietojesi kanssa.
SimpleX-palvelimet eivät näe profiiliasi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Profiilisi, kontaktisi ja toimitetut viestit tallennetaan laitteellesi.</target>
@@ -1024,10 +1024,6 @@
<target>Images auto-acceptées</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Retour</target>
@@ -1201,7 +1197,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Annuler</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1349,10 +1345,6 @@
<target>Préférences de chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Thème de chat</target>
@@ -2878,10 +2870,6 @@ Il s'agit de votre propre lien unique !</target>
<target>Erreur lors du chargement des serveurs %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Erreur lors de l'ouverture du chat</target>
@@ -3321,6 +3309,11 @@ Erreur : %2$@</target>
<target>Nom complet (optionnel)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Nom complet :</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>Entièrement décentralisé – visible que par ses membres.</target>
@@ -5052,6 +5045,16 @@ Erreur : %@</target>
<target>Images de profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Nom du profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Nom du profil :</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Mot de passe de profil</target>
@@ -5375,10 +5378,6 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<target>Supprimer</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<target>Enlever l'image</target>
@@ -5572,13 +5571,12 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Enregistrer</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Enregistrer (et en informer les contacts)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5605,6 +5603,11 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<target>Enregistrer l'archive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Enregistrer les paramètres de validation automatique</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Enregistrer le profil du groupe</target>
@@ -5640,15 +5643,16 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<target>Enregistrer les serveurs ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Enregistrer les paramètres ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Enregistrer le message d'accueil ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Enregistré</target>
@@ -6088,10 +6092,6 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<target>Paramètres</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Images de profil modelable</target>
@@ -6296,10 +6296,6 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<target>Léger</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Certains fichiers n'ont pas été exportés :</target>
@@ -6671,10 +6667,6 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
<target>Le texte collé n'est pas un lien SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<target>Thèmes</target>
@@ -7758,10 +7750,6 @@ Répéter la demande de connexion ?</target>
<target>Votre base de données de chat n'est pas chiffrée - définisez une phrase secrète.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Vos profils de chat</target>
@@ -7816,15 +7804,13 @@ Répéter la demande de connexion ?</target>
<target>Votre profil **%@** sera partagé.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Votre profil est stocké sur votre appareil et est seulement partagé avec vos contacts. Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Votre profil est stocké sur votre appareil et est seulement partagé avec vos contacts.
Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Votre profil, vos contacts et les messages reçus sont stockés sur votre appareil.</target>
@@ -427,8 +427,8 @@
<source>- voice messages up to 5 minutes.
- custom time to disappear.
- editing history.</source>
<target>- 5 perc hosszúságú hangüzenetek.
- egyedi üzenet-eltűnési időkorlát.
<target>- hangüzenetek legfeljebb 5 perces időtartamig.
- egyedi eltűnési időhatár megadása.
- előzmények szerkesztése.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -496,7 +496,7 @@
<source>&lt;p&gt;Hi!&lt;/p&gt;
&lt;p&gt;&lt;a href="%@"&gt;Connect to me via SimpleX Chat&lt;/a&gt;&lt;/p&gt;</source>
<target>&lt;p&gt;Üdvözlöm!&lt;/p&gt;
&lt;p&gt;&lt;a href=„%@”&gt;Csatlakozzon hozzám a SimpleX Chaten keresztül&lt;/a&gt;&lt;/p&gt;</target>
&lt;p&gt;&lt;a href=„%@”&gt;Csatlakozzon hozzám a SimpleX Chaten&lt;/a&gt;&lt;/p&gt;</target>
<note>email text</note>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve">
@@ -570,7 +570,7 @@
</trans-unit>
<trans-unit id="Accept connection request?" xml:space="preserve">
<source>Accept connection request?</source>
<target>Ismerőskérelem elfogadása?</target>
<target>Kapcsolódási kérelem elfogadása?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accept contact request from %@?" xml:space="preserve">
@@ -1024,10 +1024,6 @@
<target>Képek automatikus elfogadása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Vissza</target>
@@ -1050,7 +1046,7 @@
</trans-unit>
<trans-unit id="Bad message hash" xml:space="preserve">
<source>Bad message hash</source>
<target>Hibás az üzenet hasító értéke</target>
<target>Hibás az üzenet ellenőrzőösszege</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
@@ -1201,7 +1197,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Mégse</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1349,10 +1345,6 @@
<target>Csevegési beállítások</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Csevegés témája</target>
@@ -1530,7 +1522,7 @@
</trans-unit>
<trans-unit id="Connect to desktop" xml:space="preserve">
<source>Connect to desktop</source>
<target>Társítás számítógéppel</target>
<target>Kapcsolódás számítógéphez</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to your friends faster." xml:space="preserve">
@@ -1554,7 +1546,7 @@ Ez az ön SimpleX címe!</target>
<source>Connect to yourself?
This is your own one-time link!</source>
<target>Kapcsolódás saját magához?
Ez az ön egyszer használatos hivatkozása!</target>
Ez az egyszer használatos hivatkozása!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
@@ -1584,7 +1576,7 @@ Ez az ön egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Connected desktop" xml:space="preserve">
<source>Connected desktop</source>
<target>Társított számítógép</target>
<target>Csatlakoztatott számítógép</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connected servers" xml:space="preserve">
@@ -1679,7 +1671,7 @@ Ez az ön egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Contact already exists" xml:space="preserve">
<source>Contact already exists</source>
<target>Az ismerős már létezik</target>
<target>Létező ismerős</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact deleted!" xml:space="preserve">
@@ -1793,7 +1785,7 @@ Ez az ön egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Create group link" xml:space="preserve">
<source>Create group link</source>
<target>Csoporthivatkozás létrehozása</target>
<target>Csoportos hivatkozás létrehozása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create link" xml:space="preserve">
@@ -1848,7 +1840,7 @@ Ez az ön egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>Archívum hivatkozás létrehozása</target>
<target>Archív hivatkozás létrehozása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -2177,7 +2169,7 @@ Ez az ön egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Függőben lévő ismerőskérelem törlése?</target>
<target>Függő kapcsolatfelvételi kérések törlése?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete profile" xml:space="preserve">
@@ -2487,7 +2479,7 @@ Ez az ön egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
<source>Duplicate display name!</source>
<target>Duplikált megjelenített név!</target>
<target>Duplikált megjelenítési név!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Duration" xml:space="preserve">
@@ -2732,7 +2724,7 @@ Ez az ön egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Error adding member(s)" xml:space="preserve">
<source>Error adding member(s)</source>
<target>Hiba a tag(ok) hozzáadásakor</target>
<target>Hiba a tag(-ok) hozzáadásakor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
@@ -2775,7 +2767,7 @@ Ez az ön egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Error creating group link" xml:space="preserve">
<source>Error creating group link</source>
<target>Hiba a csoporthivatkozás létrehozásakor</target>
<target>Hiba a csoport hivatkozásának létrehozásakor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error creating member contact" xml:space="preserve">
@@ -2878,10 +2870,6 @@ Ez az ön egyszer használatos hivatkozása!</target>
<target>Hiba a %@ kiszolgálók betöltésekor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Hiba a csevegés megnyitásakor</target>
@@ -2998,7 +2986,7 @@ Ez az ön egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
<source>Error updating group link</source>
<target>Hiba a csoporthivatkozás frissítésekor</target>
<target>Hiba a csoport hivatkozás frissítésekor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating message" xml:space="preserve">
@@ -3321,6 +3309,11 @@ Hiba: %2$@</target>
<target>Teljes név (opcionális)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Teljes név:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>Teljesen decentralizált - kizárólag tagok számára látható.</target>
@@ -3398,12 +3391,12 @@ Hiba: %2$@</target>
</trans-unit>
<trans-unit id="Group link" xml:space="preserve">
<source>Group link</source>
<target>Csoporthivatkozás</target>
<target>Csoport hivatkozás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group links" xml:space="preserve">
<source>Group links</source>
<target>Csoporthivatkozások</target>
<target>Csoport hivatkozások</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can add message reactions." xml:space="preserve">
@@ -3473,7 +3466,7 @@ Hiba: %2$@</target>
</trans-unit>
<trans-unit id="Group will be deleted for all members - this cannot be undone!" xml:space="preserve">
<source>Group will be deleted for all members - this cannot be undone!</source>
<target>A csoport törlésre kerül minden tag számára - ez a művelet nem vonható vissza!</target>
<target>Csoport törlésre kerül minden tag számára - ez a művelet nem vonható vissza!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group will be deleted for you - this cannot be undone!" xml:space="preserve">
@@ -3770,12 +3763,12 @@ Hiba: %2$@</target>
</trans-unit>
<trans-unit id="Invalid connection link" xml:space="preserve">
<source>Invalid connection link</source>
<target>Érvénytelen kapcsolattartási hivatkozás</target>
<target>Érvénytelen kapcsolati hivatkozás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid display name!" xml:space="preserve">
<source>Invalid display name!</source>
<target>Érvénytelen megjelenítendő név!</target>
<target>Érvénytelen megjelenítendő felhaszálónév!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid link" xml:space="preserve">
@@ -3993,7 +3986,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Let's talk in SimpleX Chat" xml:space="preserve">
<source>Let's talk in SimpleX Chat</source>
<target>Beszélgessünk a SimpleX Chatben</target>
<target>Beszélgessünk a SimpleX Chat-ben</target>
<note>email subject</note>
</trans-unit>
<trans-unit id="Light" xml:space="preserve">
@@ -4008,17 +4001,17 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Link mobile and desktop apps! 🔗" xml:space="preserve">
<source>Link mobile and desktop apps! 🔗</source>
<target>Társítsa össze a mobil és asztali alkalmazásokat! 🔗</target>
<target>Társítsa össze a mobil és az asztali alkalmazásokat! 🔗</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Linked desktop options" xml:space="preserve">
<source>Linked desktop options</source>
<target>Társított számítógép beállítások</target>
<target>Összekapcsolt számítógép beállítások</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Linked desktops" xml:space="preserve">
<source>Linked desktops</source>
<target>Társított számítógépek</target>
<target>Összekapcsolt számítógépek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Live message!" xml:space="preserve">
@@ -4083,7 +4076,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Many people asked: *if SimpleX has no user identifiers, how can it deliver messages?*" xml:space="preserve">
<source>Many people asked: *if SimpleX has no user identifiers, how can it deliver messages?*</source>
<target>Sokan kérdezték: *ha a SimpleX Chatnek nincsenek felhasználói azonosítói, akkor hogyan tud üzeneteket kézbesíteni?*</target>
<target>Sokan kérdezték: *ha a SimpleX-nek nincsenek felhasználói azonosítói, akkor hogyan tud üzeneteket kézbesíteni?*</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Mark deleted for everyone" xml:space="preserve">
@@ -4342,12 +4335,12 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Moderated at" xml:space="preserve">
<source>Moderated at</source>
<target>Moderálva ekkor:</target>
<target>Moderálva lett ekkor:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Moderated at: %@" xml:space="preserve">
<source>Moderated at: %@</source>
<target>Moderálva ekkor: %@</target>
<target>Moderálva lett ekkor: %@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="More improvements are coming soon!" xml:space="preserve">
@@ -4432,7 +4425,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="New contact request" xml:space="preserve">
<source>New contact request</source>
<target>Új ismerőskérelem</target>
<target>Új kapcsolattartási kérelem</target>
<note>notification</note>
</trans-unit>
<trans-unit id="New contact:" xml:space="preserve">
@@ -4492,7 +4485,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="No contacts selected" xml:space="preserve">
<source>No contacts selected</source>
<target>Nincs kiválasztva ismerős</target>
<target>Nem kerültek ismerősök kiválasztásra</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No contacts to add" xml:space="preserve">
@@ -4557,7 +4550,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Nothing selected" xml:space="preserve">
<source>Nothing selected</source>
<target>Nincs kiválasztva semmi</target>
<target>Semmi sincs kiválasztva</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Notifications" xml:space="preserve">
@@ -4601,7 +4594,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Old database archive" xml:space="preserve">
<source>Old database archive</source>
<target>Régi adatbázis-archívum</target>
<target>Régi adatbázis archívum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="One-time invitation link" xml:space="preserve">
@@ -4630,7 +4623,7 @@ VPN engedélyezése szükséges.</target>
</trans-unit>
<trans-unit id="Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**." xml:space="preserve">
<source>Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**.</source>
<target>Csak a klienseszközök tárolják a felhasználói profilokat, névjegyeket, csoportokat és a **2 rétegű végpontok közötti titkosítással** küldött üzeneteket.</target>
<target>Csak a klienseszközök tárolják a felhasználói profilokat, névjegyeket, csoportokat és a **2 rétegű végponttól-végpontig titkosítással** küldött üzeneteket.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only delete conversation" xml:space="preserve">
@@ -4765,7 +4758,7 @@ VPN engedélyezése szükséges.</target>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>Vagy ossza meg biztonságosan ezt a fájlhivatkozást</target>
<target>Vagy a fájl hivítkozásának biztonságos megosztása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4825,7 +4818,7 @@ VPN engedélyezése szükséges.</target>
</trans-unit>
<trans-unit id="Past member %@" xml:space="preserve">
<source>Past member %@</source>
<target>%@ (már nem tag)</target>
<target>Már nem tag - %@</target>
<note>past/unknown group member</note>
</trans-unit>
<trans-unit id="Paste desktop address" xml:space="preserve">
@@ -4845,12 +4838,12 @@ VPN engedélyezése szükséges.</target>
</trans-unit>
<trans-unit id="Paste the link you received" xml:space="preserve">
<source>Paste the link you received</source>
<target>Kapott hivatkozás beillesztése</target>
<target>Fogadott hivatkozás beillesztése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Pending" xml:space="preserve">
<source>Pending</source>
<target>Függőben</target>
<target>Függő</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="People can connect to you only via the links you share." xml:space="preserve">
@@ -4897,7 +4890,7 @@ Minden további problémát osszon meg a fejlesztőkkel.</target>
</trans-unit>
<trans-unit id="Please check that you used the correct link or ask your contact to send you another one." xml:space="preserve">
<source>Please check that you used the correct link or ask your contact to send you another one.</source>
<target>Ellenőrizze, hogy a megfelelő hivatkozást használta-e, vagy kérje meg az ismerősét, hogy küldjön egy másikat.</target>
<target>Ellenőrizze, hogy a megfelelő hivatkozást használta-e, vagy kérje meg ismerősét, hogy küldjön egy másikat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please check your network connection with %@ and try again." xml:space="preserve">
@@ -5052,6 +5045,16 @@ Hiba: %@</target>
<target>Profilképek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Profilnév</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Profil neve:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Profiljelszó</target>
@@ -5375,10 +5378,6 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
<target>Eltávolítás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<target>Kép eltávolítása</target>
@@ -5451,7 +5450,7 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
</trans-unit>
<trans-unit id="Reset" xml:space="preserve">
<source>Reset</source>
<target>Visszaállítás</target>
<target>Alaphelyzetbe állítás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset all hints" xml:space="preserve">
@@ -5471,7 +5470,7 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
</trans-unit>
<trans-unit id="Reset colors" xml:space="preserve">
<source>Reset colors</source>
<target>Színek visszaállítása</target>
<target>Színek alaphelyzetbe állítása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset to app theme" xml:space="preserve">
@@ -5481,7 +5480,7 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
</trans-unit>
<trans-unit id="Reset to defaults" xml:space="preserve">
<source>Reset to defaults</source>
<target>Visszaállítás alaphelyzetbe</target>
<target>Alaphelyzetbe állítás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reset to user theme" xml:space="preserve">
@@ -5572,13 +5571,12 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Mentés</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Mentés (és az ismerősök értesítése)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5605,6 +5603,11 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
<target>Archívum mentése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Automatikus elfogadási beállítások mentése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Csoportprofil elmentése</target>
@@ -5640,15 +5643,16 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
<target>Kiszolgálók mentése?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Beállítások mentése?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Üdvözlőszöveg mentése?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Mentett</target>
@@ -6020,12 +6024,12 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
</trans-unit>
<trans-unit id="Servers info" xml:space="preserve">
<source>Servers info</source>
<target>Információk a kiszolgálókról</target>
<target>információk a kiszolgálókról</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers statistics will be reset - this cannot be undone!" xml:space="preserve">
<source>Servers statistics will be reset - this cannot be undone!</source>
<target>A kiszolgálók statisztikái visszaállnak - ez a művelet nem vonható vissza!</target>
<target>A kiszolgálók statisztikái visszaállnak - ez nem vonható vissza!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Session code" xml:space="preserve">
@@ -6088,10 +6092,6 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
<target>Beállítások</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Profilkép alakzat</target>
@@ -6243,7 +6243,7 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
</trans-unit>
<trans-unit id="SimpleX group link" xml:space="preserve">
<source>SimpleX group link</source>
<target>SimpleX csoporthivatkozás</target>
<target>SimpleX csoport hivatkozás</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX links" xml:space="preserve">
@@ -6296,10 +6296,6 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
<target>Enyhe</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Néhány fájl nem került exportálásra:</target>
@@ -6437,7 +6433,7 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
</trans-unit>
<trans-unit id="Support SimpleX Chat" xml:space="preserve">
<source>Support SimpleX Chat</source>
<target>SimpleX Chat támogatása</target>
<target>Támogassa a SimpleX Chatet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
@@ -6556,7 +6552,7 @@ Engedélyezze a Beállítások / Hálózat és kiszolgálók menüben.</target>
</trans-unit>
<trans-unit id="Thanks to the users – contribute via Weblate!" xml:space="preserve">
<source>Thanks to the users – contribute via Weblate!</source>
<target>Köszönet a felhasználóknak - hozzájárulás a Weblate-en!</target>
<target>Köszönet a felhasználóknak - hozzájárulás a Weblaten!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The 1st platform without any user identifiers – private by design." xml:space="preserve">
@@ -6588,12 +6584,12 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="The code you scanned is not a SimpleX link QR code." xml:space="preserve">
<source>The code you scanned is not a SimpleX link QR code.</source>
<target>A beolvasott QR-kód nem egy SimpleX QR-kód hivatkozás.</target>
<target>A beolvasott kód nem egy SimpleX hivatkozás QR-kód.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The connection you accepted will be cancelled!" xml:space="preserve">
<source>The connection you accepted will be cancelled!</source>
<target>Az ön által elfogadott kérelem vissza lesz vonva!</target>
<target>Az ön által elfogadott kapcsolat vissza lesz vonva!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The contact you shared this link with will NOT be able to connect!" xml:space="preserve">
@@ -6613,7 +6609,7 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
<source>The hash of the previous message is different.</source>
<target>Az előző üzenet hasító értéke különbözik.</target>
<target>Az előző üzenet ellenőrzőösszege különbözik.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The message will be deleted for all members." xml:space="preserve">
@@ -6671,10 +6667,6 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
<target>A beillesztett szöveg nem egy SimpleX hivatkozás.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<target>Témák</target>
@@ -6722,7 +6714,7 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="This display name is invalid. Please choose another name." xml:space="preserve">
<source>This display name is invalid. Please choose another name.</source>
<target>Ez a megjelenített név érvénytelen. Válasszon egy másik nevet.</target>
<target>Ez a megjelenített felhasználónév érvénytelen. Válasszon egy másik nevet.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
@@ -6742,12 +6734,12 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>Ez az ön egyszer használatos hivatkozása!</target>
<target>Ez az egyszer használatos hivatkozása!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link was used with another mobile device, please create a new link on the desktop." xml:space="preserve">
<source>This link was used with another mobile device, please create a new link on the desktop.</source>
<target>Ezt a hivatkozást egy másik mobileszközön már használták, hozzon létre egy új hivatkozást az asztali számítógépén.</target>
<target>Ezt a hivatkozást egy másik mobilleszközön már használták, hozzon létre egy új hivatkozást az asztali számítógépén.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
@@ -6854,12 +6846,12 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll
</trans-unit>
<trans-unit id="Trying to connect to the server used to receive messages from this contact (error: %@)." xml:space="preserve">
<source>Trying to connect to the server used to receive messages from this contact (error: %@).</source>
<target>Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál (hiba: %@).</target>
<target>Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerőstől érkező üzenetek fogadására szolgál (hiba: %@).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Trying to connect to the server used to receive messages from this contact." xml:space="preserve">
<source>Trying to connect to the server used to receive messages from this contact.</source>
<target>Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál.</target>
<target>Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerőstől érkező üzenetek fogadására szolgál.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Turkish interface" xml:space="preserve">
@@ -6965,8 +6957,8 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll
<trans-unit id="Unless your contact deleted the connection or this link was already used, it might be a bug - please report it.&#10;To connect, please ask your contact to create another connection link and check that you have a stable network connection." xml:space="preserve">
<source>Unless your contact deleted the connection or this link was already used, it might be a bug - please report it.
To connect, please ask your contact to create another connection link and check that you have a stable network connection.</source>
<target>Hacsak az ismerőse nem törölte a kapcsolatot, vagy ez a hivatkozás már használatban volt egyszer, lehet hogy ez egy hiba – jelentse a problémát.
A kapcsolódáshoz kérje meg az ismerősét, hogy hozzon létre egy másik kapcsolattartási hivatkozást, és ellenőrizze, hogy a hálózati kapcsolat stabil-e.</target>
<target>Hacsak az ismerőse nem törölte a kapcsolatot, vagy ez a hivatkozás már használatban volt, lehet hogy ez egy hiba – jelentse a problémát.
A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsolati hivatkozást, és ellenőrizze, hogy a hálózati kapcsolat stabil-e.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unlink" xml:space="preserve">
@@ -7091,7 +7083,7 @@ A kapcsolódáshoz kérje meg az ismerősét, hogy hozzon létre egy másik kapc
</trans-unit>
<trans-unit id="Use from desktop" xml:space="preserve">
<source>Use from desktop</source>
<target>Társítás számítógéppel</target>
<target>Használat számítógépről</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use iOS call interface" xml:space="preserve">
@@ -7431,7 +7423,7 @@ A kapcsolódáshoz kérje meg az ismerősét, hogy hozzon létre egy másik kapc
</trans-unit>
<trans-unit id="You are already connected to %@." xml:space="preserve">
<source>You are already connected to %@.</source>
<target>Ön már kapcsolódva van ehhez: %@.</target>
<target>Már kapcsolódva van hozzá: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are already connecting to %@." xml:space="preserve">
@@ -7473,7 +7465,7 @@ Csatlakozási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
<source>You are connected to the server used to receive messages from this contact.</source>
<target>Már kapcsolódott ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál.</target>
<target>Már kapcsolódott ahhoz a kiszolgálóhoz, amely az adott ismerőstől érkező üzenetek fogadására szolgál.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You are invited to group" xml:space="preserve">
@@ -7523,7 +7515,7 @@ Csatlakozási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="You can make it visible to your SimpleX contacts via Settings." xml:space="preserve">
<source>You can make it visible to your SimpleX contacts via Settings.</source>
<target>Láthatóvá teheti a SimpleXbeli ismerősei számára a „Beállításokban”.</target>
<target>Láthatóvá teheti SimpleX ismerősök számára a Beállításokban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can now chat with %@" xml:space="preserve">
@@ -7670,7 +7662,7 @@ Kapcsolódási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
<source>You will be connected when group link host's device is online, please wait or check later!</source>
<target>Akkor lesz kapcsolódva, amikor a csoporthivatkozás tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!</target>
<target>Akkor lesz kapcsolódva, amikor a csoportos hivatkozás tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
@@ -7735,7 +7727,7 @@ Kapcsolódási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="Your SimpleX address" xml:space="preserve">
<source>Your SimpleX address</source>
<target>Profil SimpleX címe</target>
<target>Az ön SimpleX címe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your XFTP servers" xml:space="preserve">
@@ -7758,10 +7750,6 @@ Kapcsolódási kérés megismétlése?</target>
<target>A csevegési adatbázis nincs titkosítva – adjon meg egy jelmondatot a titkosításhoz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Csevegési profilok</target>
@@ -7816,15 +7804,13 @@ Kapcsolódási kérés megismétlése?</target>
<target>A(z) **%@** nevű profilja megosztásra fog kerülni.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Profilja az eszközön van tárolva, és csak az ismerősökkel kerül megosztásra. A SimpleX kiszolgálók nem látjhatják profilját.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Profilja az eszközön van tárolva, és csak az ismerősökkel kerül megosztásra.
A SimpleX kiszolgálók nem látjhatják profilját.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Profilja, ismerősei és az elküldött üzenetei az eszközön kerülnek tárolásra.</target>
@@ -7862,7 +7848,7 @@ Kapcsolódási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="[Star on GitHub](https://github.com/simplex-chat/simplex-chat)" xml:space="preserve">
<source>[Star on GitHub](https://github.com/simplex-chat/simplex-chat)</source>
<target>[Csillagozás a GitHubon](https://github.com/simplex-chat/simplex-chat)</target>
<target>[Csillag a GitHubon](https://github.com/simplex-chat/simplex-chat)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="_italic_" xml:space="preserve">
@@ -7942,7 +7928,7 @@ Kapcsolódási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="bad message hash" xml:space="preserve">
<source>bad message hash</source>
<target>hibás az üzenet hasító értéke</target>
<target>hibás az üzenet ellenőrzőösszege</target>
<note>integrity error chat item</note>
</trans-unit>
<trans-unit id="blocked" xml:space="preserve">
@@ -7972,7 +7958,7 @@ Kapcsolódási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="call error" xml:space="preserve">
<source>call error</source>
<target>híváshiba</target>
<target>hiba a hívásban</target>
<note>call status</note>
</trans-unit>
<trans-unit id="call in progress" xml:space="preserve">
@@ -8067,7 +8053,7 @@ Kapcsolódási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="connecting call" xml:space="preserve">
<source>connecting call…</source>
<target>kapcsolódási hívás…</target>
<target>hívás kapcsolódik…</target>
<note>call status</note>
</trans-unit>
<trans-unit id="connecting…" xml:space="preserve">
@@ -8307,12 +8293,12 @@ Kapcsolódási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="incognito via group link" xml:space="preserve">
<source>incognito via group link</source>
<target>inkognitó a csoporthivatkozáson keresztül</target>
<target>inkognitó a csoportos hivatkozáson keresztül</target>
<note>chat list item description</note>
</trans-unit>
<trans-unit id="incognito via one-time link" xml:space="preserve">
<source>incognito via one-time link</source>
<target>inkognitó egy egyszer használatos hivatkozáson keresztül</target>
<target>inkognitó az egyszer használatos hivatkozáson keresztül</target>
<note>chat list item description</note>
</trans-unit>
<trans-unit id="indirect (%d)" xml:space="preserve">
@@ -8362,7 +8348,7 @@ Kapcsolódási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="invited via your group link" xml:space="preserve">
<source>invited via your group link</source>
<target>meghíva az ön csoporthivatkozásán keresztül</target>
<target>meghíva az ön csoport hivatkozásán keresztül</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="italic" xml:space="preserve">
@@ -8382,7 +8368,7 @@ Kapcsolódási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="marked deleted" xml:space="preserve">
<source>marked deleted</source>
<target>törlésre jelölve</target>
<target>töröltnek jelölve</target>
<note>marked deleted chat item preview text</note>
</trans-unit>
<trans-unit id="member" xml:space="preserve">
@@ -8524,7 +8510,7 @@ Kapcsolódási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
<source>received answer…</source>
<target>válasz fogadása…</target>
<target>fogadott válasz…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="received confirmation…" xml:space="preserve">
@@ -8698,12 +8684,12 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="via group link" xml:space="preserve">
<source>via group link</source>
<target>a csoporthivatkozáson keresztül</target>
<target>csoport hivatkozáson keresztül</target>
<note>chat list item description</note>
</trans-unit>
<trans-unit id="via one-time link" xml:space="preserve">
<source>via one-time link</source>
<target>egy egyszer használatos hivatkozáson keresztül</target>
<target>egyszer használatos hivatkozáson keresztül</target>
<note>chat list item description</note>
</trans-unit>
<trans-unit id="via relay" xml:space="preserve">
@@ -8768,7 +8754,7 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="you blocked %@" xml:space="preserve">
<source>you blocked %@</source>
<target>ön letiltotta őt: %@</target>
<target>ön letiltotta %@-t</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you changed address" xml:space="preserve">
@@ -1024,10 +1024,6 @@
<target>Auto-accetta immagini</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Indietro</target>
@@ -1201,7 +1197,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Annulla</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1349,10 +1345,6 @@
<target>Preferenze della chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Tema della chat</target>
@@ -2878,10 +2870,6 @@ Questo è il tuo link una tantum!</target>
<target>Errore nel caricamento dei server %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Errore di apertura della chat</target>
@@ -3321,6 +3309,11 @@ Errore: %2$@</target>
<target>Nome completo (facoltativo)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Nome completo:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>Completamente decentralizzato: visibile solo ai membri.</target>
@@ -5052,6 +5045,16 @@ Errore: %@</target>
<target>Immagini del profilo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Nome del profilo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Nome del profilo:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Password del profilo</target>
@@ -5375,10 +5378,6 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<target>Rimuovi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<target>Rimuovi immagine</target>
@@ -5572,13 +5571,12 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Salva</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Salva (e avvisa i contatti)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5605,6 +5603,11 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<target>Salva archivio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Salva le impostazioni di accettazione automatica</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Salva il profilo del gruppo</target>
@@ -5640,15 +5643,16 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<target>Salvare i server?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Salvare le impostazioni?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Salvare il messaggio di benvenuto?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Salvato</target>
@@ -6088,10 +6092,6 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<target>Impostazioni</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Forma delle immagini del profilo</target>
@@ -6296,10 +6296,6 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<target>Leggera</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Alcuni file non sono stati esportati:</target>
@@ -6671,10 +6667,6 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
<target>Il testo che hai incollato non è un link SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<target>Temi</target>
@@ -7758,10 +7750,6 @@ Ripetere la richiesta di connessione?</target>
<target>Il tuo database della chat non è crittografato: imposta la password per crittografarlo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>I tuoi profili di chat</target>
@@ -7816,15 +7804,13 @@ Ripetere la richiesta di connessione?</target>
<target>Verrà condiviso il tuo profilo **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Il tuo profilo è memorizzato sul tuo dispositivo e condiviso solo con i tuoi contatti. I server di SimpleX non possono vedere il tuo profilo.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Il tuo profilo è memorizzato sul tuo dispositivo e condiviso solo con i tuoi contatti.
I server di SimpleX non possono vedere il tuo profilo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Il tuo profilo, i contatti e i messaggi recapitati sono memorizzati sul tuo dispositivo.</target>
@@ -994,10 +994,6 @@
<target>画像を自動的に受信</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>戻る</target>
@@ -1152,7 +1148,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>中止</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1291,10 +1287,6 @@
<target>チャット設定</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<note>No comment provided by engineer.</note>
@@ -2718,10 +2710,6 @@ This is your own one-time link!</source>
<target>%@ サーバーのロード中にエラーが発生</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<note>No comment provided by engineer.</note>
@@ -3126,6 +3114,11 @@ Error: %2$@</source>
<target>フルネーム (任意):</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>フルネーム:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<note>No comment provided by engineer.</note>
@@ -4750,6 +4743,14 @@ Error: %@</source>
<source>Profile images</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>プロフィールのパスワード</target>
@@ -5050,10 +5051,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>削除</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<note>No comment provided by engineer.</note>
@@ -5232,13 +5229,12 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>保存</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>保存(連絡先に通知)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5264,6 +5260,11 @@ Enable in *Network &amp; servers* settings.</source>
<target>アーカイブを保存</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>自動受け入れ設定を保存する</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>グループプロフィールの保存</target>
@@ -5299,15 +5300,16 @@ Enable in *Network &amp; servers* settings.</source>
<target>サーバを保存しますか?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>設定を保存しますか?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>ウェルカムメッセージを保存しますか?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
@@ -5706,10 +5708,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>設定</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<note>No comment provided by engineer.</note>
@@ -5901,10 +5899,6 @@ Enable in *Network &amp; servers* settings.</source>
<source>Soft</source>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<note>No comment provided by engineer.</note>
@@ -6254,10 +6248,6 @@ It can happen because of some bug or when the connection is compromised.</source
<source>The text you pasted is not a SimpleX link.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<note>No comment provided by engineer.</note>
@@ -7253,10 +7243,6 @@ Repeat connection request?</source>
<target>チャット データベースは暗号化されていません - 暗号化するにはパスフレーズを設定してください。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>あなたのチャットプロフィール</target>
@@ -7310,15 +7296,13 @@ Repeat connection request?</source>
<target>あなたのプロファイル **%@** が共有されます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>プロフィールはデバイスに保存され、連絡先とのみ共有されます。 SimpleX サーバーはあなたのプロファイルを参照できません。</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>プロフィールはデバイスに保存され、連絡先とのみ共有されます。
SimpleX サーバーはあなたのプロファイルを参照できません。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>あなたのプロフィール、連絡先、送信したメッセージがご自分の端末に保存されます。</target>
@@ -1024,10 +1024,6 @@
<target>Afbeeldingen automatisch accepteren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Terug</target>
@@ -1201,7 +1197,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Annuleren</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1349,10 +1345,6 @@
<target>Gesprek voorkeuren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Chat thema</target>
@@ -2878,10 +2870,6 @@ Dit is uw eigen eenmalige link!</target>
<target>Fout bij het laden van %@ servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Fout bij het openen van de chat</target>
@@ -3321,6 +3309,11 @@ Fout: %2$@</target>
<target>Volledige naam (optioneel)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Volledige naam:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>Volledig gedecentraliseerd – alleen zichtbaar voor leden.</target>
@@ -5052,6 +5045,16 @@ Fout: %@</target>
<target>Profiel afbeeldingen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Profielnaam</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Profielnaam:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Profiel wachtwoord</target>
@@ -5375,10 +5378,6 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<target>Verwijderen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<target>Verwijder afbeelding</target>
@@ -5572,13 +5571,12 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Opslaan</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Bewaar (en informeer contacten)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5605,6 +5603,11 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<target>Bewaar archief</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Sla instellingen voor automatisch accepteren op</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Groep profiel opslaan</target>
@@ -5640,15 +5643,16 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<target>Servers opslaan?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Instellingen opslaan?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Welkom bericht opslaan?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Opgeslagen</target>
@@ -6088,10 +6092,6 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<target>Instellingen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Vorm profiel afbeeldingen</target>
@@ -6296,10 +6296,6 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<target>Soft</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Sommige bestanden zijn niet geëxporteerd:</target>
@@ -6671,10 +6667,6 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
<target>De tekst die u hebt geplakt is geen SimpleX link.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<target>Thema's</target>
@@ -7758,10 +7750,6 @@ Verbindingsverzoek herhalen?</target>
<target>Uw chat database is niet versleuteld, stel een wachtwoord in om deze te versleutelen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Uw chat profielen</target>
@@ -7816,15 +7804,13 @@ Verbindingsverzoek herhalen?</target>
<target>Uw profiel **%@** wordt gedeeld.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Uw profiel wordt op uw apparaat opgeslagen en alleen gedeeld met uw contacten. SimpleX servers kunnen uw profiel niet zien.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Uw profiel wordt op uw apparaat opgeslagen en alleen gedeeld met uw contacten.
SimpleX servers kunnen uw profiel niet zien.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Uw profiel, contacten en afgeleverde berichten worden op uw apparaat opgeslagen.</target>
@@ -1024,10 +1024,6 @@
<target>Automatyczne akceptowanie obrazów</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Wstecz</target>
@@ -1201,7 +1197,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Anuluj</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1349,10 +1345,6 @@
<target>Preferencje czatu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Motyw czatu</target>
@@ -2878,10 +2870,6 @@ To jest twój jednorazowy link!</target>
<target>Błąd ładowania %@ serwerów</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Błąd otwierania czatu</target>
@@ -3321,6 +3309,11 @@ Błąd: %2$@</target>
<target>Pełna nazwa (opcjonalna)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Pełna nazwa:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>W pełni zdecentralizowana – widoczna tylko dla członków.</target>
@@ -5052,6 +5045,16 @@ Błąd: %@</target>
<target>Zdjęcia profilowe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Nazwa profilu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Nazwa profilu:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Hasło profilu</target>
@@ -5375,10 +5378,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<target>Usuń</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<target>Usuń obraz</target>
@@ -5572,13 +5571,12 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Zapisz</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Zapisz (i powiadom kontakty)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5605,6 +5603,11 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<target>Zapisz archiwum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Zapisz ustawienia automatycznej akceptacji</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Zapisz profil grupy</target>
@@ -5640,15 +5643,16 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<target>Zapisać serwery?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Zapisać ustawienia?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Zapisać wiadomość powitalną?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Zapisane</target>
@@ -6088,10 +6092,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<target>Ustawienia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Kształtuj obrazy profilowe</target>
@@ -6296,10 +6296,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<target>Łagodny</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Niektóre plik(i) nie zostały wyeksportowane:</target>
@@ -6671,10 +6667,6 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
<target>Tekst, który wkleiłeś nie jest linkiem SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<target>Motywy</target>
@@ -7758,10 +7750,6 @@ Powtórzyć prośbę połączenia?</target>
<target>Baza danych czatu nie jest szyfrowana - ustaw hasło, aby ją zaszyfrować.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Twoje profile czatu</target>
@@ -7816,15 +7804,13 @@ Powtórzyć prośbę połączenia?</target>
<target>Twój profil **%@** zostanie udostępniony.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Twój profil jest przechowywany na urządzeniu i udostępniany tylko Twoim kontaktom. Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Twój profil jest przechowywany na urządzeniu i udostępniany tylko Twoim kontaktom.
Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Twój profil, kontakty i dostarczone wiadomości są przechowywane na Twoim urządzeniu.</target>
@@ -1024,10 +1024,6 @@
<target>Автоприем изображений</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Назад</target>
@@ -1201,7 +1197,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Отменить</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1349,10 +1345,6 @@
<target>Предпочтения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Тема чата</target>
@@ -2878,10 +2870,6 @@ This is your own one-time link!</source>
<target>Ошибка загрузки %@ серверов</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Ошибка доступа к чату</target>
@@ -3321,6 +3309,11 @@ Error: %2$@</source>
<target>Полное имя (не обязательно)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Полное имя:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>Группа полностью децентрализована – она видна только членам.</target>
@@ -5052,6 +5045,16 @@ Error: %@</source>
<target>Картинки профилей</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Имя профиля</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Имя профиля:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Пароль профиля</target>
@@ -5375,10 +5378,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Удалить</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<target>Удалить изображение</target>
@@ -5572,13 +5571,12 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Сохранить</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Сохранить (и уведомить контакты)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5605,6 +5603,11 @@ Enable in *Network &amp; servers* settings.</source>
<target>Сохранить архив</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Сохранить настройки автоприема</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Сохранить профиль группы</target>
@@ -5640,15 +5643,16 @@ Enable in *Network &amp; servers* settings.</source>
<target>Сохранить серверы?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Сохранить настройки?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Сохранить приветственное сообщение?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Сохранено</target>
@@ -6088,10 +6092,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Настройки</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Форма картинок профилей</target>
@@ -6296,10 +6296,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Слабое</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Некоторые файл(ы) не были экспортированы:</target>
@@ -6671,10 +6667,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Вставленный текст не является SimpleX-ссылкой.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<target>Темы</target>
@@ -7758,10 +7750,6 @@ Repeat connection request?</source>
<target>База данных НЕ зашифрована. Установите пароль, чтобы защитить Ваши данные.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Ваши профили чата</target>
@@ -7816,15 +7804,13 @@ Repeat connection request?</source>
<target>Будет отправлен Ваш профиль **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Ваш профиль хранится на Вашем устройстве и отправляется только Вашим контактам. SimpleX серверы не могут получить доступ к Вашему профилю.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Ваш профиль хранится на Вашем устройстве и отправляется только Вашим контактам.
SimpleX серверы не могут получить доступ к Вашему профилю.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Ваш профиль, контакты и доставленные сообщения хранятся на Вашем устройстве.</target>
@@ -963,10 +963,6 @@
<target>ยอมรับภาพอัตโนมัติ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>กลับ</target>
@@ -1120,7 +1116,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>ยกเลิก</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1259,10 +1255,6 @@
<target>ค่ากําหนดในการแชท</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<note>No comment provided by engineer.</note>
@@ -2678,10 +2670,6 @@ This is your own one-time link!</source>
<target>โหลดเซิร์ฟเวอร์ %@ ผิดพลาด</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<note>No comment provided by engineer.</note>
@@ -3086,6 +3074,11 @@ Error: %2$@</source>
<target>ชื่อเต็ม (ไม่บังคับ)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>ชื่อเต็ม:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<note>No comment provided by engineer.</note>
@@ -4703,6 +4696,14 @@ Error: %@</source>
<source>Profile images</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>รหัสผ่านโปรไฟล์</target>
@@ -5002,10 +5003,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>ลบ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<note>No comment provided by engineer.</note>
@@ -5184,13 +5181,12 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>บันทึก</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>บันทึก (และแจ้งผู้ติดต่อ)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5216,6 +5212,11 @@ Enable in *Network &amp; servers* settings.</source>
<target>บันทึกไฟล์เก็บถาวร</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>บันทึกการตั้งค่าการยอมรับอัตโนมัติ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>บันทึกโปรไฟล์กลุ่ม</target>
@@ -5251,15 +5252,16 @@ Enable in *Network &amp; servers* settings.</source>
<target>บันทึกเซิร์ฟเวอร์?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>บันทึกการตั้งค่า?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>บันทึกข้อความต้อนรับ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<note>No comment provided by engineer.</note>
@@ -5663,10 +5665,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>การตั้งค่า</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<note>No comment provided by engineer.</note>
@@ -5855,10 +5853,6 @@ Enable in *Network &amp; servers* settings.</source>
<source>Soft</source>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<note>No comment provided by engineer.</note>
@@ -6209,10 +6203,6 @@ It can happen because of some bug or when the connection is compromised.</source
<source>The text you pasted is not a SimpleX link.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<note>No comment provided by engineer.</note>
@@ -7204,10 +7194,6 @@ Repeat connection request?</source>
<target>ฐานข้อมูลการแชทของคุณไม่ได้ถูก encrypt - ตั้งรหัสผ่านเพื่อ encrypt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>โปรไฟล์แชทของคุณ</target>
@@ -7260,15 +7246,13 @@ Repeat connection request?</source>
<source>Your profile **%@** will be shared.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>โปรไฟล์ของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณและแชร์กับผู้ติดต่อของคุณเท่านั้น เซิร์ฟเวอร์ SimpleX ไม่สามารถดูโปรไฟล์ของคุณได้</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>โปรไฟล์ของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณและแชร์กับผู้ติดต่อของคุณเท่านั้น
เซิร์ฟเวอร์ SimpleX ไม่สามารถดูโปรไฟล์ของคุณได้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>โปรไฟล์ รายชื่อผู้ติดต่อ และข้อความที่ส่งของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณ</target>
@@ -1009,10 +1009,6 @@
<target>Fotoğrafları otomatik kabul et</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Geri</target>
@@ -1177,7 +1173,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>İptal et</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1321,10 +1317,6 @@
<target>Sohbet tercihleri</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<note>No comment provided by engineer.</note>
@@ -2805,10 +2797,6 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
<target>%@ sunucuları yüklenirken hata oluştu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Sohbeti açarken sorun oluştu</target>
@@ -3235,6 +3223,11 @@ Hata: %2$@</target>
<target>Bütün isim (opsiyonel)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Bütün isim:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>Tamamiyle merkezi olmayan - sadece kişilere görünür.</target>
@@ -4933,6 +4926,16 @@ Hata: %@</target>
<target>Profil resimleri</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Profil ismi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Profil ismi:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Profil parolası</target>
@@ -5243,10 +5246,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Sil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<note>No comment provided by engineer.</note>
@@ -5433,13 +5432,12 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Kaydet</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Kaydet (ve kişilere bildir)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5465,6 +5463,11 @@ Enable in *Network &amp; servers* settings.</source>
<target>Arşivi kaydet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Otomatik kabul et ayarlarını kaydet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Grup profilini kaydet</target>
@@ -5500,15 +5503,16 @@ Enable in *Network &amp; servers* settings.</source>
<target>Sunucular kaydedilsin mi?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Ayarlar kaydedilsin mi?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Hoşgeldin mesajı kaydedilsin mi?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Kaydedildi</target>
@@ -5928,10 +5932,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Ayarlar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Profil resimlerini şekillendir</target>
@@ -6130,10 +6130,6 @@ Enable in *Network &amp; servers* settings.</source>
<source>Soft</source>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<note>No comment provided by engineer.</note>
@@ -6493,10 +6489,6 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir.
<target>Yapıştırdığın metin bir SimpleX bağlantısı değildir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<note>No comment provided by engineer.</note>
@@ -7556,10 +7548,6 @@ Bağlantı isteği tekrarlansın mı?</target>
<target>Sohbet veritabanınız şifrelenmemiş - şifrelemek için parola ayarlayın.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Sohbet profillerin</target>
@@ -7614,15 +7602,13 @@ Bağlantı isteği tekrarlansın mı?</target>
<target>Profiliniz **%@** paylaşılacaktır.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Profiliniz cihazınızda saklanır ve sadece kişilerinizle paylaşılır. SimpleX sunucuları profilinizi göremez.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Profiliniz cihazınızda saklanır ve sadece kişilerinizle paylaşılır.
SimpleX sunucuları profilinizi göremez.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Profiliniz, kişileriniz ve gönderilmiş mesajlar cihazınızda saklanır.</target>
@@ -1024,10 +1024,6 @@
<target>Автоматичне прийняття зображень</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
<source>Back</source>
<target>Назад</target>
@@ -1201,7 +1197,7 @@
<trans-unit id="Cancel" xml:space="preserve">
<source>Cancel</source>
<target>Скасувати</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
@@ -1349,10 +1345,6 @@
<target>Налаштування чату</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Тема чату</target>
@@ -2878,10 +2870,6 @@ This is your own one-time link!</source>
<target>Помилка завантаження %@ серверів</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
<source>Error opening chat</source>
<target>Помилка відкриття чату</target>
@@ -3321,6 +3309,11 @@ Error: %2$@</source>
<target>Повне ім'я (необов'язково)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Full name:" xml:space="preserve">
<source>Full name:</source>
<target>Повне ім'я:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
<source>Fully decentralized – visible only to members.</source>
<target>Повністю децентралізована - видима лише для учасників.</target>
@@ -5052,6 +5045,16 @@ Error: %@</source>
<target>Зображення профілю</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
<source>Profile name</source>
<target>Назва профілю</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name:" xml:space="preserve">
<source>Profile name:</source>
<target>Ім'я профілю:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile password" xml:space="preserve">
<source>Profile password</source>
<target>Пароль до профілю</target>
@@ -5375,10 +5378,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Видалити</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
<source>Remove image</source>
<target>Видалити зображення</target>
@@ -5572,13 +5571,12 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save" xml:space="preserve">
<source>Save</source>
<target>Зберегти</target>
<note>alert button
chat item action</note>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
<source>Save (and notify contacts)</source>
<target>Зберегти (і повідомити контактам)</target>
<note>alert button</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
@@ -5605,6 +5603,11 @@ Enable in *Network &amp; servers* settings.</source>
<target>Зберегти архів</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save auto-accept settings" xml:space="preserve">
<source>Save auto-accept settings</source>
<target>Зберегти налаштування автоприйому</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Зберегти профіль групи</target>
@@ -5640,15 +5643,16 @@ Enable in *Network &amp; servers* settings.</source>
<target>Зберегти сервери?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save settings?" xml:space="preserve">
<source>Save settings?</source>
<target>Зберегти налаштування?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save welcome message?" xml:space="preserve">
<source>Save welcome message?</source>
<target>Зберегти вітальне повідомлення?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>Збережено</target>
@@ -6088,10 +6092,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Налаштування</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>Сформуйте зображення профілю</target>
@@ -6296,10 +6296,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>М'який</target>
<note>blur media</note>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
<source>Some file(s) were not exported:</source>
<target>Деякі файли не було експортовано:</target>
@@ -6671,10 +6667,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Текст, який ви вставили, не є посиланням SimpleX.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
<source>Themes</source>
<target>Теми</target>
@@ -7758,10 +7750,6 @@ Repeat connection request?</source>
<target>Ваша база даних чату не зашифрована - встановіть ключову фразу, щоб зашифрувати її.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
<source>Your chat profiles</source>
<target>Ваші профілі чату</target>
@@ -7816,15 +7804,13 @@ Repeat connection request?</source>
<target>Ваш профіль **%@** буде опублікований.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
<target>Ваш профіль зберігається на вашому пристрої і доступний лише вашим контактам. Сервери SimpleX не бачать ваш профіль.</target>
<trans-unit id="Your profile is stored on your device and shared only with your contacts.&#10;SimpleX servers cannot see your profile." xml:space="preserve">
<source>Your profile is stored on your device and shared only with your contacts.
SimpleX servers cannot see your profile.</source>
<target>Ваш профіль зберігається на вашому пристрої і доступний лише вашим контактам.
Сервери SimpleX не бачать ваш профіль.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
<source>Your profile, contacts and delivered messages are stored on your device.</source>
<target>Ваш профіль, контакти та доставлені повідомлення зберігаються на вашому пристрої.</target>
File diff suppressed because it is too large Load Diff
+1 -2
View File
@@ -320,8 +320,7 @@ class ShareModel: ObservableObject {
}
await ch.completeFile()
if await !ch.isRunning { break }
case let .chatItemsStatusesUpdated(_, chatItems):
guard let ci = chatItems.last else { continue }
case let .chatItemStatusUpdated(_, ci):
guard isMessage(for: ci) else { continue }
if let (title, message) = ci.chatItem.meta.itemStatus.statusInfo {
// `title` and `message` already localized and interpolated
@@ -1,9 +1,7 @@
/* Bundle display name */
"CFBundleDisplayName" = "SimpleX SE";
/* Bundle name */
"CFBundleName" = "SimpleX SE";
/* Copyright (human-readable) */
"NSHumanReadableCopyright" = "版权所有 © 2024 SimpleX Chat。保留所有权利。";
/*
InfoPlist.strings
SimpleX
Created by EP on 30/07/2024.
Copyright © 2024 SimpleX Chat. All rights reserved.
*/
@@ -1,111 +1,7 @@
/* No comment provided by engineer. */
"%@" = "%@";
/* No comment provided by engineer. */
"App is locked!" = "应用程序已锁定!";
/* No comment provided by engineer. */
"Cancel" = "取消";
/* No comment provided by engineer. */
"Cannot access keychain to save database password" = "无法访问钥匙串以保存数据库密码";
/* No comment provided by engineer. */
"Cannot forward message" = "无法转发消息";
/* No comment provided by engineer. */
"Comment" = "评论";
/* No comment provided by engineer. */
"Currently maximum supported file size is %@." = "当前支持的最大文件大小为 %@。";
/* No comment provided by engineer. */
"Database downgrade required" = "需要数据库降级";
/* No comment provided by engineer. */
"Database encrypted!" = "数据库已加密!";
/* No comment provided by engineer. */
"Database error" = "数据库错误";
/* No comment provided by engineer. */
"Database passphrase is different from saved in the keychain." = "数据库密码与保存在钥匙串中的密码不同。";
/* No comment provided by engineer. */
"Database passphrase is required to open chat." = "需要数据库密码才能打开聊天。";
/* No comment provided by engineer. */
"Database upgrade required" = "需要升级数据库";
/* No comment provided by engineer. */
"Error preparing file" = "准备文件时出错";
/* No comment provided by engineer. */
"Error preparing message" = "准备消息时出错";
/* No comment provided by engineer. */
"Error: %@" = "错误:%@";
/* No comment provided by engineer. */
"File error" = "文件错误";
/* No comment provided by engineer. */
"Incompatible database version" = "不兼容的数据库版本";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "无效的迁移确认";
/* No comment provided by engineer. */
"Keychain error" = "钥匙串错误";
/* No comment provided by engineer. */
"Large file!" = "大文件!";
/* No comment provided by engineer. */
"No active profile" = "无活动配置文件";
/* No comment provided by engineer. */
"Ok" = "好的";
/* No comment provided by engineer. */
"Open the app to downgrade the database." = "打开应用程序以降级数据库。";
/* No comment provided by engineer. */
"Open the app to upgrade the database." = "打开应用程序以升级数据库。";
/* No comment provided by engineer. */
"Passphrase" = "密码";
/* No comment provided by engineer. */
"Please create a profile in the SimpleX app" = "请在 SimpleX 应用程序中创建配置文件";
/* No comment provided by engineer. */
"Selected chat preferences prohibit this message." = "选定的聊天首选项禁止此消息。";
/* No comment provided by engineer. */
"Sending a message takes longer than expected." = "发送消息所需的时间比预期的要长。";
/* No comment provided by engineer. */
"Sending message…" = "正在发送消息…";
/* No comment provided by engineer. */
"Share" = "共享";
/* No comment provided by engineer. */
"Slow network?" = "网络速度慢?";
/* No comment provided by engineer. */
"Unknown database error: %@" = "未知数据库错误: %@";
/* No comment provided by engineer. */
"Unsupported format" = "不支持的格式";
/* No comment provided by engineer. */
"Wait" = "等待";
/* No comment provided by engineer. */
"Wrong database passphrase" = "数据库密码错误";
/* No comment provided by engineer. */
"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "您可以在 \"隐私与安全\"/\"SimpleX Lock \"设置中允许共享。";
/*
Localizable.strings
SimpleX
Created by EP on 30/07/2024.
Copyright © 2024 SimpleX Chat. All rights reserved.
*/
+40 -44
View File
@@ -167,6 +167,11 @@
648679AB2BC96A74006456E7 /* ChatItemForwardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 648679AA2BC96A74006456E7 /* ChatItemForwardingView.swift */; };
649BCDA0280460FD00C3A862 /* ComposeImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649BCD9F280460FD00C3A862 /* ComposeImageView.swift */; };
649BCDA22805D6EF00C3A862 /* CIImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649BCDA12805D6EF00C3A862 /* CIImageView.swift */; };
64A208622C8F2CCC00AE9D01 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A2085D2C8F2CCB00AE9D01 /* libgmpxx.a */; };
64A208632C8F2CCC00AE9D01 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A2085E2C8F2CCB00AE9D01 /* libffi.a */; };
64A208642C8F2CCC00AE9D01 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A2085F2C8F2CCB00AE9D01 /* libgmp.a */; };
64A208652C8F2CCC00AE9D01 /* libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A208602C8F2CCC00AE9D01 /* libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7-ghc9.6.3.a */; };
64A208662C8F2CCC00AE9D01 /* libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A208612C8F2CCC00AE9D01 /* libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7.a */; };
64AA1C6927EE10C800AC7277 /* ContextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6827EE10C800AC7277 /* ContextItemView.swift */; };
64AA1C6C27F3537400AC7277 /* DeletedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6B27F3537400AC7277 /* DeletedItemView.swift */; };
64C06EB52A0A4A7C00792D4D /* ChatItemInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C06EB42A0A4A7C00792D4D /* ChatItemInfoView.swift */; };
@@ -204,7 +209,6 @@
CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */ = {isa = PBXBuildFile; productRef = CE38A29B2C3FCD72005ED185 /* SwiftyGif */; };
CE75480A2C622630009579B7 /* SwipeLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE7548092C622630009579B7 /* SwipeLabel.swift */; };
CE984D4B2C36C5D500E3AEFF /* ChatItemClipShape.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE984D4A2C36C5D500E3AEFF /* ChatItemClipShape.swift */; };
CEA034032C9C0F1800B587E7 /* TranslateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA034022C9C0F1800B587E7 /* TranslateView.swift */; };
CEDE70222C48FD9500233B1F /* SEChatState.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEDE70212C48FD9500233B1F /* SEChatState.swift */; };
CEE723AA2C3BD3D70009AE93 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE723A92C3BD3D70009AE93 /* ShareViewController.swift */; };
CEE723B12C3BD3D70009AE93 /* SimpleX SE.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = CEE723A72C3BD3D70009AE93 /* SimpleX SE.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
@@ -218,11 +222,6 @@
D77B92DC2952372200A5A1CC /* SwiftyGif in Frameworks */ = {isa = PBXBuildFile; productRef = D77B92DB2952372200A5A1CC /* SwiftyGif */; };
D7F0E33929964E7E0068AF69 /* LZString in Frameworks */ = {isa = PBXBuildFile; productRef = D7F0E33829964E7E0068AF69 /* LZString */; };
E51CC1E62C62085600DB91FE /* OneHandUICard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E51CC1E52C62085600DB91FE /* OneHandUICard.swift */; };
E55128E72C9AD063001D165C /* libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E55128E22C9AD063001D165C /* libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt.a */; };
E55128E82C9AD063001D165C /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E55128E32C9AD063001D165C /* libgmp.a */; };
E55128E92C9AD063001D165C /* libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E55128E42C9AD063001D165C /* libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt-ghc9.6.3.a */; };
E55128EA2C9AD063001D165C /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E55128E52C9AD063001D165C /* libgmpxx.a */; };
E55128EB2C9AD063001D165C /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E55128E62C9AD063001D165C /* libffi.a */; };
E5DCF8DB2C56FAC1007928CC /* SimpleXChat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE2BA682845308900EC33A6 /* SimpleXChat.framework */; };
E5DCF9712C590272007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF96F2C590272007928CC /* Localizable.strings */; };
E5DCF9842C5902CE007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF9822C5902CE007928CC /* Localizable.strings */; };
@@ -509,6 +508,11 @@
6493D667280ED77F007A76FB /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
649BCD9F280460FD00C3A862 /* ComposeImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeImageView.swift; sourceTree = "<group>"; };
649BCDA12805D6EF00C3A862 /* CIImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIImageView.swift; sourceTree = "<group>"; };
64A2085D2C8F2CCB00AE9D01 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
64A2085E2C8F2CCB00AE9D01 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
64A2085F2C8F2CCB00AE9D01 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
64A208602C8F2CCC00AE9D01 /* libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7-ghc9.6.3.a"; sourceTree = "<group>"; };
64A208612C8F2CCC00AE9D01 /* libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7.a"; sourceTree = "<group>"; };
64AA1C6827EE10C800AC7277 /* ContextItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextItemView.swift; sourceTree = "<group>"; };
64AA1C6B27F3537400AC7277 /* DeletedItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletedItemView.swift; sourceTree = "<group>"; };
64C06EB42A0A4A7C00792D4D /* ChatItemInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatItemInfoView.swift; sourceTree = "<group>"; };
@@ -544,7 +548,6 @@
CE3097FA2C4C0C9F00180898 /* ErrorAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlert.swift; sourceTree = "<group>"; };
CE7548092C622630009579B7 /* SwipeLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwipeLabel.swift; sourceTree = "<group>"; };
CE984D4A2C36C5D500E3AEFF /* ChatItemClipShape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatItemClipShape.swift; sourceTree = "<group>"; };
CEA034022C9C0F1800B587E7 /* TranslateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TranslateView.swift; sourceTree = "<group>"; };
CEDE70212C48FD9500233B1F /* SEChatState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SEChatState.swift; sourceTree = "<group>"; };
CEE723A72C3BD3D70009AE93 /* SimpleX SE.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "SimpleX SE.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
CEE723A92C3BD3D70009AE93 /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = "<group>"; };
@@ -558,11 +561,6 @@
D741547929AF90B00022400A /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/System/Library/Frameworks/PushKit.framework; sourceTree = DEVELOPER_DIR; };
D7AA2C3429A936B400737B40 /* MediaEncryption.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; name = MediaEncryption.playground; path = Shared/MediaEncryption.playground; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
E51CC1E52C62085600DB91FE /* OneHandUICard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OneHandUICard.swift; sourceTree = "<group>"; };
E55128E22C9AD063001D165C /* libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt.a"; sourceTree = "<group>"; };
E55128E32C9AD063001D165C /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
E55128E42C9AD063001D165C /* libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt-ghc9.6.3.a"; sourceTree = "<group>"; };
E55128E52C9AD063001D165C /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
E55128E62C9AD063001D165C /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
E5DCF9702C590272007928CC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
E5DCF9722C590274007928CC /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = "<group>"; };
E5DCF9732C590275007928CC /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
@@ -653,14 +651,14 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E55128E72C9AD063001D165C /* libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt.a in Frameworks */,
E55128E82C9AD063001D165C /* libgmp.a in Frameworks */,
64A208662C8F2CCC00AE9D01 /* libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7.a in Frameworks */,
64A208622C8F2CCC00AE9D01 /* libgmpxx.a in Frameworks */,
64A208652C8F2CCC00AE9D01 /* libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7-ghc9.6.3.a in Frameworks */,
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
E55128EB2C9AD063001D165C /* libffi.a in Frameworks */,
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
E55128E92C9AD063001D165C /* libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt-ghc9.6.3.a in Frameworks */,
64A208632C8F2CCC00AE9D01 /* libffi.a in Frameworks */,
64A208642C8F2CCC00AE9D01 /* libgmp.a in Frameworks */,
CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */,
E55128EA2C9AD063001D165C /* libgmpxx.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -729,7 +727,6 @@
5CBE6C132944CC12002D9531 /* ScanCodeView.swift */,
64C06EB42A0A4A7C00792D4D /* ChatItemInfoView.swift */,
648679AA2BC96A74006456E7 /* ChatItemForwardingView.swift */,
CEA034022C9C0F1800B587E7 /* TranslateView.swift */,
8CE848A22C5A0FA000D5C7C8 /* SelectableChatItemToolbars.swift */,
);
path = Chat;
@@ -738,11 +735,11 @@
5C764E5C279C70B7000C6508 /* Libraries */ = {
isa = PBXGroup;
children = (
E55128E62C9AD063001D165C /* libffi.a */,
E55128E32C9AD063001D165C /* libgmp.a */,
E55128E52C9AD063001D165C /* libgmpxx.a */,
E55128E42C9AD063001D165C /* libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt-ghc9.6.3.a */,
E55128E22C9AD063001D165C /* libHSsimplex-chat-6.1.0.2-ItgztLmvKyzFsOmChHMkFt.a */,
64A2085E2C8F2CCB00AE9D01 /* libffi.a */,
64A2085F2C8F2CCB00AE9D01 /* libgmp.a */,
64A2085D2C8F2CCB00AE9D01 /* libgmpxx.a */,
64A208602C8F2CCC00AE9D01 /* libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7-ghc9.6.3.a */,
64A208612C8F2CCC00AE9D01 /* libHSsimplex-chat-6.1.0.0-G2fNFSEVU486aN7U9YSuO7.a */,
);
path = Libraries;
sourceTree = "<group>";
@@ -1396,7 +1393,6 @@
5CB634A829E437960066AD6B /* PasscodeEntry.swift in Sources */,
5CFA59C42860BC6200863A68 /* MigrateToAppGroupView.swift in Sources */,
648010AB281ADD15009009B9 /* CIFileView.swift in Sources */,
CEA034032C9C0F1800B587E7 /* TranslateView.swift in Sources */,
644EFFE2292D089800525D5B /* FramedCIVoiceView.swift in Sources */,
5C4B3B0A285FB130003915F2 /* DatabaseView.swift in Sources */,
5CB2084F28DA4B4800D024EC /* RTCServers.swift in Sources */,
@@ -1895,7 +1891,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 237;
CURRENT_PROJECT_VERSION = 236;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1920,7 +1916,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES_THIN;
MARKETING_VERSION = 6.1;
MARKETING_VERSION = 6.0.4;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1944,7 +1940,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 237;
CURRENT_PROJECT_VERSION = 236;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1969,7 +1965,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.1;
MARKETING_VERSION = 6.0.4;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1985,11 +1981,11 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 237;
CURRENT_PROJECT_VERSION = 236;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 6.1;
MARKETING_VERSION = 6.0.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.Tests-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -2005,11 +2001,11 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 237;
CURRENT_PROJECT_VERSION = 236;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MARKETING_VERSION = 6.1;
MARKETING_VERSION = 6.0.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.Tests-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -2030,7 +2026,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 237;
CURRENT_PROJECT_VERSION = 236;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GCC_OPTIMIZATION_LEVEL = s;
@@ -2045,7 +2041,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.1;
MARKETING_VERSION = 6.0.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -2067,7 +2063,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 237;
CURRENT_PROJECT_VERSION = 236;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_CODE_COVERAGE = NO;
@@ -2082,7 +2078,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.1;
MARKETING_VERSION = 6.0.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -2104,7 +2100,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 237;
CURRENT_PROJECT_VERSION = 236;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -2130,7 +2126,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.1;
MARKETING_VERSION = 6.0.4;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -2155,7 +2151,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 237;
CURRENT_PROJECT_VERSION = 236;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -2181,7 +2177,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
MARKETING_VERSION = 6.1;
MARKETING_VERSION = 6.0.4;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -2206,7 +2202,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 237;
CURRENT_PROJECT_VERSION = 236;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -2221,7 +2217,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 6.1;
MARKETING_VERSION = 6.0.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-SE";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -2240,7 +2236,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 237;
CURRENT_PROJECT_VERSION = 236;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -2255,7 +2251,7 @@
"@executable_path/../../Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 6.1;
MARKETING_VERSION = 6.0.4;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-SE";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -1,48 +0,0 @@
{
"originHash" : "e2611d1e91fd8071abc106776ba14ee2e395d2ad08a78e073381294abc10f115",
"pins" : [
{
"identity" : "codescanner",
"kind" : "remoteSourceControl",
"location" : "https://github.com/twostraws/CodeScanner",
"state" : {
"revision" : "34da57fb63b47add20de8a85da58191523ccce57",
"version" : "2.5.0"
}
},
{
"identity" : "lzstring-swift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/Ibrahimhass/lzstring-swift",
"state" : {
"revision" : "7f62f21de5b18582a950e1753b775cc614722407"
}
},
{
"identity" : "swiftygif",
"kind" : "remoteSourceControl",
"location" : "https://github.com/kirualex/SwiftyGif",
"state" : {
"revision" : "5e8619335d394901379c9add5c4c1c2f420b3800"
}
},
{
"identity" : "webrtc",
"kind" : "remoteSourceControl",
"location" : "https://github.com/simplex-chat/WebRTC.git",
"state" : {
"revision" : "34bedc50f9c58dccf4967ea59c7e6a47d620803b"
}
},
{
"identity" : "yams",
"kind" : "remoteSourceControl",
"location" : "https://github.com/jpsim/Yams",
"state" : {
"revision" : "9234124cff5e22e178988c18d8b95a8ae8007f76",
"version" : "5.1.2"
}
}
],
"version" : 3
}
+2 -54
View File
@@ -177,66 +177,14 @@ public func fromCString(_ c: UnsafeMutablePointer<CChar>) -> String {
return s
}
// TODO: Remove after XCode 16 crash has been resolved/merged
class ThreadExecutor<ResultType> {
private var stackSize: Int
private var qos: QualityOfService
/// Initialize by specifying the stack size
init(stackSize: Int, qos: QualityOfService) {
self.stackSize = stackSize
self.qos = qos
}
/// Execute a closure synchronously on a separate thread and return the result
func executeSync(_ task: @escaping () throws -> ResultType) throws -> ResultType {
// Initialize the semaphore (initially locked)
let semaphore = DispatchSemaphore(value: 0)
var result: Result<ResultType, Error>?
// Initialize the thread
let thread = Thread {
do {
let taskResult = try task()
result = .success(taskResult)
} catch {
result = .failure(error)
}
// Release the semaphore when the task is completed
semaphore.signal()
}
thread.stackSize = stackSize
thread.qualityOfService = qos
thread.start()
// Wait until the thread completes
semaphore.wait()
// Return the result
switch result! {
case .success(let result):
return result
case .failure(let error):
throw error
}
}
}
public func chatResponse(_ s: String) -> ChatResponse {
let d = s.data(using: .utf8)!
// TODO is there a way to do it without copying the data? e.g:
// let p = UnsafeMutableRawPointer.init(mutating: UnsafeRawPointer(cjson))
// let d = Data.init(bytesNoCopy: p, count: strlen(cjson), deallocator: .free)
do {
let executor = ThreadExecutor<APIResponse>(
stackSize: 2*1024*1024, // 2MiB
qos: Thread.current.qualityOfService // inherit priority
)
return try executor.executeSync {
try jsonDecoder.decode(APIResponse.self, from: d)
}.resp
let r = try jsonDecoder.decode(APIResponse.self, from: d)
return r.resp
} catch {
logger.error("chatResponse jsonDecoder.decode error: \(error.localizedDescription)")
}
+5 -84
View File
@@ -8,7 +8,6 @@
import Foundation
import SwiftUI
import Network
public let jsonDecoder = getJSONDecoder()
public let jsonEncoder = getJSONEncoder()
@@ -49,7 +48,6 @@ public enum ChatCommand {
case apiDeleteChatItem(type: ChatType, id: Int64, itemIds: [Int64], mode: CIDeleteMode)
case apiDeleteMemberChatItem(groupId: Int64, itemIds: [Int64])
case apiChatItemReaction(type: ChatType, id: Int64, itemId: Int64, add: Bool, reaction: MsgReaction)
case apiPlanForwardChatItems(toChatType: ChatType, toChatId: Int64, itemIds: [Int64])
case apiForwardChatItems(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemIds: [Int64], ttl: Int?)
case apiGetNtfToken
case apiRegisterToken(token: DeviceToken, notificationMode: NotificationsMode)
@@ -205,7 +203,6 @@ public enum ChatCommand {
case let .apiDeleteChatItem(type, id, itemIds, mode): return "/_delete item \(ref(type, id)) \(itemIds.map({ "\($0)" }).joined(separator: ",")) \(mode.rawValue)"
case let .apiDeleteMemberChatItem(groupId, itemIds): return "/_delete member item #\(groupId) \(itemIds.map({ "\($0)" }).joined(separator: ","))"
case let .apiChatItemReaction(type, id, itemId, add, reaction): return "/_reaction \(ref(type, id)) \(itemId) \(onOff(add)) \(encodeJSON(reaction))"
case let .apiPlanForwardChatItems(type, id, itemIds): return "/_forward plan \(ref(type, id)) \(itemIds.map({ "\($0)" }).joined(separator: ","))"
case let .apiForwardChatItems(toChatType, toChatId, fromChatType, fromChatId, itemIds, ttl):
let ttlStr = ttl != nil ? "\(ttl!)" : "default"
return "/_forward \(ref(toChatType, toChatId)) \(ref(fromChatType, fromChatId)) \(itemIds.map({ "\($0)" }).joined(separator: ",")) ttl=\(ttlStr)"
@@ -361,7 +358,6 @@ public enum ChatCommand {
case .apiConnectContactViaAddress: return "apiConnectContactViaAddress"
case .apiDeleteMemberChatItem: return "apiDeleteMemberChatItem"
case .apiChatItemReaction: return "apiChatItemReaction"
case .apiPlanForwardChatItems: return "apiPlanForwardChatItems"
case .apiForwardChatItems: return "apiForwardChatItems"
case .apiGetNtfToken: return "apiGetNtfToken"
case .apiRegisterToken: return "apiRegisterToken"
@@ -604,8 +600,7 @@ public enum ChatResponse: Decodable, Error {
case groupEmpty(user: UserRef, groupInfo: GroupInfo)
case userContactLinkSubscribed
case newChatItems(user: UserRef, chatItems: [AChatItem])
case forwardPlan(user: UserRef, chatItemIds: [Int64], forwardConfirmation: ForwardConfirmation?)
case chatItemsStatusesUpdated(user: UserRef, chatItems: [AChatItem])
case chatItemStatusUpdated(user: UserRef, chatItem: AChatItem)
case chatItemUpdated(user: UserRef, chatItem: AChatItem)
case chatItemNotChanged(user: UserRef, chatItem: AChatItem)
case chatItemReaction(user: UserRef, added: Bool, reaction: ACIReaction)
@@ -776,8 +771,7 @@ public enum ChatResponse: Decodable, Error {
case .groupEmpty: return "groupEmpty"
case .userContactLinkSubscribed: return "userContactLinkSubscribed"
case .newChatItems: return "newChatItems"
case .forwardPlan: return "forwardPlan"
case .chatItemsStatusesUpdated: return "chatItemsStatusesUpdated"
case .chatItemStatusUpdated: return "chatItemStatusUpdated"
case .chatItemUpdated: return "chatItemUpdated"
case .chatItemNotChanged: return "chatItemNotChanged"
case .chatItemReaction: return "chatItemReaction"
@@ -948,10 +942,7 @@ public enum ChatResponse: Decodable, Error {
case let .newChatItems(u, chatItems):
let itemsString = chatItems.map { chatItem in String(describing: chatItem) }.joined(separator: "\n")
return withUser(u, itemsString)
case let .forwardPlan(u, chatItemIds, forwardConfirmation): return withUser(u, "items: \(chatItemIds) forwardConfirmation: \(String(describing: forwardConfirmation))")
case let .chatItemsStatusesUpdated(u, chatItems):
let itemsString = chatItems.map { chatItem in String(describing: chatItem) }.joined(separator: "\n")
return withUser(u, itemsString)
case let .chatItemStatusUpdated(u, chatItem): return withUser(u, String(describing: chatItem))
case let .chatItemUpdated(u, chatItem): return withUser(u, String(describing: chatItem))
case let .chatItemNotChanged(u, chatItem): return withUser(u, String(describing: chatItem))
case let .chatItemReaction(u, added, reaction): return withUser(u, "added: \(added)\n\(String(describing: reaction))")
@@ -1140,7 +1131,7 @@ public enum ChatPagination {
public struct ComposedMessage: Encodable {
public var fileSource: CryptoFile?
var quotedItemId: Int64?
public var msgContent: MsgContent
var msgContent: MsgContent
public init(fileSource: CryptoFile? = nil, quotedItemId: Int64? = nil, msgContent: MsgContent) {
self.fileSource = fileSource
@@ -1506,63 +1497,6 @@ public struct KeepAliveOpts: Codable, Equatable {
public static let defaults: KeepAliveOpts = KeepAliveOpts(keepIdle: 30, keepIntvl: 15, keepCnt: 4)
}
public struct NetworkProxy: Equatable, Codable {
public var host: String = ""
public var port: Int = 0
public var auth: NetworkProxyAuth = .username
public var username: String = ""
public var password: String = ""
public static var def: NetworkProxy {
NetworkProxy()
}
public var valid: Bool {
let hostOk = switch NWEndpoint.Host(host) {
case .ipv4: true
case .ipv6: true
default: false
}
return hostOk &&
port > 0 && port <= 65535 &&
NetworkProxy.validCredential(username) && NetworkProxy.validCredential(password)
}
public static func validCredential(_ s: String) -> Bool {
!s.contains(":") && !s.contains("@")
}
public func toProxyString() -> String? {
if !valid { return nil }
var res = ""
switch auth {
case .username:
let usernameTrimmed = username.trimmingCharacters(in: .whitespaces)
let passwordTrimmed = password.trimmingCharacters(in: .whitespaces)
if usernameTrimmed != "" || passwordTrimmed != "" {
res += usernameTrimmed + ":" + passwordTrimmed + "@"
} else {
res += "@"
}
case .isolate: ()
}
if host != "" {
if host.contains(":") {
res += "[\(host.trimmingCharacters(in: [" ", "[", "]"]))]"
} else {
res += host.trimmingCharacters(in: .whitespaces)
}
}
res += ":\(port)"
return res
}
}
public enum NetworkProxyAuth: String, Codable {
case username
case isolate
}
public enum NetworkStatus: Decodable, Equatable {
case unknown
case connected
@@ -1601,13 +1535,6 @@ public enum NetworkStatus: Decodable, Equatable {
}
}
public enum ForwardConfirmation: Decodable, Hashable {
case filesNotAccepted(fileIds: [Int64])
case filesInProgress(filesCount: Int)
case filesMissing(filesCount: Int)
case filesFailed(filesCount: Int)
}
public struct ConnNetworkStatus: Decodable {
public var agentConnId: String
public var networkStatus: NetworkStatus
@@ -2193,13 +2120,11 @@ public struct MigrationFileLinkData: Codable {
public struct NetworkConfig: Codable {
let socksProxy: String?
let networkProxy: NetworkProxy?
let hostMode: HostMode?
let requiredHostMode: Bool?
public init(socksProxy: String?, networkProxy: NetworkProxy?, hostMode: HostMode?, requiredHostMode: Bool?) {
public init(socksProxy: String?, hostMode: HostMode?, requiredHostMode: Bool?) {
self.socksProxy = socksProxy
self.networkProxy = networkProxy
self.hostMode = hostMode
self.requiredHostMode = requiredHostMode
}
@@ -2208,7 +2133,6 @@ public struct MigrationFileLinkData: Codable {
return if let hostMode, let requiredHostMode {
NetworkConfig(
socksProxy: nil,
networkProxy: nil,
hostMode: hostMode == .onionViaSocks ? .onionHost : hostMode,
requiredHostMode: requiredHostMode
)
@@ -2228,7 +2152,6 @@ public struct MigrationFileLinkData: Codable {
public struct AppSettings: Codable, Equatable {
public var networkConfig: NetCfg? = nil
public var networkProxy: NetworkProxy? = nil
public var privacyEncryptLocalFiles: Bool? = nil
public var privacyAskToApproveRelays: Bool? = nil
public var privacyAcceptImages: Bool? = nil
@@ -2260,7 +2183,6 @@ public struct AppSettings: Codable, Equatable {
var empty = AppSettings()
let def = AppSettings.defaults
if networkConfig != def.networkConfig { empty.networkConfig = networkConfig }
if networkProxy != def.networkProxy { empty.networkProxy = networkProxy }
if privacyEncryptLocalFiles != def.privacyEncryptLocalFiles { empty.privacyEncryptLocalFiles = privacyEncryptLocalFiles }
if privacyAskToApproveRelays != def.privacyAskToApproveRelays { empty.privacyAskToApproveRelays = privacyAskToApproveRelays }
if privacyAcceptImages != def.privacyAcceptImages { empty.privacyAcceptImages = privacyAcceptImages }
@@ -2293,7 +2215,6 @@ public struct AppSettings: Codable, Equatable {
public static var defaults: AppSettings {
AppSettings (
networkConfig: NetCfg.defaults,
networkProxy: NetworkProxy.def,
privacyEncryptLocalFiles: true,
privacyAskToApproveRelays: true,
privacyAcceptImages: true,
+1 -6
View File
@@ -35,7 +35,6 @@ public let GROUP_DEFAULT_PRIVACY_ASK_TO_APPROVE_RELAYS = "privacyAskToApproveRel
// replaces DEFAULT_PROFILE_IMAGE_CORNER_RADIUS
public let GROUP_DEFAULT_PROFILE_IMAGE_CORNER_RADIUS = "profileImageCornerRadius"
let GROUP_DEFAULT_NTF_BADGE_COUNT = "ntgBadgeCount"
public let GROUP_DEFAULT_NETWORK_SOCKS_PROXY = "networkSocksProxy"
let GROUP_DEFAULT_NETWORK_USE_ONION_HOSTS = "networkUseOnionHosts"
let GROUP_DEFAULT_NETWORK_SESSION_MODE = "networkSessionMode"
let GROUP_DEFAULT_NETWORK_SMP_PROXY_MODE = "networkSMPProxyMode"
@@ -328,7 +327,6 @@ public class Default<T> {
}
public func getNetCfg() -> NetCfg {
let socksProxy = groupDefaults.string(forKey: GROUP_DEFAULT_NETWORK_SOCKS_PROXY)
let onionHosts = networkUseOnionHostsGroupDefault.get()
let (hostMode, requiredHostMode) = onionHosts.hostMode
let sessionMode = networkSessionModeGroupDefault.get()
@@ -351,7 +349,6 @@ public func getNetCfg() -> NetCfg {
tcpKeepAlive = nil
}
return NetCfg(
socksProxy: socksProxy,
hostMode: hostMode,
requiredHostMode: requiredHostMode,
sessionMode: sessionMode,
@@ -368,13 +365,11 @@ public func getNetCfg() -> NetCfg {
)
}
public func setNetCfg(_ cfg: NetCfg, networkProxy: NetworkProxy?) {
public func setNetCfg(_ cfg: NetCfg) {
networkUseOnionHostsGroupDefault.set(OnionHosts(netCfg: cfg))
networkSessionModeGroupDefault.set(cfg.sessionMode)
networkSMPProxyModeGroupDefault.set(cfg.smpProxyMode)
networkSMPProxyFallbackGroupDefault.set(cfg.smpProxyFallback)
let socksProxy = networkProxy?.toProxyString()
groupDefaults.set(socksProxy, forKey: GROUP_DEFAULT_NETWORK_SOCKS_PROXY)
groupDefaults.set(cfg.tcpConnectTimeout, forKey: GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT)
groupDefaults.set(cfg.tcpTimeout, forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT)
groupDefaults.set(cfg.tcpTimeoutPerKb, forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB)
-14
View File
@@ -2856,13 +2856,6 @@ public enum CIStatus: Decodable, Hashable {
)
}
}
public var isSndRcvd: Bool {
switch self {
case .sndRcvd: return true
default: return false
}
}
}
public enum SndError: Decodable, Hashable {
@@ -3159,13 +3152,6 @@ public enum CIContent: Decodable, ItemContent, Hashable {
default: return false
}
}
public var isSndCall: Bool {
switch self {
case .sndCall: return true
default: return false
}
}
}
public enum MsgDecryptError: String, Decodable, Hashable {
+19 -5
View File
@@ -697,7 +697,7 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "Не може да поканят контактите!";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Отказ";
/* No comment provided by engineer. */
@@ -1897,6 +1897,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Пълно име (незадължително)";
/* No comment provided by engineer. */
"Full name:" = "Пълно име:";
/* No comment provided by engineer. */
"Fully decentralized – visible only to members." = "Напълно децентрализирана – видима е само за членовете.";
@@ -2937,6 +2940,12 @@
/* No comment provided by engineer. */
"Profile images" = "Профилни изображения";
/* No comment provided by engineer. */
"Profile name" = "Име на профила";
/* No comment provided by engineer. */
"Profile name:" = "Име на профила:";
/* No comment provided by engineer. */
"Profile password" = "Профилна парола";
@@ -3202,11 +3211,10 @@
/* No comment provided by engineer. */
"Safer groups" = "По-безопасни групи";
/* alert button
chat item action */
/* chat item action */
"Save" = "Запази";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Запази (и уведоми контактите)";
/* No comment provided by engineer. */
@@ -3221,6 +3229,9 @@
/* No comment provided by engineer. */
"Save archive" = "Запази архив";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Запази настройките за автоматично приемане";
/* No comment provided by engineer. */
"Save group profile" = "Запази профила на групата";
@@ -3242,6 +3253,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Запази сървърите?";
/* No comment provided by engineer. */
"Save settings?" = "Запази настройките?";
/* No comment provided by engineer. */
"Save welcome message?" = "Запази съобщението при посрещане?";
@@ -4416,7 +4430,7 @@
"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 shared only with your contacts.\nSimpleX servers cannot see your profile." = "Вашият профил се съхранява на вашето устройство и се споделя само с вашите контакти.\nSimpleX сървърите не могат да видят вашия профил.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Вашият профил, контакти и доставени съобщения се съхраняват на вашето устройство.";
+13 -5
View File
@@ -562,7 +562,7 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "Nelze pozvat kontakty!";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Zrušit";
/* feature offered item */
@@ -1543,6 +1543,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Celé jméno (volitelně)";
/* No comment provided by engineer. */
"Full name:" = "Celé jméno:";
/* No comment provided by engineer. */
"Fully re-implemented - work in background!" = "Plně přepracováno, prácuje na pozadí!";
@@ -2599,11 +2602,10 @@
/* No comment provided by engineer. */
"Run chat" = "Spustit chat";
/* alert button
chat item action */
/* chat item action */
"Save" = "Uložit";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Uložit (a informovat kontakty)";
/* No comment provided by engineer. */
@@ -2618,6 +2620,9 @@
/* No comment provided by engineer. */
"Save archive" = "Uložit archiv";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Uložit nastavení automatického přijímání";
/* No comment provided by engineer. */
"Save group profile" = "Uložení profilu skupiny";
@@ -2639,6 +2644,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Uložit servery?";
/* No comment provided by engineer. */
"Save settings?" = "Uložit nastavení?";
/* No comment provided by engineer. */
"Save welcome message?" = "Uložit uvítací zprávu?";
@@ -3546,7 +3554,7 @@
"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 shared only with your contacts.\nSimpleX servers cannot see your profile." = "Váš profil je uložen ve vašem zařízení a sdílen pouze s vašimi kontakty.\nServery SimpleX nevidí váš profil.";
/* 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í.";
+32 -18
View File
@@ -781,7 +781,7 @@
/* No comment provided by engineer. */
"Can't message member" = "Mitglied kann nicht benachrichtigt werden";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Abbrechen";
/* No comment provided by engineer. */
@@ -921,16 +921,16 @@
"Chunks uploaded" = "Daten-Pakete hochgeladen";
/* swipe action */
"Clear" = "Entfernen";
"Clear" = "Löschen";
/* No comment provided by engineer. */
"Clear conversation" = "Chat-Inhalte entfernen";
"Clear conversation" = "Chatinhalte löschen";
/* No comment provided by engineer. */
"Clear conversation?" = "Chat-Inhalte entfernen?";
"Clear conversation?" = "Unterhaltung löschen?";
/* No comment provided by engineer. */
"Clear private notes?" = "Private Notizen entfernen?";
"Clear private notes?" = "Private Notizen löschen?";
/* No comment provided by engineer. */
"Clear verification" = "Überprüfung zurücknehmen";
@@ -1167,7 +1167,7 @@
"Continue" = "Weiter";
/* No comment provided by engineer. */
"Conversation deleted!" = "Chat-Inhalte entfernt!";
"Conversation deleted!" = "Unterhaltung gelöscht!";
/* No comment provided by engineer. */
"Copy" = "Kopieren";
@@ -2203,6 +2203,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Vollständiger Name (optional)";
/* No comment provided by engineer. */
"Full name:" = "Vollständiger Name:";
/* No comment provided by engineer. */
"Fully decentralized – visible only to members." = "Vollständig dezentralisiert – nur für Mitglieder sichtbar.";
@@ -2303,7 +2306,7 @@
"Group will be deleted for all members - this cannot be undone!" = "Die Gruppe wird für alle Mitglieder gelöscht. Dies kann nicht rückgängig gemacht werden!";
/* No comment provided by engineer. */
"Group will be deleted for you - this cannot be undone!" = "Die Gruppe wird nur bei Ihnen gelöscht. Dies kann nicht rückgängig gemacht werden!";
"Group will be deleted for you - this cannot be undone!" = "Die Gruppe wird für Sie gelöscht. Dies kann nicht rückgängig gemacht werden!";
/* No comment provided by engineer. */
"Help" = "Hilfe";
@@ -2627,7 +2630,7 @@
"Keep" = "Behalten";
/* No comment provided by engineer. */
"Keep conversation" = "Chat-Inhalte beibehalten";
"Keep conversation" = "Unterhaltung behalten";
/* No comment provided by engineer. */
"Keep the app open to use it from desktop" = "Die App muss geöffnet bleiben, um sie vom Desktop aus nutzen zu können";
@@ -3112,7 +3115,7 @@
"Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**." = "Nur die Endgeräte speichern die Benutzerprofile, Kontakte, Gruppen und Nachrichten, welche über eine **2-Schichten Ende-zu-Ende-Verschlüsselung** gesendet werden.";
/* No comment provided by engineer. */
"Only delete conversation" = "Nur die Chat-Inhalte löschen";
"Only delete conversation" = "Nur die Unterhaltung löschen";
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Gruppen-Präferenzen können nur von Gruppen-Eigentümern geändert werden.";
@@ -3375,6 +3378,12 @@
/* No comment provided by engineer. */
"Profile images" = "Profil-Bilder";
/* No comment provided by engineer. */
"Profile name" = "Profilname";
/* No comment provided by engineer. */
"Profile name:" = "Profilname:";
/* No comment provided by engineer. */
"Profile password" = "Passwort für Profil";
@@ -3451,7 +3460,7 @@
"Rate the app" = "Bewerten Sie die App";
/* No comment provided by engineer. */
"Reachable chat toolbar" = "Chat-Symbolleiste unten";
"Reachable chat toolbar" = "Erreichbare Chat-Symbolleiste";
/* chat item menu */
"React…" = "Reagiere…";
@@ -3706,11 +3715,10 @@
/* No comment provided by engineer. */
"Safer groups" = "Sicherere Gruppen";
/* alert button
chat item action */
/* chat item action */
"Save" = "Speichern";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Speichern (und Kontakte benachrichtigen)";
/* No comment provided by engineer. */
@@ -3728,6 +3736,9 @@
/* No comment provided by engineer. */
"Save archive" = "Archiv speichern";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Einstellungen von \"Automatisch akzeptieren\" speichern";
/* No comment provided by engineer. */
"Save group profile" = "Gruppenprofil speichern";
@@ -3749,6 +3760,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Alle Server speichern?";
/* No comment provided by engineer. */
"Save settings?" = "Einstellungen speichern?";
/* No comment provided by engineer. */
"Save welcome message?" = "Begrüßungsmeldung speichern?";
@@ -3801,7 +3815,7 @@
"Search bar accepts invitation links." = "In der Suchleiste werden nun auch Einladungslinks akzeptiert.";
/* No comment provided by engineer. */
"Search or paste SimpleX link" = "Suchen oder SimpleX-Link einfügen";
"Search or paste SimpleX link" = "Suchen oder fügen Sie den SimpleX-Link ein";
/* network option */
"sec" = "sek";
@@ -4371,7 +4385,7 @@
"The message will be marked as moderated for all members." = "Diese Nachricht wird für alle Mitglieder als moderiert gekennzeichnet.";
/* No comment provided by engineer. */
"The messages will be deleted for all members." = "Die Nachrichten werden für alle Gruppenmitglieder gelöscht.";
"The messages will be deleted for all members." = "Die Nachrichten werden für alle Mitglieder gelöscht werden.";
/* No comment provided by engineer. */
"The messages will be marked as moderated for all members." = "Die Nachrichten werden für alle Mitglieder als moderiert gekennzeichnet werden.";
@@ -4695,7 +4709,7 @@
"Use the app while in the call." = "Die App kann während eines Anrufs genutzt werden.";
/* No comment provided by engineer. */
"Use the app with one hand." = "Die App mit einer Hand bedienen.";
"Use the app with one hand." = "Die App mit einer Hand nutzen.";
/* No comment provided by engineer. */
"User profile" = "Benutzerprofil";
@@ -5007,7 +5021,7 @@
"You can start chat via app Settings / Database or by restarting the app" = "Sie können den Chat über die App-Einstellungen / Datenbank oder durch Neustart der App starten";
/* No comment provided by engineer. */
"You can still view conversation with %@ in the list of chats." = "Sie können in der Chat-Liste weiterhin die Unterhaltung mit %@ einsehen.";
"You can still view conversation with %@ in the list of chats." = "Sie können in der Chatliste weiterhin die Unterhaltung mit %@ einsehen.";
/* No comment provided by engineer. */
"You can turn on SimpleX Lock via Settings." = "Sie können die SimpleX-Sperre über die Einstellungen aktivieren.";
@@ -5175,7 +5189,7 @@
"Your profile **%@** will be shared." = "Ihr Profil **%@** wird 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.";
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt.\nSimpleX-Server können Ihr Profil nicht einsehen.";
/* 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.";
+19 -5
View File
@@ -781,7 +781,7 @@
/* No comment provided by engineer. */
"Can't message member" = "No se pueden enviar mensajes al miembro";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Cancelar";
/* No comment provided by engineer. */
@@ -2203,6 +2203,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Nombre completo (opcional)";
/* No comment provided by engineer. */
"Full name:" = "Nombre completo:";
/* No comment provided by engineer. */
"Fully decentralized – visible only to members." = "Completamente descentralizado y sólo visible para los miembros.";
@@ -3375,6 +3378,12 @@
/* No comment provided by engineer. */
"Profile images" = "Forma de los perfiles";
/* No comment provided by engineer. */
"Profile name" = "Nombre del perfil";
/* No comment provided by engineer. */
"Profile name:" = "Nombre del perfil:";
/* No comment provided by engineer. */
"Profile password" = "Contraseña del perfil";
@@ -3706,11 +3715,10 @@
/* No comment provided by engineer. */
"Safer groups" = "Grupos más seguros";
/* alert button
chat item action */
/* chat item action */
"Save" = "Guardar";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Guardar (y notificar contactos)";
/* No comment provided by engineer. */
@@ -3728,6 +3736,9 @@
/* No comment provided by engineer. */
"Save archive" = "Guardar archivo";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Guardar configuración de auto aceptar";
/* No comment provided by engineer. */
"Save group profile" = "Guardar perfil de grupo";
@@ -3749,6 +3760,9 @@
/* No comment provided by engineer. */
"Save servers?" = "¿Guardar servidores?";
/* No comment provided by engineer. */
"Save settings?" = "¿Guardar configuración?";
/* No comment provided by engineer. */
"Save welcome message?" = "¿Guardar mensaje de bienvenida?";
@@ -5175,7 +5189,7 @@
"Your profile **%@** will be shared." = "El perfil **%@** será compartido.";
/* 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.";
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Tu perfil es almacenado en tu dispositivo y solamente se comparte con tus contactos.\nLos servidores SimpleX no pueden ver tu perfil.";
/* 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.";
+13 -5
View File
@@ -547,7 +547,7 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "Kontakteja ei voi kutsua!";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Peruuta";
/* feature offered item */
@@ -1519,6 +1519,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Koko nimi (valinnainen)";
/* No comment provided by engineer. */
"Full name:" = "Koko nimi:";
/* No comment provided by engineer. */
"Fully re-implemented - work in background!" = "Täysin uudistettu - toimii taustalla!";
@@ -2569,11 +2572,10 @@
/* No comment provided by engineer. */
"Run chat" = "Käynnistä chat";
/* alert button
chat item action */
/* chat item action */
"Save" = "Tallenna";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Tallenna (ja ilmoita kontakteille)";
/* No comment provided by engineer. */
@@ -2588,6 +2590,9 @@
/* No comment provided by engineer. */
"Save archive" = "Tallenna arkisto";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Tallenna automaattisen hyväksynnän asetukset";
/* No comment provided by engineer. */
"Save group profile" = "Tallenna ryhmäprofiili";
@@ -2609,6 +2614,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Tallenna palvelimet?";
/* No comment provided by engineer. */
"Save settings?" = "Tallenna asetukset?";
/* No comment provided by engineer. */
"Save welcome message?" = "Tallenna tervetuloviesti?";
@@ -3504,7 +3512,7 @@
"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 shared only with your contacts.\nSimpleX servers cannot see your profile." = "Profiilisi tallennetaan laitteeseesi ja jaetaan vain yhteystietojesi kanssa.\nSimpleX-palvelimet eivät näe profiiliasi.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Profiilisi, kontaktisi ja toimitetut viestit tallennetaan laitteellesi.";
+19 -5
View File
@@ -781,7 +781,7 @@
/* No comment provided by engineer. */
"Can't message member" = "Impossible d'envoyer un message à ce membre";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Annuler";
/* No comment provided by engineer. */
@@ -2203,6 +2203,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Nom complet (optionnel)";
/* No comment provided by engineer. */
"Full name:" = "Nom complet :";
/* No comment provided by engineer. */
"Fully decentralized – visible only to members." = "Entièrement décentralisé – visible que par ses membres.";
@@ -3375,6 +3378,12 @@
/* No comment provided by engineer. */
"Profile images" = "Images de profil";
/* No comment provided by engineer. */
"Profile name" = "Nom du profil";
/* No comment provided by engineer. */
"Profile name:" = "Nom du profil :";
/* No comment provided by engineer. */
"Profile password" = "Mot de passe de profil";
@@ -3706,11 +3715,10 @@
/* No comment provided by engineer. */
"Safer groups" = "Groupes plus sûrs";
/* alert button
chat item action */
/* chat item action */
"Save" = "Enregistrer";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Enregistrer (et en informer les contacts)";
/* No comment provided by engineer. */
@@ -3728,6 +3736,9 @@
/* No comment provided by engineer. */
"Save archive" = "Enregistrer l'archive";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Enregistrer les paramètres de validation automatique";
/* No comment provided by engineer. */
"Save group profile" = "Enregistrer le profil du groupe";
@@ -3749,6 +3760,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Enregistrer les serveurs ?";
/* No comment provided by engineer. */
"Save settings?" = "Enregistrer les paramètres ?";
/* No comment provided by engineer. */
"Save welcome message?" = "Enregistrer le message d'accueil ?";
@@ -5175,7 +5189,7 @@
"Your profile **%@** will be shared." = "Votre profil **%@** sera partagé.";
/* 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.";
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Votre profil est stocké sur votre appareil et est seulement partagé avec vos contacts.\nLes serveurs SimpleX ne peuvent pas voir votre profil.";
/* 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.";
+91 -77
View File
@@ -29,7 +29,7 @@
"- optionally notify deleted contacts.\n- profile names with spaces.\n- and more!" = "- opcionális értesítés a törölt kapcsolatokról.\n- profilnevek szóközökkel.\n- és még sok más!";
/* No comment provided by engineer. */
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- 5 perc hosszúságú hangüzenetek.\n- egyedi üzenet-eltűnési időkorlát.\n- előzmények szerkesztése.";
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- hangüzenetek legfeljebb 5 perces időtartamig.\n- egyedi eltűnési időhatár megadása.\n- előzmények szerkesztése.";
/* No comment provided by engineer. */
", " = ", ";
@@ -62,7 +62,7 @@
"[Send us email](mailto:chat@simplex.chat)" = "[Küldjön nekünk e-mailt](mailto:chat@simplex.chat)";
/* No comment provided by engineer. */
"[Star on GitHub](https://github.com/simplex-chat/simplex-chat)" = "[Csillagozás a GitHubon](https://github.com/simplex-chat/simplex-chat)";
"[Star on GitHub](https://github.com/simplex-chat/simplex-chat)" = "[Csillag a GitHubon](https://github.com/simplex-chat/simplex-chat)";
/* No comment provided by engineer. */
"**Add contact**: to create a new invitation link, or connect via a link you received." = "**Ismerős hozzáadása**: új meghívó hivatkozás létrehozásához, vagy egy kapott hivatkozáson keresztül történő kapcsolódáshoz.";
@@ -263,7 +263,7 @@
"`a + b`" = "a + b";
/* email text */
"<p>Hi!</p>\n<p><a href=\"%@\">Connect to me via SimpleX Chat</a></p>" = "<p>Üdvözlöm!</p>\n<p><a href=„%@”>Csatlakozzon hozzám a SimpleX Chaten keresztül</a></p>";
"<p>Hi!</p>\n<p><a href=\"%@\">Connect to me via SimpleX Chat</a></p>" = "<p>Üdvözlöm!</p>\n<p><a href=„%@”>Csatlakozzon hozzám a SimpleX Chaten</a></p>";
/* No comment provided by engineer. */
"~strike~" = "\\~áthúzott~";
@@ -343,7 +343,7 @@
"Accept" = "Elfogadás";
/* No comment provided by engineer. */
"Accept connection request?" = "Ismerőskérelem elfogadása?";
"Accept connection request?" = "Kapcsolódási kérelem elfogadása?";
/* notification body */
"Accept contact request from %@?" = "Elfogadja %@ kapcsolat kérését?";
@@ -659,10 +659,10 @@
"Bad desktop address" = "Hibás számítógép cím";
/* integrity error chat item */
"bad message hash" = "hibás az üzenet hasító értéke";
"bad message hash" = "hibás az üzenet ellenőrzőösszege";
/* No comment provided by engineer. */
"Bad message hash" = "Hibás az üzenet hasító értéke";
"Bad message hash" = "Hibás az üzenet ellenőrzőösszege";
/* integrity error chat item */
"bad message ID" = "téves üzenet ID";
@@ -749,7 +749,7 @@
"Call already ended!" = "A hívás már befejeződött!";
/* call status */
"call error" = "híváshiba";
"call error" = "hiba a hívásban";
/* call status */
"call in progress" = "hívás folyamatban";
@@ -781,7 +781,7 @@
/* No comment provided by engineer. */
"Can't message member" = "Nem lehet üzenetet küldeni a tagnak";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Mégse";
/* No comment provided by engineer. */
@@ -1002,7 +1002,7 @@
"Connect incognito" = "Kapcsolódás inkognitóban";
/* No comment provided by engineer. */
"Connect to desktop" = "Társítás számítógéppel";
"Connect to desktop" = "Kapcsolódás számítógéphez";
/* No comment provided by engineer. */
"connect to SimpleX Chat developers." = "Kapcsolódás a SimpleX Chat fejlesztőkhöz.";
@@ -1014,7 +1014,7 @@
"Connect to yourself?" = "Kapcsolódás saját magához?";
/* No comment provided by engineer. */
"Connect to yourself?\nThis is your own one-time link!" = "Kapcsolódás saját magához?\nEz az ön egyszer használatos hivatkozása!";
"Connect to yourself?\nThis is your own one-time link!" = "Kapcsolódás saját magához?\nEz az egyszer használatos hivatkozása!";
/* No comment provided by engineer. */
"Connect to yourself?\nThis is your own SimpleX address!" = "Kapcsolódás saját magához?\nEz az ön SimpleX címe!";
@@ -1038,7 +1038,7 @@
"Connected" = "Kapcsolódva";
/* No comment provided by engineer. */
"Connected desktop" = "Társított számítógép";
"Connected desktop" = "Csatlakoztatott számítógép";
/* rcv group event chat item */
"connected directly" = "közvetlenül kapcsolódva";
@@ -1068,7 +1068,7 @@
"connecting (introduction invitation)" = "kapcsolódás (bemutatkozó meghívó)";
/* call status */
"connecting call" = "kapcsolódási hívás…";
"connecting call" = "hívás kapcsolódik…";
/* No comment provided by engineer. */
"Connecting server…" = "Kapcsolódás a kiszolgálóhoz…";
@@ -1128,7 +1128,7 @@
"Contact allows" = "Ismerős engedélyezi";
/* No comment provided by engineer. */
"Contact already exists" = "Az ismerős már létezik";
"Contact already exists" = "Létező ismerős";
/* No comment provided by engineer. */
"Contact deleted!" = "Ismerős törölve!";
@@ -1197,7 +1197,7 @@
"Create group" = "Csoport létrehozása";
/* No comment provided by engineer. */
"Create group link" = "Csoporthivatkozás létrehozása";
"Create group link" = "Csoportos hivatkozás létrehozása";
/* No comment provided by engineer. */
"Create link" = "Hivatkozás létrehozása";
@@ -1233,7 +1233,7 @@
"Created on %@" = "Létrehozva %@";
/* No comment provided by engineer. */
"Creating archive link" = "Archívum hivatkozás létrehozása";
"Creating archive link" = "Archív hivatkozás létrehozása";
/* No comment provided by engineer. */
"Creating link…" = "Hivatkozás létrehozása…";
@@ -1450,7 +1450,7 @@
"Delete old database?" = "Régi adatbázis törlése?";
/* No comment provided by engineer. */
"Delete pending connection?" = "Függőben lévő ismerőskérelem törlése?";
"Delete pending connection?" = "Függő kapcsolatfelvételi kérések törlése?";
/* No comment provided by engineer. */
"Delete profile" = "Profil törlése";
@@ -1654,7 +1654,7 @@
"Downloading link details" = "Letöltési hivatkozás részletei";
/* No comment provided by engineer. */
"Duplicate display name!" = "Duplikált megjelenített név!";
"Duplicate display name!" = "Duplikált megjelenítési név!";
/* integrity error chat item */
"duplicate message" = "duplikált üzenet";
@@ -1852,7 +1852,7 @@
"Error accessing database file" = "Hiba az adatbázisfájl elérésekor";
/* No comment provided by engineer. */
"Error adding member(s)" = "Hiba a tag(ok) hozzáadásakor";
"Error adding member(s)" = "Hiba a tag(-ok) hozzáadásakor";
/* No comment provided by engineer. */
"Error changing address" = "Hiba a cím megváltoztatásakor";
@@ -1873,7 +1873,7 @@
"Error creating group" = "Hiba a csoport létrehozásakor";
/* No comment provided by engineer. */
"Error creating group link" = "Hiba a csoporthivatkozás létrehozásakor";
"Error creating group link" = "Hiba a csoport hivatkozásának létrehozásakor";
/* No comment provided by engineer. */
"Error creating member contact" = "Hiba az ismerőssel történő kapcsolat létrehozásában";
@@ -2002,7 +2002,7 @@
"Error synchronizing connection" = "Hiba a kapcsolat szinkronizálása közben";
/* No comment provided by engineer. */
"Error updating group link" = "Hiba a csoporthivatkozás frissítésekor";
"Error updating group link" = "Hiba a csoport hivatkozás frissítésekor";
/* No comment provided by engineer. */
"Error updating message" = "Hiba az üzenet frissítésekor";
@@ -2203,6 +2203,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Teljes név (opcionális)";
/* No comment provided by engineer. */
"Full name:" = "Teljes név:";
/* No comment provided by engineer. */
"Fully decentralized – visible only to members." = "Teljesen decentralizált - kizárólag tagok számára látható.";
@@ -2252,10 +2255,10 @@
"Group invitation is no longer valid, it was removed by sender." = "A csoport meghívó már nem érvényes, a küldője törölte.";
/* No comment provided by engineer. */
"Group link" = "Csoporthivatkozás";
"Group link" = "Csoport hivatkozás";
/* No comment provided by engineer. */
"Group links" = "Csoporthivatkozások";
"Group links" = "Csoport hivatkozások";
/* No comment provided by engineer. */
"Group members can add message reactions." = "Csoporttagok üzenetreakciókat adhatnak hozzá.";
@@ -2300,7 +2303,7 @@
"Group welcome message" = "Csoport üdvözlő üzenete";
/* No comment provided by engineer. */
"Group will be deleted for all members - this cannot be undone!" = "A csoport törlésre kerül minden tag számára - ez a művelet nem vonható vissza!";
"Group will be deleted for all members - this cannot be undone!" = "Csoport törlésre kerül minden tag számára - ez a művelet nem vonható vissza!";
/* No comment provided by engineer. */
"Group will be deleted for you - this cannot be undone!" = "A csoport törlésre kerül az ön számára - ez a művelet nem vonható vissza!";
@@ -2441,10 +2444,10 @@
"incognito via contact address link" = "inkognitó a kapcsolattartási hivatkozáson keresztül";
/* chat list item description */
"incognito via group link" = "inkognitó a csoporthivatkozáson keresztül";
"incognito via group link" = "inkognitó a csoportos hivatkozáson keresztül";
/* chat list item description */
"incognito via one-time link" = "inkognitó egy egyszer használatos hivatkozáson keresztül";
"incognito via one-time link" = "inkognitó az egyszer használatos hivatkozáson keresztül";
/* notification */
"Incoming audio call" = "Bejövő hanghívás";
@@ -2498,13 +2501,13 @@
"invalid chat data" = "érvénytelen csevegés adat";
/* No comment provided by engineer. */
"Invalid connection link" = "Érvénytelen kapcsolattartási hivatkozás";
"Invalid connection link" = "Érvénytelen kapcsolati hivatkozás";
/* invalid chat item */
"invalid data" = "érvénytelen adat";
/* No comment provided by engineer. */
"Invalid display name!" = "Érvénytelen megjelenítendő név!";
"Invalid display name!" = "Érvénytelen megjelenítendő felhaszálónév!";
/* No comment provided by engineer. */
"Invalid link" = "Érvénytelen hivatkozás";
@@ -2555,7 +2558,7 @@
"invited to connect" = "meghívta, hogy csatlakozzon";
/* rcv group event chat item */
"invited via your group link" = "meghíva az ön csoporthivatkozásán keresztül";
"invited via your group link" = "meghíva az ön csoport hivatkozásán keresztül";
/* No comment provided by engineer. */
"iOS Keychain is used to securely store passphrase - it allows receiving push notifications." = "Az iOS kulcstartó a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását.";
@@ -2663,7 +2666,7 @@
"left" = "elhagyta a csoportot";
/* email subject */
"Let's talk in SimpleX Chat" = "Beszélgessünk a SimpleX Chatben";
"Let's talk in SimpleX Chat" = "Beszélgessünk a SimpleX Chat-ben";
/* No comment provided by engineer. */
"Light" = "Világos";
@@ -2672,13 +2675,13 @@
"Limitations" = "Korlátozások";
/* No comment provided by engineer. */
"Link mobile and desktop apps! 🔗" = "Társítsa össze a mobil és asztali alkalmazásokat! 🔗";
"Link mobile and desktop apps! 🔗" = "Társítsa össze a mobil és az asztali alkalmazásokat! 🔗";
/* No comment provided by engineer. */
"Linked desktop options" = "Társított számítógép beállítások";
"Linked desktop options" = "Összekapcsolt számítógép beállítások";
/* No comment provided by engineer. */
"Linked desktops" = "Társított számítógépek";
"Linked desktops" = "Összekapcsolt számítógépek";
/* No comment provided by engineer. */
"LIVE" = "ÉLŐ";
@@ -2720,7 +2723,7 @@
"Make sure WebRTC ICE server addresses are in correct format, line separated and are not duplicated." = "Győződjön meg arról, hogy a WebRTC ICE-kiszolgáló címei megfelelő formátumúak, sorszeparáltak és nincsenek duplikálva.";
/* No comment provided by engineer. */
"Many people asked: *if SimpleX has no user identifiers, how can it deliver messages?*" = "Sokan kérdezték: *ha a SimpleX Chatnek nincsenek felhasználói azonosítói, akkor hogyan tud üzeneteket kézbesíteni?*";
"Many people asked: *if SimpleX has no user identifiers, how can it deliver messages?*" = "Sokan kérdezték: *ha a SimpleX-nek nincsenek felhasználói azonosítói, akkor hogyan tud üzeneteket kézbesíteni?*";
/* No comment provided by engineer. */
"Mark deleted for everyone" = "Jelölje meg mindenki számára töröltként";
@@ -2735,7 +2738,7 @@
"Markdown in messages" = "Markdown az üzenetekben";
/* marked deleted chat item preview text */
"marked deleted" = "törlésre jelölve";
"marked deleted" = "töröltnek jelölve";
/* No comment provided by engineer. */
"Max 30 seconds, received instantly." = "Max. 30 másodperc, azonnal érkezett.";
@@ -2900,10 +2903,10 @@
"moderated" = "moderált";
/* No comment provided by engineer. */
"Moderated at" = "Moderálva ekkor:";
"Moderated at" = "Moderálva lett ekkor:";
/* copied message info */
"Moderated at: %@" = "Moderálva ekkor: %@";
"Moderated at: %@" = "Moderálva lett ekkor: %@";
/* marked deleted chat item preview text */
"moderated by %@" = "moderálva lett %@ által";
@@ -2963,7 +2966,7 @@
"New chat experience 🎉" = "Új csevegési élmény 🎉";
/* notification */
"New contact request" = "Új ismerőskérelem";
"New contact request" = "Új kapcsolattartási kérelem";
/* notification */
"New contact:" = "Új kapcsolat:";
@@ -3008,7 +3011,7 @@
"No app password" = "Nincs alkalmazás jelszó";
/* No comment provided by engineer. */
"No contacts selected" = "Nincs kiválasztva ismerős";
"No contacts selected" = "Nem kerültek ismerősök kiválasztásra";
/* No comment provided by engineer. */
"No contacts to add" = "Nincs hozzáadandó ismerős";
@@ -3053,7 +3056,7 @@
"Not compatible!" = "Nem kompatibilis!";
/* No comment provided by engineer. */
"Nothing selected" = "Nincs kiválasztva semmi";
"Nothing selected" = "Semmi sincs kiválasztva";
/* No comment provided by engineer. */
"Notifications" = "Értesítések";
@@ -3091,7 +3094,7 @@
"Old database" = "Régi adatbázis";
/* No comment provided by engineer. */
"Old database archive" = "Régi adatbázis-archívum";
"Old database archive" = "Régi adatbázis archívum";
/* group pref value */
"on" = "bekapcsolva";
@@ -3109,7 +3112,7 @@
"Onion hosts will not be used." = "Onion kiszolgálók nem lesznek használva.";
/* No comment provided by engineer. */
"Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**." = "Csak a klienseszközök tárolják a felhasználói profilokat, névjegyeket, csoportokat és a **2 rétegű végpontok közötti titkosítással** küldött üzeneteket.";
"Only client devices store user profiles, contacts, groups, and messages sent with **2-layer end-to-end encryption**." = "Csak a klienseszközök tárolják a felhasználói profilokat, névjegyeket, csoportokat és a **2 rétegű végponttól-végpontig titkosítással** küldött üzeneteket.";
/* No comment provided by engineer. */
"Only delete conversation" = "Csak a beszélgetés törlése";
@@ -3190,7 +3193,7 @@
"Or scan QR code" = "Vagy QR-kód beolvasása";
/* No comment provided by engineer. */
"Or securely share this file link" = "Vagy ossza meg biztonságosan ezt a fájlhivatkozást";
"Or securely share this file link" = "Vagy a fájl hivítkozásának biztonságos megosztása";
/* No comment provided by engineer. */
"Or show this code" = "Vagy mutassa meg ezt a kódot";
@@ -3232,7 +3235,7 @@
"Password to show" = "Jelszó megjelenítése";
/* past/unknown group member */
"Past member %@" = "%@ (már nem tag)";
"Past member %@" = "Már nem tag - %@";
/* No comment provided by engineer. */
"Paste desktop address" = "Számítógép címének beillesztése";
@@ -3244,13 +3247,13 @@
"Paste link to connect!" = "Hivatkozás beillesztése a kapcsolódáshoz!";
/* No comment provided by engineer. */
"Paste the link you received" = "Kapott hivatkozás beillesztése";
"Paste the link you received" = "Fogadott hivatkozás beillesztése";
/* No comment provided by engineer. */
"peer-to-peer" = "ponttól-pontig";
/* No comment provided by engineer. */
"Pending" = "Függőben";
"Pending" = "Függő";
/* No comment provided by engineer. */
"People can connect to you only via the links you share." = "Az emberek csak az ön által megosztott hivatkozáson keresztül kapcsolódhatnak.";
@@ -3283,7 +3286,7 @@
"Please check that mobile and desktop are connected to the same local network, and that desktop firewall allows the connection.\nPlease share any other issues with the developers." = "Ellenőrizze, hogy a mobil és az asztali számítógép ugyanahhoz a helyi hálózathoz csatlakozik-e, valamint az asztali számítógép tűzfalában engedélyezve van-e a kapcsolat.\nMinden további problémát osszon meg a fejlesztőkkel.";
/* No comment provided by engineer. */
"Please check that you used the correct link or ask your contact to send you another one." = "Ellenőrizze, hogy a megfelelő hivatkozást használta-e, vagy kérje meg az ismerősét, hogy küldjön egy másikat.";
"Please check that you used the correct link or ask your contact to send you another one." = "Ellenőrizze, hogy a megfelelő hivatkozást használta-e, vagy kérje meg ismerősét, hogy küldjön egy másikat.";
/* No comment provided by engineer. */
"Please check your network connection with %@ and try again." = "Ellenőrizze hálózati kapcsolatát a(z) %@ segítségével, és próbálja újra.";
@@ -3375,6 +3378,12 @@
/* No comment provided by engineer. */
"Profile images" = "Profilképek";
/* No comment provided by engineer. */
"Profile name" = "Profilnév";
/* No comment provided by engineer. */
"Profile name:" = "Profil neve:";
/* No comment provided by engineer. */
"Profile password" = "Profiljelszó";
@@ -3484,7 +3493,7 @@
"Receive errors" = "Üzenetfogadási hibák";
/* No comment provided by engineer. */
"received answer…" = "válasz fogadása…";
"received answer…" = "fogadott válasz…";
/* No comment provided by engineer. */
"Received at" = "Fogadva ekkor:";
@@ -3638,7 +3647,7 @@
"Required" = "Szükséges";
/* No comment provided by engineer. */
"Reset" = "Visszaállítás";
"Reset" = "Alaphelyzetbe állítás";
/* No comment provided by engineer. */
"Reset all hints" = "Tippek visszaállítása";
@@ -3650,13 +3659,13 @@
"Reset all statistics?" = "Minden statisztika visszaállítása?";
/* No comment provided by engineer. */
"Reset colors" = "Színek visszaállítása";
"Reset colors" = "Színek alaphelyzetbe állítása";
/* No comment provided by engineer. */
"Reset to app theme" = "Alkalmazás témájának visszaállítása";
/* No comment provided by engineer. */
"Reset to defaults" = "Visszaállítás alaphelyzetbe";
"Reset to defaults" = "Alaphelyzetbe állítás";
/* No comment provided by engineer. */
"Reset to user theme" = "Felhasználó által létrehozott téma visszaállítása";
@@ -3706,11 +3715,10 @@
/* No comment provided by engineer. */
"Safer groups" = "Biztonságosabb csoportok";
/* alert button
chat item action */
/* chat item action */
"Save" = "Mentés";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Mentés (és az ismerősök értesítése)";
/* No comment provided by engineer. */
@@ -3728,6 +3736,9 @@
/* No comment provided by engineer. */
"Save archive" = "Archívum mentése";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Automatikus elfogadási beállítások mentése";
/* No comment provided by engineer. */
"Save group profile" = "Csoportprofil elmentése";
@@ -3749,6 +3760,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Kiszolgálók mentése?";
/* No comment provided by engineer. */
"Save settings?" = "Beállítások mentése?";
/* No comment provided by engineer. */
"Save welcome message?" = "Üdvözlőszöveg mentése?";
@@ -3999,10 +4013,10 @@
"Servers" = "Kiszolgálók";
/* No comment provided by engineer. */
"Servers info" = "Információk a kiszolgálókról";
"Servers info" = "információk a kiszolgálókról";
/* No comment provided by engineer. */
"Servers statistics will be reset - this cannot be undone!" = "A kiszolgálók statisztikái visszaállnak - ez a művelet nem vonható vissza!";
"Servers statistics will be reset - this cannot be undone!" = "A kiszolgálók statisztikái visszaállnak - ez nem vonható vissza!";
/* No comment provided by engineer. */
"Session code" = "Munkamenet kód";
@@ -4122,7 +4136,7 @@
"SimpleX encrypted message or connection event" = "SimpleX titkosított üzenet vagy kapcsolati esemény";
/* simplex link type */
"SimpleX group link" = "SimpleX csoporthivatkozás";
"SimpleX group link" = "SimpleX csoport hivatkozás";
/* chat feature */
"SimpleX links" = "SimpleX hivatkozások";
@@ -4260,7 +4274,7 @@
"Subscriptions ignored" = "Elutasított feliratkozások";
/* No comment provided by engineer. */
"Support SimpleX Chat" = "SimpleX Chat támogatása";
"Support SimpleX Chat" = "Támogassa a SimpleX Chatet";
/* No comment provided by engineer. */
"System" = "Rendszer";
@@ -4329,7 +4343,7 @@
"Thanks to the users – [contribute via Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!" = "Köszönet a felhasználóknak – [hozzájárulás a Weblate-en keresztül](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!";
/* No comment provided by engineer. */
"Thanks to the users – contribute via Weblate!" = "Köszönet a felhasználóknak - hozzájárulás a Weblate-en!";
"Thanks to the users – contribute via Weblate!" = "Köszönet a felhasználóknak - hozzájárulás a Weblaten!";
/* No comment provided by engineer. */
"The 1st platform without any user identifiers – private by design." = "Az első csevegési rendszer bármiféle felhasználó azonosító nélkül - privátra lett tervezre.";
@@ -4344,10 +4358,10 @@
"The attempt to change database passphrase was not completed." = "Az adatbázis jelmondatának megváltoztatására tett kísérlet nem fejeződött be.";
/* No comment provided by engineer. */
"The code you scanned is not a SimpleX link QR code." = "A beolvasott QR-kód nem egy SimpleX QR-kód hivatkozás.";
"The code you scanned is not a SimpleX link QR code." = "A beolvasott kód nem egy SimpleX hivatkozás QR-kód.";
/* No comment provided by engineer. */
"The connection you accepted will be cancelled!" = "Az ön által elfogadott kérelem vissza lesz vonva!";
"The connection you accepted will be cancelled!" = "Az ön által elfogadott kapcsolat vissza lesz vonva!";
/* No comment provided by engineer. */
"The contact you shared this link with will NOT be able to connect!" = "Ismerőse, akivel megosztotta ezt a hivatkozást, NEM fog tudni kapcsolódni!";
@@ -4359,7 +4373,7 @@
"The encryption is working and the new encryption agreement is not required. It may result in connection errors!" = "A titkosítás működik, és új titkosítási egyezményre nincs szükség. Ez kapcsolati hibákat eredményezhet!";
/* No comment provided by engineer. */
"The hash of the previous message is different." = "Az előző üzenet hasító értéke különbözik.";
"The hash of the previous message is different." = "Az előző üzenet ellenőrzőösszege különbözik.";
/* No comment provided by engineer. */
"The ID of the next message is incorrect (less or equal to the previous).\nIt can happen because of some bug or when the connection is compromised." = "A következő üzenet azonosítója hibás (kisebb vagy egyenlő az előzővel).\nEz valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.";
@@ -4428,7 +4442,7 @@
"This device name" = "Ennek az eszköznek a neve";
/* No comment provided by engineer. */
"This display name is invalid. Please choose another name." = "Ez a megjelenített név érvénytelen. Válasszon egy másik nevet.";
"This display name is invalid. Please choose another name." = "Ez a megjelenített felhasználónév érvénytelen. Válasszon egy másik nevet.";
/* No comment provided by engineer. */
"This group has over %lld members, delivery receipts are not sent." = "Ennek a csoportnak több mint %lld tagja van, a kézbesítési jelentések nem kerülnek elküldésre.";
@@ -4437,13 +4451,13 @@
"This group no longer exists." = "Ez a csoport már nem létezik.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "Ez az ön egyszer használatos hivatkozása!";
"This is your own one-time link!" = "Ez az egyszer használatos hivatkozása!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "Ez az ön SimpleX címe!";
/* No comment provided by engineer. */
"This link was used with another mobile device, please create a new link on the desktop." = "Ezt a hivatkozást egy másik mobileszközön már használták, hozzon létre egy új hivatkozást az asztali számítógépén.";
"This link was used with another mobile device, please create a new link on the desktop." = "Ezt a hivatkozást egy másik mobilleszközön már használták, hozzon létre egy új hivatkozást az asztali számítógépén.";
/* No comment provided by engineer. */
"This setting applies to messages in your current chat profile **%@**." = "Ez a beállítás a jelenlegi **%@** profiljában lévő üzenetekre érvényes.";
@@ -4506,10 +4520,10 @@
"Transport sessions" = "Munkamenetek átvitele";
/* No comment provided by engineer. */
"Trying to connect to the server used to receive messages from this contact (error: %@)." = "Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál (hiba: %@).";
"Trying to connect to the server used to receive messages from this contact (error: %@)." = "Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerőstől érkező üzenetek fogadására szolgál (hiba: %@).";
/* No comment provided by engineer. */
"Trying to connect to the server used to receive messages from this contact." = "Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál.";
"Trying to connect to the server used to receive messages from this contact." = "Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerőstől érkező üzenetek fogadására szolgál.";
/* No comment provided by engineer. */
"Turkish interface" = "Török kezelőfelület";
@@ -4584,7 +4598,7 @@
"Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." = "Hacsak nem az iOS hívási felületét használja, engedélyezze a Ne zavarjanak módot a megszakítások elkerülése érdekében.";
/* No comment provided by engineer. */
"Unless your contact deleted the connection or this link was already used, it might be a bug - please report it.\nTo connect, please ask your contact to create another connection link and check that you have a stable network connection." = "Hacsak az ismerőse nem törölte a kapcsolatot, vagy ez a hivatkozás már használatban volt egyszer, lehet hogy ez egy hiba – jelentse a problémát.\nA kapcsolódáshoz kérje meg az ismerősét, hogy hozzon létre egy másik kapcsolattartási hivatkozást, és ellenőrizze, hogy a hálózati kapcsolat stabil-e.";
"Unless your contact deleted the connection or this link was already used, it might be a bug - please report it.\nTo connect, please ask your contact to create another connection link and check that you have a stable network connection." = "Hacsak az ismerőse nem törölte a kapcsolatot, vagy ez a hivatkozás már használatban volt, lehet hogy ez egy hiba – jelentse a problémát.\nA kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsolati hivatkozást, és ellenőrizze, hogy a hálózati kapcsolat stabil-e.";
/* No comment provided by engineer. */
"Unlink" = "Szétkapcsolás";
@@ -4668,7 +4682,7 @@
"Use for new connections" = "Alkalmazás új kapcsolatokhoz";
/* No comment provided by engineer. */
"Use from desktop" = "Társítás számítógéppel";
"Use from desktop" = "Használat számítógépről";
/* No comment provided by engineer. */
"Use iOS call interface" = "Az iOS hívófelület használata";
@@ -4740,10 +4754,10 @@
"via contact address link" = "kapcsolattartási cím-hivatkozáson keresztül";
/* chat list item description */
"via group link" = "a csoporthivatkozáson keresztül";
"via group link" = "csoport hivatkozáson keresztül";
/* chat list item description */
"via one-time link" = "egy egyszer használatos hivatkozáson keresztül";
"via one-time link" = "egyszer használatos hivatkozáson keresztül";
/* No comment provided by engineer. */
"via relay" = "átjátszón keresztül";
@@ -4920,7 +4934,7 @@
"You already have a chat profile with the same display name. Please choose another name." = "Már van egy csevegési profil ugyanezzel a megjelenített névvel. Válasszon egy másik nevet.";
/* No comment provided by engineer. */
"You are already connected to %@." = "Ön már kapcsolódva van ehhez: %@.";
"You are already connected to %@." = "Már kapcsolódva van hozzá: %@.";
/* No comment provided by engineer. */
"You are already connecting to %@." = "Már folyamatban van a kapcsolódás ehhez: %@.";
@@ -4944,7 +4958,7 @@
"You are already joining the group!\nRepeat join request?" = "Csatlakozás folyamatban!\nCsatlakozási kérés megismétlése?";
/* No comment provided by engineer. */
"You are connected to the server used to receive messages from this contact." = "Már kapcsolódott ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál.";
"You are connected to the server used to receive messages from this contact." = "Már kapcsolódott ahhoz a kiszolgálóhoz, amely az adott ismerőstől érkező üzenetek fogadására szolgál.";
/* No comment provided by engineer. */
"you are invited to group" = "meghívást kapott a csoportba";
@@ -4959,7 +4973,7 @@
"you are observer" = "megfigyelő szerep";
/* snd group event chat item */
"you blocked %@" = "ön letiltotta őt: %@";
"you blocked %@" = "ön letiltotta %@-t";
/* No comment provided by engineer. */
"You can accept calls from lock screen, without device and app authentication." = "Hívásokat fogadhat a lezárási képernyőről, eszköz- és alkalmazáshitelesítés nélkül.";
@@ -4983,7 +4997,7 @@
"You can hide or mute a user profile - swipe it to the right." = "Elrejtheti vagy lenémíthatja a felhasználó profiljait - csúsztassa jobbra a profilt.";
/* No comment provided by engineer. */
"You can make it visible to your SimpleX contacts via Settings." = "Láthatóvá teheti a SimpleXbeli ismerősei számára a „Beállításokban”.";
"You can make it visible to your SimpleX contacts via Settings." = "Láthatóvá teheti SimpleX ismerősök számára a Beállításokban.";
/* notification body */
"You can now chat with %@" = "Mostantól küldhet üzeneteket %@ számára";
@@ -5097,7 +5111,7 @@
"You will be connected to group when the group host's device is online, please wait or check later!" = "Akkor lesz kapcsolódva a csoporthoz, amikor a csoport tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!";
/* No comment provided by engineer. */
"You will be connected when group link host's device is online, please wait or check later!" = "Akkor lesz kapcsolódva, amikor a csoporthivatkozás tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!";
"You will be connected when group link host's device is online, please wait or check later!" = "Akkor lesz kapcsolódva, amikor a csoportos hivatkozás tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!";
/* No comment provided by engineer. */
"You will be connected when your connection request is accepted, please wait or check later!" = "Akkor lesz kapcsolódva, ha a kapcsolódási kérelme elfogadásra kerül, várjon, vagy ellenőrizze később!";
@@ -5175,7 +5189,7 @@
"Your profile **%@** will be shared." = "A(z) **%@** nevű profilja megosztásra fog kerülni.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Profilja az eszközön van tárolva, és csak az ismerősökkel kerül megosztásra. A SimpleX kiszolgálók nem látjhatják profilját.";
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Profilja az eszközön van tárolva, és csak az ismerősökkel kerül megosztásra.\nA SimpleX kiszolgálók nem látjhatják profilját.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Profilja, ismerősei és az elküldött üzenetei az eszközön kerülnek tárolásra.";
@@ -5193,7 +5207,7 @@
"Your settings" = "Beállítások";
/* No comment provided by engineer. */
"Your SimpleX address" = "Profil SimpleX címe";
"Your SimpleX address" = "Az ön SimpleX címe";
/* No comment provided by engineer. */
"Your SMP servers" = "SMP kiszolgálók";
+19 -5
View File
@@ -781,7 +781,7 @@
/* No comment provided by engineer. */
"Can't message member" = "Impossibile inviare un messaggio al membro";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Annulla";
/* No comment provided by engineer. */
@@ -2203,6 +2203,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Nome completo (facoltativo)";
/* No comment provided by engineer. */
"Full name:" = "Nome completo:";
/* No comment provided by engineer. */
"Fully decentralized – visible only to members." = "Completamente decentralizzato: visibile solo ai membri.";
@@ -3375,6 +3378,12 @@
/* No comment provided by engineer. */
"Profile images" = "Immagini del profilo";
/* No comment provided by engineer. */
"Profile name" = "Nome del profilo";
/* No comment provided by engineer. */
"Profile name:" = "Nome del profilo:";
/* No comment provided by engineer. */
"Profile password" = "Password del profilo";
@@ -3706,11 +3715,10 @@
/* No comment provided by engineer. */
"Safer groups" = "Gruppi più sicuri";
/* alert button
chat item action */
/* chat item action */
"Save" = "Salva";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Salva (e avvisa i contatti)";
/* No comment provided by engineer. */
@@ -3728,6 +3736,9 @@
/* No comment provided by engineer. */
"Save archive" = "Salva archivio";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Salva le impostazioni di accettazione automatica";
/* No comment provided by engineer. */
"Save group profile" = "Salva il profilo del gruppo";
@@ -3749,6 +3760,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Salvare i server?";
/* No comment provided by engineer. */
"Save settings?" = "Salvare le impostazioni?";
/* No comment provided by engineer. */
"Save welcome message?" = "Salvare il messaggio di benvenuto?";
@@ -5175,7 +5189,7 @@
"Your profile **%@** will be shared." = "Verrà condiviso il tuo profilo **%@**.";
/* 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.";
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Il tuo profilo è memorizzato sul tuo dispositivo e condiviso solo con i tuoi contatti.\nI server di SimpleX non possono vedere il tuo profilo.";
/* 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.";
+13 -5
View File
@@ -619,7 +619,7 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "連絡先を招待できません!";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "中止";
/* feature offered item */
@@ -1594,6 +1594,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "フルネーム (任意):";
/* No comment provided by engineer. */
"Full name:" = "フルネーム:";
/* No comment provided by engineer. */
"Fully re-implemented - work in background!" = "完全に再実装されました - バックグラウンドで動作します!";
@@ -2644,11 +2647,10 @@
/* No comment provided by engineer. */
"Run chat" = "チャット起動";
/* alert button
chat item action */
/* chat item action */
"Save" = "保存";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "保存(連絡先に通知)";
/* No comment provided by engineer. */
@@ -2663,6 +2665,9 @@
/* No comment provided by engineer. */
"Save archive" = "アーカイブを保存";
/* No comment provided by engineer. */
"Save auto-accept settings" = "自動受け入れ設定を保存する";
/* No comment provided by engineer. */
"Save group profile" = "グループプロフィールの保存";
@@ -2684,6 +2689,9 @@
/* No comment provided by engineer. */
"Save servers?" = "サーバを保存しますか?";
/* No comment provided by engineer. */
"Save settings?" = "設定を保存しますか?";
/* No comment provided by engineer. */
"Save welcome message?" = "ウェルカムメッセージを保存しますか?";
@@ -3558,7 +3566,7 @@
"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 shared only with your contacts.\nSimpleX servers cannot see your profile." = "プロフィールはデバイスに保存され、連絡先とのみ共有されます。\nSimpleX サーバーはあなたのプロファイルを参照できません。";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "あなたのプロフィール、連絡先、送信したメッセージがご自分の端末に保存されます。";
+19 -5
View File
@@ -781,7 +781,7 @@
/* No comment provided by engineer. */
"Can't message member" = "Kan geen bericht sturen naar lid";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Annuleren";
/* No comment provided by engineer. */
@@ -2203,6 +2203,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Volledige naam (optioneel)";
/* No comment provided by engineer. */
"Full name:" = "Volledige naam:";
/* No comment provided by engineer. */
"Fully decentralized – visible only to members." = "Volledig gedecentraliseerd – alleen zichtbaar voor leden.";
@@ -3375,6 +3378,12 @@
/* No comment provided by engineer. */
"Profile images" = "Profiel afbeeldingen";
/* No comment provided by engineer. */
"Profile name" = "Profielnaam";
/* No comment provided by engineer. */
"Profile name:" = "Profielnaam:";
/* No comment provided by engineer. */
"Profile password" = "Profiel wachtwoord";
@@ -3706,11 +3715,10 @@
/* No comment provided by engineer. */
"Safer groups" = "Veiligere groepen";
/* alert button
chat item action */
/* chat item action */
"Save" = "Opslaan";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Bewaar (en informeer contacten)";
/* No comment provided by engineer. */
@@ -3728,6 +3736,9 @@
/* No comment provided by engineer. */
"Save archive" = "Bewaar archief";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Sla instellingen voor automatisch accepteren op";
/* No comment provided by engineer. */
"Save group profile" = "Groep profiel opslaan";
@@ -3749,6 +3760,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Servers opslaan?";
/* No comment provided by engineer. */
"Save settings?" = "Instellingen opslaan?";
/* No comment provided by engineer. */
"Save welcome message?" = "Welkom bericht opslaan?";
@@ -5175,7 +5189,7 @@
"Your profile **%@** will be shared." = "Uw profiel **%@** wordt gedeeld.";
/* 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.";
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Uw profiel wordt op uw apparaat opgeslagen en alleen gedeeld met uw contacten.\nSimpleX servers kunnen uw profiel niet zien.";
/* 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.";
+19 -5
View File
@@ -781,7 +781,7 @@
/* No comment provided by engineer. */
"Can't message member" = "Nie można wysłać wiadomości do członka";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Anuluj";
/* No comment provided by engineer. */
@@ -2203,6 +2203,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Pełna nazwa (opcjonalna)";
/* No comment provided by engineer. */
"Full name:" = "Pełna nazwa:";
/* No comment provided by engineer. */
"Fully decentralized – visible only to members." = "W pełni zdecentralizowana – widoczna tylko dla członków.";
@@ -3375,6 +3378,12 @@
/* No comment provided by engineer. */
"Profile images" = "Zdjęcia profilowe";
/* No comment provided by engineer. */
"Profile name" = "Nazwa profilu";
/* No comment provided by engineer. */
"Profile name:" = "Nazwa profilu:";
/* No comment provided by engineer. */
"Profile password" = "Hasło profilu";
@@ -3706,11 +3715,10 @@
/* No comment provided by engineer. */
"Safer groups" = "Bezpieczniejsze grupy";
/* alert button
chat item action */
/* chat item action */
"Save" = "Zapisz";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Zapisz (i powiadom kontakty)";
/* No comment provided by engineer. */
@@ -3728,6 +3736,9 @@
/* No comment provided by engineer. */
"Save archive" = "Zapisz archiwum";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Zapisz ustawienia automatycznej akceptacji";
/* No comment provided by engineer. */
"Save group profile" = "Zapisz profil grupy";
@@ -3749,6 +3760,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Zapisać serwery?";
/* No comment provided by engineer. */
"Save settings?" = "Zapisać ustawienia?";
/* No comment provided by engineer. */
"Save welcome message?" = "Zapisać wiadomość powitalną?";
@@ -5175,7 +5189,7 @@
"Your profile **%@** will be shared." = "Twój profil **%@** zostanie udostępniony.";
/* 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.";
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Twój profil jest przechowywany na urządzeniu i udostępniany tylko Twoim kontaktom.\nSerwery SimpleX nie mogą zobaczyć Twojego profilu.";
/* 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.";
+19 -5
View File
@@ -781,7 +781,7 @@
/* No comment provided by engineer. */
"Can't message member" = "Не удается написать члену группы";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Отменить";
/* No comment provided by engineer. */
@@ -2203,6 +2203,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Полное имя (не обязательно)";
/* No comment provided by engineer. */
"Full name:" = "Полное имя:";
/* No comment provided by engineer. */
"Fully decentralized – visible only to members." = "Группа полностью децентрализована – она видна только членам.";
@@ -3375,6 +3378,12 @@
/* No comment provided by engineer. */
"Profile images" = "Картинки профилей";
/* No comment provided by engineer. */
"Profile name" = "Имя профиля";
/* No comment provided by engineer. */
"Profile name:" = "Имя профиля:";
/* No comment provided by engineer. */
"Profile password" = "Пароль профиля";
@@ -3706,11 +3715,10 @@
/* No comment provided by engineer. */
"Safer groups" = "Более безопасные группы";
/* alert button
chat item action */
/* chat item action */
"Save" = "Сохранить";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Сохранить (и уведомить контакты)";
/* No comment provided by engineer. */
@@ -3728,6 +3736,9 @@
/* No comment provided by engineer. */
"Save archive" = "Сохранить архив";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Сохранить настройки автоприема";
/* No comment provided by engineer. */
"Save group profile" = "Сохранить профиль группы";
@@ -3749,6 +3760,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Сохранить серверы?";
/* No comment provided by engineer. */
"Save settings?" = "Сохранить настройки?";
/* No comment provided by engineer. */
"Save welcome message?" = "Сохранить приветственное сообщение?";
@@ -5175,7 +5189,7 @@
"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 shared only with your contacts.\nSimpleX servers cannot see your profile." = "Ваш профиль хранится на Вашем устройстве и отправляется только Вашим контактам.\nSimpleX серверы не могут получить доступ к Вашему профилю.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Ваш профиль, контакты и доставленные сообщения хранятся на Вашем устройстве.";
+13 -5
View File
@@ -523,7 +523,7 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "ไม่สามารถเชิญผู้ติดต่อได้!";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "ยกเลิก";
/* feature offered item */
@@ -1468,6 +1468,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "ชื่อเต็ม (ไม่บังคับ)";
/* No comment provided by engineer. */
"Full name:" = "ชื่อเต็ม:";
/* No comment provided by engineer. */
"Fully re-implemented - work in background!" = "ดำเนินการใหม่อย่างสมบูรณ์ - ทำงานในพื้นหลัง!";
@@ -2500,11 +2503,10 @@
/* No comment provided by engineer. */
"Run chat" = "เรียกใช้แชท";
/* alert button
chat item action */
/* chat item action */
"Save" = "บันทึก";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "บันทึก (และแจ้งผู้ติดต่อ)";
/* No comment provided by engineer. */
@@ -2519,6 +2521,9 @@
/* No comment provided by engineer. */
"Save archive" = "บันทึกไฟล์เก็บถาวร";
/* No comment provided by engineer. */
"Save auto-accept settings" = "บันทึกการตั้งค่าการยอมรับอัตโนมัติ";
/* No comment provided by engineer. */
"Save group profile" = "บันทึกโปรไฟล์กลุ่ม";
@@ -2540,6 +2545,9 @@
/* No comment provided by engineer. */
"Save servers?" = "บันทึกเซิร์ฟเวอร์?";
/* No comment provided by engineer. */
"Save settings?" = "บันทึกการตั้งค่า?";
/* No comment provided by engineer. */
"Save welcome message?" = "บันทึกข้อความต้อนรับ?";
@@ -3405,7 +3413,7 @@
"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 shared only with your contacts.\nSimpleX servers cannot see your profile." = "โปรไฟล์ของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณและแชร์กับผู้ติดต่อของคุณเท่านั้น\nเซิร์ฟเวอร์ SimpleX ไม่สามารถดูโปรไฟล์ของคุณได้";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "โปรไฟล์ รายชื่อผู้ติดต่อ และข้อความที่ส่งของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณ";
+19 -5
View File
@@ -703,7 +703,7 @@
/* No comment provided by engineer. */
"Can't invite contacts!" = "Kişiler davet edilemiyor!";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "İptal et";
/* No comment provided by engineer. */
@@ -1930,6 +1930,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Bütün isim (opsiyonel)";
/* No comment provided by engineer. */
"Full name:" = "Bütün isim:";
/* No comment provided by engineer. */
"Fully decentralized – visible only to members." = "Tamamiyle merkezi olmayan - sadece kişilere görünür.";
@@ -2988,6 +2991,12 @@
/* No comment provided by engineer. */
"Profile images" = "Profil resimleri";
/* No comment provided by engineer. */
"Profile name" = "Profil ismi";
/* No comment provided by engineer. */
"Profile name:" = "Profil ismi:";
/* No comment provided by engineer. */
"Profile password" = "Profil parolası";
@@ -3262,11 +3271,10 @@
/* No comment provided by engineer. */
"Safer groups" = "Daha güvenli gruplar";
/* alert button
chat item action */
/* chat item action */
"Save" = "Kaydet";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Kaydet (ve kişilere bildir)";
/* No comment provided by engineer. */
@@ -3281,6 +3289,9 @@
/* No comment provided by engineer. */
"Save archive" = "Arşivi kaydet";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Otomatik kabul et ayarlarını kaydet";
/* No comment provided by engineer. */
"Save group profile" = "Grup profilini kaydet";
@@ -3302,6 +3313,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Sunucular kaydedilsin mi?";
/* No comment provided by engineer. */
"Save settings?" = "Ayarlar kaydedilsin mi?";
/* No comment provided by engineer. */
"Save welcome message?" = "Hoşgeldin mesajı kaydedilsin mi?";
@@ -4530,7 +4544,7 @@
"Your profile **%@** will be shared." = "Profiliniz **%@** paylaşılacaktır.";
/* 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.";
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Profiliniz cihazınızda saklanır ve sadece kişilerinizle paylaşılır.\nSimpleX sunucuları profilinizi göremez.";
/* 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.";
+19 -5
View File
@@ -781,7 +781,7 @@
/* No comment provided by engineer. */
"Can't message member" = "Не можу надіслати повідомлення користувачеві";
/* alert button */
/* No comment provided by engineer. */
"Cancel" = "Скасувати";
/* No comment provided by engineer. */
@@ -2203,6 +2203,9 @@
/* No comment provided by engineer. */
"Full name (optional)" = "Повне ім'я (необов'язково)";
/* No comment provided by engineer. */
"Full name:" = "Повне ім'я:";
/* No comment provided by engineer. */
"Fully decentralized – visible only to members." = "Повністю децентралізована - видима лише для учасників.";
@@ -3375,6 +3378,12 @@
/* No comment provided by engineer. */
"Profile images" = "Зображення профілю";
/* No comment provided by engineer. */
"Profile name" = "Назва профілю";
/* No comment provided by engineer. */
"Profile name:" = "Ім'я профілю:";
/* No comment provided by engineer. */
"Profile password" = "Пароль до профілю";
@@ -3706,11 +3715,10 @@
/* No comment provided by engineer. */
"Safer groups" = "Безпечніші групи";
/* alert button
chat item action */
/* chat item action */
"Save" = "Зберегти";
/* alert button */
/* No comment provided by engineer. */
"Save (and notify contacts)" = "Зберегти (і повідомити контактам)";
/* No comment provided by engineer. */
@@ -3728,6 +3736,9 @@
/* No comment provided by engineer. */
"Save archive" = "Зберегти архів";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Зберегти налаштування автоприйому";
/* No comment provided by engineer. */
"Save group profile" = "Зберегти профіль групи";
@@ -3749,6 +3760,9 @@
/* No comment provided by engineer. */
"Save servers?" = "Зберегти сервери?";
/* No comment provided by engineer. */
"Save settings?" = "Зберегти налаштування?";
/* No comment provided by engineer. */
"Save welcome message?" = "Зберегти вітальне повідомлення?";
@@ -5175,7 +5189,7 @@
"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 shared only with your contacts.\nSimpleX servers cannot see your profile." = "Ваш профіль зберігається на вашому пристрої і доступний лише вашим контактам.\nСервери SimpleX не бачать ваш профіль.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Ваш профіль, контакти та доставлені повідомлення зберігаються на вашому пристрої.";
File diff suppressed because it is too large Load Diff
@@ -7,9 +7,6 @@
/* Privacy - Face ID Usage Description */
"NSFaceIDUsageDescription" = "SimpleX 使用Face ID进行本地身份验证";
/* Privacy - Local Network Usage Description */
"NSLocalNetworkUsageDescription" = "SimpleX 使用本地网络访问,允许通过同一网络上的桌面应用程序使用用户聊天配置文件。";
/* Privacy - Microphone Usage Description */
"NSMicrophoneUsageDescription" = "SimpleX 需要麦克风访问权限才能进行音频和视频通话,以及录制语音消息。";
@@ -37,7 +37,7 @@ import java.util.concurrent.TimeUnit
const val TAG = "SIMPLEX"
class SimplexApp: Application(), LifecycleEventObserver {
class SimplexApp: Application(), LifecycleEventObserver, Configuration.Provider {
val chatModel: ChatModel
get() = chatController.chatModel
@@ -66,7 +66,7 @@ class SimplexApp: Application(), LifecycleEventObserver {
}
}
context = this
initHaskell(packageName)
initHaskell()
initMultiplatform()
runMigrations()
tmpDir.deleteRecursively()
@@ -391,4 +391,9 @@ class SimplexApp: Application(), LifecycleEventObserver {
}
}
}
// Fix for an exception:
// WorkManager is not initialized properly. You have explicitly disabled WorkManagerInitializer in your manifest, have not manually called WorkManager#initialize at this point, and your Application does not implement Configuration.Provider.
override val workManagerConfiguration: Configuration
get() = Configuration.Builder().build()
}
+1 -6
View File
@@ -99,15 +99,10 @@ kotlin {
val desktopMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.8.0")
implementation("com.github.Dansoftowner:jSystemThemeDetector:3.8") {
exclude("net.java.dev.jna")
}
// For jSystemThemeDetector only
implementation("net.java.dev.jna:jna-platform:5.14.0")
implementation("com.github.Dansoftowner:jSystemThemeDetector:3.8")
implementation("com.sshtools:two-slices:0.9.0-SNAPSHOT")
implementation("org.slf4j:slf4j-simple:2.0.12")
implementation("uk.co.caprica:vlcj:4.8.3")
implementation("net.java.dev.jna:jna:5.14.0")
implementation("com.github.NanoHttpd.nanohttpd:nanohttpd:efb2ebf85a")
implementation("com.github.NanoHttpd.nanohttpd:nanohttpd-websocket:efb2ebf85a")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
@@ -31,19 +31,22 @@ lateinit var androidAppContext: Context
var mainActivity: WeakReference<FragmentActivity> = WeakReference(null)
var callActivity: WeakReference<ComponentActivity> = WeakReference(null)
fun initHaskell(packageName: String) {
fun initHaskell() {
val socketName = "chat.simplex.app.local.socket.address.listen.native.cmd2" + Random.nextLong(100000)
val s = Semaphore(0)
thread(name="stdout/stderr pipe") {
Log.d(TAG, "starting server")
val server: LocalServerSocket
try {
server = LocalServerSocket(packageName)
} catch (e: IOException) {
Log.e(TAG, e.stackTraceToString())
Log.e(TAG, "Unable to setup local server socket. Contact developers")
s.release()
// Will not have logs from backend
return@thread
var server: LocalServerSocket? = null
for (i in 0..100) {
try {
server = LocalServerSocket(socketName + i)
break
} catch (e: IOException) {
Log.e(TAG, e.stackTraceToString())
}
}
if (server == null) {
throw Error("Unable to setup local server socket. Contact developers")
}
Log.d(TAG, "started server")
s.release()
@@ -57,7 +60,7 @@ fun initHaskell(packageName: String) {
Log.d(TAG, "starting receiver loop")
while (true) {
val line = input.readLine() ?: break
Log.w(TAG, "(stdout/stderr) $line")
Log.w("$TAG (stdout/stderr)", line)
logbuffer.add(line)
}
Log.w(TAG, "exited receiver loop")
@@ -67,7 +70,7 @@ fun initHaskell(packageName: String) {
System.loadLibrary("app-lib")
s.acquire()
pipeStdOutToSocket(packageName)
pipeStdOutToSocket(socketName)
initHS()
}
@@ -129,22 +129,7 @@ class AppPreferences {
val terminalAlwaysVisible = mkBoolPreference(SHARED_PREFS_TERMINAL_ALWAYS_VISIBLE, false)
val networkUseSocksProxy = mkBoolPreference(SHARED_PREFS_NETWORK_USE_SOCKS_PROXY, false)
val networkShowSubscriptionPercentage = mkBoolPreference(SHARED_PREFS_NETWORK_SHOW_SUBSCRIPTION_PERCENTAGE, false)
private val _networkProxy = mkStrPreference(SHARED_PREFS_NETWORK_PROXY_HOST_PORT, json.encodeToString(NetworkProxy()))
val networkProxy: SharedPreference<NetworkProxy> = SharedPreference(
get = fun(): NetworkProxy {
val value = _networkProxy.get() ?: return NetworkProxy()
return try {
if (value.startsWith("{")) {
json.decodeFromString(value)
} else {
NetworkProxy(host = value.substringBefore(":").ifBlank { "localhost" }, port = value.substringAfter(":").toIntOrNull() ?: 9050)
}
} catch (e: Throwable) {
NetworkProxy()
}
},
set = fun(proxy: NetworkProxy) { _networkProxy.set(json.encodeToString(proxy)) }
)
val networkProxyHostPort = mkStrPreference(SHARED_PREFS_NETWORK_PROXY_HOST_PORT, "localhost:9050")
private val _networkSessionMode = mkStrPreference(SHARED_PREFS_NETWORK_SESSION_MODE, TransportSessionMode.default.name)
val networkSessionMode: SharedPreference<TransportSessionMode> = SharedPreference(
get = fun(): TransportSessionMode {
@@ -546,7 +531,7 @@ object ChatController {
suspend fun startChatWithTemporaryDatabase(ctrl: ChatCtrl, netCfg: NetCfg): User? {
Log.d(TAG, "startChatWithTemporaryDatabase")
val migrationActiveUser = apiGetActiveUser(null, ctrl) ?: apiCreateActiveUser(null, Profile(displayName = "Temp", fullName = ""), ctrl = ctrl)
if (!apiSetNetworkConfig(netCfg, ctrl = ctrl)) {
if (!apiSetNetworkConfig(netCfg, ctrl)) {
Log.e(TAG, "Error setting network config, stopping migration")
return null
}
@@ -991,18 +976,16 @@ object ChatController {
throw Exception("failed to set chat item TTL: ${r.responseType} ${r.details}")
}
suspend fun apiSetNetworkConfig(cfg: NetCfg, showAlertOnError: Boolean = true, ctrl: ChatCtrl? = null): Boolean {
suspend fun apiSetNetworkConfig(cfg: NetCfg, ctrl: ChatCtrl? = null): Boolean {
val r = sendCmd(null, CC.APISetNetworkConfig(cfg), ctrl)
return when (r) {
is CR.CmdOk -> true
else -> {
Log.e(TAG, "apiSetNetworkConfig bad response: ${r.responseType} ${r.details}")
if (showAlertOnError) {
AlertManager.shared.showAlertMsg(
generalGetString(MR.strings.error_setting_network_config),
"${r.responseType}: ${r.details}"
)
}
AlertManager.shared.showAlertMsg(
generalGetString(MR.strings.error_setting_network_config),
"${r.responseType}: ${r.details}"
)
false
}
}
@@ -2203,16 +2186,15 @@ object ChatController {
}
}
}
is CR.ChatItemsStatusesUpdated ->
r.chatItems.forEach { chatItem ->
val cInfo = chatItem.chatInfo
val cItem = chatItem.chatItem
if (!cItem.isDeletedContent && active(r.user)) {
withChats {
updateChatItem(cInfo, cItem, status = cItem.meta.itemStatus)
}
is CR.ChatItemStatusUpdated -> {
val cInfo = r.chatItem.chatInfo
val cItem = r.chatItem.chatItem
if (!cItem.isDeletedContent && active(r.user)) {
withChats {
updateChatItem(cInfo, cItem, status = cItem.meta.itemStatus)
}
}
}
is CR.ChatItemUpdated ->
chatItemSimpleUpdate(rhId, r.user, r.chatItem)
is CR.ChatItemReaction -> {
@@ -2794,9 +2776,13 @@ object ChatController {
fun getNetCfg(): NetCfg {
val useSocksProxy = appPrefs.networkUseSocksProxy.get()
val networkProxy = appPrefs.networkProxy.get()
val proxyHostPort = appPrefs.networkProxyHostPort.get()
val socksProxy = if (useSocksProxy) {
networkProxy.toProxyString()
if (proxyHostPort?.startsWith("localhost:") == true) {
proxyHostPort.removePrefix("localhost")
} else {
proxyHostPort ?: ":9050"
}
} else {
null
}
@@ -2838,7 +2824,7 @@ object ChatController {
}
/**
* [AppPreferences.networkProxy] is not changed here, use appPrefs to set it
* [AppPreferences.networkProxyHostPort] is not changed here, use appPrefs to set it
* */
fun setNetCfg(cfg: NetCfg) {
appPrefs.networkUseSocksProxy.set(cfg.useSocksProxy)
@@ -3582,8 +3568,13 @@ data class NetCfg(
val useSocksProxy: Boolean get() = socksProxy != null
val enableKeepAlive: Boolean get() = tcpKeepAlive != null
fun withProxy(proxy: NetworkProxy?, default: String? = ":9050"): NetCfg {
return copy(socksProxy = proxy?.toProxyString() ?: default)
fun withHostPort(hostPort: String?, default: String? = ":9050"): NetCfg {
val socksProxy = if (hostPort?.startsWith("localhost:") == true) {
hostPort.removePrefix("localhost")
} else {
hostPort ?: default
}
return copy(socksProxy = socksProxy)
}
companion object {
@@ -3625,39 +3616,6 @@ data class NetCfg(
}
}
@Serializable
data class NetworkProxy(
val username: String = "",
val password: String = "",
val auth: NetworkProxyAuth = NetworkProxyAuth.ISOLATE,
val host: String = "localhost",
val port: Int = 9050
) {
fun toProxyString(): String {
var res = ""
if (auth == NetworkProxyAuth.USERNAME && (username.isNotBlank() || password.isNotBlank())) {
res += username.trim() + ":" + password.trim() + "@"
} else if (auth == NetworkProxyAuth.USERNAME) {
res += "@"
}
if (host != "localhost") {
res += if (host.contains(':')) "[${host.trim(' ', '[', ']')}]" else host.trim()
}
if (port != 9050 || res.isEmpty()) {
res += ":$port"
}
return res
}
}
@Serializable
enum class NetworkProxyAuth {
@SerialName("isolate")
ISOLATE,
@SerialName("username")
USERNAME,
}
enum class OnionHosts {
NEVER, PREFER, REQUIRED
}
@@ -4873,7 +4831,7 @@ sealed class CR {
@Serializable @SerialName("groupEmpty") class GroupEmpty(val user: UserRef, val group: GroupInfo): CR()
@Serializable @SerialName("userContactLinkSubscribed") class UserContactLinkSubscribed: CR()
@Serializable @SerialName("newChatItems") class NewChatItems(val user: UserRef, val chatItems: List<AChatItem>): CR()
@Serializable @SerialName("chatItemsStatusesUpdated") class ChatItemsStatusesUpdated(val user: UserRef, val chatItems: List<AChatItem>): CR()
@Serializable @SerialName("chatItemStatusUpdated") class ChatItemStatusUpdated(val user: UserRef, val chatItem: AChatItem): CR()
@Serializable @SerialName("chatItemUpdated") class ChatItemUpdated(val user: UserRef, val chatItem: AChatItem): CR()
@Serializable @SerialName("chatItemNotChanged") class ChatItemNotChanged(val user: UserRef, val chatItem: AChatItem): CR()
@Serializable @SerialName("chatItemReaction") class ChatItemReaction(val user: UserRef, val added: Boolean, val reaction: ACIReaction): CR()
@@ -5050,7 +5008,7 @@ sealed class CR {
is GroupEmpty -> "groupEmpty"
is UserContactLinkSubscribed -> "userContactLinkSubscribed"
is NewChatItems -> "newChatItems"
is ChatItemsStatusesUpdated -> "chatItemsStatusesUpdated"
is ChatItemStatusUpdated -> "chatItemStatusUpdated"
is ChatItemUpdated -> "chatItemUpdated"
is ChatItemNotChanged -> "chatItemNotChanged"
is ChatItemReaction -> "chatItemReaction"
@@ -5219,7 +5177,7 @@ sealed class CR {
is GroupEmpty -> withUser(user, json.encodeToString(group))
is UserContactLinkSubscribed -> noDetails()
is NewChatItems -> withUser(user, chatItems.joinToString("\n") { json.encodeToString(it) })
is ChatItemsStatusesUpdated -> withUser(user, chatItems.joinToString("\n") { json.encodeToString(it) })
is ChatItemStatusUpdated -> withUser(user, json.encodeToString(chatItem))
is ChatItemUpdated -> withUser(user, json.encodeToString(chatItem))
is ChatItemNotChanged -> withUser(user, json.encodeToString(chatItem))
is ChatItemReaction -> withUser(user, "added: $added\n${json.encodeToString(reaction)}")
@@ -6225,7 +6183,6 @@ enum class NotificationsMode() {
@Serializable
data class AppSettings(
var networkConfig: NetCfg? = null,
var networkProxy: NetworkProxy? = null,
var privacyEncryptLocalFiles: Boolean? = null,
var privacyAskToApproveRelays: Boolean? = null,
var privacyAcceptImages: Boolean? = null,
@@ -6257,7 +6214,6 @@ data class AppSettings(
val empty = AppSettings()
val def = defaults
if (networkConfig != def.networkConfig) { empty.networkConfig = networkConfig }
if (networkProxy != def.networkProxy) { empty.networkProxy = networkProxy }
if (privacyEncryptLocalFiles != def.privacyEncryptLocalFiles) { empty.privacyEncryptLocalFiles = privacyEncryptLocalFiles }
if (privacyAskToApproveRelays != def.privacyAskToApproveRelays) { empty.privacyAskToApproveRelays = privacyAskToApproveRelays }
if (privacyAcceptImages != def.privacyAcceptImages) { empty.privacyAcceptImages = privacyAcceptImages }
@@ -6295,12 +6251,8 @@ data class AppSettings(
if (net.hostMode == HostMode.Onion) {
net = net.copy(hostMode = HostMode.Public, requiredHostMode = true)
}
if (net.socksProxy != null) {
net = net.copy(socksProxy = networkProxy?.toProxyString())
}
setNetCfg(net)
}
networkProxy?.let { def.networkProxy.set(it) }
privacyEncryptLocalFiles?.let { def.privacyEncryptLocalFiles.set(it) }
privacyAskToApproveRelays?.let { def.privacyAskToApproveRelays.set(it) }
privacyAcceptImages?.let { def.privacyAcceptImages.set(it) }
@@ -6333,7 +6285,6 @@ data class AppSettings(
val defaults: AppSettings
get() = AppSettings(
networkConfig = NetCfg.defaults,
networkProxy = null,
privacyEncryptLocalFiles = true,
privacyAskToApproveRelays = true,
privacyAcceptImages = true,
@@ -6367,7 +6318,6 @@ data class AppSettings(
val def = appPreferences
return defaults.copy(
networkConfig = getNetCfg(),
networkProxy = def.networkProxy.get(),
privacyEncryptLocalFiles = def.privacyEncryptLocalFiles.get(),
privacyAskToApproveRelays = def.privacyAskToApproveRelays.get(),
privacyAcceptImages = def.privacyAcceptImages.get(),
@@ -15,11 +15,10 @@ fun activeCallWaitDeliveryReceipt(scope: CoroutineScope) = scope.launch(Dispatch
if (call == null || call.callState > CallState.InvitationSent) break
val msg = apiResp.resp
if (apiResp.remoteHostId == call.remoteHostId &&
msg is CR.ChatItemsStatusesUpdated &&
msg.chatItems.any {
it.chatInfo.id == call.contact.id && it.chatItem.content is CIContent.SndCall && it.chatItem.meta.itemStatus is CIStatus.SndRcvd
}
) {
msg is CR.ChatItemStatusUpdated &&
msg.chatItem.chatInfo.id == call.contact.id &&
msg.chatItem.chatItem.content is CIContent.SndCall &&
msg.chatItem.chatItem.meta.itemStatus is CIStatus.SndRcvd) {
CallSoundsPlayer.startInCallSound(scope)
break
}
@@ -444,8 +444,8 @@ fun ChatView(staleChatId: State<String?>, onComposed: suspend (chatId: String) -
for (apiResp in controller.messagesChannel) {
val msg = apiResp.resp
if (apiResp.remoteHostId == chatRh &&
msg is CR.ChatItemsStatusesUpdated &&
msg.chatItems.any { it.chatItem.id == cItem.id }
msg is CR.ChatItemStatusUpdated &&
msg.chatItem.chatItem.id == cItem.id
) {
ciInfo = loadChatItemInfo() ?: return@withContext
initialCiInfo = ciInfo
@@ -252,7 +252,7 @@ private fun ActiveUserSection(
}
UserPickerOptionRow(
painterResource(MR.images.ic_qr_code),
if (chatModel.userAddress.value != null) generalGetString(MR.strings.your_simplex_contact_address) else generalGetString(MR.strings.create_simplex_address),
if (chatModel.userAddress.value != null) generalGetString(MR.strings.your_public_contact_address) else generalGetString(MR.strings.create_public_contact_address),
showCustomModal { it, close -> UserAddressView(it, shareViaProfile = it.currentUser.value!!.addressShared, close = close) }, disabled = stopped
)
UserPickerOptionRow(
@@ -4,6 +4,7 @@ import SectionBottomSpacer
import SectionSpacer
import SectionTextFooter
import SectionView
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
@@ -16,7 +17,6 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.common.model.*
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.model.ChatController.getNetCfg
import chat.simplex.common.model.ChatController.startChat
import chat.simplex.common.model.ChatController.startChatWithTemporaryDatabase
@@ -38,6 +38,7 @@ import kotlinx.serialization.*
import java.io.File
import java.net.URLEncoder
import kotlin.math.max
import kotlin.math.sqrt
@Serializable
data class MigrationFileLinkData(
@@ -45,20 +46,16 @@ data class MigrationFileLinkData(
) {
@Serializable
data class NetworkConfig(
// Legacy. Remove in 2025
@SerialName("socksProxy")
val legacySocksProxy: String?,
val networkProxy: NetworkProxy?,
val socksProxy: String?,
val hostMode: HostMode?,
val requiredHostMode: Boolean?
) {
fun hasProxyConfigured(): Boolean = networkProxy != null || legacySocksProxy != null || hostMode == HostMode.Onion
fun hasOnionConfigured(): Boolean = socksProxy != null || hostMode == HostMode.Onion
fun transformToPlatformSupported(): NetworkConfig {
return if (hostMode != null && requiredHostMode != null) {
NetworkConfig(
legacySocksProxy = if (hostMode == HostMode.Onion) legacySocksProxy ?: NetCfg.proxyDefaults.socksProxy else legacySocksProxy,
networkProxy = if (hostMode == HostMode.Onion) networkProxy ?: NetworkProxy() else networkProxy,
socksProxy = if (hostMode == HostMode.Onion) socksProxy ?: NetCfg.proxyDefaults.socksProxy else socksProxy,
hostMode = if (hostMode == HostMode.Onion) HostMode.OnionViaSocks else hostMode,
requiredHostMode = requiredHostMode
)
@@ -573,8 +570,7 @@ private fun MutableState<MigrationFromState>.startUploading(
val cfg = getNetCfg()
val data = MigrationFileLinkData(
networkConfig = MigrationFileLinkData.NetworkConfig(
legacySocksProxy = null,
networkProxy = if (appPrefs.networkUseSocksProxy.get()) appPrefs.networkProxy.get() else null,
socksProxy = cfg.socksProxy,
hostMode = cfg.hostMode,
requiredHostMode = cfg.requiredHostMode
)
@@ -5,15 +5,16 @@ import SectionItemView
import SectionSpacer
import SectionTextFooter
import SectionView
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalClipboardManager
import chat.simplex.common.model.*
import chat.simplex.common.model.AppPreferences.Companion.SHARED_PREFS_MIGRATION_TO_STAGE
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.model.ChatController.getNetCfg
import chat.simplex.common.model.ChatController.startChat
import chat.simplex.common.model.ChatCtrl
@@ -40,10 +41,10 @@ import kotlin.math.max
@Serializable
sealed class MigrationToDeviceState {
@Serializable @SerialName("onion") data class Onion(val link: String, val socksProxy: String?, val networkProxy: NetworkProxy?, val hostMode: HostMode, val requiredHostMode: Boolean): MigrationToDeviceState()
@Serializable @SerialName("downloadProgress") data class DownloadProgress(val link: String, val archiveName: String, val netCfg: NetCfg, val networkProxy: NetworkProxy?): MigrationToDeviceState()
@Serializable @SerialName("archiveImport") data class ArchiveImport(val archiveName: String, val netCfg: NetCfg, val networkProxy: NetworkProxy?): MigrationToDeviceState()
@Serializable @SerialName("passphrase") data class Passphrase(val netCfg: NetCfg, val networkProxy: NetworkProxy?): MigrationToDeviceState()
@Serializable @SerialName("onion") data class Onion(val link: String, val socksProxy: String?, val hostMode: HostMode, val requiredHostMode: Boolean): MigrationToDeviceState()
@Serializable @SerialName("downloadProgress") data class DownloadProgress(val link: String, val archiveName: String, val netCfg: NetCfg): MigrationToDeviceState()
@Serializable @SerialName("archiveImport") data class ArchiveImport(val archiveName: String, val netCfg: NetCfg): MigrationToDeviceState()
@Serializable @SerialName("passphrase") data class Passphrase(val netCfg: NetCfg): MigrationToDeviceState()
companion object {
// Here we check whether it's needed to show migration process after app restart or not
@@ -65,10 +66,10 @@ sealed class MigrationToDeviceState {
null
} else {
val archivePath = File(getMigrationTempFilesDirectory(), state.archiveName)
MigrationToState.ArchiveImportFailed(archivePath.absolutePath, state.netCfg, state.networkProxy)
MigrationToState.ArchiveImportFailed(archivePath.absolutePath, state.netCfg)
}
}
is Passphrase -> MigrationToState.Passphrase("", state.netCfg, state.networkProxy)
is Passphrase -> MigrationToState.Passphrase("", state.netCfg)
}
if (initial == null) {
settings.remove(SHARED_PREFS_MIGRATION_TO_STAGE)
@@ -90,24 +91,16 @@ sealed class MigrationToDeviceState {
@Serializable
sealed class MigrationToState {
@Serializable object PasteOrScanLink: MigrationToState()
@Serializable data class Onion(
val link: String,
// Legacy, remove in 2025
@SerialName("socksProxy")
val legacySocksProxy: String?,
val networkProxy: NetworkProxy?,
val hostMode: HostMode,
val requiredHostMode: Boolean
): MigrationToState()
@Serializable data class DatabaseInit(val link: String, val netCfg: NetCfg, val networkProxy: NetworkProxy?): MigrationToState()
@Serializable data class LinkDownloading(val link: String, val ctrl: ChatCtrl, val user: User, val archivePath: String, val netCfg: NetCfg, val networkProxy: NetworkProxy?): MigrationToState()
@Serializable data class DownloadProgress(val downloadedBytes: Long, val totalBytes: Long, val fileId: Long, val link: String, val archivePath: String, val netCfg: NetCfg, val networkProxy: NetworkProxy?, val ctrl: ChatCtrl?): MigrationToState()
@Serializable data class DownloadFailed(val totalBytes: Long, val link: String, val archivePath: String, val netCfg: NetCfg, val networkProxy: NetworkProxy?): MigrationToState()
@Serializable data class ArchiveImport(val archivePath: String, val netCfg: NetCfg, val networkProxy: NetworkProxy?): MigrationToState()
@Serializable data class ArchiveImportFailed(val archivePath: String, val netCfg: NetCfg, val networkProxy: NetworkProxy?): MigrationToState()
@Serializable data class Passphrase(val passphrase: String, val netCfg: NetCfg, val networkProxy: NetworkProxy?): MigrationToState()
@Serializable data class MigrationConfirmation(val status: DBMigrationResult, val passphrase: String, val useKeychain: Boolean, val netCfg: NetCfg, val networkProxy: NetworkProxy?): MigrationToState()
@Serializable data class Migration(val passphrase: String, val confirmation: chat.simplex.common.views.helpers.MigrationConfirmation, val useKeychain: Boolean, val netCfg: NetCfg, val networkProxy: NetworkProxy?): MigrationToState()
@Serializable data class Onion(val link: String, val socksProxy: String?, val hostMode: HostMode, val requiredHostMode: Boolean): MigrationToState()
@Serializable data class DatabaseInit(val link: String, val netCfg: NetCfg): MigrationToState()
@Serializable data class LinkDownloading(val link: String, val ctrl: ChatCtrl, val user: User, val archivePath: String, val netCfg: NetCfg): MigrationToState()
@Serializable data class DownloadProgress(val downloadedBytes: Long, val totalBytes: Long, val fileId: Long, val link: String, val archivePath: String, val netCfg: NetCfg, val ctrl: ChatCtrl?): MigrationToState()
@Serializable data class DownloadFailed(val totalBytes: Long, val link: String, val archivePath: String, val netCfg: NetCfg): MigrationToState()
@Serializable data class ArchiveImport(val archivePath: String, val netCfg: NetCfg): MigrationToState()
@Serializable data class ArchiveImportFailed(val archivePath: String, val netCfg: NetCfg): MigrationToState()
@Serializable data class Passphrase(val passphrase: String, val netCfg: NetCfg): MigrationToState()
@Serializable data class MigrationConfirmation(val status: DBMigrationResult, val passphrase: String, val useKeychain: Boolean, val netCfg: NetCfg): MigrationToState()
@Serializable data class Migration(val passphrase: String, val confirmation: chat.simplex.common.views.helpers.MigrationConfirmation, val useKeychain: Boolean, val netCfg: NetCfg): MigrationToState()
}
private var MutableState<MigrationToState?>.state: MigrationToState?
@@ -182,16 +175,16 @@ private fun ModalData.SectionByState(
when (val s = migrationState.value) {
null -> {}
is MigrationToState.PasteOrScanLink -> migrationState.PasteOrScanLinkView()
is MigrationToState.Onion -> OnionView(s.link, s.legacySocksProxy, s.networkProxy, s.hostMode, s.requiredHostMode, migrationState)
is MigrationToState.DatabaseInit -> migrationState.DatabaseInitView(s.link, tempDatabaseFile, s.netCfg, s.networkProxy)
is MigrationToState.LinkDownloading -> migrationState.LinkDownloadingView(s.link, s.ctrl, s.user, s.archivePath, tempDatabaseFile, chatReceiver, s.netCfg, s.networkProxy)
is MigrationToState.Onion -> OnionView(s.link, s.socksProxy, s.hostMode, s.requiredHostMode, migrationState)
is MigrationToState.DatabaseInit -> migrationState.DatabaseInitView(s.link, tempDatabaseFile, s.netCfg)
is MigrationToState.LinkDownloading -> migrationState.LinkDownloadingView(s.link, s.ctrl, s.user, s.archivePath, tempDatabaseFile, chatReceiver, s.netCfg)
is MigrationToState.DownloadProgress -> DownloadProgressView(s.downloadedBytes, totalBytes = s.totalBytes)
is MigrationToState.DownloadFailed -> migrationState.DownloadFailedView(s.link, chatReceiver.value, s.archivePath, s.netCfg, s.networkProxy)
is MigrationToState.ArchiveImport -> migrationState.ArchiveImportView(s.archivePath, s.netCfg, s.networkProxy)
is MigrationToState.ArchiveImportFailed -> migrationState.ArchiveImportFailedView(s.archivePath, s.netCfg, s.networkProxy)
is MigrationToState.Passphrase -> migrationState.PassphraseEnteringView(currentKey = s.passphrase, s.netCfg, s.networkProxy)
is MigrationToState.MigrationConfirmation -> migrationState.MigrationConfirmationView(s.status, s.passphrase, s.useKeychain, s.netCfg, s.networkProxy)
is MigrationToState.Migration -> MigrationView(s.passphrase, s.confirmation, s.useKeychain, s.netCfg, s.networkProxy, close)
is MigrationToState.DownloadFailed -> migrationState.DownloadFailedView(s.link, chatReceiver.value, s.archivePath, s.netCfg)
is MigrationToState.ArchiveImport -> migrationState.ArchiveImportView(s.archivePath, s.netCfg)
is MigrationToState.ArchiveImportFailed -> migrationState.ArchiveImportFailedView(s.archivePath, s.netCfg)
is MigrationToState.Passphrase -> migrationState.PassphraseEnteringView(currentKey = s.passphrase, s.netCfg)
is MigrationToState.MigrationConfirmation -> migrationState.MigrationConfirmationView(s.status, s.passphrase, s.useKeychain, s.netCfg)
is MigrationToState.Migration -> MigrationView(s.passphrase, s.confirmation, s.useKeychain, s.netCfg, close)
}
}
@@ -223,24 +216,21 @@ private fun MutableState<MigrationToState?>.PasteLinkView() {
}
@Composable
private fun ModalData.OnionView(link: String, legacyLinkSocksProxy: String?, linkNetworkProxy: NetworkProxy?, hostMode: HostMode, requiredHostMode: Boolean, state: MutableState<MigrationToState?>) {
private fun ModalData.OnionView(link: String, socksProxy: String?, hostMode: HostMode, requiredHostMode: Boolean, state: MutableState<MigrationToState?>) {
val onionHosts = remember { stateGetOrPut("onionHosts") {
getNetCfg().copy(socksProxy = linkNetworkProxy?.toProxyString() ?: legacyLinkSocksProxy, hostMode = hostMode, requiredHostMode = requiredHostMode).onionHosts
getNetCfg().copy(socksProxy = socksProxy, hostMode = hostMode, requiredHostMode = requiredHostMode).onionHosts
} }
val networkUseSocksProxy = remember { stateGetOrPut("networkUseSocksProxy") { linkNetworkProxy != null || legacyLinkSocksProxy != null } }
val networkUseSocksProxy = remember { stateGetOrPut("networkUseSocksProxy") { socksProxy != null } }
val sessionMode = remember { stateGetOrPut("sessionMode") { TransportSessionMode.User} }
val networkProxy = remember { stateGetOrPut("networkProxy") {
linkNetworkProxy
?: if (legacyLinkSocksProxy != null) {
NetworkProxy(host = legacyLinkSocksProxy.substringBefore(":").ifBlank { "localhost" }, port = legacyLinkSocksProxy.substringAfter(":").toIntOrNull() ?: 9050)
} else {
appPrefs.networkProxy.get()
}
}
val networkProxyHostPort = remember { stateGetOrPut("networkHostProxyPort") {
var proxy = (socksProxy ?: chatModel.controller.appPrefs.networkProxyHostPort.get())
if (proxy?.startsWith(":") == true) proxy = "localhost$proxy"
proxy
}
}
val netCfg = rememberSaveable(stateSaver = serializableSaver()) {
mutableStateOf(getNetCfg().withOnionHosts(onionHosts.value).copy(socksProxy = linkNetworkProxy?.toProxyString() ?: legacyLinkSocksProxy, sessionMode = sessionMode.value))
mutableStateOf(getNetCfg().withOnionHosts(onionHosts.value).copy(socksProxy = socksProxy, sessionMode = sessionMode.value))
}
SectionView(stringResource(MR.strings.migrate_to_device_confirm_network_settings).uppercase()) {
@@ -251,12 +241,12 @@ private fun ModalData.OnionView(link: String, legacyLinkSocksProxy: String?, lin
click = {
val updated = netCfg.value
.withOnionHosts(onionHosts.value)
.withProxy(if (networkUseSocksProxy.value) networkProxy.value else null, null)
.withHostPort(if (networkUseSocksProxy.value) networkProxyHostPort.value else null, null)
.copy(
sessionMode = sessionMode.value
)
withBGApi {
state.value = MigrationToState.DatabaseInit(link, updated, if (networkUseSocksProxy.value) networkProxy.value else null)
state.value = MigrationToState.DatabaseInit(link, updated)
}
}
){}
@@ -265,8 +255,8 @@ private fun ModalData.OnionView(link: String, legacyLinkSocksProxy: String?, lin
SectionSpacer()
val networkProxyPref = SharedPreference(get = { networkProxy.value }, set = {
networkProxy.value = it
val networkProxyHostPortPref = SharedPreference(get = { networkProxyHostPort.value }, set = {
networkProxyHostPort.value = it
})
SectionView(stringResource(MR.strings.network_settings_title).uppercase()) {
OnionRelatedLayout(
@@ -274,10 +264,13 @@ private fun ModalData.OnionView(link: String, legacyLinkSocksProxy: String?, lin
networkUseSocksProxy,
onionHosts,
sessionMode,
networkProxyPref,
networkProxyHostPortPref,
toggleSocksProxy = { enable ->
networkUseSocksProxy.value = enable
},
useOnion = {
onionHosts.value = it
},
updateSessionMode = {
sessionMode.value = it
}
@@ -286,13 +279,13 @@ private fun ModalData.OnionView(link: String, legacyLinkSocksProxy: String?, lin
}
@Composable
private fun MutableState<MigrationToState?>.DatabaseInitView(link: String, tempDatabaseFile: File, netCfg: NetCfg, networkProxy: NetworkProxy?) {
private fun MutableState<MigrationToState?>.DatabaseInitView(link: String, tempDatabaseFile: File, netCfg: NetCfg) {
Box {
SectionView(stringResource(MR.strings.migrate_to_device_database_init).uppercase()) {}
ProgressView()
}
LaunchedEffect(Unit) {
prepareDatabase(link, tempDatabaseFile, netCfg, networkProxy)
prepareDatabase(link, tempDatabaseFile, netCfg)
}
}
@@ -304,15 +297,14 @@ private fun MutableState<MigrationToState?>.LinkDownloadingView(
archivePath: String,
tempDatabaseFile: File,
chatReceiver: MutableState<MigrationToChatReceiver?>,
netCfg: NetCfg,
networkProxy: NetworkProxy?
netCfg: NetCfg
) {
Box {
SectionView(stringResource(MR.strings.migrate_to_device_downloading_details).uppercase()) {}
ProgressView()
}
LaunchedEffect(Unit) {
startDownloading(0, ctrl, user, tempDatabaseFile, chatReceiver, link, archivePath, netCfg, networkProxy)
startDownloading(0, ctrl, user, tempDatabaseFile, chatReceiver, link, archivePath, netCfg)
}
}
@@ -327,14 +319,14 @@ private fun DownloadProgressView(downloadedBytes: Long, totalBytes: Long) {
}
@Composable
private fun MutableState<MigrationToState?>.DownloadFailedView(link: String, chatReceiver: MigrationToChatReceiver?, archivePath: String, netCfg: NetCfg, networkProxy: NetworkProxy?) {
private fun MutableState<MigrationToState?>.DownloadFailedView(link: String, chatReceiver: MigrationToChatReceiver?, archivePath: String, netCfg: NetCfg) {
SectionView(stringResource(MR.strings.migrate_to_device_download_failed).uppercase()) {
SettingsActionItemWithContent(
icon = painterResource(MR.images.ic_download),
text = stringResource(MR.strings.migrate_to_device_repeat_download),
textColor = MaterialTheme.colors.primary,
click = {
state = MigrationToState.DatabaseInit(link, netCfg, networkProxy)
state = MigrationToState.DatabaseInit(link, netCfg)
}
) {}
SectionTextFooter(stringResource(MR.strings.migrate_to_device_try_again))
@@ -347,25 +339,25 @@ private fun MutableState<MigrationToState?>.DownloadFailedView(link: String, cha
}
@Composable
private fun MutableState<MigrationToState?>.ArchiveImportView(archivePath: String, netCfg: NetCfg, networkProxy: NetworkProxy?) {
private fun MutableState<MigrationToState?>.ArchiveImportView(archivePath: String, netCfg: NetCfg) {
Box {
SectionView(stringResource(MR.strings.migrate_to_device_importing_archive).uppercase()) {}
ProgressView()
}
LaunchedEffect(Unit) {
importArchive(archivePath, netCfg, networkProxy)
importArchive(archivePath, netCfg)
}
}
@Composable
private fun MutableState<MigrationToState?>.ArchiveImportFailedView(archivePath: String, netCfg: NetCfg, networkProxy: NetworkProxy?) {
private fun MutableState<MigrationToState?>.ArchiveImportFailedView(archivePath: String, netCfg: NetCfg) {
SectionView(stringResource(MR.strings.migrate_to_device_import_failed).uppercase()) {
SettingsActionItemWithContent(
icon = painterResource(MR.images.ic_download),
text = stringResource(MR.strings.migrate_to_device_repeat_import),
textColor = MaterialTheme.colors.primary,
click = {
state = MigrationToState.ArchiveImport(archivePath, netCfg, networkProxy)
state = MigrationToState.ArchiveImport(archivePath, netCfg)
}
) {}
SectionTextFooter(stringResource(MR.strings.migrate_to_device_try_again))
@@ -373,7 +365,7 @@ private fun MutableState<MigrationToState?>.ArchiveImportFailedView(archivePath:
}
@Composable
private fun MutableState<MigrationToState?>.PassphraseEnteringView(currentKey: String, netCfg: NetCfg, networkProxy: NetworkProxy?) {
private fun MutableState<MigrationToState?>.PassphraseEnteringView(currentKey: String, netCfg: NetCfg) {
val currentKey = rememberSaveable { mutableStateOf(currentKey) }
val verifyingPassphrase = rememberSaveable { mutableStateOf(false) }
val useKeychain = rememberSaveable { mutableStateOf(appPreferences.storeDBPassphrase.get()) }
@@ -403,9 +395,9 @@ private fun MutableState<MigrationToState?>.PassphraseEnteringView(currentKey: S
val (status, _) = chatInitTemporaryDatabase(dbAbsolutePrefixPath, key = currentKey.value, confirmation = MigrationConfirmation.YesUp)
val success = status == DBMigrationResult.OK || status == DBMigrationResult.InvalidConfirmation
if (success) {
state = MigrationToState.Migration(currentKey.value, MigrationConfirmation.YesUp, useKeychain.value, netCfg, networkProxy)
state = MigrationToState.Migration(currentKey.value, MigrationConfirmation.YesUp, useKeychain.value, netCfg)
} else if (status is DBMigrationResult.ErrorMigration) {
state = MigrationToState.MigrationConfirmation(status, currentKey.value, useKeychain.value, netCfg, networkProxy)
state = MigrationToState.MigrationConfirmation(status, currentKey.value, useKeychain.value, netCfg)
} else {
showErrorOnMigrationIfNeeded(status)
}
@@ -422,7 +414,7 @@ private fun MutableState<MigrationToState?>.PassphraseEnteringView(currentKey: S
}
@Composable
private fun MutableState<MigrationToState?>.MigrationConfirmationView(status: DBMigrationResult, passphrase: String, useKeychain: Boolean, netCfg: NetCfg, networkProxy: NetworkProxy?) {
private fun MutableState<MigrationToState?>.MigrationConfirmationView(status: DBMigrationResult, passphrase: String, useKeychain: Boolean, netCfg: NetCfg) {
data class Tuple4<A,B,C,D>(val a: A, val b: B, val c: C, val d: D)
val (header: String, button: String?, footer: String, confirmation: MigrationConfirmation?) = when (status) {
is DBMigrationResult.ErrorMigration -> when (val err = status.migrationError) {
@@ -457,7 +449,7 @@ private fun MutableState<MigrationToState?>.MigrationConfirmationView(status: DB
text = button,
textColor = MaterialTheme.colors.primary,
click = {
state = MigrationToState.Migration(passphrase, confirmation, useKeychain, netCfg, networkProxy)
state = MigrationToState.Migration(passphrase, confirmation, useKeychain, netCfg)
}
) {}
}
@@ -466,13 +458,13 @@ private fun MutableState<MigrationToState?>.MigrationConfirmationView(status: DB
}
@Composable
private fun MigrationView(passphrase: String, confirmation: MigrationConfirmation, useKeychain: Boolean, netCfg: NetCfg, networkProxy: NetworkProxy?, close: () -> Unit) {
private fun MigrationView(passphrase: String, confirmation: MigrationConfirmation, useKeychain: Boolean, netCfg: NetCfg, close: () -> Unit) {
Box {
SectionView(stringResource(MR.strings.migrate_to_device_migrating).uppercase()) {}
ProgressView()
}
LaunchedEffect(Unit) {
startChat(passphrase, confirmation, useKeychain, netCfg, networkProxy, close)
startChat(passphrase, confirmation, useKeychain, netCfg, close)
}
}
@@ -484,21 +476,19 @@ private fun ProgressView() {
private suspend fun MutableState<MigrationToState?>.checkUserLink(link: String) {
if (strHasSimplexFileLink(link.trim())) {
val data = MigrationFileLinkData.readFromLink(link)
val hasProxyConfigured = data?.networkConfig?.hasProxyConfigured() ?: false
val hasOnionConfigured = data?.networkConfig?.hasOnionConfigured() ?: false
val networkConfig = data?.networkConfig?.transformToPlatformSupported()
// If any of iOS or Android had onion enabled, show onion screen
if (hasProxyConfigured && networkConfig?.hostMode != null && networkConfig.requiredHostMode != null) {
state = MigrationToState.Onion(link.trim(), networkConfig.legacySocksProxy, networkConfig.networkProxy, networkConfig.hostMode, networkConfig.requiredHostMode)
MigrationToDeviceState.save(MigrationToDeviceState.Onion(link.trim(), networkConfig.legacySocksProxy, networkConfig.networkProxy, networkConfig.hostMode, networkConfig.requiredHostMode))
if (hasOnionConfigured && networkConfig?.hostMode != null && networkConfig.requiredHostMode != null) {
state = MigrationToState.Onion(link.trim(), networkConfig.socksProxy, networkConfig.hostMode, networkConfig.requiredHostMode)
MigrationToDeviceState.save(MigrationToDeviceState.Onion(link.trim(), networkConfig.socksProxy, networkConfig.hostMode, networkConfig.requiredHostMode))
} else {
val current = getNetCfg()
state = MigrationToState.DatabaseInit(link.trim(), current.copy(
socksProxy = null,
socksProxy = networkConfig?.socksProxy,
hostMode = networkConfig?.hostMode ?: current.hostMode,
requiredHostMode = networkConfig?.requiredHostMode ?: current.requiredHostMode
),
networkProxy = null
)
))
}
} else {
AlertManager.shared.showAlertMsg(
@@ -512,7 +502,6 @@ private fun MutableState<MigrationToState?>.prepareDatabase(
link: String,
tempDatabaseFile: File,
netCfg: NetCfg,
networkProxy: NetworkProxy?
) {
withLongRunningApi {
val ctrlAndUser = initTemporaryDatabase(tempDatabaseFile, netCfg)
@@ -524,7 +513,7 @@ private fun MutableState<MigrationToState?>.prepareDatabase(
}
val (ctrl, user) = ctrlAndUser
state = MigrationToState.LinkDownloading(link, ctrl, user, archivePath(), netCfg, networkProxy)
state = MigrationToState.LinkDownloading(link, ctrl, user, archivePath(), netCfg)
}
}
@@ -537,14 +526,13 @@ private fun MutableState<MigrationToState?>.startDownloading(
link: String,
archivePath: String,
netCfg: NetCfg,
networkProxy: NetworkProxy?
) {
withBGApi {
chatReceiver.value = MigrationToChatReceiver(ctrl, tempDatabaseFile) { msg ->
when (msg) {
is CR.RcvFileProgressXFTP -> {
state = MigrationToState.DownloadProgress(msg.receivedSize, msg.totalSize, msg.rcvFileTransfer.fileId, link, archivePath, netCfg, networkProxy, ctrl)
MigrationToDeviceState.save(MigrationToDeviceState.DownloadProgress(link, File(archivePath).name, netCfg, networkProxy))
state = MigrationToState.DownloadProgress(msg.receivedSize, msg.totalSize, msg.rcvFileTransfer.fileId, link, archivePath, netCfg, ctrl)
MigrationToDeviceState.save(MigrationToDeviceState.DownloadProgress(link, File(archivePath).name, netCfg))
}
is CR.RcvStandaloneFileComplete -> {
delay(500)
@@ -552,8 +540,8 @@ private fun MutableState<MigrationToState?>.startDownloading(
if (state == null) {
MigrationToDeviceState.save(null)
} else {
state = MigrationToState.ArchiveImport(archivePath, netCfg, networkProxy)
MigrationToDeviceState.save(MigrationToDeviceState.ArchiveImport(File(archivePath).name, netCfg, networkProxy))
state = MigrationToState.ArchiveImport(archivePath, netCfg)
MigrationToDeviceState.save(MigrationToDeviceState.ArchiveImport(File(archivePath).name, netCfg))
}
}
is CR.RcvFileError -> {
@@ -561,7 +549,7 @@ private fun MutableState<MigrationToState?>.startDownloading(
generalGetString(MR.strings.migrate_to_device_download_failed),
generalGetString(MR.strings.migrate_to_device_file_delete_or_link_invalid)
)
state = MigrationToState.DownloadFailed(totalBytes, link, archivePath, netCfg, networkProxy)
state = MigrationToState.DownloadFailed(totalBytes, link, archivePath, netCfg)
}
is CR.ChatRespError -> {
if (msg.chatError is ChatError.ChatErrorChat && msg.chatError.errorType is ChatErrorType.NoRcvFileUser) {
@@ -569,7 +557,7 @@ private fun MutableState<MigrationToState?>.startDownloading(
generalGetString(MR.strings.migrate_to_device_download_failed),
generalGetString(MR.strings.migrate_to_device_file_delete_or_link_invalid)
)
state = MigrationToState.DownloadFailed(totalBytes, link, archivePath, netCfg, networkProxy)
state = MigrationToState.DownloadFailed(totalBytes, link, archivePath, netCfg)
} else {
Log.d(TAG, "unsupported error: ${msg.responseType}, ${json.encodeToString(msg.chatError)}")
}
@@ -581,7 +569,7 @@ private fun MutableState<MigrationToState?>.startDownloading(
val (res, error) = controller.downloadStandaloneFile(user, link, CryptoFile.plain(File(archivePath).path), ctrl)
if (res == null) {
state = MigrationToState.DownloadFailed(totalBytes, link, archivePath, netCfg, networkProxy)
state = MigrationToState.DownloadFailed(totalBytes, link, archivePath, netCfg)
AlertManager.shared.showAlertMsg(
generalGetString(MR.strings.migrate_to_device_error_downloading_archive),
error
@@ -590,7 +578,7 @@ private fun MutableState<MigrationToState?>.startDownloading(
}
}
private fun MutableState<MigrationToState?>.importArchive(archivePath: String, netCfg: NetCfg, networkProxy: NetworkProxy?) {
private fun MutableState<MigrationToState?>.importArchive(archivePath: String, netCfg: NetCfg) {
withLongRunningApi {
try {
if (ChatController.ctrl == null || ChatController.ctrl == -1L) {
@@ -604,14 +592,14 @@ private fun MutableState<MigrationToState?>.importArchive(archivePath: String, n
if (archiveErrors.isNotEmpty()) {
showArchiveImportedWithErrorsAlert(archiveErrors)
}
state = MigrationToState.Passphrase("", netCfg, networkProxy)
MigrationToDeviceState.save(MigrationToDeviceState.Passphrase(netCfg, networkProxy))
state = MigrationToState.Passphrase("", netCfg)
MigrationToDeviceState.save(MigrationToDeviceState.Passphrase(netCfg))
} catch (e: Exception) {
state = MigrationToState.ArchiveImportFailed(archivePath, netCfg, networkProxy)
state = MigrationToState.ArchiveImportFailed(archivePath, netCfg)
AlertManager.shared.showAlertMsg (generalGetString(MR.strings.error_importing_database), e.stackTraceToString())
}
} catch (e: Exception) {
state = MigrationToState.ArchiveImportFailed(archivePath, netCfg, networkProxy)
state = MigrationToState.ArchiveImportFailed(archivePath, netCfg)
AlertManager.shared.showAlertMsg (generalGetString(MR.strings.error_deleting_database), e.stackTraceToString())
}
}
@@ -621,7 +609,7 @@ private suspend fun stopArchiveDownloading(fileId: Long, ctrl: ChatCtrl) {
controller.apiCancelFile(null, fileId, ctrl)
}
private fun startChat(passphrase: String, confirmation: MigrationConfirmation, useKeychain: Boolean, netCfg: NetCfg, networkProxy: NetworkProxy?, close: () -> Unit) {
private fun startChat(passphrase: String, confirmation: MigrationConfirmation, useKeychain: Boolean, netCfg: NetCfg, close: () -> Unit) {
if (useKeychain) {
ksDatabasePassword.set(passphrase)
} else {
@@ -633,8 +621,7 @@ private fun startChat(passphrase: String, confirmation: MigrationConfirmation, u
try {
initChatController(useKey = passphrase, confirmMigrations = confirmation) { CompletableDeferred(false) }
val appSettings = controller.apiGetAppSettings(AppSettings.current.prepareForExport()).copy(
networkConfig = netCfg,
networkProxy = networkProxy
networkConfig = netCfg
)
finishMigration(appSettings, close)
} catch (e: Exception) {
@@ -68,7 +68,7 @@ fun ModalData.NewChatView(rh: RemoteHostInfo?, selection: NewChatOption, showQRC
* Otherwise, it will be called here AFTER [AddContactLearnMore] is launched and will clear the value too soon.
* It will be dropped automatically when connection established or when user goes away from this screen.
**/
if (chatModel.showingInvitation.value != null && ModalManager.start.openModalCount() <= 1) {
if (chatModel.showingInvitation.value != null && ModalManager.start.openModalCount() == 1) {
val conn = contactConnection.value
if (chatModel.showingInvitation.value?.connChatUsed == false && conn != null) {
AlertManager.shared.showAlertDialog(
@@ -308,7 +308,6 @@ fun ActiveProfilePicker(
switchingProfile.value = true
withApi {
try {
appPreferences.incognito.set(false)
var updatedConn: PendingContactConnection? = null;
if (contactConnection != null) {
@@ -362,7 +361,6 @@ fun ActiveProfilePicker(
switchingProfile.value = true
withApi {
try {
appPreferences.incognito.set(true)
val conn = controller.apiSetConnectionIncognito(rhId, contactConnection.pccConnId, true)
if (conn != null) {
withChats {
@@ -1,10 +1,10 @@
package chat.simplex.common.views.usersettings
import SectionBottomSpacer
import SectionCustomFooter
import SectionDividerSpaced
import SectionItemView
import SectionItemWithValue
import SectionTextFooter
import SectionView
import SectionViewSelectableCards
import androidx.compose.desktop.ui.tooling.preview.Preview
@@ -40,10 +40,12 @@ fun ModalData.AdvancedNetworkSettingsView(showModal: (ModalData.() -> Unit) -> U
val currentCfg = remember { stateGetOrPut("currentCfg") { controller.getNetCfg() } }
val currentCfgVal = currentCfg.value // used only on initialization
val onionHosts = remember { mutableStateOf(currentCfgVal.onionHosts) }
val sessionMode = remember { mutableStateOf(currentCfgVal.sessionMode) }
val smpProxyMode = remember { mutableStateOf(currentCfgVal.smpProxyMode) }
val smpProxyFallback = remember { mutableStateOf(currentCfgVal.smpProxyFallback) }
val networkUseSocksProxy: MutableState<Boolean> = remember { mutableStateOf(currentCfgVal.useSocksProxy) }
val networkTCPConnectTimeout = remember { mutableStateOf(currentCfgVal.tcpConnectTimeout) }
val networkTCPTimeout = remember { mutableStateOf(currentCfgVal.tcpTimeout) }
val networkTCPTimeoutPerKb = remember { mutableStateOf(currentCfgVal.tcpTimeoutPerKb) }
@@ -88,10 +90,11 @@ fun ModalData.AdvancedNetworkSettingsView(showModal: (ModalData.() -> Unit) -> U
tcpKeepAlive = tcpKeepAlive,
smpPingInterval = networkSMPPingInterval.value,
smpPingCount = networkSMPPingCount.value
).withOnionHosts(currentCfg.value.onionHosts)
).withOnionHosts(onionHosts.value)
}
fun updateView(cfg: NetCfg) {
onionHosts.value = cfg.onionHosts
sessionMode.value = cfg.sessionMode
smpProxyMode.value = cfg.smpProxyMode
smpProxyFallback.value = cfg.smpProxyFallback
@@ -145,7 +148,10 @@ fun ModalData.AdvancedNetworkSettingsView(showModal: (ModalData.() -> Unit) -> U
) {
AdvancedNetworkSettingsLayout(
currentRemoteHost = currentRemoteHost,
networkUseSocksProxy = networkUseSocksProxy,
developerTools = developerTools,
onionHosts = onionHosts,
useOnion = { onionHosts.value = it; currentCfg.value = currentCfg.value.withOnionHosts(it) },
sessionMode = sessionMode,
smpProxyMode = smpProxyMode,
smpProxyFallback = smpProxyFallback,
@@ -177,7 +183,10 @@ fun ModalData.AdvancedNetworkSettingsView(showModal: (ModalData.() -> Unit) -> U
@Composable fun AdvancedNetworkSettingsLayout(
currentRemoteHost: RemoteHostInfo?,
networkUseSocksProxy: State<Boolean>,
developerTools: Boolean,
onionHosts: MutableState<OnionHosts>,
useOnion: (OnionHosts) -> Unit,
sessionMode: MutableState<TransportSessionMode>,
smpProxyMode: MutableState<SMPProxyMode>,
smpProxyFallback: MutableState<SMPProxyFallback>,
@@ -214,7 +223,21 @@ fun ModalData.AdvancedNetworkSettingsView(showModal: (ModalData.() -> Unit) -> U
SMPProxyFallbackPicker(smpProxyFallback, showModal, updateSMPProxyFallback, enabled = remember { derivedStateOf { smpProxyMode.value != SMPProxyMode.Never } })
SettingsPreferenceItem(painterResource(MR.images.ic_arrow_forward), stringResource(MR.strings.private_routing_show_message_status), chatModel.controller.appPrefs.showSentViaProxy)
}
SectionTextFooter(stringResource(MR.strings.private_routing_explanation))
SectionCustomFooter {
Text(stringResource(MR.strings.private_routing_explanation))
}
SectionDividerSpaced(maxTopPadding = true)
}
if (currentRemoteHost == null && networkUseSocksProxy.value) {
SectionView(stringResource(MR.strings.network_socks_proxy).uppercase()) {
UseOnionHosts(onionHosts, networkUseSocksProxy, showModal, useOnion)
SectionCustomFooter {
Column {
Text(annotatedStringResource(MR.strings.disable_onion_hosts_when_not_supported))
}
}
}
SectionDividerSpaced(maxTopPadding = true)
}
@@ -539,6 +562,7 @@ fun PreviewAdvancedNetworkSettingsLayout() {
SimpleXTheme {
AdvancedNetworkSettingsLayout(
currentRemoteHost = null,
networkUseSocksProxy = remember { mutableStateOf(false) },
developerTools = false,
sessionMode = remember { mutableStateOf(TransportSessionMode.User) },
smpProxyMode = remember { mutableStateOf(SMPProxyMode.Never) },
@@ -553,6 +577,8 @@ fun PreviewAdvancedNetworkSettingsLayout() {
networkTCPKeepIdle = remember { mutableStateOf(10) },
networkTCPKeepIntvl = remember { mutableStateOf(10) },
networkTCPKeepCnt = remember { mutableStateOf(10) },
onionHosts = remember { mutableStateOf(OnionHosts.PREFER) },
useOnion = {},
updateSessionMode = {},
updateSMPProxyMode = {},
updateSMPProxyFallback = {},
@@ -1,10 +1,10 @@
package chat.simplex.common.views.usersettings
import SectionBottomSpacer
import SectionCustomFooter
import SectionDividerSpaced
import SectionItemView
import SectionItemWithValue
import SectionTextFooter
import SectionView
import SectionViewSelectable
import TextIconSpaced
@@ -37,11 +37,10 @@ fun NetworkAndServersView() {
val netCfg = remember { chatModel.controller.getNetCfg() }
val networkUseSocksProxy: MutableState<Boolean> = remember { mutableStateOf(netCfg.useSocksProxy) }
val proxyPort = remember { derivedStateOf { appPrefs.networkProxy.state.value.port } }
val proxyPort = remember { derivedStateOf { chatModel.controller.appPrefs.networkProxyHostPort.state.value?.split(":")?.lastOrNull()?.toIntOrNull() ?: 9050 } }
NetworkAndServersLayout(
currentRemoteHost = currentRemoteHost,
networkUseSocksProxy = networkUseSocksProxy,
onionHosts = remember { mutableStateOf(netCfg.onionHosts) },
toggleSocksProxy = { enable ->
val def = NetCfg.defaults
val proxyDef = NetCfg.proxyDefaults
@@ -52,7 +51,7 @@ fun NetworkAndServersView() {
confirmText = generalGetString(MR.strings.confirm_verb),
onConfirm = {
withBGApi {
var conf = controller.getNetCfg().withProxy(controller.appPrefs.networkProxy.get())
var conf = controller.getNetCfg().withHostPort(controller.appPrefs.networkProxyHostPort.get())
if (conf.tcpConnectTimeout == def.tcpConnectTimeout) {
conf = conf.copy(tcpConnectTimeout = proxyDef.tcpConnectTimeout)
}
@@ -105,7 +104,6 @@ fun NetworkAndServersView() {
@Composable fun NetworkAndServersLayout(
currentRemoteHost: RemoteHostInfo?,
networkUseSocksProxy: MutableState<Boolean>,
onionHosts: MutableState<OnionHosts>,
toggleSocksProxy: (Boolean) -> Unit,
) {
val m = chatModel
@@ -122,10 +120,14 @@ fun NetworkAndServersView() {
if (currentRemoteHost == null) {
UseSocksProxySwitch(networkUseSocksProxy, toggleSocksProxy)
SettingsActionItem(painterResource(MR.images.ic_settings_ethernet), stringResource(MR.strings.network_socks_proxy_settings), { showCustomModal { SocksProxySettings(networkUseSocksProxy.value, appPrefs.networkProxy, onionHosts, sessionMode = appPrefs.networkSessionMode.get(), false, it) }})
SettingsActionItem(painterResource(MR.images.ic_settings_ethernet), stringResource(MR.strings.network_socks_proxy_settings), { showCustomModal { SocksProxySettings(networkUseSocksProxy.value, appPrefs.networkProxyHostPort, false, it) }})
SettingsActionItem(painterResource(MR.images.ic_cable), stringResource(MR.strings.network_settings), { ModalManager.start.showCustomModal { AdvancedNetworkSettingsView(showModal, it) } })
if (networkUseSocksProxy.value) {
SectionTextFooter(annotatedStringResource(MR.strings.socks_proxy_setting_limitations))
SectionCustomFooter {
Column {
Text(annotatedStringResource(MR.strings.socks_proxy_setting_limitations))
}
}
SectionDividerSpaced(maxTopPadding = true)
} else {
SectionDividerSpaced()
@@ -156,14 +158,16 @@ fun NetworkAndServersView() {
networkUseSocksProxy: MutableState<Boolean>,
onionHosts: MutableState<OnionHosts>,
sessionMode: MutableState<TransportSessionMode>,
networkProxy: SharedPreference<NetworkProxy>,
networkProxyHostPort: SharedPreference<String?>,
toggleSocksProxy: (Boolean) -> Unit,
useOnion: (OnionHosts) -> Unit,
updateSessionMode: (TransportSessionMode) -> Unit,
) {
val showModal = { it: @Composable ModalData.() -> Unit -> ModalManager.fullscreen.showModal(content = it) }
val showCustomModal = { it: @Composable (close: () -> Unit) -> Unit -> ModalManager.fullscreen.showCustomModal { close -> it(close) }}
UseSocksProxySwitch(networkUseSocksProxy, toggleSocksProxy)
SettingsActionItem(painterResource(MR.images.ic_settings_ethernet), stringResource(MR.strings.network_socks_proxy_settings), { showCustomModal { SocksProxySettings(networkUseSocksProxy.value, networkProxy, onionHosts, sessionMode.value, true, it) } })
SettingsActionItem(painterResource(MR.images.ic_settings_ethernet), stringResource(MR.strings.network_socks_proxy_settings), { showCustomModal { SocksProxySettings(networkUseSocksProxy.value, networkProxyHostPort, true, it) } })
UseOnionHosts(onionHosts, networkUseSocksProxy, showModal, useOnion)
if (developerTools) {
SessionModePicker(sessionMode, showModal, updateSessionMode)
}
@@ -201,98 +205,46 @@ fun UseSocksProxySwitch(
@Composable
fun SocksProxySettings(
networkUseSocksProxy: Boolean,
networkProxy: SharedPreference<NetworkProxy>,
onionHosts: MutableState<OnionHosts>,
sessionMode: TransportSessionMode,
networkProxyHostPort: SharedPreference<String?> = appPrefs.networkProxyHostPort,
migration: Boolean,
close: () -> Unit
) {
val networkProxySaved by remember { networkProxy.state }
val onionHostsSaved = remember { mutableStateOf(onionHosts.value) }
val usernameUnsaved = rememberSaveable(stateSaver = TextFieldValue.Saver) {
mutableStateOf(TextFieldValue(networkProxySaved.username))
}
val passwordUnsaved = rememberSaveable(stateSaver = TextFieldValue.Saver) {
mutableStateOf(TextFieldValue(networkProxySaved.password))
}
val defaultHostPort = remember { "localhost:9050" }
val hostPortSaved by remember { networkProxyHostPort.state }
val hostUnsaved = rememberSaveable(stateSaver = TextFieldValue.Saver) {
mutableStateOf(TextFieldValue(networkProxySaved.host))
mutableStateOf(TextFieldValue(hostPortSaved?.split(":")?.firstOrNull() ?: "localhost"))
}
val portUnsaved = rememberSaveable(stateSaver = TextFieldValue.Saver) {
mutableStateOf(TextFieldValue(networkProxySaved.port.toString()))
mutableStateOf(TextFieldValue(hostPortSaved?.split(":")?.lastOrNull() ?: "9050"))
}
val proxyAuthRandomUnsaved = rememberSaveable { mutableStateOf(networkProxySaved.auth == NetworkProxyAuth.ISOLATE) }
LaunchedEffect(proxyAuthRandomUnsaved.value) {
if (!proxyAuthRandomUnsaved.value && onionHosts.value != OnionHosts.NEVER) {
onionHosts.value = OnionHosts.NEVER
}
}
val proxyAuthModeUnsaved = remember(proxyAuthRandomUnsaved.value, usernameUnsaved.value.text, passwordUnsaved.value.text) {
derivedStateOf {
if (proxyAuthRandomUnsaved.value) {
NetworkProxyAuth.ISOLATE
} else {
NetworkProxyAuth.USERNAME
}
}
}
val save: (Boolean) -> Unit = { closeOnSuccess ->
val oldValue = networkProxy.get()
usernameUnsaved.value = usernameUnsaved.value.copy(if (proxyAuthModeUnsaved.value == NetworkProxyAuth.USERNAME) usernameUnsaved.value.text.trim() else "")
passwordUnsaved.value = passwordUnsaved.value.copy(if (proxyAuthModeUnsaved.value == NetworkProxyAuth.USERNAME) passwordUnsaved.value.text.trim() else "")
hostUnsaved.value = hostUnsaved.value.copy(hostUnsaved.value.text.trim())
portUnsaved.value = portUnsaved.value.copy(portUnsaved.value.text.trim())
networkProxy.set(
NetworkProxy(
username = usernameUnsaved.value.text,
password = passwordUnsaved.value.text,
host = hostUnsaved.value.text,
port = portUnsaved.value.text.toIntOrNull() ?: 9050,
auth = proxyAuthModeUnsaved.value
)
)
val oldCfg = controller.getNetCfg()
val cfg = oldCfg.withOnionHosts(onionHosts.value)
val oldOnionHosts = onionHostsSaved.value
onionHostsSaved.value = onionHosts.value
if (!migration) {
controller.setNetCfg(cfg)
}
val save = {
val oldValue = networkProxyHostPort.get()
networkProxyHostPort.set(hostUnsaved.value.text + ":" + portUnsaved.value.text)
if (networkUseSocksProxy && !migration) {
withBGApi {
if (controller.apiSetNetworkConfig(cfg, showAlertOnError = false)) {
onionHosts.value = cfg.onionHosts
onionHostsSaved.value = onionHosts.value
if (closeOnSuccess) {
close()
}
} else {
controller.setNetCfg(oldCfg)
networkProxy.set(oldValue)
onionHostsSaved.value = oldOnionHosts
showWrongProxyConfigAlert()
if (!controller.apiSetNetworkConfig(controller.getNetCfg())) {
networkProxyHostPort.set(oldValue)
}
}
}
}
val saveDisabled =
(
networkProxySaved.username == usernameUnsaved.value.text.trim() &&
networkProxySaved.password == passwordUnsaved.value.text.trim() &&
networkProxySaved.host == hostUnsaved.value.text.trim() &&
networkProxySaved.port.toString() == portUnsaved.value.text.trim() &&
networkProxySaved.auth == proxyAuthModeUnsaved.value &&
onionHosts.value == onionHostsSaved.value
) ||
!validCredential(usernameUnsaved.value.text) ||
!validCredential(passwordUnsaved.value.text) ||
!validHost(hostUnsaved.value.text) ||
!validPort(portUnsaved.value.text)
val resetDisabled = hostUnsaved.value.text.trim() == "localhost" && portUnsaved.value.text.trim() == "9050" && proxyAuthRandomUnsaved.value && onionHosts.value == NetCfg.defaults.onionHosts
val saveAndClose = {
val oldValue = networkProxyHostPort.get()
networkProxyHostPort.set(hostUnsaved.value.text + ":" + portUnsaved.value.text)
if (networkUseSocksProxy && !migration) {
withBGApi {
if (controller.apiSetNetworkConfig(controller.getNetCfg())) {
close()
} else {
networkProxyHostPort.set(oldValue)
}
}
}
}
val saveDisabled = hostPortSaved == (hostUnsaved.value.text + ":" + portUnsaved.value.text) ||
remember { derivedStateOf { !validHost(hostUnsaved.value.text) } }.value ||
remember { derivedStateOf { !validPort(portUnsaved.value.text) } }.value
val resetDisabled = hostUnsaved.value.text + ":" + portUnsaved.value.text == defaultHostPort
ModalView(
close = {
if (saveDisabled) {
@@ -300,7 +252,7 @@ fun SocksProxySettings(
} else {
showUnsavedSocksHostPortAlert(
confirmText = generalGetString(if (networkUseSocksProxy && !migration) MR.strings.network_options_save_and_reconnect else MR.strings.network_options_save),
save = { save(true) },
save = saveAndClose,
close = close
)
}
@@ -311,78 +263,38 @@ fun SocksProxySettings(
.fillMaxWidth()
) {
AppBarTitle(generalGetString(MR.strings.network_socks_proxy_settings))
SectionView(stringResource(MR.strings.network_socks_proxy).uppercase()) {
Column(Modifier.padding(horizontal = DEFAULT_PADDING)) {
DefaultConfigurableTextField(
hostUnsaved,
stringResource(MR.strings.host_verb),
modifier = Modifier.fillMaxWidth(),
isValid = ::validHost,
keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }),
keyboardType = KeyboardType.Text,
)
DefaultConfigurableTextField(
portUnsaved,
stringResource(MR.strings.port_verb),
modifier = Modifier.fillMaxWidth(),
isValid = ::validPort,
keyboardActions = KeyboardActions(onDone = { defaultKeyboardAction(ImeAction.Done); save(false) }),
keyboardType = KeyboardType.Number,
)
}
UseOnionHosts(onionHosts, rememberUpdatedState(networkUseSocksProxy && proxyAuthRandomUnsaved.value)) {
onionHosts.value = it
}
SectionTextFooter(annotatedStringResource(MR.strings.disable_onion_hosts_when_not_supported))
}
SectionDividerSpaced(maxTopPadding = true)
SectionView(stringResource(MR.strings.network_proxy_auth).uppercase()) {
PreferenceToggle(
stringResource(MR.strings.network_proxy_random_credentials),
checked = proxyAuthRandomUnsaved.value,
onChange = { proxyAuthRandomUnsaved.value = it }
SectionView(contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
DefaultConfigurableTextField(
hostUnsaved,
stringResource(MR.strings.host_verb),
modifier = Modifier.fillMaxWidth(),
isValid = ::validHost,
keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }),
keyboardType = KeyboardType.Text,
)
DefaultConfigurableTextField(
portUnsaved,
stringResource(MR.strings.port_verb),
modifier = Modifier.fillMaxWidth(),
isValid = ::validPort,
keyboardActions = KeyboardActions(onDone = { defaultKeyboardAction(ImeAction.Done); save() }),
keyboardType = KeyboardType.Number,
)
if (!proxyAuthRandomUnsaved.value) {
Column(Modifier.padding(horizontal = DEFAULT_PADDING)) {
DefaultConfigurableTextField(
usernameUnsaved,
stringResource(MR.strings.network_proxy_username),
modifier = Modifier.fillMaxWidth(),
isValid = ::validCredential,
keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }),
keyboardType = KeyboardType.Text,
)
DefaultConfigurableTextField(
passwordUnsaved,
stringResource(MR.strings.network_proxy_password),
modifier = Modifier.fillMaxWidth(),
isValid = ::validCredential,
keyboardActions = KeyboardActions(onNext = { defaultKeyboardAction(ImeAction.Next) }),
keyboardType = KeyboardType.Password,
)
}
}
SectionTextFooter(proxyAuthFooter(usernameUnsaved.value.text, passwordUnsaved.value.text, proxyAuthModeUnsaved.value, sessionMode))
}
SectionDividerSpaced(maxBottomPadding = false, maxTopPadding = true)
SectionDividerSpaced(maxBottomPadding = false)
SectionView {
SectionItemView({
hostUnsaved.value = hostUnsaved.value.copy("localhost", TextRange(9))
portUnsaved.value = portUnsaved.value.copy("9050", TextRange(4))
usernameUnsaved.value = TextFieldValue()
passwordUnsaved.value = TextFieldValue()
proxyAuthRandomUnsaved.value = true
onionHosts.value = NetCfg.defaults.onionHosts
val newHost = defaultHostPort.split(":").first()
val newPort = defaultHostPort.split(":").last()
hostUnsaved.value = hostUnsaved.value.copy(newHost, TextRange(newHost.length))
portUnsaved.value = portUnsaved.value.copy(newPort, TextRange(newPort.length))
}, disabled = resetDisabled) {
Text(stringResource(MR.strings.network_options_reset_to_defaults), color = if (resetDisabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary)
}
SectionItemView(
click = { if (networkUseSocksProxy && !migration) showUpdateNetworkSettingsDialog { save(false) } else save(false) },
click = { if (networkUseSocksProxy && !migration) showUpdateNetworkSettingsDialog { save() } else save() },
disabled = saveDisabled
) {
Text(stringResource(if (networkUseSocksProxy && !migration) MR.strings.network_options_save_and_reconnect else MR.strings.network_options_save), color = if (saveDisabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary)
@@ -393,12 +305,6 @@ fun SocksProxySettings(
}
}
private fun proxyAuthFooter(username: String, password: String, auth: NetworkProxyAuth, sessionMode: TransportSessionMode): String = when {
auth == NetworkProxyAuth.ISOLATE -> generalGetString(if (sessionMode == TransportSessionMode.User) MR.strings.network_proxy_auth_mode_isolate_by_auth_user else MR.strings.network_proxy_auth_mode_isolate_by_auth_entity)
username.isBlank() && password.isBlank() -> generalGetString(MR.strings.network_proxy_auth_mode_no_auth)
else -> generalGetString(MR.strings.network_proxy_auth_mode_username_password)
}
private fun showUnsavedSocksHostPortAlert(confirmText: String, save: () -> Unit, close: () -> Unit) {
AlertManager.shared.showAlertDialogStacked(
title = generalGetString(MR.strings.update_network_settings_question),
@@ -413,6 +319,7 @@ private fun showUnsavedSocksHostPortAlert(confirmText: String, save: () -> Unit,
fun UseOnionHosts(
onionHosts: MutableState<OnionHosts>,
enabled: State<Boolean>,
showModal: (@Composable ModalData.() -> Unit) -> Unit,
useOnion: (OnionHosts) -> Unit,
) {
val values = remember {
@@ -424,29 +331,36 @@ fun UseOnionHosts(
}
}
}
Column {
if (enabled.value) {
ExposedDropDownSettingRow(
generalGetString(MR.strings.network_use_onion_hosts),
values.map { it.value to it.title },
onionHosts,
icon = painterResource(MR.images.ic_security),
enabled = enabled,
onSelected = useOnion
)
} else {
// In reality, when socks proxy is disabled, this option acts like NEVER regardless of what was chosen before
ExposedDropDownSettingRow(
generalGetString(MR.strings.network_use_onion_hosts),
listOf(OnionHosts.NEVER to generalGetString(MR.strings.network_use_onion_hosts_no)),
remember { mutableStateOf(OnionHosts.NEVER) },
icon = painterResource(MR.images.ic_security),
enabled = enabled,
onSelected = {}
)
val onSelected = {
showModal {
ColumnWithScrollBar(
Modifier.fillMaxWidth(),
) {
AppBarTitle(stringResource(MR.strings.network_use_onion_hosts))
SectionViewSelectable(null, onionHosts, values, useOnion)
}
}
SectionTextFooter(values.first { it.value == onionHosts.value }.description)
}
if (enabled.value) {
SectionItemWithValue(
generalGetString(MR.strings.network_use_onion_hosts),
onionHosts,
values,
icon = painterResource(MR.images.ic_security),
enabled = enabled,
onSelected = onSelected
)
} else {
// In reality, when socks proxy is disabled, this option acts like NEVER regardless of what was chosen before
SectionItemWithValue(
generalGetString(MR.strings.network_use_onion_hosts),
remember { mutableStateOf(OnionHosts.NEVER) },
listOf(ValueTitleDesc(OnionHosts.NEVER, generalGetString(MR.strings.network_use_onion_hosts_no), AnnotatedString(generalGetString(MR.strings.network_use_onion_hosts_no_desc)))),
icon = painterResource(MR.images.ic_security),
enabled = enabled,
onSelected = {}
)
}
}
@@ -484,8 +398,12 @@ fun SessionModePicker(
)
}
private fun validHost(s: String): Boolean =
!s.contains('@')
// https://stackoverflow.com/a/106223
private fun validHost(s: String): Boolean {
val validIp = Regex("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$")
val validHostname = Regex("^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])[.])*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$");
return s.matches(validIp) || s.matches(validHostname)
}
// https://ihateregex.io/expr/port/
fun validPort(s: String): Boolean {
@@ -493,16 +411,6 @@ fun validPort(s: String): Boolean {
return s.isNotBlank() && s.matches(validPort)
}
private fun validCredential(s: String): Boolean =
!s.contains(':') && !s.contains('@')
fun showWrongProxyConfigAlert() {
AlertManager.shared.showAlertMsg(
title = generalGetString(MR.strings.network_proxy_incorrect_config_title),
text = generalGetString(MR.strings.network_proxy_incorrect_config_desc),
)
}
fun showUpdateNetworkSettingsDialog(
title: String,
startsWith: String = "",
@@ -527,7 +435,6 @@ fun PreviewNetworkAndServersLayout() {
NetworkAndServersLayout(
currentRemoteHost = null,
networkUseSocksProxy = remember { mutableStateOf(true) },
onionHosts = remember { mutableStateOf(OnionHosts.PREFER) },
toggleSocksProxy = {},
)
}
@@ -174,7 +174,7 @@ private fun UserAddressLayout(
saveAas: (AutoAcceptState, MutableState<AutoAcceptState>) -> Unit,
) {
ColumnWithScrollBar {
AppBarTitle(stringResource(MR.strings.simplex_address), hostDevice(user?.remoteHostId))
AppBarTitle(stringResource(MR.strings.public_address), hostDevice(user?.remoteHostId))
Column(
Modifier.fillMaxWidth().padding(bottom = DEFAULT_PADDING_HALF),
horizontalAlignment = Alignment.CenterHorizontally,
@@ -230,7 +230,7 @@ private fun UserAddressLayout(
private fun CreateAddressButton(onClick: () -> Unit) {
SettingsActionItem(
painterResource(MR.images.ic_qr_code),
stringResource(MR.strings.create_simplex_address),
stringResource(MR.strings.create_public_address),
onClick,
iconColor = MaterialTheme.colors.primary,
textColor = MaterialTheme.colors.primary,
@@ -701,6 +701,10 @@
<string name="is_verified">%s is verified</string>
<string name="is_not_verified">%s is not verified</string>
<!-- user picker - UserPicker.kt -->
<string name="create_public_contact_address">Create public address</string>
<string name="your_public_contact_address">Your public address</string>
<!-- settings - SettingsView.kt -->
<string name="your_settings">Your settings</string>
<string name="your_simplex_contact_address">Your SimpleX address</string>
@@ -769,17 +773,7 @@
<string name="network_socks_proxy">SOCKS proxy</string>
<string name="network_socks_proxy_settings">SOCKS proxy settings</string>
<string name="network_socks_toggle_use_socks_proxy">Use SOCKS proxy</string>
<string name="network_proxy_auth">Proxy authentication</string>
<string name="network_proxy_random_credentials">Use random credentials</string>
<string name="network_proxy_auth_mode_isolate_by_auth_user">Use different proxy credentials for each profile.</string>
<string name="network_proxy_auth_mode_isolate_by_auth_entity">Use different proxy credentials for each connection.</string>
<string name="network_proxy_auth_mode_no_auth">Do not use credentials with proxy.</string>
<string name="network_proxy_auth_mode_username_password">Your credentials may be sent unencrypted.</string>
<string name="network_proxy_username">Username</string>
<string name="network_proxy_password">Password</string>
<string name="network_proxy_port">port %d</string>
<string name="network_proxy_incorrect_config_title">Error saving proxy</string>
<string name="network_proxy_incorrect_config_desc">Make sure proxy configuration is correct.</string>
<string name="host_verb">Host</string>
<string name="port_verb">Port</string>
<string name="network_enable_socks">Use SOCKS proxy?</string>
@@ -859,6 +853,8 @@
<string name="shutdown_alert_desc">Notifications will stop working until you re-launch the app</string>
<!-- Address Items - UserAddressView.kt -->
<string name="public_address">Public address</string>
<string name="create_public_address">Create public address</string>
<string name="create_address">Create address</string>
<string name="delete_address__question">Delete address?</string>
<string name="your_contacts_will_remain_connected">Your contacts will remain connected.</string>
@@ -224,7 +224,7 @@
<string name="how_to_use_your_servers">Jak používat servery</string>
<string name="your_ICE_servers">Vaše servery ICE</string>
<string name="configure_ICE_servers">Konfigurace serverů ICE</string>
<string name="network_settings_title">Pokročilé nastavení</string>
<string name="network_settings_title">Nastavení sítě</string>
<string name="network_enable_socks">Použít proxy server SOCKS\?</string>
<string name="network_disable_socks">Použít přímé připojení k internetu\?</string>
<string name="network_use_onion_hosts_no">Ne</string>
@@ -434,7 +434,7 @@
<string name="edit_image">Upravit obrázek</string>
<string name="delete_image">Smazat obrázek</string>
<string name="callstatus_error">chyba volání</string>
<string name="opensource_protocol_and_code_anybody_can_run_servers">Servery může provozovat kdokoli.</string>
<string name="opensource_protocol_and_code_anybody_can_run_servers">Protokol a kód s otevřeným zdrojovým kódem - servery může provozovat kdokoli.</string>
<string name="create_your_profile">Vytvořte si svůj profil</string>
<string name="make_private_connection">Vytvořte si soukromé připojení</string>
<string name="encrypted_video_call">Videohovor šifrovaný e2e</string>
@@ -799,7 +799,7 @@
<string name="rcv_group_event_member_added">pozval %1$s</string>
<string name="rcv_group_event_member_connected">připojen</string>
<string name="rcv_group_event_changed_member_role">změnil roli %s na %s</string>
<string name="rcv_group_event_changed_your_role">změnil vaši roli na %s</string>
<string name="rcv_group_event_changed_your_role">změnil svou roli na %s</string>
<string name="rcv_group_event_member_deleted">odstraněn %1$s</string>
<string name="rcv_group_event_user_deleted">odstranil vás</string>
<string name="rcv_group_event_group_deleted">skupina odstraněna</string>
@@ -1861,5 +1861,4 @@
<string name="calls_prohibited_alert_title">Volání zakázáno!</string>
<string name="cant_call_member_alert_title">Nelze zavolat člena skupiny</string>
<string name="deleted_chats">Archivované kontakty</string>
<string name="v6_0_your_contacts_descr">Archivujte kontakty pro pozdější chatování.</string>
</resources>
@@ -277,11 +277,11 @@
<string name="accept_contact_incognito_button">Inkognito akzeptieren</string>
<string name="reject_contact_button">Ablehnen</string>
<!-- Clear Chat - ChatListNavLinkView.kt -->
<string name="clear_chat_question">Chat-Inhalte entfernen?</string>
<string name="clear_chat_question">Chatinhalte löschen?</string>
<string name="clear_chat_warning">Es werden alle Nachrichten gelöscht. Dies kann nicht rückgängig gemacht werden! Die Nachrichten werden NUR bei Ihnen gelöscht.</string>
<string name="clear_verb">Entfernen</string>
<string name="clear_chat_button">Chat-Inhalte entfernen</string>
<string name="clear_chat_menu_action">Chat-Inhalte entfernen</string>
<string name="clear_verb">Löschen</string>
<string name="clear_chat_button">Chatinhalte löschen</string>
<string name="clear_chat_menu_action">Chatinhalte löschen</string>
<string name="delete_contact_menu_action">Löschen</string>
<string name="delete_group_menu_action">Löschen</string>
<string name="mark_read">Als gelesen markieren</string>
@@ -753,7 +753,7 @@
<string name="skip_inviting_button">Mitgliedereinladungen überspringen</string>
<string name="select_contacts">Kontakte auswählen</string>
<string name="icon_descr_contact_checked">Kontakt geprüft</string>
<string name="clear_contacts_selection_button">Entfernen</string>
<string name="clear_contacts_selection_button">Löschen</string>
<string name="num_contacts_selected">%d Kontakt(e) ausgewählt</string>
<string name="no_contacts_selected">Keine Kontakte ausgewählt</string>
<string name="invite_prohibited">Kontakt kann nicht eingeladen werden!</string>
@@ -765,7 +765,7 @@
<string name="button_delete_group">Gruppe löschen</string>
<string name="delete_group_question">Gruppe löschen?</string>
<string name="delete_group_for_all_members_cannot_undo_warning">Die Gruppe wird für alle Mitglieder gelöscht. Dies kann nicht rückgängig gemacht werden!</string>
<string name="delete_group_for_self_cannot_undo_warning">Die Gruppe wird nur bei Ihnen gelöscht. Dies kann nicht rückgängig gemacht werden!</string>
<string name="delete_group_for_self_cannot_undo_warning">Die Gruppe wird für Sie gelöscht. Dies kann nicht rückgängig gemacht werden!</string>
<string name="button_leave_group">Gruppe verlassen</string>
<string name="button_edit_group_profile">Gruppenprofil bearbeiten</string>
<string name="group_link">Gruppen-Link</string>
@@ -1397,7 +1397,7 @@
<string name="v5_2_message_delivery_receipts_descr">Wir haben das zweite Häkchen vermisst! ✅</string>
<string name="v5_2_fix_encryption_descr">Reparatur der Verschlüsselung nach Wiedereinspielen von Backups.</string>
<string name="v5_2_more_things">Ein paar weitere Dinge</string>
<string name="v5_2_disappear_one_message_descr">Auch wenn sie in den Unterhaltungen deaktiviert sind.</string>
<string name="v5_2_disappear_one_message_descr">Auch wenn sie im Chat deaktiviert sind.</string>
<string name="v5_2_more_things_descr">- stabilere Zustellung von Nachrichten.
\n- ein bisschen verbesserte Gruppen.
\n- und mehr!</string>
@@ -1630,7 +1630,7 @@
<string name="tap_to_scan">Zum Scannen tippen</string>
<string name="keep_invitation_link">Behalten</string>
<string name="tap_to_paste_link">Zum Link einfügen tippen</string>
<string name="search_or_paste_simplex_link">Suchen oder SimpleX-Link einfügen</string>
<string name="search_or_paste_simplex_link">Suchen oder fügen Sie den SimpleX-Link ein</string>
<string name="chat_is_stopped_you_should_transfer_database">Der Chat wurde gestoppt. Wenn diese Datenbank bereits auf einem anderen Gerät von Ihnen verwendet wurde, sollten Sie diese dorthin zurück übertragen, bevor Sie den Chat starten.</string>
<string name="start_chat_question">Chat starten?</string>
<string name="show_internal_errors">Interne Fehler anzeigen</string>
@@ -1673,7 +1673,7 @@
<string name="v5_5_private_notes_descr">Mit verschlüsselten Dateien und Medien.</string>
<string name="v5_5_private_notes">Private Notizen</string>
<string name="clear_note_folder_warning">Es werden alle Nachrichten gelöscht. Dies kann nicht rückgängig gemacht werden!</string>
<string name="clear_note_folder_question">Private Notizen entfernen?</string>
<string name="clear_note_folder_question">Private Notizen löschen?</string>
<string name="rcv_group_event_member_blocked">%s wurde blockiert</string>
<string name="rcv_group_event_member_unblocked">%s wurde freigegeben</string>
<string name="snd_group_event_member_blocked">Sie haben %s blockiert</string>
@@ -2081,16 +2081,16 @@
<string name="info_view_connect_button">Verbinden</string>
<string name="info_view_message_button">Nachricht</string>
<string name="info_view_open_button">Öffnen</string>
<string name="conversation_deleted">Chat-Inhalte gelöscht!</string>
<string name="only_delete_conversation">Nur die Chat-Inhalte löschen</string>
<string name="conversation_deleted">Unterhaltung gelöscht!</string>
<string name="only_delete_conversation">Nur die Unterhaltung löschen</string>
<string name="info_view_search_button">Suchen</string>
<string name="info_view_video_button">Video</string>
<string name="you_can_still_view_conversation_with_contact">Sie können in der Chat-Liste weiterhin die Unterhaltung mit %1$s einsehen.</string>
<string name="you_can_still_view_conversation_with_contact">Sie können in der Chatliste weiterhin die Unterhaltung mit %1$s einsehen.</string>
<string name="paste_link">Link einfügen</string>
<string name="deleted_chats">Archivierte Kontakte</string>
<string name="no_filtered_contacts">Keine gefilterten Kontakte</string>
<string name="contact_list_header_title">Ihre Kontakte</string>
<string name="one_hand_ui">Chat-Symbolleiste unten</string>
<string name="one_hand_ui">Erreichbare Chat-Symbolleiste</string>
<string name="calls_prohibited_ask_to_enable_calls_alert_text">Bitten Sie Ihren Kontakt darum, Anrufe zu aktivieren.</string>
<string name="you_need_to_allow_calls">Sie müssen Ihrem Kontakt Anrufe zu Ihnen erlauben, bevor Sie ihn selbst anrufen können.</string>
<string name="allow_calls_question">Anrufe erlauben?</string>
@@ -2106,11 +2106,11 @@
<string name="delete_contact_cannot_undo_warning">Kontakt wird gelöscht. Dies kann nicht rückgängig gemacht werden!</string>
<string name="delete_without_notification">Ohne Benachrichtigung löschen</string>
<string name="action_button_add_members">Einladen</string>
<string name="keep_conversation">Chat-Inhalte beibehalten</string>
<string name="keep_conversation">Unterhaltung behalten</string>
<string name="cant_call_member_send_message_alert_text">Nachricht senden, um Anrufe zu aktivieren.</string>
<string name="you_can_still_send_messages_to_contact">Sie können aus den archivierten Kontakten heraus Nachrichten an %1$s versenden.</string>
<string name="toolbar_settings">Einstellungen</string>
<string name="moderate_messages_will_be_deleted_warning">Die Nachrichten werden für alle Gruppenmitglieder gelöscht.</string>
<string name="moderate_messages_will_be_deleted_warning">Die Nachrichten werden für alle Mitglieder gelöscht.</string>
<string name="moderate_messages_will_be_marked_warning">Die Nachrichten werden für alle Mitglieder als moderiert markiert.</string>
<string name="delete_members_messages__question">%d Nachrichten der Mitglieder löschen?</string>
<string name="compose_message_placeholder">Nachricht</string>
@@ -2120,7 +2120,7 @@
<string name="select_verb">Auswählen</string>
<string name="invite_friends_short">Einladen</string>
<string name="network_option_tcp_connection">TCP-Verbindung</string>
<string name="v6_0_increase_font_size">Schriftgröße anpassen.</string>
<string name="v6_0_increase_font_size">Schriftgröße erhöhen.</string>
<string name="v6_0_new_chat_experience">Neue Chat-Erfahrung 🎉</string>
<string name="v6_0_upgrade_app">Die App automatisch aktualisieren</string>
<string name="v6_0_connection_servers_status_descr">Verbindungs- und Server-Status.</string>
@@ -2136,8 +2136,8 @@
<string name="v6_0_your_contacts_descr">Kontakte für spätere Chats archivieren.</string>
<string name="v6_0_private_routing_descr">Ihre IP-Adresse und Verbindungen werden geschützt.</string>
<string name="v6_0_delete_many_messages_descr">Löschen Sie bis zu 20 Nachrichten auf einmal.</string>
<string name="v6_0_reachable_chat_toolbar">Chat-Symbolleiste unten</string>
<string name="v6_0_reachable_chat_toolbar_descr">Die App mit einer Hand bedienen.</string>
<string name="v6_0_reachable_chat_toolbar">Erreichbare Chat-Symbolleiste</string>
<string name="v6_0_reachable_chat_toolbar_descr">Die App mit einer Hand nutzen.</string>
<string name="v6_0_connect_faster_descr">Schneller mit Ihren Freunden verbinden.</string>
<string name="chat_database_exported_title">Chat-Datenbank wurde exportiert</string>
<string name="chat_database_exported_continue">Weiter</string>
@@ -15,10 +15,10 @@
<string name="send_disappearing_message_30_seconds">30 másodperc</string>
<string name="one_time_link_short">Egyszer használatos hivatkozás</string>
<string name="contact_wants_to_connect_via_call">%1$s szeretne kapcsolatba lépni önnel ezen keresztül:</string>
<string name="about_simplex_chat">A SimpleX Chatről</string>
<string name="about_simplex_chat">A SimpleX Chat-ről</string>
<string name="chat_item_ttl_day">1 nap</string>
<string name="abort_switch_receiving_address">Címváltoztatás megszakítása</string>
<string name="about_simplex">A SimpleXről</string>
<string name="about_simplex">A SimpleX-ről</string>
<string name="color_primary">Kiemelés</string>
<string name="callstatus_accepted">fogadott hívás</string>
<string name="network_enable_socks_info">Hozzáférés a kiszolgálókhoz SOCKS proxy segítségével a %d porton? A proxyt el kell indítani, mielőtt engedélyezné ezt az opciót.</string>
@@ -26,25 +26,25 @@
<string name="accept_call_on_lock_screen">Elfogadás</string>
<string name="above_then_preposition_continuation">gombra fent, majd:</string>
<string name="accept_contact_incognito_button">Elfogadás inkognítóban</string>
<string name="accept_connection_request__question">Ismerőskérelem elfogadása?</string>
<string name="accept_connection_request__question">Kapcsolódási kérelem elfogadása?</string>
<string name="accept_contact_button">Elfogadás</string>
<string name="accept">Elfogadás</string>
<string name="add_address_to_your_profile">Cím hozzáadása a profilhoz, hogy az ismerősei megoszthassák másokkal. A profilfrissítés elküldésre kerül az ismerősök számára.</string>
<string name="color_primary_variant">További kiemelés</string>
<string name="callstatus_error">híváshiba</string>
<string name="callstatus_error">hiba a hívásban</string>
<string name="v5_4_block_group_members">Csoporttagok letiltása</string>
<string name="la_authenticate">Hitelesítés</string>
<string name="empty_chat_profile_is_created">Egy üres csevegési profil jön létre a megadott névvel, és az alkalmazás a szokásos módon megnyílik.</string>
<string name="feature_cancelled_item">%s visszavonva</string>
<string name="smp_servers_preset_add">Előre beállított kiszolgálók hozzáadása</string>
<string name="calls_prohibited_with_this_contact">A hívások kezdeményezése le van tiltva ebben a csevegésben.</string>
<string name="network_session_mode_entity_description">Külön TCP kapcsolat (és SOCKS bejelentkezési adatok) lesz használva <b>minden ismerős és csoporttag számára</b>. \u0020
\n<b>Figyelem</b>: ha sok ismerőse van, az akkumulátor- és az adathasználat jelentősen megnövekedhet, és néhány kapcsolódási kísérlet sikertelen lehet.</string>
<string name="icon_descr_cancel_link_preview">hivatkozás előnézetének visszavonása</string>
<string name="network_session_mode_entity_description">Külön TCP kapcsolat (és SOCKS bejelentkezési adatok) lesz használva <b>minden ismerős és csoporttag számára</b>.
\n<b>Figyelem</b>: ha sok ismerőse van, az akkumulátor- és adathasználat jelentősen megnövekedhet és néhány kapcsolódási kísérlet sikertelen lehet.</string>
<string name="icon_descr_cancel_link_preview">hivatkozás előnézet visszavonása</string>
<string name="network_session_mode_user_description"><![CDATA[Külön TCP kapcsolat (és SOCKS bejelentkezési adatok) lesz használva <b>az alkalmazásban minden csevegési profiljához </b>.]]></string>
<string name="both_you_and_your_contact_can_send_disappearing">Mindkét fél küldhet eltűnő üzeneteket.</string>
<string name="keychain_is_storing_securely">Az Android Keystore-t a jelmondat biztonságos tárolására használják - lehetővé teszi az értesítési szolgáltatás működését.</string>
<string name="alert_title_msg_bad_hash">Hibás az üzenet hasító értéke</string>
<string name="alert_title_msg_bad_hash">Hibás az üzenet ellenőrzőösszege</string>
<string name="color_background">Háttér</string>
<string name="socks_proxy_setting_limitations"><![CDATA[<b>Tudnivaló</b>: az üzenet- és fájl átjátszók SOCKS proxy által vannak kapcsolatban. A hívások és URL hivatkozás előnézetek közvetlen kapcsolatot használnak.]]></string>
<string name="full_backup">Alkalmazásadatok biztonsági mentése</string>
@@ -114,7 +114,7 @@
<string name="icon_descr_audio_call">hanghívás</string>
<string name="bold_text">félkövér</string>
<string name="app_passcode_replaced_with_self_destruct">Az alkalmazás jelkód helyettesítésre kerül egy önmegsemmisítő jelkóddal.</string>
<string name="v5_3_new_interface_languages_descr">Arab, bulgár, finn, héber, thai és ukrán - köszönet a felhasználóknak és a Weblate-nek.</string>
<string name="v5_3_new_interface_languages_descr">Arab, bulgár, finn, héber, thai és ukrán - köszönet a felhasználóknak és a Weblate-nek!</string>
<string name="allow_voice_messages_question">Hangüzenetek engedélyezése?</string>
<string name="always_use_relay">Mindig használjon átjátszó kiszolgálót</string>
<string name="chat_preferences_always">mindig</string>
@@ -124,9 +124,9 @@
<string name="icon_descr_cancel_live_message">Élő csevegési üzenet visszavonása</string>
<string name="allow_irreversible_message_deletion_only_if">Az üzenetek végleges törlése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi. (24 óra)</string>
<string name="v4_6_audio_video_calls">Hang- és videóhívások</string>
<string name="integrity_msg_bad_hash">hibás az üzenet hasító értéke</string>
<string name="integrity_msg_bad_hash">hibás az üzenet ellenőrzőösszege</string>
<string name="notifications_mode_service">Mindig fut</string>
<string name="keychain_allows_to_receive_ntfs">Az Android Keystore biztonságosan fogja tárolni a jelmondatot az alkalmazás újraindítása, vagy a jelmondat megváltoztatás után - lehetővé teszi az értesítések fogadását.</string>
<string name="keychain_allows_to_receive_ntfs">Az Android Keystore biztonságosan fogja tárolni a jelmondatot az alkalmazás újraindítása, vagy a jelmondat megváltoztatás után - lehetővé téve az értesítések fogadását.</string>
<string name="all_app_data_will_be_cleared">Minden alkalmazásadat törölve.</string>
<string name="onboarding_notifications_mode_off_desc"><![CDATA[<b>Legjobb akkumulátoridő</b>. Csak akkor kap értesítéseket, amikor az alkalmazás meg van nyitva. (NINCS háttérszolgáltatás.)]]></string>
<string name="appearance_settings">Megjelenés</string>
@@ -137,7 +137,7 @@
<string name="group_member_role_author">szerző</string>
<string name="allow_your_contacts_irreversibly_delete">Az elküldött üzenetek végleges törlése engedélyezve van az ismerősei számára. (24 óra)</string>
<string name="cancel_verb">Mégse</string>
<string name="notifications_mode_off_desc">Az alkalmazás csak akkor tud értesítéseket fogadni, amikor meg van nyitva. A háttérszolgáltatás nem indul el</string>
<string name="notifications_mode_off_desc">Az alkalmazás csak akkor tud értesítéseket fogadni, amikor meg van nyitva. A háttérszolgáltatás nem indul el.</string>
<string name="v5_1_better_messages">Jobb üzenetek</string>
<string name="abort_switch_receiving_address_desc">A cím módosítása megszakad. A régi fogadási cím kerül felhasználásra.</string>
<string name="allow_verb">Engedélyezés</string>
@@ -147,7 +147,7 @@
<string name="v5_0_app_passcode">Alkalmazás jelkód</string>
<string name="icon_descr_asked_to_receive">Felkérték a kép fogadására</string>
<string name="use_camera_button">Kamera</string>
<string name="cannot_access_keychain">Nem érhető el a Keystore az adatbázis jelszavának mentéséhez</string>
<string name="cannot_access_keychain">A Keystore-hoz nem sikerül hozzáférni az adatbázis jelszó mentése végett</string>
<string name="callstatus_in_progress">hívás folyamatban</string>
<string name="auto_accept_images">Képek automatikus elfogadása</string>
<string name="allow_your_contacts_to_call">A hívások kezdeményezése engedélyezve van az ismerősei számára.</string>
@@ -183,7 +183,7 @@
<string name="rcv_group_event_member_connected">kapcsolódott</string>
<string name="connect_via_link_verb">Kapcsolódás</string>
<string name="group_member_status_connected">kapcsolódott</string>
<string name="connected_mobile">Társított mobil eszköz</string>
<string name="connected_mobile">Csatlakoztatott telefon</string>
<string name="server_connected">kapcsolódva</string>
<string name="change_role">Szerepkör megváltoztatása</string>
<string name="icon_descr_server_status_connected">Kapcsolódva</string>
@@ -202,7 +202,7 @@
<string name="delete_contact_all_messages_deleted_cannot_undo_warning">Az ismerős és az összes üzenet törlésre kerül - ez a művelet nem vonható vissza!</string>
<string name="contacts_can_mark_messages_for_deletion">Az ismerősei törlésre jelölhetnek üzeneteket; ön majd meg tudja nézni azokat.</string>
<string name="connect_via_invitation_link">Kapcsolódás egyszer használatos hivatkozással?</string>
<string name="connect_via_link_or_qr">Kapcsolódás egy hivatkozáson vagy QR-kódon keresztül</string>
<string name="connect_via_link_or_qr">Kapcsolódás egy hivatkozás / QR-kód által</string>
<string name="connection_error_auth">Kapcsolódási hiba (AUTH)</string>
<string name="notification_preview_mode_contact">Ismerős neve</string>
<string name="connect_via_contact_link">Kapcsolódik a kapcsolattartási címen keresztül?</string>
@@ -210,7 +210,7 @@
<string name="copy_verb">Másolás</string>
<string name="continue_to_next_step">Folytatás</string>
<string name="connect_plan_connect_via_link">Kapcsolódás egy hivatkozáson keresztül?</string>
<string name="contact_already_exists">Az ismerős már létezik</string>
<string name="contact_already_exists">Létező ismerős</string>
<string name="core_version">Fő verzió: v%s</string>
<string name="icon_descr_contact_checked">Ismerős ellenőrizve</string>
<string name="connect_plan_connect_to_yourself">Kapcsolódás saját magához?</string>
@@ -229,7 +229,7 @@
<string name="status_contact_has_no_e2e_encryption">az ismerősnek nincs e2e titkosítása</string>
<string name="chat_preferences_contact_allows">Ismerős engedélyezi</string>
<string name="notification_preview_somebody">Ismerős elrejtve:</string>
<string name="connect_to_desktop">Társítás számítógéppel</string>
<string name="connect_to_desktop">Kapcsolódás számítógéphez</string>
<string name="icon_descr_context">Környezeti ikon</string>
<string name="connect_via_link">Kapcsolódás egy hivatkozáson keresztül</string>
<string name="receipts_section_contacts">Ismerősök</string>
@@ -271,7 +271,7 @@
<string name="group_connection_pending">kapcsolódás…</string>
<string name="delete_chat_profile">Csevegési profil törlése</string>
<string name="custom_time_picker_custom">egyedi</string>
<string name="callstatus_connecting">kapcsolódási hívás…</string>
<string name="callstatus_connecting">hívás kapcsolódik…</string>
<string name="customize_theme_title">Téma személyre szabása</string>
<string name="maximum_supported_file_size">Jelenleg támogatott legnagyobb fájl méret: %1$s.</string>
<string name="smp_server_test_delete_file">Fájl törlése</string>
@@ -325,14 +325,14 @@
<string name="contact_connection_pending">kapcsolódás…</string>
<string name="chat_database_deleted">Csevegési adatbázis törölve</string>
<string name="group_member_status_introduced">kapcsolódás (bejelentve)</string>
<string name="create_group_link">Csoporthivatkozás létrehozása</string>
<string name="create_group_link">Csoportos hivatkozás létrehozása</string>
<string name="chat_console">Csevegési konzol</string>
<string name="delete_files_and_media_for_all_users">Fájlok törlése minden csevegési profilból</string>
<string name="smp_server_test_delete_queue">Várólista törlése</string>
<string name="button_delete_contact">Ismerős törlése</string>
<string name="archive_created_on_ts">Létrehozva ekkor: %1$s</string>
<string name="rcv_conn_event_switch_queue_phase_changing">cím megváltoztatása…</string>
<string name="connected_to_mobile">Társítva a mobil eszközzel</string>
<string name="connected_to_mobile">Csatlakoztatva a mobilhoz</string>
<string name="current_passphrase">Jelenlegi jelmondat…</string>
<string name="choose_file_title">Fájl kiválasztás</string>
<string name="delete_image">Kép törlése</string>
@@ -346,7 +346,7 @@
<string name="smp_server_test_compare_file">Fájl összehasonlítás</string>
<string name="your_chats">Csevegések</string>
<string name="delete_message__question">Üzenet törlése?</string>
<string name="delete_pending_connection__question">Függőben lévő ismerőskérelem törlése?</string>
<string name="delete_pending_connection__question">Függő kapcsolatfelvételi kérések törlése?</string>
<string name="database_encrypted">Adatbázis titkosítva!</string>
<string name="clear_chat_question">Üzenetek kiürítése?</string>
<string name="database_downgrade">Adatbázis visszafejlesztése</string>
@@ -358,7 +358,7 @@
<string name="info_row_database_id">Adatbázis ID</string>
<string name="share_text_database_id">Adatbázis ID: %d</string>
<string name="developer_options">Adatbázis azonosítók és átviteli izolációs beállítások.</string>
<string name="database_encryption_will_be_updated">Az adatbázis-titkosítási jelmondat megváltoztatásra és mentésre kerül a Keystore-ban.</string>
<string name="database_encryption_will_be_updated">Az adatbázis titkosítás jelmondata megváltoztatásra és mentésre kerül a Keystore-ban.</string>
<string name="database_will_be_encrypted_and_passphrase_stored_in_settings">Az adatbázis titkosításra kerül és a jelmondat eltárolásra a beállításokban.</string>
<string name="smp_servers_delete_server">Kiszolgáló törlése</string>
<string name="auth_device_authentication_is_disabled_turning_off">A készüléken nincs beállítva a képernyőzár. A SimpleX zár ki van kapcsolva.</string>
@@ -381,7 +381,7 @@
<string name="ttl_months">%d hónap</string>
<string name="delete_address__question">Cím törlése?</string>
<string name="receipts_contacts_title_disable">Üzenet kézbesítési jelentések letiltása?</string>
<string name="passphrase_is_different">Az adatbázis jelmondat eltér a Keystore-ban lévőtől.</string>
<string name="passphrase_is_different">Az adatbázis jelmondata eltér a Keystore-ban lévőtől.</string>
<string name="direct_messages">Közvetlen üzenetek</string>
<string name="icon_descr_email">E-mail</string>
<string name="receipts_contacts_disable_for_all">Letiltás mindenki számára</string>
@@ -415,7 +415,7 @@
<string name="custom_time_unit_days">nap</string>
<string name="ttl_day">%d nap</string>
<string name="delete_chat_archive_question">Csevegési archívum törlése?</string>
<string name="failed_to_create_user_duplicate_title">Duplikált megjelenített név!</string>
<string name="failed_to_create_user_duplicate_title">Duplikált megjelenítési név!</string>
<string name="receipts_contacts_disable_keep_overrides">Letiltás (felülírások megtartásával)</string>
<string name="database_upgrade">Adatbázis fejlesztése</string>
<string name="blocked_items_description">%d üzenet letiltva</string>
@@ -430,7 +430,7 @@
<string name="delete_files_and_media_all">Minden fájl törlése</string>
<string name="database_will_be_encrypted">Az adatbázis titkosításra kerül.</string>
<string name="database_passphrase_and_export">Adatbázis jelmondat és -exportálás</string>
<string name="database_will_be_encrypted_and_passphrase_stored">Az adatbázis titkosításra kerül és a jelmondat a Keystore-ban lesz tárolva.</string>
<string name="database_will_be_encrypted_and_passphrase_stored">Az adatbázis titkosításra kerül és a jelmondat eltárolásra a Keystore-ban.</string>
<string name="enable_automatic_deletion_question">Automatikus üzenet törlés engedélyezése?</string>
<string name="delete_contact_menu_action">Törlés</string>
<string name="mtr_error_no_down_migration">az adatbázis verziója újabb, mint az alkalmazásé, visszafelé átköltöztetés nem lehetséges a következőhöz: %s</string>
@@ -450,7 +450,7 @@
<string name="edit_image">Kép szerkesztése</string>
<string name="disable_notifications_button">Értesítések letiltása</string>
<string name="devices">Eszközök</string>
<string name="multicast_discoverable_via_local_network">Látható a helyi hálózaton</string>
<string name="multicast_discoverable_via_local_network">Látható helyi hálózaton</string>
<string name="dont_enable_receipts">Ne engedélyezze</string>
<string name="delete_archive">Archívum törlése</string>
<string name="disappearing_prohibited_in_this_chat">Az eltűnő üzenetek küldése le van tiltva ebben a csevegésben.</string>
@@ -483,8 +483,8 @@
<string name="error_setting_network_config">Hiba a hálózat konfigurációjának frissítésekor</string>
<string name="network_option_enable_tcp_keep_alive">TCP életben tartása</string>
<string name="icon_descr_flip_camera">Kamera váltás</string>
<string name="email_invite_body">Üdvözlöm!
\nCsatlakozzon hozzám a SimpleX Chaten keresztül: %s</string>
<string name="email_invite_body">Üdv!
\nCsatlakozzon hozzám SimpleX Chat-en keresztül: %s</string>
<string name="display_name_cannot_contain_whitespace">A megjelenített név nem tartalmazhat szóközöket.</string>
<string name="info_row_group">Csoport</string>
<string name="enter_welcome_message_optional">Üdvözlő üzenet megadása… (opcionális)</string>
@@ -499,7 +499,7 @@
<string name="failed_to_parse_chats_title">A csevegések betöltése sikertelen</string>
<string name="connect_plan_group_already_exists">A csoport már létezik!</string>
<string name="v4_4_french_interface">Francia kezelőfelület</string>
<string name="v4_2_group_links">Csoporthivatkozások</string>
<string name="v4_2_group_links">Csoport hivatkozások</string>
<string name="v5_1_message_reactions_descr">Végre, megvannak! 🚀</string>
<string name="error_starting_chat">Hiba a csevegés elindításakor</string>
<string name="group_profile_is_stored_on_members_devices">A csoport profilja a tagok eszközein tárolódik, nem a kiszolgálókon.</string>
@@ -515,7 +515,7 @@
<string name="favorite_chat">Kedvenc</string>
<string name="v4_6_group_moderation">Csoport moderáció</string>
<string name="choose_file">Fájl</string>
<string name="group_link">Csoporthivatkozás</string>
<string name="group_link">Csoport hivatkozás</string>
<string name="snd_conn_event_ratchet_sync_required">titkosítás újraegyeztetés szükséges %s számára</string>
<string name="failed_to_active_user_title">Hiba a profil váltásakor!</string>
<string name="settings_experimental_features">Kísérleti funkciók</string>
@@ -536,7 +536,7 @@
<string name="group_is_decentralized">Teljesen decentralizált - kizárólag tagok számára látható.</string>
<string name="file_with_path">Fájl: %s</string>
<string name="icon_descr_hang_up">Hívás befejezése</string>
<string name="error_deleting_link_for_group">Hiba a csoporthivatkozás törlésekor</string>
<string name="error_deleting_link_for_group">Hiba a csoport hivatkozásának törlésekor</string>
<string name="file_saved">Fájl elmentve</string>
<string name="fix_connection_question">Kapcsolat javítása?</string>
<string name="files_and_media">Fájlok és médiatartalom</string>
@@ -552,8 +552,8 @@
<string name="failed_to_parse_chat_title">A csevegés betöltése sikertelen</string>
<string name="smp_servers_enter_manually">Kiszolgáló megadása kézzel</string>
<string name="file_will_be_received_when_contact_is_online">A fájl akkor érkezik meg, amikor a küldője elérhető lesz, várjon, vagy ellenőrizze később!</string>
<string name="error_creating_link_for_group">Hiba a csoporthivatkozás létrehozásakor</string>
<string name="from_gallery_button">A galériából</string>
<string name="error_creating_link_for_group">Hiba a csoport hivatkozásának létrehozásakor</string>
<string name="from_gallery_button">A Galériából</string>
<string name="receipts_groups_enable_keep_overrides">Engedélyezés (csoport felülírások megtartásával)</string>
<string name="error_deleting_contact">Hiba az ismerős törlésekor</string>
<string name="group_members_can_delete">A csoport tagjai véglegesen törölhetik az elküldött üzeneteiket. (24 óra)</string>
@@ -562,12 +562,12 @@
<string name="group_members_can_send_disappearing">A csoport tagjai küldhetnek eltűnő üzeneteket.</string>
<string name="fix_connection">Kapcsolat javítása</string>
<string name="failed_to_create_user_title">Hiba a profil létrehozásakor!</string>
<string name="error_adding_members">Hiba a tag(ok) hozzáadásakor</string>
<string name="error_adding_members">Hiba a tag(-ok) hozzáadásakor</string>
<string name="icon_descr_file">Fájl</string>
<string name="group_members_can_send_files">A csoport tagjai küldhetnek fájlokat és médiatartalmakat.</string>
<string name="delete_after">Törlés ennyi idő után</string>
<string name="error_changing_message_deletion">Hiba a beállítás megváltoztatásakor</string>
<string name="error_updating_link_for_group">Hiba a csoporthivatkozás frissítésekor</string>
<string name="error_updating_link_for_group">Hiba a csoport hivatkozás frissítésekor</string>
<string name="group_member_status_group_deleted">a csoport törölve</string>
<string name="snd_group_event_group_profile_updated">csoportprofil frissítve</string>
<string name="error_deleting_pending_contact_connection">Hiba a függőben lévő ismerős kapcsolatának törlésekor</string>
@@ -593,7 +593,7 @@
<string name="error_aborting_address_change">Hiba a cím megváltoztatásának megszakításakor</string>
<string name="error_receiving_file">Hiba a fájl fogadásakor</string>
<string name="conn_event_ratchet_sync_ok">titkosítás rendben</string>
<string name="error_deleting_contact_request">Hiba az ismerőskérelem törlésekor</string>
<string name="error_deleting_contact_request">Hiba az ismerős kérelem törlésekor</string>
<string name="receipts_groups_title_enable">Üzenet kézbesítési jelentéseket engedélyezése csoportok számára?</string>
<string name="fix_connection_not_supported_by_contact">Ismerős általi javítás nem támogatott</string>
<string name="file_not_found">Fájl nem található</string>
@@ -604,7 +604,7 @@
<string name="v4_6_reduced_battery_usage">Tovább csökkentett akkumulátor használat</string>
<string name="error_stopping_chat">Hiba a csevegés megállításakor</string>
<string name="snd_conn_event_ratchet_sync_ok">titkosítás rendben %s számára</string>
<string name="delete_group_for_all_members_cannot_undo_warning">A csoport törlésre kerül minden tag számára - ez a művelet nem vonható vissza!</string>
<string name="delete_group_for_all_members_cannot_undo_warning">Csoport törlésre kerül minden tag számára - ez a művelet nem vonható vissza!</string>
<string name="v5_2_fix_encryption_descr">Titkosítás javítása az adatmentések helyreállítása után.</string>
<string name="error_deleting_database">Hiba a csevegési adatbázis törlésekor</string>
<string name="simplex_link_mode_full">Teljes hivatkozás</string>
@@ -623,7 +623,7 @@
<string name="conn_event_ratchet_sync_required">titkosítás újraegyeztetés szükséges</string>
<string name="v4_6_hidden_chat_profiles">Rejtett csevegési profilok</string>
<string name="files_and_media_section">Fájlok és média</string>
<string name="image_saved">A kép mentve a „Galériába”</string>
<string name="image_saved">A kép mentve a Galériába</string>
<string name="hide_notification">Elrejt</string>
<string name="la_immediately">Azonnal</string>
<string name="files_and_media_prohibited">A fájlok- és a médiatartalom küldése le van tiltva!</string>
@@ -648,7 +648,7 @@
<string name="ignore">Figyelmen kívül hagyás</string>
<string name="icon_descr_image_snd_complete">Kép elküldve</string>
<string name="notification_preview_mode_hidden">Rejtett</string>
<string name="host_verb">Kiszolgáló</string>
<string name="host_verb">Házigazda</string>
<string name="initial_member_role">Kezdeti szerepkör</string>
<string name="invalid_chat">érvénytelen csevegés</string>
<string name="custom_time_unit_hours">óra</string>
@@ -678,12 +678,12 @@
<string name="network_disable_socks_info">Megerősítés esetén az üzenetküldő kiszolgálók látni fogják az IP-címét és a szolgáltatóját – azt, hogy mely kiszolgálókhoz kapcsolódik.</string>
<string name="image_will_be_received_when_contact_completes_uploading">A kép akkor érkezik meg, amikor a küldője befejezte annak feltöltését.</string>
<string name="desktop_scan_QR_code_from_app_via_scan_QR_code"><![CDATA[💻 asztali számítógép: a megjelenített QR-kód beolvasása az alkalmazásból, a <b>QR kód beolvasásával</b>.]]></string>
<string name="if_you_received_simplex_invitation_link_you_can_open_in_browser">A kapott SimpleX Chat meghívó hivatkozását megnyithatja a böngészőjében:</string>
<string name="if_you_received_simplex_invitation_link_you_can_open_in_browser">A kapott SimpleX Chat meghívó hivatkozását megnyithatja böngészőjében:</string>
<string name="if_you_enter_self_destruct_code">Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő jelkódot:</string>
<string name="found_desktop">Megtalált számítógép</string>
<string name="desktop_devices">Számítógépek</string>
<string name="how_to_use_markdown">A markdown használata</string>
<string name="create_chat_profile">Csevegési profil létrehozása</string>
<string name="create_chat_profile">Csevegő profil létrehozása</string>
<string name="immune_to_spam_and_abuse">Levélszemét elleni védelem</string>
<string name="disconnect_remote_hosts">Mobilok leválasztása</string>
<string name="v4_5_multiple_chat_profiles_descr">Különböző nevek, avatarok és átviteli izoláció.</string>
@@ -691,7 +691,7 @@
<string name="icon_descr_expand_role">Szerepkör kiválasztásának bővítése</string>
<string name="image_will_be_received_when_contact_is_online">A kép akkor érkezik meg, amikor a küldője elérhető lesz, várjon, vagy ellenőrizze később!</string>
<string name="group_member_status_invited">meghíva</string>
<string name="invalid_connection_link">Érvénytelen kapcsolattartási hivatkozás</string>
<string name="invalid_connection_link">Érvénytelen kapcsolati hivatkozás</string>
<string name="mute_chat">Némítás</string>
<string name="no_details">nincsenek részletek</string>
<string name="icon_descr_call_missed">Nem fogadott hívás</string>
@@ -699,13 +699,13 @@
<string name="delete_message_cannot_be_undone_warning">Az üzenet törlésre kerül - ez a művelet nem vonható vissza!</string>
<string name="markdown_help">Markdown segítség</string>
<string name="notification_preview_new_message">új üzenet</string>
<string name="old_database_archive">Régi adatbázis-archívum</string>
<string name="old_database_archive">Régi adatbázis archívum</string>
<string name="network_settings_title">Haladó beállítások</string>
<string name="no_info_on_delivery">Nincs kézbesítési információ</string>
<string name="moderated_description">moderált</string>
<string name="member_will_be_removed_from_group_cannot_be_undone">A tag eltávolítása a csoportból - ez a művelet nem vonható vissza!</string>
<string name="ensure_xftp_server_address_are_correct_format_and_unique">Győződjön meg róla, hogy az XFTP kiszolgáló címei megfelelő formátumúak, sorszeparáltak és nincsenek duplikálva.</string>
<string name="no_contacts_selected">Nincs kiválasztva ismerős</string>
<string name="no_contacts_selected">Nem kerültek ismerősök kiválasztásra</string>
<string name="no_received_app_files">Nincsenek fogadott, vagy küldött fájlok</string>
<string name="mobile_tap_open_in_mobile_app_then_tap_connect_in_app"><![CDATA[📱 mobil: koppintson a <b>Megnyitás mobil alkalmazásban</b>, majd koppintson a <b>Kapcsolódás</b> gombra az alkalmazásban.]]></string>
<string name="markdown_in_messages">Markdown az üzenetekben</string>
@@ -721,7 +721,7 @@
<string name="info_row_local_name">Helyi név</string>
<string name="network_and_servers">Hálózat és kiszolgálók</string>
<string name="settings_notification_preview_title">Értesítés előnézet</string>
<string name="v5_4_link_mobile_desktop">Társítsa össze a mobil és asztali alkalmazásokat! 🔗</string>
<string name="v5_4_link_mobile_desktop">Társítsa össze a mobil és az asztali alkalmazásokat! 🔗</string>
<string name="conn_level_desc_indirect">közvetett (%1$s)</string>
<string name="v4_6_reduced_battery_usage_descr">Hamarosan további fejlesztések érkeznek!</string>
<string name="message_reactions_prohibited_in_this_chat">Az üzenetreakciók küldése le van tiltva ebben a csevegésben.</string>
@@ -749,12 +749,12 @@
<string name="network_use_onion_hosts_no_desc">Onion kiszolgálók nem lesznek használva.</string>
<string name="custom_time_unit_minutes">perc</string>
<string name="learn_more">Tudjon meg többet</string>
<string name="notification_new_contact_request">Új ismerőskérelem</string>
<string name="notification_new_contact_request">Új kapcsolattartási kérelem</string>
<string name="joining_group">Csatlakozás a csoporthoz</string>
<string name="linked_desktop_options">Társított számítógép beállítások</string>
<string name="rcv_group_event_invited_via_your_group_link">meghíva az ön csoporthivatkozásán keresztül</string>
<string name="linked_desktop_options">Összekapcsolt számítógép beállítások</string>
<string name="rcv_group_event_invited_via_your_group_link">meghíva az ön csoport hivatkozásán keresztül</string>
<string name="rcv_group_event_member_left">elhagyta a csoportot</string>
<string name="linked_desktops">Társított számítógépek</string>
<string name="linked_desktops">Összekapcsolt számítógépek</string>
<string name="la_no_app_password">Nincs alkalmazás jelkód</string>
<string name="muted_when_inactive">Némítás, ha inaktív!</string>
<string name="alert_title_group_invitation_expired">A meghívó lejárt!</string>
@@ -779,7 +779,7 @@
<string name="v4_5_italian_interface">Olasz kezelőfelület</string>
<string name="system_restricted_background_in_call_title">Nincsenek háttérhívások</string>
<string name="messages_section_title">Üzenetek</string>
<string name="linked_mobiles">Társított mobil eszközök</string>
<string name="linked_mobiles">Összekapcsolt mobil eszközök</string>
<string name="incognito_info_allows">Lehetővé teszi, hogy egyetlen csevegőprofilon belül több anonim kapcsolat legyen, anélkül, hogy megosztott adatok lennének közöttük.</string>
<string name="delete_message_mark_deleted_warning">Az üzenet törlésre lesz jelölve. A címzett(ek) képes(ek) lesz(nek) felfedni ezt az üzenetet.</string>
<string name="leave_group_button">Elhagyás</string>
@@ -800,12 +800,12 @@
<string name="make_profile_private">Tegye priváttá a profilját!</string>
<string name="message_delivery_error_title">Üzenetkézbesítési hiba</string>
<string name="v4_5_multiple_chat_profiles">Több csevegőprofil</string>
<string name="marked_deleted_description">törlésre jelölve</string>
<string name="marked_deleted_description">töröltnek jelölve</string>
<string name="user_mute">Némítás</string>
<string name="link_a_mobile">Egy mobil eszköz társítása</string>
<string name="link_a_mobile">Egy mobil összekapcsolása</string>
<string name="settings_notifications_mode_title">Értesítési szolgáltatás</string>
<string name="only_group_owners_can_enable_voice">Csak a csoporttulajdonosok engedélyezhetik a hangüzenetek küldését.</string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Csak a kliensek tárolják a felhasználói profilokat, ismerősöket, csoportokat és a <b>2 rétegű végpontok közötti titkosítással</b> küldött üzeneteket.]]></string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Csak a kliensek tárolják a felhasználói profilokat, ismerősöket, csoportokat és a <b>2 rétegű végponttól-végpontig titkosítással</b> küldött üzeneteket.]]></string>
<string name="invalid_migration_confirmation">Érvénytelen átköltöztetési visszaigazolás</string>
<string name="only_group_owners_can_change_prefs">Csak a csoporttulajdonosok módosíthatják a csoportbeállításokat.</string>
<string name="no_history">Nincsenek előzmények</string>
@@ -823,26 +823,26 @@
<string name="feature_offered_item">ajánlott %s</string>
<string name="button_leave_group">Csoport elhagyása</string>
<string name="unblock_member_desc">Minden %s által írt üzenet megjelenik!</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Sokan kérdezték: <i>Ha a SimpleX Chatnek nincs felhasználói azonosítója, hogyan lehet mégis üzeneteket küldeni?</i>]]></string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Sokan kérdezték: <i>Ha a SimpleX Chat-nek nincs felhasználói azonosítója, hogyan lehet mégis üzeneteket küldeni?</i>]]></string>
<string name="alert_text_skipped_messages_it_can_happen_when">Ez akkor fordulhat elő, ha:
\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.
\n2. Az üzenet visszafejtése sikertelen volt, mert ön, vagy az ismerőse régebbi adatbázis biztonsági mentést használt.
\n3. A kapcsolat sérült.</string>
<string name="group_member_role_observer">megfigyelő</string>
<string name="description_via_group_link_incognito">inkognitó a csoporthivatkozáson keresztül</string>
<string name="description_via_group_link_incognito">inkognitó a csoportos hivatkozáson keresztül</string>
<string name="network_use_onion_hosts_prefer_desc">Onion kiszolgálók használata, ha azok rendelkezésre állnak.</string>
<string name="invite_friends">Ismerősök meghívása</string>
<string name="color_surface">Menük és figyelmeztetések</string>
<string name="icon_descr_add_members">Tagok meghívása</string>
<string name="group_preview_join_as">csatlakozás mint %s</string>
<string name="no_selected_chat">Nincs kiválasztva csevegés</string>
<string name="no_selected_chat">Nincs kiválasztott csevegés</string>
<string name="users_delete_data_only">Csak helyi profiladatok</string>
<string name="description_via_one_time_link_incognito">inkognitó egy egyszer használatos hivatkozáson keresztül</string>
<string name="description_via_one_time_link_incognito">inkognitó az egyszer használatos hivatkozáson keresztül</string>
<string name="share_text_moderated_at">Moderálva lett ekkor: %s</string>
<string name="one_time_link">Egyszer használatos meghívó hivatkozás</string>
<string name="invalid_name">Érvénytelen név!</string>
<string name="email_invite_subject">Beszélgessünk a SimpleX Chatben</string>
<string name="info_row_moderated_at">Moderálva ekkor:</string>
<string name="email_invite_subject">Beszélgessünk a SimpleX Chat-ben</string>
<string name="info_row_moderated_at">Moderálva lett ekkor:</string>
<string name="v4_4_live_messages">Élő üzenetek</string>
<string name="mark_code_verified">Hitelesítés</string>
<string name="v5_2_message_delivery_receipts">Üzenetkézbesítési bizonylatok!</string>
@@ -864,7 +864,7 @@
<string name="group_member_role_member">tag</string>
<string name="make_private_connection">Privát kapcsolat létrehozása</string>
<string name="moderated_item_description">moderálva lett %s által</string>
<string name="import_theme_error_desc">Győződjön meg arról, hogy a fájl helyes YAML-szintaxist tartalmaz. Exportálja a témát, hogy legyen egy példa a témafájl szerkezetére.</string>
<string name="import_theme_error_desc">Győződjön meg arról, hogy a fájl helyes YAML-szintaxist tartalmaz. Exportálja a témát, hogy legyen egy példa a téma fájl szerkezetére.</string>
<string name="italic_text">dőlt</string>
<string name="non_content_uri_alert_title">Érvénytelen fájl elérési útvonal</string>
<string name="connect_via_group_link">Csatlakozik a csoporthoz?</string>
@@ -904,13 +904,13 @@
<string name="settings_notification_preview_mode_title">Előnézet megjelenítése</string>
<string name="callstate_waiting_for_confirmation">várakozás a visszaigazolásra…</string>
<string name="stop_file__action">Fájl megállítása</string>
<string name="description_via_group_link">a csoporthivatkozáson keresztül</string>
<string name="description_via_group_link">csoport hivatkozáson keresztül</string>
<string name="network_option_ping_interval">PING időköze</string>
<string name="send_disappearing_message">Eltűnő üzenet küldése</string>
<string name="self_destruct_passcode">Önmegsemmisítési jelkód</string>
<string name="save_and_update_group_profile">Mentés és csoportprofil frissítése</string>
<string name="your_privacy">Adatvédelem</string>
<string name="your_simplex_contact_address">Profil SimpleX címe</string>
<string name="your_simplex_contact_address">Az ön SimpleX címe</string>
<string name="alert_text_fragment_please_report_to_developers">Jelentse a fejlesztőknek.</string>
<string name="people_can_connect_only_via_links_you_share">Ön dönti el, hogy kivel beszélget.</string>
<string name="prohibit_sending_disappearing">Az eltűnő üzenetek küldése le van tiltva.</string>
@@ -946,7 +946,7 @@
<string name="connect_via_link_or_qr_from_clipboard_or_in_person">(beolvasás, vagy beillesztés a vágólapról)</string>
<string name="waiting_for_video">Videóra várakozás</string>
<string name="reply_verb">Válasz</string>
<string name="connect_plan_this_is_your_own_one_time_link">Ez az ön egyszer használatos hivatkozása!</string>
<string name="connect_plan_this_is_your_own_one_time_link">Ez az egyszer használatos hivatkozása!</string>
<string name="ntf_channel_calls">SimpleX Chat hívások</string>
<string name="connect_use_new_incognito_profile">Új inkognító profil használata</string>
<string name="contact_developers">Frissítse az alkalmazást, és lépjen kapcsolatba a fejlesztőkkel.</string>
@@ -964,10 +964,10 @@
<string name="scan_code_from_contacts_app">Biztonsági kód beolvasása az ismerősének alkalmazásából.</string>
<string name="observer_cant_send_message_desc">Lépjen kapcsolatba a csoport adminnal.</string>
<string name="icon_descr_video_on">Videó bekapcsolva</string>
<string name="display_name__field">Profilnév:</string>
<string name="display_name__field">Profil neve:</string>
<string name="paste_button">Beillesztés</string>
<string name="thank_you_for_installing_simplex">Köszönjük, hogy telepítette a SimpleX Chatet!</string>
<string name="star_on_github">Csillagozás a GitHubon</string>
<string name="star_on_github">Csillagozás a GitHub-on</string>
<string name="remove_member_confirmation">Eltávolítás</string>
<string name="search_verb">Keresés</string>
<string name="sync_connection_force_question">Titkosítás újraegyeztetése?</string>
@@ -1001,7 +1001,7 @@
<string name="random_port">Véletlen</string>
<string name="share_with_contacts">Megosztás az ismerősökkel</string>
<string name="sender_you_pronoun">ön</string>
<string name="you_have_no_chats">Nincsenek csevegései</string>
<string name="you_have_no_chats">Nincsenek csevegési üzenetek</string>
<string name="send_disappearing_message_send">Küldés</string>
<string name="chat_item_ttl_seconds">%s másodperc</string>
<string name="recipient_colon_delivery_status">%s: %s</string>
@@ -1020,7 +1020,7 @@
<string name="profile_password">Profiljelszó</string>
<string name="theme">Téma</string>
<string name="remove_passphrase_from_settings">Jelmondat eltávolítása a beállításokból?</string>
<string name="simplex_link_group">SimpleX csoporthivatkozás</string>
<string name="simplex_link_group">SimpleX csoport hivatkozás</string>
<string name="icon_descr_waiting_for_image">Képre várakozás</string>
<string name="self_destruct">Önmegsemmisítés</string>
<string name="callstate_waiting_for_answer">várakozás a válaszra…</string>
@@ -1041,11 +1041,11 @@
<string name="use_random_passphrase">Véletlenszerű jelmondat használata</string>
<string name="call_connection_peer_to_peer">egyenrangú</string>
<string name="run_chat_section">CSEVEGÉSI SZOLGÁLTATÁS INDÍTÁSA</string>
<string name="paste_the_link_you_received">Kapott hivatkozás beillesztése</string>
<string name="paste_the_link_you_received">Fogadott hivatkozás beillesztése</string>
<string name="smp_save_servers_question">Kiszolgálók mentése?</string>
<string name="v4_2_security_assessment_desc">A SimpleX Chat biztonsága a Trail of Bits által lett auditálva.</string>
<string name="rcv_group_event_updated_group_profile">frissítette a csoport profilját</string>
<string name="settings_section_title_support">SIMPLEX CHAT TÁMOGATÁSA</string>
<string name="settings_section_title_support">TÁMOGASSA A SIMPLEX CHATET</string>
<string name="simplex_service_notification_title">SimpleX Chat szolgáltatás</string>
<string name="observer_cant_send_message_title">Nem lehet üzeneteket küldeni!</string>
<string name="is_verified">%s ellenőrzött</string>
@@ -1122,13 +1122,13 @@
<string name="your_SMP_servers">SMP kiszolgálók</string>
<string name="send_receipts_disabled_alert_title">Az üzenet kézbesítési jelentések le vannak tiltva</string>
<string name="open_database_folder">Adatbázis mappa megnyitása</string>
<string name="description_via_one_time_link">egy egyszer használatos hivatkozáson keresztül</string>
<string name="description_via_one_time_link">egyszer használatos hivatkozáson keresztül</string>
<string name="set_group_preferences">Csoportbeállítások megadása</string>
<string name="simplex_link_connection">ezen keresztül: %1$s</string>
<string name="chat_preferences_yes">igen</string>
<string name="voice_message">Hangüzenet</string>
<string name="settings_section_title_use_from_desktop">Társítás számítógéppel</string>
<string name="settings_section_title_you">PROFIL</string>
<string name="settings_section_title_use_from_desktop">Használat számítógépről</string>
<string name="settings_section_title_you">ÖN</string>
<string name="network_proxy_port">port %d</string>
<string name="to_connect_via_link_title">Kapcsolódás hivatkozáson keresztül</string>
<string name="share_address">Cím megosztása</string>
@@ -1144,7 +1144,7 @@
<string name="rcv_group_event_user_deleted">eltávolítottak</string>
<string name="simplex_address">SimpleX cím</string>
<string name="show_dev_options">Megjelenítés:</string>
<string name="callstate_received_answer">válasz fogadása…</string>
<string name="callstate_received_answer">fogadott válasz…</string>
<string name="restore_database_alert_title">Adatbázismentés visszaállítása?</string>
<string name="simplex_service_notification_text">Üzenetek fogadása…</string>
<string name="rcv_group_event_2_members_connected">%s és %s kapcsolódott</string>
@@ -1169,7 +1169,7 @@
<string name="prohibit_message_reactions_group">Az üzenetreakciók küldése le van tiltva.</string>
<string name="language_system">Rendszer</string>
<string name="icon_descr_received_msg_status_unread">olvasatlan</string>
<string name="icon_descr_server_status_pending">Függőben</string>
<string name="icon_descr_server_status_pending">Függő</string>
<string name="personal_welcome">Üdvözöljük %1$s!</string>
<string name="remove_passphrase_from_keychain">Jelmondat eltávolítása a Keystrore-ból?</string>
<string name="auth_unlock">Feloldás</string>
@@ -1185,10 +1185,10 @@
<string name="share_image">Kép/videó megoszása…</string>
<string name="group_info_member_you">ön: %1$s</string>
<string name="your_preferences">Beállítások</string>
<string name="reset_color">Színek visszaállítása</string>
<string name="reset_color">Színek alaphelyzetbe állítása</string>
<string name="network_options_save">Mentés</string>
<string name="switch_verb">Váltás</string>
<string name="paste_the_link_you_received_to_connect_with_your_contact">A kapott hivatkozás beillesztése az ismerőshöz való kapcsolódáshoz…</string>
<string name="paste_the_link_you_received_to_connect_with_your_contact">A kapott hivatkozás beillesztése az ismerősökhöz történő kapcsolódáshoz…</string>
<string name="scan_code">Beolvasás</string>
<string name="open_port_in_firewall_title">Port megnyitása a tűzfalon</string>
<string name="callstate_starting">indítás…</string>
@@ -1254,7 +1254,7 @@
<string name="share_text_received_at">Fogadva ekkor: %s</string>
<string name="la_notice_title_simplex_lock">SimpleX zár</string>
<string name="save_and_notify_group_members">Mentés és csoporttagok értesítése</string>
<string name="reset_verb">Visszaállítás</string>
<string name="reset_verb">Alaphelyzetbe állítás</string>
<string name="only_your_contact_can_add_message_reactions">Csak az ismerőse tud üzenetreakciókat küldeni.</string>
<string name="voice_messages">Hangüzenetek</string>
<string name="snd_group_event_user_left">elhagyta a csoportot</string>
@@ -1287,9 +1287,9 @@
<string name="v5_0_large_files_support">Videók és fájlok 1Gb méretig</string>
<string name="network_option_tcp_connection_timeout">TCP kapcsolat időtúllépés</string>
<string name="connect__your_profile_will_be_shared">A(z) %1$s nevű profiljának SimpleX címe megosztásra fog kerülni.</string>
<string name="you_are_already_connected_to_vName_via_this_link">Ön már kapcsolódva van ehhez: %1$s.</string>
<string name="you_are_already_connected_to_vName_via_this_link">Ön már kapcsolódott ehhez: %1$s.</string>
<string name="your_current_chat_database_will_be_deleted_and_replaced_with_the_imported_one">Jelenlegi csevegési adatbázis TÖRLÉSRE és FELCSERÉLÉSRE kerül az importált által!
\nEz a művelet nem vonható vissza - profiljai, ismerősei, csevegési üzenetei és fájljai véglegesen törölve lesznek.</string>
\nEz a művelet nem vonható vissza - profiljai, ismerősei, csevegési üzenetei és fájljai véglegesen törölve lesznek!</string>
<string name="chat_with_the_founder">Ötletek és javaslatok</string>
<string name="database_downgrade_warning">Figyelmeztetés: néhány adat elveszhet!</string>
<string name="tap_to_start_new_chat">Koppintson az új csevegés indításához</string>
@@ -1303,23 +1303,23 @@
<string name="snd_conn_event_switch_queue_phase_completed_for_member">cím megváltoztatva nála: %s</string>
<string name="receiving_files_not_yet_supported">fájlok fogadása egyelőre még nem támogatott</string>
<string name="save_group_profile">Csoportprofil mentése</string>
<string name="network_options_reset_to_defaults">Visszaállítás alaphelyzetbe</string>
<string name="connection_error_auth_desc">Hacsak az ismerőse nem törölte a kapcsolatot, vagy ez a hivatkozás már használatban volt egyszer, lehet hogy ez egy hiba – jelentse a problémát.
\nA kapcsolódáshoz kérje meg az ismerősét, hogy hozzon létre egy másik kapcsolattartási hivatkozást, és ellenőrizze, hogy a hálózati kapcsolat stabil-e.</string>
<string name="network_options_reset_to_defaults">Alaphelyzetbe állítás</string>
<string name="connection_error_auth_desc">Hacsak az ismerőse nem törölte a kapcsolatot, vagy ez a hivatkozás már használatban volt, lehet hogy ez egy hiba – jelentse a problémát.
\nA kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsolati hivatkozást, és ellenőrizze, hogy a hálózati kapcsolat stabil-e.</string>
<string name="video_call_no_encryption">videóhívás (nem e2e titkosított)</string>
<string name="smp_servers_use_server_for_new_conn">Alkalmazás új kapcsolatokhoz</string>
<string name="periodic_notifications_desc">Az új üzenetek rendszeresen letöltésre kerülnek az alkalmazás által – naponta néhány százalékot használ az akkumulátorból. Az alkalmazás nem használ push értesítéseket – az eszközről származó adatok nem kerülnek elküldésre a kiszolgálóknak.</string>
<string name="paste_desktop_address">Számítógép címének beillesztése</string>
<string name="description_via_contact_address_link">kapcsolattartási cím-hivatkozáson keresztül</string>
<string name="to_preserve_privacy_simplex_has_background_service_instead_of_push_notifications_it_uses_a_few_pc_battery"><![CDATA[Az adatvédelem megőrzése érdekében a push értesítési rendszer helyett az alkalmazás a <b>SimpleX háttérszolgáltatást </b> használja - az akkumulátornak csak néhány százalékát használja naponta.]]></string>
<string name="to_preserve_privacy_simplex_has_background_service_instead_of_push_notifications_it_uses_a_few_pc_battery"><![CDATA[Az adatvédelem megőrzése érdekkében a push értesítési rendszer helyett az alkalmazás a <b>SimpleX háttérszolgáltatást </b> használja - az akkumulátor néhány százalékát használja naponta.]]></string>
<string name="alert_text_connection_pending_they_need_to_be_online_can_delete_and_retry">Az ismerősének online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.
\nVisszavonhatja ezt az ismerőskérelmet és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással).</string>
<string name="restore_passphrase_not_found_desc">A jelszó nem található a Keystore-ban, ezért kézzel szükséges megadni. Ez akkor történhetett meg, ha visszaállította az alkalmazás adatait egy biztonságimentési eszközzel. Ha nem így történt, akkor lépjen kapcsolatba a fejlesztőkkel.</string>
\nVisszavonhatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással).</string>
<string name="restore_passphrase_not_found_desc">A jelszó nem található a Keystore-ban, ezért kézzel szükséges megadni. Ez akkor történhetett meg, ha visszaállította az alkalmazás adatait egy biztonsági mentési eszközzel. Ha nem így történt, akkor lépjen kapcsolatba a fejlesztőkkel.</string>
<string name="your_contacts_will_remain_connected">Az ismerősei továbbra is kapcsolódva maradnak.</string>
<string name="error_xftp_test_server_auth">A kiszolgálónak engedélyre van szüksége a várólisták létrehozásához, ellenőrizze jelszavát</string>
<string name="database_initialization_error_desc">Az adatbázis nem működik megfelelően. Koppintson további információért</string>
<string name="stop_snd_file__message">A fájl küldése leállt.</string>
<string name="trying_to_connect_to_server_to_receive_messages">Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál.</string>
<string name="trying_to_connect_to_server_to_receive_messages">Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerőstől érkező üzenetek fogadására szolgál.</string>
<string name="la_could_not_be_verified">Nem lehetett ellenőrizni; próbálja meg újra.</string>
<string name="moderate_message_will_be_marked_warning">Az üzenet minden tag számára moderáltként lesz megjelölve.</string>
<string name="enter_passphrase_notification_desc">Értesítések fogadásához adja meg az adatbázis jelmondatát</string>
@@ -1327,8 +1327,8 @@
<string name="auth_you_will_be_required_to_authenticate_when_you_start_or_resume">Az alkalmazás indításakor, vagy 30 másodpercnyi háttérben töltött idő után az alkalmazáshoz visszatérve hitelesítés szükséges.</string>
<string name="moderate_message_will_be_deleted_warning">Az üzenet minden tag számára törlésre kerül.</string>
<string name="video_decoding_exception_desc">A videó nem dekódolható. Próbálja ki egy másik videóval, vagy lépjen kapcsolatba a fejlesztőkkel.</string>
<string name="this_text_is_available_in_settings">Ez a szöveg a „Beállításokban” érhető el</string>
<string name="profile_will_be_sent_to_contact_sending_link">Profilja elküldésre kerül az ismerőse számára, akitől ezt a hivatkozást kapta.</string>
<string name="this_text_is_available_in_settings">Ez a szöveg a beállítások között érhető el</string>
<string name="profile_will_be_sent_to_contact_sending_link">Profilja elküldésre kerül ismerőse számára, akitől ezt a hivatkozást kapta.</string>
<string name="system_restricted_background_in_call_desc">Az alkalmazás 1 perc után bezárható a háttérben.</string>
<string name="group_preview_you_are_invited">meghívást kapott a csoportba</string>
<string name="turn_off_battery_optimization"><![CDATA[Használatához <b>engedélyezze a SimpleX háttérben történő futását</b> a következő párbeszédpanelen. Ellenkező esetben az értesítések letiltásra kerülnek.]]></string>
@@ -1341,22 +1341,22 @@
<string name="network_error_desc">Hálózati kapcsolat ellenőrzése a következővel: %1$s, és próbálja újra.</string>
<string name="you_can_turn_on_lock">A SimpleX zár az „Adatvédelem és biztonság” menüben kapcsolható be.</string>
<string name="app_was_crashed">Az alkalmazás összeomlott</string>
<string name="please_check_correct_link_and_maybe_ask_for_a_new_one">Ellenőrizze, hogy a megfelelő hivatkozást használta-e, vagy kérje meg az ismerősét, hogy küldjön egy másikat.</string>
<string name="please_check_correct_link_and_maybe_ask_for_a_new_one">Ellenőrizze, hogy a megfelelő hivatkozást használta-e, vagy kérje meg ismerősét, hogy küldjön egy másikat.</string>
<string name="image_decoding_exception_desc">A kép nem dekódolható. Próbálja meg egy másik képpel, vagy lépjen kapcsolatba a fejlesztőkkel.</string>
<string name="non_content_uri_alert_text">Érvénytelen fájl elérési útvonalat osztott meg. Jelentse a problémát az alkalmazás fejlesztőinek.</string>
<string name="failed_to_create_user_duplicate_desc">Már van egy csevegési profil ugyanezzel a megjelenített névvel. Válasszon egy másik nevet.</string>
<string name="trying_to_connect_to_server_to_receive_messages_with_error">Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál (hiba: %1$s).</string>
<string name="trying_to_connect_to_server_to_receive_messages_with_error">Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerőstől érkező üzenetek fogadására szolgál (hiba: %1$s).</string>
<string name="stop_rcv_file__message">A fájl fogadása leállt.</string>
<string name="la_please_remember_to_store_password">Ne felejtse el, vagy tárolja biztonságosan – az elveszett jelszót nem lehet visszaállítani!</string>
<string name="video_will_be_received_when_contact_completes_uploading">A videó akkor érkezik meg, amikor a küldője befejezte annak feltöltését.</string>
<string name="description_you_shared_one_time_link_incognito">egyszer használatos hivatkozást osztott meg inkognitóban</string>
<string name="connected_to_server_to_receive_messages_from_contact">Már kapcsolódott ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál.</string>
<string name="connected_to_server_to_receive_messages_from_contact">Már kapcsolódott ahhoz a kiszolgálóhoz, amely az adott ismerőstől érkező üzenetek fogadására szolgál.</string>
<string name="you_can_enable_delivery_receipts_later">Később engedélyezheti a Beállításokban</string>
<string name="you_will_be_connected_when_group_host_device_is_online">Akkor lesz kapcsolódva a csoporthoz, amikor a csoport tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!</string>
<string name="mtr_error_different">különböző átköltöztetés az alkalmazásban/adatbázisban: %s / %s</string>
<string name="connect_plan_you_are_already_connecting_to_vName"><![CDATA[A kapcsolódás már folyamatban van ehhez: <b>%1$s</b>.]]></string>
<string name="unhide_profile">Profil felfedése</string>
<string name="this_link_is_not_a_valid_connection_link">Ez nem egy érvényes kapcsolattartási hivatkozás!</string>
<string name="this_link_is_not_a_valid_connection_link">Ez a hivatkozás nem érvényes kapcsolati hivatkozás!</string>
<string name="to_verify_compare">A végpontok közötti titkosítás ellenőrzéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) az ismerőse eszközén lévő kóddal.</string>
<string name="you_must_use_the_most_recent_version_of_database">A csevegési adatbázis legfrissebb verzióját CSAK egy eszközön kell használnia, ellenkező esetben előfordulhat, hogy az üzeneteket nem fogja megkapni valamennyi ismerősétől.</string>
<string name="messages_section_description">Ez a beállítás a jelenlegi csevegési profilban lévő üzenetekre érvényes</string>
@@ -1367,7 +1367,7 @@
<string name="contact_sent_large_file">Ismerőse a jelenleg megengedett maximális méretű (%1$s) fájlnál nagyobbat küldött.</string>
<string name="we_do_not_store_contacts_or_messages_on_servers">Az ismerősei és az üzenetek (kézbesítés után) nem kerülnek tárolásra a SimpleX kiszolgálókon.</string>
<string name="you_can_use_markdown_to_format_messages__prompt">Üzenetek formázása a szövegbe szúrt speciális karakterekkel:</string>
<string name="you_can_also_connect_by_clicking_the_link"><![CDATA[A hivatkozásra kattintva is kapcsolódhat. Ha megnyílik böngészőben, kattintson a<b>Megnyitás az alkalmazásban</b> gombra.]]></string>
<string name="you_can_also_connect_by_clicking_the_link"><![CDATA[A hivatkozásra kattintva is kapcsolódhat. Ha megnyílik böngészőben, kattintson a<b>Megnyitás alkalmazásban</b> gombra.]]></string>
<string name="your_chat_profile_will_be_sent_to_your_contact">Csevegési profilja elküldésre kerül
\naz ismerőse számára</string>
<string name="invite_prohibited_description">Egy olyan ismerősét próbálja meghívni, akivel inkognitóprofilt osztott meg abban a csoportban, amelyben a saját fő profilja van használatban</string>
@@ -1379,10 +1379,10 @@
<string name="voice_messages_are_prohibited">A hangüzenetek küldése le van tiltva ebben a csoportban.</string>
<string name="system_restricted_background_in_call_warn"><![CDATA[A háttérben való hívásokhoz válassza ki az <b>Alkalmazás akkumulátor használata</b> / <b>Korlátlan</b> módot az alkalmazás beállításaiban.]]></string>
<string name="v5_4_link_mobile_desktop_descr">Biztonságos kvantumrezisztens protokollon keresztül.</string>
<string name="v5_1_better_messages_descr">- 5 perc hosszúságú hangüzenetek.
\n- egyedi üzenet-eltűnési időkorlát.
\n- előzmények szerkesztése.</string>
<string name="open_on_mobile_and_scan_qr_code"><![CDATA[Válassza a <i>Társítás számítógéppel</i> menüt a mobil alkalmazásban és olvassa be a QR-kódot.]]></string>
<string name="v5_1_better_messages_descr">- hangüzenetek 5 percig.
\n- egyedi eltűnési időhatár.
\n- előzmény szerkesztése.</string>
<string name="open_on_mobile_and_scan_qr_code"><![CDATA[Válassza a <i>Használat számítógépről</i> menüt a mobil alkalmazásban és olvassa be a QR-kódot.]]></string>
<string name="sender_at_ts">%s ekkor: %s</string>
<string name="you_will_be_connected_when_your_contacts_device_is_online">Akkor lesz kapcsolódva, amikor az ismerősének az eszköze online lesz, várjon, vagy ellenőrizze később!</string>
<string name="v5_4_block_group_members_descr">Kéretlen üzenetek elrejtése.</string>
@@ -1411,7 +1411,7 @@
<string name="snd_conn_event_switch_queue_phase_completed">cím megváltoztatva</string>
<string name="v4_3_irreversible_message_deletion_desc">Ismerősei engedélyezhetik a teljes üzenet törlést.</string>
<string name="you_have_to_enter_passphrase_every_time">A jelmondatot minden alkalommal meg kell adnia, amikor az alkalmazás elindul - nem az eszközön kerül tárolásra.</string>
<string name="open_port_in_firewall_desc">Ha engedélyezni szeretné a mobilalkalmazás társítását a számítógéphez, akkor nyissa meg ezt a portot a tűzfalában, ha engedélyezte azt</string>
<string name="open_port_in_firewall_desc">Ha engedélyezni szeretné, hogy egy mobilalkalmazás csatlakozzon a számítógéphez, akkor nyissa meg ezt a portot a tűzfalában, ha engedélyezte azt</string>
<string name="your_profile_is_stored_on_your_device">Profilja, ismerősei és az elküldött üzenetei az eszközön kerülnek tárolásra.</string>
<string name="system_restricted_background_warn"><![CDATA[Az értesítések engedélyezéséhez válassza ki az <b>Alkalmazás akkumulátor használata</b> / <b>Korlátlan</b> módot az alkalmazás beállításaiban.]]></string>
<string name="this_string_is_not_a_connection_link">Ez a karakterlánc nem egy meghívó hivatkozás!</string>
@@ -1419,7 +1419,7 @@
<string name="connect_plan_you_are_already_connecting_via_this_one_time_link">A kapcsolódás már folyamatban van ezen az egyszer használatos hivatkozáson keresztül!</string>
<string name="you_wont_lose_your_contacts_if_delete_address">Nem veszíti el az ismerőseit, ha később törli a címét.</string>
<string name="updating_settings_will_reconnect_client_to_all_servers">A beállítások frissítése a kiszolgálókhoz való újra kapcsolódással jár.</string>
<string name="contact_wants_to_connect_with_you">kapcsolatba akar lépni önnel!</string>
<string name="contact_wants_to_connect_with_you">kapcsolatba akar lépni veled!</string>
<string name="snd_group_event_changed_role_for_yourself">saját szerepköre erre változott: %s</string>
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">A csevegési szolgáltatás elindítható a Beállítások / Adatbázis menüben vagy az alkalmazás újraindításával.</string>
<string name="verify_code_on_mobile">Kód ellenőrzése a mobilon</string>
@@ -1431,18 +1431,18 @@
<string name="v5_3_simpler_incognito_mode_descr">Inkognító mód kapcsolódáskor.</string>
<string name="you_can_share_group_link_anybody_will_be_able_to_connect">Megoszthat egy hivatkozást vagy QR-kódot - így bárki csatlakozhat a csoporthoz. Ha a csoport később törlésre kerül, akkor nem fogja elveszíteni annak tagjait.</string>
<string name="you_joined_this_group">Csatlakozott ehhez a csoporthoz</string>
<string name="connect_plan_this_is_your_link_for_group_vName"><![CDATA[Ez az ön hivatkozása a(z) <b>%1$s</b> csoporthoz!]]></string>
<string name="connect_plan_this_is_your_link_for_group_vName"><![CDATA[Ez a hivatkozása a(z) <b>%1$s</b> csoporthoz!]]></string>
<string name="voice_prohibited_in_this_chat">A hangüzenetek küldése le van tiltva ebben a csevegésben.</string>
<string name="you_control_your_chat">Ön irányítja csevegését!</string>
<string name="verify_code_with_desktop">Kód ellenőrzése a számítógépen</string>
<string name="v4_5_private_filenames_descr">Az időzóna védelme érdekében a kép-/hangfájlok UTC-t használnak.</string>
<string name="connect_via_member_address_alert_desc">A kapcsolódási kérelem elküldésre kerül ezen csoporttag számára.</string>
<string name="connect_via_member_address_alert_desc">A kapcsolódási kérelem elküldésre kerül ezen csoporttag számára</string>
<string name="incognito_info_share">Inkognitóprofil megosztása esetén a rendszer azt a profilt fogja használni azokhoz a csoportokhoz, amelyekbe meghívást kapott.</string>
<string name="connect_plan_you_have_already_requested_connection_via_this_address">Már kért egy kapcsolódási kérelmet ezen a címen keresztül!</string>
<string name="you_can_share_this_address_with_your_contacts">Megoszthatja ezt a SimpleX címet az ismerőseivel, hogy kapcsolatba léphessenek vele: %s.</string>
<string name="you_can_accept_or_reject_connection">Amikor az emberek kapcsolódást kérelmeznek, ön elfogadhatja vagy elutasíthatja azokat.</string>
<string name="v4_6_group_welcome_message_descr">Megjelenítendő üzenet beállítása az új tagok számára!</string>
<string name="whats_new_thanks_to_users_contribute_weblate">Köszönet a felhasználóknak - hozzájárulás a Weblate-en!</string>
<string name="whats_new_thanks_to_users_contribute_weblate">Köszönet a felhasználóknak - hozzájárulás a Weblaten!</string>
<string name="sending_delivery_receipts_will_be_enabled">A kézbesítési jelentés küldése minden ismerős számára engedélyezésre kerül.</string>
<string name="network_option_protocol_timeout_per_kb">Protokoll időkorlát KB-onként</string>
<string name="database_backup_can_be_restored">Az adatbázis jelmondatának megváltoztatására tett kísérlet nem fejeződött be.</string>
@@ -1453,7 +1453,7 @@
<string name="delete_files_and_media_desc">Ez a művelet nem vonható vissza - az összes fogadott és küldött fájl a médiatartalommal együtt törlésre kerülnek. Az alacsony felbontású képek viszont megmaradnak.</string>
<string name="receipts_contacts_override_enabled">Kézbesítési jelentések engedélyezve vannak %d ismerősnél</string>
<string name="sending_via">Küldés ezen keresztül:</string>
<string name="v5_0_polish_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblate-en!</string>
<string name="v5_0_polish_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblaten!</string>
<string name="sending_delivery_receipts_will_be_enabled_all_profiles">A kézbesítési jelentések küldése engedélyezésre kerül az összes látható csevegési profilban lévő minden ismerős számára.</string>
<string name="v4_6_audio_video_calls_descr">Bluetooth támogatás és további fejlesztések.</string>
<string name="in_developing_desc">Ez a funkció még nem támogatott. Próbálja meg a következő kiadásban.</string>
@@ -1467,13 +1467,13 @@
<string name="set_password_to_export">Jelmondat beállítása az exportáláshoz</string>
<string name="receipts_groups_override_disabled">Kézbesítési jelentések le vannak tiltva a(z) %d csoportban</string>
<string name="non_fatal_errors_occured_during_import">Néhány nem végzetes hiba történt az importálás közben:</string>
<string name="v4_5_italian_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblate-en!</string>
<string name="v4_5_italian_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblaten!</string>
<string name="relay_server_if_necessary">Az átjátszó kiszolgáló csak szükség esetén kerül használatra. Egy másik fél megfigyelheti az IP-címet.</string>
<string name="v5_0_app_passcode_descr">Rendszerhitelesítés helyetti beállítás.</string>
<string name="switch_receiving_address_desc">A fogadó cím egy másik kiszolgálóra változik. A címváltoztatás a feladó online állapotba kerülése után fejeződik be.</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">A csevegés megállítása a csevegő adatbázis exportálásához, importálásához, vagy törléséhez. A csevegés megállítása alatt nem tud üzeneteket fogadni és küldeni.</string>
<string name="save_passphrase_in_keychain">Jelmondat mentése a Keystore-ba</string>
<string name="v4_6_chinese_spanish_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblate-en!</string>
<string name="v4_6_chinese_spanish_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblaten!</string>
<string name="save_passphrase_in_settings">Jelmondat mentése a beállításokban</string>
<string name="send_receipts_disabled_alert_msg">Ennek a csoportnak több mint %1$d tagja van, a kézbesítési jelentések nem kerülnek elküldésre.</string>
<string name="v5_2_message_delivery_receipts_descr">A második jelölés, amit kihagytunk! ✅</string>
@@ -1484,18 +1484,18 @@
<string name="receipts_groups_override_enabled">Kézbesítési jelentések engedélyezve vannak a(z) %d csoportban</string>
<string name="member_role_will_be_changed_with_notification">A szerepkör meg fog változni erre: „%s”. A csoportban mindenki értesítve lesz.</string>
<string name="users_delete_with_connections">Profil és kiszolgálókapcsolatok</string>
<string name="the_messaging_and_app_platform_protecting_your_privacy_and_security">Egy üzenetküldő- és alkalmazásplatform, amely védi az adatait és biztonságát.</string>
<string name="the_messaging_and_app_platform_protecting_your_privacy_and_security">Egy üzenetküldő- és alkalmazásplatform, amely védi az ön adatait és biztonságát.</string>
<string name="tap_to_activate_profile">A profil aktiválásához koppintson az ikonra.</string>
<string name="receipts_contacts_override_disabled">Kézbesítési jelentések le vannak tiltva %d ismerősnél</string>
<string name="session_code">Munkamenet kód</string>
<string name="v4_4_french_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblate-en!</string>
<string name="v4_4_french_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblaten!</string>
<string name="receipts_section_groups">Kis csoportok (max. 20 tag)</string>
<string name="connection_you_accepted_will_be_cancelled">Az ön által elfogadott kérelem vissza lesz vonva!</string>
<string name="connection_you_accepted_will_be_cancelled">Az ön által elfogadott kapcsolat vissza lesz vonva!</string>
<string name="send_live_message_desc">Élő üzenet küldése - a címzett(ek) számára frissül, ahogy beírja</string>
<string name="settings_section_title_delivery_receipts">A KÉZBESÍTÉSI JELENTÉSEKET A KÖVETKEZŐ CÍMRE KELL KÜLDENI</string>
<string name="alert_text_msg_bad_id">A következő üzenet azonosítója hibás (kisebb vagy egyenlő az előzővel).
\nEz valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</string>
<string name="this_device_name_shared_with_mobile">Az eszköz neve megosztásra kerül a társított mobil klienssel.</string>
<string name="this_device_name_shared_with_mobile">Az eszköz neve megosztásra kerül a csatlakoztatott mobil klienssel.</string>
<string name="v4_4_live_messages_desc">A címzettek a beírás közben látják a frissítéseket.</string>
<string name="store_passphrase_securely">Tárolja el biztonságosan jelmondatát, mert ha elveszíti azt, NEM tudja megváltoztatni.</string>
<string name="passphrase_will_be_saved_in_settings">A jelmondat a beállítások között egyszerű szövegként kerül tárolásra, miután megváltoztatta vagy újraindította az alkalmazást.</string>
@@ -1510,15 +1510,15 @@
<string name="read_more_in_user_guide_with_link"><![CDATA[További információ a <font color="#0088ff">Használati útmutatóban</font> olvasható.]]></string>
<string name="settings_is_storing_in_clear_text">A jelmondat a beállításokban egyszerű szövegként van tárolva.</string>
<string name="terminal_always_visible">Konzol megjelenítése új ablakban</string>
<string name="alert_text_msg_bad_hash">Az előző üzenet hasító értéke különbözik.</string>
<string name="alert_text_msg_bad_hash">Az előző üzenet ellenőrzőösszege különbözik.</string>
<string name="receipts_section_description">Ezek a beállítások a jelenlegi profiljára vonatkoznak</string>
<string name="loading_remote_file_desc">Várjon, amíg a fájl betöltődik a társított mobilról</string>
<string name="loading_remote_file_desc">Várjon, amíg a fájl betöltődik a csatolt mobilról</string>
<string name="read_more_in_github_with_link"><![CDATA[További információ a <font color="#0088ff">GitHub tárolónkban</font>.]]></string>
<string name="error_showing_content">hiba a tartalom megjelenítésekor</string>
<string name="error_showing_content">hiba a tartalom megjelenítése közben</string>
<string name="error_showing_message">hiba az üzenet megjelenítésekor</string>
<string name="you_can_make_address_visible_via_settings">Láthatóvá teheti a SimpleXbeli ismerősei számára a „Beállításokban”.</string>
<string name="you_can_make_address_visible_via_settings">Láthatóvá teheti SimpleX-beli ismerősei számára a Beállításokban.</string>
<string name="recent_history_is_sent_to_new_members">Legfeljebb az utolsó 100 üzenet kerül elküldésre az új tagok számára.</string>
<string name="code_you_scanned_is_not_simplex_link_qr_code">A beolvasott QR-kód nem egy SimpleX QR-kód hivatkozás.</string>
<string name="code_you_scanned_is_not_simplex_link_qr_code">A beolvasott kód nem egy SimpleX hivatkozás QR-kód.</string>
<string name="the_text_you_pasted_is_not_a_link">A beillesztett szöveg nem egy SimpleX hivatkozás.</string>
<string name="you_can_view_invitation_link_again">A meghívó hivatkozását újra megtekintheti a kapcsolat részleteinél.</string>
<string name="start_chat_question">Csevegés indítása?</string>
@@ -1567,9 +1567,9 @@
\n%s</string>
<string name="remote_host_error_bad_version"><![CDATA[A(z) <b>%s</b> mobil eszköz verziója nem támogatott. Győződjön meg arról, hogy mindkét eszközön ugyanazt a verziót használja]]></string>
<string name="remote_host_error_disconnected"><![CDATA[Megszakadt a kapcsolat a(z) <b>%s</b> mobil eszközzel]]></string>
<string name="failed_to_create_user_invalid_title">Érvénytelen megjelenítendő név!</string>
<string name="failed_to_create_user_invalid_desc">Ez a megjelenített név érvénytelen. Válasszon egy másik nevet.</string>
<string name="remote_host_disconnected_from"><![CDATA[Megszakadt a kapcsolat a(z) <b>%s</b> mobil eszközzel, a(z) %s probléma miatt]]></string>
<string name="failed_to_create_user_invalid_title">Érvénytelen megjelenítendő felhaszálónév!</string>
<string name="failed_to_create_user_invalid_desc">Ez a megjelenített felhasználónév érvénytelen. Válasszon egy másik nevet.</string>
<string name="remote_host_disconnected_from"><![CDATA[Megszakadt a kapcsolat a <b>%s</b> mobil eszközzel, a(z) %s probléma miatt]]></string>
<string name="remote_ctrl_disconnected_with_reason">%s probléma miatt megszakadt a kapcsolat</string>
<string name="remote_host_error_missing"><![CDATA[A(z) <b>%s</b> mobil eszköz nem található]]></string>
<string name="remote_host_error_bad_state"><![CDATA[A kapcsolat a(z) <b>%s</b> mobil eszközzel rossz állapotban van]]></string>
@@ -1581,7 +1581,7 @@
<string name="developer_options_section">Fejlesztői beállítások</string>
<string name="possible_slow_function_desc">A funkció végrehajtása túl sokáig tart: %1$d másodperc: %2$s</string>
<string name="remote_host_error_busy"><![CDATA[A(z) <b>%s</b> mobil eszköz elfoglalt]]></string>
<string name="past_member_vName">%1$s (már nem tag)</string>
<string name="past_member_vName">Már nem tag - %1$s</string>
<string name="group_member_status_unknown">ismeretlen státusz</string>
<string name="profile_update_event_member_name_changed">%1$s megváltoztatta a nevét erre: %2$s</string>
<string name="profile_update_event_removed_address">törölt kapcsolattartási cím</string>
@@ -1612,13 +1612,13 @@
<string name="member_info_member_blocked">letiltva</string>
<string name="blocked_by_admin_item_description">letiltva az admin által</string>
<string name="member_blocked_by_admin">Letiltva az admin által</string>
<string name="rcv_group_event_member_blocked">letiltotta őt: %s</string>
<string name="rcv_group_event_member_blocked">letiltotta %s-t</string>
<string name="block_for_all">Letiltás mindenki számára</string>
<string name="block_for_all_question">Mindenki számára letiltja ezt a tagot?</string>
<string name="blocked_by_admin_items_description">%d üzenet letiltva az admin által</string>
<string name="unblock_for_all">Letiltás feloldása mindenki számára</string>
<string name="unblock_for_all_question">Mindenki számára feloldja a tag letiltását?</string>
<string name="snd_group_event_member_blocked">ön letiltotta őt: %s</string>
<string name="snd_group_event_member_blocked">ön letiltotta %s-t</string>
<string name="error_blocking_member_for_all">Hiba a tag mindenki számára való letiltása közben</string>
<string name="message_too_large">Az üzenet túl nagy</string>
<string name="welcome_message_is_too_long">Az üdvözlő üzenet túl hosszú</string>
@@ -1642,7 +1642,7 @@
<string name="migrate_from_device_cancel_migration">Átköltöztetés visszavonása</string>
<string name="migrate_to_device_chat_migrated">A csevegés átköltöztetve!</string>
<string name="migrate_from_device_check_connection_and_try_again">Ellenőrizze az internetkapcsolatot, és próbálja újra</string>
<string name="migrate_from_device_creating_archive_link">Archívum hivatkozás létrehozása</string>
<string name="migrate_from_device_creating_archive_link">Archív hivatkozás létrehozása</string>
<string name="migrate_from_device_delete_database_from_device">Adatbázis törlése erről az eszközről</string>
<string name="migrate_to_device_download_failed">Sikertelen letöltés</string>
<string name="migrate_to_device_downloading_archive">Archívum letöltése</string>
@@ -1671,7 +1671,7 @@
<string name="migrate_to_device_confirm_network_settings_footer">Ellenőrizze, hogy a hálózati beállítások megfelelőek-e ehhez az eszközhöz.</string>
<string name="migrate_from_device_chat_should_be_stopped">A folytatáshoz a csevegést meg kell szakítani.</string>
<string name="migrate_from_device_stopping_chat">Csevegés megállítása folyamatban</string>
<string name="migrate_from_device_or_share_this_file_link">Vagy ossza meg biztonságosan ezt a fájlhivatkozást</string>
<string name="migrate_from_device_or_share_this_file_link">Vagy a fájl hivítkozásának biztonságos megosztása</string>
<string name="migrate_from_device_start_chat">Csevegés indítása</string>
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[<b>Nem szabad</b> ugyanazt az adatbázist használni egyszerre két eszközön.]]></string>
<string name="migrate_from_device_confirm_you_remember_passphrase">Erősítse meg, hogy emlékszik az adatbázis jelmondatára az átköltöztetéshez.</string>
@@ -1726,7 +1726,7 @@
<string name="feature_roles_owners">tulajdonosok</string>
<string name="feature_roles_admins">adminok</string>
<string name="feature_roles_all_members">minden tag</string>
<string name="simplex_links">SimpleX hivatkozások</string>
<string name="simplex_links">SimpleX hivatkozás</string>
<string name="voice_messages_not_allowed">A hangüzenetek küldése le van tiltva</string>
<string name="simplex_links_are_prohibited_in_group">A SimpleX hivatkozások küldése le van tiltva ebben a csoportban.</string>
<string name="prohibit_sending_simplex_links">A SimpleX hivatkozások küldése le van tiltva</string>
@@ -1840,14 +1840,14 @@
<string name="v5_8_private_routing">Privát üzenet útválasztás 🚀</string>
<string name="v5_8_safe_files">Fájlok biztonságos fogadása</string>
<string name="v5_8_message_delivery_descr">Csökkentett akkumulátor-használattal.</string>
<string name="error_initializing_web_view">Hiba a WebView inicializálásában. Frissítse rendszerét az új verzióra. Lépjen kapcsolatba a fejlesztőkkel.
<string name="error_initializing_web_view">Hiba a WebView inicializálásában. Frissítse rendszerét az új verzióra. Kérjük, lépjen kapcsolatba a fejlesztőkkel.
\nHiba: %s</string>
<string name="chat_theme_reset_to_user_theme">Felhasználó által létrehozott téma visszaállítása</string>
<string name="message_queue_info">Üzenet várakoztatási információ</string>
<string name="message_queue_info_none">nincs</string>
<string name="info_row_debug_delivery">Kézbesítési hibák felderítése</string>
<string name="message_queue_info_server_info">kiszolgáló várakoztatási infó: %1$s
\nutoljára kézbesített üzenet: %2$s</string>
<string name="message_queue_info_server_info">Kiszolgáló várakoztatási infó: %1$s
\nUtoljára kézbesített üzenet: %2$s</string>
<string name="file_error_auth">Hibás kulcs vagy ismeretlen fájltöredék cím - valószínűleg a fájl törlődött.</string>
<string name="temporary_file_error">Ideiglenes fájlhiba</string>
<string name="info_row_message_status">Üzenetállapot</string>
@@ -1858,7 +1858,7 @@
<string name="info_row_file_status">Fájlállapot</string>
<string name="share_text_file_status">Fájlállapot: %s</string>
<string name="copy_error">Másolási hiba</string>
<string name="remote_ctrl_connection_stopped_identity_desc">Ezt a hivatkozást egy másik mobileszközön már használták, hozzon létre egy új hivatkozást az asztali számítógépén.</string>
<string name="remote_ctrl_connection_stopped_identity_desc">Ezt a hivatkozást egy másik mobilleszközön már használták, hozzon létre egy új hivatkozást az asztali számítógépén.</string>
<string name="remote_ctrl_connection_stopped_desc">Ellenőrizze, hogy a mobil és az asztali számítógép ugyanahhoz a helyi hálózathoz csatlakozik-e, valamint az asztali számítógép tűzfalában engedélyezve van-e a kapcsolat.
\nMinden további problémát osszon meg a fejlesztőkkel.</string>
<string name="cannot_share_message_alert_title">Nem lehet üzenetet küldeni</string>
@@ -1870,13 +1870,13 @@
<string name="member_inactive_desc">Az üzenet később is kézbesíthető, ha a tag aktívvá válik.</string>
<string name="message_forwarded_desc">Még nincs közvetlen kapcsolat, az üzenetet az admin továbbítja.</string>
<string name="scan_paste_link">Hivatkozás beolvasása / beillesztése</string>
<string name="smp_servers_configured">Konfigurált SMP-kiszolgálók</string>
<string name="smp_servers_configured">Beállított SMP-kiszolgálók</string>
<string name="smp_servers_other">Egyéb SMP-kiszolgálók</string>
<string name="xftp_servers_other">Egyéb XFTP-kiszolgálók</string>
<string name="member_info_member_disabled">letiltva</string>
<string name="member_info_member_inactive">inaktív</string>
<string name="appearance_zoom">Nagyítás</string>
<string name="servers_info">Információk a kiszolgálókról</string>
<string name="servers_info">információk a kiszolgálókról</string>
<string name="servers_info_sessions_connecting">Kapcsolódás</string>
<string name="servers_info_sessions_errors">Hibák</string>
<string name="servers_info_subscriptions_connections_pending">Függőben</string>
@@ -1892,7 +1892,7 @@
<string name="servers_info_reset_stats_alert_confirm">Visszaállítás</string>
<string name="servers_info_reset_stats">Minden statisztika visszaállítása</string>
<string name="servers_info_reset_stats_alert_title">Minden statisztika visszaállítása?</string>
<string name="servers_info_reset_stats_alert_message">A kiszolgálók statisztikái visszaállnak - ez a művelet nem vonható vissza!</string>
<string name="servers_info_reset_stats_alert_message">A kiszolgálók statisztikái visszaállnak - ez nem vonható vissza!</string>
<string name="servers_info_detailed_statistics">Részletes statisztikák</string>
<string name="servers_info_downloaded">Letöltve</string>
<string name="expired_label">lejárt</string>
@@ -1930,7 +1930,7 @@
<string name="chunks_uploaded">Feltöltött fájltöredékek</string>
<string name="completed">Elkészült</string>
<string name="servers_info_connected_servers_section_header">Kapcsolódott kiszolgálók</string>
<string name="xftp_servers_configured">Konfigurált XFTP-kiszolgálók</string>
<string name="xftp_servers_configured">Beállított XFTP-kiszolgálók</string>
<string name="servers_info_sessions_connected">Kapcsolódva</string>
<string name="current_user">Jelenlegi profil</string>
<string name="servers_info_details">Részletek</string>
@@ -2023,7 +2023,7 @@
<string name="you_need_to_allow_calls">Engedélyeznie kell a hívásokat az ismerőse számára, hogy fel tudják hívni egymást.</string>
<string name="you_can_still_view_conversation_with_contact">A(z) %1$s nevű ismerősével folytatott beszélgetéseit továbbra is megtekintheti a csevegések listájában.</string>
<string name="compose_message_placeholder">Üzenet</string>
<string name="select_verb">Kiválasztás</string>
<string name="select_verb">Kiválaszt</string>
<string name="moderate_messages_will_be_marked_warning">Az üzenetek minden tag számára moderáltként lesznek megjelölve.</string>
<string name="selected_chat_items_nothing_selected">Nincs kiválasztva semmi</string>
<string name="delete_messages_mark_deleted_warning">Az üzenetek törlésre lesznek jelölve. A címzett(ek) képes(ek) lesz(nek) felfedni ezt az üzenetet.</string>
@@ -2032,7 +2032,7 @@
<string name="moderate_messages_will_be_deleted_warning">Az üzenetek minden tag számára törlésre kerülnek.</string>
<string name="chat_database_exported_title">Csevegési adatbázis exportálva</string>
<string name="v6_0_connection_servers_status_descr">Kapcsolatok- és kiszolgálók állapotának megjelenítése.</string>
<string name="v6_0_connect_faster_descr">Kapcsolódjon gyorsabban az ismerőseihez.</string>
<string name="v6_0_connect_faster_descr">Kapcsolódjon gyorsabban az ismerőseihez</string>
<string name="chat_database_exported_continue">Folytatás</string>
<string name="v6_0_connection_servers_status">Ellenőrízze a hálózatát</string>
<string name="media_and_file_servers">Média- és fájlkiszolgálók</string>
@@ -2052,11 +2052,11 @@
<string name="one_hand_ui_card_title">Csevegőlista átváltása:</string>
<string name="one_hand_ui_change_instruction">Ezt a „Megjelenés” menüben módosíthatja.</string>
<string name="v6_0_new_media_options">Új médiabeállítások</string>
<string name="v6_0_chat_list_media">Lejátszás a csevegési listából.</string>
<string name="v6_0_privacy_blur">Elhomályosítás a jobb adatvédelemért.</string>
<string name="v6_0_chat_list_media">Lejátszás a csevegési listából</string>
<string name="v6_0_privacy_blur">Elhomályosítás a jobb adatvédelemért</string>
<string name="v6_0_upgrade_app">Automatikus frissítés</string>
<string name="create_address_button">Létrehozás</string>
<string name="v6_0_upgrade_app_descr">Új verziók letöltése a GitHubról</string>
<string name="v6_0_upgrade_app_descr">Új verziók letöltése a GitHub-ról</string>
<string name="v6_0_increase_font_size">Betűméret növelése.</string>
<string name="invite_friends_short">Meghívás</string>
<string name="v6_0_new_chat_experience">Új csevegési élmény 🎉</string>
@@ -2,16 +2,16 @@
<resources>
<string name="group_info_section_title_num_members">%1$s ANGGOTA</string>
<string name="address_section_title">Alamat</string>
<string name="moderated_items_description">%1$d pesan dimoderasi oleh %2$s</string>
<string name="moderated_items_description">%1$d pesan dihapus admin %2$s</string>
<string name="send_disappearing_message_1_minute">1 menit</string>
<string name="send_disappearing_message_30_seconds">30 detik</string>
<string name="send_disappearing_message_5_minutes">5 menit</string>
<string name="clear_chat_warning">Semua pesan akan dihapus - ini tidak bisa dikembalikan! Pesan akan HANYA dihapus untukmu.</string>
<string name="accept_connection_request__question">Terima permintaan koneksi?</string>
<string name="accept_connection_request__question">Terima permintaan relasi?</string>
<string name="learn_more_about_address">Tentang alamat SimpleX</string>
<string name="add_contact_tab">Tambah kontak</string>
<string name="about_simplex">Tentang SimpleX</string>
<string name="alert_text_decryption_error_n_messages_failed_to_decrypt">%1$d pesan gagal terdekripsi.</string>
<string name="alert_text_decryption_error_n_messages_failed_to_decrypt">%1$d gagal mendekripsi pesan.</string>
<string name="alert_text_fragment_please_report_to_developers">Tolong laporkan hal ini ke pengembang.</string>
<string name="chat_item_ttl_month">1 bulan</string>
<string name="chat_item_ttl_week">1 minggu</string>
@@ -19,7 +19,7 @@
<string name="connect_plan_you_are_already_in_group_vName"><![CDATA[Anda sudah bergabung dalam grup <b>%1$s</b>.]]></string>
<string name="call_service_notification_audio_call">Panggilan suara</string>
<string name="abort_switch_receiving_address_confirm">Batal</string>
<string name="allow_voice_messages_question">Izinkan pesan suara?</string>
<string name="allow_voice_messages_question">izinkan pesan suara?</string>
<string name="accept_contact_button">Terima</string>
<string name="app_version_title">Versi aplikasi</string>
<string name="app_version_name">Versi aplikasi: v%s</string>
@@ -30,13 +30,13 @@
<string name="users_add">Tambah profil</string>
<string name="color_primary">Corak</string>
<string name="color_secondary_variant">Tambahan sekunder</string>
<string name="theme_destination_app_theme">Tema aplikasi</string>
<string name="theme_destination_app_theme">Motif aplikasi</string>
<string name="chat_preferences_always">selalu</string>
<string name="allow_to_send_voice">Izinkan mengirim pesan suara.</string>
<string name="allow_to_send_voice">diizinkan mengirim pesan suara.</string>
<string name="feature_roles_all_members">semua anggota</string>
<string name="v4_6_audio_video_calls">Panggilan suara dan video</string>
<string name="v5_2_more_things">Beberapa hal lainnya</string>
<string name="connect_plan_already_connecting">Sudah terhubungkan!</string>
<string name="v5_2_more_things">Hal-hal lain</string>
<string name="connect_plan_already_connecting">Sudah menghubungi!</string>
<string name="connect_plan_already_joining_the_group">Sudah bergabung dengan grup!</string>
<string name="contact_wants_to_connect_via_call">%1$s ingin menghubungimu lewat</string>
<string name="abort_switch_receiving_address_question">Batalkan penggantian alamat?</string>
@@ -54,7 +54,7 @@
<string name="bold_text">tebal</string>
<string name="callstatus_calling">menelepon…</string>
<string name="audio_device_bluetooth">Bluetooth</string>
<string name="icon_descr_call_ended">Panggilan diakhiri</string>
<string name="icon_descr_call_ended">Panggilan ditutup</string>
<string name="change_verb">Ubah</string>
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>Peringatan</b>: arsip akan dihapus.]]></string>
<string name="create_group_button_to_create_new_group"><![CDATA[<b>Buat grup</b>: untuk membuat grup baru.]]></string>
@@ -112,154 +112,4 @@
<string name="app_was_crashed">Tampilan macet</string>
<string name="non_content_uri_alert_text">Anda membagikan lokasi file yang tidak valid. Laporkan masalah ini ke pengembang aplikasi.</string>
<string name="server_error">error</string>
<string name="one_time_link_short">Tuatan 1 kali pakai</string>
<string name="integrity_msg_skipped">%1$d pesan yang terlewati</string>
<string name="alert_text_decryption_error_too_many_skipped">%1$d pesan yang dilewati</string>
<string name="remote_host_error_bad_version"><![CDATA[Versi perangkat <b>%s</b> tidak didukung. Harap pastikan kamu menggunakan versi yang sama pada kedua perangkat.]]></string>
<string name="remote_host_error_busy"><![CDATA[Perangkat <b>%s</b> sedang sibuk]]></string>
<string name="remote_host_error_disconnected"><![CDATA[Perangkat <b>%s</b> tidak terhubung]]></string>
<string name="remote_host_error_inactive"><![CDATA[Perangkat <b>%s</b> tidak aktif]]></string>
<string name="remote_host_error_missing"><![CDATA[Perangkat <b>%s</b> tidak di temukan]]></string>
<string name="accept_contact_incognito_button">Terima penyamaran</string>
<string name="callstatus_accepted">panggilan diterima</string>
<string name="v5_3_new_interface_languages">6 bahasa antarmuka baru</string>
<string name="remote_host_was_disconnected_toast"><![CDATA[Perangkat <b>%s</b> tidak terhubung]]></string>
<string name="la_no_app_password">Tidak ada kode sandi aplikasi</string>
<string name="message_forwarded_desc">Belum ada koneksi langsung, pesan diteruskan oleh admin.</string>
<string name="no_filtered_chats">Tidak ada obrolan yang difilter</string>
<string name="selected_chat_items_nothing_selected">Tidak ada yang dipilih</string>
<string name="images_limit_desc">Hanya 10 gambar dapat dikirim pada saat bersamaan</string>
<string name="notifications">Notifikasi</string>
<string name="only_delete_conversation">Hanya menghapus percakapan</string>
<string name="v5_7_network_descr">Koneksi jaringan yang lebih handal.</string>
<string name="v6_0_new_chat_experience">Pengalaman obrolan yang baru 🎉</string>
<string name="v6_0_new_media_options">Pilihan media baru</string>
<string name="allow_calls_question">Izinkan panggilan?</string>
<string name="new_message">Pesan baru</string>
<string name="only_you_can_send_disappearing">Hanya kamu yang dapat mengirim pesan menghilang.</string>
<string name="first_platform_without_user_ids">Tidak ada pengidentifikasi pengguna.</string>
<string name="only_group_owners_can_change_prefs">Hanya pemilik grup yang dapat mengubah preferensi grup.</string>
<string name="rcv_group_and_other_events">dan %d peristiwa lainnya</string>
<string name="new_member_role">Peran baru anggota</string>
<string name="no_contacts_selected">Tidak ada kontak di pilih</string>
<string name="no_contacts_to_add">Tidak ada kontak untuk ditambahkan</string>
<string name="item_info_no_text">Tidak ada teks</string>
<string name="block_member_desc">Semua pesan baru dari %s akan disembunyikan!</string>
<string name="message_queue_info_none">tidak ada</string>
<string name="network_status">Status jaringan</string>
<string name="users_delete_all_chats_deleted">Seluruh obrolan dan pesan akan dihapus - ini tidak bisa dibatalkan!</string>
<string name="no_connected_mobile">Tidak ada perangkat terkoneksi</string>
<string name="system_restricted_background_in_call_title">Tidak ada panggilan latar</string>
<string name="settings_notification_preview_title">Pratinjau notifikasi</string>
<string name="settings_notifications_mode_title">Layanan notifikasi</string>
<string name="notifications_mode_service">Selalu aktif</string>
<string name="notification_new_contact_request">Permintaan kontak baru</string>
<string name="notification_preview_new_message">Pesan baru</string>
<string name="message_delivery_error_desc">Kemungkinan besar kontak ini telah menghapus koneksi dengan kamu.</string>
<string name="snd_error_expired">Masalah jaringan - pesan kadaluwarsa setelah beberapa kali mencoba mengirim.</string>
<string name="no_selected_chat">Tidak ada obrolan dipilih</string>
<string name="only_owners_can_enable_files_and_media">Hanya pemilik grup yang dapat mengaktifkan file dan media.</string>
<string name="only_stored_on_members_devices">(hanya disimpan oleh anggota grup)</string>
<string name="icon_descr_more_button">Lagi</string>
<string name="one_time_link">Tautan undangan satu kali</string>
<string name="new_chat">Obrolan baru</string>
<string name="network_and_servers">Jaringan &amp; server</string>
<string name="network_settings_title">Pengaturan tingkat lanjut</string>
<string name="network_use_onion_hosts_required_desc">Host Onion akan diperlukan untuk koneksi.
\nHarap diperhatikan: Anda tidak akan dapat terhubung ke server tanpa alamat .onion.</string>
<string name="network_use_onion_hosts_no_desc">Host Onion tidak akan digunakan.</string>
<string name="network_smp_proxy_mode_always_description">Selalu gunakan perutean pribadi.</string>
<string name="shutdown_alert_desc">Pemberitahuan akan berhenti bekerja sampai kamu meluncurkan ulang aplikasi</string>
<string name="all_your_contacts_will_remain_connected_update_sent">Semua kontak kamu akan tetap terhubung. Pembaruan profil akan dikirim ke kontak kamu.</string>
<string name="status_no_e2e_encryption">Tidak ada enkripsi ujung-ujung</string>
<string name="new_passcode">Kode sandi baru</string>
<string name="la_mode_off">Mati</string>
<string name="all_app_data_will_be_cleared">Seluruh data aplikasi dihapus.</string>
<string name="new_database_archive">Arsip database baru</string>
<string name="old_database_archive">Arsip database lama</string>
<string name="chat_item_ttl_none">tidak pernah</string>
<string name="no_received_app_files">Tidak ada file yang diterima atau dikirim</string>
<string name="conn_event_ratchet_sync_started">Menyetujui enkripsi…</string>
<string name="muted_when_inactive">Bisukan ketika tidak aktif!</string>
<string name="chat_theme_apply_to_all_modes">Seluruh mode warna</string>
<string name="chat_preferences_off">mati</string>`
<string name="chat_preferences_no">tidak</string>
<string name="chat_preferences_on">on</string>
<string name="feature_off">mati</string>
<string name="allow_your_contacts_irreversibly_delete">Izinkan kontak kamu menghapus pesan terkirim secara permanen. (24 jam)</string>
<string name="allow_irreversible_message_deletion_only_if">Izinkan penghapusan pesan yang tidak dapat diubah hanya jika kontak kamu mengizinkannya. (24 jam)</string>
<string name="allow_your_contacts_to_send_voice_messages">Izinkan kontak kamu mengirim pesan suara.</string>
<string name="only_you_can_delete_messages">Hanya kamu yang dapat menghapus pesan secara permanen (kontak kamu dapat menandainya untuk dihapus). (24 jam)</string>
<string name="only_your_contact_can_delete">Hanya kontak kamu yang dapat menghapus pesan secara permanen (kamu dapat menandainya untuk dihapus). (24 jam)</string>
<string name="only_you_can_add_message_reactions">Hanya kamu yang dapat menambahkan reaksi pesan.</string>
<string name="only_you_can_make_calls">Hanya kamu yang dapat melakukan panggilan.</string>
<string name="only_your_contact_can_add_message_reactions">Hanya kontak kamu yang dapat menambahkan reaksi pesan.</string>
<string name="allow_direct_messages">Izinkan pengiriman pesan langsung ke anggota.</string>
<string name="allow_to_send_disappearing">Izinkan untuk mengirim pesan menghilang.</string>
<string name="feature_offered_item_with_param">ditawarkan %s: %2s</string>
<string name="v4_5_multiple_chat_profiles">Beberapa profil obrolan</string>
<string name="v4_5_reduced_battery_usage_descr">Lebih banyak peningkatan akan segera hadir!</string>
<string name="v4_6_group_moderation_descr">Tidak ada admin yang dapat:
\n- menghapus pesan anggota.
\n- menonaktifkan anggota (peran “pengamat”)</string>
<string name="v4_6_reduced_battery_usage_descr">Lebih banyak peningkatan akan segera hadir!</string>
<string name="v5_2_more_things_descr">- pengiriman pesan yang lebih stabil.
\n- group yang sedikit lebih baik.
\n- dan lainnya!</string>
<string name="v5_3_new_desktop_app">Aplikasi desktop baru!</string>
<string name="v5_7_network">Manajemen jaringan</string>
<string name="custom_time_unit_months">bulan</string>
<string name="migrate_from_device_all_data_will_be_uploaded">Semua kontak, percakapan, dan file kamu akan dienkripsi dengan aman dan diunggah dalam beberapa bagian ke relay XFTP yang telah dikonfigurasi.</string>
<string name="network_type_no_network_connection">Tidak ada koneksi jaringan</string>
<string name="mute_chat">Bisu</string>
<string name="settings_section_title_network_connection">Koneksi jaringan</string>
<string name="network_smp_proxy_mode_never">TIdak pernah</string>
<string name="privacy_media_blur_radius_off">Mati</string>
<string name="videos_limit_desc">Hanya 10 video dapat dikirim pada saat bersamaan</string>
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages"><![CDATA[Hanya perangkat klien yang menyimpan profil pengguna, kontak, grup, dan pesan yang dikirim dengan <b>enkripsi ujung-ke-ujung 2 lapis</b>.]]></string>
<string name="only_group_owners_can_enable_voice">Hanya pemilik grup yang dapat mengaktifkan pesan suara.</string>
<string name="clear_note_folder_warning">Seluruh pesan akan dihapus - ini tidak bisa dibatalkan!</string>
<string name="network_smp_proxy_fallback_allow_downgrade">Izinkan turun versi</string>
<string name="no_info_on_delivery">Tidak ada informasi pengiriman</string>
<string name="allow_verb">Boleh</string>
<string name="ok">OK</string>
<string name="no_details">Tidak ada rincian</string>
<string name="add_contact">Tautan undangan satu kali</string>
<string name="network_use_onion_hosts_prefer_desc">Host Onion akan di pakai jika tersedia.</string>
<string name="always_use_relay">Selalu gunakan relay</string>
<string name="self_destruct_new_display_name">Nama tampilan baru:</string>
<string name="new_passphrase">Frasa sandi baru</string>
<string name="notifications_will_be_hidden">Pemberitahuan akan dikirim hanya sampai saat aplikasi berhenti!</string>
<string name="wallpaper_advanced_settings">Pengaturan tingkat lanjut</string>
<string name="allow_message_reactions_only_if">Izinkan reaksi pesan hanya jika kontak Anda mengizinkannya.</string>
<string name="allow_voice_messages_only_if">Izinkan pesan suara hanya jika kontak kamu mengizinkannya.</string>
<string name="allow_your_contacts_adding_message_reactions">Izinkan kontak kamu menambahkan reaksi pesan.</string>
<string name="allow_your_contacts_to_call">Izinkan kontak kamu untuk menghubungimu.</string>
<string name="allow_your_contacts_to_send_disappearing_messages">Izinkan kontak kamu untuk mengirim pesan menghilang.</string>
<string name="allow_calls_only_if">Izinkan panggilan hanya jika kontak kamu mengizinkannya.</string>
<string name="allow_disappearing_messages_only_if">Izinkan pesan menghilang hanya jika kontak kamu mengizinkannya.</string>
<string name="allow_message_reactions">Izinkan reaksi pesan.</string>
<string name="allow_to_delete_messages">Izinkan untuk menghapus pesan terkirim secara permanen. (24 jam)</string>
<string name="user_mute">Bisu</string>
<string name="no_history">Tidak ada riwayat</string>
<string name="v5_8_chat_themes">Tema obrolan yang baru</string>
<string name="all_users">Semua profil</string>
<string name="allow_to_send_simplex_links">Izinkan untuk mengirim tautan SimpleX.</string>
<string name="v5_1_self_destruct_passcode_descr">Semua data akan terhapus jika ini dimasukkan.</string>
<string name="not_compatible">Tidak kompatibel!</string>
<string name="new_mobile_device">Perangkat seluler baru</string>
<string name="only_one_device_can_work_at_the_same_time">Hanya satu perangkat yang dapat bekerja pada saat bersamaan</string>
<string name="network_smp_proxy_fallback_prohibit">Tidak</string>
<string name="no_filtered_contacts">Tidak ada kontak yang di filter</string>
<string name="group_member_role_observer">pengamat</string>
<string name="snd_conn_event_ratchet_sync_started">menyetujui enkripsi untuk %s…</string>
<string name="all_group_members_will_remain_connected">Semua anggota grup akan tetap terhubung.</string>
<string name="servers_info_missing">Tidak ada info, coba muat ulang</string>
<string name="network_use_onion_hosts_no">Tidak</string>
<string name="new_in_version">Baru di %s</string>
<string name="feature_offered_item">ditawarkan %s</string>
<string name="only_you_can_send_voice">Hanya kamu yang dapat mengirim pesan suara.</string>
<string name="only_your_contact_can_make_calls">Hanya kontak kamu yang dapat melakukan panggilan.</string>
<string name="allow_to_send_files">Izinkan untuk mengirim file dan media.</string>
<string name="all_your_contacts_will_remain_connected">Semua kontak kamu akan tetap terhubung.</string>
</resources>
@@ -74,7 +74,7 @@
<string name="smp_servers_check_address">Verifique o endereço do servidor e tente novamente.</string>
<string name="network_session_mode_user_description"><![CDATA[Uma conexão TCP separada (e credencial SOCKS) será usada <b>para cada perfil de bate-papo que você tiver no aplicativo</b>.]]></string>
<string name="onboarding_notifications_mode_off_desc"><![CDATA[<b>Melhor para bateria</b>. Você receberá notificações apenas quando o aplicativo estiver em execução (SEM o serviço em segundo plano).]]></string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>Consome mais bateria</b>! O aplicativo em segundo plano está sempre em execução - as notificações são exibidas instantaneamente.]]></string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>Consome mais bateria</b>! O serviço em segundo plano está sempre em execução - as notificações são exibidas assim que as mensagens estiverem disponíveis.]]></string>
<string name="settings_section_title_chats">BATE-PAPOS</string>
<string name="settings_section_title_icon">ÍCONE DO APLICATIVO</string>
<string name="chat_database_section">BANCO DE DADOS DE BATE-PAPO</string>
@@ -91,7 +91,7 @@
<string name="notifications_mode_service_desc">O serviço em segundo plano está sempre em execução - as notificações serão exibidas assim que as mensagens estiverem disponíveis.</string>
<string name="network_session_mode_entity_description">Uma conexão TCP separada (e credencial SOCKS) será usada <b>para cada contato e membro do grupo</b>.
\n<b>Atenção</b>: se você tiver muitas conexões, o consumo de bateria e tráfego pode ser substancialmente maior e algumas conexões podem falhar.</string>
<string name="onboarding_notifications_mode_periodic_desc"><![CDATA[<b>Bom para bateria</b>. O aplicativo procura por mensagens a cada 10 minutos. Você pode perder chamadas ou mensagens urgentes.]]></string>
<string name="onboarding_notifications_mode_periodic_desc"><![CDATA[<b>Bom para bateria</b>. O serviço em segundo plano procura por mensagens a cada 10 minutos. Você pode perder chamadas ou mensagens urgentes.]]></string>
<string name="callstatus_ended">chamda encerrada %1$s</string>
<string name="chat_with_developers">Converse com os desenvolvedores</string>
<string name="create_group_link">Criar link de grupo</string>
@@ -256,12 +256,12 @@
<string name="settings_section_title_device">DISPOSITIVO</string>
<string name="settings_developer_tools">Ferramentas de desenvolvedor</string>
<string name="group_member_status_introduced">conectando (introduzido)</string>
<string name="color_primary">Tonalidade</string>
<string name="color_primary">Realçe</string>
<string name="error_removing_member">Erro ao remover membro</string>
<string name="error_changing_role">Erro ao alterar cargo</string>
<string name="conn_level_desc_direct">direto</string>
<string name="server_error">erro</string>
<string name="failed_to_parse_chat_title">Falha ao carregar a conversa</string>
<string name="failed_to_parse_chat_title">Falha ao carregar o bate-papo</string>
<string name="error_setting_network_config">Erro ao atualizar a configuração de conexão</string>
<string name="error_sending_message">Erro ao enviar mensagem</string>
<string name="error_adding_members">Erro ao adicionar membro(s)</string>
@@ -317,8 +317,8 @@
<string name="icon_descr_expand_role">Expandir seleção de cargo</string>
<string name="error_saving_group_profile">Erro ao salvar o perfil do grupo</string>
<string name="direct_messages">Mensagens diretas</string>
<string name="feature_enabled">ativado</string>
<string name="feature_enabled_for_contact">ativado para contato</string>
<string name="feature_enabled">habilitado</string>
<string name="feature_enabled_for_contact">habilitado para contato</string>
<string name="feature_enabled_for_you">ativado para você</string>
<string name="ttl_m">%dm</string>
<string name="ttl_min">%d min</string>
@@ -379,7 +379,7 @@
<string name="group_full_name_field">Nome completo do grupo:</string>
<string name="v4_2_group_links">Links de grupo</string>
<string name="v4_3_improved_privacy_and_security">Privacidade e segurança aprimoradas</string>
<string name="failed_to_parse_chats_title">Falha ao carregar as conversas</string>
<string name="failed_to_parse_chats_title">Falha ao carregar o bate-papo</string>
<string name="file_with_path">Arquivo: %s</string>
<string name="file_saved">Arquivo salvo</string>
<string name="group_members_can_send_voice">Os membros do grupo podem enviar mensagens de voz.</string>
@@ -403,7 +403,7 @@
<string name="incorrect_code">Código de segurança incorreto!</string>
<string name="install_simplex_chat_for_terminal">Instale o SimpleX para terminal</string>
<string name="how_it_works">Como funciona</string>
<string name="immune_to_spam_and_abuse">Imune a spam</string>
<string name="immune_to_spam_and_abuse">Imune a spam e abuso</string>
<string name="icon_descr_flip_camera">Vire a câmera</string>
<string name="icon_descr_hang_up">Desligar</string>
<string name="settings_section_title_incognito">Modo anônimo</string>
@@ -551,7 +551,7 @@
<string name="invalid_message_format">formato de mensagem inválido</string>
<string name="live">AO VIVO</string>
<string name="moderated_item_description">moderado por %s</string>
<string name="invalid_chat">conversa inválida</string>
<string name="invalid_chat">chat inválido</string>
<string name="simplex_link_mode_browser_warning">Abrir o link no navegador pode reduzir a privacidade e a segurança da conexão. Links SimpleX não confiáveis ficarão vermelhos.</string>
<string name="invalid_connection_link">Link de conexão inválido</string>
<string name="ensure_smp_server_address_are_correct_format_and_unique">Certifique-se de que os endereços do servidor SMP estejam no formato correto, separados por linhas e não estejam duplicados.</string>
@@ -562,7 +562,7 @@
<string name="notifications_mode_off">Executa quando o aplicativo está aberto</string>
<string name="icon_descr_sent_msg_status_sent">enviado</string>
<string name="icon_descr_sent_msg_status_send_failed">o envio falhou</string>
<string name="your_chats">Conversas</string>
<string name="your_chats">Bate-papos</string>
<string name="paste_button">Colar</string>
<string name="one_time_link">Link de convite de uso único</string>
<string name="chat_with_the_founder">Enviar perguntas e idéias</string>
@@ -764,7 +764,7 @@
<string name="privacy_redefined">Privacidade redefinida</string>
<string name="onboarding_notifications_mode_title">Notificações privadas</string>
<string name="make_private_connection">Fazer uma conexão privada</string>
<string name="people_can_connect_only_via_links_you_share">Você decide quem pode se conectar.</string>
<string name="people_can_connect_only_via_links_you_share">Pessoas podem se conectar com você somente via links compartilhados.</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Pode acontecer quando:
\n1. As mensagens expiraram no remetente após 2 dias ou no servidor após 30 dias.
\n2. A descriptografia da mensagem falhou porque você ou seu contato usou o backup do banco de dados antigo.
@@ -785,7 +785,7 @@
<string name="icon_descr_record_voice_message">Gravar mensagem de voz</string>
<string name="ensure_ICE_server_address_are_correct_format_and_unique">Certifique-se de que os endereços do servidor WebRTC ICE estão em formato correto, separados por linha e não estejam duplicados.</string>
<string name="network_and_servers">Conexão e servidores</string>
<string name="network_settings_title">Configurações avançadas</string>
<string name="network_settings_title">Configurações de conexão</string>
<string name="no_details">sem detalhes</string>
<string name="add_contact">Link de convite de uso único</string>
<string name="smp_servers_your_server_address">Seu endereço de servidor</string>
@@ -803,7 +803,7 @@
<string name="network_use_onion_hosts_no">Não</string>
<string name="network_disable_socks">Usar conexão direta com a internet\?</string>
<string name="hide_dev_options">Ocultar:</string>
<string name="your_profile_is_stored_on_device_and_shared_only_with_contacts_simplex_cannot_see_it">Seu perfil é guardado no seu dispositivo e é compartilhado somente com seus contatos. Servidores SimpleX não podem ver seu perfil.</string>
<string name="your_profile_is_stored_on_device_and_shared_only_with_contacts_simplex_cannot_see_it">Seu perfil é guardado no seu diapositivo e é compartilhado somente com seus contatos. Servidores SimpleX não podem ver seu perfil.</string>
<string name="save_preferences_question">Salvar preferências\?</string>
<string name="save_and_notify_group_members">Salvar e notificar membros do grupo</string>
<string name="error_saving_user_password">Erro ao salvar a senha do usuário</string>
@@ -857,8 +857,7 @@
<string name="to_start_a_new_chat_help_header">Para começar um novo bate-papo</string>
<string name="la_notice_turn_on">Ligar</string>
<string name="welcome">Bem-vindo(a)!</string>
<string name="next_generation_of_private_messaging">A próxima geração
\nde mensageiros privados</string>
<string name="next_generation_of_private_messaging">A próxima geração de mensageiros privados</string>
<string name="settings_section_title_socks">PROXY SOCKS</string>
<string name="database_backup_can_be_restored">A tentativa de alterar a senha do banco de dados não foi concluída.</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">Pare o bate-papo para exportar, importar ou excluir o banco de dados do chat. Você não poderá receber e enviar mensagens enquanto o chat estiver interrompido.</string>
@@ -884,7 +883,7 @@
<string name="notifications_mode_periodic">Inicia periodicamente</string>
<string name="icon_descr_sent_msg_status_unauthorized_send">envio não autorizado</string>
<string name="tap_to_start_new_chat">Toque para iniciar um novo bate-papo</string>
<string name="you_have_no_chats">Você não tem conversas</string>
<string name="you_have_no_chats">Você não tem bate-papos</string>
<string name="callstate_waiting_for_answer">aguardando resposta…</string>
<string name="your_current_chat_database_will_be_deleted_and_replaced_with_the_imported_one">Seu banco de dados de bate-papo atual será EXCLUÍDO e SUBSTITUÍDO pelo importado.
\nEsta ação não pode ser desfeita - seu perfil, contatos, mensagens e arquivos serão perdidos de forma irreversível.</string>
@@ -903,12 +902,12 @@
<string name="update_database">Atualizar</string>
<string name="periodic_notifications_desc">O app busca novas mensagens periodicamente – ele usa alguns por cento da bateria por dia. O aplicativo não usa notificações por push – os dados do seu dispositivo não são enviados para os servidores.</string>
<string name="enter_passphrase_notification_desc">Para receber notificações, por favor, digite a senha do banco de dados</string>
<string name="simplex_service_notification_title">Serviço de Chat SimpleX</string>
<string name="simplex_service_notification_title">Serviço SimpleX</string>
<string name="settings_notification_preview_mode_title">Mostrar prévia</string>
<string name="notification_preview_mode_message_desc">Mostrar contato e mensagem</string>
<string name="notification_preview_mode_contact_desc">Mostrar somente contato</string>
<string name="share_verb">Compartilhar</string>
<string name="auth_stop_chat">Parar conversa</string>
<string name="auth_stop_chat">Parar bate-papo</string>
<string name="auth_unlock">Desbloquear</string>
<string name="moderate_message_will_be_deleted_warning">A mensagem será excluída para todos os membros.</string>
<string name="moderate_message_will_be_marked_warning">A mensagem será marcada como moderada para todos os membros.</string>
@@ -926,7 +925,7 @@
<string name="core_simplexmq_version">simplexmq: v%s (%2s)</string>
<string name="network_session_mode_transport_isolation">Isolamento de transporte</string>
<string name="you_control_your_chat">Você controla sua conversa!</string>
<string name="first_platform_without_user_ids">Sem identificadores de usuário.</string>
<string name="first_platform_without_user_ids">A 1ª plataforma sem nenhum identificador de usuário – privada por design.</string>
<string name="icon_descr_speaker_on">Alto-falante ligado</string>
<string name="icon_descr_video_off">Vídeo desativado</string>
<string name="icon_descr_speaker_off">Alto-falante desligado</string>
@@ -977,7 +976,7 @@
<string name="callstate_starting">iniciando…</string>
<string name="callstate_waiting_for_confirmation">aguardando confirmação…</string>
<string name="we_do_not_store_contacts_or_messages_on_servers">Não armazenamos nenhum dos seus contatos ou mensagens (uma vez entregues) nos servidores.</string>
<string name="alert_title_skipped_messages">Mensagens ignoradas</string>
<string name="alert_title_skipped_messages">Mensagens omitidas</string>
<string name="tap_to_activate_profile">Toque para ativar o perfil.</string>
<string name="unhide_chat_profile">Mostrar perfil de chat</string>
<string name="unhide_profile">Mostrar perfil</string>
@@ -995,7 +994,7 @@
<string name="image_descr_link_preview">imagem de pré-visualização do link</string>
<string name="la_notice_to_protect_your_information_turn_on_simplex_lock_you_will_be_prompted_to_complete_authentication_before_this_feature_is_enabled">Para proteger suas informações, ative o bloqueio SimpleX.
\nVocê será solicitado a completar a autenticação antes que este recurso seja ativado.</string>
<string name="opensource_protocol_and_code_anybody_can_run_servers">Qualquer um pode hospedar os servidores.</string>
<string name="opensource_protocol_and_code_anybody_can_run_servers">Protocolo de código aberto – qualquer um pode hospedar os servidores.</string>
<string name="theme_light">Claro</string>
<string name="chat_preferences_contact_allows">O contato permite</string>
<string name="chat_preferences_on">ativado</string>
@@ -1110,7 +1109,7 @@
<string name="revoke_file__confirm">Revogar</string>
<string name="learn_more_about_address">Sobre o endereço SimpleX</string>
<string name="color_secondary_variant">Secundária adicional</string>
<string name="color_primary_variant">Tonalidade adicional</string>
<string name="color_primary_variant">Realçe adicional</string>
<string name="one_time_link_short">Link de uso único</string>
<string name="add_address_to_your_profile">Adicione o endereço ao seu perfil, para que seus contatos possam compartilhá-lo com outras pessoas. A atualização do perfil será enviada aos seus contatos.</string>
<string name="create_address_and_let_people_connect">Crie um endereço para permitir que as pessoas se conectem com você.</string>
@@ -1140,7 +1139,7 @@
<string name="you_wont_lose_your_contacts_if_delete_address">Você não perderá seus contatos se, posteriormente, excluir seu endereço.</string>
<string name="simplex_address">Endereço SimpleX</string>
<string name="you_can_accept_or_reject_connection">Quando as pessoas solicitam uma conexão, você pode aceitá-la ou rejeitá-la.</string>
<string name="theme_colors_section_title">CORES DA INTERFACE</string>
<string name="theme_colors_section_title">CORES DO TEMA</string>
<string name="share_with_contacts">compartilhar com os contatos</string>
<string name="profile_update_will_be_sent_to_contacts">A atualização do perfil será enviada aos seus contatos.</string>
<string name="save_settings_question">Salvar configurações\?</string>
@@ -1239,7 +1238,7 @@
<string name="change_self_destruct_passcode">Alterar senha de auto-destruição</string>
<string name="if_you_enter_self_destruct_code">Se você digitar sua senha de auto-destruição ao abrir o aplicativo:</string>
<string name="item_info_no_text">sem texto</string>
<string name="non_fatal_errors_occured_during_import">Alguns erros não fatais ocorreram durante importação:</string>
<string name="non_fatal_errors_occured_during_import">Alguns erros não-fatais ocurreram durante importação - pode ver o console de Chat para mais detalhes.</string>
<string name="search_verb">Pesquisar</string>
<string name="la_mode_off">Desativado</string>
<string name="files_and_media">Arquivos e mídia</string>
@@ -1282,7 +1281,7 @@
<string name="settings_shutdown">Desligar</string>
<string name="fix_connection">Corrigir conexão</string>
<string name="fix_connection_question">Corrigir conexão\?</string>
<string name="no_filtered_chats">Sem conversas filtradas</string>
<string name="no_filtered_chats">Sem bate-papo filtrados</string>
<string name="sync_connection_force_confirm">Renegociar</string>
<string name="unfavorite_chat">Desfavoritar</string>
<string name="sync_connection_force_question">Renegociar a criptografia\?</string>
@@ -1336,7 +1335,7 @@
<string name="sending_delivery_receipts_will_be_enabled_all_profiles">Enviar recibos de entrega serão habilitados para todos os contatos em todos os perfis visíveis.</string>
<string name="rcv_group_event_2_members_connected">%s e %s conectados</string>
<string name="connect_via_member_address_alert_title">Conectar diretamente\?</string>
<string name="no_selected_chat">Nenhuma conversa selecionada</string>
<string name="no_selected_chat">Nenhum bate-papo selecionado</string>
<string name="privacy_message_draft">Rascunho de mensagem</string>
<string name="send_receipts_disabled">desativado</string>
<string name="system_restricted_background_desc">SimpleX não pode ser executado em segundo plano. Você receberá as notificações somente quando o aplicativo estiver em execução.</string>
@@ -1563,7 +1562,7 @@
<string name="encryption_renegotiation_error">Erro de renegociação de criptografia</string>
<string name="unable_to_open_browser_title">Erro ao abrir o navegador</string>
<string name="error_sending_message_contact_invitation">Erro ao enviar o convite</string>
<string name="loading_chats">Carregando conversas…</string>
<string name="loading_chats">Carregando bate-papos…</string>
<string name="remote_host_was_disconnected_toast"><![CDATA[Dispositivo Móvel <b>%s</b> foi desconectado]]></string>
<string name="remote_host_error_disconnected"><![CDATA[Dispositivo Móvel <b>%s</b> foi desconectado]]></string>
<string name="only_one_device_can_work_at_the_same_time">Apenas um dispositivo pode funcionar ao mesmo tempo</string>
@@ -1660,412 +1659,4 @@
<string name="xftp_servers_configured">Servidores XFTP configurados</string>
<string name="migrate_from_device_check_connection_and_try_again">Verifique sua conexão de internet e tente novamente</string>
<string name="app_check_for_updates">Verificar atualizações</string>
<string name="color_mode">Modo de cor</string>
<string name="migrate_from_device_delete_database_from_device">Apagar banco de dados desse dispositivo</string>
<string name="proxy_destination_error_broker_host">O endereço do servidor de destino de %1$s é incompatível com o as configurações %2$s do servidor de encaminhamento.</string>
<string name="snd_error_quota">Capacidade excedida - o destinatário não recebeu as mensagens enviadas anteriormente.</string>
<string name="snd_error_relay">Erro do servidor de destino: %1$s</string>
<string name="member_info_member_inactive">Inativo</string>
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[Escolha<i>Migre de outro dispositivo</i>no novo dispositivo e escaneie o QR code.]]></string>
<string name="migrate_from_device_confirm_you_remember_passphrase">Confirme se você se lembra da senha do banco de dados para migrá-lo.</string>
<string name="privacy_media_blur_radius">Borrar conteúdo</string>
<string name="v6_0_privacy_blur">Borrar para melhor privacidade.</string>
<string name="confirm_delete_contact_question">Confirmar exclusão do contato?</string>
<string name="info_view_connect_button">conectar</string>
<string name="delete_without_notification">Apagar sem notificar</string>
<string name="color_primary_variant2">Tonalidade adicional 2</string>
<string name="migrate_to_device_confirm_network_settings">Confirmar configurações de rede</string>
<string name="chat_theme_apply_to_all_modes">Todos os modos de cor</string>
<string name="chat_theme_apply_to_dark_mode">Modo escuro</string>
<string name="cannot_share_message_alert_title">Não é possível enviar mensagem</string>
<string name="settings_section_title_chat_colors">Cores do chat</string>
<string name="create_address_button">Criar</string>
<string name="migrate_from_device_confirm_upload">Confirmar upload</string>
<string name="feature_roles_admins">administradores</string>
<string name="cant_call_contact_deleted_alert_text">O contato foi apagado.</string>
<string name="allow_calls_question">Permitir chamadas?</string>
<string name="cant_call_contact_alert_title">Não é possível chamar o contato</string>
<string name="cant_call_contact_connecting_wait_alert_text">Conectando ao contato, por favor aguarde ou volte depois!</string>
<string name="calls_prohibited_alert_title">Chamadas proibidas!</string>
<string name="cant_call_member_alert_title">Não é possível chamar membro do grupo</string>
<string name="cant_send_message_to_member_alert_title">Não é possível mandar mensagem para o membro do grupo</string>
<string name="v6_0_connection_servers_status">Controle sua rede</string>
<string name="v6_0_delete_many_messages_descr">Apague até 20 mensagens por vez.</string>
<string name="v6_0_your_contacts_descr">Arquivar contatos para conversar depois.</string>
<string name="v6_0_connect_faster_descr">Conecte aos seus amigos mais rapidamente.</string>
<string name="color_mode_dark">Escuro</string>
<string name="v5_8_safe_files_descr">Confirmar arquivos de servidores desconhecidos.</string>
<string name="copy_error">Copiar erro</string>
<string name="migrate_to_device_chat_migrated">Conversa migrada!</string>
<string name="info_view_call_button">chamar</string>
<string name="delete_contact_cannot_undo_warning">O contato será apagado - essa ação não pode ser desfeita!</string>
<string name="app_check_for_updates_beta">Beta</string>
<string name="app_check_for_updates_download_completed_title">A atualização do aplicativo foi baixada</string>
<string name="settings_section_title_chat_theme">Tema da conversa</string>
<string name="info_row_debug_delivery">Entrega de depuração</string>
<string name="dark_mode_colors">Cores do modo escuro</string>
<string name="migrate_from_device_creating_archive_link">Criando link de arquivo</string>
<string name="network_smp_proxy_fallback_allow_downgrade">Permitir downgrade</string>
<string name="all_users">Todos os usuários</string>
<string name="servers_info_sessions_connected">Conectado</string>
<string name="servers_info_sessions_connecting">Conectando</string>
<string name="current_user">Perfil atual</string>
<string name="servers_info_connected_servers_section_header">Servidores conectados</string>
<string name="servers_info_subscriptions_connections_subscribed">Conexões ativas</string>
<string name="attempts_label">tentativas</string>
<string name="acknowledged">Reconhecido</string>
<string name="acknowledgement_errors">Erros conhecidos</string>
<string name="connections">Conexões</string>
<string name="created">Criado</string>
<string name="decryption_errors">erros de decriptação</string>
<string name="deleted">Apagado</string>
<string name="deletion_errors">Erros de exclusão</string>
<string name="chunks_deleted">Pedaços excluídos</string>
<string name="chunks_downloaded">Pedaços baixados</string>
<string name="chunks_uploaded">Pedaços carregados</string>
<string name="delete_members_messages__question">Apagar %d mensagens dos membros?</string>
<string name="contact_deleted">Contato apagado!</string>
<string name="conversation_deleted">Conversa apagada!</string>
<string name="deleted_chats">Contatos arquivados</string>
<string name="chat_database_exported_title">Banco de dados da conversa exportado</string>
<string name="chat_database_exported_continue">Continuar</string>
<string name="v6_0_connection_servers_status_descr">Conexão e status dos servidores.</string>
<string name="migrate_to_device_repeat_download">Repetir download</string>
<string name="network_option_rcv_concurrency">Recebendo simultaneidade</string>
<string name="chat_theme_reset_to_user_theme">Redefinir para o tema do usuário</string>
<string name="v5_8_persian_ui">IU Persa</string>
<string name="message_delivery_warning_title">Aviso de entrega de mensagem</string>
<string name="ci_status_other_error">Erro: %1$s</string>
<string name="snd_error_auth">Chave incorreta ou conexão desconhecida - provavelmente esta conexão foi excluída.</string>
<string name="e2ee_info_no_pq_short">Essa conversa é protegida por criptografia ponta a ponta</string>
<string name="migrate_from_device_repeat_upload">Repetir upload</string>
<string name="smp_proxy_error_connecting">Erro de conexão ao servidor de encaminhamento %1$s. Por favor tente mais tarde.</string>
<string name="smp_proxy_error_broker_version">A versão do servidor de encaminhamento é incompatível com as configurações de rede: %1$s.</string>
<string name="proxy_destination_error_failed_to_connect">O servidor de encaminhamento %1$s falhou ao se conectar ao servidor de destino %2$s. Por favor tente mais tarde.</string>
<string name="smp_proxy_error_broker_host">O endereço do servidor de encaminhamento é incompatível com as configurações de rede: %1$s.</string>
<string name="proxy_destination_error_broker_version">A versão do servidor de destino de %1$s é incompatível com o servidor de encaminhamento %2$s.</string>
<string name="snd_error_expired">Problemas de rede - a mensagem expirou após muitas tentativas de envio.</string>
<string name="snd_error_proxy">Servidor de encaminhamento: %1$s
\nErro: %2$s</string>
<string name="recipients_can_not_see_who_message_from">Destinatário(s) não podem ver de onde essa mensagem veio.</string>
<string name="member_inactive_desc">A mensagem poderá ser entregue mais tarde se o membro se tornar ativo.</string>
<string name="smp_servers_other">Outros servidores SMP</string>
<string name="private_routing_explanation">Para proteger seu endereço IP, roteamento privado usa seus servidores SMP para entregar mensagens.</string>
<string name="app_check_for_updates_button_skip">Pular essa versão</string>
<string name="app_check_for_updates_button_download">Baixar %s (%s)</string>
<string name="app_check_for_updates_canceled">Download da atualização cancelado</string>
<string name="chat_list_always_visible">Mostrar lista de conversas em nova janela</string>
<string name="appearance_font_size">Tamanho da fonte</string>
<string name="color_wallpaper_background">Fundo do papel de parede</string>
<string name="color_wallpaper_tint">Tonalidade do papel de parede</string>
<string name="theme_remove_image">Remover imagem</string>
<string name="appearance_zoom">Zoom</string>
<string name="chat_theme_set_default_theme">Definir tema padrão</string>
<string name="prohibit_sending_simplex_links">Proibido enviar links SimpleX</string>
<string name="migrate_from_device_error_uploading_archive">Erro ao carregar o arquivo</string>
<string name="migrate_from_device_upload_failed">Falha ao carregar</string>
<string name="migrate_from_device_uploading_archive">Carregando arquivo</string>
<string name="servers_info_detailed_statistics">Estatísticas detalhadas</string>
<string name="file_error_relay">Erro no servidor de arquivo: %1$s</string>
<string name="saved_from_chat_item_info_title">Salvo de</string>
<string name="download_file">Baixar</string>
<string name="forward_chat_item">Encaminhar</string>
<string name="share_text_file_status">Status de arquivo: %s</string>
<string name="invite_friends_short">Convidar</string>
<string name="v6_0_increase_font_size">Aumentar tamanho da fonte.</string>
<string name="v6_0_upgrade_app">Aprimorar aplicativo automaticamente</string>
<string name="servers_info_reset_stats_alert_title">Redefinir todas as estatísticas?</string>
<string name="servers_info_reset_stats_alert_message">As estatísticas dos servidores serão redefinidas - isso não poderá ser desfeito!</string>
<string name="error_parsing_uri_title">Link inválido</string>
<string name="error_parsing_uri_desc">Por favor cheque se o link SimpleX está correto</string>
<string name="e2ee_info_pq"><![CDATA[Mensagens, arquivo e chamadas são protegidas por <b>criptografia quantum resistant e2e</b> com perfeito sigilo direto, repúdio e recuperação de vazamento.]]></string>
<string name="e2ee_info_pq_short">Essa conversa é protegida por criptografia quantum resistant ponta a ponta</string>
<string name="please_try_later">Por favor tente mais tarde.</string>
<string name="selected_chat_items_selected_n">Selecionado %d</string>
<string name="simplex_links_not_allowed">SimpleX links não permitidos</string>
<string name="files_and_media_not_allowed">Arquivos e mídia não permitidos</string>
<string name="compose_message_placeholder">Mensagem</string>
<string name="temporary_file_error">Erro de arquivo temporário</string>
<string name="info_view_message_button">mensagem</string>
<string name="info_view_search_button">pesquisar</string>
<string name="info_view_video_button">vídeo</string>
<string name="network_smp_proxy_mode_private_routing">Roteamento privado</string>
<string name="network_smp_proxy_mode_never_description">NÃO use roteamento privado.</string>
<string name="permissions_open_settings">Abrir configurações</string>
<string name="audio_device_earpiece">Fone de ouvido</string>
<string name="error_initializing_web_view">Erro ao iniciar o WebView. Atualize seu sistema para a nova versão. Por favor contate os desenvolvedores.
\nErro: %s</string>
<string name="privacy_media_blur_radius_off">Desativado</string>
<string name="privacy_media_blur_radius_strong">Forte</string>
<string name="v5_6_quantum_resistant_encryption_descr">Ativar em conversas diretas (BETA)!</string>
<string name="migrate_to_device_finalize_migration">Finalizar migração em outro dispositivo.</string>
<string name="color_mode_light">Claro</string>
<string name="v5_7_forward_descr">A origem da mensagem permanece privada.</string>
<string name="migrate_to_device_title">Migrar aqui</string>
<string name="migrate_to_device_migrating">Migrando</string>
<string name="v6_0_new_chat_experience">Nova experiência de conversa 🎉</string>
<string name="v6_0_new_media_options">Novas opções de mídia</string>
<string name="or_paste_archive_link">Ou cole o link do arquivo</string>
<string name="v6_0_chat_list_media">Reproduzir da lista de conversa.</string>
<string name="servers_info_reset_stats">Redefinir todas as estatísticas</string>
<string name="migrate_from_device_starting_chat_on_multiple_devices_unsupported">Aviso: iniciar conversa em múltiplos dispositivos não é suportado e pode causar falhas na entrega de mensagens</string>
<string name="network_type_ethernet">Internet cabeada</string>
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[Você <b>não deve</b> usar a mesma base de dados em dois dispositivos.]]></string>
<string name="group_members_can_send_simplex_links">Membros do grupo podem enviar link SimpleX</string>
<string name="migrate_to_device_importing_archive">Importando arquivo</string>
<string name="chat_theme_apply_to_light_mode">Modo claro</string>
<string name="feature_enabled_for">Ativado para</string>
<string name="v5_7_call_sounds_descr">Ao conectar em chamadas de áudio de vídeo.</string>
<string name="migrate_from_device_title">Migrar dispositivo</string>
<string name="migrate_from_device_error_saving_settings">Erro ao salvar configurações</string>
<string name="migrate_from_device_exported_file_doesnt_exist">Arquivo exportado não existe</string>
<string name="migrate_from_device_bytes_uploaded">%s carregados</string>
<string name="migrate_from_device_chat_should_be_stopped">Para continuar, a conversa precisa ser interrompida.</string>
<string name="network_type_other">Outro</string>
<string name="network_type_no_network_connection">Sem conexão de rede</string>
<string name="cannot_share_message_alert_text">As preferências de conversa selecionadas proíbem essa mensagem.</string>
<string name="file_error">Erro de arquivo</string>
<string name="reset_single_color">Redefinir cor</string>
<string name="v5_7_call_sounds">Sons de chamada</string>
<string name="v5_7_shape_profile_images">Formato das imagens de perfil</string>
<string name="v5_7_new_interface_languages">IU Lituana</string>
<string name="v5_8_private_routing">Roteamento de mensagem privada 🚀</string>
<string name="v5_8_chat_themes">Novos temas de conversa</string>
<string name="v5_8_message_delivery_descr">Com uso de bateria reduzida.</string>
<string name="migrate_to_device_download_failed">Falha no download</string>
<string name="migrate_to_device_import_failed">Falha na importação</string>
<string name="migrate_to_device_downloading_archive">Baixando arquivo</string>
<string name="migrate_to_device_repeat_import">Repetir importação</string>
<string name="migrate_to_device_try_again">Você pode tentar novamente.</string>
<string name="migrate_from_device_error_exporting_archive">Erro ao exportar banco de dados de conversa</string>
<string name="migrate_from_device_error_verifying_passphrase">Erro ao verificar a palavra-chave:</string>
<string name="saved_description">salvo</string>
<string name="saved_from_description">salvo de %s</string>
<string name="forwarded_from_chat_item_info_title">Encaminhado de</string>
<string name="voice_messages_not_allowed">Mensagens de voz não permitidas</string>
<string name="new_message">Nova mensagem</string>
<string name="paste_link">Colar link</string>
<string name="simplex_links">Links SimpleX</string>
<string name="v5_7_forward">Encaminhar e salvar mensagens</string>
<string name="privacy_media_blur_radius_soft">Suave</string>
<string name="privacy_media_blur_radius_medium">Médio</string>
<string name="you_need_to_allow_calls">Você precisa permitir seu contato ligue para poder ligar para ele.</string>
<string name="chat_theme_reset_to_app_theme">Redefinir para o tema do aplicativo</string>
<string name="color_received_quote">Resposta recebida</string>
<string name="wallpaper_preview_hello_alice">Boa tarde!</string>
<string name="wallpaper_preview_hello_bob">Bom dia!</string>
<string name="v6_0_upgrade_app_descr">Baixe novas versões no GitHub.</string>
<string name="forwarded_description">encaminhado</string>
<string name="migrate_to_device_file_delete_or_link_invalid">O arquivo foi deletado ou o link está inválido</string>
<string name="auth_open_migration_to_another_device">Abrir tela de migração</string>
<string name="v5_6_safer_groups">Grupos seguros</string>
<string name="migrate_from_device_database_init">Preparando upload</string>
<string name="settings_section_title_network_connection">Conexão de rede</string>
<string name="file_not_approved_title">Servidores desconhecidos!</string>
<string name="file_not_approved_descr">Sem Tor ou VPN, seu endereço de IP ficará visível para esses relays XFTP
\n%1$s.</string>
<string name="error_showing_desktop_notification">Erro ao exibir notificação, contate os desenvolvedores.</string>
<string name="saved_chat_item_info_tab">Salvo</string>
<string name="forwarded_chat_item_info_tab">Encaminhado</string>
<string name="network_smp_proxy_mode_unknown">Servidores desconhecidos</string>
<string name="network_smp_proxy_mode_unprotected">Desprotegido</string>
<string name="network_smp_proxy_mode_never">Nunca</string>
<string name="update_network_smp_proxy_mode_question">Modo de roteamento de mensagens</string>
<string name="permissions_required">Conceder permissões</string>
<string name="audio_device_speaker">Alto falante</string>
<string name="audio_device_wired_headphones">Headphones</string>
<string name="without_tor_or_vpn_ip_address_will_be_visible_to_file_servers">Sem Tor ou VPN, seu endereço de IP ficará visível para servidores de arquivo.</string>
<string name="settings_section_title_files">ARQUIVOS</string>
<string name="settings_section_title_profile_images">Fotos de perfil</string>
<string name="settings_section_title_private_message_routing">ROTEAMENTO DE MENSAGEM PRIVADA</string>
<string name="conn_event_disabled_pq">criptografia padrão ponta a ponta</string>
<string name="feature_roles_owners">proprietários</string>
<string name="migrate_from_device_to_another_device">Migrar para outro dispositivo</string>
<string name="migrate_from_device_verify_passphrase">Verificar palavra-passe</string>
<string name="network_type_network_wifi">WiFi</string>
<string name="one_hand_ui_card_title">Alternar lista de conversa:</string>
<string name="one_hand_ui_change_instruction">Você pode mudar isso em configurações de Aparência.</string>
<string name="member_info_member_disabled">desativado</string>
<string name="message_queue_info_none">nenhum</string>
<string name="message_queue_info_server_info">informações da fila do servidor: %1$s
\n
\núltima mensagem recebida: %2$s</string>
<string name="calls_prohibited_ask_to_enable_calls_alert_text">Por favor peça para seu contato ativar as chamadas.</string>
<string name="cant_call_member_send_message_alert_text">Enviar mensagem para ativar chamadas.</string>
<string name="network_options_save_and_reconnect">Salvar e reconectar</string>
<string name="network_option_tcp_connection">Conexão TCP</string>
<string name="v6_0_reachable_chat_toolbar">Barra de ferramentas de conversa acessível</string>
<string name="v6_0_private_routing_descr">Isso protege seu endereço de IP e conexões.</string>
<string name="v6_0_reachable_chat_toolbar_descr">Use o aplicativo com uma mão.</string>
<string name="uploaded_files">Arquivos carregados</string>
<string name="servers_info_downloaded">Baixado</string>
<string name="servers_info_reset_stats_alert_error_title">Erro ao redefinir estatísticas</string>
<string name="servers_info_reset_stats_alert_confirm">Redefinir</string>
<string name="info_row_file_status">Status de arquivo</string>
<string name="message_queue_info">Informações da fila de mensagens</string>
<string name="color_mode_system">Sistema</string>
<string name="wallpaper_scale_repeat">Repetir</string>
<string name="wallpaper_scale">Escala</string>
<string name="wallpaper_scale_fill">Preencher</string>
<string name="wallpaper_scale_fit">Ajustar</string>
<string name="simplex_links_are_prohibited_in_group">Links SimpleX são proibidos neste grupo.</string>
<string name="v5_6_app_data_migration_descr">Migrar para outro dispositivo via QR code.</string>
<string name="v5_6_picture_in_picture_calls">Chamadas picture-in-picture</string>
<string name="v5_6_picture_in_picture_calls_descr">Use o aplicativo enquanto está em chamada.</string>
<string name="v5_7_quantum_resistant_encryption_descr">Será ativado em conversas diretas!</string>
<string name="v5_8_safe_files">Receber arquivos de forma segura</string>
<string name="v5_7_network">Gerenciamento de rede</string>
<string name="v5_8_chat_themes_descr">Faça suas conversas terem uma aparência diferente!</string>
<string name="v5_7_network_descr">Conexão de rede mais confiável.</string>
<string name="migrate_to_device_database_init">Preparando download</string>
<string name="migrate_to_device_bytes_downloaded">%s baixados</string>
<string name="paste_archive_link">Colar link de arquivo</string>
<string name="migrate_to_device_enter_passphrase">Insira a palavra-chave</string>
<string name="migrate_to_device_error_downloading_archive">Erro ao baixar o arquivo</string>
<string name="migrate_from_device_or_share_this_file_link">Ou de forma segura compartilhe esse link de arquivo</string>
<string name="migrate_from_device_verify_database_passphrase">Verifique a palavra-passe do banco de dados</string>
<string name="e2ee_info_no_pq"><![CDATA[Mensagens, arquivo e chamadas são protegidas por <b>criptografia ponta-a-ponta</b> com perfeito sigilo direto, repúdio e recuperação de vazamento.]]></string>
<string name="file_error_no_file">Arquivo não encontrado - provavelmente o arquivo foi excluído ou cancelado.</string>
<string name="file_error_auth">Chave incorreta ou arquivo de pedaço de endereço - provavelmente o arquivo foi excluído.</string>
<string name="network_smp_proxy_fallback_allow_protected_description">Mande mensagens diretamente quando o seu endereço de IP está protegido e o servidor de destino não suporta roteamento privado.</string>
<string name="network_smp_proxy_mode_unknown_description">Use roteamento privado em servidores desconhecidos.</string>
<string name="scan_paste_link">Escanear / Colar link</string>
<string name="migrate_to_device_downloading_details">Baixando detalhes de link</string>
<string name="migrate_from_device_finalize_migration">Finalizar migração</string>
<string name="v5_6_quantum_resistant_encryption">Criptografia Quantum resistant</string>
<string name="migrate_from_device_migration_complete">Migração concluída</string>
<string name="v5_8_private_routing_descr">Proteja seu endereço de IP dos retransmissores de mensagem escolhidos por seus contatos.
\nAtive nas configurações *Redes e servidores* .</string>
<string name="migrate_from_device_start_chat">Iniciar conversa</string>
<string name="toolbar_settings">Configurações</string>
<string name="info_view_open_button">abrir</string>
<string name="keep_conversation">Manter conversa</string>
<string name="only_delete_conversation">Apenas excluir conversa</string>
<string name="xftp_servers_other">Outros servidores XFTP</string>
<string name="network_smp_proxy_mode_unprotected_description">Use roteamento privado em servidores desconhecidos quando o endereço de IP não está protegido.</string>
<string name="network_smp_proxy_fallback_allow">Sim</string>
<string name="app_check_for_updates_button_install">Instalar atualização</string>
<string name="app_check_for_updates_update_available">Atualização disponível: %s</string>
<string name="app_check_for_updates_button_open">Abrir local do arquivo</string>
<string name="app_check_for_updates_notice_disable">Desativar</string>
<string name="permissions_record_audio">Microfone</string>
<string name="permissions_grant_in_settings">Conceder nas configurações</string>
<string name="permissions_find_in_settings_and_grant">Encontre essa permissão nas configurações do Android e conceda-a manualmente.</string>
<string name="app_will_ask_to_confirm_unknown_file_servers">O aplicativo irá perguntar para confirmar os downloads de servidores de arquivo desconhecidos (exceto .onion ou quando o proxy SOCKS estiver habilitado).</string>
<string name="settings_section_title_user_theme">Tema de perfil</string>
<string name="set_passphrase">Defina uma palavra-chave</string>
<string name="conn_event_enabled_pq">criptografia quantum resistant e2e</string>
<string name="action_button_add_members">Convidar</string>
<string name="info_row_message_status">Status da mensagem</string>
<string name="v5_8_message_delivery">Entrega de mensagens aprimorada</string>
<string name="v5_7_shape_profile_images_descr">Quadrado, circulo, ou qualquer coisa entre eles.</string>
<string name="remote_ctrl_connection_stopped_desc">Por favor verifique se o celular e o computador estão conectados na mesma rede local e o firewall do computador permite a conexão.
\nPor favor compartilhe qualquer outro problema com os desenvolvedores.</string>
<string name="remote_ctrl_connection_stopped_identity_desc">Esse link foi usado em outros dispositivo móvel, por favor crie um novo link no computador.</string>
<string name="migrate_from_device_error_deleting_database">Erro ao excluir banco de dados</string>
<string name="migrate_to_device_confirm_network_settings_footer">Por favor confirme que as configurações de rede estão corretas para este dispositivo.</string>
<string name="migrate_from_device_stopping_chat">Parando conversa</string>
<string name="migrate_from_device_try_again">Você pode tentar novamente.</string>
<string name="network_error_broker_version_desc">A versão do servidor é incompatível com seu aplicativo: %1$s.</string>
<string name="private_routing_error">Erro de roteamento privado</string>
<string name="network_error_broker_host_desc">O endereço do servidor é incompatível com as configurações de rede: %1$s.</string>
<string name="snd_error_proxy_relay">Servidor de encaminhamento: %1$s
\nErro no servidor de destino: %2$s</string>
<string name="srv_error_host">Endereço do servidor é incompatível com as configurações de rede.</string>
<string name="srv_error_version">A versão do servidor é incompatível com as configurações de rede.</string>
<string name="forward_message">Encaminhar mensagem…</string>
<string name="network_smp_proxy_fallback_allow_protected">Quando IP oculto</string>
<string name="protect_ip_address">Proteger endereço IP</string>
<string name="color_sent_quote">Enviar resposta</string>
<string name="servers_info_files_tab">Arquivos</string>
<string name="network_smp_proxy_fallback_prohibit">Não</string>
<string name="app_check_for_updates_download_started">Baixando atualização do aplicativo, não feche o aplicativo</string>
<string name="permissions_grant">Conceder permissão para fazer chamadas</string>
<string name="invalid_file_link">Link inválido</string>
<string name="servers_info_details">Detalhes</string>
<string name="servers_info_sessions_errors">Erros</string>
<string name="servers_info_messages_received">Mensagens recebidas</string>
<string name="servers_info_messages_sent">Mensagens enviadas</string>
<string name="servers_info_missing">Sem informação, tente recarregar</string>
<string name="servers_info">Informação dos servidores</string>
<string name="servers_info_target">Mostrando informação para</string>
<string name="servers_info_statistics_section_header">Estatísticas</string>
<string name="servers_info_transport_sessions_section_header">Sessões de transporte</string>
<string name="servers_info_subscriptions_section_header">Recepção de mensagem</string>
<string name="servers_info_subscriptions_connections_pending">Pendente</string>
<string name="servers_info_private_data_disclaimer">Começando de %s.
\nTodos os dados são privados do seu dispositivo.</string>
<string name="servers_info_subscriptions_total">Total</string>
<string name="servers_info_proxied_servers_section_header">Servidores proxiados</string>
<string name="servers_info_previously_connected_servers_section_header">Servidores conectados anteriormente</string>
<string name="servers_info_reconnect_servers_message">Reconecte todos os servidores conectados para forçar entrega de mensagem. Isso usa tráfego adicional.</string>
<string name="servers_info_reconnect_server_title">Reconectar servidor?</string>
<string name="servers_info_reconnect_servers_title">Reconectar servidores?</string>
<string name="servers_info_reconnect_server_message">Reconectar servidor para forçar entrega de mensagem. Isso usa tráfego adicional.</string>
<string name="servers_info_proxied_servers_section_footer">Você não está conectado nesses servidores. Roteamento privado é usado para entregar mensagens para eles.</string>
<string name="servers_info_modal_error_title">Erro</string>
<string name="servers_info_reconnect_server_error">Erro ao reconectar servidor</string>
<string name="servers_info_reconnect_servers_error">Erro ao reconectar servidores</string>
<string name="servers_info_reconnect_all_servers_button">Reconectar todos os servidores</string>
<string name="reconnect">Reconectar</string>
<string name="sent_directly">Enviar diretamente</string>
<string name="servers_info_detailed_statistics_sent_messages_header">Enviar mensagens</string>
<string name="servers_info_detailed_statistics_sent_messages_total">Enviar total</string>
<string name="sent_via_proxy">Enviar via proxy</string>
<string name="smp_server">Servidor SMP</string>
<string name="servers_info_detailed_statistics_received_messages_header">Mensagens recebidas</string>
<string name="servers_info_detailed_statistics_received_total">Total recebido</string>
<string name="servers_info_detailed_statistics_receive_errors">Receber erros</string>
<string name="servers_info_starting_from">Começando de %s.</string>
<string name="xftp_server">Servidor XFTP</string>
<string name="secured">Seguro</string>
<string name="send_errors">Enviar erros</string>
<string name="subscribed">Inscrito</string>
<string name="duplicates_label">duplicatas</string>
<string name="expired_label">expirada</string>
<string name="other_label">outro</string>
<string name="subscription_errors">Erros de inscrição</string>
<string name="other_errors">outros erros</string>
<string name="proxied">Proxied</string>
<string name="subscription_results_ignored">Inscrições ignoradas</string>
<string name="download_errors">Erros de download</string>
<string name="downloaded_files">Arquivos baixados</string>
<string name="server_address">Endereço do servidor</string>
<string name="size">Tamanho</string>
<string name="upload_errors">Erros de upload</string>
<string name="open_server_settings_button">Abrir configurações de servidor</string>
<string name="select_verb">Selecione</string>
<string name="moderate_messages_will_be_deleted_warning">As mensagens serão excluídas para todos os membros.</string>
<string name="moderate_messages_will_be_marked_warning">As mensagens serão marcadas como moderadas para todos os membros.</string>
<string name="message_forwarded_title">Mensagem encaminhada</string>
<string name="message_forwarded_desc">Ainda não há conexão direta, a mensagem é encaminhada pelo administrador.</string>
<string name="member_inactive_title">Membro inativo</string>
<string name="selected_chat_items_nothing_selected">Nada selecionado</string>
<string name="delete_messages_mark_deleted_warning">Mensagens serão marcadas para exclusão. O(s) destinatário(s) poderá(ão) revelar essas mensagens.</string>
<string name="you_can_still_view_conversation_with_contact">Você ainda pode ver a conversa com %1$s na lista de conversas.</string>
<string name="no_filtered_contacts">Nenhum contato filtrado</string>
<string name="contact_list_header_title">Seus contatos</string>
<string name="network_smp_proxy_fallback_prohibit_description">NÃO envie mensagens diretamente, mesmo que o seu servidor ou o servidor de destino não suporte roteamento privado.</string>
<string name="network_smp_proxy_fallback_allow_description">Mande mensagens diretamente quando o seu servidor ou o servidor de destino não suporta roteamento privado.</string>
<string name="update_network_smp_proxy_fallback_question">Retorno de roteamento de mensagens</string>
<string name="private_routing_show_message_status">Mostrar status da mensagem</string>
<string name="migrate_from_another_device">Migrar de outro dispositivo</string>
<string name="share_text_message_status">Status da mensagem: %s</string>
<string name="servers_info_uploaded">Carregado</string>
<string name="message_servers">Servidores de mensagem</string>
<string name="media_and_file_servers">Servidores de mídia e arquivo</string>
<string name="subscription_percentage">Mostrar porcentagem</string>
<string name="network_socks_proxy">Proxy SOCKS</string>
<string name="chat_database_exported_save">Você pode salvar o arquivo exportado.</string>
<string name="chat_database_exported_migrate">Você pode migrar o banco de dados exportado.</string>
<string name="chat_database_exported_not_all_files">Alguns arquivos não foram exportados</string>
<string name="you_can_still_send_messages_to_contact">Você pode enviar mensagens para %1$s de Contatos arquivados.</string>
<string name="reset_all_hints">Redefinir todas as dicas</string>
<string name="app_check_for_updates_disabled">Desativado</string>
<string name="app_check_for_updates_stable">Estável</string>
<string name="app_check_for_updates_installed_successfully_title">Instalado com sucesso</string>
<string name="app_check_for_updates_installed_successfully_desc">Por favor reinicie o aplicativo.</string>
<string name="app_check_for_updates_button_remind_later">Me lembre mais tarde</string>
<string name="app_check_for_updates_notice_desc">Para ser notificado sobre os novos lançamentos, habilite a checagem periódica de versões Estáveis e Beta.</string>
<string name="one_hand_ui">Barra de ferramentas de conversa acessível</string>
</resources>
@@ -724,61 +724,4 @@
<string name="servers_info_reconnect_servers_error">Lỗi kết nối lại máy chủ</string>
<string name="servers_info_sessions_errors">Lỗi</string>
<string name="servers_info_reset_stats_alert_error_title">Lỗi khôi phục thống kê</string>
<string name="error_updating_link_for_group">Lỗi cập nhật liên kết nhóm</string>
<string name="error_showing_message">lỗi hiển thị tin nhắn</string>
<string name="error_showing_content">lỗi hiển thị nội dung</string>
<string name="error_saving_ICE_servers">Lỗi lưu máy chủ ICE</string>
<string name="error_saving_xftp_servers">Lỗi lưu máy chủ XFTP</string>
<string name="error_saving_smp_servers">Lỗi lưu máy chủ SMP</string>
<string name="error_sending_message">Lỗi gửi tin nhắn</string>
<string name="error_starting_chat">Lỗi khởi động ứng dụng</string>
<string name="error_stopping_chat">Lỗi dừng ứng dụng</string>
<string name="error_showing_desktop_notification">Lỗi hiển thị thông báo, liên hệ với nhà phát triển.</string>
<string name="error_saving_user_password">Lỗi lưu mật khẩu người dùng</string>
<string name="migrate_from_device_error_saving_settings">Lỗi lưu cài đặt</string>
<string name="error_sending_message_contact_invitation">Lỗi gửi lời mời</string>
<string name="failed_to_active_user_title">Lỗi chuyển đổi hồ sơ!</string>
<string name="error_synchronizing_connection">Lỗi đồng bộ kết nối</string>
<string name="error_setting_address">Lỗi cài đặt địa chỉ</string>
<string name="v5_2_disappear_one_message_descr">Dù đã tắt trong cuộc trò chuyện.</string>
<string name="error_setting_network_config">Lỗi cập nhật cấu hình mạng</string>
<string name="error_updating_user_privacy">Lỗi cập nhật quyền riêng tư người dùng</string>
<string name="icon_descr_expand_role">Mở rộng chọn quyền hạn</string>
<string name="settings_section_title_experimenta">THỬ NGHIỆM</string>
<string name="expand_verb">Mở rộng</string>
<string name="exit_without_saving">Thoát mà không lưu</string>
<string name="expired_label">đã hết hạn</string>
<string name="migrate_from_device_error_verifying_passphrase">Lỗi xác thực mật khẩu:</string>
<string name="possible_slow_function_desc">Quá trình thực hiện chức năng mất quá nhiều thời gian: %1$dgiây: %2$s</string>
<string name="settings_experimental_features">Tính năng thử nghiệm</string>
<string name="export_database">Xuất cơ sở dữ liệu</string>
<string name="migrate_from_device_error_uploading_archive">Lỗi tải lên kho lưu trữ</string>
<string name="migrate_from_device_exported_file_doesnt_exist">Tập tin đã xuất không tồn tại</string>
<string name="settings_section_title_files">TẬP TIN</string>
<string name="failed_to_parse_chats_title">Không thể tải tin nhắn</string>
<string name="file_error_no_file">Không tìm thấy tập tin - có thể tập tin đã bị xóa và hủy bỏ.</string>
<string name="file_error">Lỗi tập tin</string>
<string name="export_theme">Xuất chủ đề</string>
<string name="failed_to_parse_chat_title">Không thể tải tin nhắn</string>
<string name="choose_file">Tập tin</string>
<string name="v5_0_large_files_support_descr">Nhanh chóng và không cần phải đợi người gửi hoạt động!</string>
<string name="file_not_found">Không tìm thấy tập tin</string>
<string name="file_with_path">Tập tin: %s</string>
<string name="v5_4_better_groups_descr">Tham gia nhanh chóng hơn và xử lý tin nhắn ổn định hơn.</string>
<string name="servers_info_files_tab">Tập tin</string>
<string name="favorite_chat">Yêu thích</string>
<string name="icon_descr_file">Tập tin</string>
<string name="file_error_relay">Lỗi máy chủ tệp: %1$s</string>
<string name="info_row_file_status">Trạng thái tệp</string>
<string name="files_and_media_not_allowed">Tệp và phương tiện truyền thông không được cho phép</string>
<string name="files_are_prohibited_in_group">Tệp và phương tiện truyền thông bị cấm trong nhóm này.</string>
<string name="revoke_file__message">Tệp sẽ bị xóa khỏi máy chủ.</string>
<string name="files_and_media_section">Tệp &amp; phương tiện truyền thông</string>
<string name="files_and_media_prohibited">Tệp và phương tiện truyền thông bị cấm!</string>
<string name="file_will_be_received_when_contact_completes_uploading">Tệp sẽ được nhận khi liên hệ của bạn hoàn tất quá trình tải lên.</string>
<string name="files_and_media">Tệp và phương tiện truyền thông</string>
<string name="migrate_to_device_file_delete_or_link_invalid">Tệp đã bị xóa hoặc liên kết không hợp lệ</string>
<string name="file_saved">Tệp đã được lưu</string>
<string name="file_will_be_received_when_contact_is_online">Tệp sẽ được nhận khi liên hệ của bạn hoạt động, vui lòng chờ hoặc kiểm tra lại sau!</string>
<string name="share_text_file_status">Trạng thái tệp: %s</string>
</resources>
@@ -35,7 +35,7 @@ actual fun ActiveCallInteractiveArea(call: Call) {
) {
Box(
Modifier
.padding(end = 15.dp, bottom = 92.dp)
.padding(end = 71.dp, bottom = 92.dp)
.size(67.dp)
.combinedClickable(onClick = {
val chat = chatModel.getChat(call.contact.id)
+7 -5
View File
@@ -21,15 +21,17 @@ kotlin.code.style=official
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
kotlin.mpp.androidSourceSetLayoutVersion=2
kotlin.jvm.target=11
android.version_name=6.1-beta.0
android.version_code=239
android.version_name=6.0.4
android.version_code=237
desktop.version_name=6.1-beta.0
desktop.version_code=66
desktop.version_name=6.0.4
desktop.version_code=65
kotlin.version=1.9.23
gradle.plugin.version=8.2.0
compose.version=1.6.11
compose.version=1.6.1
+1 -1
View File
@@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd
source-repository-package
type: git
location: https://github.com/simplex-chat/simplexmq.git
tag: 309ef3766cc6b69e0c3aa0c140faab25383b732a
tag: 946e16339e16e026f51185ebfb48c3a0c5a5b2e1
source-repository-package
type: git
+1 -1
View File
@@ -1,5 +1,5 @@
name: simplex-chat
version: 6.1.0.2
version: 6.1.0.0
#synopsis:
#description:
homepage: https://github.com/simplex-chat/simplex-chat#readme
+1 -1
View File
@@ -1,5 +1,5 @@
{
"https://github.com/simplex-chat/simplexmq.git"."309ef3766cc6b69e0c3aa0c140faab25383b732a" = "1ch03kizvsq3m5jwravyil529mc0lcfwj43czb1nhykbg8yb3cjv";
"https://github.com/simplex-chat/simplexmq.git"."946e16339e16e026f51185ebfb48c3a0c5a5b2e1" = "1jkx2f14h5krmy467zyifsc58dys89pkpn08cyf1q9v78in7nwfd";
"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";
+1 -1
View File
@@ -5,7 +5,7 @@ cabal-version: 1.12
-- see: https://github.com/sol/hpack
name: simplex-chat
version: 6.1.0.2
version: 6.1.0.0
category: Web, System, Services, Cryptography
homepage: https://github.com/simplex-chat/simplex-chat#readme
author: simplex.chat
+152 -224
View File
@@ -106,7 +106,7 @@ import Simplex.Messaging.Agent.Store.SQLite (MigrationConfirmation (..), Migrati
import Simplex.Messaging.Agent.Store.SQLite.DB (SlowQueryStats (..))
import qualified Simplex.Messaging.Agent.Store.SQLite.DB as DB
import qualified Simplex.Messaging.Agent.Store.SQLite.Migrations as Migrations
import Simplex.Messaging.Client (NetworkConfig (..), ProxyClientError (..), SocksMode (SMAlways), defaultNetworkConfig, textToHostMode)
import Simplex.Messaging.Client (NetworkConfig (..), ProxyClientError (..), SocksMode (SMAlways), defaultNetworkConfig)
import qualified Simplex.Messaging.Crypto as C
import Simplex.Messaging.Crypto.File (CryptoFile (..), CryptoFileArgs (..))
import qualified Simplex.Messaging.Crypto.File as CF
@@ -120,7 +120,7 @@ import qualified Simplex.Messaging.Protocol as SMP
import Simplex.Messaging.ServiceScheme (ServiceScheme (..))
import qualified Simplex.Messaging.TMap as TM
import Simplex.Messaging.Transport (TransportError (..))
import Simplex.Messaging.Transport.Client (defaultSocksProxyWithAuth)
import Simplex.Messaging.Transport.Client (defaultSocksProxy)
import Simplex.Messaging.Util
import Simplex.Messaging.Version
import Simplex.RemoteControl.Invitation (RCInvitation (..), RCSignedInvitation (..))
@@ -342,11 +342,11 @@ newChatController
userServers user' = useServers config protocol <$> withTransaction chatStore (`getProtocolServers` user')
updateNetworkConfig :: NetworkConfig -> SimpleNetCfg -> NetworkConfig
updateNetworkConfig cfg SimpleNetCfg {socksProxy, socksMode, hostMode, requiredHostMode, smpProxyMode_, smpProxyFallback_, tcpTimeout_, logTLSErrors} =
updateNetworkConfig cfg SimpleNetCfg {socksProxy, socksMode, smpProxyMode_, smpProxyFallback_, tcpTimeout_, logTLSErrors} =
let cfg1 = maybe cfg (\smpProxyMode -> cfg {smpProxyMode}) smpProxyMode_
cfg2 = maybe cfg1 (\smpProxyFallback -> cfg1 {smpProxyFallback}) smpProxyFallback_
cfg3 = maybe cfg2 (\tcpTimeout -> cfg2 {tcpTimeout, tcpConnectTimeout = (tcpTimeout * 3) `div` 2}) tcpTimeout_
in cfg3 {socksProxy, socksMode, hostMode, requiredHostMode, logTLSErrors}
in cfg3 {socksProxy, socksMode, logTLSErrors}
withChatLock :: String -> CM a -> CM a
withChatLock name action = asks chatLock >>= \l -> withLock l name action
@@ -843,7 +843,9 @@ processChatCommand' vr = \case
CTContactConnection -> pure $ chatCmdError (Just user) "not supported"
APIDeleteChatItem (ChatRef cType chatId) itemIds mode -> withUser $ \user -> case cType of
CTDirect -> withContactLock "deleteChatItem" chatId $ do
(ct, items) <- getCommandDirectChatItems user chatId itemIds
ct <- withStore $ \db -> getContact db vr user chatId
(errs, items) <- lift $ partitionEithers <$> withStoreBatch (\db -> map (getDirectCI db) (L.toList itemIds))
unless (null errs) $ toView $ CRChatErrors (Just user) errs
case mode of
CIDMInternal -> deleteDirectCIs user ct items True False
CIDMBroadcast -> do
@@ -856,9 +858,13 @@ processChatCommand' vr = \case
if featureAllowed SCFFullDelete forUser ct
then deleteDirectCIs user ct items True False
else markDirectCIsDeleted user ct items True =<< liftIO getCurrentTime
where
getDirectCI :: DB.Connection -> ChatItemId -> IO (Either ChatError (CChatItem 'CTDirect))
getDirectCI db itemId = runExceptT . withExceptT ChatErrorStore $ getDirectChatItem db user chatId itemId
CTGroup -> withGroupLock "deleteChatItem" chatId $ do
(gInfo, items) <- getCommandGroupChatItems user chatId itemIds
ms <- withFastStore' $ \db -> getGroupMembers db vr user gInfo
Group gInfo ms <- withStore $ \db -> getGroup db vr user chatId
(errs, items) <- lift $ partitionEithers <$> withStoreBatch (\db -> map (getGroupCI db) (L.toList itemIds))
unless (null errs) $ toView $ CRChatErrors (Just user) errs
case mode of
CIDMInternal -> deleteGroupCIs user gInfo items True False Nothing =<< liftIO getCurrentTime
CIDMBroadcast -> do
@@ -868,9 +874,17 @@ processChatCommand' vr = \case
events = L.nonEmpty $ map (`XMsgDel` Nothing) msgIds
mapM_ (sendGroupMessages user gInfo ms) events
delGroupChatItems user gInfo items Nothing
where
getGroupCI :: DB.Connection -> ChatItemId -> IO (Either ChatError (CChatItem 'CTGroup))
getGroupCI db itemId = runExceptT . withExceptT ChatErrorStore $ getGroupChatItem db user chatId itemId
CTLocal -> do
(nf, items) <- getCommandLocalChatItems user chatId itemIds
nf <- withStore $ \db -> getNoteFolder db user chatId
(errs, items) <- lift $ partitionEithers <$> withStoreBatch (\db -> map (getLocalCI db) (L.toList itemIds))
unless (null errs) $ toView $ CRChatErrors (Just user) errs
deleteLocalCIs user nf items True False
where
getLocalCI :: DB.Connection -> ChatItemId -> IO (Either ChatError (CChatItem 'CTLocal))
getLocalCI db itemId = runExceptT . withExceptT ChatErrorStore $ getLocalChatItem db user chatId itemId
CTContactRequest -> pure $ chatCmdError (Just user) "not supported"
CTContactConnection -> pure $ chatCmdError (Just user) "not supported"
where
@@ -888,8 +902,9 @@ processChatCommand' vr = \case
itemsMsgIds :: [CChatItem c] -> [SharedMsgId]
itemsMsgIds = mapMaybe (\(CChatItem _ ChatItem {meta = CIMeta {itemSharedMsgId}}) -> itemSharedMsgId)
APIDeleteMemberChatItem gId itemIds -> withUser $ \user -> withGroupLock "deleteChatItem" gId $ do
(gInfo@GroupInfo {membership}, items) <- getCommandGroupChatItems user gId itemIds
ms <- withFastStore' $ \db -> getGroupMembers db vr user gInfo
Group gInfo@GroupInfo {membership} ms <- withStore $ \db -> getGroup db vr user gId
(errs, items) <- lift $ partitionEithers <$> withStoreBatch (\db -> map (getGroupCI db user) (L.toList itemIds))
unless (null errs) $ toView $ CRChatErrors (Just user) errs
assertDeletable gInfo items
assertUserGroupRole gInfo GRAdmin
let msgMemIds = itemsMsgMemIds gInfo items
@@ -897,6 +912,8 @@ processChatCommand' vr = \case
mapM_ (sendGroupMessages user gInfo ms) events
delGroupChatItems user gInfo items (Just membership)
where
getGroupCI :: DB.Connection -> User -> ChatItemId -> IO (Either ChatError (CChatItem 'CTGroup))
getGroupCI db user itemId = runExceptT . withExceptT ChatErrorStore $ getGroupChatItem db user gId itemId
assertDeletable :: GroupInfo -> [CChatItem 'CTGroup] -> CM ()
assertDeletable GroupInfo {membership = GroupMember {memberRole = membershipMemRole}} items =
unless (all itemDeletable items) $ throwChatError CEInvalidChatItemDelete
@@ -963,51 +980,6 @@ processChatCommand' vr = \case
throwChatError (CECommandError $ "reaction already " <> if add then "added" else "removed")
when (add && length rs >= maxMsgReactions) $
throwChatError (CECommandError "too many reactions")
APIPlanForwardChatItems (ChatRef fromCType fromChatId) itemIds -> withUser $ \user -> case fromCType of
CTDirect -> planForward user . snd =<< getCommandDirectChatItems user fromChatId itemIds
CTGroup -> planForward user . snd =<< getCommandGroupChatItems user fromChatId itemIds
CTLocal -> planForward user . snd =<< getCommandLocalChatItems user fromChatId itemIds
CTContactRequest -> pure $ chatCmdError (Just user) "not supported"
CTContactConnection -> pure $ chatCmdError (Just user) "not supported"
where
planForward :: User -> [CChatItem c] -> CM ChatResponse
planForward user items = do
(itemIds', forwardErrors) <- unzip <$> mapM planItemForward items
let forwardConfirmation = case catMaybes forwardErrors of
[] -> Nothing
errs -> Just $ case mainErr of
FFENotAccepted _ -> FCFilesNotAccepted fileIds
FFEInProgress -> FCFilesInProgress filesCount
FFEMissing -> FCFilesMissing filesCount
FFEFailed -> FCFilesFailed filesCount
where
mainErr = minimum errs
fileIds = catMaybes $ map (\case FFENotAccepted ftId -> Just ftId; _ -> Nothing) errs
filesCount = length $ filter (mainErr ==) errs
pure CRForwardPlan {user, itemsCount = length itemIds, chatItemIds = catMaybes itemIds', forwardConfirmation}
where
planItemForward :: CChatItem c -> CM (Maybe ChatItemId, Maybe ForwardFileError)
planItemForward (CChatItem _ ci) = forwardMsgContent ci >>= maybe (pure (Nothing, Nothing)) (forwardContentPlan ci)
forwardContentPlan :: ChatItem c d -> MsgContent -> CM (Maybe ChatItemId, Maybe ForwardFileError)
forwardContentPlan ChatItem {file, meta = CIMeta {itemId}} mc = case file of
Nothing -> pure (Just itemId, Nothing)
Just CIFile {fileId, fileStatus, fileSource} -> case ciFileForwardError fileId fileStatus of
Just err -> pure $ itemIdWithoutFile err
Nothing -> case fileSource of
Just CryptoFile {filePath} -> do
exists <- doesFileExist =<< lift (toFSFilePath filePath)
pure $ if exists then (Just itemId, Nothing) else itemIdWithoutFile FFEMissing
Nothing -> pure $ itemIdWithoutFile FFEMissing
where
itemIdWithoutFile err = (if hasContent then Just itemId else Nothing, Just err)
hasContent = case mc of
MCText _ -> True
MCLink {} -> True
MCImage {} -> True
MCVideo {text} -> text /= ""
MCVoice {text} -> text /= ""
MCFile t -> t /= ""
MCUnknown {} -> True
APIForwardChatItems (ChatRef toCType toChatId) (ChatRef fromCType fromChatId) itemIds itemTTL -> withUser $ \user -> case toCType of
CTDirect -> do
cmrs <- prepareForward user
@@ -1015,100 +987,112 @@ processChatCommand' vr = \case
Just cmrs' ->
withContactLock "forwardChatItem, to contact" toChatId $
sendContactContentMessages user toChatId False itemTTL cmrs'
Nothing -> pure $ CRNewChatItems user []
Nothing -> throwChatError $ CEInternalError "no chat items to forward"
CTGroup -> do
cmrs <- prepareForward user
case L.nonEmpty cmrs of
Just cmrs' ->
withGroupLock "forwardChatItem, to group" toChatId $
sendGroupContentMessages user toChatId False itemTTL cmrs'
Nothing -> pure $ CRNewChatItems user []
Nothing -> throwChatError $ CEInternalError "no chat items to forward"
CTLocal -> do
cmrs <- prepareForward user
case L.nonEmpty cmrs of
Just cmrs' ->
createNoteFolderContentItems user toChatId cmrs'
Nothing -> pure $ CRNewChatItems user []
Nothing -> throwChatError $ CEInternalError "no chat items to forward"
CTContactRequest -> pure $ chatCmdError (Just user) "not supported"
CTContactConnection -> pure $ chatCmdError (Just user) "not supported"
where
prepareForward :: User -> CM [ComposeMessageReq]
prepareForward user = case fromCType of
CTDirect -> withContactLock "forwardChatItem, from contact" fromChatId $ do
(ct, items) <- getCommandDirectChatItems user fromChatId itemIds
catMaybes <$> mapM (\ci -> ciComposeMsgReq ct ci <$$> prepareMsgReq ci) items
ct <- withFastStore $ \db -> getContact db vr user fromChatId
(errs, items) <- lift $ partitionEithers <$> withStoreBatch (\db -> map (getDirectCI db) (L.toList itemIds))
unless (null errs) $ toView $ CRChatErrors (Just user) errs
mapM (ciComposeMsgReq ct) items
where
ciComposeMsgReq :: Contact -> CChatItem 'CTDirect -> (MsgContent, Maybe CryptoFile) -> ComposeMessageReq
ciComposeMsgReq ct (CChatItem md ci) (mc', file) =
getDirectCI :: DB.Connection -> ChatItemId -> IO (Either ChatError (CChatItem 'CTDirect))
getDirectCI db itemId = runExceptT . withExceptT ChatErrorStore $ getDirectChatItem db user fromChatId itemId
ciComposeMsgReq :: Contact -> CChatItem 'CTDirect -> CM ComposeMessageReq
ciComposeMsgReq ct (CChatItem _ ci) = do
(mc, mDir) <- forwardMC ci
file <- forwardCryptoFile ci
let itemId = chatItemId' ci
ciff = forwardCIFF ci $ Just (CIFFContact (forwardName ct) (toMsgDirection md) (Just fromChatId) (Just itemId))
in (ComposedMessage file Nothing mc', ciff)
ciff = forwardCIFF ci $ Just (CIFFContact (forwardName ct) mDir (Just fromChatId) (Just itemId))
pure (ComposedMessage file Nothing mc, ciff)
where
forwardName :: Contact -> ContactName
forwardName Contact {profile = LocalProfile {displayName, localAlias}}
| localAlias /= "" = localAlias
| otherwise = displayName
CTGroup -> withGroupLock "forwardChatItem, from group" fromChatId $ do
(gInfo, items) <- getCommandGroupChatItems user fromChatId itemIds
catMaybes <$> mapM (\ci -> ciComposeMsgReq gInfo ci <$$> prepareMsgReq ci) items
gInfo <- withFastStore $ \db -> getGroupInfo db vr user fromChatId
(errs, items) <- lift $ partitionEithers <$> withStoreBatch (\db -> map (getGroupCI db) (L.toList itemIds))
unless (null errs) $ toView $ CRChatErrors (Just user) errs
mapM (ciComposeMsgReq gInfo) items
where
ciComposeMsgReq :: GroupInfo -> CChatItem 'CTGroup -> (MsgContent, Maybe CryptoFile) -> ComposeMessageReq
ciComposeMsgReq gInfo (CChatItem md ci) (mc', file) = do
getGroupCI :: DB.Connection -> ChatItemId -> IO (Either ChatError (CChatItem 'CTGroup))
getGroupCI db itemId = runExceptT . withExceptT ChatErrorStore $ getGroupChatItem db user fromChatId itemId
ciComposeMsgReq :: GroupInfo -> CChatItem 'CTGroup -> CM ComposeMessageReq
ciComposeMsgReq gInfo (CChatItem _ ci) = do
(mc, mDir) <- forwardMC ci
file <- forwardCryptoFile ci
let itemId = chatItemId' ci
ciff = forwardCIFF ci $ Just (CIFFGroup (forwardName gInfo) (toMsgDirection md) (Just fromChatId) (Just itemId))
in (ComposedMessage file Nothing mc', ciff)
ciff = forwardCIFF ci $ Just (CIFFGroup (forwardName gInfo) mDir (Just fromChatId) (Just itemId))
pure (ComposedMessage file Nothing mc, ciff)
where
forwardName :: GroupInfo -> ContactName
forwardName GroupInfo {groupProfile = GroupProfile {displayName}} = displayName
CTLocal -> do
(_, items) <- getCommandLocalChatItems user fromChatId itemIds
catMaybes <$> mapM (\ci -> ciComposeMsgReq ci <$$> prepareMsgReq ci) items
(errs, items) <- lift $ partitionEithers <$> withStoreBatch (\db -> map (getLocalCI db) (L.toList itemIds))
unless (null errs) $ toView $ CRChatErrors (Just user) errs
mapM ciComposeMsgReq items
where
ciComposeMsgReq :: CChatItem 'CTLocal -> (MsgContent, Maybe CryptoFile) -> ComposeMessageReq
ciComposeMsgReq (CChatItem _ ci) (mc', file) =
getLocalCI :: DB.Connection -> ChatItemId -> IO (Either ChatError (CChatItem 'CTLocal))
getLocalCI db itemId = runExceptT . withExceptT ChatErrorStore $ getLocalChatItem db user fromChatId itemId
ciComposeMsgReq :: CChatItem 'CTLocal -> CM ComposeMessageReq
ciComposeMsgReq (CChatItem _ ci) = do
(mc, _) <- forwardMC ci
file <- forwardCryptoFile ci
let ciff = forwardCIFF ci Nothing
in (ComposedMessage file Nothing mc', ciff)
pure (ComposedMessage file Nothing mc, ciff)
CTContactRequest -> throwChatError $ CECommandError "not supported"
CTContactConnection -> throwChatError $ CECommandError "not supported"
where
prepareMsgReq :: CChatItem c -> CM (Maybe (MsgContent, Maybe CryptoFile))
prepareMsgReq (CChatItem _ ci) = forwardMsgContent ci $>>= forwardContent ci
forwardMC :: ChatItem c d -> CM (MsgContent, MsgDirection)
forwardMC ChatItem {meta = CIMeta {itemDeleted = Just _}} = throwChatError CEInvalidForward
forwardMC ChatItem {content = CISndMsgContent fmc} = pure (fmc, MDSnd)
forwardMC ChatItem {content = CIRcvMsgContent fmc} = pure (fmc, MDRcv)
forwardMC _ = throwChatError CEInvalidForward
forwardCIFF :: ChatItem c d -> Maybe CIForwardedFrom -> Maybe CIForwardedFrom
forwardCIFF ChatItem {meta = CIMeta {itemForwarded}} ciff = case itemForwarded of
Nothing -> ciff
Just CIFFUnknown -> ciff
Just prevCIFF -> Just prevCIFF
forwardContent :: ChatItem c d -> MsgContent -> CM (Maybe (MsgContent, Maybe CryptoFile))
forwardContent ChatItem {file} mc = case file of
Nothing -> pure $ Just (mc, Nothing)
Just CIFile {fileName, fileStatus, fileSource = Just fromCF@CryptoFile {filePath}}
| ciFileLoaded fileStatus ->
chatReadVar filesFolder >>= \case
Nothing ->
ifM (doesFileExist filePath) (pure $ Just (mc, Just fromCF)) (pure contentWithoutFile)
Just filesFolder -> do
let fsFromPath = filesFolder </> filePath
ifM
(doesFileExist fsFromPath)
( do
fsNewPath <- liftIO $ filesFolder `uniqueCombine` fileName
liftIO $ B.writeFile fsNewPath "" -- create empty file
encrypt <- chatReadVar encryptLocalFiles
cfArgs <- if encrypt then Just <$> (atomically . CF.randomArgs =<< asks random) else pure Nothing
let toCF = CryptoFile fsNewPath cfArgs
-- to keep forwarded file in case original is deleted
liftIOEither $ runExceptT $ withExceptT (ChatError . CEInternalError . show) $ copyCryptoFile (fromCF {filePath = fsFromPath} :: CryptoFile) toCF
pure $ Just (mc, Just (toCF {filePath = takeFileName fsNewPath} :: CryptoFile))
)
(pure contentWithoutFile)
_ -> pure contentWithoutFile
where
contentWithoutFile = case mc of
MCImage {} -> Just (mc, Nothing)
MCLink {} -> Just (mc, Nothing)
_ | contentText /= "" -> Just (MCText contentText, Nothing)
_ -> Nothing
contentText = msgContentText mc
forwardCryptoFile :: ChatItem c d -> CM (Maybe CryptoFile)
forwardCryptoFile ChatItem {file = Nothing} = pure Nothing
forwardCryptoFile ChatItem {file = Just ciFile} = case ciFile of
CIFile {fileName, fileSource = Just fromCF@CryptoFile {filePath}} ->
chatReadVar filesFolder >>= \case
Nothing ->
ifM (doesFileExist filePath) (pure $ Just fromCF) (pure Nothing)
Just filesFolder -> do
let fsFromPath = filesFolder </> filePath
ifM
(doesFileExist fsFromPath)
( do
fsNewPath <- liftIO $ filesFolder `uniqueCombine` fileName
liftIO $ B.writeFile fsNewPath "" -- create empty file
encrypt <- chatReadVar encryptLocalFiles
cfArgs <- if encrypt then Just <$> (atomically . CF.randomArgs =<< asks random) else pure Nothing
let toCF = CryptoFile fsNewPath cfArgs
-- to keep forwarded file in case original is deleted
liftIOEither $ runExceptT $ withExceptT (ChatError . CEInternalError . show) $ copyCryptoFile (fromCF {filePath = fsFromPath} :: CryptoFile) toCF
pure $ Just (toCF {filePath = takeFileName fsNewPath} :: CryptoFile)
)
(pure Nothing)
_ -> pure Nothing
copyCryptoFile :: CryptoFile -> CryptoFile -> ExceptT CF.FTCryptoError IO ()
copyCryptoFile fromCF@CryptoFile {filePath = fsFromPath, cryptoArgs = fromArgs} toCF@CryptoFile {cryptoArgs = toArgs} = do
fromSizeFull <- getFileSize fsFromPath
@@ -3103,38 +3087,6 @@ processChatCommand' vr = \case
| (msg_, (ComposedMessage {msgContent}, itemForwarded), f, q) <-
zipWith4 (,,,) msgs_ (L.toList cmrs') (L.toList ciFiles_) (L.toList quotedItems_)
]
getCommandDirectChatItems :: User -> Int64 -> NonEmpty ChatItemId -> CM (Contact, [CChatItem 'CTDirect])
getCommandDirectChatItems user ctId itemIds = do
ct <- withFastStore $ \db -> getContact db vr user ctId
(errs, items) <- lift $ partitionEithers <$> withStoreBatch (\db -> map (getDirectCI db) (L.toList itemIds))
unless (null errs) $ toView $ CRChatErrors (Just user) errs
pure (ct, items)
where
getDirectCI :: DB.Connection -> ChatItemId -> IO (Either ChatError (CChatItem 'CTDirect))
getDirectCI db itemId = runExceptT . withExceptT ChatErrorStore $ getDirectChatItem db user ctId itemId
getCommandGroupChatItems :: User -> Int64 -> NonEmpty ChatItemId -> CM (GroupInfo, [CChatItem 'CTGroup])
getCommandGroupChatItems user gId itemIds = do
gInfo <- withFastStore $ \db -> getGroupInfo db vr user gId
(errs, items) <- lift $ partitionEithers <$> withStoreBatch (\db -> map (getGroupCI db) (L.toList itemIds))
unless (null errs) $ toView $ CRChatErrors (Just user) errs
pure (gInfo, items)
where
getGroupCI :: DB.Connection -> ChatItemId -> IO (Either ChatError (CChatItem 'CTGroup))
getGroupCI db itemId = runExceptT . withExceptT ChatErrorStore $ getGroupChatItem db user gId itemId
getCommandLocalChatItems :: User -> Int64 -> NonEmpty ChatItemId -> CM (NoteFolder, [CChatItem 'CTLocal])
getCommandLocalChatItems user nfId itemIds = do
nf <- withStore $ \db -> getNoteFolder db user nfId
(errs, items) <- lift $ partitionEithers <$> withStoreBatch (\db -> map (getLocalCI db) (L.toList itemIds))
unless (null errs) $ toView $ CRChatErrors (Just user) errs
pure (nf, items)
where
getLocalCI :: DB.Connection -> ChatItemId -> IO (Either ChatError (CChatItem 'CTLocal))
getLocalCI db itemId = runExceptT . withExceptT ChatErrorStore $ getLocalChatItem db user nfId itemId
forwardMsgContent :: ChatItem c d -> CM (Maybe MsgContent)
forwardMsgContent ChatItem {meta = CIMeta {itemDeleted = Just _}} = pure Nothing -- this can be deleted after selection
forwardMsgContent ChatItem {content = CISndMsgContent fmc} = pure $ Just fmc
forwardMsgContent ChatItem {content = CIRcvMsgContent fmc} = pure $ Just fmc
forwardMsgContent _ = throwChatError CEInvalidForward
createNoteFolderContentItems :: User -> NoteFolderId -> NonEmpty ComposeMessageReq -> CM ChatResponse
createNoteFolderContentItems user folderId cmrs = do
assertNoQuotes
@@ -3445,7 +3397,7 @@ callStatusItemContent user Contact {contactId} chatItemId receivedStatus = do
-- used during file transfer for actual operations with file system
toFSFilePath :: FilePath -> CM' FilePath
toFSFilePath f =
maybe f (</> f) <$> (chatReadVar' filesFolder)
maybe f (</> f) <$> (readTVarIO =<< asks filesFolder)
setFileToEncrypt :: RcvFileTransfer -> CM RcvFileTransfer
setFileToEncrypt ft@RcvFileTransfer {fileId} = do
@@ -3567,9 +3519,7 @@ receiveViaCompleteFD user fileId RcvFileDescr {fileDescrText, fileDescrComplete}
relaysNotApproved :: [XFTPServer] -> CM ()
relaysNotApproved unknownSrvs = do
aci_ <- resetRcvCIFileStatus user fileId CIFSRcvInvitation
forM_ aci_ $ \aci -> do
cleanupACIFile aci
toView $ CRChatItemUpdated user aci
forM_ aci_ $ \aci -> toView $ CRChatItemUpdated user aci
throwChatError $ CEFileNotApproved fileId unknownSrvs
getNetworkConfig :: CM' NetworkConfig
@@ -4293,22 +4243,14 @@ processAgentMsgRcvFile _corrId aFileId msg = do
RFERR e
| e == FILE NOT_APPROVED -> do
aci_ <- resetRcvCIFileStatus user fileId CIFSRcvAborted
forM_ aci_ cleanupACIFile
agentXFTPDeleteRcvFile aFileId fileId
forM_ aci_ $ \aci -> toView $ CRChatItemUpdated user aci
| otherwise -> do
aci_ <- withStore $ \db -> do
ci <- withStore $ \db -> do
liftIO $ updateFileCancelled db user fileId (CIFSRcvError $ agentFileError e)
lookupChatItemByFileId db vr user fileId
forM_ aci_ cleanupACIFile
agentXFTPDeleteRcvFile aFileId fileId
toView $ CRRcvFileError user aci_ e ft
cleanupACIFile :: AChatItem -> CM ()
cleanupACIFile (AChatItem _ _ _ ChatItem {file = Just CIFile {fileSource = Just CryptoFile {filePath}}}) = do
fsFilePath <- lift $ toFSFilePath filePath
removeFile fsFilePath `catchChatError` \_ -> pure ()
cleanupACIFile _ = pure ()
toView $ CRRcvFileError user ci e ft
processAgentMessageConn :: VersionRangeChat -> User -> ACorrId -> ConnId -> AEvent 'AEConn -> CM ()
processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = do
@@ -4545,13 +4487,10 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
void $ continueSending connEntity conn
sentMsgDeliveryEvent conn msgId
checkSndInlineFTComplete conn msgId
cis <- withStore $ \db -> do
cis <- updateDirectItemsStatus' db ct conn msgId (CISSndSent SSPComplete)
liftIO $ forM cis $ \ci -> setDirectSndChatItemViaProxy db user ct ci (isJust proxy)
let acis = map ctItem cis
unless (null acis) $ toView $ CRChatItemsStatusesUpdated user acis
where
ctItem = AChatItem SCTDirect SMDSnd (DirectChat ct)
ci_ <- withStore $ \db -> do
ci_ <- updateDirectItemStatus' db ct conn msgId (CISSndSent SSPComplete)
forM ci_ $ \ci -> liftIO $ setDirectSndChatItemViaProxy db user ct ci (isJust proxy)
forM_ ci_ $ \ci -> toView $ CRChatItemStatusUpdated user (AChatItem SCTDirect SMDSnd (DirectChat ct) ci)
SWITCH qd phase cStats -> do
toView $ CRContactSwitch user ct (SwitchProgress qd phase cStats)
when (phase `elem` [SPStarted, SPCompleted]) $ case qd of
@@ -4607,7 +4546,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
processConnMERR connEntity conn err
MERRS msgIds err -> do
-- error cannot be AUTH error here
updateDirectItemsStatusMsgs ct conn (L.toList msgIds) (CISSndError $ agentSndError err)
updateDirectItemsStatus ct conn (L.toList msgIds) (CISSndError $ agentSndError err)
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
ERR err -> do
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
@@ -4961,7 +4900,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
continued <- continueSending connEntity conn
sentMsgDeliveryEvent conn msgId
checkSndInlineFTComplete conn msgId
updateGroupItemsStatus gInfo m conn msgId GSSSent (Just $ isJust proxy)
updateGroupItemStatus gInfo m conn msgId GSSSent (Just $ isJust proxy)
when continued $ sendPendingGroupMessages user m conn
SWITCH qd phase cStats -> do
toView $ CRGroupMemberSwitch user gInfo m (SwitchProgress qd phase cStats)
@@ -5005,10 +4944,10 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
continued <- continueSending connEntity conn
when continued $ sendPendingGroupMessages user m conn
MWARN msgId err -> do
withStore' $ \db -> updateGroupItemsErrorStatus db msgId (groupMemberId' m) (GSSWarning $ agentSndError err)
withStore' $ \db -> updateGroupItemErrorStatus db msgId (groupMemberId' m) (GSSWarning $ agentSndError err)
processConnMWARN connEntity conn err
MERR msgId err -> do
withStore' $ \db -> updateGroupItemsErrorStatus db msgId (groupMemberId' m) (GSSError $ agentSndError err)
withStore' $ \db -> updateGroupItemErrorStatus db msgId (groupMemberId' m) (GSSError $ agentSndError err)
-- group errors are silenced to reduce load on UI event log
-- toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
processConnMERR connEntity conn err
@@ -5016,7 +4955,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
let newStatus = GSSError $ agentSndError err
-- error cannot be AUTH error here
withStore' $ \db -> forM_ msgIds $ \msgId ->
updateGroupItemsErrorStatus db msgId (groupMemberId' m) newStatus `catchAll_` pure ()
updateGroupItemErrorStatus db msgId (groupMemberId' m) newStatus `catchAll_` pure ()
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
ERR err -> do
toView $ CRChatError (Just user) (ChatErrorAgent err $ Just connEntity)
@@ -5024,10 +4963,10 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
-- TODO add debugging output
_ -> pure ()
where
updateGroupItemsErrorStatus :: DB.Connection -> AgentMsgId -> GroupMemberId -> GroupSndStatus -> IO ()
updateGroupItemsErrorStatus db msgId groupMemberId newStatus = do
itemIds <- getChatItemIdsByAgentMsgId db connId msgId
forM_ itemIds $ \itemId -> updateGroupMemSndStatus' db itemId groupMemberId newStatus
updateGroupItemErrorStatus :: DB.Connection -> AgentMsgId -> GroupMemberId -> GroupSndStatus -> IO ()
updateGroupItemErrorStatus db msgId groupMemberId newStatus = do
chatItemId_ <- getChatItemIdByAgentMsgId db connId msgId
forM_ chatItemId_ $ \itemId -> updateGroupMemSndStatus' db itemId groupMemberId newStatus
agentMsgDecryptError :: AgentCryptoError -> (MsgDecryptError, Word32)
agentMsgDecryptError = \case
@@ -6699,42 +6638,43 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
withStore' $ \db -> updateSndMsgDeliveryStatus db connId agentMsgId $ MDSSndRcvd msgRcptStatus
updateDirectItemStatus ct conn agentMsgId $ CISSndRcvd msgRcptStatus SSPComplete
-- TODO [batch send] update status of all messages in batch
-- - this is for when we implement identifying inactive connections
-- - regular messages sent in batch would all be marked as delivered by a single receipt
-- - repeat for directMsgReceived if same logic is applied to direct messages
-- - getChatItemIdByAgentMsgId to return [ChatItemId]
groupMsgReceived :: GroupInfo -> GroupMember -> Connection -> MsgMeta -> NonEmpty MsgReceipt -> CM ()
groupMsgReceived gInfo m conn@Connection {connId} msgMeta msgRcpts = do
checkIntegrityCreateItem (CDGroupRcv gInfo m) msgMeta `catchChatError` \_ -> pure ()
forM_ msgRcpts $ \MsgReceipt {agentMsgId, msgRcptStatus} -> do
withStore' $ \db -> updateSndMsgDeliveryStatus db connId agentMsgId $ MDSSndRcvd msgRcptStatus
updateGroupItemsStatus gInfo m conn agentMsgId (GSSRcvd msgRcptStatus) Nothing
updateGroupItemStatus gInfo m conn agentMsgId (GSSRcvd msgRcptStatus) Nothing
-- Searches chat items for many agent message IDs and updates their status
updateDirectItemsStatusMsgs :: Contact -> Connection -> [AgentMsgId] -> CIStatus 'MDSnd -> CM ()
updateDirectItemsStatusMsgs ct conn msgIds newStatus = do
cis <- withStore' $ \db -> forM msgIds $ \msgId -> runExceptT $ updateDirectItemsStatus' db ct conn msgId newStatus
let acis = map ctItem $ concat $ rights cis
unless (null acis) $ toView $ CRChatItemsStatusesUpdated user acis
where
ctItem = AChatItem SCTDirect SMDSnd (DirectChat ct)
updateDirectItemsStatus :: Contact -> Connection -> [AgentMsgId] -> CIStatus 'MDSnd -> CM ()
updateDirectItemsStatus ct conn msgIds newStatus = do
cis_ <- withStore' $ \db -> forM msgIds $ \msgId -> runExceptT $ updateDirectItemStatus' db ct conn msgId newStatus
-- only send the last expired item event to view
case reverse $ catMaybes $ rights cis_ of
ci : _ -> toView $ CRChatItemStatusUpdated user (AChatItem SCTDirect SMDSnd (DirectChat ct) ci)
_ -> pure ()
updateDirectItemStatus :: Contact -> Connection -> AgentMsgId -> CIStatus 'MDSnd -> CM ()
updateDirectItemStatus ct conn msgId newStatus = do
cis <- withStore $ \db -> updateDirectItemsStatus' db ct conn msgId newStatus
let acis = map ctItem cis
unless (null acis) $ toView $ CRChatItemsStatusesUpdated user acis
where
ctItem = AChatItem SCTDirect SMDSnd (DirectChat ct)
ci_ <- withStore $ \db -> updateDirectItemStatus' db ct conn msgId newStatus
forM_ ci_ $ \ci -> toView $ CRChatItemStatusUpdated user (AChatItem SCTDirect SMDSnd (DirectChat ct) ci)
updateDirectItemsStatus' :: DB.Connection -> Contact -> Connection -> AgentMsgId -> CIStatus 'MDSnd -> ExceptT StoreError IO [ChatItem 'CTDirect 'MDSnd]
updateDirectItemsStatus' db ct@Contact {contactId} Connection {connId} msgId newStatus = do
items <- liftIO $ getDirectChatItemsByAgentMsgId db user contactId connId msgId
catMaybes <$> mapM updateItem items
where
updateItem :: CChatItem 'CTDirect -> ExceptT StoreError IO (Maybe (ChatItem 'CTDirect 'MDSnd))
updateItem = \case
(CChatItem SMDSnd ChatItem {meta = CIMeta {itemStatus = CISSndRcvd _ _}}) -> pure Nothing
(CChatItem SMDSnd ChatItem {meta = CIMeta {itemId, itemStatus}})
| itemStatus == newStatus -> pure Nothing
| otherwise -> Just <$> updateDirectChatItemStatus db user ct itemId newStatus
_ -> pure Nothing
updateDirectItemStatus' :: DB.Connection -> Contact -> Connection -> AgentMsgId -> CIStatus 'MDSnd -> ExceptT StoreError IO (Maybe (ChatItem 'CTDirect 'MDSnd))
updateDirectItemStatus' db ct@Contact {contactId} Connection {connId} msgId newStatus =
liftIO (getDirectChatItemByAgentMsgId db user contactId connId msgId) >>= \case
Just (CChatItem SMDSnd ChatItem {meta = CIMeta {itemStatus = CISSndRcvd _ _}}) -> pure Nothing
Just (CChatItem SMDSnd ChatItem {meta = CIMeta {itemId, itemStatus}})
| itemStatus == newStatus -> pure Nothing
| otherwise -> Just <$> updateDirectChatItemStatus db user ct itemId newStatus
_ -> pure Nothing
updateGroupMemSndStatus :: ChatItemId -> GroupMemberId -> GroupSndStatus -> CM Bool
updateGroupMemSndStatus itemId groupMemberId newStatus =
withStore' $ \db -> updateGroupMemSndStatus' db itemId groupMemberId newStatus
updateGroupMemSndStatus' :: DB.Connection -> ChatItemId -> GroupMemberId -> GroupSndStatus -> IO Bool
updateGroupMemSndStatus' db itemId groupMemberId newStatus =
@@ -6745,29 +6685,20 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
| otherwise -> updateGroupSndStatus db itemId groupMemberId newStatus $> True
_ -> pure False
updateGroupItemsStatus :: GroupInfo -> GroupMember -> Connection -> AgentMsgId -> GroupSndStatus -> Maybe Bool -> CM ()
updateGroupItemsStatus gInfo@GroupInfo {groupId} GroupMember {groupMemberId} Connection {connId} msgId newMemStatus viaProxy_ = do
items <- withStore' (\db -> getGroupChatItemsByAgentMsgId db user groupId connId msgId)
cis <- catMaybes <$> withStore (\db -> mapM (updateItem db) items)
let acis = map gItem cis
unless (null acis) $ toView $ CRChatItemsStatusesUpdated user acis
where
gItem = AChatItem SCTGroup SMDSnd (GroupChat gInfo)
updateItem :: DB.Connection -> CChatItem 'CTGroup -> ExceptT StoreError IO (Maybe (ChatItem 'CTGroup 'MDSnd))
updateItem db = \case
(CChatItem SMDSnd ChatItem {meta = CIMeta {itemStatus = CISSndRcvd _ SSPComplete}}) -> pure Nothing
(CChatItem SMDSnd ChatItem {meta = CIMeta {itemId, itemStatus}}) -> do
forM_ viaProxy_ $ \viaProxy -> liftIO $ setGroupSndViaProxy db itemId groupMemberId viaProxy
memStatusChanged <- liftIO $ updateGroupMemSndStatus' db itemId groupMemberId newMemStatus
if memStatusChanged
then do
memStatusCounts <- liftIO $ getGroupSndStatusCounts db itemId
let newStatus = membersGroupItemStatus memStatusCounts
if newStatus /= itemStatus
then Just <$> updateGroupChatItemStatus db user gInfo itemId newStatus
else pure Nothing
else pure Nothing
_ -> pure Nothing
updateGroupItemStatus :: GroupInfo -> GroupMember -> Connection -> AgentMsgId -> GroupSndStatus -> Maybe Bool -> CM ()
updateGroupItemStatus gInfo@GroupInfo {groupId} GroupMember {groupMemberId} Connection {connId} msgId newMemStatus viaProxy_ =
withStore' (\db -> getGroupChatItemByAgentMsgId db user groupId connId msgId) >>= \case
Just (CChatItem SMDSnd ChatItem {meta = CIMeta {itemStatus = CISSndRcvd _ SSPComplete}}) -> pure ()
Just (CChatItem SMDSnd ChatItem {meta = CIMeta {itemId, itemStatus}}) -> do
forM_ viaProxy_ $ \viaProxy -> withStore' $ \db -> setGroupSndViaProxy db itemId groupMemberId viaProxy
memStatusChanged <- updateGroupMemSndStatus itemId groupMemberId newMemStatus
when memStatusChanged $ do
memStatusCounts <- withStore' (`getGroupSndStatusCounts` itemId)
let newStatus = membersGroupItemStatus memStatusCounts
when (newStatus /= itemStatus) $ do
chatItem <- withStore $ \db -> updateGroupChatItemStatus db user gInfo itemId newStatus
toView $ CRChatItemStatusUpdated user (AChatItem SCTGroup SMDSnd (GroupChat gInfo) chatItem)
_ -> pure ()
createContactPQSndItem :: User -> Contact -> Connection -> PQEncryption -> CM (Contact, Connection)
createContactPQSndItem user ct conn@Connection {pqSndEnabled} pqSndEnabled' =
@@ -7957,7 +7888,6 @@ chatCommandP =
"/_delete item " *> (APIDeleteChatItem <$> chatRefP <*> _strP <* A.space <*> ciDeleteMode),
"/_delete member item #" *> (APIDeleteMemberChatItem <$> A.decimal <*> _strP),
"/_reaction " *> (APIChatItemReaction <$> chatRefP <* A.space <*> A.decimal <* A.space <*> onOffP <* A.space <*> jsonP),
"/_forward plan " *> (APIPlanForwardChatItems <$> chatRefP <*> _strP),
"/_forward " *> (APIForwardChatItems <$> chatRefP <* A.space <*> chatRefP <*> _strP <*> sendMessageTTLP),
"/_read user " *> (APIUserRead <$> A.decimal),
"/read user" $> UserRead,
@@ -8331,16 +8261,14 @@ chatCommandP =
<|> ("yes" $> TMEEnableKeepTTL)
<|> ("no" $> TMEDisableKeepTTL)
netCfgP = do
socksProxy <- "socks=" *> ("off" $> Nothing <|> "on" $> Just defaultSocksProxyWithAuth <|> Just <$> strP)
socksProxy <- "socks=" *> ("off" $> Nothing <|> "on" $> Just defaultSocksProxy <|> Just <$> strP)
socksMode <- " socks-mode=" *> strP <|> pure SMAlways
hostMode <- " host-mode=" *> (textToHostMode . safeDecodeUtf8 <$?> A.takeTill (== ' ')) <|> pure (defaultHostMode socksProxy)
requiredHostMode <- " required-host-mode" *> onOffP <|> pure False
smpProxyMode_ <- optional $ " smp-proxy=" *> strP
smpProxyFallback_ <- optional $ " smp-proxy-fallback=" *> strP
t_ <- optional $ " timeout=" *> A.decimal
logTLSErrors <- " log=" *> onOffP <|> pure False
let tcpTimeout_ = (1000000 *) <$> t_
pure $ SimpleNetCfg {socksProxy, socksMode, hostMode, requiredHostMode, smpProxyMode_, smpProxyFallback_, tcpTimeout_, logTLSErrors}
pure $ SimpleNetCfg {socksProxy, socksMode, smpProxyMode_, smpProxyFallback_, tcpTimeout_, logTLSErrors}
dbKeyP = nonEmptyKey <$?> strP
nonEmptyKey k@(DBEncryptionKey s) = if BA.null s then Left "empty key" else Right k
dbEncryptionConfig currentKey newKey = DBEncryptionConfig {currentKey, newKey, keepKey = Just False}
-22
View File
@@ -28,7 +28,6 @@ data LockScreenCalls = LSCDisable | LSCShow | LSCAccept deriving (Show)
data AppSettings = AppSettings
{ appPlatform :: Maybe AppPlatform,
networkConfig :: Maybe NetworkConfig,
networkProxy :: Maybe NetworkProxy,
privacyEncryptLocalFiles :: Maybe Bool,
privacyAskToApproveRelays :: Maybe Bool,
privacyAcceptImages :: Maybe Bool,
@@ -58,24 +57,11 @@ data AppSettings = AppSettings
}
deriving (Show)
data NetworkProxy = NetworkProxy
{ host :: Text,
port :: Int,
auth :: NetworkProxyAuth,
username :: Text,
password :: Text
}
deriving (Show)
data NetworkProxyAuth = NPAUsername | NPAIsolate
deriving (Show)
defaultAppSettings :: AppSettings
defaultAppSettings =
AppSettings
{ appPlatform = Nothing,
networkConfig = Just defaultNetworkConfig,
networkProxy = Nothing,
privacyEncryptLocalFiles = Just True,
privacyAskToApproveRelays = Just True,
privacyAcceptImages = Just True,
@@ -109,7 +95,6 @@ defaultParseAppSettings =
AppSettings
{ appPlatform = Nothing,
networkConfig = Nothing,
networkProxy = Nothing,
privacyEncryptLocalFiles = Nothing,
privacyAskToApproveRelays = Nothing,
privacyAcceptImages = Nothing,
@@ -143,7 +128,6 @@ combineAppSettings platformDefaults storedSettings =
AppSettings
{ appPlatform = p appPlatform,
networkConfig = p networkConfig,
networkProxy = p networkProxy,
privacyEncryptLocalFiles = p privacyEncryptLocalFiles,
privacyAskToApproveRelays = p privacyAskToApproveRelays,
privacyAcceptImages = p privacyAcceptImages,
@@ -183,17 +167,12 @@ $(JQ.deriveJSON (enumJSON $ dropPrefix "NPM") ''NotificationPreviewMode)
$(JQ.deriveJSON (enumJSON $ dropPrefix "LSC") ''LockScreenCalls)
$(JQ.deriveJSON (enumJSON $ dropPrefix "NPA") ''NetworkProxyAuth)
$(JQ.deriveJSON defaultJSON ''NetworkProxy)
$(JQ.deriveToJSON defaultJSON ''AppSettings)
instance FromJSON AppSettings where
parseJSON (J.Object v) = do
appPlatform <- p "appPlatform"
networkConfig <- p "networkConfig"
networkProxy <- p "networkProxy"
privacyEncryptLocalFiles <- p "privacyEncryptLocalFiles"
privacyAskToApproveRelays <- p "privacyAskToApproveRelays"
privacyAcceptImages <- p "privacyAcceptImages"
@@ -224,7 +203,6 @@ instance FromJSON AppSettings where
AppSettings
{ appPlatform,
networkConfig,
networkProxy,
privacyEncryptLocalFiles,
privacyAskToApproveRelays,
privacyAcceptImages,
+5 -18
View File
@@ -76,7 +76,7 @@ import Simplex.Messaging.Agent.Protocol
import Simplex.Messaging.Agent.Store.SQLite (MigrationConfirmation, SQLiteStore, UpMigration, withTransaction, withTransactionPriority)
import Simplex.Messaging.Agent.Store.SQLite.DB (SlowQueryStats (..))
import qualified Simplex.Messaging.Agent.Store.SQLite.DB as DB
import Simplex.Messaging.Client (HostMode (..), SMPProxyFallback (..), SMPProxyMode (..), SocksMode (..))
import Simplex.Messaging.Client (SMPProxyFallback (..), SMPProxyMode (..), SocksMode (..))
import qualified Simplex.Messaging.Crypto as C
import Simplex.Messaging.Crypto.File (CryptoFile (..))
import qualified Simplex.Messaging.Crypto.File as CF
@@ -87,7 +87,7 @@ import Simplex.Messaging.Parsers (defaultJSON, dropPrefix, enumJSON, parseAll, p
import Simplex.Messaging.Protocol (AProtoServerWithAuth, AProtocolType (..), CorrId, NtfServer, ProtocolType (..), ProtocolTypeI, QueueId, SMPMsgMeta (..), SProtocolType, SubscriptionMode (..), UserProtocol, XFTPServer, userProtocol)
import Simplex.Messaging.TMap (TMap)
import Simplex.Messaging.Transport (TLS, simplexMQVersion)
import Simplex.Messaging.Transport.Client (SocksProxyWithAuth, TransportHost)
import Simplex.Messaging.Transport.Client (SocksProxy, TransportHost)
import Simplex.Messaging.Util (allFinally, catchAllErrors, catchAllErrors', tryAllErrors, tryAllErrors', (<$$>))
import Simplex.RemoteControl.Client
import Simplex.RemoteControl.Invitation (RCSignedInvitation, RCVerifiedInvitation)
@@ -298,7 +298,6 @@ data ChatCommand
| APIDeleteChatItem ChatRef (NonEmpty ChatItemId) CIDeleteMode
| APIDeleteMemberChatItem GroupId (NonEmpty ChatItemId)
| APIChatItemReaction {chatRef :: ChatRef, chatItemId :: ChatItemId, add :: Bool, reaction :: MsgReaction}
| APIPlanForwardChatItems {fromChatRef :: ChatRef, chatItemIds :: NonEmpty ChatItemId}
| APIForwardChatItems {toChatRef :: ChatRef, fromChatRef :: ChatRef, chatItemIds :: NonEmpty ChatItemId, ttl :: Maybe Int}
| APIUserRead UserId
| UserRead
@@ -600,7 +599,7 @@ data ChatResponse
| CRGroupMemberCode {user :: User, groupInfo :: GroupInfo, member :: GroupMember, connectionCode :: Text}
| CRConnectionVerified {user :: User, verified :: Bool, expectedCode :: Text}
| CRNewChatItems {user :: User, chatItems :: [AChatItem]}
| CRChatItemsStatusesUpdated {user :: User, chatItems :: [AChatItem]}
| CRChatItemStatusUpdated {user :: User, chatItem :: AChatItem}
| CRChatItemUpdated {user :: User, chatItem :: AChatItem}
| CRChatItemNotChanged {user :: User, chatItem :: AChatItem}
| CRChatItemReaction {user :: User, added :: Bool, reaction :: ACIReaction}
@@ -650,7 +649,6 @@ data ChatResponse
| CRContactRequestAlreadyAccepted {user :: User, contact :: Contact}
| CRLeftMemberUser {user :: User, groupInfo :: GroupInfo}
| CRGroupDeletedUser {user :: User, groupInfo :: GroupInfo}
| CRForwardPlan {user :: User, itemsCount :: Int, chatItemIds :: [ChatItemId], forwardConfirmation :: Maybe ForwardConfirmation}
| CRRcvFileDescrReady {user :: User, chatItem :: AChatItem, rcvFileTransfer :: RcvFileTransfer, rcvFileDescr :: RcvFileDescr}
| CRRcvFileAccepted {user :: User, chatItem :: AChatItem}
| CRRcvFileAcceptedSndCancelled {user :: User, rcvFileTransfer :: RcvFileTransfer}
@@ -907,13 +905,6 @@ connectionPlanProceed = \case
GLPConnectingConfirmReconnect -> True
_ -> False
data ForwardConfirmation
= FCFilesNotAccepted {fileIds :: [FileTransferId]}
| FCFilesInProgress {filesCount :: Int}
| FCFilesMissing {filesCount :: Int}
| FCFilesFailed {filesCount :: Int}
deriving (Show)
newtype UserPwd = UserPwd {unUserPwd :: Text}
deriving (Eq, Show)
@@ -984,10 +975,8 @@ data AppFilePathsConfig = AppFilePathsConfig
deriving (Show)
data SimpleNetCfg = SimpleNetCfg
{ socksProxy :: Maybe SocksProxyWithAuth,
{ socksProxy :: Maybe SocksProxy,
socksMode :: SocksMode,
hostMode :: HostMode,
requiredHostMode :: Bool,
smpProxyMode_ :: Maybe SMPProxyMode,
smpProxyFallback_ :: Maybe SMPProxyFallback,
tcpTimeout_ :: Maybe Int,
@@ -996,7 +985,7 @@ data SimpleNetCfg = SimpleNetCfg
deriving (Show)
defaultSimpleNetCfg :: SimpleNetCfg
defaultSimpleNetCfg = SimpleNetCfg Nothing SMAlways HMOnionViaSocks True Nothing Nothing Nothing False
defaultSimpleNetCfg = SimpleNetCfg Nothing SMAlways Nothing Nothing Nothing False
data ContactSubStatus = ContactSubStatus
{ contact :: Contact,
@@ -1474,8 +1463,6 @@ $(JQ.deriveJSON (sumTypeJSON $ dropPrefix "GLP") ''GroupLinkPlan)
$(JQ.deriveJSON (sumTypeJSON $ dropPrefix "CP") ''ConnectionPlan)
$(JQ.deriveJSON (sumTypeJSON $ dropPrefix "FC") ''ForwardConfirmation)
$(JQ.deriveJSON (sumTypeJSON $ dropPrefix "CE") ''ChatErrorType)
$(JQ.deriveJSON (sumTypeJSON $ dropPrefix "RHE") ''RemoteHostError)
+1 -22
View File
@@ -35,7 +35,7 @@ import Data.Maybe (fromMaybe, isJust, isNothing)
import Data.Text (Text)
import qualified Data.Text as T
import Data.Text.Encoding (decodeLatin1, encodeUtf8)
import Data.Time.Clock (NominalDiffTime, UTCTime, diffUTCTime, nominalDay)
import Data.Time.Clock (UTCTime, diffUTCTime, nominalDay, NominalDiffTime)
import Data.Type.Equality
import Data.Typeable (Typeable)
import Database.SQLite.Simple.FromField (FromField (..))
@@ -595,27 +595,6 @@ ciFileLoaded = \case
CIFSRcvWarning {} -> False
CIFSInvalid {} -> False
data ForwardFileError = FFENotAccepted FileTransferId | FFEInProgress | FFEFailed | FFEMissing
deriving (Eq, Ord)
ciFileForwardError :: FileTransferId -> CIFileStatus d -> Maybe ForwardFileError
ciFileForwardError fId = \case
CIFSSndStored -> Nothing
CIFSSndTransfer {} -> Nothing
CIFSSndComplete -> Nothing
CIFSSndCancelled -> Nothing
CIFSSndError {} -> Nothing
CIFSSndWarning {} -> Nothing
CIFSRcvInvitation -> Just $ FFENotAccepted fId
CIFSRcvAccepted -> Just FFEInProgress
CIFSRcvTransfer {} -> Just FFEInProgress
CIFSRcvAborted -> Just $ FFENotAccepted fId
CIFSRcvCancelled -> Just FFEFailed
CIFSRcvComplete -> Nothing
CIFSRcvError {} -> Just FFEFailed
CIFSRcvWarning {} -> Just FFEFailed
CIFSInvalid {} -> Just FFEFailed
data ACIFileStatus = forall d. MsgDirectionI d => AFS (SMsgDirection d) (CIFileStatus d)
deriving instance Show ACIFileStatus
+4 -37
View File
@@ -13,7 +13,6 @@ module Simplex.Chat.Options
coreChatOptsP,
getChatOpts,
protocolServersP,
defaultHostMode,
)
where
@@ -21,7 +20,6 @@ import Control.Logger.Simple (LogLevel (..))
import qualified Data.Attoparsec.ByteString.Char8 as A
import Data.ByteArray (ScrubbedBytes)
import qualified Data.ByteString.Char8 as B
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import qualified Data.Text as T
import Data.Text.Encoding (encodeUtf8)
@@ -29,11 +27,11 @@ import Numeric.Natural (Natural)
import Options.Applicative
import Simplex.Chat.Controller (ChatLogLevel (..), SimpleNetCfg (..), updateStr, versionNumber, versionString)
import Simplex.FileTransfer.Description (mb)
import Simplex.Messaging.Client (HostMode (..), SocksMode (..), textToHostMode)
import Simplex.Messaging.Client (SocksMode (..))
import Simplex.Messaging.Encoding.String
import Simplex.Messaging.Parsers (parseAll)
import Simplex.Messaging.Protocol (ProtoServerWithAuth, ProtocolTypeI, SMPServerWithAuth, XFTPServerWithAuth)
import Simplex.Messaging.Transport.Client (SocksProxyWithAuth (..), SocksAuth (..), defaultSocksProxyWithAuth)
import Simplex.Messaging.Transport.Client (defaultSocksProxy)
import System.FilePath (combine)
data ChatOpts = ChatOpts
@@ -125,7 +123,7 @@ coreChatOptsP appDir defaultDbFileName = do
<> value []
)
socksProxy <-
flag' (Just defaultSocksProxyWithAuth) (short 'x' <> help "Use local SOCKS5 proxy at :9050")
flag' (Just defaultSocksProxy) (short 'x' <> help "Use local SOCKS5 proxy at :9050")
<|> option
strParse
( long "socks-proxy"
@@ -141,19 +139,6 @@ coreChatOptsP appDir defaultDbFileName = do
<> help "Use SOCKS5 proxy: always (default), onion (with onion-only relays)"
<> value SMAlways
)
hostMode_ <-
optional $
option
parseHostMode
( long "host-mode"
<> metavar "HOST_MODE"
<> help "Preferred server host type: onion (when SOCKS proxy with isolate-by-auth is used), public"
)
requiredHostMode <-
switch
( long "required-host-mode"
<> help "Refuse connection if preferred server host type is not available"
)
smpProxyMode_ <-
optional $
option
@@ -241,17 +226,7 @@ coreChatOptsP appDir defaultDbFileName = do
dbKey,
smpServers,
xftpServers,
simpleNetCfg =
SimpleNetCfg
{ socksProxy,
socksMode,
hostMode = fromMaybe (defaultHostMode socksProxy) hostMode_,
requiredHostMode,
smpProxyMode_,
smpProxyFallback_,
tcpTimeout_ = Just $ useTcpTimeout socksProxy t,
logTLSErrors
},
simpleNetCfg = SimpleNetCfg {socksProxy, socksMode, smpProxyMode_, smpProxyFallback_, tcpTimeout_ = Just $ useTcpTimeout socksProxy t, logTLSErrors},
logLevel,
logConnections = logConnections || logLevel <= CLLInfo,
logServerHosts = logServerHosts || logLevel <= CLLInfo,
@@ -265,11 +240,6 @@ coreChatOptsP appDir defaultDbFileName = do
useTcpTimeout p t = 1000000 * if t > 0 then t else maybe 7 (const 15) p
defaultDbFilePath = combine appDir defaultDbFileName
defaultHostMode :: Maybe SocksProxyWithAuth -> HostMode
defaultHostMode = \case
Just (SocksProxyWithAuth SocksIsolateByAuth _) -> HMOnionViaSocks;
_ -> HMPublic
chatOptsP :: FilePath -> FilePath -> Parser ChatOpts
chatOptsP appDir defaultDbFileName = do
coreOptions <- coreChatOptsP appDir defaultDbFileName
@@ -390,9 +360,6 @@ parseProtocolServers = eitherReader $ parseAll protocolServersP . B.pack
strParse :: StrEncoding a => ReadM a
strParse = eitherReader $ parseAll strP . encodeUtf8 . T.pack
parseHostMode :: ReadM HostMode
parseHostMode = eitherReader $ textToHostMode . T.pack
parseServerPort :: ReadM (Maybe String)
parseServerPort = eitherReader $ parseAll serverPortP . B.pack
+5 -5
View File
@@ -540,21 +540,21 @@ data ExtMsgContent = ExtMsgContent {content :: MsgContent, file :: Maybe FileInv
$(JQ.deriveJSON defaultJSON ''QuotedMsg)
-- this limit reserves space for metadata in forwarded messages
-- 15780 (limit used for fileChunkSize) - 161 (x.grp.msg.forward overhead) = 15619, - 16 for block encryption ("rounded" to 15602)
-- 15780 (limit used for fileChunkSize) - 161 (x.grp.msg.forward overhead) = 15619, round to 15610
maxEncodedMsgLength :: Int
maxEncodedMsgLength = 15602
maxEncodedMsgLength = 15610
-- maxEncodedMsgLength - 2222, see e2eEncUserMsgLength in agent
maxCompressedMsgLength :: Int
maxCompressedMsgLength = 13380
maxCompressedMsgLength = 13388
-- maxEncodedMsgLength - delta between MSG and INFO + 100 (returned for forward overhead)
-- delta between MSG and INFO = e2eEncUserMsgLength (no PQ) - e2eEncConnInfoLength (no PQ) = 1008
maxEncodedInfoLength :: Int
maxEncodedInfoLength = 14694
maxEncodedInfoLength = 14702
maxCompressedInfoLength :: Int
maxCompressedInfoLength = 10968 -- maxEncodedInfoLength - 3726, see e2eEncConnInfoLength in agent
maxCompressedInfoLength = 10976 -- maxEncodedInfoLength - 3726, see e2eEncConnInfoLength in agent
data EncodedChatMessage = ECMEncoded ByteString | ECMLarge
+2 -2
View File
@@ -72,11 +72,11 @@ import UnliftIO.Directory (copyFile, createDirectoryIfMissing, doesDirectoryExis
-- when acting as host
minRemoteCtrlVersion :: AppVersion
minRemoteCtrlVersion = AppVersion [6, 1, 0, 2]
minRemoteCtrlVersion = AppVersion [6, 1, 0, 0]
-- when acting as controller
minRemoteHostVersion :: AppVersion
minRemoteHostVersion = AppVersion [6, 1, 0, 2]
minRemoteHostVersion = AppVersion [6, 1, 0, 0]
currentAppVersion :: AppVersion
currentAppVersion = AppVersion SC.version
+17 -16
View File
@@ -75,16 +75,16 @@ module Simplex.Chat.Store.Messages
getGroupCIReactions,
getGroupReactions,
setGroupReaction,
getChatItemIdsByAgentMsgId,
getChatItemIdByAgentMsgId,
getDirectChatItem,
getDirectCIWithReactions,
getDirectChatItemBySharedMsgId,
getDirectChatItemsByAgentMsgId,
getDirectChatItemByAgentMsgId,
getGroupChatItem,
getGroupCIWithReactions,
getGroupChatItemBySharedMsgId,
getGroupMemberCIBySharedMsgId,
getGroupChatItemsByAgentMsgId,
getGroupChatItemByAgentMsgId,
getGroupMemberChatItemLast,
getLocalChatItem,
updateLocalChatItem',
@@ -1624,18 +1624,19 @@ getAllChatItems db vr user@User {userId} pagination search_ = do
|]
(userId, search, beforeTs, beforeTs, beforeId, count)
getChatItemIdsByAgentMsgId :: DB.Connection -> Int64 -> AgentMsgId -> IO [ChatItemId]
getChatItemIdsByAgentMsgId db connId msgId =
map fromOnly
<$> DB.query
getChatItemIdByAgentMsgId :: DB.Connection -> Int64 -> AgentMsgId -> IO (Maybe ChatItemId)
getChatItemIdByAgentMsgId db connId msgId =
fmap join . maybeFirstRow fromOnly $
DB.query
db
[sql|
SELECT chat_item_id
FROM chat_item_messages
WHERE message_id IN (
WHERE message_id = (
SELECT message_id
FROM msg_deliveries
WHERE connection_id = ? AND agent_msg_id = ?
LIMIT 1
)
|]
(connId, msgId)
@@ -1779,10 +1780,10 @@ getDirectChatItemBySharedMsgId db user@User {userId} contactId sharedMsgId = do
itemId <- getDirectChatItemIdBySharedMsgId_ db userId contactId sharedMsgId
getDirectChatItem db user contactId itemId
getDirectChatItemsByAgentMsgId :: DB.Connection -> User -> ContactId -> Int64 -> AgentMsgId -> IO [CChatItem 'CTDirect]
getDirectChatItemsByAgentMsgId db user contactId connId msgId = do
itemIds <- getChatItemIdsByAgentMsgId db connId msgId
catMaybes <$> mapM (fmap eitherToMaybe . runExceptT . getDirectChatItem db user contactId) itemIds
getDirectChatItemByAgentMsgId :: DB.Connection -> User -> ContactId -> Int64 -> AgentMsgId -> IO (Maybe (CChatItem 'CTDirect))
getDirectChatItemByAgentMsgId db user contactId connId msgId = do
itemId_ <- getChatItemIdByAgentMsgId db connId msgId
maybe (pure Nothing) (fmap eitherToMaybe . runExceptT . getDirectChatItem db user contactId) itemId_
getDirectChatItemIdBySharedMsgId_ :: DB.Connection -> UserId -> Int64 -> SharedMsgId -> ExceptT StoreError IO Int64
getDirectChatItemIdBySharedMsgId_ db userId contactId sharedMsgId =
@@ -2035,10 +2036,10 @@ getGroupMemberCIBySharedMsgId db user@User {userId} groupId memberId sharedMsgId
(GCUserMember, userId, groupId, memberId, sharedMsgId)
getGroupChatItem db user groupId itemId
getGroupChatItemsByAgentMsgId :: DB.Connection -> User -> GroupId -> Int64 -> AgentMsgId -> IO [CChatItem 'CTGroup]
getGroupChatItemsByAgentMsgId db user groupId connId msgId = do
itemIds <- getChatItemIdsByAgentMsgId db connId msgId
catMaybes <$> mapM (fmap eitherToMaybe . runExceptT . getGroupChatItem db user groupId) itemIds
getGroupChatItemByAgentMsgId :: DB.Connection -> User -> GroupId -> Int64 -> AgentMsgId -> IO (Maybe (CChatItem 'CTGroup))
getGroupChatItemByAgentMsgId db user groupId connId msgId = do
itemId_ <- getChatItemIdByAgentMsgId db connId msgId
maybe (pure Nothing) (fmap eitherToMaybe . runExceptT . getGroupChatItem db user groupId) itemId_
getGroupChatItem :: DB.Connection -> User -> Int64 -> ChatItemId -> ExceptT StoreError IO (CChatItem 'CTGroup)
getGroupChatItem db User {userId, userContactId} groupId itemId = ExceptT $ do
+2 -24
View File
@@ -134,14 +134,7 @@ responseToView hu@(currentRH, user_) ChatConfig {logLevel, showReactions, showRe
CRChatItems u _ chatItems -> ttyUser u $ concatMap (\(AChatItem _ _ chat item) -> viewChatItem chat item True ts tz <> viewItemReactions item) chatItems
CRChatItemInfo u ci ciInfo -> ttyUser u $ viewChatItemInfo ci ciInfo tz
CRChatItemId u itemId -> ttyUser u [plain $ maybe "no item" show itemId]
CRChatItemsStatusesUpdated u chatItems
| length chatItems <= 20 ->
concatMap
(\ci -> ttyUser u $ viewChatItemStatusUpdated ci ts tz testView showReceipts)
chatItems
| testView && showReceipts ->
ttyUser u [sShow (length chatItems) <> " message statuses updated"]
| otherwise -> []
CRChatItemStatusUpdated u ci -> ttyUser u $ viewChatItemStatusUpdated ci ts tz testView showReceipts
CRChatItemUpdated u (AChatItem _ _ chat item) -> ttyUser u $ unmuted u chat item $ viewItemUpdate chat item liveItems ts tz
CRChatItemNotChanged u ci -> ttyUser u $ viewItemNotChanged ci
CRChatItemsDeleted u deletions byUser timed -> case deletions of
@@ -210,7 +203,6 @@ responseToView hu@(currentRH, user_) ChatConfig {logLevel, showReactions, showRe
CRUnknownMemberBlocked u g byM um -> ttyUser u [ttyGroup' g <> ": " <> ttyMember byM <> " blocked an unknown member, creating unknown member record " <> ttyMember um]
CRUnknownMemberAnnounced u g _ um m -> ttyUser u [ttyGroup' g <> ": unknown member " <> ttyMember um <> " updated to " <> ttyMember m]
CRGroupDeletedUser u g -> ttyUser u [ttyGroup' g <> ": you deleted the group"]
CRForwardPlan u count itemIds fc -> ttyUser u $ viewForwardPlan count itemIds fc
CRRcvFileDescrReady _ _ _ _ -> []
CRRcvFileProgressXFTP {} -> []
CRRcvFileAccepted u ci -> ttyUser u $ savingFile' ci
@@ -938,20 +930,6 @@ viewUserContactLinkDeleted =
"To create a new chat address use " <> highlight' "/ad"
]
viewForwardPlan :: Int -> [ChatItemId] -> Maybe ForwardConfirmation -> [StyledString]
viewForwardPlan count itemIds = maybe [forwardCount] $ \fc -> [confirmation fc, forwardCount]
where
confirmation = \case
FCFilesNotAccepted fileIds -> plain $ "Files can be received: " <> intercalate ", " (map show fileIds)
FCFilesInProgress cnt -> plain $ "Still receiving " <> show cnt <> " file(s)"
FCFilesMissing cnt -> plain $ show cnt <> " file(s) are missing"
FCFilesFailed cnt -> plain $ "Receiving " <> show cnt <> " file(s) failed"
forwardCount
| count == len = "all messages can be forwarded"
| len == 0 = "nothing to forward"
| otherwise = plain $ show len <> " message(s) out of " <> show count <> " can be forwarded"
len = length itemIds
connReqContact_ :: StyledString -> ConnReqContact -> [StyledString]
connReqContact_ intro cReq =
[ intro,
@@ -2056,7 +2034,7 @@ viewChatError isCmd logLevel testView = \case
CEFallbackToSMPProhibited fileId -> ["recipient tried to accept file " <> sShow fileId <> " via old protocol, prohibited"]
CEInlineFileProhibited _ -> ["A small file sent without acceptance - you can enable receiving such files with -f option."]
CEInvalidQuote -> ["cannot reply to this message"]
CEInvalidForward -> ["cannot forward message(s)"]
CEInvalidForward -> ["cannot forward this message"]
CEInvalidChatItemUpdate -> ["cannot update this item"]
CEInvalidChatItemDelete -> ["cannot delete this item"]
CEHasCurrentCall -> ["call already in progress"]
+18 -99
View File
@@ -7,11 +7,7 @@ import ChatClient
import ChatTests.Utils
import Control.Concurrent (threadDelay)
import qualified Data.ByteString.Char8 as B
import Data.List (intercalate)
import qualified Data.Text as T
import System.Directory (copyFile, doesFileExist, removeFile)
import Simplex.Chat (fixedImagePreview)
import Simplex.Chat.Types (ImageData (..))
import System.Directory (copyFile, doesFileExist)
import Test.Hspec hiding (it)
chatForwardTests :: SpecWith FilePath
@@ -617,8 +613,6 @@ testForwardContactToContactMulti =
alice <# "bob> hey"
msgId2 <- lastItemId alice
alice ##> ("/_forward plan @2 " <> msgId1 <> "," <> msgId2)
alice <## "all messages can be forwarded"
alice ##> ("/_forward @3 @2 " <> msgId1 <> "," <> msgId2)
alice <# "@cath <- you @bob"
alice <## " hi"
@@ -648,8 +642,6 @@ testForwardGroupToGroupMulti =
alice <# "#team bob> hey"
msgId2 <- lastItemId alice
alice ##> ("/_forward plan #1 " <> msgId1 <> "," <> msgId2)
alice <## "all messages can be forwarded"
alice ##> ("/_forward #2 #1 " <> msgId1 <> "," <> msgId2)
alice <# "#club <- you #team"
alice <## " hi"
@@ -680,8 +672,6 @@ testMultiForwardFiles =
setRelativePaths alice "./tests/tmp/alice_app_files" "./tests/tmp/alice_xftp"
copyFile "./tests/fixtures/test.jpg" "./tests/tmp/alice_app_files/test.jpg"
copyFile "./tests/fixtures/test.pdf" "./tests/tmp/alice_app_files/test.pdf"
copyFile "./tests/fixtures/test_1MB.pdf" "./tests/tmp/alice_app_files/test_1MB.pdf"
copyFile "./tests/fixtures/logo.jpg" "./tests/tmp/alice_app_files/logo.jpg"
setRelativePaths bob "./tests/tmp/bob_app_files" "./tests/tmp/bob_xftp"
setRelativePaths cath "./tests/tmp/cath_app_files" "./tests/tmp/cath_xftp"
connectUsers alice bob
@@ -696,54 +686,32 @@ testMultiForwardFiles =
-- send original files
let cm1 = "{\"msgContent\": {\"type\": \"text\", \"text\": \"message without file\"}}"
ImageData img = fixedImagePreview
cm2 = "{\"filePath\": \"test.jpg\", \"msgContent\": {\"type\": \"image\", \"image\":\"" <> T.unpack img <> "\", \"text\": \"\"}}"
cm3 = "{\"filePath\": \"test.pdf\", \"msgContent\": {\"type\": \"file\", \"text\": \"\"}}"
cm4 = "{\"filePath\": \"test_1MB.pdf\", \"msgContent\": {\"type\": \"file\", \"text\": \"message with large file\"}}"
cm5 = "{\"filePath\": \"logo.jpg\", \"msgContent\": {\"type\": \"image\", \"image\":\"" <> T.unpack img <> "\", \"text\": \"\"}}"
alice ##> ("/_send @2 json [" <> intercalate "," [cm1, cm2, cm3, cm4, cm5] <> "]")
cm2 = "{\"filePath\": \"test.jpg\", \"msgContent\": {\"type\": \"text\", \"text\": \"sending file 1\"}}"
cm3 = "{\"filePath\": \"test.pdf\", \"msgContent\": {\"type\": \"text\", \"text\": \"sending file 2\"}}"
alice ##> ("/_send @2 json [" <> cm1 <> "," <> cm2 <> "," <> cm3 <> "]")
alice <# "@bob message without file"
alice <# "@bob sending file 1"
alice <# "/f @bob test.jpg"
alice <## "use /fc 1 to cancel sending"
alice <# "@bob sending file 2"
alice <# "/f @bob test.pdf"
alice <## "use /fc 2 to cancel sending"
alice <# "@bob message with large file"
alice <# "/f @bob test_1MB.pdf"
alice <## "use /fc 3 to cancel sending"
alice <# "/f @bob logo.jpg"
alice <## "use /fc 4 to cancel sending"
bob <# "alice> message without file"
bob <# "alice> sending file 1"
bob <# "alice> sends file test.jpg (136.5 KiB / 139737 bytes)"
bob <## "use /fr 1 [<dir>/ | <path>] to receive it"
bob <# "alice> sending file 2"
bob <# "alice> sends file test.pdf (266.0 KiB / 272376 bytes)"
bob <## "use /fr 2 [<dir>/ | <path>] to receive it"
bob <# "alice> message with large file"
bob <# "alice> sends file test_1MB.pdf (1017.7 KiB / 1042157 bytes)"
bob <## "use /fr 3 [<dir>/ | <path>] to receive it"
bob <# "alice> sends file logo.jpg (31.3 KiB / 32080 bytes)"
bob <## "use /fr 4 [<dir>/ | <path>] to receive it"
alice <## "completed uploading file 1 (test.jpg) for bob"
alice <## "completed uploading file 2 (test.pdf) for bob"
alice <## "completed uploading file 3 (test_1MB.pdf) for bob"
alice <## "completed uploading file 4 (logo.jpg) for bob"
-- IDs to forward
let msgId1 = (read msgIdZero :: Int) + 1
msgIds = intercalate "," $ map (show . (msgId1 +)) [0..5]
bob ##> ("/_forward plan @2 " <> msgIds)
bob <## "Files can be received: 1, 2, 3, 4"
bob <## "5 message(s) out of 6 can be forwarded"
bob ##> "/fr 1"
bob
@@ -752,10 +720,6 @@ testMultiForwardFiles =
]
bob <## "completed receiving file 1 (test.jpg) from alice"
bob ##> ("/_forward plan @2 " <> msgIds)
bob <## "Files can be received: 2, 3, 4"
bob <## "5 message(s) out of 6 can be forwarded"
bob ##> "/fr 2"
bob
<### [ "saving file 2 from alice to test.pdf",
@@ -772,10 +736,8 @@ testMultiForwardFiles =
dest2 `shouldBe` src2
-- forward file
bob ##> ("/_forward plan @2 " <> msgIds)
bob <## "Files can be received: 3, 4"
bob <## "all messages can be forwarded"
bob ##> ("/_forward @3 @2 " <> msgIds)
let msgId1 = (read msgIdZero :: Int) + 1
bob ##> ("/_forward @3 @2 " <> show msgId1 <> "," <> show (msgId1 + 1) <> "," <> show (msgId1 + 2) <> "," <> show (msgId1 + 3))
-- messages printed for bob
bob <# "@cath <- you @alice"
@@ -785,20 +747,14 @@ testMultiForwardFiles =
bob <## " message without file"
bob <# "@cath <- @alice"
bob <## " test_1.jpg"
bob <## " sending file 1"
bob <# "/f @cath test_1.jpg"
bob <## "use /fc 5 to cancel sending"
bob <## "use /fc 3 to cancel sending"
bob <# "@cath <- @alice"
bob <## " test_1.pdf"
bob <## " sending file 2"
bob <# "/f @cath test_1.pdf"
bob <## "use /fc 6 to cancel sending"
bob <# "@cath <- @alice"
bob <## " message with large file"
bob <# "@cath <- @alice"
bob <## ""
bob <## "use /fc 4 to cancel sending"
-- messages printed for cath
cath <# "bob> -> forwarded"
@@ -808,24 +764,18 @@ testMultiForwardFiles =
cath <## " message without file"
cath <# "bob> -> forwarded"
cath <## " test_1.jpg"
cath <## " sending file 1"
cath <# "bob> sends file test_1.jpg (136.5 KiB / 139737 bytes)"
cath <## "use /fr 1 [<dir>/ | <path>] to receive it"
cath <# "bob> -> forwarded"
cath <## " test_1.pdf"
cath <## " sending file 2"
cath <# "bob> sends file test_1.pdf (266.0 KiB / 272376 bytes)"
cath <## "use /fr 2 [<dir>/ | <path>] to receive it"
cath <# "bob> -> forwarded"
cath <## " message with large file"
cath <# "bob> -> forwarded"
cath <## ""
-- file transfer
bob <## "completed uploading file 5 (test_1.jpg) for cath"
bob <## "completed uploading file 6 (test_1.pdf) for cath"
bob <## "completed uploading file 3 (test_1.jpg) for cath"
bob <## "completed uploading file 4 (test_1.pdf) for cath"
cath ##> "/fr 1"
cath
@@ -851,37 +801,6 @@ testMultiForwardFiles =
dest2C <- B.readFile "./tests/tmp/cath_app_files/test_1.pdf"
dest2C `shouldBe` src2B
bob ##> "/fr 3"
bob
<### [ "saving file 3 from alice to test_1MB.pdf",
"started receiving file 3 (test_1MB.pdf) from alice"
]
bob <## "completed receiving file 3 (test_1MB.pdf) from alice"
bob ##> ("/_forward plan @2 " <> msgIds)
bob <## "Files can be received: 4"
bob <## "all messages can be forwarded"
bob ##> "/fr 4"
bob
<### [ "saving file 4 from alice to logo.jpg",
"started receiving file 4 (logo.jpg) from alice"
]
bob <## "completed receiving file 4 (logo.jpg) from alice"
bob ##> ("/_forward plan @2 " <> msgIds)
bob <## "all messages can be forwarded"
removeFile "./tests/tmp/bob_app_files/test_1MB.pdf"
bob ##> ("/_forward plan @2 " <> msgIds)
bob <## "1 file(s) are missing"
bob <## "all messages can be forwarded"
removeFile "./tests/tmp/bob_app_files/test.pdf"
bob ##> ("/_forward plan @2 " <> msgIds)
bob <## "2 file(s) are missing"
bob <## "5 message(s) out of 6 can be forwarded"
-- deleting original file doesn't delete forwarded file
checkActionDeletesFile "./tests/tmp/bob_app_files/test.jpg" $ do
bob ##> "/clear alice"

Some files were not shown because too many files have changed in this diff Show More