Merge branch 'master' into master-android

This commit is contained in:
Evgeny Poberezkin
2024-07-15 23:06:44 +01:00
169 changed files with 4857 additions and 1847 deletions
+47 -17
View File
@@ -73,6 +73,8 @@ final class ChatModel: ObservableObject {
var chatItemStatuses: Dictionary<Int64, CIStatus> = [:]
@Published var chatToTop: String?
@Published var groupMembers: [GMember] = []
@Published var groupMembersIndexes: Dictionary<Int64, Int> = [:] // groupMemberId to index in groupMembers list
@Published var membersLoaded = false
// items in the terminal view
@Published var showingTerminal = false
@Published var terminalItems: [TerminalItem] = []
@@ -180,8 +182,30 @@ final class ChatModel: ObservableObject {
}
}
func populateGroupMembersIndexes() {
groupMembersIndexes.removeAll()
for (i, member) in groupMembers.enumerated() {
groupMembersIndexes[member.groupMemberId] = i
}
}
func getGroupMember(_ groupMemberId: Int64) -> GMember? {
groupMembers.first { $0.groupMemberId == groupMemberId }
if let i = groupMembersIndexes[groupMemberId] {
return groupMembers[i]
}
return nil
}
func loadGroupMembers(_ groupInfo: GroupInfo, updateView: @escaping () -> Void = {}) async {
let groupMembers = await apiListMembers(groupInfo.groupId)
await MainActor.run {
if chatId == groupInfo.id {
self.groupMembers = groupMembers.map { GMember.init($0) }
self.populateGroupMembersIndexes()
self.membersLoaded = true
updateView()
}
}
}
private func getChatIndex(_ id: String) -> Int? {
@@ -379,8 +403,8 @@ final class ChatModel: ObservableObject {
}
func removeChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem) {
if cItem.isRcvNew {
decreaseUnreadCounter(cInfo)
if cItem.isRcvNew, let chatIndex = getChatIndex(cInfo.id) {
decreaseUnreadCounter(chatIndex)
}
// update previews
if let chat = getChat(cInfo.id) {
@@ -525,13 +549,18 @@ final class ChatModel: ObservableObject {
}
}
func markChatItemRead(_ cInfo: ChatInfo, _ cItem: ChatItem) {
if chatId == cInfo.id, let i = getChatItemIndex(cItem) {
if reversedChatItems[i].isRcvNew {
// update current chat
markChatItemRead_(i)
// update preview
decreaseUnreadCounter(cInfo)
func markChatItemRead(_ cInfo: ChatInfo, _ cItem: ChatItem) async {
if chatId == cInfo.id,
let itemIndex = getChatItemIndex(cItem),
let chatIndex = getChatIndex(cInfo.id),
reversedChatItems[itemIndex].isRcvNew {
await MainActor.run {
withTransaction(Transaction()) {
// update current chat
markChatItemRead_(itemIndex)
// update preview
decreaseUnreadCounter(chatIndex)
}
}
}
}
@@ -547,11 +576,9 @@ final class ChatModel: ObservableObject {
}
}
func decreaseUnreadCounter(_ cInfo: ChatInfo) {
if let i = getChatIndex(cInfo.id) {
chats[i].chatStats.unreadCount = chats[i].chatStats.unreadCount - 1
decreaseUnreadCounter(user: currentUser!)
}
func decreaseUnreadCounter(_ chatIndex: Int) {
chats[chatIndex].chatStats.unreadCount = chats[chatIndex].chatStats.unreadCount - 1
decreaseUnreadCounter(user: currentUser!)
}
func increaseUnreadCounter(user: any UserLike) {
@@ -667,14 +694,17 @@ final class ChatModel: ObservableObject {
}
// update current chat
if chatId == groupInfo.id {
if let i = groupMembers.firstIndex(where: { $0.groupMemberId == member.groupMemberId }) {
if let i = groupMembersIndexes[member.groupMemberId] {
withAnimation(.default) {
self.groupMembers[i].wrapped = member
self.groupMembers[i].created = Date.now
}
return false
} else {
withAnimation { groupMembers.append(GMember(member)) }
withAnimation {
groupMembers.append(GMember(member))
groupMembersIndexes[member.groupMemberId] = groupMembers.count - 1
}
return true
}
} else {
+42 -10
View File
@@ -1091,23 +1091,55 @@ func deleteRemoteCtrl(_ rcId: Int64) async throws {
try await sendCommandOkResp(.deleteRemoteCtrl(remoteCtrlId: rcId))
}
func networkErrorAlert(_ r: ChatResponse) -> Alert? {
struct ErrorAlert {
var title: LocalizedStringKey
var message: LocalizedStringKey
}
func getNetworkErrorAlert(_ r: ChatResponse) -> ErrorAlert? {
switch r {
case let .chatCmdError(_, .errorAgent(.BROKER(addr, .TIMEOUT))):
return mkAlert(
title: "Connection timeout",
message: "Please check your network connection with \(serverHostname(addr)) and try again."
)
return ErrorAlert(title: "Connection timeout", message: "Please check your network connection with \(serverHostname(addr)) and try again.")
case let .chatCmdError(_, .errorAgent(.BROKER(addr, .NETWORK))):
return mkAlert(
title: "Connection error",
message: "Please check your network connection with \(serverHostname(addr)) and try again."
)
return ErrorAlert(title: "Connection error", message: "Please check your network connection with \(serverHostname(addr)) and try again.")
case let .chatCmdError(_, .errorAgent(.BROKER(addr, .HOST))):
return ErrorAlert(title: "Connection error", message: "Server address is incompatible with network settings: \(serverHostname(addr)).")
case let .chatCmdError(_, .errorAgent(.BROKER(addr, .TRANSPORT(.version)))):
return ErrorAlert(title: "Connection error", message: "Server version is incompatible with your app: \(serverHostname(addr)).")
case let .chatCmdError(_, .errorAgent(.SMP(.PROXY(proxyErr)))):
return proxyErrorAlert(proxyErr)
case let .chatCmdError(_, .errorAgent(.PROXY(_, _, .protocolError(.PROXY(proxyErr))))):
return proxyErrorAlert(proxyErr)
default:
return nil
}
}
private func proxyErrorAlert(_ proxyErr: ProxyError) -> ErrorAlert? {
switch proxyErr {
case .BROKER(brokerErr: .TIMEOUT):
return ErrorAlert(title: "Private routing error", message: "Please try later.")
case .BROKER(brokerErr: .NETWORK):
return ErrorAlert(title: "Private routing error", message: "Please try later.")
case .NO_SESSION:
return ErrorAlert(title: "Private routing error", message: "Please try later.")
case .BROKER(brokerErr: .HOST):
return ErrorAlert(title: "Private routing error", message: "Server address is incompatible with network settings.")
case .BROKER(brokerErr: .TRANSPORT(.version)):
return ErrorAlert(title: "Private routing error", message: "Server version is incompatible with network settings.")
default:
return nil
}
}
func networkErrorAlert(_ r: ChatResponse) -> Alert? {
if let alert = getNetworkErrorAlert(r) {
return mkAlert(title: alert.title, message: alert.message)
} else {
return nil
}
}
func acceptContactRequest(incognito: Bool, contactRequest: UserContactRequest) async {
if let contact = await apiAcceptContactRequest(incognito: incognito, contactReqId: contactRequest.apiId) {
let chat = Chat(chatInfo: ChatInfo.direct(contact: contact), chatItems: [])
@@ -1207,7 +1239,7 @@ func apiMarkChatItemRead(_ cInfo: ChatInfo, _ cItem: ChatItem) async {
do {
logger.debug("apiMarkChatItemRead: \(cItem.id)")
try await apiChatRead(type: cInfo.chatType, id: cInfo.apiId, itemRange: (cItem.id, cItem.id))
await MainActor.run { ChatModel.shared.markChatItemRead(cInfo, cItem) }
await ChatModel.shared.markChatItemRead(cInfo, cItem)
} catch {
logger.error("apiMarkChatItemRead apiChatRead error: \(responseError(error))")
}
+1 -2
View File
@@ -102,8 +102,7 @@ extension ThemeWallpaper {
public func importFromString() -> ThemeWallpaper {
if preset == nil, let image {
// Need to save image from string and to save its path
if let data = Data(base64Encoded: dropImagePrefix(image)),
let parsed = UIImage(data: data),
if let parsed = UIImage(base64Encoded: image),
let filename = saveWallpaperFile(image: parsed) {
var copy = self
copy.image = nil
@@ -28,15 +28,17 @@ struct ChatInfoToolbar: View {
color: Color(uiColor: .tertiaryLabel)
)
.padding(.trailing, 4)
VStack {
let t = Text(cInfo.displayName).font(.headline)
(cInfo.contact?.verified == true ? contactVerifiedShield + t : t)
.lineLimit(1)
if cInfo.fullName != "" && cInfo.displayName != cInfo.fullName {
Text(cInfo.fullName).font(.subheadline)
.lineLimit(1)
let t = Text(cInfo.displayName).font(.headline)
(cInfo.contact?.verified == true ? contactVerifiedShield + t : t)
.lineLimit(1)
.if (cInfo.fullName != "" && cInfo.displayName != cInfo.fullName) { v in
VStack(spacing: 0) {
v
Text(cInfo.fullName).font(.subheadline)
.lineLimit(1)
.padding(.top, -2)
}
}
}
}
.foregroundColor(theme.colors.onBackground)
.frame(width: 220)
@@ -15,8 +15,7 @@ struct CILinkView: View {
var body: some View {
VStack(alignment: .center, spacing: 6) {
if let data = Data(base64Encoded: dropImagePrefix(linkPreview.image)),
let uiImage = UIImage(data: data) {
if let uiImage = UIImage(base64Encoded: linkPreview.image) {
Image(uiImage: uiImage)
.resizable()
.scaledToFit()
@@ -188,8 +188,7 @@ struct FramedItemView: View {
let v = ZStack(alignment: .topTrailing) {
switch (qi.content) {
case let .image(_, image):
if let data = Data(base64Encoded: dropImagePrefix(image)),
let uiImage = UIImage(data: data) {
if let uiImage = UIImage(base64Encoded: image) {
ciQuotedMsgView(qi)
.padding(.trailing, 70).frame(minWidth: msgWidth, alignment: .leading)
Image(uiImage: uiImage)
@@ -201,8 +200,7 @@ struct FramedItemView: View {
ciQuotedMsgView(qi)
}
case let .video(_, image, _):
if let data = Data(base64Encoded: dropImagePrefix(image)),
let uiImage = UIImage(data: data) {
if let uiImage = UIImage(base64Encoded: image) {
ciQuotedMsgView(qi)
.padding(.trailing, 70).frame(minWidth: msgWidth, alignment: .leading)
Image(uiImage: uiImage)
@@ -415,7 +415,7 @@ struct ChatItemInfoView: View {
}
@ViewBuilder private func memberDeliveryStatusesView(_ memberDeliveryStatuses: [MemberDeliveryStatus]) -> some View {
VStack(alignment: .leading, spacing: 12) {
LazyVStack(alignment: .leading, spacing: 12) {
let mss = membersStatuses(memberDeliveryStatuses)
if !mss.isEmpty {
ForEach(mss, id: \.0.groupMemberId) { memberStatus in
@@ -428,7 +428,7 @@ struct ChatItemInfoView: View {
}
}
private func membersStatuses(_ memberDeliveryStatuses: [MemberDeliveryStatus]) -> [(GroupMember, CIStatus, Bool?)] {
private func membersStatuses(_ memberDeliveryStatuses: [MemberDeliveryStatus]) -> [(GroupMember, GroupSndStatus, Bool?)] {
memberDeliveryStatuses.compactMap({ mds in
if let mem = chatModel.getGroupMember(mds.groupMemberId) {
return (mem.wrapped, mds.memberDeliveryStatus, mds.sentViaProxy)
@@ -438,7 +438,7 @@ struct ChatItemInfoView: View {
})
}
private func memberDeliveryStatusView(_ member: GroupMember, _ status: CIStatus, _ sentViaProxy: Bool?) -> some View {
private func memberDeliveryStatusView(_ member: GroupMember, _ status: GroupSndStatus, _ sentViaProxy: Bool?) -> some View {
HStack{
ProfileImage(imageStr: member.image, size: 30)
.padding(.trailing, 2)
@@ -450,23 +450,19 @@ struct ChatItemInfoView: View {
.foregroundColor(theme.colors.secondary).opacity(0.67)
}
let v = Group {
if let (icon, statusColor) = status.statusIcon(theme.colors.secondary, theme.colors.primary) {
switch status {
case .sndRcvd:
ZStack(alignment: .trailing) {
Image(systemName: icon)
.foregroundColor(statusColor.opacity(0.67))
.padding(.trailing, 6)
Image(systemName: icon)
.foregroundColor(statusColor.opacity(0.67))
}
default:
let (icon, statusColor) = status.statusIcon(theme.colors.secondary, theme.colors.primary)
switch status {
case .rcvd:
ZStack(alignment: .trailing) {
Image(systemName: icon)
.foregroundColor(statusColor)
.foregroundColor(statusColor.opacity(0.67))
.padding(.trailing, 6)
Image(systemName: icon)
.foregroundColor(statusColor.opacity(0.67))
}
} else {
Image(systemName: "ellipsis")
.foregroundColor(Color.secondary)
default:
Image(systemName: icon)
.foregroundColor(statusColor)
}
}
@@ -68,9 +68,7 @@ struct ChatItemView: View {
default: nil
}
}
.map { dropImagePrefix($0) }
.flatMap { Data(base64Encoded: $0) }
.flatMap { UIImage(data: $0) }
.flatMap { UIImage(base64Encoded: $0) }
let adjustedMaxWidth = {
if let preview, preview.size.width <= preview.size.height {
maxWidth * 0.75
+29 -36
View File
@@ -37,7 +37,6 @@ struct ChatView: View {
@State private var searchText: String = ""
@FocusState private var searchFocussed
// opening GroupMemberInfoView on member icon
@State private var membersLoaded = false
@State private var selectedMember: GMember? = nil
// opening GroupLinkView on link button (incognito)
@State private var showGroupLinkSheet: Bool = false
@@ -46,9 +45,14 @@ struct ChatView: View {
var body: some View {
if #available(iOS 16.0, *) {
viewBody
let v = viewBody
.scrollDismissesKeyboard(.immediately)
.keyboardPadding()
if (searchMode) {
v.toolbarBackground(.thinMaterial, for: .navigationBar)
} else {
v.toolbarBackground(.visible, for: .navigationBar)
}
} else {
viewBody
}
@@ -82,7 +86,6 @@ struct ChatView: View {
)
.disabled(!cInfo.sendMsgEnabled)
}
.padding(.top, 1)
.navigationTitle(cInfo.chatViewName)
.background(theme.colors.background)
.navigationBarTitleDisplayMode(.inline)
@@ -121,7 +124,8 @@ struct ChatView: View {
chatModel.chatItemStatuses = [:]
chatModel.reversedChatItems = []
chatModel.groupMembers = []
membersLoaded = false
chatModel.groupMembersIndexes.removeAll()
chatModel.membersLoaded = false
}
}
}
@@ -163,7 +167,7 @@ struct ChatView: View {
}
} else if case let .group(groupInfo) = cInfo {
Button {
Task { await loadGroupMembers(groupInfo) { showChatInfoSheet = true } }
Task { await chatModel.loadGroupMembers(groupInfo) { showChatInfoSheet = true } }
} label: {
ChatInfoToolbar(chat: chat)
.tint(theme.colors.primary)
@@ -249,18 +253,7 @@ struct ChatView: View {
}
}
}
private func loadGroupMembers(_ groupInfo: GroupInfo, updateView: @escaping () -> Void = {}) async {
let groupMembers = await apiListMembers(groupInfo.groupId)
await MainActor.run {
if chatModel.chatId == groupInfo.id {
chatModel.groupMembers = groupMembers.map { GMember.init($0) }
membersLoaded = true
updateView()
}
}
}
private func initChatView() {
let cInfo = chat.chatInfo
// This check prevents the call to apiContactInfo after the app is suspended, and the database is closed.
@@ -321,8 +314,9 @@ struct ChatView: View {
}
.padding(.horizontal)
.padding(.vertical, 8)
.background(.thinMaterial)
}
private func voiceWithoutFrame(_ ci: ChatItem) -> Bool {
ci.content.msgContent?.isVoice == true && ci.content.text.count == 0 && ci.quotedItem == nil && ci.meta.itemForwarded == nil
}
@@ -475,9 +469,7 @@ struct ChatView: View {
.foregroundColor(theme.colors.primary)
}
.onTapGesture {
if let latestUnreadItem = filtered(chatModel.reversedChatItems).last(where: { $0.isRcvNew }) {
scrollModel.scrollToItem(id: latestUnreadItem.id)
}
scrollModel.scrollToBottom()
}
} else if !counts.isNearBottom {
circleButton {
@@ -532,7 +524,7 @@ struct ChatView: View {
private func addMembersButton() -> some View {
Button {
if case let .group(gInfo) = chat.chatInfo {
Task { await loadGroupMembers(gInfo) { showAddMembersSheet = true } }
Task { await chatModel.loadGroupMembers(gInfo) { showAddMembersSheet = true } }
}
} label: {
Image(systemName: "person.crop.circle.badge.plus")
@@ -602,11 +594,9 @@ struct ChatView: View {
chat: chat,
chatItem: ci,
maxWidth: maxWidth,
itemWidth: maxWidth,
composeState: $composeState,
selectedMember: $selectedMember,
revealedChatItem: $revealedChatItem,
chatView: self
revealedChatItem: $revealedChatItem
)
}
@@ -614,13 +604,11 @@ struct ChatView: View {
@EnvironmentObject var m: ChatModel
@EnvironmentObject var theme: AppTheme
@ObservedObject var chat: Chat
var chatItem: ChatItem
var maxWidth: CGFloat
@State var itemWidth: CGFloat
let chatItem: ChatItem
let maxWidth: CGFloat
@Binding var composeState: ComposeState
@Binding var selectedMember: GMember?
@Binding var revealedChatItem: ChatItem?
var chatView: ChatView
@State private var deletingItem: ChatItem? = nil
@State private var showDeleteMessage = false
@@ -688,7 +676,12 @@ struct ChatView: View {
if prevItem == nil || showMemberImage(member, prevItem) || prevMember != nil {
VStack(alignment: .leading, spacing: 4) {
if ci.content.showMemberName {
Text(memberNames(member, prevMember, memCount))
let t = if memCount == 1 && member.memberRole > .member {
Text(member.memberRole.text + " ").fontWeight(.semibold) + Text(member.displayName)
} else {
Text(memberNames(member, prevMember, memCount))
}
t
.font(.caption)
.foregroundStyle(.secondary)
.lineLimit(2)
@@ -698,11 +691,11 @@ struct ChatView: View {
HStack(alignment: .top, spacing: 8) {
ProfileImage(imageStr: member.memberProfile.image, size: memberImageSize, backgroundColor: theme.colors.background)
.onTapGesture {
if chatView.membersLoaded {
if m.membersLoaded {
selectedMember = m.getGroupMember(member.groupMemberId)
} else {
Task {
await chatView.loadGroupMembers(groupInfo) {
await m.loadGroupMembers(groupInfo) {
selectedMember = m.getGroupMember(member.groupMemberId)
}
}
@@ -714,19 +707,19 @@ struct ChatView: View {
chatItemWithMenu(ci, range, maxWidth)
}
}
.padding(.top, 5)
.padding(.bottom, 5)
.padding(.trailing)
.padding(.leading, 12)
} else {
chatItemWithMenu(ci, range, maxWidth)
.padding(.top, 5)
.padding(.bottom, 5)
.padding(.trailing)
.padding(.leading, memberImageSize + 8 + 12)
}
} else {
chatItemWithMenu(ci, range, maxWidth)
.padding(.horizontal)
.padding(.top, 5)
.padding(.bottom, 5)
}
}
@@ -1097,7 +1090,7 @@ struct ChatView: View {
chatItemInfo = ciInfo
}
if case let .group(gInfo) = chat.chatInfo {
await chatView.loadGroupMembers(gInfo)
await m.loadGroupMembers(gInfo)
}
} catch let error {
logger.error("apiGetChatItemInfo error: \(responseError(error))")
@@ -32,9 +32,8 @@ struct ComposeFileView: View {
}
.padding(.vertical, 1)
.padding(.trailing, 12)
.frame(height: 50)
.frame(height: 54)
.background(theme.appColors.sentMessage)
.frame(maxWidth: .infinity)
.padding(.top, 8)
}
}
@@ -18,10 +18,7 @@ struct ComposeImageView: View {
var body: some View {
HStack(alignment: .center, spacing: 8) {
let imgs: [UIImage] = images.compactMap { image in
if let data = Data(base64Encoded: dropImagePrefix(image)) {
return UIImage(data: data)
}
return nil
UIImage(base64Encoded: image)
}
if imgs.count == 0 {
ProgressView()
@@ -49,8 +46,8 @@ struct ComposeImageView: View {
.padding(.vertical, 1)
.padding(.trailing, 12)
.background(theme.appColors.sentMessage)
.frame(minHeight: 54)
.frame(maxWidth: .infinity)
.padding(.top, 8)
}
}
@@ -63,14 +63,13 @@ struct ComposeLinkView: View {
.padding(.vertical, 1)
.padding(.trailing, 12)
.background(theme.appColors.sentMessage)
.frame(minHeight: 54)
.frame(maxWidth: .infinity)
.padding(.top, 8)
}
private func linkPreviewView(_ linkPreview: LinkPreview) -> some View {
HStack(alignment: .center, spacing: 8) {
if let data = Data(base64Encoded: dropImagePrefix(linkPreview.image)),
let uiImage = UIImage(data: data) {
if let uiImage = UIImage(base64Encoded: linkPreview.image) {
Image(uiImage: uiImage)
.resizable()
.aspectRatio(contentMode: .fit)
@@ -284,8 +284,10 @@ struct ComposeView: View {
var body: some View {
VStack(spacing: 0) {
Divider()
if chat.chatInfo.contact?.nextSendGrpInv ?? false {
ContextInvitingContactMemberView()
Divider()
}
// preference checks should match checks in forwarding list
let simplexLinkProhibited = hasSimplexLink && !chat.groupFeatureEnabled(.simplexLinks)
@@ -293,10 +295,13 @@ struct ComposeView: View {
let voiceProhibited = composeState.voicePreview && !chat.chatInfo.featureEnabled(.voice)
if simplexLinkProhibited {
msgNotAllowedView("SimpleX links not allowed", icon: "link")
Divider()
} else if fileProhibited {
msgNotAllowedView("Files and media not allowed", icon: "doc")
Divider()
} else if voiceProhibited {
msgNotAllowedView("Voice messages not allowed", icon: "mic")
Divider()
}
contextItemView()
switch (composeState.editing, composeState.preview) {
@@ -359,7 +364,6 @@ struct ComposeView: View {
: theme.colors.primary
)
.padding(.trailing, 12)
.background(theme.colors.background)
.disabled(!chat.userCanSend)
if chat.userIsObserver {
@@ -377,6 +381,7 @@ struct ComposeView: View {
}
}
}
.background(.thinMaterial)
.onChange(of: composeState.message) { msg in
if composeState.linkPreviewAllowed {
if msg.count > 0 {
@@ -625,6 +630,7 @@ struct ComposeView: View {
cancelPreview: cancelLinkPreview,
cancelEnabled: !composeState.inProgress
)
Divider()
case let .mediaPreviews(mediaPreviews: media):
ComposeImageView(
images: media.map { (img, _) in img },
@@ -633,6 +639,7 @@ struct ComposeView: View {
chosenMedia = []
},
cancelEnabled: !composeState.editing && !composeState.inProgress)
Divider()
case let .voicePreview(recordingFileName, _):
ComposeVoiceView(
recordingFileName: recordingFileName,
@@ -645,6 +652,7 @@ struct ComposeView: View {
cancelEnabled: !composeState.editing && !composeState.inProgress,
stopPlayback: $stopPlayback
)
Divider()
case let .filePreview(fileName, _):
ComposeFileView(
fileName: fileName,
@@ -652,6 +660,7 @@ struct ComposeView: View {
composeState = composeState.copy(preview: .noPreview)
},
cancelEnabled: !composeState.editing && !composeState.inProgress)
Divider()
}
}
@@ -661,10 +670,9 @@ struct ComposeView: View {
Text(reason).italic()
}
.padding(12)
.frame(minHeight: 50)
.frame(minHeight: 54)
.frame(maxWidth: .infinity, alignment: .leading)
.background(Color(uiColor: .tertiarySystemGroupedBackground))
.padding(.top, 8)
.background(.thinMaterial)
}
@ViewBuilder private func contextItemView() -> some View {
@@ -678,6 +686,7 @@ struct ComposeView: View {
contextIcon: "arrowshape.turn.up.left",
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) }
)
Divider()
case let .editingItem(chatItem: editingItem):
ContextItemView(
chat: chat,
@@ -685,6 +694,7 @@ struct ComposeView: View {
contextIcon: "pencil",
cancelContextItem: { clearState() }
)
Divider()
case let .forwardingItem(chatItem: forwardedItem, _):
ContextItemView(
chat: chat,
@@ -693,6 +703,7 @@ struct ComposeView: View {
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) },
showSender: false
)
Divider()
}
}
@@ -849,6 +860,7 @@ struct ComposeView: View {
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
@@ -51,8 +51,8 @@ struct ComposeVoiceView: View {
.padding(.vertical, 1)
.frame(height: ComposeVoiceView.previewHeight)
.background(theme.appColors.sentMessage)
.frame(minHeight: 54)
.frame(maxWidth: .infinity)
.padding(.top, 8)
}
private func recordingMode() -> some View {
@@ -18,10 +18,9 @@ struct ContextInvitingContactMemberView: View {
Text("Send direct message to connect")
}
.padding(12)
.frame(minHeight: 50)
.frame(minHeight: 54)
.frame(maxWidth: .infinity, alignment: .leading)
.background(theme.appColors.sentMessage)
.padding(.top, 8)
.background(.thinMaterial)
}
}
@@ -43,10 +43,9 @@ struct ContextItemView: View {
.tint(theme.colors.primary)
}
.padding(12)
.frame(minHeight: 50)
.frame(minHeight: 54)
.frame(maxWidth: .infinity)
.background(chatItemFrameColor(contextItem, theme))
.padding(.top, 8)
}
private func msgContentView(lines: Int) -> some View {
@@ -44,6 +44,7 @@ struct SendMessageView: View {
var body: some View {
ZStack {
let composeShape = RoundedRectangle(cornerSize: CGSize(width: 20, height: 20))
HStack(alignment: .bottom) {
ZStack(alignment: .leading) {
if case .voicePreview = composeState.preview {
@@ -84,10 +85,9 @@ struct SendMessageView: View {
}
}
.padding(.vertical, 1)
.overlay(
RoundedRectangle(cornerSize: CGSize(width: 20, height: 20))
.strokeBorder(.secondary, lineWidth: 0.3, antialiased: true)
)
.background(theme.colors.background)
.clipShape(composeShape)
.overlay(composeShape.strokeBorder(.secondary, lineWidth: 0.3, antialiased: true))
}
.onChange(of: composeState.message, perform: { text in updateFont(text) })
.onChange(of: composeState.inProgress) { inProgress in
@@ -207,6 +207,7 @@ struct GroupChatInfoView: View {
let groupMembers = await apiListMembers(groupInfo.groupId)
await MainActor.run {
chatModel.groupMembers = groupMembers.map { GMember.init($0) }
chatModel.populateGroupMembersIndexes()
}
}
}
@@ -232,8 +233,7 @@ struct GroupChatInfoView: View {
let t = Text(member.chatViewName).foregroundColor(member.memberIncognito ? .indigo : theme.colors.onBackground)
(member.verified ? memberVerifiedShield + t : t)
.lineLimit(1)
let s = Text(member.memberStatus.shortText)
(user ? Text ("you: ") + s : s)
(user ? Text ("you: ") + Text(member.memberStatus.shortText) : Text(memberConnStatus(member)))
.lineLimit(1)
.font(.caption)
.foregroundColor(theme.colors.secondary)
@@ -266,6 +266,16 @@ struct GroupChatInfoView: View {
}
}
private func memberConnStatus(_ member: GroupMember) -> LocalizedStringKey {
if member.activeConn?.connDisabled ?? false {
return "disabled"
} else if member.activeConn?.connInactive ?? false {
return "inactive"
} else {
return member.memberStatus.shortText
}
}
@ViewBuilder private func memberInfo(_ member: GroupMember) -> some View {
if member.blocked {
Text("blocked")
@@ -76,157 +76,153 @@ struct GroupMemberInfoView: View {
private func groupMemberInfoView() -> some View {
ZStack {
VStack {
let member = groupMember.wrapped
List {
groupMemberInfoHeader(member)
.listRowBackground(Color.clear)
let member = groupMember.wrapped
List {
groupMemberInfoHeader(member)
.listRowBackground(Color.clear)
if member.memberActive {
Section {
if let contactId = member.memberContactId, let chat = knownDirectChat(contactId) {
knownDirectChatButton(chat)
} else if groupInfo.fullGroupPreferences.directMessages.on(for: groupInfo.membership) {
if let contactId = member.memberContactId {
newDirectChatButton(contactId)
} else if member.activeConn?.peerChatVRange.isCompatibleRange(CREATE_MEMBER_CONTACT_VRANGE) ?? false {
createMemberContactButton()
}
}
if let code = connectionCode { verifyCodeButton(code) }
if let connStats = connectionStats,
connStats.ratchetSyncAllowed {
synchronizeConnectionButton()
}
// } else if developerTools {
// synchronizeConnectionButtonForce()
// }
}
}
if let contactLink = member.contactLink {
Section {
SimpleXLinkQRCode(uri: contactLink)
Button {
showShareSheet(items: [simplexChatLink(contactLink)])
} label: {
Label("Share address", systemImage: "square.and.arrow.up")
}
if member.memberActive {
Section {
if let contactId = member.memberContactId, let chat = knownDirectChat(contactId) {
knownDirectChatButton(chat)
} else if groupInfo.fullGroupPreferences.directMessages.on(for: groupInfo.membership) {
if let contactId = member.memberContactId {
if knownDirectChat(contactId) == nil && !groupInfo.fullGroupPreferences.directMessages.on(for: groupInfo.membership) {
connectViaAddressButton(contactLink)
}
} else {
newDirectChatButton(contactId)
} else if member.activeConn?.peerChatVRange.isCompatibleRange(CREATE_MEMBER_CONTACT_VRANGE) ?? false {
createMemberContactButton()
}
}
if let code = connectionCode { verifyCodeButton(code) }
if let connStats = connectionStats,
connStats.ratchetSyncAllowed {
synchronizeConnectionButton()
}
// } else if developerTools {
// synchronizeConnectionButtonForce()
// }
}
}
if let contactLink = member.contactLink {
Section {
SimpleXLinkQRCode(uri: contactLink)
Button {
showShareSheet(items: [simplexChatLink(contactLink)])
} label: {
Label("Share address", systemImage: "square.and.arrow.up")
}
if let contactId = member.memberContactId {
if knownDirectChat(contactId) == nil && !groupInfo.fullGroupPreferences.directMessages.on(for: groupInfo.membership) {
connectViaAddressButton(contactLink)
}
} header: {
Text("Address")
.foregroundColor(theme.colors.secondary)
} footer: {
Text("You can share this address with your contacts to let them connect with **\(member.displayName)**.")
.foregroundColor(theme.colors.secondary)
}
}
Section(header: Text("Member").foregroundColor(theme.colors.secondary)) {
infoRow("Group", groupInfo.displayName)
if let roles = member.canChangeRoleTo(groupInfo: groupInfo) {
Picker("Change role", selection: $newRole) {
ForEach(roles) { role in
Text(role.text)
}
}
.frame(height: 36)
} else {
infoRow("Role", member.memberRole.text)
connectViaAddressButton(contactLink)
}
} header: {
Text("Address")
.foregroundColor(theme.colors.secondary)
} footer: {
Text("You can share this address with your contacts to let them connect with **\(member.displayName)**.")
.foregroundColor(theme.colors.secondary)
}
}
// TODO invited by - need to get contact by contact id
Section(header: Text("Member").foregroundColor(theme.colors.secondary)) {
infoRow("Group", groupInfo.displayName)
if let roles = member.canChangeRoleTo(groupInfo: groupInfo) {
Picker("Change role", selection: $newRole) {
ForEach(roles) { role in
Text(role.text)
}
}
.frame(height: 36)
} else {
infoRow("Role", member.memberRole.text)
}
}
if let connStats = connectionStats {
Section(header: Text("Servers").foregroundColor(theme.colors.secondary)) {
// TODO network connection status
Button("Change receiving address") {
alert = .switchAddressAlert
}
.disabled(
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil }
|| connStats.ratchetSyncSendProhibited
)
if connStats.rcvQueuesInfo.contains(where: { $0.rcvSwitchStatus != nil }) {
Button("Abort changing address") {
alert = .abortSwitchAddressAlert
}
.disabled(
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil && !$0.canAbortSwitch }
|| connStats.ratchetSyncSendProhibited
)
}
smpServers("Receiving via", connStats.rcvQueuesInfo.map { $0.rcvServer }, theme.colors.secondary)
smpServers("Sending via", connStats.sndQueuesInfo.map { $0.sndServer }, theme.colors.secondary)
}
}
if groupInfo.membership.memberRole >= .admin {
adminDestructiveSection(member)
} else {
nonAdminBlockSection(member)
}
if developerTools {
Section(header: Text("For console").foregroundColor(theme.colors.secondary)) {
infoRow("Local name", member.localDisplayName)
infoRow("Database ID", "\(member.groupMemberId)")
if let conn = member.activeConn {
let connLevelDesc = conn.connLevel == 0 ? NSLocalizedString("direct", comment: "connection level description") : String.localizedStringWithFormat(NSLocalizedString("indirect (%d)", comment: "connection level description"), conn.connLevel)
infoRow("Connection", connLevelDesc)
}
}
if let connStats = connectionStats {
Section(header: Text("Servers").foregroundColor(theme.colors.secondary)) {
// TODO network connection status
Button("Change receiving address") {
alert = .switchAddressAlert
}
.disabled(
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil }
|| connStats.ratchetSyncSendProhibited
)
if connStats.rcvQueuesInfo.contains(where: { $0.rcvSwitchStatus != nil }) {
Button("Abort changing address") {
alert = .abortSwitchAddressAlert
}
.disabled(
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil && !$0.canAbortSwitch }
|| connStats.ratchetSyncSendProhibited
)
}
smpServers("Receiving via", connStats.rcvQueuesInfo.map { $0.rcvServer }, theme.colors.secondary)
smpServers("Sending via", connStats.sndQueuesInfo.map { $0.sndServer }, theme.colors.secondary)
}
}
if groupInfo.membership.memberRole >= .admin {
adminDestructiveSection(member)
} else {
nonAdminBlockSection(member)
}
if developerTools {
Section(header: Text("For console").foregroundColor(theme.colors.secondary)) {
infoRow("Local name", member.localDisplayName)
infoRow("Database ID", "\(member.groupMemberId)")
Button ("Debug delivery") {
Task {
do {
let info = queueInfoText(try await apiGroupMemberQueueInfo(groupInfo.apiId, member.groupMemberId))
await MainActor.run { alert = .queueInfo(info: info) }
} catch let e {
logger.error("apiContactQueueInfo error: \(responseError(e))")
let a = getErrorAlert(e, "Error")
await MainActor.run { alert = .error(title: a.title, error: a.message) }
}
Button ("Debug delivery") {
Task {
do {
let info = queueInfoText(try await apiGroupMemberQueueInfo(groupInfo.apiId, member.groupMemberId))
await MainActor.run { alert = .queueInfo(info: info) }
} catch let e {
logger.error("apiContactQueueInfo error: \(responseError(e))")
let a = getErrorAlert(e, "Error")
await MainActor.run { alert = .error(title: a.title, error: a.message) }
}
}
}
}
}
.navigationBarHidden(true)
.onAppear {
if #unavailable(iOS 16) {
// this condition prevents re-setting picker
if !justOpened { return }
}
justOpened = false
DispatchQueue.main.async {
newRole = member.memberRole
do {
let (_, stats) = try apiGroupMemberInfo(groupInfo.apiId, member.groupMemberId)
let (mem, code) = member.memberActive ? try apiGetGroupMemberCode(groupInfo.apiId, member.groupMemberId) : (member, nil)
_ = chatModel.upsertGroupMember(groupInfo, mem)
connectionStats = stats
connectionCode = code
} catch let error {
logger.error("apiGroupMemberInfo or apiGetGroupMemberCode error: \(responseError(error))")
}
}
.navigationBarHidden(true)
.onAppear {
if #unavailable(iOS 16) {
// this condition prevents re-setting picker
if !justOpened { return }
}
justOpened = false
DispatchQueue.main.async {
newRole = member.memberRole
do {
let (_, stats) = try apiGroupMemberInfo(groupInfo.apiId, member.groupMemberId)
let (mem, code) = member.memberActive ? try apiGetGroupMemberCode(groupInfo.apiId, member.groupMemberId) : (member, nil)
_ = chatModel.upsertGroupMember(groupInfo, mem)
connectionStats = stats
connectionCode = code
} catch let error {
logger.error("apiGroupMemberInfo or apiGetGroupMemberCode error: \(responseError(error))")
}
}
.onChange(of: newRole) { newRole in
if newRole != member.memberRole {
alert = .changeMemberRoleAlert(mem: member, role: newRole)
}
}
.onChange(of: member.memberRole) { role in
newRole = role
}
.onChange(of: newRole) { newRole in
if newRole != member.memberRole {
alert = .changeMemberRoleAlert(mem: member, role: newRole)
}
}
.onChange(of: member.memberRole) { role in
newRole = role
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
.alert(item: $alert) { alertItem in
switch(alertItem) {
@@ -564,18 +564,11 @@ func joinGroup(_ groupId: Int64, _ onComplete: @escaping () async -> Void) {
}
}
struct ErrorAlert {
var title: LocalizedStringKey
var message: LocalizedStringKey
}
func getErrorAlert(_ error: Error, _ title: LocalizedStringKey) -> ErrorAlert {
switch error as? ChatResponse {
case let .chatCmdError(_, .errorAgent(.BROKER(addr, .TIMEOUT))):
return ErrorAlert(title: "Connection timeout", message: "Please check your network connection with \(serverHostname(addr)) and try again.")
case let .chatCmdError(_, .errorAgent(.BROKER(addr, .NETWORK))):
return ErrorAlert(title: "Connection error", message: "Please check your network connection with \(serverHostname(addr)) and try again.")
default:
if let r = error as? ChatResponse,
let alert = getNetworkErrorAlert(r) {
return alert
} else {
return ErrorAlert(title: title, message: "Error: \(responseError(error))")
}
}
@@ -266,23 +266,19 @@ struct ChatListView: View {
}
struct SubsStatusIndicator: View {
@State private var subs: SMPServerSubs = SMPServerSubs.newSMPServerSubs
@State private var sess: ServerSessions = ServerSessions.newServerSessions
@State private var serversSummary: PresentedServersSummary?
@State private var timer: Timer? = nil
@State private var timerCounter = 0
@State private var showServersSummary = false
@AppStorage(DEFAULT_SHOW_SUBSCRIPTION_PERCENTAGE) private var showSubscriptionPercentage = false
// Constants for the intervals
let initialInterval: TimeInterval = 1.0
let regularInterval: TimeInterval = 3.0
let initialPhaseDuration: TimeInterval = 10.0 // Duration for initial phase in seconds
var body: some View {
Button {
showServersSummary = true
} label: {
let subs = serversSummary?.allUsersSMP.smpTotals.subs ?? SMPServerSubs.newSMPServerSubs
let sess = serversSummary?.allUsersSMP.smpTotals.sessions ?? ServerSessions.newServerSessions
HStack(spacing: 4) {
SubscriptionStatusIndicatorView(subs: subs, sess: sess)
if showSubscriptionPercentage {
@@ -291,34 +287,24 @@ struct SubsStatusIndicator: View {
}
}
.onAppear {
startInitialTimer()
startTimer()
}
.onDisappear {
stopTimer()
}
.sheet(isPresented: $showServersSummary) {
ServersSummaryView()
ServersSummaryView(serversSummary: $serversSummary)
}
}
private func startInitialTimer() {
timer = Timer.scheduledTimer(withTimeInterval: initialInterval, repeats: true) { _ in
getServersSummary()
timerCounter += 1
// Switch to the regular timer after the initial phase
if timerCounter * Int(initialInterval) >= Int(initialPhaseDuration) {
switchToRegularTimer()
private func startTimer() {
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
if AppChatState.shared.value == .active {
getServersSummary()
}
}
}
func switchToRegularTimer() {
timer?.invalidate()
timer = Timer.scheduledTimer(withTimeInterval: regularInterval, repeats: true) { _ in
getServersSummary()
}
}
func stopTimer() {
timer?.invalidate()
timer = nil
@@ -326,8 +312,7 @@ struct SubsStatusIndicator: View {
private func getServersSummary() {
do {
let summ = try getAgentServersSummary()
(subs, sess) = (summ.allUsersSMP.smpTotals.subs, summ.allUsersSMP.smpTotals.sessions)
serversSummary = try getAgentServersSummary()
} catch let error {
logger.error("getAgentServersSummary error: \(responseError(error))")
}
@@ -11,12 +11,12 @@ import SimpleXChat
struct ServersSummaryView: View {
@EnvironmentObject var m: ChatModel
@State private var serversSummary: PresentedServersSummary? = nil
@EnvironmentObject var theme: AppTheme
@Binding var serversSummary: PresentedServersSummary?
@State private var selectedUserCategory: PresentedUserCategory = .allUsers
@State private var selectedServerType: PresentedServerType = .smp
@State private var selectedSMPServer: String? = nil
@State private var selectedXFTPServer: String? = nil
@State private var timer: Timer? = nil
@State private var alert: SomeAlert?
@AppStorage(DEFAULT_SHOW_SUBSCRIPTION_PERCENTAGE) private var showSubscriptionPercentage = false
@@ -47,26 +47,10 @@ struct ServersSummaryView: View {
if m.users.filter({ u in u.user.activeUser || !u.user.hidden }).count == 1 {
selectedUserCategory = .currentUser
}
getServersSummary()
startTimer()
}
.onDisappear {
stopTimer()
}
.alert(item: $alert) { $0.alert }
}
private func startTimer() {
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
getServersSummary()
}
}
func stopTimer() {
timer?.invalidate()
timer = nil
}
private func shareButton() -> some View {
Button {
if let serversSummary = serversSummary {
@@ -183,16 +167,18 @@ struct ServersSummaryView: View {
}
} else {
Text("No info, try to reload")
.foregroundColor(theme.colors.secondary)
.background(theme.colors.background)
}
}
private func smpSubsSection(_ totals: SMPTotals) -> some View {
Section {
infoRow("Connections subscribed", numOrDash(totals.subs.ssActive))
infoRow("Active connections", numOrDash(totals.subs.ssActive))
infoRow("Total", numOrDash(totals.subs.total))
} header: {
HStack {
Text("Message subscriptions")
Text("Message reception")
SubscriptionStatusIndicatorView(subs: totals.subs, sess: totals.sessions)
if showSubscriptionPercentage {
SubscriptionStatusPercentageView(subs: totals.subs, sess: totals.sessions)
@@ -369,7 +355,6 @@ struct ServersSummaryView: View {
Task {
do {
try await resetAgentServersStats()
getServersSummary()
} catch let error {
alert = SomeAlert(
alert: mkAlert(
@@ -389,14 +374,6 @@ struct ServersSummaryView: View {
Text("Reset all statistics")
}
}
private func getServersSummary() {
do {
serversSummary = try getAgentServersSummary()
} catch let error {
logger.error("getAgentServersSummary error: \(responseError(error))")
}
}
}
struct SubscriptionStatusIndicatorView: View {
@@ -497,13 +474,13 @@ struct SMPServerSummaryView: View {
private func smpSubsSection(_ subs: SMPServerSubs) -> some View {
Section {
infoRow("Connections subscribed", numOrDash(subs.ssActive))
infoRow("Active connections", numOrDash(subs.ssActive))
infoRow("Pending", numOrDash(subs.ssPending))
infoRow("Total", numOrDash(subs.total))
reconnectButton()
} header: {
HStack {
Text("Message subscriptions")
Text("Message reception")
SubscriptionStatusIndicatorView(subs: subs, sess: summary.sessionsOrNew)
if showSubscriptionPercentage {
SubscriptionStatusPercentageView(subs: subs, sess: summary.sessionsOrNew)
@@ -734,5 +711,7 @@ struct DetailedXFTPStatsView: View {
}
#Preview {
ServersSummaryView()
ServersSummaryView(
serversSummary: Binding.constant(nil)
)
}
@@ -21,9 +21,7 @@ struct ProfileImage: View {
@AppStorage(DEFAULT_PROFILE_IMAGE_CORNER_RADIUS) private var radius = defaultProfileImageCorner
var body: some View {
if let image = imageStr,
let data = Data(base64Encoded: dropImagePrefix(image)),
let uiImage = UIImage(data: data) {
if let uiImage = UIImage(base64Encoded: imageStr) {
clipProfileImage(Image(uiImage: uiImage), size: size, radius: radius)
} else {
let c = color.asAnotherColorFromSecondaryVariant(theme)
@@ -194,6 +194,7 @@ struct AddGroupView: View {
let groupMembers = await apiListMembers(gInfo.groupId)
await MainActor.run {
m.groupMembers = groupMembers.map { GMember.init($0) }
m.populateGroupMembersIndexes()
}
}
let c = Chat(chatInfo: .group(groupInfo: gInfo), chatItems: [])
@@ -15,7 +15,6 @@ struct ProtocolServerView: View {
let serverProtocol: ServerProtocol
@Binding var server: ServerCfg
@State var serverToEdit: ServerCfg
@State var serverEnabled: Bool
@State private var showTestFailure = false
@State private var testing = false
@State private var testFailure: ProtocolTestFailure?
@@ -113,10 +112,10 @@ struct ProtocolServerView: View {
Spacer()
showTestStatus(server: serverToEdit)
}
Toggle("Use for new connections", isOn: $serverEnabled)
.onChange(of: serverEnabled) { enabled in
serverToEdit.enabled = enabled ? .enabled : .disabled
}
let useForNewDisabled = serverToEdit.tested != true && !serverToEdit.preset
Toggle("Use for new connections", isOn: $serverToEdit.enabled)
.disabled(useForNewDisabled)
.foregroundColor(useForNewDisabled ? theme.colors.secondary : theme.colors.onBackground)
}
}
}
@@ -185,8 +184,7 @@ struct ProtocolServerView_Previews: PreviewProvider {
ProtocolServerView(
serverProtocol: .smp,
server: Binding.constant(ServerCfg.sampleData.custom),
serverToEdit: ServerCfg.sampleData.custom,
serverEnabled: true
serverToEdit: ServerCfg.sampleData.custom
)
}
}
@@ -18,8 +18,9 @@ struct ProtocolServersView: View {
@Environment(\.editMode) private var editMode
let serverProtocol: ServerProtocol
@State private var currServers: [ServerCfg] = []
@State private var presetServers: [String] = []
@State private var servers: [ServerCfg] = []
@State private var presetServers: [ServerCfg] = []
@State private var configuredServers: [ServerCfg] = []
@State private var otherServers: [ServerCfg] = []
@State private var selectedServer: String? = nil
@State private var showAddServer = false
@State private var showScanProtoServer = false
@@ -53,31 +54,53 @@ struct ProtocolServersView: View {
private func protocolServersView() -> some View {
List {
Section {
ForEach($servers) { srv in
protocolServerView(srv)
if !configuredServers.isEmpty {
Section {
ForEach($configuredServers) { srv in
protocolServerView(srv)
}
.onMove { indexSet, offset in
configuredServers.move(fromOffsets: indexSet, toOffset: offset)
}
.onDelete { indexSet in
configuredServers.remove(atOffsets: indexSet)
}
} header: {
Text("Configured \(proto) servers")
.foregroundColor(theme.colors.secondary)
} footer: {
Text("The servers for new connections of your current chat profile **\(m.currentUser?.displayName ?? "")**.")
.foregroundColor(theme.colors.secondary)
.lineLimit(10)
}
.onMove { indexSet, offset in
servers.move(fromOffsets: indexSet, toOffset: offset)
}
if !otherServers.isEmpty {
Section {
ForEach($otherServers) { srv in
protocolServerView(srv)
}
.onMove { indexSet, offset in
otherServers.move(fromOffsets: indexSet, toOffset: offset)
}
.onDelete { indexSet in
otherServers.remove(atOffsets: indexSet)
}
} header: {
Text("Other \(proto) servers")
.foregroundColor(theme.colors.secondary)
}
.onDelete { indexSet in
servers.remove(atOffsets: indexSet)
}
Button("Add server…") {
showAddServer = true
}
} header: {
Text("\(proto) servers")
.foregroundColor(theme.colors.secondary)
} footer: {
Text("The servers for new connections of your current chat profile **\(m.currentUser?.displayName ?? "")**.")
.foregroundColor(theme.colors.secondary)
.lineLimit(10)
}
Section {
Button("Reset") { servers = currServers }
.disabled(servers == currServers || testing)
Button("Add server") {
showAddServer = true
}
}
Section {
Button("Reset") { partitionServers(currServers) }
.disabled(Set(allServers) == Set(currServers) || testing)
Button("Test servers", action: testServers)
.disabled(testing || allServersDisabled)
Button("Save servers", action: saveServers)
@@ -86,17 +109,17 @@ struct ProtocolServersView: View {
}
}
.toolbar { EditButton() }
.confirmationDialog("Add server", isPresented: $showAddServer, titleVisibility: .hidden) {
.confirmationDialog("Add server", isPresented: $showAddServer, titleVisibility: .hidden) {
Button("Enter server manually") {
servers.append(ServerCfg.empty)
selectedServer = servers.last?.id
otherServers.append(ServerCfg.empty)
selectedServer = allServers.last?.id
}
Button("Scan server QR code") { showScanProtoServer = true }
Button("Add preset servers", action: addAllPresets)
.disabled(hasAllPresets())
}
.sheet(isPresented: $showScanProtoServer) {
ScanProtocolServer(servers: $servers)
ScanProtocolServer(servers: $otherServers)
.modifier(ThemedBackground(grouped: true))
}
.modifier(BackButton(disabled: Binding.constant(false)) {
@@ -133,27 +156,39 @@ struct ProtocolServersView: View {
}
.onAppear {
// this condition is needed to prevent re-setting the servers when exiting single server view
if !justOpened { return }
do {
let r = try getUserProtoServers(serverProtocol)
currServers = r.protoServers
presetServers = r.presetServers
servers = currServers
} catch let error {
alert = .error(
title: "Error loading \(proto) servers",
error: "Error: \(responseError(error))"
)
if justOpened {
do {
let r = try getUserProtoServers(serverProtocol)
currServers = r.protoServers
presetServers = r.presetServers
partitionServers(currServers)
} catch let error {
alert = .error(
title: "Error loading \(proto) servers",
error: "Error: \(responseError(error))"
)
}
justOpened = false
} else {
partitionServers(allServers)
}
justOpened = false
}
}
private func partitionServers(_ servers: [ServerCfg]) {
configuredServers = servers.filter { $0.preset || $0.enabled }
otherServers = servers.filter { !($0.preset || $0.enabled) }
}
private var allServers: [ServerCfg] {
configuredServers + otherServers
}
private var saveDisabled: Bool {
servers.isEmpty ||
servers == currServers ||
allServers.isEmpty ||
Set(allServers) == Set(currServers) ||
testing ||
!servers.allSatisfy { srv in
!allServers.allSatisfy { srv in
if let address = parseServerAddress(srv.server) {
return uniqueAddress(srv, address)
}
@@ -163,7 +198,7 @@ struct ProtocolServersView: View {
}
private var allServersDisabled: Bool {
servers.allSatisfy { $0.enabled != .enabled }
allServers.allSatisfy { !$0.enabled }
}
private func protocolServerView(_ server: Binding<ServerCfg>) -> some View {
@@ -172,8 +207,7 @@ struct ProtocolServersView: View {
ProtocolServerView(
serverProtocol: serverProtocol,
server: server,
serverToEdit: srv,
serverEnabled: srv.enabled == .enabled
serverToEdit: srv
)
.navigationBarTitle(srv.preset ? "Preset server" : "Your server")
.modifier(ThemedBackground(grouped: true))
@@ -187,7 +221,7 @@ struct ProtocolServersView: View {
invalidServer()
} else if !uniqueAddress(srv, address) {
Image(systemName: "exclamationmark.circle").foregroundColor(.red)
} else if srv.enabled != .enabled {
} else if !srv.enabled {
Image(systemName: "slash.circle").foregroundColor(theme.colors.secondary)
} else {
showTestStatus(server: srv)
@@ -200,7 +234,7 @@ struct ProtocolServersView: View {
.padding(.trailing, 4)
let v = Text(address?.hostnames.first ?? srv.server).lineLimit(1)
if srv.enabled == .enabled {
if srv.enabled {
v
} else {
v.foregroundColor(theme.colors.secondary)
@@ -227,7 +261,7 @@ struct ProtocolServersView: View {
}
private func uniqueAddress(_ s: ServerCfg, _ address: ServerAddress) -> Bool {
servers.allSatisfy { srv in
allServers.allSatisfy { srv in
address.hostnames.allSatisfy { host in
srv.id == s.id || !srv.server.contains(host)
}
@@ -241,13 +275,13 @@ struct ProtocolServersView: View {
private func addAllPresets() {
for srv in presetServers {
if !hasPreset(srv) {
servers.append(ServerCfg(server: srv, preset: true, tested: nil, enabled: .enabled))
configuredServers.append(srv)
}
}
}
private func hasPreset(_ srv: String) -> Bool {
servers.contains(where: { $0.server == srv })
private func hasPreset(_ srv: ServerCfg) -> Bool {
allServers.contains(where: { $0.server == srv.server })
}
private func testServers() {
@@ -265,19 +299,31 @@ struct ProtocolServersView: View {
}
private func resetTestStatus() {
for i in 0..<servers.count {
if servers[i].enabled == .enabled {
servers[i].tested = nil
for i in 0..<configuredServers.count {
if configuredServers[i].enabled {
configuredServers[i].tested = nil
}
}
for i in 0..<otherServers.count {
if otherServers[i].enabled {
otherServers[i].tested = nil
}
}
}
private func runServersTest() async -> [String: ProtocolTestFailure] {
var fs: [String: ProtocolTestFailure] = [:]
for i in 0..<servers.count {
if servers[i].enabled == .enabled {
if let f = await testServerConnection(server: $servers[i]) {
fs[serverHostname(servers[i].server)] = f
for i in 0..<configuredServers.count {
if configuredServers[i].enabled {
if let f = await testServerConnection(server: $configuredServers[i]) {
fs[serverHostname(configuredServers[i].server)] = f
}
}
}
for i in 0..<otherServers.count {
if otherServers[i].enabled {
if let f = await testServerConnection(server: $otherServers[i]) {
fs[serverHostname(otherServers[i].server)] = f
}
}
}
@@ -287,9 +333,9 @@ struct ProtocolServersView: View {
func saveServers() {
Task {
do {
try await setUserProtoServers(serverProtocol, servers: servers)
try await setUserProtoServers(serverProtocol, servers: allServers)
await MainActor.run {
currServers = servers
currServers = allServers
editMode?.wrappedValue = .inactive
}
} catch let error {
@@ -40,7 +40,7 @@ struct ScanProtocolServer: View {
switch resp {
case let .success(r):
if parseServerAddress(r.string) != nil {
servers.append(ServerCfg(server: r.string, preset: false, tested: nil, enabled: .enabled))
servers.append(ServerCfg(server: r.string, preset: false, tested: nil, enabled: false))
dismiss()
} else {
showAddressError = true
@@ -367,8 +367,8 @@
<source>Add servers by scanning QR codes.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
@@ -127,11 +127,6 @@
<target>%@ е потвърдено</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ сървъри</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ качено</target>
@@ -590,6 +585,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Добавете адрес към вашия профил, така че вашите контакти да могат да го споделят с други хора. Актуализацията на профила ще бъде изпратена до вашите контакти.</target>
@@ -610,16 +609,16 @@
<target>Добави профил</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Добави сървър</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Добави сървъри чрез сканиране на QR кодове.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Добави сървър…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Добави към друго устройство</target>
@@ -1351,6 +1350,10 @@
<target>Конфигурирай ICE сървъри</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Потвърди</target>
@@ -1529,10 +1532,6 @@ This is your own one-time link!</source>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Контактът позволява</target>
@@ -3857,6 +3856,10 @@ This is your link for group %@!</source>
<target>Член</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>Ролята на члена ще бъде променена на "%@". Всички членове на групата ще бъдат уведомени.</target>
@@ -3895,6 +3898,14 @@ This is your link for group %@!</source>
<target>Чернова на съобщение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
@@ -3914,6 +3925,10 @@ This is your link for group %@!</source>
<target>Реакциите на съобщения са забранени в тази група.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
@@ -3935,10 +3950,6 @@ This is your link for group %@!</source>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Текст на съобщението</target>
@@ -4206,6 +4217,10 @@ This is your link for group %@!</source>
<target>Няма токен за устройство!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Няма филтрирани чатове</target>
@@ -4453,6 +4468,10 @@ This is your link for group %@!</source>
<target>Други</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING бройка</target>
@@ -4619,6 +4638,10 @@ Error: %@</source>
<target>Моля, съхранявайте паролата на сигурно място, НЯМА да можете да я промените, ако я загубите.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Полски интерфейс</target>
@@ -4685,6 +4708,10 @@ Error: %@</source>
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Профилни и сървърни връзки</target>
@@ -5585,6 +5612,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Сървърът изисква оторизация за създаване на опашки, проверете паролата</target>
@@ -5608,6 +5639,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Сървъри</target>
@@ -7762,6 +7797,10 @@ SimpleX сървърите не могат да видят вашия профи
<target>iOS Keychain ще се използва за сигурно съхраняване на паролата, след като рестартирате приложението или промените паролата - това ще позволи получаването на push известия.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>инкогнито чрез линк с адрес за контакт</target>
@@ -386,8 +386,8 @@
<source>Add servers by scanning QR codes.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
@@ -126,11 +126,6 @@
<target>%@ je ověřený</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ servery</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<note>No comment provided by engineer.</note>
@@ -572,6 +567,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Přidejte adresu do svého profilu, aby ji vaše kontakty mohly sdílet s dalšími lidmi. Aktualizace profilu bude zaslána vašim kontaktům.</target>
@@ -591,16 +590,16 @@
<target>Přidat profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Přidat server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Přidejte servery skenováním QR kódů.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Přidat server…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Přidat do jiného zařízení</target>
@@ -1305,6 +1304,10 @@
<target>Konfigurace serverů ICE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Potvrdit</target>
@@ -1467,10 +1470,6 @@ This is your own one-time link!</source>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Kontakt povolil</target>
@@ -3714,6 +3713,10 @@ This is your link for group %@!</source>
<target>Člen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>Role člena se změní na "%@". Všichni členové skupiny budou upozorněni.</target>
@@ -3752,6 +3755,14 @@ This is your link for group %@!</source>
<target>Návrh zprávy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
@@ -3771,6 +3782,10 @@ This is your link for group %@!</source>
<target>Reakce na zprávy jsou v této skupině zakázány.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
@@ -3791,10 +3806,6 @@ This is your link for group %@!</source>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Text zprávy</target>
@@ -4047,6 +4058,10 @@ This is your link for group %@!</source>
<target>Žádný token zařízení!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Žádné filtrované chaty</target>
@@ -4283,6 +4298,10 @@ This is your link for group %@!</source>
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Počet PING</target>
@@ -4441,6 +4460,10 @@ Error: %@</source>
<target>Heslo uložte bezpečně, v případě jeho ztráty jej NEBUDE možné změnit.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Polské rozhraní</target>
@@ -4506,6 +4529,10 @@ Error: %@</source>
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil a připojení k serveru</target>
@@ -5383,6 +5410,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Server vyžaduje autorizaci pro vytváření front, zkontrolujte heslo</target>
@@ -5406,6 +5437,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servery</target>
@@ -7477,6 +7512,10 @@ Servery SimpleX nevidí váš profil.</target>
<target>Klíčenka pro iOS bude použita k bezpečnému uložení přístupové fráze po restartování aplikace nebo změně přístupové fráze umožní příjem oznámení push.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>inkognito přes odkaz na kontaktní adresu</target>
@@ -127,11 +127,6 @@
<target>%@ wurde erfolgreich überprüft</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@-Server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ hochgeladen</target>
@@ -590,6 +585,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Fügen Sie die Adresse Ihrem Profil hinzu, damit Ihre Kontakte sie mit anderen Personen teilen können. Es wird eine Profilaktualisierung an Ihre Kontakte gesendet.</target>
@@ -610,16 +609,16 @@
<target>Profil hinzufügen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Füge Server hinzu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Fügen Sie Server durch Scannen der QR Codes hinzu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Füge Server hinzu…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Einem anderen Gerät hinzufügen</target>
@@ -1152,7 +1151,7 @@
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Zellulär</target>
<target>Mobilfunknetz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
@@ -1354,6 +1353,10 @@
<target>ICE-Server konfigurieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Bestätigen</target>
@@ -1533,10 +1536,6 @@ Das ist Ihr eigener Einmal-Link!</target>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Der Kontakt erlaubt</target>
@@ -1837,6 +1836,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<target>Debugging-Zustellung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
@@ -3869,6 +3869,10 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Mitglied</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>Die Mitgliederrolle wird auf "%@" geändert. Alle Mitglieder der Gruppe werden benachrichtigt.</target>
@@ -3908,8 +3912,17 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Nachrichtenentwurf</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<target>Nachrichten-Warteschlangen-Information</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
@@ -3927,6 +3940,10 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>In dieser Gruppe sind Reaktionen auf Nachrichten nicht erlaubt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Fallback für das Nachrichten-Routing</target>
@@ -3950,10 +3967,6 @@ Das ist Ihr Link für die Gruppe %@!</target>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Nachrichtentext</target>
@@ -4222,6 +4235,10 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Kein Geräte-Token!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Keine gefilterten Chats</target>
@@ -4469,6 +4486,10 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Andere</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING-Zähler</target>
@@ -4635,6 +4656,10 @@ Fehler: %@</target>
<target>Bitte bewahren Sie das Passwort sicher auf, Sie können es NICHT mehr ändern, wenn Sie es vergessen haben oder verlieren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Polnische Bedienoberfläche</target>
@@ -4704,6 +4729,10 @@ Fehler: %@</target>
<target>Privates Routing</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil und Serververbindungen</target>
@@ -4801,7 +4830,7 @@ Fehler: %@</target>
<trans-unit id="Protect your IP address from the messaging relays chosen by your contacts.&#10;Enable in *Network &amp; servers* settings." xml:space="preserve">
<source>Protect your IP address from the messaging relays chosen by your contacts.
Enable in *Network &amp; servers* settings.</source>
<target>Schützen Sie Ihre IP-Adresse vor den Nachrichten-Relais , die Ihre Kontakte ausgewählt haben.
<target>Schützen Sie Ihre IP-Adresse vor den Nachrichten-Relais, die Ihre Kontakte ausgewählt haben.
Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -5611,6 +5640,10 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<target>Die Server-Adresse ist nicht mit den Netzwerk-Einstellungen kompatibel.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Um Warteschlangen zu erzeugen benötigt der Server eine Authentifizierung. Bitte überprüfen Sie das Passwort</target>
@@ -5635,6 +5668,10 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<target>Die Server-Version ist nicht mit den Netzwerk-Einstellungen kompatibel.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Server</target>
@@ -7799,6 +7836,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Für die sichere Speicherung des Passworts nach dem Neustart der App und dem Wechsel des Passworts wird der iOS Schlüsselbund verwendet - dies erlaubt den Empfang von Push-Benachrichtigungen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>Inkognito über einen Kontaktadressen-Link</target>
@@ -8083,6 +8124,9 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<source>server queue info: %1$@
last received msg: %2$@</source>
<target>Server-Warteschlangen-Information: %1$@
Zuletzt empfangene Nachricht: %2$@</target>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
@@ -336,8 +336,8 @@ Available in v5.1</source>
<source>Add servers by scanning QR codes.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
@@ -127,11 +127,6 @@
<target>%@ is verified</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ uploaded</target>
@@ -593,6 +588,11 @@
<target>Acknowledgement errors</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<target>Active connections</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</target>
@@ -613,16 +613,16 @@
<target>Add profile</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Add server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Add servers by scanning QR codes.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Add server…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Add to another device</target>
@@ -1374,6 +1374,11 @@
<target>Configure ICE servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<target>Configured %@ servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Confirm</target>
@@ -1558,11 +1563,6 @@ This is your own one-time link!</target>
<target>Connections</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<target>Connections subscribed</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Contact allows</target>
@@ -3923,6 +3923,11 @@ This is your link for group %@!</target>
<target>Member</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<target>Member inactive</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>Member role will be changed to "%@". All group members will be notified.</target>
@@ -3963,6 +3968,16 @@ This is your link for group %@!</target>
<target>Message draft</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<target>Message forwarded</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<target>Message may be delivered later if member becomes active.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<target>Message queue info</target>
@@ -3983,6 +3998,11 @@ This is your link for group %@!</target>
<target>Message reactions are prohibited in this group.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<target>Message reception</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Message routing fallback</target>
@@ -4008,11 +4028,6 @@ This is your link for group %@!</target>
<target>Message status: %@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<target>Message subscriptions</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Message text</target>
@@ -4283,6 +4298,11 @@ This is your link for group %@!</target>
<target>No device token!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<target>No direct connection yet, message is forwarded by admin.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>No filtered chats</target>
@@ -4532,6 +4552,11 @@ This is your link for group %@!</target>
<target>Other</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<target>Other %@ servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING count</target>
@@ -4701,6 +4726,11 @@ Error: %@</target>
<target>Please store passphrase securely, you will NOT be able to change it if you lose it.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<target>Please try later.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Polish interface</target>
@@ -4771,6 +4801,11 @@ Error: %@</target>
<target>Private routing</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<target>Private routing error</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profile and server connections</target>
@@ -5708,6 +5743,11 @@ Enable in *Network &amp; servers* settings.</target>
<target>Server address is incompatible with network settings.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<target>Server address is incompatible with network settings: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Server requires authorization to create queues, check password</target>
@@ -5733,6 +5773,11 @@ Enable in *Network &amp; servers* settings.</target>
<target>Server version is incompatible with network settings.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<target>Server version is incompatible with your app: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servers</target>
@@ -7927,6 +7972,11 @@ SimpleX servers cannot see your profile.</target>
<target>iOS Keychain will be used to securely store passphrase after you restart the app or change passphrase - it will allow receiving push notifications.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<target>inactive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>incognito via contact address link</target>
@@ -127,11 +127,6 @@
<target>%@ está verificado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>Servidores %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ subido</target>
@@ -590,6 +585,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Añade la dirección a tu perfil para que tus contactos puedan compartirla con otros. La actualización del perfil se enviará a tus contactos.</target>
@@ -610,16 +609,16 @@
<target>Añadir perfil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Añadir servidor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Añadir servidores mediante el escaneo de códigos QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Añadir servidor…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Añadir a otro dispositivo</target>
@@ -1354,6 +1353,10 @@
<target>Configure servidores ICE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Confirmar</target>
@@ -1507,7 +1510,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Connection error (AUTH)" xml:space="preserve">
<source>Connection error (AUTH)</source>
<target>Error conexión (Autenticación)</target>
<target>Error de conexión (Autenticación)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connection request sent!" xml:space="preserve">
@@ -1522,7 +1525,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Connection timeout" xml:space="preserve">
<source>Connection timeout</source>
<target>Tiempo de conexión expirado</target>
<target>Tiempo de conexión agotado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connection with desktop stopped" xml:space="preserve">
@@ -1533,10 +1536,6 @@ This is your own one-time link!</source>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>El contacto permite</target>
@@ -1837,6 +1836,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<target>Informe debug</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
@@ -3333,7 +3333,7 @@ Error: %2$@</target>
</trans-unit>
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
<target>Si no puedes reunirte en persona, muestra el código QR por videollamada, o comparte el enlace.</target>
<target>Si no puedes reunirte en persona, muestra el código QR por videollamada o comparte el enlace.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="If you enter this passcode when opening the app, all app data will be irreversibly removed!" xml:space="preserve">
@@ -3869,6 +3869,10 @@ This is your link for group %@!</source>
<target>Miembro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>El rol del miembro cambiará a "%@" y se notificará al grupo.</target>
@@ -3908,8 +3912,17 @@ This is your link for group %@!</source>
<target>Borrador de mensaje</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<target>Información cola de mensajes</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
@@ -3927,6 +3940,10 @@ This is your link for group %@!</source>
<target>Las reacciones a los mensajes no están permitidas en este grupo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Enrutamiento de mensajes alternativo</target>
@@ -3950,10 +3967,6 @@ This is your link for group %@!</source>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Contacto y texto</target>
@@ -4222,6 +4235,10 @@ This is your link for group %@!</source>
<target>¡Sin dispositivo token!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Sin chats filtrados</target>
@@ -4307,7 +4324,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="One-time invitation link" xml:space="preserve">
<source>One-time invitation link</source>
<target>Enlace único de invitación de un uso</target>
<target>Enlace de invitación de un solo uso</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Onion hosts will be required for connection. Requires enabling VPN." xml:space="preserve">
@@ -4451,7 +4468,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Or scan QR code" xml:space="preserve">
<source>Or scan QR code</source>
<target>O escanear código QR</target>
<target>O escanea el código QR</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
@@ -4461,7 +4478,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
<source>Or show this code</source>
<target>O mostrar este código</target>
<target>O muestra este código QR</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
@@ -4469,6 +4486,10 @@ This is your link for group %@!</source>
<target>Otro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Contador PING</target>
@@ -4531,7 +4552,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Paste the link you received" xml:space="preserve">
<source>Paste the link you received</source>
<target>Pegar el enlace recibido</target>
<target>Pega el enlace recibido</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Pending" xml:space="preserve">
@@ -4545,7 +4566,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Periodically" xml:space="preserve">
<source>Periodically</source>
<target>Periódico</target>
<target>Periódicamente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Permanent decryption error" xml:space="preserve">
@@ -4635,6 +4656,10 @@ Error: %@</target>
<target>Guarda la contraseña de forma segura, NO podrás cambiarla si la pierdes.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Interfaz en polaco</target>
@@ -4704,6 +4729,10 @@ Error: %@</target>
<target>Enrutamiento privado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Datos del perfil y conexiones</target>
@@ -4812,12 +4841,12 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Protocol timeout" xml:space="preserve">
<source>Protocol timeout</source>
<target>Tiempo de espera del protocolo</target>
<target>Timeout protocolo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout per KB" xml:space="preserve">
<source>Protocol timeout per KB</source>
<target>Límite de espera del protocolo por KB</target>
<target>Timeout protocolo por KB</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Proxied" xml:space="preserve">
@@ -4860,32 +4889,32 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Read more" xml:space="preserve">
<source>Read more</source>
<target>Saber más</target>
<target>Conoce más</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Read more in [User Guide](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address)." xml:space="preserve">
<source>Read more in [User Guide](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address).</source>
<target>Saber más en el [Manual del Usuario](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address).</target>
<target>Conoce más en el [Manual del Usuario](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode)." xml:space="preserve">
<source>Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).</source>
<target>Saber más en [Guía de Usuario](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).</target>
<target>Conoce más en la [Guía del Usuario](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends)." xml:space="preserve">
<source>Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends).</source>
<target>Saber más en el [Manual del Usuario](https://simplex.chat/docs/guide/readme.html#connect-to-friends).</target>
<target>Conoce más en el [Manual del Usuario](https://simplex.chat/docs/guide/readme.html#connect-to-friends).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Read more in our GitHub repository." xml:space="preserve">
<source>Read more in our GitHub repository.</source>
<target>Saber más en nuestro repositorio GitHub.</target>
<target>Conoce más en nuestro repositorio GitHub.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Read more in our [GitHub repository](https://github.com/simplex-chat/simplex-chat#readme)." xml:space="preserve">
<source>Read more in our [GitHub repository](https://github.com/simplex-chat/simplex-chat#readme).</source>
<target>Saber más en nuestro [repositorio GitHub](https://github.com/simplex-chat/simplex-chat#readme).</target>
<target>Conoce más en nuestro [repositorio GitHub](https://github.com/simplex-chat/simplex-chat#readme).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receipts are disabled" xml:space="preserve">
@@ -5611,6 +5640,10 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<target>La dirección del servidor es incompatible con la configuración de la red.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>El servidor requiere autorización para crear colas, comprueba la contraseña</target>
@@ -5635,6 +5668,10 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<target>La versión del servidor es incompatible con la configuración de red.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servidores</target>
@@ -5739,7 +5776,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
<source>Share this 1-time invite link</source>
<target>Compartir este enlace de un uso</target>
<target>Comparte este enlace de un solo uso</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share with contacts" xml:space="preserve">
@@ -6021,7 +6058,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="TCP connection timeout" xml:space="preserve">
<source>TCP connection timeout</source>
<target>Tiempo de espera de la conexión TCP agotado</target>
<target>Timeout de la conexión TCP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="TCP_KEEPCNT" xml:space="preserve">
@@ -6071,7 +6108,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Tap to paste link" xml:space="preserve">
<source>Tap to paste link</source>
<target>Pulsa para pegar enlace</target>
<target>Pulsa para pegar el enlacePulsa para pegar enlace</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap to scan" xml:space="preserve">
@@ -6339,7 +6376,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>Para proteger tu dirección IP, el enrutamiento privado usa tus servidores SMP para enviar mensajes.</target>
<target>Para proteger tu dirección IP, el enrutamiento privado usa tu lista de servidores SMP para enviar mensajes.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
@@ -6500,9 +6537,8 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
<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>A menos que tu contacto haya eliminado la conexión o
que este enlace ya se haya usado, podría ser un error. Por favor, notifícalo.
Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueba que tienes buena conexión de red.</target>
<target>A menos que tu contacto haya eliminado la conexión o el enlace haya sido usado, podría ser un error. Por favor, notifícalo.
Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión de red.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unlink" xml:space="preserve">
@@ -6654,12 +6690,12 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Usar enrutamiento privado con servidores desconocidos cuando la dirección IP no está protegida.</target>
<target>Usar enrutamiento privado con servidores desconocidos cuando tu dirección IP no está protegida.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Usar enrutamiento privado con servidores desconocidos.</target>
<target>Usar enrutamiento privado con servidores de retransmisión desconocidos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
@@ -7202,7 +7238,7 @@ Repeat connection request?</source>
</trans-unit>
<trans-unit id="You will be required to authenticate when you start or resume the app after 30 seconds in background." xml:space="preserve">
<source>You will be required to authenticate when you start or resume the app after 30 seconds in background.</source>
<target>Se te pedirá identificarte cuándo inicies o continues usando la aplicación tras 30 segundos en segundo plano.</target>
<target>Se te pedirá autenticarte cuando inicies la aplicación o sigas usándola tras 30 segundos en segundo plano.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You will connect to all group members." xml:space="preserve">
@@ -7335,8 +7371,8 @@ Puedes cancelarla y eliminar el contacto (e intentarlo más tarde con un enlace
<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 se almacena en tu dispositivo y sólo se comparte con tus contactos.
Los servidores de SimpleX no pueden ver tu perfil.</target>
<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, contacts and delivered messages are stored on your device." xml:space="preserve">
@@ -7800,6 +7836,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>iOS Keychain se usará para almacenar la contraseña de forma segura después de reiniciar la aplicación o cambiar la contraseña. Esto permitirá recibir notificaciones automáticas.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>en modo incógnito mediante enlace de dirección del contacto</target>
@@ -8084,6 +8124,9 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<source>server queue info: %1$@
last received msg: %2$@</source>
<target>información cola del servidor: %1$@
último mensaje recibido: %2$@</target>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
@@ -8128,7 +8171,7 @@ last received msg: %2$@</source>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>servidor de retransmisión desconocido</target>
<target>con servidores desconocidos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
@@ -8138,7 +8181,7 @@ last received msg: %2$@</source>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>desprotegido</target>
<target>con IP desprotegida</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
@@ -124,11 +124,6 @@
<target>%@ on vahvistettu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ palvelimet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<note>No comment provided by engineer.</note>
@@ -567,6 +562,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Lisää osoite profiiliisi, jotta kontaktisi voivat jakaa sen muiden kanssa. Profiilipäivitys lähetetään kontakteillesi.</target>
@@ -586,16 +585,16 @@
<target>Lisää profiili</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Lisää palvelin</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Lisää palvelimia skannaamalla QR-koodeja.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Lisää palvelin…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Lisää toiseen laitteeseen</target>
@@ -1298,6 +1297,10 @@
<target>Määritä ICE-palvelimet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Vahvista</target>
@@ -1460,10 +1463,6 @@ This is your own one-time link!</source>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Kontakti sallii</target>
@@ -3704,6 +3703,10 @@ This is your link for group %@!</source>
<target>Jäsen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>Jäsenen rooli muuttuu muotoon "%@". Kaikille ryhmän jäsenille ilmoitetaan asiasta.</target>
@@ -3742,6 +3745,14 @@ This is your link for group %@!</source>
<target>Viestiluonnos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
@@ -3761,6 +3772,10 @@ This is your link for group %@!</source>
<target>Viestireaktiot ovat kiellettyjä tässä ryhmässä.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
@@ -3781,10 +3796,6 @@ This is your link for group %@!</source>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Viestin teksti</target>
@@ -4036,6 +4047,10 @@ This is your link for group %@!</source>
<target>Ei laitetunnusta!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Ei suodatettuja keskusteluja</target>
@@ -4271,6 +4286,10 @@ This is your link for group %@!</source>
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING-määrä</target>
@@ -4429,6 +4448,10 @@ Error: %@</source>
<target>Säilytä tunnuslause turvallisesti, ET voi muuttaa sitä, jos kadotat sen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Puolalainen käyttöliittymä</target>
@@ -4494,6 +4517,10 @@ Error: %@</source>
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profiili- ja palvelinyhteydet</target>
@@ -5370,6 +5397,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Palvelin vaatii valtuutuksen jonojen luomiseen, tarkista salasana</target>
@@ -5393,6 +5424,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Palvelimet</target>
@@ -7462,6 +7497,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<target>iOS-Avainnippua käytetään tunnuslauseen turvalliseen tallentamiseen sen muuttamisen tai sovelluksen uudelleen käynnistämisen jälkeen - se mahdollistaa push-ilmoitusten vastaanottamisen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>incognito kontaktilinkin kautta</target>
@@ -127,11 +127,6 @@
<target>%@ est vérifié·e</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>Serveurs %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ envoyé</target>
@@ -590,6 +585,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Ajoutez une adresse à votre profil, afin que vos contacts puissent la partager avec d'autres personnes. La mise à jour du profil sera envoyée à vos contacts.</target>
@@ -610,16 +609,16 @@
<target>Ajouter un profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Ajouter un serveur</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Ajoutez des serveurs en scannant des codes QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Ajouter un serveur…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Ajouter à un autre appareil</target>
@@ -1354,6 +1353,10 @@
<target>Configurer les serveurs ICE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Confirmer</target>
@@ -1533,10 +1536,6 @@ Il s'agit de votre propre lien unique !</target>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Votre contact autorise</target>
@@ -1837,6 +1836,7 @@ Il s'agit de votre propre lien unique !</target>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<target>Livraison de débogage</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
@@ -3869,6 +3869,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Membre</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>Le rôle du membre sera changé pour "%@". Tous les membres du groupe en seront informés.</target>
@@ -3908,8 +3912,17 @@ Voici votre lien pour le groupe %@ !</target>
<target>Brouillon de message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<target>Informations sur la file d'attente des messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
@@ -3927,6 +3940,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Les réactions aux messages sont interdites dans ce groupe.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Rabattement du routage des messages</target>
@@ -3950,10 +3967,6 @@ Voici votre lien pour le groupe %@ !</target>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Texte du message</target>
@@ -4222,6 +4235,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Pas de token d'appareil!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Aucune discussion filtrés</target>
@@ -4469,6 +4486,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Autres</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Nombre de PING</target>
@@ -4635,6 +4656,10 @@ Erreur: %@</target>
<target>Veuillez conserver votre phrase secrète en lieu sûr, vous NE pourrez PAS la changer si vous la perdez.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Interface en polonais</target>
@@ -4704,6 +4729,10 @@ Erreur: %@</target>
<target>Routage privé</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil et connexions au serveur</target>
@@ -5611,6 +5640,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<target>L'adresse du serveur est incompatible avec les paramètres du réseau.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Le serveur requiert une autorisation pour créer des files d'attente, vérifiez le mot de passe</target>
@@ -5635,6 +5668,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<target>La version du serveur est incompatible avec les paramètres du réseau.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Serveurs</target>
@@ -7799,6 +7836,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>La keychain d'iOS sera utilisée pour stocker en toute sécurité la phrase secrète après le redémarrage de l'app ou la modification de la phrase secrète - il permettra de recevoir les notifications push.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>mode incognito via le lien d'adresse du contact</target>
@@ -8083,6 +8124,9 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<source>server queue info: %1$@
last received msg: %2$@</source>
<target>info sur la file d'attente du serveur: %1$@
dernier message reçu: %2$@</target>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
@@ -403,9 +403,9 @@ Available in v5.1</source>
<target state="translated">הוספת שרתים על ידי סריקת קוד QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve" approved="no">
<source>Add server</source>
<target state="translated">הוסף שרת</target>
<trans-unit id="Add server" xml:space="preserve" approved="no">
<source>Add server</source>
<target state="translated">הוסף שרת</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve" approved="no">
@@ -300,8 +300,8 @@
<source>Add servers by scanning QR codes.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
@@ -367,8 +367,8 @@
<source>Add servers by scanning QR codes.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
@@ -127,11 +127,6 @@
<target>%@ ellenőrizve</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ kiszolgáló</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ feltöltve</target>
@@ -497,7 +492,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&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">
@@ -544,17 +539,17 @@
</trans-unit>
<trans-unit id="About SimpleX" xml:space="preserve">
<source>About SimpleX</source>
<target>A SimpleX névjegye</target>
<target>A SimpleX-ről</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About SimpleX Chat" xml:space="preserve">
<source>About SimpleX Chat</source>
<target>A SimpleX Chat névjegye</target>
<target>A SimpleX Chat-ről</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About SimpleX address" xml:space="preserve">
<source>About SimpleX address</source>
<target>A SimpleX azonosítóról</target>
<target>A SimpleX címről</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
@@ -590,9 +585,13 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Azonosító hozzáadása a profilhoz, hogy az ismerősei megoszthassák másokkal. A profilfrissítés elküldésre kerül az ismerősei számára.</target>
<target>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ősei számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add contact" xml:space="preserve">
@@ -610,16 +609,16 @@
<target>Profil hozzáadása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Kiszolgáló hozzáadása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Kiszolgáló hozzáadása QR-kód beolvasásával.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Kiszolgáló hozzáadása…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Hozzáadás egy másik eszközhöz</target>
@@ -766,7 +765,7 @@
</trans-unit>
<trans-unit id="Allow sending direct messages to members." xml:space="preserve">
<source>Allow sending direct messages to members.</source>
<target>Közvetlen üzenetek küldésének engedélyezése a tagok számára.</target>
<target>A közvetlen üzenetek küldése a tagok között engedélyezve van.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow sending disappearing messages." xml:space="preserve">
@@ -999,7 +998,7 @@
</trans-unit>
<trans-unit id="Bad desktop address" xml:space="preserve">
<source>Bad desktop address</source>
<target>Hibás számítógép azonosító</target>
<target>Hibás számítógép cím</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bad message ID" xml:space="preserve">
@@ -1033,7 +1032,7 @@
</trans-unit>
<trans-unit id="Block for all" xml:space="preserve">
<source>Block for all</source>
<target>Mindenki számára letiltva</target>
<target>Letiltás mindenki számára</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Block group members" xml:space="preserve">
@@ -1108,7 +1107,7 @@
</trans-unit>
<trans-unit id="Camera not available" xml:space="preserve">
<source>Camera not available</source>
<target>A fényképező nem elérhető</target>
<target>A kamera nem elérhető</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Can't invite contact!" xml:space="preserve">
@@ -1354,6 +1353,10 @@
<target>ICE kiszolgálók beállítása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Megerősítés</target>
@@ -1428,7 +1431,7 @@
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>Kapcsolódás saját magához?
Ez a SimpleX azonosítója!</target>
Ez az ön SimpleX címe!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
@@ -1440,7 +1443,7 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
<source>Connect via contact address</source>
<target>Kapcsolódás a kapcsolattartási azonosítón keresztül</target>
<target>Kapcsolódás a kapcsolattartási címen keresztül</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect via link" xml:space="preserve">
@@ -1533,10 +1536,6 @@ Ez az egyszer használatos hivatkozása!</target>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Ismerős engedélyezi</target>
@@ -1613,7 +1612,7 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Create SimpleX address" xml:space="preserve">
<source>Create SimpleX address</source>
<target>SimpleX azonosító létrehozása</target>
<target>SimpleX cím létrehozása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create a group using a random profile." xml:space="preserve">
@@ -1623,7 +1622,7 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Create an address to let people connect with you." xml:space="preserve">
<source>Create an address to let people connect with you.</source>
<target>Azonosító létrehozása, hogy az emberek kapcsolatba léphessenek önnel.</target>
<target>Cím létrehozása, hogy az emberek kapcsolatba léphessenek önnel.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create file" xml:space="preserve">
@@ -1837,6 +1836,7 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<target>Kézbesítési hibák felderítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
@@ -1866,12 +1866,12 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Delete address" xml:space="preserve">
<source>Delete address</source>
<target>Azonosító törlése</target>
<target>Cím törlése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete address?" xml:space="preserve">
<source>Delete address?</source>
<target>Azonosító törlése?</target>
<target>Cím törlése?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete after" xml:space="preserve">
@@ -2081,7 +2081,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Számítógép azonosítója</target>
<target>Számítógép címe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
@@ -2239,7 +2239,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Don't create address" xml:space="preserve">
<source>Don't create address</source>
<target>Ne hozzon létre azonosítót</target>
<target>Ne hozzon létre címet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't enable" xml:space="preserve">
@@ -2331,7 +2331,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Enable TCP keep-alive" xml:space="preserve">
<source>Enable TCP keep-alive</source>
<target>TCP életben tartásának engedélyezése</target>
<target>TCP életben tartása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable automatic message deletion?" xml:space="preserve">
@@ -2521,7 +2521,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Error aborting address change" xml:space="preserve">
<source>Error aborting address change</source>
<target>Hiba az azonosító megváltoztatásának megszakításakor</target>
<target>Hiba a cím megváltoztatásának megszakításakor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting contact request" xml:space="preserve">
@@ -2541,7 +2541,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Error changing address" xml:space="preserve">
<source>Error changing address</source>
<target>Hiba az azonosító megváltoztatásakor</target>
<target>Hiba a cím megváltoztatásakor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing role" xml:space="preserve">
@@ -2556,7 +2556,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Error creating address" xml:space="preserve">
<source>Error creating address</source>
<target>Hiba az azonosító létrehozásakor</target>
<target>Hiba a cím létrehozásakor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error creating group" xml:space="preserve">
@@ -2712,7 +2712,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Error saving group profile" xml:space="preserve">
<source>Error saving group profile</source>
<target>Hiba a csoport profil mentésekor</target>
<target>Hiba a csoportprofil mentésekor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error saving passcode" xml:space="preserve">
@@ -3223,7 +3223,7 @@ Hiba: %2$@</target>
</trans-unit>
<trans-unit id="Group profile" xml:space="preserve">
<source>Group profile</source>
<target>Csoport profil</target>
<target>Csoportprofil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group profile is stored on members' devices, not on the servers." xml:space="preserve">
@@ -3826,12 +3826,12 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Make sure %@ server addresses are in correct format, line separated and are not duplicated (%@)." xml:space="preserve">
<source>Make sure %@ server addresses are in correct format, line separated and are not duplicated (%@).</source>
<target>Győződjön meg arról, hogy a %@ kiszolgálócímek megfelelő formátumúak, sorszeparáltak és nem duplikáltak (%@).</target>
<target>Győződjön meg arról, hogy a %@ kiszolgálócímek megfelelő formátumúak, sorszeparáltak és nincsenek duplikálva (%@).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make sure WebRTC ICE server addresses are in correct format, line separated and are not duplicated." xml:space="preserve">
<source>Make sure WebRTC ICE server addresses are in correct format, line separated and are not duplicated.</source>
<target>Győződjön meg arról, hogy a WebRTC ICE-kiszolgáló címei megfelelő formátumúak, sorszeparáltak és nem duplikáltak.</target>
<target>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.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Many people asked: *if SimpleX has no user identifiers, how can it deliver messages?*" xml:space="preserve">
@@ -3869,14 +3869,18 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Tag</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>A tag szerepköre meg fog változni erre: "%@". A csoport minden tagja értesítést kap róla.</target>
<target>A tag szerepköre meg fog változni erre: %@. A csoport minden tagja értesítést kap róla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. The member will receive a new invitation." xml:space="preserve">
<source>Member role will be changed to "%@". The member will receive a new invitation.</source>
<target>A tag szerepköre meg fog változni erre: "%@". A tag új meghívást fog kapni.</target>
<target>A tag szerepköre meg fog változni erre: %@. A tag új meghívást fog kapni.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member will be removed from group - this cannot be undone!" xml:space="preserve">
@@ -3908,8 +3912,17 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Üzenetvázlat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<target>Üzenet-várakoztatási információ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
@@ -3927,6 +3940,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Az üzenetreakciók küldése le van tiltva ebben a csoportban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Üzenet útválasztási tartalék</target>
@@ -3950,10 +3967,6 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Üzenet szövege</target>
@@ -4222,6 +4235,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Nincs eszköztoken!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Nincsenek szűrt csevegések</target>
@@ -4277,7 +4294,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
- disable members ("observer" role)</source>
<target>Most már az adminok is:
- törölhetik a tagok üzeneteit.
- letilthatnak tagokat ("megfigyelő" szerepkör)</target>
- letilthatnak tagokat (megfigyelő szerepkör)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="OK" xml:space="preserve">
@@ -4469,6 +4486,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>További</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING számláló</target>
@@ -4511,12 +4532,12 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Past member %@" xml:space="preserve">
<source>Past member %@</source>
<target>Korábbi csoport 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">
<source>Paste desktop address</source>
<target>Számítógép azonosítójának beillesztése</target>
<target>Számítógép címének beillesztése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Paste image" xml:space="preserve">
@@ -4635,6 +4656,10 @@ Hiba: %@</target>
<target>Tárolja el biztonságosan jelmondatát, mert ha elveszíti azt, NEM tudja megváltoztatni.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Lengyel kezelőfelület</target>
@@ -4704,6 +4729,10 @@ Hiba: %@</target>
<target>Privát útválasztás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil és kiszolgálókapcsolatok</target>
@@ -4770,7 +4799,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>A közvetlen üzenetek küldése le van tiltva a tagok között.</target>
<target>A közvetlen üzenetek küldése a tagok között le van tiltva.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending disappearing messages." xml:space="preserve">
@@ -4790,7 +4819,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>Az IP-cím védelme</target>
<target>IP-cím védelem</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
@@ -5021,12 +5050,12 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="Relay server is only used if necessary. Another party can observe your IP address." xml:space="preserve">
<source>Relay server is only used if necessary. Another party can observe your IP address.</source>
<target>Az átjátszó kiszolgáló csak szükség esetén kerül használatra. Egy másik fél megfigyelheti az IP-címét.</target>
<target>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.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Relay server protects your IP address, but it can observe the duration of the call." xml:space="preserve">
<source>Relay server protects your IP address, but it can observe the duration of the call.</source>
<target>Az átjátszó kiszolgáló megvédi IP-címét, de megfigyelheti a hívás időtartamát.</target>
<target>Az átjátszó kiszolgáló megvédi az IP-címet, de megfigyelheti a hívás időtartamát.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove" xml:space="preserve">
@@ -5176,7 +5205,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="Revert" xml:space="preserve">
<source>Revert</source>
<target>Visszaállít</target>
<target>Visszaállítás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Revoke" xml:space="preserve">
@@ -5210,7 +5239,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="SMP servers" xml:space="preserve">
<source>SMP servers</source>
<target>Üzenetküldő (SMP) kiszolgálók</target>
<target>SMP kiszolgálók</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
@@ -5245,7 +5274,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="Save and update group profile" xml:space="preserve">
<source>Save and update group profile</source>
<target>Mentés és a csoport profil frissítése</target>
<target>Mentés és csoportprofil frissítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save archive" xml:space="preserve">
@@ -5260,7 +5289,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="Save group profile" xml:space="preserve">
<source>Save group profile</source>
<target>Csoport profil elmentése</target>
<target>Csoportprofil elmentése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save passphrase and open chat" xml:space="preserve">
@@ -5611,6 +5640,10 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
<target>A kiszolgáló címe nem kompatibilis a hálózati beállításokkal.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>A kiszolgálónak engedélyre van szüksége a várólisták létrehozásához, ellenőrizze jelszavát</target>
@@ -5635,6 +5668,10 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
<target>A kiszolgáló verziója nem kompatibilis a hálózati beállításokkal.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Kiszolgálók</target>
@@ -5724,12 +5761,12 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="Share address" xml:space="preserve">
<source>Share address</source>
<target>Azonosító megosztása</target>
<target>Cím megosztása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share address with contacts?" xml:space="preserve">
<source>Share address with contacts?</source>
<target>Megosztja az azonosítót az ismerőseivel?</target>
<target>Megosztja a címet az ismerőseivel?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share link" xml:space="preserve">
@@ -5793,7 +5830,7 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="SimpleX Address" xml:space="preserve">
<source>SimpleX Address</source>
<target>SimpleX azonosító</target>
<target>SimpleX cím</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
@@ -5823,12 +5860,12 @@ Engedélyezze a beállításokban a *Hálózat és kiszolgálók* menüpontban.<
</trans-unit>
<trans-unit id="SimpleX address" xml:space="preserve">
<source>SimpleX address</source>
<target>SimpleX azonosító</target>
<target>SimpleX cím</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX contact address" xml:space="preserve">
<source>SimpleX contact address</source>
<target>SimpleX kapcsolattartási azonosító</target>
<target>SimpleX kapcsolattartási cím</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX encrypted message or connection event" xml:space="preserve">
@@ -6286,7 +6323,7 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>Ez a SimpleX azonosítója!</target>
<target>Ez az ön SimpleX címe!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
@@ -6339,7 +6376,7 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>Az IP-címe védelme érdekében a privát útválasztás az SMP-kiszolgálókat használja az üzenetek kézbesítéséhez.</target>
<target>Az IP-cím védelmének érdekében a privát útválasztás az SMP kiszolgálókat használja az üzenetek kézbesítéséhez.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
@@ -6958,7 +6995,7 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol
</trans-unit>
<trans-unit id="You accepted connection" xml:space="preserve">
<source>You accepted connection</source>
<target>Kapcsolódás elfogadva</target>
<target>Kapcsolat létrehozása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You allow" xml:space="preserve">
@@ -7079,12 +7116,12 @@ Csatlakozási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="You can share this address with your contacts to let them connect with **%@**." xml:space="preserve">
<source>You can share this address with your contacts to let them connect with **%@**.</source>
<target>Megoszthatja ezt az azonosítót az ismerőseivel, hogy kapcsolatba léphessenek önnel a **%@** nevű profilján keresztül.</target>
<target>Megoszthatja ezt a címet az ismerőseivel, hogy kapcsolatba léphessenek önnel a(z) **%@** nevű profilján keresztül.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can share your address as a link or QR code - anybody can connect to you." xml:space="preserve">
<source>You can share your address as a link or QR code - anybody can connect to you.</source>
<target>Megoszthatja azonosítóját hivatkozásként vagy QR-kódként így bárki kapcsolódhat önhöz.</target>
<target>Megoszthatja a címét egy hivatkozásként vagy QR-kódként így bárki kapcsolódhat önhöz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can start chat via app Settings / Database or by restarting the app" xml:space="preserve">
@@ -7124,7 +7161,7 @@ Csatlakozási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
<source>You have already requested connection via this address!</source>
<target>Már kért egy kapcsolódási kérelmet ezen az azonosítón keresztül!</target>
<target>Már kért egy kapcsolódási kérelmet ezen a címen keresztül!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection!&#10;Repeat connection request?" xml:space="preserve">
@@ -7221,7 +7258,7 @@ Kapcsolódási kérés megismétlése?</target>
</trans-unit>
<trans-unit id="You won't lose your contacts if you later delete your address." xml:space="preserve">
<source>You won't lose your contacts if you later delete your address.</source>
<target>Nem veszíti el az ismerőseit, ha később törli az azonosítóját.</target>
<target>Nem veszíti el az ismerőseit, ha később törli a címét.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile" xml:space="preserve">
@@ -7251,7 +7288,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>SimpleX azonosítója</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">
@@ -7430,7 +7467,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="and %lld other events" xml:space="preserve">
<source>and %lld other events</source>
<target>és %lld további esemény</target>
<target>és további %lld esemény</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="attempts" xml:space="preserve">
@@ -7464,7 +7501,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="blocked %@" xml:space="preserve">
<source>blocked %@</source>
<target>%@ letiltva</target>
<target>letiltotta őt: %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="blocked by admin" xml:space="preserve">
@@ -7514,12 +7551,12 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="changing address for %@…" xml:space="preserve">
<source>changing address for %@…</source>
<target>cím módosítása %@ számára…</target>
<target>cím megváltoztatása nála: %@…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="changing address…" xml:space="preserve">
<source>changing address…</source>
<target>azonosító megváltoztatása…</target>
<target>cím megváltoztatása…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="colored" xml:space="preserve">
@@ -7678,7 +7715,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="duplicate message" xml:space="preserve">
<source>duplicate message</source>
<target>duplikálódott üzenet</target>
<target>duplikált üzenet</target>
<note>integrity error chat item</note>
</trans-unit>
<trans-unit id="duplicates" xml:space="preserve">
@@ -7781,7 +7818,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="group profile updated" xml:space="preserve">
<source>group profile updated</source>
<target>csoport profil frissítve</target>
<target>csoportprofil frissítve</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="hours" xml:space="preserve">
@@ -7799,6 +7836,10 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>Az iOS kulcstár az alkalmazás újraindítása, vagy a jelmondat módosítása után a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>inkognitó a kapcsolattartási hivatkozáson keresztül</target>
@@ -7956,7 +7997,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="off" xml:space="preserve">
<source>off</source>
<target>ki</target>
<target>kikapcsolva</target>
<note>enabled status
group pref value
time to disappear</note>
@@ -8031,7 +8072,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="removed contact address" xml:space="preserve">
<source>removed contact address</source>
<target>törölt kapcsolattartási azonosító</target>
<target>törölt kapcsolattartási cím</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
@@ -8083,16 +8124,19 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<source>server queue info: %1$@
last received msg: %2$@</source>
<target>kiszolgáló üzenet-várakotatási információ: %1$@
utoljára fogadott üzenet: %2$@</target>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
<source>set new contact address</source>
<target>új kapcsolattartási azonosító beállítása</target>
<target>új kapcsolattartási cím beállítása</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="set new profile picture" xml:space="preserve">
<source>set new profile picture</source>
<target>új profilkép beállítása</target>
<target>új profilképet állított be</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
@@ -8162,7 +8206,7 @@ last received msg: %2$@</source>
</trans-unit>
<trans-unit id="via contact address link" xml:space="preserve">
<source>via contact address link</source>
<target>kapcsolattartási azonosító-hivatkozáson keresztül</target>
<target>kapcsolattartási cím-hivatkozáson keresztül</target>
<note>chat list item description</note>
</trans-unit>
<trans-unit id="via group link" xml:space="preserve">
@@ -8237,12 +8281,12 @@ last received msg: %2$@</source>
</trans-unit>
<trans-unit id="you changed address" xml:space="preserve">
<source>you changed address</source>
<target>azonosítója megváltoztatva</target>
<target>cím megváltoztatva</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="you changed address for %@" xml:space="preserve">
<source>you changed address for %@</source>
<target>%@ azonosítója megváltoztatva</target>
<target>cím megváltoztatva nála: %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="you changed role for yourself to %@" xml:space="preserve">
@@ -127,11 +127,6 @@
<target>%@ è verificato/a</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>Server %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ caricati</target>
@@ -590,6 +585,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Aggiungi l'indirizzo al tuo profilo, in modo che i tuoi contatti possano condividerlo con altre persone. L'aggiornamento del profilo verrà inviato ai tuoi contatti.</target>
@@ -610,16 +609,16 @@
<target>Aggiungi profilo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Aggiungi server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Aggiungi server scansionando codici QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Aggiungi server…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Aggiungi ad un altro dispositivo</target>
@@ -1354,6 +1353,10 @@
<target>Configura server ICE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Conferma</target>
@@ -1533,10 +1536,6 @@ Questo è il tuo link una tantum!</target>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Il contatto lo consente</target>
@@ -1837,6 +1836,7 @@ Questo è il tuo link una tantum!</target>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<target>Debug della consegna</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
@@ -3869,6 +3869,10 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Membro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>Il ruolo del membro verrà cambiato in "%@". Tutti i membri del gruppo verranno avvisati.</target>
@@ -3908,8 +3912,17 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Bozza dei messaggi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<target>Info coda messaggi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
@@ -3927,6 +3940,10 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Le reazioni ai messaggi sono vietate in questo gruppo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Ripiego instradamento messaggio</target>
@@ -3950,10 +3967,6 @@ Questo è il tuo link per il gruppo %@!</target>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Testo del messaggio</target>
@@ -4222,6 +4235,10 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Nessun token del dispositivo!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Nessuna chat filtrata</target>
@@ -4469,6 +4486,10 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Altro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Conteggio PING</target>
@@ -4635,6 +4656,10 @@ Errore: %@</target>
<target>Conserva la password in modo sicuro, NON potrai cambiarla se la perdi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Interfaccia polacca</target>
@@ -4686,7 +4711,7 @@ Errore: %@</target>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Instradamento privato messaggi</target>
<target>Instradamento privato dei messaggi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
@@ -4704,6 +4729,10 @@ Errore: %@</target>
<target>Instradamento privato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profilo e connessioni al server</target>
@@ -5611,6 +5640,10 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<target>L'indirizzo del server non è compatibile con le impostazioni di rete.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Il server richiede l'autorizzazione di creare code, controlla la password</target>
@@ -5635,6 +5668,10 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<target>La versione del server non è compatibile con le impostazioni di rete.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Server</target>
@@ -7799,6 +7836,10 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>Il portachiavi di iOS verrà usato per archiviare in modo sicuro la password dopo il riavvio dell'app o la modifica della password; consentirà di ricevere notifiche push.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>incognito via link indirizzo del contatto</target>
@@ -8083,6 +8124,9 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<source>server queue info: %1$@
last received msg: %2$@</source>
<target>info coda server: %1$@
ultimo msg ricevuto: %2$@</target>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
@@ -127,11 +127,6 @@
<target>%@ は検証されています</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ サーバー</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ アップロード済</target>
@@ -584,6 +579,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>プロフィールにアドレスを追加し、連絡先があなたのアドレスを他の人と共有できるようにします。プロフィールの更新は連絡先に送信されます。</target>
@@ -603,16 +602,16 @@
<target>プロフィールを追加</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>サーバを追加</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>QRコードでサーバを追加する。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>サーバを追加…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>別の端末に追加</target>
@@ -1322,6 +1321,10 @@
<target>ICEサーバを設定</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>確認</target>
@@ -1484,10 +1487,6 @@ This is your own one-time link!</source>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>連絡先の許可</target>
@@ -3729,6 +3728,10 @@ This is your link for group %@!</source>
<target>メンバー</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>メンバーの役割が "%@" に変更されます。 グループメンバー全員に通知されます。</target>
@@ -3766,6 +3769,14 @@ This is your link for group %@!</source>
<target>メッセージの下書き</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
@@ -3785,6 +3796,10 @@ This is your link for group %@!</source>
<target>このグループではメッセージへのリアクションは禁止されています。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
@@ -3805,10 +3820,6 @@ This is your link for group %@!</source>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>メッセージ内容</target>
@@ -4061,6 +4072,10 @@ This is your link for group %@!</source>
<target>デバイストークンがありません!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>フィルタされたチャットはありません</target>
@@ -4297,6 +4312,10 @@ This is your link for group %@!</source>
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING回数</target>
@@ -4455,6 +4474,10 @@ Error: %@</source>
<target>パスフレーズを失くさないように保管してください。失くすと変更できなくなります。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>ポーランド語UI</target>
@@ -4520,6 +4543,10 @@ Error: %@</source>
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>プロフィールとサーバ接続</target>
@@ -5388,6 +5415,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>キューを作成するにはサーバーの認証が必要です。パスワードを確認してください</target>
@@ -5411,6 +5442,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>サーバ</target>
@@ -7480,6 +7515,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>iOS キーチェーンは、アプリを再起動するかパスフレーズを変更した後にパスフレーズを安全に保存するために使用され、プッシュ通知を受信できるようになります。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>連絡先リンク経由でシークレットモード</target>
@@ -5,9 +5,11 @@
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
<trans-unit id="&#10;" xml:space="preserve" approved="no">
<source>
</source>
<target state="translated">
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=" " xml:space="preserve">
@@ -300,8 +302,8 @@
<source>Add servers by scanning QR codes.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
@@ -484,53 +486,62 @@
<source>Can't delete user profile!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Can't invite contact!" xml:space="preserve">
<trans-unit id="Can't invite contact!" xml:space="preserve" approved="no">
<source>Can't invite contact!</source>
<target state="translated">주소를 초대할 수 없습니다.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Can't invite contacts!" xml:space="preserve">
<source>Can't invite contacts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cancel" xml:space="preserve">
<trans-unit id="Cancel" xml:space="preserve" approved="no">
<source>Cancel</source>
<target state="translated">취소</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve" approved="no">
<source>Cannot access keychain to save database password</source>
<target state="translated">데이터베이스 암호를 저장하는 키체인에 접근 할 수 없습니다</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot receive file" xml:space="preserve">
<trans-unit id="Cannot receive file" xml:space="preserve" approved="no">
<source>Cannot receive file</source>
<target state="translated">파일을 받을 수 없습니다</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
<trans-unit id="Change" xml:space="preserve" approved="no">
<source>Change</source>
<target state="translated">변경</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change database passphrase?" xml:space="preserve">
<source>Change database passphrase?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change member role?" xml:space="preserve">
<trans-unit id="Change member role?" xml:space="preserve" approved="no">
<source>Change member role?</source>
<target state="translated">멤버 역할을 변경하시겠습니까?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change receiving address" xml:space="preserve">
<trans-unit id="Change receiving address" xml:space="preserve" approved="no">
<source>Change receiving address</source>
<target state="translated">수신 주소 변경</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change receiving address?" xml:space="preserve" approved="no">
<source>Change receiving address?</source>
<target state="translated">修改接收地址?</target>
<target state="translated">수신 주소를 변경하시겠습니까?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change role" xml:space="preserve">
<trans-unit id="Change role" xml:space="preserve" approved="no">
<source>Change role</source>
<target state="translated">역할 변경</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat archive" xml:space="preserve">
<trans-unit id="Chat archive" xml:space="preserve" approved="no">
<source>Chat archive</source>
<target state="translated">채팅 기록 보관함</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat console" xml:space="preserve">
@@ -545,8 +556,9 @@
<source>Chat database deleted</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat database imported" xml:space="preserve">
<trans-unit id="Chat database imported" xml:space="preserve" approved="no">
<source>Chat database imported</source>
<target state="translated">채팅 데이터베이스를 가져옴</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat is running" xml:space="preserve">
@@ -2397,24 +2409,29 @@ We will be adding server redundancy to prevent lost messages.</source>
<source>Send live message</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<trans-unit id="Send notifications" xml:space="preserve" approved="no">
<source>Send notifications</source>
<target state="translated">알림 전송</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications:" xml:space="preserve">
<trans-unit id="Send notifications:" xml:space="preserve" approved="no">
<source>Send notifications:</source>
<target state="translated">알림 전송:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send questions and ideas" xml:space="preserve">
<trans-unit id="Send questions and ideas" xml:space="preserve" approved="no">
<source>Send questions and ideas</source>
<target state="translated">질문이나 아이디어 보내기</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve" approved="no">
<source>Send them from gallery or custom keyboards.</source>
<target state="needs-translation">갤러리 또는 사용자 정의 키보드에서 그들을 보내십시오.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<trans-unit id="Sender cancelled file transfer." xml:space="preserve" approved="no">
<source>Sender cancelled file transfer.</source>
<target state="translated">상대방이 파일 전송을 취소했습니다.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
@@ -3755,6 +3772,26 @@ SimpleX servers cannot see your profile.</source>
<source>\~strike~</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change passcode" xml:space="preserve" approved="no">
<source>Change passcode</source>
<target state="translated">패스코드 변경</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve" approved="no">
<source>Cellular</source>
<target state="translated">셀룰러</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve" approved="no">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target state="needs-translation">이 서버 또는 도착 서버가 비밀 라우팅을 지원하지 않을 때 직통 메시지 보내기.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send up to 100 last messages to new members." xml:space="preserve" approved="no">
<source>Send up to 100 last messages to new members.</source>
<target state="translated">새로운 멤버에게 최대 100개의 마지막 메시지 보내기.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
</body>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="ko" datatype="plaintext">
@@ -3778,8 +3815,9 @@ SimpleX servers cannot see your profile.</source>
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
<note>Privacy - Microphone Usage Description</note>
</trans-unit>
<trans-unit id="NSPhotoLibraryAddUsageDescription" xml:space="preserve">
<trans-unit id="NSPhotoLibraryAddUsageDescription" xml:space="preserve" approved="no">
<source>SimpleX needs access to Photo Library for saving captured and received media</source>
<target state="needs-translation">SimpleX는 캡처 및 수신 된 미디어를 저장하기 위해 사진 라이브러리에 접근이 필요합니다</target>
<note>Privacy - Photo Library Additions Usage Description</note>
</trans-unit>
</body>
@@ -3793,8 +3831,9 @@ SimpleX servers cannot see your profile.</source>
<source>SimpleX NSE</source>
<note>Bundle display name</note>
</trans-unit>
<trans-unit id="CFBundleName" xml:space="preserve">
<trans-unit id="CFBundleName" xml:space="preserve" approved="no">
<source>SimpleX NSE</source>
<target state="translated">SimpleX NSE</target>
<note>Bundle name</note>
</trans-unit>
<trans-unit id="NSHumanReadableCopyright" xml:space="preserve">
@@ -329,9 +329,9 @@
<target state="translated">Pridėti serverius skenuojant QR kodus.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve" approved="no">
<source>Add server</source>
<target state="translated">Pridėti serverį</target>
<trans-unit id="Add server" xml:space="preserve" approved="no">
<source>Add server</source>
<target state="translated">Pridėti serverį</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
@@ -367,8 +367,8 @@
<source>Add servers by scanning QR codes.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
@@ -127,11 +127,6 @@
<target>%@ is geverifieerd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ servers</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ geüpload</target>
@@ -590,6 +585,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Voeg een adres toe aan uw profiel, zodat uw contacten het met andere mensen kunnen delen. Profiel update wordt naar uw contacten verzonden.</target>
@@ -610,16 +609,16 @@
<target>Profiel toevoegen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Server toevoegen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Servers toevoegen door QR-codes te scannen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Server toevoegen…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Toevoegen aan een ander apparaat</target>
@@ -1354,6 +1353,10 @@
<target>ICE servers configureren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Bevestigen</target>
@@ -1533,10 +1536,6 @@ Dit is uw eigen eenmalige link!</target>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Contact maakt het mogelijk</target>
@@ -1837,6 +1836,7 @@ Dit is uw eigen eenmalige link!</target>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<target>Foutopsporing bezorging</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
@@ -3869,6 +3869,10 @@ Dit is jouw link voor groep %@!</target>
<target>Lid</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>De rol van lid wordt gewijzigd in "%@". Alle groepsleden worden op de hoogte gebracht.</target>
@@ -3908,8 +3912,17 @@ Dit is jouw link voor groep %@!</target>
<target>Concept bericht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<target>Informatie over berichtenwachtrij</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
@@ -3927,6 +3940,10 @@ Dit is jouw link voor groep %@!</target>
<target>Reacties op berichten zijn verboden in deze groep.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Terugval op berichtroutering</target>
@@ -3950,10 +3967,6 @@ Dit is jouw link voor groep %@!</target>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Bericht tekst</target>
@@ -4222,6 +4235,10 @@ Dit is jouw link voor groep %@!</target>
<target>Geen apparaattoken!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Geen gefilterde gesprekken</target>
@@ -4469,6 +4486,10 @@ Dit is jouw link voor groep %@!</target>
<target>Ander</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING count</target>
@@ -4635,6 +4656,10 @@ Fout: %@</target>
<target>Bewaar het wachtwoord veilig, u kunt deze NIET wijzigen als u het kwijtraakt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Poolse interface</target>
@@ -4704,6 +4729,10 @@ Fout: %@</target>
<target>Privéroutering</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profiel- en serververbindingen</target>
@@ -5611,6 +5640,10 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<target>Serveradres is niet compatibel met netwerkinstellingen.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Server vereist autorisatie om wachtrijen te maken, controleer wachtwoord</target>
@@ -5635,6 +5668,10 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<target>Serverversie is incompatibel met netwerkinstellingen.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servers</target>
@@ -7799,6 +7836,10 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>iOS-keychain wordt gebruikt om het wachtwoord veilig op te slaan nadat u de app opnieuw hebt opgestart of het wachtwoord hebt gewijzigd, hiermee kunt u push meldingen ontvangen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>incognito via contact adres link</target>
@@ -8083,6 +8124,9 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<source>server queue info: %1$@
last received msg: %2$@</source>
<target>informatie over serverwachtrij: %1$@
laatst ontvangen bericht: %2$@</target>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
@@ -127,11 +127,6 @@
<target>%@ jest zweryfikowany</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ serwery</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ wgrane</target>
@@ -590,6 +585,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Dodaj adres do swojego profilu, aby Twoje kontakty mogły go udostępnić innym osobom. Aktualizacja profilu zostanie wysłana do Twoich kontaktów.</target>
@@ -610,16 +609,16 @@
<target>Dodaj profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Dodaj serwer</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Dodaj serwery, skanując kody QR.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Dodaj serwer…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Dodaj do innego urządzenia</target>
@@ -1354,6 +1353,10 @@
<target>Skonfiguruj serwery ICE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Potwierdź</target>
@@ -1533,10 +1536,6 @@ To jest twój jednorazowy link!</target>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Kontakt pozwala</target>
@@ -1837,6 +1836,7 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<target>Dostarczenie debugowania</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
@@ -3869,6 +3869,10 @@ To jest twój link do grupy %@!</target>
<target>Członek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>Rola członka grupy zostanie zmieniona na "%@". Wszyscy członkowie grupy zostaną powiadomieni.</target>
@@ -3908,8 +3912,17 @@ To jest twój link do grupy %@!</target>
<target>Wersja robocza wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<target>Informacje kolejki wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
@@ -3927,6 +3940,10 @@ To jest twój link do grupy %@!</target>
<target>Reakcje wiadomości są zabronione w tej grupie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Rezerwowe trasowania wiadomości</target>
@@ -3950,10 +3967,6 @@ To jest twój link do grupy %@!</target>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Tekst wiadomości</target>
@@ -4222,6 +4235,10 @@ To jest twój link do grupy %@!</target>
<target>Brak tokenu urządzenia!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Brak filtrowanych czatów</target>
@@ -4469,6 +4486,10 @@ To jest twój link do grupy %@!</target>
<target>Inne</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Liczba PINGÓW</target>
@@ -4635,6 +4656,10 @@ Błąd: %@</target>
<target>Przechowuj kod dostępu w bezpieczny sposób, w przypadku jego utraty NIE będzie można go zmienić.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Polski interfejs</target>
@@ -4704,6 +4729,10 @@ Błąd: %@</target>
<target>Prywatne trasowanie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil i połączenia z serwerem</target>
@@ -5611,6 +5640,10 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<target>Adres serwera jest niekompatybilny z ustawieniami sieciowymi.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Serwer wymaga autoryzacji do tworzenia kolejek, sprawdź hasło</target>
@@ -5635,6 +5668,10 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<target>Wersja serwera jest niekompatybilna z ustawieniami sieciowymi.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Serwery</target>
@@ -7799,6 +7836,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>iOS Keychain będzie używany do bezpiecznego przechowywania hasła po ponownym uruchomieniu aplikacji lub zmianie hasła - pozwoli to na otrzymywanie powiadomień push.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>incognito poprzez link adresu kontaktowego</target>
@@ -8083,6 +8124,9 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<source>server queue info: %1$@
last received msg: %2$@</source>
<target>Informacje kolejki serwera: %1$@
ostatnia otrzymana wiadomość: %2$@</target>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
@@ -374,9 +374,9 @@
<target state="translated">Adicione servidores escaneando o QR code.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve" approved="no">
<source>Add server</source>
<target state="translated">Adicionar servidor</target>
<trans-unit id="Add server" xml:space="preserve" approved="no">
<source>Add server</source>
<target state="translated">Adicionar servidor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve" approved="no">
@@ -5,9 +5,11 @@
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
<trans-unit id="&#10;" xml:space="preserve" approved="no">
<source>
</source>
<target state="needs-translation">
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="&#10;Available in v5.1" xml:space="preserve">
@@ -50,16 +52,19 @@ Available in v5.1</source>
<target state="translated">#secreto#</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@" xml:space="preserve">
<trans-unit id="%@" xml:space="preserve" approved="no">
<source>%@</source>
<target state="needs-translation">%@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ %@" xml:space="preserve">
<trans-unit id="%@ %@" xml:space="preserve" approved="no">
<source>%@ %@</source>
<target state="needs-translation">%@ %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ / %@" xml:space="preserve">
<trans-unit id="%@ / %@" xml:space="preserve" approved="no">
<source>%@ / %@</source>
<target state="needs-translation">%@ / %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve" approved="no">
@@ -117,12 +122,14 @@ Available in v5.1</source>
<target state="translated">%d mensagem(s) ignorada(s)</target>
<note>integrity error chat item</note>
</trans-unit>
<trans-unit id="%lld" xml:space="preserve">
<trans-unit id="%lld" xml:space="preserve" approved="no">
<source>%lld</source>
<target state="needs-translation">%lld</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld %@" xml:space="preserve">
<trans-unit id="%lld %@" xml:space="preserve" approved="no">
<source>%lld %@</source>
<target state="needs-translation">%lld %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lld contact(s) selected" xml:space="preserve" approved="no">
@@ -155,24 +162,29 @@ Available in v5.1</source>
<target state="translated">%lld segundos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lldd" xml:space="preserve">
<trans-unit id="%lldd" xml:space="preserve" approved="no">
<source>%lldd</source>
<target state="needs-translation">%lldd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lldh" xml:space="preserve">
<trans-unit id="%lldh" xml:space="preserve" approved="no">
<source>%lldh</source>
<target state="needs-translation">%lldh</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lldk" xml:space="preserve">
<trans-unit id="%lldk" xml:space="preserve" approved="no">
<source>%lldk</source>
<target state="needs-translation">%lldk</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lldm" xml:space="preserve">
<trans-unit id="%lldm" xml:space="preserve" approved="no">
<source>%lldm</source>
<target state="needs-translation">%lldm</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lldmth" xml:space="preserve">
<trans-unit id="%lldmth" xml:space="preserve" approved="no">
<source>%lldmth</source>
<target state="needs-translation">%lldmth</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%llds" xml:space="preserve">
@@ -193,8 +205,9 @@ Available in v5.1</source>
<target state="translated">%u mensagens ignoradas.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve">
<trans-unit id="(" xml:space="preserve" approved="no">
<source>(</source>
<target state="needs-translation">(</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=")" xml:space="preserve">
@@ -359,8 +372,8 @@ Available in v5.1</source>
<source>Add servers by scanning QR codes.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
@@ -4540,6 +4553,31 @@ SimpleX servers cannot see your profile.</source>
<target state="translated">Confirmar envio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ downloaded" xml:space="preserve" approved="no">
<source>%@ downloaded</source>
<target state="translated">%@ baixado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="# %@" xml:space="preserve" approved="no">
<source># %@</source>
<target state="needs-translation"># %@</target>
<note>copied message info title, # &lt;title&gt;</note>
</trans-unit>
<trans-unit id="%@:" xml:space="preserve" approved="no">
<source>%@:</source>
<target state="needs-translation">%@:</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="%@ (current)" xml:space="preserve" approved="no">
<source>%@ (current)</source>
<target state="translated">%@(atual)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ (current):" xml:space="preserve" approved="no">
<source>%@ (current):</source>
<target state="translated">%@ (atual):</target>
<note>copied message info</note>
</trans-unit>
</body>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="pt" datatype="plaintext">
@@ -127,11 +127,6 @@
<target>%@ подтверждён</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ серверы</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ загружено</target>
@@ -590,6 +585,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Добавьте адрес в свой профиль, чтобы Ваши контакты могли поделиться им. Профиль будет отправлен Вашим контактам.</target>
@@ -610,16 +609,16 @@
<target>Добавить профиль</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Добавить сервер</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Добавить серверы через QR код.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Добавить сервер…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Добавить на другое устройство</target>
@@ -1354,6 +1353,10 @@
<target>Настройка ICE серверов</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Подтвердить</target>
@@ -1533,10 +1536,6 @@ This is your own one-time link!</source>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Контакт разрешает</target>
@@ -3869,6 +3868,10 @@ This is your link for group %@!</source>
<target>Член группы</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>Роль члена группы будет изменена на "%@". Все члены группы получат сообщение.</target>
@@ -3908,6 +3911,14 @@ This is your link for group %@!</source>
<target>Черновик сообщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
@@ -3927,6 +3938,10 @@ This is your link for group %@!</source>
<target>Реакции на сообщения запрещены в этой группе.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Прямая доставка сообщений</target>
@@ -3950,10 +3965,6 @@ This is your link for group %@!</source>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Текст сообщения</target>
@@ -4222,6 +4233,10 @@ This is your link for group %@!</source>
<target>Отсутствует токен устройства!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Нет отфильтрованных разговоров</target>
@@ -4469,6 +4484,10 @@ This is your link for group %@!</source>
<target>Другaя сеть</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Количество PING</target>
@@ -4635,6 +4654,10 @@ Error: %@</source>
<target>Пожалуйста, надежно сохраните пароль, Вы НЕ сможете его поменять, если потеряете.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Польский интерфейс</target>
@@ -4704,6 +4727,10 @@ Error: %@</source>
<target>Конфиденциальная доставка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Профиль и соединения на сервере</target>
@@ -5611,6 +5638,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>Адрес сервера несовместим с настройками сети.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Сервер требует авторизации для создания очередей, проверьте пароль</target>
@@ -5635,6 +5666,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>Версия сервера несовместима с настройками сети.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Серверы</target>
@@ -7799,6 +7834,10 @@ SimpleX серверы не могут получить доступ к Ваше
<target>Пароль базы данных будет безопасно сохранен в iOS Keychain после запуска чата или изменения пароля - это позволит получать мгновенные уведомления.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>инкогнито через ссылку-контакт</target>
@@ -120,11 +120,6 @@
<target>%@ ได้รับการตรวจสอบแล้ว</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ เซิร์ฟเวอร์</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<note>No comment provided by engineer.</note>
@@ -559,6 +554,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>เพิ่มที่อยู่ลงในโปรไฟล์ของคุณ เพื่อให้ผู้ติดต่อของคุณสามารถแชร์กับผู้อื่นได้ การอัปเดตโปรไฟล์จะถูกส่งไปยังผู้ติดต่อของคุณ</target>
@@ -578,16 +577,16 @@
<target>เพิ่มโปรไฟล์</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>เพิ่มเซิร์ฟเวอร์</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>เพิ่มเซิร์ฟเวอร์โดยการสแกนรหัสคิวอาร์โค้ด</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>เพิ่มเซิร์ฟเวอร์…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>เพิ่มเข้าไปในอุปกรณ์อื่น</target>
@@ -1290,6 +1289,10 @@
<target>กำหนดค่าเซิร์ฟเวอร์ ICE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>ยืนยัน</target>
@@ -1450,10 +1453,6 @@ This is your own one-time link!</source>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>ผู้ติดต่ออนุญาต</target>
@@ -3687,6 +3686,10 @@ This is your link for group %@!</source>
<target>สมาชิก</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>บทบาทของสมาชิกจะถูกเปลี่ยนเป็น "%@" สมาชิกกลุ่มทั้งหมดจะได้รับแจ้ง</target>
@@ -3725,6 +3728,14 @@ This is your link for group %@!</source>
<target>ร่างข้อความ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
@@ -3744,6 +3755,10 @@ This is your link for group %@!</source>
<target>ปฏิกิริยาบนข้อความเป็นสิ่งต้องห้ามในกลุ่มนี้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
@@ -3764,10 +3779,6 @@ This is your link for group %@!</source>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>ข้อความ</target>
@@ -4017,6 +4028,10 @@ This is your link for group %@!</source>
<target>ไม่มีโทเค็นอุปกรณ์!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>ไม่มีการกรองการแชท</target>
@@ -4252,6 +4267,10 @@ This is your link for group %@!</source>
<source>Other</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>จํานวน PING</target>
@@ -4410,6 +4429,10 @@ Error: %@</source>
<target>โปรดจัดเก็บรหัสผ่านอย่างปลอดภัย คุณจะไม่สามารถเปลี่ยนรหัสผ่านได้หากคุณทำรหัสผ่านหาย</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>อินเตอร์เฟซภาษาโปแลนด์</target>
@@ -4475,6 +4498,10 @@ Error: %@</source>
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>การเชื่อมต่อโปรไฟล์และเซิร์ฟเวอร์</target>
@@ -5347,6 +5374,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>เซิร์ฟเวอร์ต้องการการอนุญาตในการสร้างคิว โปรดตรวจสอบรหัสผ่าน</target>
@@ -5370,6 +5401,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>เซิร์ฟเวอร์</target>
@@ -7430,6 +7465,10 @@ SimpleX servers cannot see your profile.</source>
<target>iOS Keychain จะใช้เพื่อจัดเก็บรหัสผ่านอย่างปลอดภัยหลังจากที่คุณรีสตาร์ทแอปหรือเปลี่ยนรหัสผ่าน ซึ่งจะช่วยให้รับการแจ้งเตือนแบบทันทีได้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>ไม่ระบุตัวตนผ่านลิงค์ที่อยู่ติดต่อ</target>
@@ -127,11 +127,6 @@
<target>%@ onaylandı</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ sunucuları</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ yüklendi</target>
@@ -590,6 +585,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Kişilerinizin başkalarıyla paylaşabilmesi için profilinize adres ekleyin. Profil güncellemesi kişilerinize gönderilecek.</target>
@@ -610,16 +609,16 @@
<target>Profil ekle</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Sunucu ekle</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Karekod taratarak sunucuları ekleyin.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Sunucu ekle…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Başka bir cihaza ekle</target>
@@ -1354,6 +1353,10 @@
<target>ICE sunucularını ayarla</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Onayla</target>
@@ -1533,10 +1536,6 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Kişi izin veriyor</target>
@@ -1837,6 +1836,7 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<target>Hata ayıklama teslimatı</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
@@ -3869,6 +3869,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Kişi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>Üye rolü "%@" olarak değiştirilecektir. Ve tüm grup üyeleri bilgilendirilecektir.</target>
@@ -3908,8 +3912,17 @@ Bu senin grup için bağlantın %@!</target>
<target>Mesaj taslağı</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<target>Mesaj kuyruğu bilgisi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
@@ -3927,6 +3940,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Mesaj tepkileri bu grupta yasaklandı.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Mesaj yönlendirme yedeklemesi</target>
@@ -3950,10 +3967,6 @@ Bu senin grup için bağlantın %@!</target>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Mesaj yazısı</target>
@@ -4222,6 +4235,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Cihaz tokeni yok!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Filtrelenmiş sohbetler yok</target>
@@ -4469,6 +4486,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Diğer</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING sayısı</target>
@@ -4635,6 +4656,10 @@ Hata: %@</target>
<target>Lütfen parolayı güvenli bir şekilde saklayın, kaybederseniz parolayı DEĞİŞTİREMEZSİNİZ.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Lehçe arayüz</target>
@@ -4704,6 +4729,10 @@ Hata: %@</target>
<target>Gizli yönlendirme</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil ve sunucu bağlantıları</target>
@@ -5611,6 +5640,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>Sunucu adresi ağ ayarlarıyla uyumlu değil.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Sunucunun sıra oluşturması için yetki gereklidir, şifreyi kontrol edin</target>
@@ -5635,6 +5668,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>Sunucu sürümü ağ ayarlarıyla uyumlu değil.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Sunucular</target>
@@ -7799,6 +7836,10 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>iOS Anahtar Zinciri, uygulamayı yeniden başlattıktan veya parolayı değiştirdikten sonra parolayı güvenli bir şekilde saklamak için kullanılacaktır - anlık bildirimlerin alınmasına izin verecektir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>kişi bağlantı linki aracılığıyla gizli</target>
@@ -8083,6 +8124,9 @@ SimpleX sunucuları profilinizi göremez.</target>
<source>server queue info: %1$@
last received msg: %2$@</source>
<target>sunucu kuyruk bilgisi: %1$@
son alınan msj: %2$@</target>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
@@ -127,11 +127,6 @@
<target>%@ перевірено</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ сервери</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<target>%@ завантажено</target>
@@ -590,6 +585,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>Додайте адресу до свого профілю, щоб ваші контакти могли поділитися нею з іншими людьми. Повідомлення про оновлення профілю буде надіслано вашим контактам.</target>
@@ -610,16 +609,16 @@
<target>Додати профіль</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>Додати сервер</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>Додайте сервери, відсканувавши QR-код.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>Додати сервер…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>Додати до іншого пристрою</target>
@@ -1354,6 +1353,10 @@
<target>Налаштування серверів ICE</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>Підтвердити</target>
@@ -1533,10 +1536,6 @@ This is your own one-time link!</source>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>Контакт дозволяє</target>
@@ -1837,6 +1836,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Debug delivery" xml:space="preserve">
<source>Debug delivery</source>
<target>Доставка налагодження</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Decentralized" xml:space="preserve">
@@ -3869,6 +3869,10 @@ This is your link for group %@!</source>
<target>Учасник</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>Роль учасника буде змінено на "%@". Всі учасники групи будуть повідомлені про це.</target>
@@ -3908,8 +3912,17 @@ This is your link for group %@!</source>
<target>Чернетка повідомлення</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<target>Інформація про чергу повідомлень</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions" xml:space="preserve">
@@ -3927,6 +3940,10 @@ This is your link for group %@!</source>
<target>Реакції на повідомлення в цій групі заборонені.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Запасний варіант маршрутизації повідомлень</target>
@@ -3950,10 +3967,6 @@ This is your link for group %@!</source>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Текст повідомлення</target>
@@ -4222,6 +4235,10 @@ This is your link for group %@!</source>
<target>Токен пристрою відсутній!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Немає фільтрованих чатів</target>
@@ -4469,6 +4486,10 @@ This is your link for group %@!</source>
<target>Інше</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>Кількість PING</target>
@@ -4635,6 +4656,10 @@ Error: %@</source>
<target>Будь ласка, зберігайте пароль надійно, ви НЕ зможете змінити його, якщо втратите.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>Польський інтерфейс</target>
@@ -4704,6 +4729,10 @@ Error: %@</source>
<target>Приватна маршрутизація</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>З'єднання профілю та сервера</target>
@@ -5611,6 +5640,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>Адреса сервера несумісна з налаштуваннями мережі.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Сервер вимагає авторизації для створення черг, перевірте пароль</target>
@@ -5635,6 +5668,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>Серверна версія несумісна з мережевими налаштуваннями.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Сервери</target>
@@ -7799,6 +7836,10 @@ SimpleX servers cannot see your profile.</source>
<target>Пароль бази даних буде безпечно збережено в iOS Keychain після запуску чату або зміни пароля - це дасть змогу отримувати миттєві повідомлення.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>інкогніто за посиланням на контактну адресу</target>
@@ -8083,6 +8124,9 @@ SimpleX servers cannot see your profile.</source>
<source>server queue info: %1$@
last received msg: %2$@</source>
<target>інформація про чергу на сервері: %1$@
останнє отримане повідомлення: %2$@</target>
<note>queue info</note>
</trans-unit>
<trans-unit id="set new contact address" xml:space="preserve">
@@ -126,11 +126,6 @@
<target>%@ 已认证</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ servers" xml:space="preserve">
<source>%@ servers</source>
<target>%@ 服务器</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
<source>%@ uploaded</source>
<note>No comment provided by engineer.</note>
@@ -578,6 +573,10 @@
<source>Acknowledgement errors</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Active connections" xml:space="preserve">
<source>Active connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." xml:space="preserve">
<source>Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts.</source>
<target>将地址添加到您的个人资料,以便您的联系人可以与其他人共享。个人资料更新将发送给您的联系人。</target>
@@ -598,16 +597,16 @@
<target>添加个人资料</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve">
<source>Add server</source>
<target>添加服务器</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add servers by scanning QR codes." xml:space="preserve">
<source>Add servers by scanning QR codes.</source>
<target>扫描二维码来添加服务器。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server…" xml:space="preserve">
<source>Add server…</source>
<target>添加服务器…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve">
<source>Add to another device</source>
<target>添加另一设备</target>
@@ -1337,6 +1336,10 @@
<target>配置 ICE 服务器</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Configured %@ servers" xml:space="preserve">
<source>Configured %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm" xml:space="preserve">
<source>Confirm</source>
<target>确认</target>
@@ -1509,10 +1512,6 @@ This is your own one-time link!</source>
<source>Connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connections subscribed" xml:space="preserve">
<source>Connections subscribed</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact allows" xml:space="preserve">
<source>Contact allows</source>
<target>联系人允许</target>
@@ -3819,6 +3818,10 @@ This is your link for group %@!</source>
<target>成员</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Member inactive" xml:space="preserve">
<source>Member inactive</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Member role will be changed to &quot;%@&quot;. All group members will be notified." xml:space="preserve">
<source>Member role will be changed to "%@". All group members will be notified.</source>
<target>成员角色将更改为 "%@"。所有群成员将收到通知。</target>
@@ -3857,6 +3860,14 @@ This is your link for group %@!</source>
<target>消息草稿</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message forwarded" xml:space="preserve">
<source>Message forwarded</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message may be delivered later if member becomes active." xml:space="preserve">
<source>Message may be delivered later if member becomes active.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Message queue info" xml:space="preserve">
<source>Message queue info</source>
<note>No comment provided by engineer.</note>
@@ -3876,6 +3887,10 @@ This is your link for group %@!</source>
<target>该群组禁用了消息回应。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reception" xml:space="preserve">
<source>Message reception</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
@@ -3897,10 +3912,6 @@ This is your link for group %@!</source>
<source>Message status: %@</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Message subscriptions" xml:space="preserve">
<source>Message subscriptions</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>消息正文</target>
@@ -4165,6 +4176,10 @@ This is your link for group %@!</source>
<target>无设备令牌!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No direct connection yet, message is forwarded by admin." xml:space="preserve">
<source>No direct connection yet, message is forwarded by admin.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>无过滤聊天</target>
@@ -4410,6 +4425,10 @@ This is your link for group %@!</source>
<target>其他</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Other %@ servers" xml:space="preserve">
<source>Other %@ servers</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
<source>PING count</source>
<target>PING 次数</target>
@@ -4573,6 +4592,10 @@ Error: %@</source>
<target>请安全地保存密码,如果您丢失了密码,您将无法更改它。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please try later." xml:space="preserve">
<source>Please try later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Polish interface" xml:space="preserve">
<source>Polish interface</source>
<target>波兰语界面</target>
@@ -4639,6 +4662,10 @@ Error: %@</source>
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>资料和服务器连接</target>
@@ -5535,6 +5562,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings: %@." xml:space="preserve">
<source>Server address is incompatible with network settings: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>服务器需要授权才能创建队列,检查密码</target>
@@ -5558,6 +5589,10 @@ Enable in *Network &amp; servers* settings.</source>
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Server version is incompatible with your app: %@." xml:space="preserve">
<source>Server version is incompatible with your app: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>服务器</target>
@@ -7696,6 +7731,10 @@ SimpleX 服务器无法看到您的资料。</target>
<target>在您重启应用或改变密码后,iOS钥匙串将被用来安全地存储密码——它将允许接收推送通知。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="inactive" xml:space="preserve">
<source>inactive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>通过联系人地址链接隐身聊天</target>
@@ -358,9 +358,9 @@
<target state="translated">使用二維碼掃描以新增伺服器。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add server" xml:space="preserve" approved="no">
<source>Add server</source>
<target state="translated">新增伺服器</target>
<trans-unit id="Add server" xml:space="preserve" approved="no">
<source>Add server</source>
<target state="translated">新增伺服器</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Add to another device" xml:space="preserve" approved="no">
+51 -35
View File
@@ -100,7 +100,6 @@
5CB924D727A8563F00ACCCDD /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924D627A8563F00ACCCDD /* SettingsView.swift */; };
5CB924E127A867BA00ACCCDD /* UserProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924E027A867BA00ACCCDD /* UserProfile.swift */; };
5CB9250D27A9432000ACCCDD /* ChatListNavLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB9250C27A9432000ACCCDD /* ChatListNavLink.swift */; };
5CBD285A295711D700EC2CF4 /* ImageUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBD2859295711D700EC2CF4 /* ImageUtils.swift */; };
5CBD285C29575B8E00EC2CF4 /* WhatsNewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBD285B29575B8E00EC2CF4 /* WhatsNewView.swift */; };
5CBE6C12294487F7002D9531 /* VerifyCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBE6C11294487F7002D9531 /* VerifyCodeView.swift */; };
5CBE6C142944CC12002D9531 /* ScanCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBE6C132944CC12002D9531 /* ScanCodeView.swift */; };
@@ -200,6 +199,8 @@
8C9BC2652C240D5200875A27 /* ThemeModeEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C9BC2642C240D5100875A27 /* ThemeModeEditor.swift */; };
8CC4ED902BD7B8530078AEE8 /* CallAudioDeviceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CC4ED8F2BD7B8530078AEE8 /* CallAudioDeviceManager.swift */; };
8CC956EE2BC0041000412A11 /* NetworkObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CC956ED2BC0041000412A11 /* NetworkObserver.swift */; };
CE38A29A2C3FCA54005ED185 /* ImageUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBD2859295711D700EC2CF4 /* ImageUtils.swift */; };
CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */ = {isa = PBXBuildFile; productRef = CE38A29B2C3FCD72005ED185 /* SwiftyGif */; };
CE984D4B2C36C5D500E3AEFF /* ChatItemClipShape.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE984D4A2C36C5D500E3AEFF /* ChatItemClipShape.swift */; };
CEEA861D2C2ABCB50084E1EA /* ReverseList.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEA861C2C2ABCB50084E1EA /* ReverseList.swift */; };
D7197A1829AE89660055C05A /* WebRTC in Frameworks */ = {isa = PBXBuildFile; productRef = D7197A1729AE89660055C05A /* WebRTC */; };
@@ -208,11 +209,12 @@
D741547A29AF90B00022400A /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D741547929AF90B00022400A /* PushKit.framework */; };
D77B92DC2952372200A5A1CC /* SwiftyGif in Frameworks */ = {isa = PBXBuildFile; productRef = D77B92DB2952372200A5A1CC /* SwiftyGif */; };
D7F0E33929964E7E0068AF69 /* LZString in Frameworks */ = {isa = PBXBuildFile; productRef = D7F0E33829964E7E0068AF69 /* LZString */; };
E52FF8DA2C34676700BF81EB /* libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E52FF8D52C34676600BF81EB /* libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7-ghc9.6.3.a */; };
E52FF8DB2C34676700BF81EB /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E52FF8D62C34676600BF81EB /* libgmpxx.a */; };
E52FF8DC2C34676700BF81EB /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E52FF8D72C34676700BF81EB /* libffi.a */; };
E52FF8DD2C34676700BF81EB /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E52FF8D82C34676700BF81EB /* libgmp.a */; };
E52FF8DE2C34676700BF81EB /* libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E52FF8D92C34676700BF81EB /* libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7.a */; };
E50581002C3DDD7F009C3F71 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E50580FB2C3DDD7F009C3F71 /* libffi.a */; };
E50581012C3DDD7F009C3F71 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E50580FC2C3DDD7F009C3F71 /* libgmp.a */; };
E50581022C3DDD7F009C3F71 /* libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E50580FD2C3DDD7F009C3F71 /* libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN-ghc9.6.3.a */; };
E50581032C3DDD7F009C3F71 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E50580FE2C3DDD7F009C3F71 /* libgmpxx.a */; };
E50581042C3DDD7F009C3F71 /* libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E50580FF2C3DDD7F009C3F71 /* libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN.a */; };
E50581062C3DDD9D009C3F71 /* Yams in Frameworks */ = {isa = PBXBuildFile; productRef = E50581052C3DDD9D009C3F71 /* Yams */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -518,11 +520,11 @@
D741547729AF89AF0022400A /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/System/Library/Frameworks/StoreKit.framework; sourceTree = DEVELOPER_DIR; };
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; };
E52FF8D52C34676600BF81EB /* libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7-ghc9.6.3.a"; sourceTree = "<group>"; };
E52FF8D62C34676600BF81EB /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
E52FF8D72C34676700BF81EB /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
E52FF8D82C34676700BF81EB /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
E52FF8D92C34676700BF81EB /* libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7.a"; sourceTree = "<group>"; };
E50580FB2C3DDD7F009C3F71 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
E50580FC2C3DDD7F009C3F71 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
E50580FD2C3DDD7F009C3F71 /* libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN-ghc9.6.3.a"; sourceTree = "<group>"; };
E50580FE2C3DDD7F009C3F71 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
E50580FF2C3DDD7F009C3F71 /* libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN.a"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -561,13 +563,15 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E52FF8DE2C34676700BF81EB /* libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7.a in Frameworks */,
E52FF8DB2C34676700BF81EB /* libgmpxx.a in Frameworks */,
E50581032C3DDD7F009C3F71 /* libgmpxx.a in Frameworks */,
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
E50581002C3DDD7F009C3F71 /* libffi.a in Frameworks */,
E50581012C3DDD7F009C3F71 /* libgmp.a in Frameworks */,
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
E52FF8DC2C34676700BF81EB /* libffi.a in Frameworks */,
E52FF8DD2C34676700BF81EB /* libgmp.a in Frameworks */,
E52FF8DA2C34676700BF81EB /* libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7-ghc9.6.3.a in Frameworks */,
E50581022C3DDD7F009C3F71 /* libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN-ghc9.6.3.a in Frameworks */,
E50581062C3DDD9D009C3F71 /* Yams in Frameworks */,
E50581042C3DDD7F009C3F71 /* libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN.a in Frameworks */,
CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -634,11 +638,11 @@
5C764E5C279C70B7000C6508 /* Libraries */ = {
isa = PBXGroup;
children = (
E52FF8D72C34676700BF81EB /* libffi.a */,
E52FF8D82C34676700BF81EB /* libgmp.a */,
E52FF8D62C34676600BF81EB /* libgmpxx.a */,
E52FF8D52C34676600BF81EB /* libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7-ghc9.6.3.a */,
E52FF8D92C34676700BF81EB /* libHSsimplex-chat-5.8.2.0-D50x9PQRTdqAAO9AQK2dA7.a */,
E50580FB2C3DDD7F009C3F71 /* libffi.a */,
E50580FC2C3DDD7F009C3F71 /* libgmp.a */,
E50580FE2C3DDD7F009C3F71 /* libgmpxx.a */,
E50580FD2C3DDD7F009C3F71 /* libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN-ghc9.6.3.a */,
E50580FF2C3DDD7F009C3F71 /* libHSsimplex-chat-6.0.0.0-IhofDzGnTMcDdW5i3Fb7xN.a */,
);
path = Libraries;
sourceTree = "<group>";
@@ -666,7 +670,6 @@
5CF937212B25034A00E1D781 /* NSESubscriber.swift */,
5CB346E82869E8BA001FD2EF /* PushEnvironment.swift */,
5C93293E2928E0FD0090FFF9 /* AudioRecPlay.swift */,
5CBD2859295711D700EC2CF4 /* ImageUtils.swift */,
8CC956ED2BC0041000412A11 /* NetworkObserver.swift */,
);
path = Model;
@@ -866,6 +869,7 @@
5C9FD96A27A56D4D0075386C /* JSON.swift */,
5CDCAD7D2818941F00503DA2 /* API.swift */,
5CDCAD80281A7E2700503DA2 /* Notifications.swift */,
5CBD2859295711D700EC2CF4 /* ImageUtils.swift */,
64DAE1502809D9F5000DA960 /* FileUtils.swift */,
5C9D81182AA7A4F1001D49FD /* CryptoFile.swift */,
5C00168028C4FE760094D739 /* KeyChain.swift */,
@@ -1075,6 +1079,8 @@
);
name = SimpleXChat;
packageProductDependencies = (
E50581052C3DDD9D009C3F71 /* Yams */,
CE38A29B2C3FCD72005ED185 /* SwiftyGif */,
);
productName = SimpleXChat;
productReference = 5CE2BA682845308900EC33A6 /* SimpleXChat.framework */;
@@ -1212,7 +1218,6 @@
6432857C2925443C00FBE5C8 /* GroupPreferencesView.swift in Sources */,
5C93293129239BED0090FFF9 /* ProtocolServerView.swift in Sources */,
5C9CC7AD28C55D7800BEF955 /* DatabaseEncryptionView.swift in Sources */,
5CBD285A295711D700EC2CF4 /* ImageUtils.swift in Sources */,
8C74C3EC2C1B92A900039E77 /* Theme.swift in Sources */,
6419EC562AB8BC8B004A607A /* ContextInvitingContactMemberView.swift in Sources */,
5CE4407927ADB701007B033A /* EmojiItemView.swift in Sources */,
@@ -1383,6 +1388,7 @@
5CE2BA90284533A300EC33A6 /* JSON.swift in Sources */,
5CE2BA8B284533A300EC33A6 /* ChatTypes.swift in Sources */,
5CE2BA8F284533A300EC33A6 /* APITypes.swift in Sources */,
CE38A29A2C3FCA54005ED185 /* ImageUtils.swift in Sources */,
5C9D811A2AA8727A001D49FD /* CryptoFile.swift in Sources */,
5CE2BA8C284533A300EC33A6 /* AppGroup.swift in Sources */,
8C74C3E52C1B900600039E77 /* ThemeTypes.swift in Sources */,
@@ -1622,7 +1628,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 226;
CURRENT_PROJECT_VERSION = 227;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1647,7 +1653,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES_THIN;
MARKETING_VERSION = 5.8.2;
MARKETING_VERSION = 6.0;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1671,7 +1677,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 226;
CURRENT_PROJECT_VERSION = 227;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1696,7 +1702,7 @@
"@executable_path/Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 5.8.2;
MARKETING_VERSION = 6.0;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1757,7 +1763,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 226;
CURRENT_PROJECT_VERSION = 227;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GCC_OPTIMIZATION_LEVEL = s;
@@ -1772,7 +1778,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 5.8.2;
MARKETING_VERSION = 6.0;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1794,7 +1800,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 226;
CURRENT_PROJECT_VERSION = 227;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_CODE_COVERAGE = NO;
@@ -1809,7 +1815,7 @@
"@executable_path/../../Frameworks",
);
LLVM_LTO = YES;
MARKETING_VERSION = 5.8.2;
MARKETING_VERSION = 6.0;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1831,7 +1837,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 226;
CURRENT_PROJECT_VERSION = 227;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -1857,7 +1863,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
MARKETING_VERSION = 5.8.2;
MARKETING_VERSION = 6.0;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -1882,7 +1888,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 226;
CURRENT_PROJECT_VERSION = 227;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -1908,7 +1914,7 @@
"$(PROJECT_DIR)/Libraries/sim",
);
LLVM_LTO = YES;
MARKETING_VERSION = 5.8.2;
MARKETING_VERSION = 6.0;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -2030,6 +2036,11 @@
package = 8C73C1162C21E17B00892670 /* XCRemoteSwiftPackageReference "Yams" */;
productName = Yams;
};
CE38A29B2C3FCD72005ED185 /* SwiftyGif */ = {
isa = XCSwiftPackageProductDependency;
package = D77B92DA2952372200A5A1CC /* XCRemoteSwiftPackageReference "SwiftyGif" */;
productName = SwiftyGif;
};
D7197A1729AE89660055C05A /* WebRTC */ = {
isa = XCSwiftPackageProductDependency;
package = D7197A1629AE89660055C05A /* XCRemoteSwiftPackageReference "WebRTC" */;
@@ -2045,6 +2056,11 @@
package = D7F0E33729964E7D0068AF69 /* XCRemoteSwiftPackageReference "lzstring-swift" */;
productName = LZString;
};
E50581052C3DDD9D009C3F71 /* Yams */ = {
isa = XCSwiftPackageProductDependency;
package = 8C73C1162C21E17B00892670 /* XCRemoteSwiftPackageReference "Yams" */;
productName = Yams;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 5CA059BE279559F40002BEB4 /* Project object */;
+26 -14
View File
@@ -1122,20 +1122,20 @@ public struct ProtoServersConfig: Codable {
public struct UserProtoServers: Decodable {
public var serverProtocol: ServerProtocol
public var protoServers: [ServerCfg]
public var presetServers: [String]
public var presetServers: [ServerCfg]
}
public struct ServerCfg: Identifiable, Equatable, Codable {
public struct ServerCfg: Identifiable, Equatable, Codable, Hashable {
public var server: String
public var preset: Bool
public var tested: Bool?
public var enabled: ServerEnabled
public var enabled: Bool
var createdAt = Date()
// public var sendEnabled: Bool // can we potentially want to prevent sending on the servers we use to receive?
// Even if we don't see the use case, it's probably better to allow it in the model
// In any case, "trusted/known" servers are out of scope of this change
public init(server: String, preset: Bool, tested: Bool?, enabled: ServerEnabled) {
public init(server: String, preset: Bool, tested: Bool?, enabled: Bool) {
self.server = server
self.preset = preset
self.tested = tested
@@ -1148,7 +1148,7 @@ public struct ServerCfg: Identifiable, Equatable, Codable {
public var id: String { "\(server) \(createdAt)" }
public static var empty = ServerCfg(server: "", preset: false, tested: nil, enabled: .enabled)
public static var empty = ServerCfg(server: "", preset: false, tested: nil, enabled: false)
public var isEmpty: Bool {
server.trimmingCharacters(in: .whitespaces) == ""
@@ -1165,19 +1165,19 @@ public struct ServerCfg: Identifiable, Equatable, Codable {
server: "smp://abcd@smp8.simplex.im",
preset: true,
tested: true,
enabled: .enabled
enabled: true
),
custom: ServerCfg(
server: "smp://abcd@smp9.simplex.im",
preset: false,
tested: false,
enabled: .disabled
enabled: false
),
untested: ServerCfg(
server: "smp://abcd@smp10.simplex.im",
preset: false,
tested: nil,
enabled: .enabled
enabled: true
)
)
@@ -1189,12 +1189,6 @@ public struct ServerCfg: Identifiable, Equatable, Codable {
}
}
public enum ServerEnabled: String, Codable {
case disabled
case enabled
case known
}
public enum ProtocolTestStep: String, Decodable, Equatable {
case connect
case disconnect
@@ -1906,6 +1900,7 @@ public enum AgentErrorType: Decodable, Hashable {
case SMP(smpErr: ProtocolErrorType)
case NTF(ntfErr: ProtocolErrorType)
case XFTP(xftpErr: XFTPErrorType)
case PROXY(proxyServer: String, relayServer: String, proxyErr: ProxyClientError)
case RCP(rcpErr: RCErrorType)
case BROKER(brokerAddress: String, brokerErr: BrokerErrorType)
case AGENT(agentErr: SMPAgentError)
@@ -1943,13 +1938,23 @@ public enum ProtocolErrorType: Decodable, Hashable {
case BLOCK
case SESSION
case CMD(cmdErr: ProtocolCommandError)
indirect case PROXY(proxyErr: ProxyError)
case AUTH
case CRYPTO
case QUOTA
case NO_MSG
case LARGE_MSG
case EXPIRED
case INTERNAL
}
public enum ProxyError: Decodable, Hashable {
case PROTOCOL(protocolErr: ProtocolErrorType)
case BROKER(brokerErr: BrokerErrorType)
case BASIC_AUTH
case NO_SESSION
}
public enum XFTPErrorType: Decodable, Hashable {
case BLOCK
case SESSION
@@ -1967,6 +1972,12 @@ public enum XFTPErrorType: Decodable, Hashable {
case INTERNAL
}
public enum ProxyClientError: Decodable, Hashable {
case protocolError(protocolErr: ProtocolErrorType)
case unexpectedResponse(responseStr: String)
case responseError(responseErr: ProtocolErrorType)
}
public enum RCErrorType: Decodable, Hashable {
case `internal`(internalErr: String)
case identity
@@ -1996,6 +2007,7 @@ public enum ProtocolCommandError: Decodable, Hashable {
public enum ProtocolTransportError: Decodable, Hashable {
case badBlock
case version
case largeMsg
case badSession
case noServerAuth
+65 -3
View File
@@ -1611,11 +1611,12 @@ public struct Connection: Decodable, Hashable {
public var pqSndEnabled: Bool?
public var pqRcvEnabled: Bool?
public var authErrCounter: Int
public var quotaErrCounter: Int
public var connectionStats: ConnectionStats? = nil
private enum CodingKeys: String, CodingKey {
case connId, agentConnId, peerChatVRange, connStatus, connLevel, viaGroupLink, customUserProfileId, connectionCode, pqSupport, pqEncryption, pqSndEnabled, pqRcvEnabled, authErrCounter
case connId, agentConnId, peerChatVRange, connStatus, connLevel, viaGroupLink, customUserProfileId, connectionCode, pqSupport, pqEncryption, pqSndEnabled, pqRcvEnabled, authErrCounter, quotaErrCounter
}
public var id: ChatId { get { ":\(connId)" } }
@@ -1624,6 +1625,10 @@ public struct Connection: Decodable, Hashable {
authErrCounter >= 10 // authErrDisableCount in core
}
public var connInactive: Bool {
quotaErrCounter >= 5 // quotaErrInactiveCount in core
}
public var connPQEnabled: Bool {
pqSndEnabled == true && pqRcvEnabled == true
}
@@ -1637,7 +1642,8 @@ public struct Connection: Decodable, Hashable {
viaGroupLink: false,
pqSupport: false,
pqEncryption: false,
authErrCounter: 0
authErrCounter: 0,
quotaErrCounter: 0
)
}
@@ -2846,6 +2852,62 @@ public enum SndCIStatusProgress: String, Decodable, Hashable {
case complete
}
public enum GroupSndStatus: Decodable, Hashable {
case new
case forwarded
case inactive
case sent
case rcvd(msgRcptStatus: MsgReceiptStatus)
case error(agentError: SndError)
case warning(agentError: SndError)
case invalid(text: String)
public func statusIcon(_ metaColor: Color/* = .secondary*/, _ primaryColor: Color = .accentColor) -> (String, Color) {
switch self {
case .new: return ("ellipsis", metaColor)
case .forwarded: return ("chevron.forward.2", metaColor)
case .inactive: return ("person.badge.minus", metaColor)
case .sent: return ("checkmark", metaColor)
case let .rcvd(msgRcptStatus):
switch msgRcptStatus {
case .ok: return ("checkmark", metaColor)
case .badMsgHash: return ("checkmark", .red)
}
case .error: return ("multiply", .red)
case .warning: return ("exclamationmark.triangle.fill", .orange)
case .invalid: return ("questionmark", metaColor)
}
}
public var statusInfo: (String, String)? {
switch self {
case .new: return nil
case .forwarded: return (
NSLocalizedString("Message forwarded", comment: "item status text"),
NSLocalizedString("No direct connection yet, message is forwarded by admin.", comment: "item status description")
)
case .inactive: return (
NSLocalizedString("Member inactive", comment: "item status text"),
NSLocalizedString("Message may be delivered later if member becomes active.", comment: "item status description")
)
case .sent: return nil
case .rcvd: return nil
case let .error(agentError): return (
NSLocalizedString("Message delivery error", comment: "item status text"),
agentError.errorInfo
)
case let .warning(agentError): return (
NSLocalizedString("Message delivery warning", comment: "item status text"),
agentError.errorInfo
)
case let .invalid(text): return (
NSLocalizedString("Invalid status", comment: "item status text"),
text
)
}
}
}
public enum CIDeleted: Decodable, Hashable {
case deleted(deletedTs: Date?)
case blocked(deletedTs: Date?)
@@ -4012,6 +4074,6 @@ public struct ChatItemVersion: Decodable, Hashable {
public struct MemberDeliveryStatus: Decodable, Hashable {
public var groupMemberId: Int64
public var memberDeliveryStatus: CIStatus
public var memberDeliveryStatus: GroupSndStatus
public var sentViaProxy: Bool?
}
@@ -7,18 +7,18 @@
//
import Foundation
import SimpleXChat
import SwiftUI
import AVKit
import SwiftyGif
func getLoadedFileSource(_ file: CIFile?) -> CryptoFile? {
public func getLoadedFileSource(_ file: CIFile?) -> CryptoFile? {
if let file = file, file.loaded {
return file.fileSource
}
return nil
}
func getLoadedImage(_ file: CIFile?) -> UIImage? {
public func getLoadedImage(_ file: CIFile?) -> UIImage? {
if let fileSource = getLoadedFileSource(file) {
let filePath = getAppFilePath(fileSource.filePath)
do {
@@ -37,7 +37,7 @@ func getLoadedImage(_ file: CIFile?) -> UIImage? {
return nil
}
func getFileData(_ path: URL, _ cfArgs: CryptoFileArgs?) throws -> Data {
public func getFileData(_ path: URL, _ cfArgs: CryptoFileArgs?) throws -> Data {
if let cfArgs = cfArgs {
return try readCryptoFile(path: path.path, cryptoArgs: cfArgs)
} else {
@@ -45,7 +45,7 @@ func getFileData(_ path: URL, _ cfArgs: CryptoFileArgs?) throws -> Data {
}
}
func getLoadedVideo(_ file: CIFile?) -> URL? {
public func getLoadedVideo(_ file: CIFile?) -> URL? {
if let fileSource = getLoadedFileSource(file) {
let filePath = getAppFilePath(fileSource.filePath)
if FileManager.default.fileExists(atPath: filePath.path) {
@@ -55,13 +55,13 @@ func getLoadedVideo(_ file: CIFile?) -> URL? {
return nil
}
func saveAnimImage(_ image: UIImage) -> CryptoFile? {
public func saveAnimImage(_ image: UIImage) -> CryptoFile? {
let fileName = generateNewFileName("IMG", "gif")
guard let imageData = image.imageData else { return nil }
return saveFile(imageData, fileName, encrypted: privacyEncryptLocalFilesGroupDefault.get())
}
func saveImage(_ uiImage: UIImage) -> CryptoFile? {
public func saveImage(_ uiImage: UIImage) -> CryptoFile? {
let hasAlpha = imageHasAlpha(uiImage)
let ext = hasAlpha ? "png" : "jpg"
if let imageDataResized = resizeImageToDataSize(uiImage, maxDataSize: MAX_IMAGE_SIZE, hasAlpha: hasAlpha) {
@@ -71,7 +71,7 @@ func saveImage(_ uiImage: UIImage) -> CryptoFile? {
return nil
}
func cropToSquare(_ image: UIImage) -> UIImage {
public func cropToSquare(_ image: UIImage) -> UIImage {
let size = image.size
let side = min(size.width, size.height)
let newSize = CGSize(width: side, height: side)
@@ -84,7 +84,7 @@ func cropToSquare(_ image: UIImage) -> UIImage {
return resizeImage(image, newBounds: CGRect(origin: .zero, size: newSize), drawIn: CGRect(origin: origin, size: size), hasAlpha: imageHasAlpha(image))
}
func resizeImageToDataSize(_ image: UIImage, maxDataSize: Int64, hasAlpha: Bool) -> Data? {
public func resizeImageToDataSize(_ image: UIImage, maxDataSize: Int64, hasAlpha: Bool) -> Data? {
var img = image
var data = hasAlpha ? img.pngData() : img.jpegData(compressionQuality: 0.85)
var dataSize = data?.count ?? 0
@@ -99,7 +99,7 @@ func resizeImageToDataSize(_ image: UIImage, maxDataSize: Int64, hasAlpha: Bool)
return data
}
func resizeImageToStrSize(_ image: UIImage, maxDataSize: Int64) -> String? {
public func resizeImageToStrSize(_ image: UIImage, maxDataSize: Int64) -> String? {
var img = image
let hasAlpha = imageHasAlpha(image)
var str = compressImageStr(img, hasAlpha: hasAlpha)
@@ -115,7 +115,7 @@ func resizeImageToStrSize(_ image: UIImage, maxDataSize: Int64) -> String? {
return str
}
func compressImageStr(_ image: UIImage, _ compressionQuality: CGFloat = 0.85, hasAlpha: Bool) -> String? {
public func compressImageStr(_ image: UIImage, _ compressionQuality: CGFloat = 0.85, hasAlpha: Bool) -> String? {
let ext = hasAlpha ? "png" : "jpg"
if let data = hasAlpha ? image.pngData() : image.jpegData(compressionQuality: compressionQuality) {
return "data:image/\(ext);base64,\(data.base64EncodedString())"
@@ -138,7 +138,7 @@ private func resizeImage(_ image: UIImage, newBounds: CGRect, drawIn: CGRect, ha
}
}
func imageHasAlpha(_ img: UIImage) -> Bool {
public func imageHasAlpha(_ img: UIImage) -> Bool {
if let cgImage = img.cgImage {
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue)
@@ -158,7 +158,7 @@ func imageHasAlpha(_ img: UIImage) -> Bool {
return false
}
func saveFileFromURL(_ url: URL) -> CryptoFile? {
public func saveFileFromURL(_ url: URL) -> CryptoFile? {
let encrypted = privacyEncryptLocalFilesGroupDefault.get()
let savedFile: CryptoFile?
if url.startAccessingSecurityScopedResource() {
@@ -184,7 +184,7 @@ func saveFileFromURL(_ url: URL) -> CryptoFile? {
return savedFile
}
func moveTempFileFromURL(_ url: URL) -> CryptoFile? {
public func moveTempFileFromURL(_ url: URL) -> CryptoFile? {
do {
let encrypted = privacyEncryptLocalFilesGroupDefault.get()
let fileName = uniqueCombine(url.lastPathComponent)
@@ -197,7 +197,6 @@ func moveTempFileFromURL(_ url: URL) -> CryptoFile? {
try FileManager.default.moveItem(at: url, to: getAppFilePath(fileName))
savedFile = CryptoFile.plain(fileName)
}
ChatModel.shared.filesToDelete.remove(url)
return savedFile
} catch {
logger.error("ImageUtils.moveTempFileFromURL error: \(error.localizedDescription)")
@@ -205,7 +204,7 @@ func moveTempFileFromURL(_ url: URL) -> CryptoFile? {
}
}
func saveWallpaperFile(url: URL) -> String? {
public func saveWallpaperFile(url: URL) -> String? {
let destFile = URL(fileURLWithPath: generateNewFileName(getWallpaperDirectory().path + "/" + "wallpaper", "jpg", fullPath: true))
do {
try FileManager.default.copyItem(atPath: url.path, toPath: destFile.path)
@@ -216,7 +215,7 @@ func saveWallpaperFile(url: URL) -> String? {
}
}
func saveWallpaperFile(image: UIImage) -> String? {
public func saveWallpaperFile(image: UIImage) -> String? {
let hasAlpha = imageHasAlpha(image)
let destFile = URL(fileURLWithPath: generateNewFileName(getWallpaperDirectory().path + "/" + "wallpaper", hasAlpha ? "png" : "jpg", fullPath: true))
let dataResized = resizeImageToDataSize(image, maxDataSize: 5_000_000, hasAlpha: hasAlpha)
@@ -229,7 +228,7 @@ func saveWallpaperFile(image: UIImage) -> String? {
}
}
func removeWallpaperFile(fileName: String? = nil) {
public func removeWallpaperFile(fileName: String? = nil) {
do {
try FileManager.default.contentsOfDirectory(atPath: getWallpaperDirectory().path).forEach {
if URL(fileURLWithPath: $0).lastPathComponent == fileName { try FileManager.default.removeItem(atPath: $0) }
@@ -242,7 +241,7 @@ func removeWallpaperFile(fileName: String? = nil) {
}
}
func generateNewFileName(_ prefix: String, _ ext: String, fullPath: Bool = false) -> String {
public func generateNewFileName(_ prefix: String, _ ext: String, fullPath: Bool = false) -> String {
uniqueCombine("\(prefix)_\(getTimestamp()).\(ext)", fullPath: fullPath)
}
@@ -274,7 +273,7 @@ private func getTimestamp() -> String {
return df.string(from: Date())
}
func dropImagePrefix(_ s: String) -> String {
public func dropImagePrefix(_ s: String) -> String {
dropPrefix(dropPrefix(s, "data:image/png;base64,"), "data:image/jpg;base64,")
}
@@ -283,7 +282,7 @@ private func dropPrefix(_ s: String, _ prefix: String) -> String {
}
extension AVAsset {
func generatePreview() -> (UIImage, Int)? {
public func generatePreview() -> (UIImage, Int)? {
let generator = AVAssetImageGenerator(asset: self)
generator.appliesPreferredTrackTransform = true
var actualTime = CMTimeMake(value: 0, timescale: 0)
@@ -295,7 +294,7 @@ extension AVAsset {
}
extension UIImage {
func replaceColor(_ from: UIColor, _ to: UIColor) -> UIImage {
public func replaceColor(_ from: UIColor, _ to: UIColor) -> UIImage {
if let cgImage = cgImage {
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue)
@@ -340,4 +339,12 @@ extension UIImage {
}
return self
}
public convenience init?(base64Encoded: String?) {
if let base64Encoded, let data = Data(base64Encoded: dropImagePrefix(base64Encoded)) {
self.init(data: data)
} else {
return nil
}
}
}
+5 -13
View File
@@ -337,9 +337,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "по-горе, след това избери:";
/* No comment provided by engineer. */
"Accent color" = "Основен цвят";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Приеми";
@@ -369,7 +366,7 @@
"Add profile" = "Добави профил";
/* No comment provided by engineer. */
"Add server" = "Добави сървър";
"Add server" = "Добави сървър";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Добави сървъри чрез сканиране на QR кодове.";
@@ -647,7 +644,7 @@
/* rcv group event chat item */
"blocked %@" = "блокиран %@";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "блокиран от админ";
/* No comment provided by engineer. */
@@ -831,9 +828,6 @@
/* No comment provided by engineer. */
"colored" = "цветен";
/* No comment provided by engineer. */
"Colors" = "Цветове";
/* server test step */
"Compare file" = "Сравни файл";
@@ -1011,7 +1005,7 @@
/* No comment provided by engineer. */
"Continue" = "Продължи";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Копирай";
/* No comment provided by engineer. */
@@ -1779,7 +1773,8 @@
/* No comment provided by engineer. */
"Error: " = "Грешка: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Грешка: %@";
/* No comment provided by engineer. */
@@ -3791,9 +3786,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "Текстът, който поставихте, не е SimpleX линк за връзка.";
/* No comment provided by engineer. */
"Theme" = "Тема";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Тези настройки са за текущия ви профил **%@**.";
+4 -12
View File
@@ -289,9 +289,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "výše, pak vyberte:";
/* No comment provided by engineer. */
"Accent color" = "Zbarvení";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Přijmout";
@@ -318,7 +315,7 @@
"Add profile" = "Přidat profil";
/* No comment provided by engineer. */
"Add server" = "Přidat server";
"Add server" = "Přidat server";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Přidejte servery skenováním QR kódů.";
@@ -678,9 +675,6 @@
/* No comment provided by engineer. */
"colored" = "barevné";
/* No comment provided by engineer. */
"Colors" = "Barvy";
/* server test step */
"Compare file" = "Porovnat soubor";
@@ -813,7 +807,7 @@
/* No comment provided by engineer. */
"Continue" = "Pokračovat";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Kopírovat";
/* No comment provided by engineer. */
@@ -1461,7 +1455,8 @@
/* No comment provided by engineer. */
"Error: " = "Chyba: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Chyba: %@";
/* No comment provided by engineer. */
@@ -3095,9 +3090,6 @@
/* No comment provided by engineer. */
"The servers for new connections of your current chat profile **%@**." = "Servery pro nová připojení vašeho aktuálního chat profilu **%@**.";
/* No comment provided by engineer. */
"Theme" = "Téma";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Toto nastavení je pro váš aktuální profil **%@**.";
+16 -15
View File
@@ -337,9 +337,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "Danach die gewünschte Aktion auswählen:";
/* No comment provided by engineer. */
"Accent color" = "Akzentfarbe";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Annehmen";
@@ -369,7 +366,7 @@
"Add profile" = "Profil hinzufügen";
/* No comment provided by engineer. */
"Add server" = "Füge Server hinzu";
"Add server" = "Füge Server hinzu";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Fügen Sie Server durch Scannen der QR Codes hinzu.";
@@ -653,7 +650,7 @@
/* rcv group event chat item */
"blocked %@" = "%@ wurde blockiert";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "wurde vom Administrator blockiert";
/* No comment provided by engineer. */
@@ -726,7 +723,7 @@
"Capacity exceeded - recipient did not receive previously sent messages." = "Kapazität überschritten - der Empfänger hat die zuvor gesendeten Nachrichten nicht empfangen.";
/* No comment provided by engineer. */
"Cellular" = "Zellulär";
"Cellular" = "Mobilfunknetz";
/* No comment provided by engineer. */
"Change" = "Ändern";
@@ -840,9 +837,6 @@
/* No comment provided by engineer. */
"colored" = "farbig";
/* No comment provided by engineer. */
"Colors" = "Farben";
/* server test step */
"Compare file" = "Datei vergleichen";
@@ -1023,7 +1017,7 @@
/* No comment provided by engineer. */
"Continue" = "Weiter";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Kopieren";
/* No comment provided by engineer. */
@@ -1167,6 +1161,9 @@
/* time unit */
"days" = "Tage";
/* No comment provided by engineer. */
"Debug delivery" = "Debugging-Zustellung";
/* No comment provided by engineer. */
"Decentralized" = "Dezentral";
@@ -1800,7 +1797,8 @@
/* No comment provided by engineer. */
"Error: " = "Fehler: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Fehler: %@";
/* No comment provided by engineer. */
@@ -2496,6 +2494,9 @@
/* No comment provided by engineer. */
"Message draft" = "Nachrichtenentwurf";
/* No comment provided by engineer. */
"Message queue info" = "Nachrichten-Warteschlangen-Information";
/* chat feature */
"Message reactions" = "Reaktionen auf Nachrichten";
@@ -3060,7 +3061,7 @@
"Protect your chat profiles with a password!" = "Ihre Chat-Profile mit einem Passwort schützen!";
/* No comment provided by engineer. */
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Schützen Sie Ihre IP-Adresse vor den Nachrichten-Relais , die Ihre Kontakte ausgewählt haben.\nAktivieren Sie es in den *Netzwerk & Server* Einstellungen.";
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Schützen Sie Ihre IP-Adresse vor den Nachrichten-Relais, die Ihre Kontakte ausgewählt haben.\nAktivieren Sie es in den *Netzwerk & Server* Einstellungen.";
/* No comment provided by engineer. */
"Protocol timeout" = "Protokollzeitüberschreitung";
@@ -3518,6 +3519,9 @@
/* srv error text. */
"Server address is incompatible with network settings." = "Die Server-Adresse ist nicht mit den Netzwerk-Einstellungen kompatibel.";
/* queue info */
"server queue info: %@\n\nlast received msg: %@" = "Server-Warteschlangen-Information: %1$@\n\nZuletzt empfangene Nachricht: %2$@";
/* server test error */
"Server requires authorization to create queues, check password" = "Um Warteschlangen zu erzeugen benötigt der Server eine Authentifizierung. Bitte überprüfen Sie das Passwort";
@@ -3872,9 +3876,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "Der von Ihnen eingefügte Text ist kein SimpleX-Link.";
/* No comment provided by engineer. */
"Theme" = "Design";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Diese Einstellungen betreffen Ihr aktuelles Profil **%@**.";
+41 -40
View File
@@ -337,9 +337,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "y después elige:";
/* No comment provided by engineer. */
"Accent color" = "Color";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Aceptar";
@@ -369,7 +366,7 @@
"Add profile" = "Añadir perfil";
/* No comment provided by engineer. */
"Add server" = "Añadir servidor";
"Add server" = "Añadir servidor";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Añadir servidores mediante el escaneo de códigos QR.";
@@ -653,7 +650,7 @@
/* rcv group event chat item */
"blocked %@" = "ha bloqueado a %@";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "bloqueado por administrador";
/* No comment provided by engineer. */
@@ -840,9 +837,6 @@
/* No comment provided by engineer. */
"colored" = "coloreado";
/* No comment provided by engineer. */
"Colors" = "Colores";
/* server test step */
"Compare file" = "Comparar archivo";
@@ -967,7 +961,7 @@
"Connection error" = "Error conexión";
/* No comment provided by engineer. */
"Connection error (AUTH)" = "Error conexión (Autenticación)";
"Connection error (AUTH)" = "Error de conexión (Autenticación)";
/* chat list item title (it should not be shown */
"connection established" = "conexión establecida";
@@ -979,7 +973,7 @@
"Connection terminated" = "Conexión finalizada";
/* No comment provided by engineer. */
"Connection timeout" = "Tiempo de conexión expirado";
"Connection timeout" = "Tiempo de conexión agotado";
/* connection information */
"connection:%@" = "conexión: % @";
@@ -1023,7 +1017,7 @@
/* No comment provided by engineer. */
"Continue" = "Continuar";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Copiar";
/* No comment provided by engineer. */
@@ -1167,6 +1161,9 @@
/* time unit */
"days" = "días";
/* No comment provided by engineer. */
"Debug delivery" = "Informe debug";
/* No comment provided by engineer. */
"Decentralized" = "Descentralizada";
@@ -1800,7 +1797,8 @@
/* No comment provided by engineer. */
"Error: " = "Error: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Error: %@";
/* No comment provided by engineer. */
@@ -2101,7 +2099,7 @@
"ICE servers (one per line)" = "Servidores ICE (uno por línea)";
/* No comment provided by engineer. */
"If you can't meet in person, show QR code in a video call, or share the link." = "Si no puedes reunirte en persona, muestra el código QR por videollamada, o comparte el enlace.";
"If you can't meet in person, show QR code in a video call, or share the link." = "Si no puedes reunirte en persona, muestra el código QR por videollamada o comparte el enlace.";
/* No comment provided by engineer. */
"If you enter this passcode when opening the app, all app data will be irreversibly removed!" = "¡Si introduces este código al abrir la aplicación, todos los datos de la misma se eliminarán de forma irreversible!";
@@ -2496,6 +2494,9 @@
/* No comment provided by engineer. */
"Message draft" = "Borrador de mensaje";
/* No comment provided by engineer. */
"Message queue info" = "Información cola de mensajes";
/* chat feature */
"Message reactions" = "Reacciones a mensajes";
@@ -2766,7 +2767,7 @@
"on" = "Activado";
/* No comment provided by engineer. */
"One-time invitation link" = "Enlace único de invitación de un uso";
"One-time invitation link" = "Enlace de invitación de un solo uso";
/* No comment provided by engineer. */
"Onion hosts will be required for connection. Requires enabling VPN." = "Se requieren hosts .onion para la conexión. Requiere activación de la VPN.";
@@ -2850,13 +2851,13 @@
"Or paste archive link" = "O pegar enlace del archivo";
/* No comment provided by engineer. */
"Or scan QR code" = "O escanear código QR";
"Or scan QR code" = "O escanea el código QR";
/* No comment provided by engineer. */
"Or securely share this file link" = "O comparte de forma segura este enlace al archivo";
/* No comment provided by engineer. */
"Or show this code" = "O mostrar este código";
"Or show this code" = "O muestra este código QR";
/* No comment provided by engineer. */
"Other" = "Otro";
@@ -2898,7 +2899,7 @@
"Paste link to connect!" = "Pegar enlace para conectar!";
/* No comment provided by engineer. */
"Paste the link you received" = "Pegar el enlace recibido";
"Paste the link you received" = "Pega el enlace recibido";
/* No comment provided by engineer. */
"peer-to-peer" = "p2p";
@@ -2907,7 +2908,7 @@
"People can connect to you only via the links you share." = "Las personas pueden conectarse contigo solo mediante los enlaces que compartes.";
/* No comment provided by engineer. */
"Periodically" = "Periódico";
"Periodically" = "Periódicamente";
/* message decrypt error item */
"Permanent decryption error" = "Error permanente descifrado";
@@ -3063,10 +3064,10 @@
"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Protege tu dirección IP de los servidores de retransmisión elegidos por tus contactos.\nActívalo en ajustes de *Servidores y Redes*.";
/* No comment provided by engineer. */
"Protocol timeout" = "Tiempo de espera del protocolo";
"Protocol timeout" = "Timeout protocolo";
/* No comment provided by engineer. */
"Protocol timeout per KB" = "Límite de espera del protocolo por KB";
"Protocol timeout per KB" = "Timeout protocolo por KB";
/* No comment provided by engineer. */
"Push notifications" = "Notificaciones automáticas";
@@ -3090,22 +3091,22 @@
"Read" = "Leer";
/* No comment provided by engineer. */
"Read more" = "Saber más";
"Read more" = "Conoce más";
/* No comment provided by engineer. */
"Read more in [User Guide](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address)." = "Saber más en el [Manual del Usuario](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address).";
"Read more in [User Guide](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address)." = "Conoce más en el [Manual del Usuario](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address).";
/* No comment provided by engineer. */
"Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode)." = "Saber más en [Guía de Usuario](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).";
"Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode)." = "Conoce más en la [Guía del Usuario](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).";
/* No comment provided by engineer. */
"Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends)." = "Saber más en el [Manual del Usuario](https://simplex.chat/docs/guide/readme.html#connect-to-friends).";
"Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends)." = "Conoce más en el [Manual del Usuario](https://simplex.chat/docs/guide/readme.html#connect-to-friends).";
/* No comment provided by engineer. */
"Read more in our [GitHub repository](https://github.com/simplex-chat/simplex-chat#readme)." = "Saber más en nuestro [repositorio GitHub](https://github.com/simplex-chat/simplex-chat#readme).";
"Read more in our [GitHub repository](https://github.com/simplex-chat/simplex-chat#readme)." = "Conoce más en nuestro [repositorio GitHub](https://github.com/simplex-chat/simplex-chat#readme).";
/* No comment provided by engineer. */
"Read more in our GitHub repository." = "Saber más en nuestro repositorio GitHub.";
"Read more in our GitHub repository." = "Conoce más en nuestro repositorio GitHub.";
/* No comment provided by engineer. */
"Receipts are disabled" = "Las confirmaciones están desactivadas";
@@ -3518,6 +3519,9 @@
/* srv error text. */
"Server address is incompatible with network settings." = "La dirección del servidor es incompatible con la configuración de la red.";
/* queue info */
"server queue info: %@\n\nlast received msg: %@" = "información cola del servidor: %1$@\n\núltimo mensaje recibido: %2$@";
/* server test error */
"Server requires authorization to create queues, check password" = "El servidor requiere autorización para crear colas, comprueba la contraseña";
@@ -3591,7 +3595,7 @@
"Share link" = "Compartir enlace";
/* No comment provided by engineer. */
"Share this 1-time invite link" = "Compartir este enlace de un uso";
"Share this 1-time invite link" = "Comparte este enlace de un solo uso";
/* No comment provided by engineer. */
"Share with contacts" = "Compartir con contactos";
@@ -3771,7 +3775,7 @@
"Tap to join incognito" = "Pulsa para unirte en modo incógnito";
/* No comment provided by engineer. */
"Tap to paste link" = "Pulsa para pegar enlace";
"Tap to paste link" = "Pulsa para pegar el enlacePulsa para pegar enlace";
/* No comment provided by engineer. */
"Tap to scan" = "Pulsa para escanear";
@@ -3780,7 +3784,7 @@
"Tap to start a new chat" = "Pulsa para iniciar chat nuevo";
/* No comment provided by engineer. */
"TCP connection timeout" = "Tiempo de espera de la conexión TCP agotado";
"TCP connection timeout" = "Timeout de la conexión TCP";
/* No comment provided by engineer. */
"TCP_KEEPCNT" = "TCP_KEEPCNT";
@@ -3872,9 +3876,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "El texto pegado no es un enlace SimpleX.";
/* No comment provided by engineer. */
"Theme" = "Tema";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Esta configuración afecta a tu perfil actual **%@**.";
@@ -3942,7 +3943,7 @@
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Para proteger tu información, activa el Bloqueo SimpleX.\nSe te pedirá que completes la autenticación antes de activar esta función.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Para proteger tu dirección IP, el enrutamiento privado usa tus servidores SMP para enviar mensajes.";
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Para proteger tu dirección IP, el enrutamiento privado usa tu lista de servidores SMP para enviar mensajes.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Para grabar el mensaje de voz concede permiso para usar el micrófono.";
@@ -4029,7 +4030,7 @@
"Unknown error" = "Error desconocido";
/* No comment provided by engineer. */
"unknown relays" = "servidor de retransmisión desconocido";
"unknown relays" = "con servidores desconocidos";
/* No comment provided by engineer. */
"Unknown servers!" = "¡Servidores desconocidos!";
@@ -4041,7 +4042,7 @@
"Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." = "A menos que utilices la interfaz de llamadas de iOS, activa el modo No molestar para evitar interrupciones.";
/* 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." = "A menos que tu contacto haya eliminado la conexión o\nque este enlace ya se haya usado, podría ser un error. Por favor, notifícalo.\nPara conectarte, pide a tu contacto que cree otro enlace de conexión y comprueba que tienes buena conexión de red.";
"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." = "A menos que tu contacto haya eliminado la conexión o el enlace haya sido usado, podría ser un error. Por favor, notifícalo.\nPara conectarte pide a tu contacto que cree otro enlace y comprueba la conexión de red.";
/* No comment provided by engineer. */
"Unlink" = "Desenlazar";
@@ -4059,7 +4060,7 @@
"Unmute" = "Activar audio";
/* No comment provided by engineer. */
"unprotected" = "desprotegido";
"unprotected" = "con IP desprotegida";
/* No comment provided by engineer. */
"Unread" = "No leído";
@@ -4131,10 +4132,10 @@
"Use only local notifications?" = "¿Usar sólo notificaciones locales?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Usar enrutamiento privado con servidores desconocidos cuando la dirección IP no está protegida.";
"Use private routing with unknown servers when IP address is not protected." = "Usar enrutamiento privado con servidores desconocidos cuando tu dirección IP no está protegida.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Usar enrutamiento privado con servidores desconocidos.";
"Use private routing with unknown servers." = "Usar enrutamiento privado con servidores de retransmisión desconocidos.";
/* No comment provided by engineer. */
"Use server" = "Usar servidor";
@@ -4524,7 +4525,7 @@
"You will be connected when your contact's device is online, please wait or check later!" = "Te conectarás cuando el dispositivo del contacto esté en línea, por favor espera o compruébalo más tarde.";
/* No comment provided by engineer. */
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Se te pedirá identificarte cuándo inicies o continues usando la aplicación tras 30 segundos en segundo plano.";
"You will be required to authenticate when you start or resume the app after 30 seconds in background." = "Se te pedirá autenticarte cuando inicies la aplicación o sigas usándola tras 30 segundos en segundo plano.";
/* No comment provided by engineer. */
"You will connect to all group members." = "Te conectarás con todos los miembros del grupo.";
@@ -4596,7 +4597,7 @@
"Your profile **%@** will be shared." = "Tu perfil **%@** será compartido.";
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Tu perfil se almacena en tu dispositivo y sólo se comparte con tus contactos.\nLos servidores de 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.";
+4 -12
View File
@@ -280,9 +280,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "edellä, valitse sitten:";
/* No comment provided by engineer. */
"Accent color" = "Korostusväri";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Hyväksy";
@@ -309,7 +306,7 @@
"Add profile" = "Lisää profiili";
/* No comment provided by engineer. */
"Add server" = "Lisää palvelin";
"Add server" = "Lisää palvelin";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Lisää palvelimia skannaamalla QR-koodeja.";
@@ -663,9 +660,6 @@
/* No comment provided by engineer. */
"colored" = "värillinen";
/* No comment provided by engineer. */
"Colors" = "Värit";
/* server test step */
"Compare file" = "Vertaa tiedostoa";
@@ -795,7 +789,7 @@
/* No comment provided by engineer. */
"Continue" = "Jatka";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Kopioi";
/* No comment provided by engineer. */
@@ -1434,7 +1428,8 @@
/* No comment provided by engineer. */
"Error: " = "Virhe: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Virhe: %@";
/* No comment provided by engineer. */
@@ -3056,9 +3051,6 @@
/* No comment provided by engineer. */
"The servers for new connections of your current chat profile **%@**." = "Palvelimet nykyisen keskusteluprofiilisi uusille yhteyksille **%@**.";
/* No comment provided by engineer. */
"Theme" = "Teema";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Nämä asetukset koskevat nykyistä profiiliasi **%@**.";
+14 -13
View File
@@ -337,9 +337,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "ci-dessus, puis choisissez:";
/* No comment provided by engineer. */
"Accent color" = "Couleur principale";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Accepter";
@@ -369,7 +366,7 @@
"Add profile" = "Ajouter un profil";
/* No comment provided by engineer. */
"Add server" = "Ajouter un serveur";
"Add server" = "Ajouter un serveur";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Ajoutez des serveurs en scannant des codes QR.";
@@ -653,7 +650,7 @@
/* rcv group event chat item */
"blocked %@" = "%@ bloqué";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "bloqué par l'administrateur";
/* No comment provided by engineer. */
@@ -840,9 +837,6 @@
/* No comment provided by engineer. */
"colored" = "coloré";
/* No comment provided by engineer. */
"Colors" = "Couleurs";
/* server test step */
"Compare file" = "Comparer le fichier";
@@ -1023,7 +1017,7 @@
/* No comment provided by engineer. */
"Continue" = "Continuer";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Copier";
/* No comment provided by engineer. */
@@ -1167,6 +1161,9 @@
/* time unit */
"days" = "jours";
/* No comment provided by engineer. */
"Debug delivery" = "Livraison de débogage";
/* No comment provided by engineer. */
"Decentralized" = "Décentralisé";
@@ -1800,7 +1797,8 @@
/* No comment provided by engineer. */
"Error: " = "Erreur : ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Erreur: %@";
/* No comment provided by engineer. */
@@ -2496,6 +2494,9 @@
/* No comment provided by engineer. */
"Message draft" = "Brouillon de message";
/* No comment provided by engineer. */
"Message queue info" = "Informations sur la file d'attente des messages";
/* chat feature */
"Message reactions" = "Réactions aux messages";
@@ -3518,6 +3519,9 @@
/* srv error text. */
"Server address is incompatible with network settings." = "L'adresse du serveur est incompatible avec les paramètres du réseau.";
/* queue info */
"server queue info: %@\n\nlast received msg: %@" = "info sur la file d'attente du serveur: %1$@\n\ndernier message reçu: %2$@";
/* server test error */
"Server requires authorization to create queues, check password" = "Le serveur requiert une autorisation pour créer des files d'attente, vérifiez le mot de passe";
@@ -3872,9 +3876,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "Le texte collé n'est pas un lien SimpleX.";
/* No comment provided by engineer. */
"Theme" = "Thème";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Ces paramètres s'appliquent à votre profil actuel **%@**.";
+78 -77
View File
@@ -266,7 +266,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</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~";
@@ -326,20 +326,17 @@
"Abort changing address?" = "Címváltoztatás megszakítása??";
/* No comment provided by engineer. */
"About SimpleX" = "A SimpleX névjegye";
"About SimpleX" = "A SimpleX-ről";
/* No comment provided by engineer. */
"About SimpleX address" = "A SimpleX azonosítóról";
"About SimpleX address" = "A SimpleX címről";
/* No comment provided by engineer. */
"About SimpleX Chat" = "A SimpleX Chat névjegye";
"About SimpleX Chat" = "A SimpleX Chat-ről";
/* No comment provided by engineer. */
"above, then choose:" = "gombra fent, majd válassza ki:";
/* No comment provided by engineer. */
"Accent color" = "Kiemelő szín";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Elfogadás";
@@ -357,7 +354,7 @@
"accepted call" = "elfogadott hívás";
/* No comment provided by engineer. */
"Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." = "Azonosító hozzáadása a profilhoz, hogy az ismerősei megoszthassák másokkal. A profilfrissítés elküldésre kerül az ismerősei számára.";
"Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." = "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ősei számára.";
/* No comment provided by engineer. */
"Add contact" = "Ismerős hozzáadása";
@@ -369,7 +366,7 @@
"Add profile" = "Profil hozzáadása";
/* No comment provided by engineer. */
"Add server" = "Kiszolgáló hozzáadása";
"Add server" = "Kiszolgáló hozzáadása";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Kiszolgáló hozzáadása QR-kód beolvasásával.";
@@ -462,7 +459,7 @@
"Allow message reactions." = "Üzenetreakciók engedélyezése.";
/* No comment provided by engineer. */
"Allow sending direct messages to members." = "Közvetlen üzenetek küldésének engedélyezése a tagok számára.";
"Allow sending direct messages to members." = "A közvetlen üzenetek küldése a tagok között engedélyezve van.";
/* No comment provided by engineer. */
"Allow sending disappearing messages." = "Az eltűnő üzenetek küldése engedélyezve van.";
@@ -522,7 +519,7 @@
"An empty chat profile with the provided name is created, and the app opens as usual." = "Egy üres csevegési profil jön létre a megadott névvel, és az alkalmazás a szokásos módon megnyílik.";
/* No comment provided by engineer. */
"and %lld other events" = "és %lld további esemény";
"and %lld other events" = "és további %lld esemény";
/* No comment provided by engineer. */
"Answer call" = "Hívás fogadása";
@@ -609,7 +606,7 @@
"Back" = "Vissza";
/* No comment provided by engineer. */
"Bad desktop address" = "Hibás számítógép azonosító";
"Bad desktop address" = "Hibás számítógép cím";
/* integrity error chat item */
"bad message hash" = "téves üzenet hash";
@@ -633,7 +630,7 @@
"Block" = "Blokkolás";
/* No comment provided by engineer. */
"Block for all" = "Mindenki számára letiltva";
"Block for all" = "Letiltás mindenki számára";
/* No comment provided by engineer. */
"Block group members" = "Csoporttagok blokkolása";
@@ -651,9 +648,9 @@
"blocked" = "blokkolva";
/* rcv group event chat item */
"blocked %@" = "%@ letiltva";
"blocked %@" = "letiltotta őt: %@";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "letiltva az admin által";
/* No comment provided by engineer. */
@@ -699,7 +696,7 @@
"Calls" = "Hívások";
/* No comment provided by engineer. */
"Camera not available" = "A fényképező nem elérhető";
"Camera not available" = "A kamera nem elérhető";
/* No comment provided by engineer. */
"Can't invite contact!" = "Ismerősök meghívása le van tiltva!";
@@ -769,10 +766,10 @@
"changed your role to %@" = "megváltoztatta a szerepkörét erre: %@";
/* chat item text */
"changing address for %@…" = "cím módosítása %@ számára…";
"changing address for %@…" = "cím megváltoztatása nála: %@…";
/* chat item text */
"changing address…" = "azonosító megváltoztatása…";
"changing address…" = "cím megváltoztatása…";
/* No comment provided by engineer. */
"Chat archive" = "Csevegési archívum";
@@ -840,9 +837,6 @@
/* No comment provided by engineer. */
"colored" = "színes";
/* No comment provided by engineer. */
"Colors" = "Színek";
/* server test step */
"Compare file" = "Fájl összehasonlítás";
@@ -904,10 +898,10 @@
"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 a SimpleX azonosítója!";
"Connect to yourself?\nThis is your own SimpleX address!" = "Kapcsolódás saját magához?\nEz az ön SimpleX címe!";
/* No comment provided by engineer. */
"Connect via contact address" = "Kapcsolódás a kapcsolattartási azonosítón keresztül";
"Connect via contact address" = "Kapcsolódás a kapcsolattartási címen keresztül";
/* No comment provided by engineer. */
"Connect via link" = "Kapcsolódás egy hivatkozáson keresztül";
@@ -1023,7 +1017,7 @@
/* No comment provided by engineer. */
"Continue" = "Folytatás";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Másolás";
/* No comment provided by engineer. */
@@ -1039,7 +1033,7 @@
"Create a group using a random profile." = "Csoport létrehozása véletlenszerűen létrehozott profillal.";
/* No comment provided by engineer. */
"Create an address to let people connect with you." = "Azonosító létrehozása, hogy az emberek kapcsolatba léphessenek önnel.";
"Create an address to let people connect with you." = "Cím létrehozása, hogy az emberek kapcsolatba léphessenek önnel.";
/* server test step */
"Create file" = "Fájl létrehozása";
@@ -1066,7 +1060,7 @@
"Create secret group" = "Titkos csoport létrehozása";
/* No comment provided by engineer. */
"Create SimpleX address" = "SimpleX azonosító létrehozása";
"Create SimpleX address" = "SimpleX cím létrehozása";
/* No comment provided by engineer. */
"Create your profile" = "Saját profil létrehozása";
@@ -1167,6 +1161,9 @@
/* time unit */
"days" = "nap";
/* No comment provided by engineer. */
"Debug delivery" = "Kézbesítési hibák felderítése";
/* No comment provided by engineer. */
"Decentralized" = "Decentralizált";
@@ -1189,10 +1186,10 @@
"Delete %lld messages?" = "Töröl %lld üzenetet?";
/* No comment provided by engineer. */
"Delete address" = "Azonosító törlése";
"Delete address" = "Cím törlése";
/* No comment provided by engineer. */
"Delete address?" = "Azonosító törlése?";
"Delete address?" = "Cím törlése?";
/* No comment provided by engineer. */
"Delete after" = "Törlés ennyi idő után";
@@ -1324,7 +1321,7 @@
"Description" = "Leírás";
/* No comment provided by engineer. */
"Desktop address" = "Számítógép azonosítója";
"Desktop address" = "Számítógép címe";
/* No comment provided by engineer. */
"Desktop app version %@ is not compatible with this app." = "Az asztali kliens verziója %@ nem kompatibilis ezzel az alkalmazással.";
@@ -1423,7 +1420,7 @@
"Do NOT use SimpleX for emergency calls." = "NE használja a SimpleX-et segélyhívásokhoz.";
/* No comment provided by engineer. */
"Don't create address" = "Ne hozzon létre azonosítót";
"Don't create address" = "Ne hozzon létre címet";
/* No comment provided by engineer. */
"Don't enable" = "Ne engedélyezze";
@@ -1453,7 +1450,7 @@
"Duplicate display name!" = "Duplikált megjelenítési név!";
/* integrity error chat item */
"duplicate message" = "duplikálódott üzenet";
"duplicate message" = "duplikált üzenet";
/* No comment provided by engineer. */
"Duration" = "Időtartam";
@@ -1507,7 +1504,7 @@
"Enable SimpleX Lock" = "SimpleX zárolás engedélyezése";
/* No comment provided by engineer. */
"Enable TCP keep-alive" = "TCP életben tartásának engedélyezése";
"Enable TCP keep-alive" = "TCP életben tartása";
/* enabled status */
"enabled" = "engedélyezve";
@@ -1633,7 +1630,7 @@
"Error" = "Hiba";
/* No comment provided by engineer. */
"Error aborting address change" = "Hiba az azonosító megváltoztatásának megszakításakor";
"Error aborting address change" = "Hiba a cím megváltoztatásának megszakításakor";
/* No comment provided by engineer. */
"Error accepting contact request" = "Hiba történt a kapcsolatfelvételi kérelem elfogadásakor";
@@ -1645,7 +1642,7 @@
"Error adding member(s)" = "Hiba a tag(-ok) hozzáadásakor";
/* No comment provided by engineer. */
"Error changing address" = "Hiba az azonosító megváltoztatásakor";
"Error changing address" = "Hiba a cím megváltoztatásakor";
/* No comment provided by engineer. */
"Error changing role" = "Hiba a szerepkör megváltoztatásakor";
@@ -1654,7 +1651,7 @@
"Error changing setting" = "Hiba a beállítás megváltoztatásakor";
/* No comment provided by engineer. */
"Error creating address" = "Hiba az azonosító létrehozásakor";
"Error creating address" = "Hiba a cím létrehozásakor";
/* No comment provided by engineer. */
"Error creating group" = "Hiba a csoport létrehozásakor";
@@ -1735,7 +1732,7 @@
"Error saving %@ servers" = "Hiba történt a %@ kiszolgálók mentése közben";
/* No comment provided by engineer. */
"Error saving group profile" = "Hiba a csoport profil mentésekor";
"Error saving group profile" = "Hiba a csoportprofil mentésekor";
/* No comment provided by engineer. */
"Error saving ICE servers" = "Hiba az ICE kiszolgálók mentésekor";
@@ -1800,7 +1797,8 @@
/* No comment provided by engineer. */
"Error: " = "Hiba: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Hiba: %@";
/* No comment provided by engineer. */
@@ -2029,13 +2027,13 @@
"Group preferences" = "Csoport beállítások";
/* No comment provided by engineer. */
"Group profile" = "Csoport profil";
"Group profile" = "Csoportprofil";
/* No comment provided by engineer. */
"Group profile is stored on members' devices, not on the servers." = "A csoport profilja a tagok eszközein tárolódik, nem a kiszolgálókon.";
/* snd group event chat item */
"group profile updated" = "csoport profil frissítve";
"group profile updated" = "csoportprofil frissítve";
/* No comment provided by engineer. */
"Group welcome message" = "Csoport üdvözlő üzenete";
@@ -2437,10 +2435,10 @@
"Make profile private!" = "Tegye priváttá a profilját!";
/* No comment provided by engineer. */
"Make sure %@ server addresses are in correct format, line separated and are not duplicated (%@)." = "Győződjön meg arról, hogy a %@ kiszolgálócímek megfelelő formátumúak, sorszeparáltak és nem duplikáltak (%@).";
"Make sure %@ server addresses are in correct format, line separated and are not duplicated (%@)." = "Győződjön meg arról, hogy a %@ kiszolgálócímek megfelelő formátumúak, sorszeparáltak és nincsenek duplikálva (%@).";
/* No comment provided by engineer. */
"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 nem duplikáltak.";
"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-nek nincsenek felhasználói azonosítói, akkor hogyan tud üzeneteket kézbesíteni?*";
@@ -2476,10 +2474,10 @@
"member connected" = "kapcsolódott";
/* No comment provided by engineer. */
"Member role will be changed to \"%@\". All group members will be notified." = "A tag szerepköre meg fog változni erre: \"%@\". A csoport minden tagja értesítést kap róla.";
"Member role will be changed to \"%@\". All group members will be notified." = "A tag szerepköre meg fog változni erre: „%@”. A csoport minden tagja értesítést kap róla.";
/* No comment provided by engineer. */
"Member role will be changed to \"%@\". The member will receive a new invitation." = "A tag szerepköre meg fog változni erre: \"%@\". A tag új meghívást fog kapni.";
"Member role will be changed to \"%@\". The member will receive a new invitation." = "A tag szerepköre meg fog változni erre: „%@”. A tag új meghívást fog kapni.";
/* No comment provided by engineer. */
"Member will be removed from group - this cannot be undone!" = "A tag eltávolítása a csoportból - ez a művelet nem vonható vissza!";
@@ -2496,6 +2494,9 @@
/* No comment provided by engineer. */
"Message draft" = "Üzenetvázlat";
/* No comment provided by engineer. */
"Message queue info" = "Üzenet-várakoztatási információ";
/* chat feature */
"Message reactions" = "Üzenetreakciók";
@@ -2731,7 +2732,7 @@
"Notifications are disabled!" = "Az értesítések le vannak tiltva!";
/* No comment provided by engineer. */
"Now admins can:\n- delete members' messages.\n- disable members (\"observer\" role)" = "Most már az adminok is:\n- törölhetik a tagok üzeneteit.\n- letilthatnak tagokat (\"megfigyelő\" szerepkör)";
"Now admins can:\n- delete members' messages.\n- disable members (\"observer\" role)" = "Most már az adminok is:\n- törölhetik a tagok üzeneteit.\n- letilthatnak tagokat (megfigyelő szerepkör)";
/* member role */
"observer" = "megfigyelő";
@@ -2739,7 +2740,7 @@
/* enabled status
group pref value
time to disappear */
"off" = "ki";
"off" = "kikapcsolva";
/* No comment provided by engineer. */
"Off" = "Ki";
@@ -2886,10 +2887,10 @@
"Password to show" = "Jelszó megjelenítése";
/* past/unknown group member */
"Past member %@" = "Korábbi csoport tag %@";
"Past member %@" = "Már nem tag - %@";
/* No comment provided by engineer. */
"Paste desktop address" = "Számítógép azonosítójának beillesztése";
"Paste desktop address" = "Számítógép címének beillesztése";
/* No comment provided by engineer. */
"Paste image" = "Kép beillesztése";
@@ -3036,7 +3037,7 @@
"Prohibit messages reactions." = "Az üzenetreakciók tiltása.";
/* No comment provided by engineer. */
"Prohibit sending direct messages to members." = "A közvetlen üzenetek küldése le van tiltva a tagok között.";
"Prohibit sending direct messages to members." = "A közvetlen üzenetek küldése a tagok között le van tiltva.";
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Az eltűnő üzenetek küldése le van tiltva.";
@@ -3054,7 +3055,7 @@
"Protect app screen" = "Alkalmazás képernyőjének védelme";
/* No comment provided by engineer. */
"Protect IP address" = "Az IP-cím védelme";
"Protect IP address" = "IP-cím védelem";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "Csevegési profiljok védelme jelszóval!";
@@ -3174,10 +3175,10 @@
"rejected call" = "elutasított hívás";
/* No comment provided by engineer. */
"Relay server is only used if necessary. Another party can observe your IP address." = "Az átjátszó kiszolgáló csak szükség esetén kerül használatra. Egy másik fél megfigyelheti az IP-címét.";
"Relay server is only used if necessary. Another party can observe your IP address." = "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.";
/* No comment provided by engineer. */
"Relay server protects your IP address, but it can observe the duration of the call." = "Az átjátszó kiszolgáló megvédi IP-címét, de megfigyelheti a hívás időtartamát.";
"Relay server protects your IP address, but it can observe the duration of the call." = "Az átjátszó kiszolgáló megvédi az IP-címet, de megfigyelheti a hívás időtartamát.";
/* No comment provided by engineer. */
"Remove" = "Eltávolítás";
@@ -3198,7 +3199,7 @@
"removed %@" = "%@ eltávolítva";
/* profile update event chat item */
"removed contact address" = "törölt kapcsolattartási azonosító";
"removed contact address" = "törölt kapcsolattartási cím";
/* profile update event chat item */
"removed profile picture" = "törölt profilkép";
@@ -3270,7 +3271,7 @@
"Reveal" = "Felfedés";
/* No comment provided by engineer. */
"Revert" = "Visszaállít";
"Revert" = "Visszaállítás";
/* No comment provided by engineer. */
"Revoke" = "Visszavonás";
@@ -3306,7 +3307,7 @@
"Save and notify group members" = "Mentés és a csoporttagok értesítése";
/* No comment provided by engineer. */
"Save and update group profile" = "Mentés és a csoport profil frissítése";
"Save and update group profile" = "Mentés és csoportprofil frissítése";
/* No comment provided by engineer. */
"Save archive" = "Archívum mentése";
@@ -3315,7 +3316,7 @@
"Save auto-accept settings" = "Automatikus elfogadási beállítások mentése";
/* No comment provided by engineer. */
"Save group profile" = "Csoport profil elmentése";
"Save group profile" = "Csoportprofil elmentése";
/* No comment provided by engineer. */
"Save passphrase and open chat" = "Jelmondat elmentése és csevegés megnyitása";
@@ -3518,6 +3519,9 @@
/* srv error text. */
"Server address is incompatible with network settings." = "A kiszolgáló címe nem kompatibilis a hálózati beállításokkal.";
/* queue info */
"server queue info: %@\n\nlast received msg: %@" = "kiszolgáló üzenet-várakotatási információ: %1$@\n\nutoljára fogadott üzenet: %2$@";
/* server test error */
"Server requires authorization to create queues, check password" = "A kiszolgálónak engedélyre van szüksége a várólisták létrehozásához, ellenőrizze jelszavát";
@@ -3549,10 +3553,10 @@
"Set it instead of system authentication." = "Rendszerhitelesítés helyetti beállítás.";
/* profile update event chat item */
"set new contact address" = "új kapcsolattartási azonosító beállítása";
"set new contact address" = "új kapcsolattartási cím beállítása";
/* profile update event chat item */
"set new profile picture" = "új profilkép beállítása";
"set new profile picture" = "új profilképet állított be";
/* No comment provided by engineer. */
"Set passcode" = "Jelkód beállítása";
@@ -3582,10 +3586,10 @@
"Share 1-time link" = "Egyszer használatos hivatkozás megosztása";
/* No comment provided by engineer. */
"Share address" = "Azonosító megosztása";
"Share address" = "Cím megosztása";
/* No comment provided by engineer. */
"Share address with contacts?" = "Megosztja az azonosítót az ismerőseivel?";
"Share address with contacts?" = "Megosztja a címet az ismerőseivel?";
/* No comment provided by engineer. */
"Share link" = "Hivatkozás megosztása";
@@ -3621,16 +3625,16 @@
"Show:" = "Megjelenítés:";
/* No comment provided by engineer. */
"SimpleX address" = "SimpleX azonosító";
"SimpleX address" = "SimpleX cím";
/* No comment provided by engineer. */
"SimpleX Address" = "SimpleX azonosító";
"SimpleX Address" = "SimpleX cím";
/* No comment provided by engineer. */
"SimpleX Chat security was audited by Trail of Bits." = "A SimpleX Chat biztonsága a Trail of Bits által lett auditálva.";
/* simplex link type */
"SimpleX contact address" = "SimpleX kapcsolattartási azonosító";
"SimpleX contact address" = "SimpleX kapcsolattartási cím";
/* notification */
"SimpleX encrypted message or connection event" = "SimpleX titkosított üzenet vagy kapcsolati esemény";
@@ -3675,7 +3679,7 @@
"Small groups (max 20)" = "Kis csoportok (max. 20 tag)";
/* No comment provided by engineer. */
"SMP servers" = "Üzenetküldő (SMP) kiszolgálók";
"SMP servers" = "SMP kiszolgálók";
/* No comment provided by engineer. */
"Some non-fatal errors occurred during import - you may see Chat console for more details." = "Néhány nem végzetes hiba történt az importálás során további részletekért a csevegési konzolban olvashat.";
@@ -3872,9 +3876,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "A beillesztett szöveg nem egy SimpleX hivatkozás.";
/* No comment provided by engineer. */
"Theme" = "Téma";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Ezek a beállítások a jelenlegi **%@** profiljára vonatkoznak.";
@@ -3915,7 +3916,7 @@
"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 a SimpleX azonosítója!";
"This is your own SimpleX address!" = "Ez az ön SimpleX címe!";
/* 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.";
@@ -3942,7 +3943,7 @@
"To protect your information, turn on SimpleX Lock.\nYou will be prompted to complete authentication before this feature is enabled." = "Az adatavédelem érdekében kapcsolja be a SimpleX zárolás funkciót.\nA funkció engedélyezése előtt a rendszer felszólítja a hitelesítés befejezésére.";
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Az IP-címe védelme érdekében a privát útválasztás az SMP-kiszolgálókat használja az üzenetek kézbesítéséhez.";
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Az IP-cím védelmének érdekében a privát útválasztás az SMP kiszolgálókat használja az üzenetek kézbesítéséhez.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Hangüzenet rögzítéséhez adjon engedélyt a mikrofon használathoz.";
@@ -4185,7 +4186,7 @@
"Via browser" = "Böngészőn keresztül";
/* chat list item description */
"via contact address link" = "kapcsolattartási azonosító-hivatkozáson keresztül";
"via contact address link" = "kapcsolattartási cím-hivatkozáson keresztül";
/* chat list item description */
"via group link" = "csoport hivatkozáson keresztül";
@@ -4347,7 +4348,7 @@
"You **must not** use the same database on two devices." = "**Nem szabad** ugyanazt az adatbázist használni egyszerre két eszközön.";
/* No comment provided by engineer. */
"You accepted connection" = "Kapcsolódás elfogadva";
"You accepted connection" = "Kapcsolat létrehozása";
/* No comment provided by engineer. */
"You allow" = "Engedélyezte";
@@ -4425,10 +4426,10 @@
"You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it." = "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.";
/* No comment provided by engineer. */
"You can share this address with your contacts to let them connect with **%@**." = "Megoszthatja ezt az azonosítót az ismerőseivel, hogy kapcsolatba léphessenek önnel a **%@** nevű profilján keresztül.";
"You can share this address with your contacts to let them connect with **%@**." = "Megoszthatja ezt a címet az ismerőseivel, hogy kapcsolatba léphessenek önnel a(z) **%@** nevű profilján keresztül.";
/* No comment provided by engineer. */
"You can share your address as a link or QR code - anybody can connect to you." = "Megoszthatja azonosítóját hivatkozásként vagy QR-kódként így bárki kapcsolódhat önhöz.";
"You can share your address as a link or QR code - anybody can connect to you." = "Megoszthatja a címét egy hivatkozásként vagy QR-kódként így bárki kapcsolódhat önhöz.";
/* No comment provided by engineer. */
"You can start chat via app Settings / Database or by restarting the app" = "A csevegést az alkalmazás Beállítások / Adatbázis menü segítségével vagy az alkalmazás újraindításával indíthatja el";
@@ -4446,10 +4447,10 @@
"You can't send messages!" = "Nem lehet üzeneteket küldeni!";
/* chat item text */
"you changed address" = "azonosítója megváltoztatva";
"you changed address" = "cím megváltoztatva";
/* chat item text */
"you changed address for %@" = "%@ azonosítója megváltoztatva";
"you changed address for %@" = "cím megváltoztatva nála: %@";
/* snd group event chat item */
"you changed role for yourself to %@" = "saját szerepkör megváltoztatva erre: %@";
@@ -4464,7 +4465,7 @@
"You could not be verified; please try again." = "Nem lehetett ellenőrizni; próbálja meg újra.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "Már kért egy kapcsolódási kérelmet ezen az azonosítón keresztül!";
"You have already requested connection via this address!" = "Már kért egy kapcsolódási kérelmet ezen a címen keresztül!";
/* No comment provided by engineer. */
"You have already requested connection!\nRepeat connection request?" = "Már kért egy kapcsolódási kérelmet!\nKapcsolódási kérés megismétlése?";
@@ -4536,7 +4537,7 @@
"You will stop receiving messages from this group. Chat history will be preserved." = "Ettől a csoporttól nem fog értesítéseket kapni. A csevegési előzmények megmaradnak.";
/* No comment provided by engineer. */
"You won't lose your contacts if you later delete your address." = "Nem veszíti el az ismerőseit, ha később törli az azonosítóját.";
"You won't lose your contacts if you later delete your address." = "Nem veszíti el az ismerőseit, ha később törli a címét.";
/* No comment provided by engineer. */
"you: " = "ön: ";
@@ -4614,7 +4615,7 @@
"Your settings" = "Beállítások";
/* No comment provided by engineer. */
"Your SimpleX address" = "SimpleX azonosítója";
"Your SimpleX address" = "Az ön SimpleX címe";
/* No comment provided by engineer. */
"Your SMP servers" = "SMP kiszolgálók";
+15 -14
View File
@@ -337,9 +337,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "sopra, quindi scegli:";
/* No comment provided by engineer. */
"Accent color" = "Colore principale";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Accetta";
@@ -369,7 +366,7 @@
"Add profile" = "Aggiungi profilo";
/* No comment provided by engineer. */
"Add server" = "Aggiungi server";
"Add server" = "Aggiungi server";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Aggiungi server scansionando codici QR.";
@@ -653,7 +650,7 @@
/* rcv group event chat item */
"blocked %@" = "ha bloccato %@";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "bloccato dall'amministratore";
/* No comment provided by engineer. */
@@ -840,9 +837,6 @@
/* No comment provided by engineer. */
"colored" = "colorato";
/* No comment provided by engineer. */
"Colors" = "Colori";
/* server test step */
"Compare file" = "Confronta file";
@@ -1023,7 +1017,7 @@
/* No comment provided by engineer. */
"Continue" = "Continua";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Copia";
/* No comment provided by engineer. */
@@ -1167,6 +1161,9 @@
/* time unit */
"days" = "giorni";
/* No comment provided by engineer. */
"Debug delivery" = "Debug della consegna";
/* No comment provided by engineer. */
"Decentralized" = "Decentralizzato";
@@ -1800,7 +1797,8 @@
/* No comment provided by engineer. */
"Error: " = "Errore: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Errore: %@";
/* No comment provided by engineer. */
@@ -2496,6 +2494,9 @@
/* No comment provided by engineer. */
"Message draft" = "Bozza dei messaggi";
/* No comment provided by engineer. */
"Message queue info" = "Info coda messaggi";
/* chat feature */
"Message reactions" = "Reazioni ai messaggi";
@@ -2991,7 +2992,7 @@
"Private filenames" = "Nomi di file privati";
/* No comment provided by engineer. */
"Private message routing" = "Instradamento privato messaggi";
"Private message routing" = "Instradamento privato dei messaggi";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Instradamento privato dei messaggi 🚀";
@@ -3518,6 +3519,9 @@
/* srv error text. */
"Server address is incompatible with network settings." = "L'indirizzo del server non è compatibile con le impostazioni di rete.";
/* queue info */
"server queue info: %@\n\nlast received msg: %@" = "info coda server: %1$@\n\nultimo msg ricevuto: %2$@";
/* server test error */
"Server requires authorization to create queues, check password" = "Il server richiede l'autorizzazione di creare code, controlla la password";
@@ -3872,9 +3876,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "Il testo che hai incollato non è un link SimpleX.";
/* No comment provided by engineer. */
"Theme" = "Tema";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Queste impostazioni sono per il tuo profilo attuale **%@**.";
+4 -12
View File
@@ -331,9 +331,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "上で選んでください:";
/* No comment provided by engineer. */
"Accent color" = "アクセントカラー";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "承諾";
@@ -360,7 +357,7 @@
"Add profile" = "プロフィールを追加";
/* No comment provided by engineer. */
"Add server" = "サーバを追加";
"Add server" = "サーバを追加";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "QRコードでサーバを追加する。";
@@ -735,9 +732,6 @@
/* No comment provided by engineer. */
"colored" = "色付き";
/* No comment provided by engineer. */
"Colors" = "色";
/* server test step */
"Compare file" = "ファイルを比較";
@@ -867,7 +861,7 @@
/* No comment provided by engineer. */
"Continue" = "続ける";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "コピー";
/* No comment provided by engineer. */
@@ -1509,7 +1503,8 @@
/* No comment provided by engineer. */
"Error: " = "エラー : ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "エラー : %@";
/* No comment provided by engineer. */
@@ -3113,9 +3108,6 @@
/* No comment provided by engineer. */
"The servers for new connections of your current chat profile **%@**." = "現在のチャットプロフィールの新しい接続のサーバ **%@**。";
/* No comment provided by engineer. */
"Theme" = "テーマ";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "これらの設定は現在のプロファイル **%@** 用です。";
+14 -13
View File
@@ -337,9 +337,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "hier boven, kies dan:";
/* No comment provided by engineer. */
"Accent color" = "Accent kleur";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Accepteer";
@@ -369,7 +366,7 @@
"Add profile" = "Profiel toevoegen";
/* No comment provided by engineer. */
"Add server" = "Server toevoegen";
"Add server" = "Server toevoegen";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Servers toevoegen door QR-codes te scannen.";
@@ -653,7 +650,7 @@
/* rcv group event chat item */
"blocked %@" = "geblokkeerd %@";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "geblokkeerd door beheerder";
/* No comment provided by engineer. */
@@ -840,9 +837,6 @@
/* No comment provided by engineer. */
"colored" = "gekleurd";
/* No comment provided by engineer. */
"Colors" = "Kleuren";
/* server test step */
"Compare file" = "Bestand vergelijken";
@@ -1023,7 +1017,7 @@
/* No comment provided by engineer. */
"Continue" = "Doorgaan";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Kopiëren";
/* No comment provided by engineer. */
@@ -1167,6 +1161,9 @@
/* time unit */
"days" = "dagen";
/* No comment provided by engineer. */
"Debug delivery" = "Foutopsporing bezorging";
/* No comment provided by engineer. */
"Decentralized" = "Gedecentraliseerd";
@@ -1800,7 +1797,8 @@
/* No comment provided by engineer. */
"Error: " = "Fout: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Fout: %@";
/* No comment provided by engineer. */
@@ -2496,6 +2494,9 @@
/* No comment provided by engineer. */
"Message draft" = "Concept bericht";
/* No comment provided by engineer. */
"Message queue info" = "Informatie over berichtenwachtrij";
/* chat feature */
"Message reactions" = "Reacties op berichten";
@@ -3518,6 +3519,9 @@
/* srv error text. */
"Server address is incompatible with network settings." = "Serveradres is niet compatibel met netwerkinstellingen.";
/* queue info */
"server queue info: %@\n\nlast received msg: %@" = "informatie over serverwachtrij: %1$@\n\nlaatst ontvangen bericht: %2$@";
/* server test error */
"Server requires authorization to create queues, check password" = "Server vereist autorisatie om wachtrijen te maken, controleer wachtwoord";
@@ -3872,9 +3876,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "De tekst die u hebt geplakt is geen SimpleX link.";
/* No comment provided by engineer. */
"Theme" = "Thema";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Deze instellingen zijn voor uw huidige profiel **%@**.";
+14 -13
View File
@@ -337,9 +337,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "powyżej, a następnie wybierz:";
/* No comment provided by engineer. */
"Accent color" = "Kolor akcentu";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Akceptuj";
@@ -369,7 +366,7 @@
"Add profile" = "Dodaj profil";
/* No comment provided by engineer. */
"Add server" = "Dodaj serwer";
"Add server" = "Dodaj serwer";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Dodaj serwery, skanując kody QR.";
@@ -653,7 +650,7 @@
/* rcv group event chat item */
"blocked %@" = "zablokowany %@";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "zablokowany przez admina";
/* No comment provided by engineer. */
@@ -840,9 +837,6 @@
/* No comment provided by engineer. */
"colored" = "kolorowy";
/* No comment provided by engineer. */
"Colors" = "Kolory";
/* server test step */
"Compare file" = "Porównaj plik";
@@ -1023,7 +1017,7 @@
/* No comment provided by engineer. */
"Continue" = "Kontynuuj";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Kopiuj";
/* No comment provided by engineer. */
@@ -1167,6 +1161,9 @@
/* time unit */
"days" = "dni";
/* No comment provided by engineer. */
"Debug delivery" = "Dostarczenie debugowania";
/* No comment provided by engineer. */
"Decentralized" = "Zdecentralizowane";
@@ -1800,7 +1797,8 @@
/* No comment provided by engineer. */
"Error: " = "Błąd: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Błąd: %@";
/* No comment provided by engineer. */
@@ -2496,6 +2494,9 @@
/* No comment provided by engineer. */
"Message draft" = "Wersja robocza wiadomości";
/* No comment provided by engineer. */
"Message queue info" = "Informacje kolejki wiadomości";
/* chat feature */
"Message reactions" = "Reakcje wiadomości";
@@ -3518,6 +3519,9 @@
/* srv error text. */
"Server address is incompatible with network settings." = "Adres serwera jest niekompatybilny z ustawieniami sieciowymi.";
/* queue info */
"server queue info: %@\n\nlast received msg: %@" = "Informacje kolejki serwera: %1$@\n\nostatnia otrzymana wiadomość: %2$@";
/* server test error */
"Server requires authorization to create queues, check password" = "Serwer wymaga autoryzacji do tworzenia kolejek, sprawdź hasło";
@@ -3872,9 +3876,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "Tekst, który wkleiłeś nie jest linkiem SimpleX.";
/* No comment provided by engineer. */
"Theme" = "Motyw";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Te ustawienia dotyczą Twojego bieżącego profilu **%@**.";
+5 -13
View File
@@ -337,9 +337,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "наверху, затем выберите:";
/* No comment provided by engineer. */
"Accent color" = "Основной цвет";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Принять";
@@ -369,7 +366,7 @@
"Add profile" = "Добавить профиль";
/* No comment provided by engineer. */
"Add server" = "Добавить сервер";
"Add server" = "Добавить сервер";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Добавить серверы через QR код.";
@@ -653,7 +650,7 @@
/* rcv group event chat item */
"blocked %@" = "%@ заблокирован";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "заблокировано администратором";
/* No comment provided by engineer. */
@@ -840,9 +837,6 @@
/* No comment provided by engineer. */
"colored" = "цвет";
/* No comment provided by engineer. */
"Colors" = "Цвета";
/* server test step */
"Compare file" = "Сравнение файла";
@@ -1023,7 +1017,7 @@
/* No comment provided by engineer. */
"Continue" = "Продолжить";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Скопировать";
/* No comment provided by engineer. */
@@ -1800,7 +1794,8 @@
/* No comment provided by engineer. */
"Error: " = "Ошибка: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Ошибка: %@";
/* No comment provided by engineer. */
@@ -3872,9 +3867,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "Вставленный текст не является SimpleX-ссылкой.";
/* No comment provided by engineer. */
"Theme" = "Тема";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Установки для Вашего активного профиля **%@**.";
+4 -12
View File
@@ -259,9 +259,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "ด้านบน จากนั้นเลือก:";
/* No comment provided by engineer. */
"Accent color" = "สีเน้น";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "รับ";
@@ -285,7 +282,7 @@
"Add profile" = "เพิ่มโปรไฟล์";
/* No comment provided by engineer. */
"Add server" = "เพิ่มเซิร์ฟเวอร์";
"Add server" = "เพิ่มเซิร์ฟเวอร์";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "เพิ่มเซิร์ฟเวอร์โดยการสแกนรหัสคิวอาร์โค้ด";
@@ -639,9 +636,6 @@
/* No comment provided by engineer. */
"colored" = "มีสี";
/* No comment provided by engineer. */
"Colors" = "สี";
/* server test step */
"Compare file" = "เปรียบเทียบไฟล์";
@@ -765,7 +759,7 @@
/* No comment provided by engineer. */
"Continue" = "ดำเนินการต่อ";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "คัดลอก";
/* No comment provided by engineer. */
@@ -1386,7 +1380,8 @@
/* No comment provided by engineer. */
"Error: " = "ผิดพลาด: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "ข้อผิดพลาด: % @";
/* No comment provided by engineer. */
@@ -2975,9 +2970,6 @@
/* No comment provided by engineer. */
"The servers for new connections of your current chat profile **%@**." = "เซิร์ฟเวอร์สำหรับการเชื่อมต่อใหม่ของโปรไฟล์การแชทปัจจุบันของคุณ **%@**";
/* No comment provided by engineer. */
"Theme" = "ธีม";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "การตั้งค่าเหล่านี้ใช้สำหรับโปรไฟล์ปัจจุบันของคุณ **%@**";
+14 -13
View File
@@ -337,9 +337,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "yukarı çıkın, ardından seçin:";
/* No comment provided by engineer. */
"Accent color" = "Vurgu rengi";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Kabul et";
@@ -369,7 +366,7 @@
"Add profile" = "Profil ekle";
/* No comment provided by engineer. */
"Add server" = "Sunucu ekle";
"Add server" = "Sunucu ekle";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Karekod taratarak sunucuları ekleyin.";
@@ -653,7 +650,7 @@
/* rcv group event chat item */
"blocked %@" = "engellendi %@";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "yönetici tarafından engellendi";
/* No comment provided by engineer. */
@@ -840,9 +837,6 @@
/* No comment provided by engineer. */
"colored" = "renklendirilmiş";
/* No comment provided by engineer. */
"Colors" = "Renkler";
/* server test step */
"Compare file" = "Dosya karşılaştır";
@@ -1023,7 +1017,7 @@
/* No comment provided by engineer. */
"Continue" = "Devam et";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Kopyala";
/* No comment provided by engineer. */
@@ -1167,6 +1161,9 @@
/* time unit */
"days" = "gün";
/* No comment provided by engineer. */
"Debug delivery" = "Hata ayıklama teslimatı";
/* No comment provided by engineer. */
"Decentralized" = "Merkezi Olmayan";
@@ -1800,7 +1797,8 @@
/* No comment provided by engineer. */
"Error: " = "Hata: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Hata: %@";
/* No comment provided by engineer. */
@@ -2496,6 +2494,9 @@
/* No comment provided by engineer. */
"Message draft" = "Mesaj taslağı";
/* No comment provided by engineer. */
"Message queue info" = "Mesaj kuyruğu bilgisi";
/* chat feature */
"Message reactions" = "Mesaj tepkileri";
@@ -3518,6 +3519,9 @@
/* srv error text. */
"Server address is incompatible with network settings." = "Sunucu adresi ağ ayarlarıyla uyumlu değil.";
/* queue info */
"server queue info: %@\n\nlast received msg: %@" = "sunucu kuyruk bilgisi: %1$@\n\nson alınan msj: %2$@";
/* server test error */
"Server requires authorization to create queues, check password" = "Sunucunun sıra oluşturması için yetki gereklidir, şifreyi kontrol edin";
@@ -3872,9 +3876,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "Yapıştırdığın metin bir SimpleX bağlantısı değildir.";
/* No comment provided by engineer. */
"Theme" = "Tema";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Bu ayarlar mevcut profiliniz **%@** içindir.";
+14 -13
View File
@@ -337,9 +337,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "вище, а потім обирайте:";
/* No comment provided by engineer. */
"Accent color" = "Акцентний колір";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "Прийняти";
@@ -369,7 +366,7 @@
"Add profile" = "Додати профіль";
/* No comment provided by engineer. */
"Add server" = "Додати сервер";
"Add server" = "Додати сервер";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "Додайте сервери, відсканувавши QR-код.";
@@ -653,7 +650,7 @@
/* rcv group event chat item */
"blocked %@" = "заблоковано %@";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "заблоковано адміністратором";
/* No comment provided by engineer. */
@@ -840,9 +837,6 @@
/* No comment provided by engineer. */
"colored" = "кольоровий";
/* No comment provided by engineer. */
"Colors" = "Кольори";
/* server test step */
"Compare file" = "Порівняти файл";
@@ -1023,7 +1017,7 @@
/* No comment provided by engineer. */
"Continue" = "Продовжуйте";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "Копіювати";
/* No comment provided by engineer. */
@@ -1167,6 +1161,9 @@
/* time unit */
"days" = "днів";
/* No comment provided by engineer. */
"Debug delivery" = "Доставка налагодження";
/* No comment provided by engineer. */
"Decentralized" = "Децентралізований";
@@ -1800,7 +1797,8 @@
/* No comment provided by engineer. */
"Error: " = "Помилка: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "Помилка: %@";
/* No comment provided by engineer. */
@@ -2496,6 +2494,9 @@
/* No comment provided by engineer. */
"Message draft" = "Чернетка повідомлення";
/* No comment provided by engineer. */
"Message queue info" = "Інформація про чергу повідомлень";
/* chat feature */
"Message reactions" = "Реакції на повідомлення";
@@ -3518,6 +3519,9 @@
/* srv error text. */
"Server address is incompatible with network settings." = "Адреса сервера несумісна з налаштуваннями мережі.";
/* queue info */
"server queue info: %@\n\nlast received msg: %@" = "інформація про чергу на сервері: %1$@\n\nостаннє отримане повідомлення: %2$@";
/* server test error */
"Server requires authorization to create queues, check password" = "Сервер вимагає авторизації для створення черг, перевірте пароль";
@@ -3872,9 +3876,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "Текст, який ви вставили, не є посиланням SimpleX.";
/* No comment provided by engineer. */
"Theme" = "Тема";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Ці налаштування стосуються вашого поточного профілю **%@**.";
+5 -13
View File
@@ -301,9 +301,6 @@
/* No comment provided by engineer. */
"above, then choose:" = "上面,然后选择:";
/* No comment provided by engineer. */
"Accent color" = "色调";
/* accept contact request via notification
accept incoming call via notification */
"Accept" = "接受";
@@ -333,7 +330,7 @@
"Add profile" = "添加个人资料";
/* No comment provided by engineer. */
"Add server" = "添加服务器";
"Add server" = "添加服务器";
/* No comment provided by engineer. */
"Add servers by scanning QR codes." = "扫描二维码来添加服务器。";
@@ -605,7 +602,7 @@
/* rcv group event chat item */
"blocked %@" = "已封禁 %@";
/* marked deleted chat item preview text */
/* blocked chat item */
"blocked by admin" = "由管理员封禁";
/* No comment provided by engineer. */
@@ -786,9 +783,6 @@
/* No comment provided by engineer. */
"colored" = "彩色";
/* No comment provided by engineer. */
"Colors" = "颜色";
/* server test step */
"Compare file" = "对比文件";
@@ -951,7 +945,7 @@
/* No comment provided by engineer. */
"Continue" = "继续";
/* chat item action */
/* No comment provided by engineer. */
"Copy" = "复制";
/* No comment provided by engineer. */
@@ -1689,7 +1683,8 @@
/* No comment provided by engineer. */
"Error: " = "错误: ";
/* snd error text */
/* file error text
snd error text */
"Error: %@" = "错误: @";
/* No comment provided by engineer. */
@@ -3644,9 +3639,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "您粘贴的文本不是 SimpleX 链接。";
/* No comment provided by engineer. */
"Theme" = "主题";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "这些设置适用于您当前的配置文件 **%@**。";
@@ -105,6 +105,7 @@ kotlin {
implementation("uk.co.caprica:vlcj:4.8.2")
implementation("com.github.NanoHttpd.nanohttpd:nanohttpd:efb2ebf85a")
implementation("com.github.NanoHttpd.nanohttpd:nanohttpd-websocket:efb2ebf85a")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
}
}
val desktopTest by getting
@@ -6,8 +6,6 @@ import android.net.LocalServerSocket
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.fragment.app.FragmentActivity
import chat.simplex.common.*
import chat.simplex.common.platform.*
import java.io.*
import java.lang.ref.WeakReference
import java.util.*
@@ -24,6 +22,8 @@ var isAppOnForeground: Boolean = false
@Suppress("ConstantLocale")
val defaultLocale: Locale = Locale.getDefault()
actual fun isAppVisibleAndFocused(): Boolean = isAppOnForeground
@SuppressLint("StaticFieldLeak")
lateinit var androidAppContext: Context
var mainActivity: WeakReference<FragmentActivity> = WeakReference(null)
@@ -29,6 +29,8 @@ actual val remoteHostsDir: File = File(tmpDir.absolutePath + File.separator + "r
actual fun desktopOpenDatabaseDir() {}
actual fun desktopOpenDir(dir: File) {}
@Composable
actual fun rememberFileChooserLauncher(getContent: Boolean, rememberedValue: Any?, onResult: (URI?) -> Unit): FileChooserLauncher {
val launcher = rememberLauncherForActivityResult(
@@ -80,6 +80,7 @@ fun MainScreen() {
laUnavailableInstructionAlert()
}
}
platform.desktopShowAppUpdateNotice()
LaunchedEffect(chatModel.clearOverlays.value) {
if (chatModel.clearOverlays.value) {
ModalManager.closeAllModalsEverywhere()
@@ -28,6 +28,7 @@ import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.*
import java.io.Closeable
import java.io.File
import java.net.URI
import java.time.format.DateTimeFormatter
@@ -65,6 +66,7 @@ object ChatModel {
val deletedChats = mutableStateOf<List<Pair<Long?, String>>>(emptyList())
val chatItemStatuses = mutableMapOf<Long, CIStatus>()
val groupMembers = mutableStateListOf<GroupMember>()
val groupMembersIndexes = mutableStateMapOf<Long, Int>()
val terminalItems = mutableStateOf<List<TerminalItem>>(listOf())
val userAddress = mutableStateOf<UserContactLinkRec?>(null)
@@ -121,6 +123,9 @@ object ChatModel {
val clipboardHasText = mutableStateOf(false)
val networkInfo = mutableStateOf(UserNetworkInfo(networkType = UserNetworkType.OTHER, online = true))
val updatingProgress = mutableStateOf(null as Float?)
var updatingRequest: Closeable? = null
val updatingChatsMutex: Mutex = Mutex()
val changingActiveUserMutex: Mutex = Mutex()
@@ -170,7 +175,23 @@ object ChatModel {
fun getChat(id: String): Chat? = chats.toList().firstOrNull { it.id == id }
fun getContactChat(contactId: Long): Chat? = chats.toList().firstOrNull { it.chatInfo is ChatInfo.Direct && it.chatInfo.apiId == contactId }
fun getGroupChat(groupId: Long): Chat? = chats.toList().firstOrNull { it.chatInfo is ChatInfo.Group && it.chatInfo.apiId == groupId }
fun getGroupMember(groupMemberId: Long): GroupMember? = groupMembers.firstOrNull { it.groupMemberId == groupMemberId }
fun populateGroupMembersIndexes() {
groupMembersIndexes.clear()
groupMembers.forEachIndexed { i, member ->
groupMembersIndexes[member.groupMemberId] = i
}
}
fun getGroupMember(groupMemberId: Long): GroupMember? {
val memberIndex = groupMembersIndexes[groupMemberId]
return if (memberIndex != null) {
groupMembers[memberIndex]
} else {
null
}
}
private fun getChatIndex(rhId: Long?, id: String): Int = chats.toList().indexOfFirst { it.id == id && it.remoteHostId == rhId }
fun addChat(chat: Chat) = chats.add(index = 0, chat)
@@ -620,12 +641,13 @@ object ChatModel {
}
// update current chat
return if (chatId.value == groupInfo.id) {
val memberIndex = groupMembers.indexOfFirst { it.groupMemberId == member.groupMemberId }
if (memberIndex >= 0) {
val memberIndex = groupMembersIndexes[member.groupMemberId]
if (memberIndex != null) {
groupMembers[memberIndex] = member
false
} else {
groupMembers.add(member)
groupMembersIndexes[member.groupMemberId] = groupMembers.size - 1
true
}
} else {
@@ -1172,18 +1194,22 @@ data class Connection(
val pqSndEnabled: Boolean? = null,
val pqRcvEnabled: Boolean? = null,
val connectionStats: ConnectionStats? = null,
val authErrCounter: Int
val authErrCounter: Int,
val quotaErrCounter: Int
) {
val id: ChatId get() = ":$connId"
val connDisabled: Boolean
get() = authErrCounter >= 10 // authErrDisableCount in core
val connInactive: Boolean
get() = quotaErrCounter >= 5 // quotaErrInactiveCount in core
val connPQEnabled: Boolean
get() = pqSndEnabled == true && pqRcvEnabled == true
companion object {
val sampleData = Connection(connId = 1, agentConnId = "abc", connStatus = ConnStatus.Ready, connLevel = 0, viaGroupLink = false, peerChatVRange = VersionRange(1, 1), customUserProfileId = null, pqSupport = false, pqEncryption = false, authErrCounter = 0)
val sampleData = Connection(connId = 1, agentConnId = "abc", connStatus = ConnStatus.Ready, connLevel = 0, viaGroupLink = false, peerChatVRange = VersionRange(1, 1), customUserProfileId = null, pqSupport = false, pqEncryption = false, authErrCounter = 0, quotaErrCounter = 0)
}
}
@@ -2352,6 +2378,48 @@ enum class SndCIStatusProgress {
@SerialName("complete") Complete;
}
@Serializable
sealed class GroupSndStatus {
@Serializable @SerialName("new") class New: GroupSndStatus()
@Serializable @SerialName("forwarded") class Forwarded: GroupSndStatus()
@Serializable @SerialName("inactive") class Inactive: GroupSndStatus()
@Serializable @SerialName("sent") class Sent: GroupSndStatus()
@Serializable @SerialName("rcvd") class Rcvd(val msgRcptStatus: MsgReceiptStatus): GroupSndStatus()
@Serializable @SerialName("error") class Error(val agentError: SndError): GroupSndStatus()
@Serializable @SerialName("warning") class Warning(val agentError: SndError): GroupSndStatus()
@Serializable @SerialName("invalid") class Invalid(val text: String): GroupSndStatus()
fun statusIcon(
primaryColor: Color,
metaColor: Color = CurrentColors.value.colors.secondary,
paleMetaColor: Color = CurrentColors.value.colors.secondary
): Pair<ImageResource, Color> =
when (this) {
is New -> MR.images.ic_more_horiz to metaColor
is Forwarded -> MR.images.ic_chevron_right_2 to metaColor
is Inactive -> MR.images.ic_person_off to metaColor
is Sent -> MR.images.ic_check_filled to metaColor
is Rcvd -> when(this.msgRcptStatus) {
MsgReceiptStatus.Ok -> MR.images.ic_double_check to metaColor
MsgReceiptStatus.BadMsgHash -> MR.images.ic_double_check to Color.Red
}
is Error -> MR.images.ic_close to Color.Red
is Warning -> MR.images.ic_warning_filled to WarningOrange
is Invalid -> MR.images.ic_question_mark to metaColor
}
val statusInto: Pair<String, String>? get() = when (this) {
is New -> null
is Forwarded -> generalGetString(MR.strings.message_forwarded_title) to generalGetString(MR.strings.message_forwarded_desc)
is Inactive -> generalGetString(MR.strings.member_inactive_title) to generalGetString(MR.strings.member_inactive_desc)
is Sent -> null
is Rcvd -> null
is Error -> generalGetString(MR.strings.message_delivery_error_title) to agentError.errorInfo
is Warning -> generalGetString(MR.strings.message_delivery_warning_title) to agentError.errorInfo
is Invalid -> "Invalid status" to this.text
}
}
@Serializable
sealed class CIDeleted {
@Serializable @SerialName("deleted") class Deleted(val deletedTs: Instant?): CIDeleted()
@@ -3466,7 +3534,7 @@ data class ChatItemVersion(
@Serializable
data class MemberDeliveryStatus(
val groupMemberId: Long,
val memberDeliveryStatus: CIStatus,
val memberDeliveryStatus: GroupSndStatus,
val sentViaProxy: Boolean?
)
@@ -160,6 +160,9 @@ class AppPreferences {
val showHiddenProfilesNotice = mkBoolPreference(SHARED_PREFS_SHOW_HIDDEN_PROFILES_NOTICE, true)
val showMuteProfileAlert = mkBoolPreference(SHARED_PREFS_SHOW_MUTE_PROFILE_ALERT, true)
val appLanguage = mkStrPreference(SHARED_PREFS_APP_LANGUAGE, null)
val appUpdateChannel = mkEnumPreference(SHARED_PREFS_APP_UPDATE_CHANNEL, AppUpdatesChannel.DISABLED) { AppUpdatesChannel.entries.firstOrNull { it.name == this } }
val appSkippedUpdate = mkStrPreference(SHARED_PREFS_APP_SKIPPED_UPDATE, "")
val appUpdateNoticeShown = mkBoolPreference(SHARED_PREFS_APP_UPDATE_NOTICE_SHOWN, false)
val onboardingStage = mkEnumPreference(SHARED_PREFS_ONBOARDING_STAGE, OnboardingStage.OnboardingComplete) { OnboardingStage.values().firstOrNull { it.name == this } }
val migrationToStage = mkStrPreference(SHARED_PREFS_MIGRATION_TO_STAGE, null)
@@ -331,6 +334,9 @@ class AppPreferences {
private const val SHARED_PREFS_CHAT_ARCHIVE_NAME = "ChatArchiveName"
private const val SHARED_PREFS_CHAT_ARCHIVE_TIME = "ChatArchiveTime"
private const val SHARED_PREFS_APP_LANGUAGE = "AppLanguage"
private const val SHARED_PREFS_APP_UPDATE_CHANNEL = "AppUpdateChannel"
private const val SHARED_PREFS_APP_SKIPPED_UPDATE = "AppSkippedUpdate"
private const val SHARED_PREFS_APP_UPDATE_NOTICE_SHOWN = "AppUpdateNoticeShown"
private const val SHARED_PREFS_ONBOARDING_STAGE = "OnboardingStage"
const val SHARED_PREFS_MIGRATION_TO_STAGE = "MigrationToStage"
const val SHARED_PREFS_MIGRATION_FROM_STAGE = "MigrationFromStage"
@@ -1809,6 +1815,80 @@ object ChatController {
)
true
}
r is CR.ChatCmdError && r.chatError is ChatError.ChatErrorAgent
&& r.chatError.agentError is AgentErrorType.BROKER
&& r.chatError.agentError.brokerErr is BrokerErrorType.HOST -> {
AlertManager.shared.showAlertMsg(
generalGetString(MR.strings.connection_error),
String.format(generalGetString(MR.strings.network_error_broker_host_desc), serverHostname(r.chatError.agentError.brokerAddress))
)
true
}
r is CR.ChatCmdError && r.chatError is ChatError.ChatErrorAgent
&& r.chatError.agentError is AgentErrorType.BROKER
&& r.chatError.agentError.brokerErr is BrokerErrorType.TRANSPORT
&& r.chatError.agentError.brokerErr.transportErr is SMPTransportError.Version -> {
AlertManager.shared.showAlertMsg(
generalGetString(MR.strings.connection_error),
String.format(generalGetString(MR.strings.network_error_broker_version_desc), serverHostname(r.chatError.agentError.brokerAddress))
)
true
}
r is CR.ChatCmdError && r.chatError is ChatError.ChatErrorAgent
&& r.chatError.agentError is AgentErrorType.SMP
&& r.chatError.agentError.smpErr is SMPErrorType.PROXY ->
proxyErrorAlert(r.chatError.agentError.smpErr.proxyErr)
r is CR.ChatCmdError && r.chatError is ChatError.ChatErrorAgent
&& r.chatError.agentError is AgentErrorType.PROXY
&& r.chatError.agentError.proxyErr is ProxyClientError.ProxyProtocolError
&& r.chatError.agentError.proxyErr.protocolErr is SMPErrorType.PROXY ->
proxyErrorAlert(r.chatError.agentError.proxyErr.protocolErr.proxyErr)
else -> false
}
}
private fun proxyErrorAlert(pe: ProxyError): Boolean {
return when {
pe is ProxyError.BROKER
&& pe.brokerErr is BrokerErrorType.TIMEOUT -> {
AlertManager.shared.showAlertMsg(
generalGetString(MR.strings.private_routing_error),
generalGetString(MR.strings.please_try_later)
)
true
}
pe is ProxyError.BROKER
&& pe.brokerErr is BrokerErrorType.NETWORK -> {
AlertManager.shared.showAlertMsg(
generalGetString(MR.strings.private_routing_error),
generalGetString(MR.strings.please_try_later)
)
true
}
pe is ProxyError.NO_SESSION -> {
AlertManager.shared.showAlertMsg(
generalGetString(MR.strings.private_routing_error),
generalGetString(MR.strings.please_try_later)
)
true
}
pe is ProxyError.BROKER
&& pe.brokerErr is BrokerErrorType.HOST -> {
AlertManager.shared.showAlertMsg(
generalGetString(MR.strings.private_routing_error),
generalGetString(MR.strings.srv_error_host)
)
true
}
pe is ProxyError.BROKER
&& pe.brokerErr is BrokerErrorType.TRANSPORT
&& pe.brokerErr.transportErr is SMPTransportError.Version -> {
AlertManager.shared.showAlertMsg(
generalGetString(MR.strings.private_routing_error),
generalGetString(MR.strings.srv_error_version)
)
true
}
else -> false
}
}
@@ -3064,7 +3144,7 @@ data class ProtoServersConfig(
data class UserProtocolServers(
val serverProtocol: ServerProtocol,
val protoServers: List<ServerCfg>,
val presetServers: List<String>,
val presetServers: List<ServerCfg>,
)
@Serializable
@@ -3073,7 +3153,7 @@ data class ServerCfg(
val server: String,
val preset: Boolean,
val tested: Boolean? = null,
val enabled: ServerEnabled
val enabled: Boolean
) {
@Transient
private val createdAt: Date = Date()
@@ -3087,7 +3167,7 @@ data class ServerCfg(
get() = server.isBlank()
companion object {
val empty = ServerCfg(remoteHostId = null, server = "", preset = false, tested = null, enabled = ServerEnabled.Enabled)
val empty = ServerCfg(remoteHostId = null, server = "", preset = false, tested = null, enabled = false)
class SampleData(
val preset: ServerCfg,
@@ -3101,33 +3181,26 @@ data class ServerCfg(
server = "smp://abcd@smp8.simplex.im",
preset = true,
tested = true,
enabled = ServerEnabled.Enabled
enabled = true
),
custom = ServerCfg(
remoteHostId = null,
server = "smp://abcd@smp9.simplex.im",
preset = false,
tested = false,
enabled = ServerEnabled.Disabled
enabled = false
),
untested = ServerCfg(
remoteHostId = null,
server = "smp://abcd@smp10.simplex.im",
preset = false,
tested = null,
enabled = ServerEnabled.Enabled
enabled = true
)
)
}
}
@Serializable
enum class ServerEnabled {
@SerialName("disabled") Disabled,
@SerialName("enabled") Enabled,
@SerialName("known") Known;
}
@Serializable
enum class ProtocolTestStep {
@SerialName("connect") Connect,
@@ -5500,6 +5573,7 @@ sealed class AgentErrorType {
is SMP -> "SMP ${smpErr.string}"
// is NTF -> "NTF ${ntfErr.string}"
is XFTP -> "XFTP ${xftpErr.string}"
is PROXY -> "PROXY $proxyServer $relayServer ${proxyErr.string}"
is RCP -> "RCP ${rcpErr.string}"
is BROKER -> "BROKER ${brokerErr.string}"
is AGENT -> "AGENT ${agentErr.string}"
@@ -5512,6 +5586,7 @@ sealed class AgentErrorType {
@Serializable @SerialName("SMP") class SMP(val smpErr: SMPErrorType): AgentErrorType()
// @Serializable @SerialName("NTF") class NTF(val ntfErr: SMPErrorType): AgentErrorType()
@Serializable @SerialName("XFTP") class XFTP(val xftpErr: XFTPErrorType): AgentErrorType()
@Serializable @SerialName("PROXY") class PROXY(val proxyServer: String, val relayServer: String, val proxyErr: ProxyClientError): AgentErrorType()
@Serializable @SerialName("RCP") class RCP(val rcpErr: RCErrorType): AgentErrorType()
@Serializable @SerialName("BROKER") class BROKER(val brokerAddress: String, val brokerErr: BrokerErrorType): AgentErrorType()
@Serializable @SerialName("AGENT") class AGENT(val agentErr: SMPAgentError): AgentErrorType()
@@ -5576,22 +5651,42 @@ sealed class SMPErrorType {
is BLOCK -> "BLOCK"
is SESSION -> "SESSION"
is CMD -> "CMD ${cmdErr.string}"
is PROXY -> "PROXY ${proxyErr.string}"
is AUTH -> "AUTH"
is CRYPTO -> "CRYPTO"
is QUOTA -> "QUOTA"
is NO_MSG -> "NO_MSG"
is LARGE_MSG -> "LARGE_MSG"
is EXPIRED -> "EXPIRED"
is INTERNAL -> "INTERNAL"
}
@Serializable @SerialName("BLOCK") class BLOCK: SMPErrorType()
@Serializable @SerialName("SESSION") class SESSION: SMPErrorType()
@Serializable @SerialName("CMD") class CMD(val cmdErr: ProtocolCommandError): SMPErrorType()
@Serializable @SerialName("PROXY") class PROXY(val proxyErr: ProxyError): SMPErrorType()
@Serializable @SerialName("AUTH") class AUTH: SMPErrorType()
@Serializable @SerialName("CRYPTO") class CRYPTO: SMPErrorType()
@Serializable @SerialName("QUOTA") class QUOTA: SMPErrorType()
@Serializable @SerialName("NO_MSG") class NO_MSG: SMPErrorType()
@Serializable @SerialName("LARGE_MSG") class LARGE_MSG: SMPErrorType()
@Serializable @SerialName("EXPIRED") class EXPIRED: SMPErrorType()
@Serializable @SerialName("INTERNAL") class INTERNAL: SMPErrorType()
}
@Serializable
sealed class ProxyError {
val string: String get() = when (this) {
is PROTOCOL -> "PROTOCOL ${protocolErr.string}"
is BROKER -> "BROKER ${brokerErr.string}"
is BASIC_AUTH -> "BASIC_AUTH"
is NO_SESSION -> "NO_SESSION"
}
@Serializable @SerialName("PROTOCOL") class PROTOCOL(val protocolErr: SMPErrorType): ProxyError()
@Serializable @SerialName("BROKER") class BROKER(val brokerErr: BrokerErrorType): ProxyError()
@Serializable @SerialName("BASIC_AUTH") class BASIC_AUTH: ProxyError()
@Serializable @SerialName("NO_SESSION") class NO_SESSION: ProxyError()
}
@Serializable
sealed class ProtocolCommandError {
val string: String get() = when (this) {
@@ -5614,12 +5709,14 @@ sealed class ProtocolCommandError {
sealed class SMPTransportError {
val string: String get() = when (this) {
is BadBlock -> "badBlock"
is Version -> "version"
is LargeMsg -> "largeMsg"
is BadSession -> "badSession"
is NoServerAuth -> "noServerAuth"
is Handshake -> "handshake ${handshakeErr.string}"
}
@Serializable @SerialName("badBlock") class BadBlock: SMPTransportError()
@Serializable @SerialName("version") class Version: SMPTransportError()
@Serializable @SerialName("largeMsg") class LargeMsg: SMPTransportError()
@Serializable @SerialName("badSession") class BadSession: SMPTransportError()
@Serializable @SerialName("noServerAuth") class NoServerAuth: SMPTransportError()
@@ -5692,6 +5789,18 @@ sealed class XFTPErrorType {
@Serializable @SerialName("INTERNAL") object INTERNAL: XFTPErrorType()
}
@Serializable
sealed class ProxyClientError {
val string: String get() = when (this) {
is ProxyProtocolError -> "ProxyProtocolError $protocolErr"
is ProxyUnexpectedResponse -> "ProxyUnexpectedResponse $responseStr"
is ProxyResponseError -> "ProxyResponseError $responseErr"
}
@Serializable @SerialName("protocolError") class ProxyProtocolError(val protocolErr: SMPErrorType): ProxyClientError()
@Serializable @SerialName("unexpectedResponse") class ProxyUnexpectedResponse(val responseStr: String): ProxyClientError()
@Serializable @SerialName("responseError") class ProxyResponseError(val responseErr: SMPErrorType): ProxyClientError()
}
@Serializable
sealed class RCErrorType {
val string: String get() = when (this) {
@@ -3,7 +3,8 @@ package chat.simplex.common.platform
import chat.simplex.common.BuildConfigCommon
import chat.simplex.common.model.*
import chat.simplex.common.ui.theme.DefaultTheme
import java.io.File
import chat.simplex.common.views.helpers.generalGetString
import chat.simplex.res.MR
import java.util.*
enum class AppPlatform {
@@ -20,6 +21,8 @@ expect val appPlatform: AppPlatform
expect val deviceName: String
expect fun isAppVisibleAndFocused(): Boolean
val appVersionInfo: Pair<String, Int?> = if (appPlatform == AppPlatform.ANDROID)
BuildConfigCommon.ANDROID_VERSION_NAME to BuildConfigCommon.ANDROID_VERSION_CODE
else
@@ -55,3 +58,16 @@ fun runMigrations() {
}
}
}
enum class AppUpdatesChannel {
DISABLED,
STABLE,
BETA;
val text: String
get() = when (this) {
DISABLED -> generalGetString(MR.strings.app_check_for_updates_disabled)
STABLE -> generalGetString(MR.strings.app_check_for_updates_stable)
BETA -> generalGetString(MR.strings.app_check_for_updates_beta)
}
}
@@ -34,6 +34,8 @@ expect val remoteHostsDir: File
expect fun desktopOpenDatabaseDir()
expect fun desktopOpenDir(dir: File)
fun createURIFromPath(absolutePath: String): URI = URI.create(URLEncoder.encode(absolutePath, "UTF-8"))
fun URI.toFile(): File = File(URLDecoder.decode(rawPath, "UTF-8").removePrefix("file:"))
@@ -29,6 +29,7 @@ interface PlatformInterface {
@Composable fun desktopScrollBarComponents(): Triple<Animatable<Float, AnimationVector1D>, Modifier, MutableState<Job>> = remember { Triple(Animatable(0f), Modifier, mutableStateOf(Job())) }
@Composable fun desktopScrollBar(state: LazyListState, modifier: Modifier, scrollBarAlpha: Animatable<Float, AnimationVector1D>, scrollJob: MutableState<Job>, reversed: Boolean) {}
@Composable fun desktopScrollBar(state: ScrollState, modifier: Modifier, scrollBarAlpha: Animatable<Float, AnimationVector1D>, scrollJob: MutableState<Job>, reversed: Boolean) {}
@Composable fun desktopShowAppUpdateNotice() {}
}
/**
* Multiplatform project has separate directories per platform + common directory that contains directories per platform + common for all of them.
@@ -330,7 +330,7 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
}
@Composable
fun MemberDeliveryStatusView(member: GroupMember, status: CIStatus, sentViaProxy: Boolean?) {
fun MemberDeliveryStatusView(member: GroupMember, status: GroupSndStatus, sentViaProxy: Boolean?) {
SectionItemView(
padding = PaddingValues(horizontal = 0.dp)
) {
@@ -355,7 +355,7 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
)
}
}
val statusIcon = status.statusIcon(MaterialTheme.colors.primary, CurrentColors.value.colors.secondary)
val (icon, statusColor) = status.statusIcon(MaterialTheme.colors.primary, CurrentColors.value.colors.secondary)
var modifier = Modifier.size(36.dp).clip(RoundedCornerShape(20.dp))
val info = status.statusInto
if (info != null) {
@@ -367,20 +367,11 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
}
}
Box(modifier, contentAlignment = Alignment.Center) {
if (statusIcon != null) {
val (icon, statusColor) = statusIcon
Icon(
painterResource(icon),
contentDescription = null,
tint = statusColor
)
} else {
Icon(
painterResource(MR.images.ic_more_horiz),
contentDescription = null,
tint = CurrentColors.value.colors.secondary
)
}
Icon(
painterResource(icon),
contentDescription = null,
tint = statusColor
)
}
}
}
@@ -520,7 +511,7 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
}
}
private fun membersStatuses(chatModel: ChatModel, memberDeliveryStatuses: List<MemberDeliveryStatus>): List<Triple<GroupMember, CIStatus, Boolean?>> {
private fun membersStatuses(chatModel: ChatModel, memberDeliveryStatuses: List<MemberDeliveryStatus>): List<Triple<GroupMember, GroupSndStatus, Boolean?>> {
return memberDeliveryStatuses.mapNotNull { mds ->
chatModel.getGroupMember(mds.groupMemberId)?.let { mem ->
Triple(mem, mds.memberDeliveryStatus, mds.sentViaProxy)
@@ -159,6 +159,7 @@ fun ChatView(chatId: String, chatModel: ChatModel, onComposed: suspend (chatId:
AudioPlayer.stop()
chatModel.chatId.value = null
chatModel.groupMembers.clear()
chatModel.groupMembersIndexes.clear()
},
info = {
if (ModalManager.end.hasModalsOpen()) {
@@ -1024,10 +1025,21 @@ fun BoxWithConstraintsScope.ChatItemsList(
horizontalAlignment = Alignment.Start
) {
if (cItem.content.showMemberName) {
val memberNameStyle = SpanStyle(fontSize = 13.5.sp, color = CurrentColors.value.colors.secondary)
val memberNameString = if (memCount == 1 && member.memberRole > GroupMemberRole.Member) {
buildAnnotatedString {
withStyle(memberNameStyle.copy(fontWeight = FontWeight.Medium)) { append(member.memberRole.text) }
append(" ")
withStyle(memberNameStyle) { append(memberNames(member, prevMember, memCount)) }
}
} else {
buildAnnotatedString {
withStyle(memberNameStyle) { append(memberNames(member, prevMember, memCount)) }
}
}
Text(
memberNames(member, prevMember, memCount),
memberNameString,
Modifier.padding(start = MEMBER_IMAGE_SIZE + 10.dp),
style = TextStyle(fontSize = 13.5.sp, color = CurrentColors.value.colors.secondary),
maxLines = 2
)
}
@@ -390,6 +390,16 @@ private fun MemberRow(member: GroupMember, user: Boolean = false, onClick: (() -
}
}
fun memberConnStatus(): String {
return if (member.activeConn?.connDisabled == true) {
generalGetString(MR.strings.member_info_member_disabled)
} else if (member.activeConn?.connDisabled == true) {
generalGetString(MR.strings.member_info_member_inactive)
} else {
member.memberStatus.shortText
}
}
Row(
Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
@@ -412,8 +422,8 @@ private fun MemberRow(member: GroupMember, user: Boolean = false, onClick: (() -
color = if (member.memberIncognito) Indigo else Color.Unspecified
)
}
val s = member.memberStatus.shortText
val statusDescr = if (user) String.format(generalGetString(MR.strings.group_info_member_you), s) else s
val statusDescr =
if (user) String.format(generalGetString(MR.strings.group_info_member_you), member.memberStatus.shortText) else memberConnStatus()
Text(
statusDescr,
color = MaterialTheme.colors.secondary,
@@ -358,13 +358,6 @@ fun GroupMemberInfoLayout(
} else {
InfoRow(stringResource(MR.strings.role_in_group), member.memberRole.text)
}
val conn = member.activeConn
if (conn != null) {
val connLevelDesc =
if (conn.connLevel == 0) stringResource(MR.strings.conn_level_desc_direct)
else String.format(generalGetString(MR.strings.conn_level_desc_indirect), conn.connLevel)
InfoRow(stringResource(MR.strings.info_row_connection), connLevelDesc)
}
}
if (cStats != null) {
SectionDividerSpaced()
@@ -401,6 +394,13 @@ fun GroupMemberInfoLayout(
SectionView(title = stringResource(MR.strings.section_title_for_console)) {
InfoRow(stringResource(MR.strings.info_row_local_name), member.localDisplayName)
InfoRow(stringResource(MR.strings.info_row_database_id), member.groupMemberId.toString())
val conn = member.activeConn
if (conn != null) {
val connLevelDesc =
if (conn.connLevel == 0) stringResource(MR.strings.conn_level_desc_direct)
else String.format(generalGetString(MR.strings.conn_level_desc_indirect), conn.connLevel)
InfoRow(stringResource(MR.strings.info_row_connection), connLevelDesc)
}
SectionItemView({
withBGApi {
val info = controller.apiGroupMemberQueueInfo(rhId, groupInfo.apiId, member.groupMemberId)
@@ -128,30 +128,6 @@ fun CIFileView(
}
}
@Composable
fun progressIndicator() {
CircularProgressIndicator(
Modifier.size(32.dp),
color = if (isInDarkTheme()) FileDark else FileLight,
strokeWidth = 3.dp
)
}
@Composable
fun progressCircle(progress: Long, total: Long) {
val angle = 360f * (progress.toDouble() / total.toDouble()).toFloat()
val strokeWidth = with(LocalDensity.current) { 3.dp.toPx() }
val strokeColor = if (isInDarkTheme()) FileDark else FileLight
Surface(
Modifier.drawRingModifier(angle, strokeColor, strokeWidth),
color = Color.Transparent,
shape = MaterialTheme.shapes.small.copy(CornerSize(percent = 50)),
contentColor = LocalContentColor.current
) {
Box(Modifier.size(32.dp))
}
}
@Composable
fun fileIndicator() {
Box(
@@ -164,14 +140,14 @@ fun CIFileView(
when (file.fileStatus) {
is CIFileStatus.SndStored ->
when (file.fileProtocol) {
FileProtocol.XFTP -> progressIndicator()
FileProtocol.XFTP -> CIFileViewScope.progressIndicator()
FileProtocol.SMP -> fileIcon()
FileProtocol.LOCAL -> fileIcon()
}
is CIFileStatus.SndTransfer ->
when (file.fileProtocol) {
FileProtocol.XFTP -> progressCircle(file.fileStatus.sndProgress, file.fileStatus.sndTotal)
FileProtocol.SMP -> progressIndicator()
FileProtocol.XFTP -> CIFileViewScope.progressCircle(file.fileStatus.sndProgress, file.fileStatus.sndTotal)
FileProtocol.SMP -> CIFileViewScope.progressIndicator()
FileProtocol.LOCAL -> {}
}
is CIFileStatus.SndComplete -> fileIcon(innerIcon = painterResource(MR.images.ic_check_filled))
@@ -186,9 +162,9 @@ fun CIFileView(
is CIFileStatus.RcvAccepted -> fileIcon(innerIcon = painterResource(MR.images.ic_more_horiz))
is CIFileStatus.RcvTransfer ->
if (file.fileProtocol == FileProtocol.XFTP && file.fileStatus.rcvProgress < file.fileStatus.rcvTotal) {
progressCircle(file.fileStatus.rcvProgress, file.fileStatus.rcvTotal)
CIFileViewScope.progressCircle(file.fileStatus.rcvProgress, file.fileStatus.rcvTotal)
} else {
progressIndicator()
CIFileViewScope.progressIndicator()
}
is CIFileStatus.RcvAborted ->
fileIcon(innerIcon = painterResource(MR.images.ic_sync_problem), color = MaterialTheme.colors.primary)
@@ -265,6 +241,32 @@ fun rememberSaveFileLauncher(ciFile: CIFile?): FileChooserLauncher =
}
}
object CIFileViewScope {
@Composable
fun progressIndicator() {
CircularProgressIndicator(
Modifier.size(32.dp),
color = if (isInDarkTheme()) FileDark else FileLight,
strokeWidth = 3.dp
)
}
@Composable
fun progressCircle(progress: Long, total: Long) {
val angle = 360f * (progress.toDouble() / total.toDouble()).toFloat()
val strokeWidth = with(LocalDensity.current) { 3.dp.toPx() }
val strokeColor = if (isInDarkTheme()) FileDark else FileLight
Surface(
Modifier.drawRingModifier(angle, strokeColor, strokeWidth),
color = Color.Transparent,
shape = MaterialTheme.shapes.small.copy(CornerSize(percent = 50)),
contentColor = LocalContentColor.current
) {
Box(Modifier.size(32.dp))
}
}
}
/*
class ChatItemProvider: PreviewParameterProvider<ChatItem> {
private val sentFile = ChatItem(
@@ -253,7 +253,9 @@ suspend fun setGroupMembers(rhId: Long?, groupInfo: GroupInfo, chatModel: ChatMo
}
}
chatModel.groupMembers.clear()
chatModel.groupMembersIndexes.clear()
chatModel.groupMembers.addAll(newMembers)
chatModel.populateGroupMembersIndexes()
}
@Composable
@@ -1,6 +1,8 @@
package chat.simplex.common.views.chatlist
import androidx.compose.foundation.*
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsHoveredAsState
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.*
import androidx.compose.foundation.shape.CircleShape
@@ -10,6 +12,7 @@ import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.focus.*
import androidx.compose.ui.graphics.*
import androidx.compose.ui.text.font.FontStyle
@@ -30,6 +33,8 @@ import chat.simplex.common.views.onboarding.shouldShowWhatsNew
import chat.simplex.common.views.usersettings.SettingsView
import chat.simplex.common.platform.*
import chat.simplex.common.views.call.Call
import chat.simplex.common.views.chat.group.ProgressIndicator
import chat.simplex.common.views.chat.item.CIFileViewScope
import chat.simplex.common.views.newchat.*
import chat.simplex.res.MR
import kotlinx.coroutines.*
@@ -91,7 +96,9 @@ fun ChatListView(chatModel: ChatModel, settingsState: SettingsViewState, setPerf
if (newChatSheetState.value.isVisible()) hideNewChatSheet(true) else showNewChatSheet()
}
},
Modifier.padding(end = DEFAULT_PADDING - 16.dp + endPadding, bottom = DEFAULT_PADDING - 16.dp).size(AppBarHeight * fontSizeSqrtMultiplier),
Modifier
.padding(end = DEFAULT_PADDING - 16.dp + endPadding, bottom = DEFAULT_PADDING - 16.dp)
.size(AppBarHeight * fontSizeSqrtMultiplier),
elevation = FloatingActionButtonDefaults.elevation(
defaultElevation = 0.dp,
pressedElevation = 0.dp,
@@ -187,8 +194,24 @@ private fun ConnectButton(text: String, onClick: () -> Unit) {
private fun ChatListToolbar(drawerState: DrawerState, userPickerState: MutableStateFlow<AnimatedViewState>, stopped: Boolean) {
val serversSummary: MutableState<PresentedServersSummary?> = remember { mutableStateOf(null) }
val barButtons = arrayListOf<@Composable RowScope.() -> Unit>()
if (stopped) {
val updatingProgress = remember { chatModel.updatingProgress }.value
if (updatingProgress != null) {
barButtons.add {
val interactionSource = remember { MutableInteractionSource() }
val hovered = interactionSource.collectIsHoveredAsState().value
IconButton(onClick = {
chatModel.updatingRequest?.close()
}, Modifier.hoverable(interactionSource)) {
if (hovered) {
Icon(painterResource(MR.images.ic_close), null, tint = WarningOrange)
} else if (updatingProgress == -1f) {
CIFileViewScope.progressIndicator()
} else {
CIFileViewScope.progressCircle((updatingProgress * 100).toLong(), 100)
}
}
}
} else if (stopped) {
barButtons.add {
IconButton(onClick = {
AlertManager.shared.showAlertMsg(
@@ -266,44 +289,29 @@ private fun ChatListToolbar(drawerState: DrawerState, userPickerState: MutableSt
fun SubscriptionStatusIndicator(serversSummary: MutableState<PresentedServersSummary?>, click: (() -> Unit)) {
var subs by remember { mutableStateOf(SMPServerSubs.newSMPServerSubs) }
var sess by remember { mutableStateOf(ServerSessions.newServerSessions) }
var timer: Job? by remember { mutableStateOf(null) }
val fetchInterval: Duration = 1.seconds
val scope = rememberCoroutineScope()
fun setServersSummary() {
withBGApi {
serversSummary.value = chatModel.controller.getAgentServersSummary(chatModel.remoteHostId())
suspend fun setServersSummary() {
serversSummary.value = chatModel.controller.getAgentServersSummary(chatModel.remoteHostId())
serversSummary.value?.let {
subs = it.allUsersSMP.smpTotals.subs
sess = it.allUsersSMP.smpTotals.sessions
}
serversSummary.value?.let {
subs = it.allUsersSMP.smpTotals.subs
sess = it.allUsersSMP.smpTotals.sessions
}
}
LaunchedEffect(Unit) {
setServersSummary()
timer = timer ?: scope.launch {
while (true) {
delay(fetchInterval.inWholeMilliseconds)
setServersSummary()
scope.launch {
while (isActive) {
delay(1.seconds)
if ((appPlatform.isDesktop || chatModel.chatId.value == null) && !ModalManager.start.hasModalsOpen() && !ModalManager.fullscreen.hasModalsOpen() && isAppVisibleAndFocused()) {
setServersSummary()
}
}
}
}
fun stopTimer() {
timer?.cancel()
timer = null
}
DisposableEffect(Unit) {
onDispose {
stopTimer()
}
}
SimpleButtonFrame(click = click) {
SubscriptionStatusIndicatorView(subs = subs, sess = sess)
}
@@ -25,6 +25,7 @@ import chat.simplex.common.views.chat.item.MarkdownText
import chat.simplex.common.views.helpers.*
import chat.simplex.common.model.*
import chat.simplex.common.model.GroupInfo
import chat.simplex.common.platform.appPlatform
import chat.simplex.common.platform.chatModel
import chat.simplex.common.views.chat.item.markedDeletedText
import chat.simplex.res.MR
@@ -47,11 +48,10 @@ fun ChatPreviewView(
@Composable
fun inactiveIcon() {
val sp18 = with(LocalDensity.current) { 18.sp.toDp() }
Icon(
painterResource(MR.images.ic_cancel_filled),
stringResource(MR.strings.icon_descr_group_inactive),
Modifier.size(sp18).background(MaterialTheme.colors.background, CircleShape),
Modifier.size(18.sp.toDp()).background(MaterialTheme.colors.background, CircleShape),
tint = MaterialTheme.colors.secondary
)
}
@@ -88,8 +88,7 @@ fun ChatPreviewView(
@Composable
fun VerifiedIcon() {
val sp19 = with(LocalDensity.current) { 19.sp.toDp() }
Icon(painterResource(MR.images.ic_verified_user), null, Modifier.size(sp19).padding(end = 3.dp, top = 1.dp), tint = MaterialTheme.colors.secondary)
Icon(painterResource(MR.images.ic_verified_user), null, Modifier.size(19.sp.toDp()).padding(end = 3.sp.toDp(), top = 1.sp.toDp()), tint = MaterialTheme.colors.secondary)
}
fun messageDraft(draft: ComposeState, sp20: Dp): Pair<AnnotatedString.Builder.() -> Unit, Map<String, InlineTextContent>> {
@@ -193,7 +192,12 @@ fun ChatPreviewView(
senderBold = true,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.body1.copy(color = if (isInDarkTheme()) MessagePreviewDark else MessagePreviewLight, lineHeight = 22.sp),
style = TextStyle(
fontFamily = Inter,
fontSize = 15.sp,
color = if (isInDarkTheme()) MessagePreviewDark else MessagePreviewLight,
lineHeight = 21.sp
),
inlineContent = inlineTextContent,
modifier = Modifier.fillMaxWidth(),
)
@@ -223,11 +227,10 @@ fun ChatPreviewView(
@Composable
fun progressView() {
val sp15 = with(LocalDensity.current) { 15.sp.toDp() }
CircularProgressIndicator(
Modifier
.padding(horizontal = 2.dp)
.size(sp15),
.size(15.sp.toDp())
.offset(y = 2.sp.toDp()),
color = MaterialTheme.colors.secondary,
strokeWidth = 1.5.dp
)
@@ -235,7 +238,6 @@ fun ChatPreviewView(
@Composable
fun chatStatusImage() {
val sp19 = with(LocalDensity.current) { 19.sp.toDp() }
if (cInfo is ChatInfo.Direct) {
if (cInfo.contact.active && cInfo.contact.activeConn != null) {
val descr = contactNetworkStatus?.statusString
@@ -249,7 +251,8 @@ fun ChatPreviewView(
contentDescription = descr,
tint = MaterialTheme.colors.secondary,
modifier = Modifier
.size(sp19)
.size(19.sp.toDp())
.offset(x = 2.sp.toDp())
)
else ->
@@ -272,18 +275,17 @@ fun ChatPreviewView(
Row {
Box(contentAlignment = Alignment.BottomEnd) {
ChatInfoImage(cInfo, size = 72.dp * fontSizeSqrtMultiplier)
Box(Modifier.padding(end = 6.dp, bottom = 6.dp)) {
Box(Modifier.padding(end = 6.sp.toDp(), bottom = 6.sp.toDp())) {
chatPreviewImageOverlayIcon()
}
}
Column(
modifier = Modifier
.padding(horizontal = 8.dp)
.padding(start = 8.dp, end = 8.sp.toDp())
.weight(1F)
) {
chatPreviewTitle()
val height = with(LocalDensity.current) { 46.sp.toDp() }
Row(Modifier.heightIn(min = height)) {
Row(Modifier.heightIn(min = 46.sp.toDp()).padding(top = 3.sp.toDp())) {
chatPreviewText()
}
}
@@ -292,67 +294,50 @@ fun ChatPreviewView(
contentAlignment = Alignment.TopEnd
) {
val ts = chat.chatItems.lastOrNull()?.timestampText ?: getTimestampText(chat.chatInfo.chatTs)
Text(
ts,
color = MaterialTheme.colors.secondary,
style = MaterialTheme.typography.body2,
modifier = Modifier.padding(bottom = 5.dp)
)
ChatListTimestampView(ts)
val n = chat.chatStats.unreadCount
val showNtfsIcon = !chat.chatInfo.ntfsEnabled && (chat.chatInfo is ChatInfo.Direct || chat.chatInfo is ChatInfo.Group)
val sp17 = with(LocalDensity.current) { 17.sp.toDp() }
val sp21 = with(LocalDensity.current) { 21.sp.toDp() }
val sp23 = with(LocalDensity.current) { 23.sp.toDp() }
val sp46 = with(LocalDensity.current) { 46.sp.toDp() }
if (n > 0 || chat.chatStats.unreadChat) {
Box(
Modifier.padding(top = sp23, end = with(LocalDensity.current) { 3.sp.toDp() }),
contentAlignment = Alignment.Center
) {
Modifier.padding(top = 24.5.sp.toDp())) {
Text(
if (n > 0) unreadCountStr(n) else "",
color = Color.White,
fontSize = 11.sp,
fontSize = 10.sp,
modifier = Modifier
.background(if (disabled || showNtfsIcon) MaterialTheme.colors.secondary else MaterialTheme.colors.primaryVariant, shape = CircleShape)
.badgeLayout()
.padding(horizontal = 3.dp)
.padding(vertical = 1.dp)
.padding(horizontal = 3.sp.toDp())
.padding(vertical = 1.sp.toDp())
)
}
} else if (showNtfsIcon) {
Box(
Modifier.padding(top = sp21),
contentAlignment = Alignment.Center
) {
Modifier.padding(top = 22.sp.toDp())) {
Icon(
painterResource(MR.images.ic_notifications_off_filled),
contentDescription = generalGetString(MR.strings.notifications),
tint = MaterialTheme.colors.secondary,
modifier = Modifier
.padding(horizontal = 3.dp)
.padding(vertical = 1.dp)
.size(sp17)
.size(17.sp.toDp())
.offset(x = 2.5.sp.toDp())
)
}
} else if (chat.chatInfo.chatSettings?.favorite == true) {
Box(
Modifier.padding(top = sp21),
contentAlignment = Alignment.Center
) {
Modifier.padding(top = 20.sp.toDp())) {
Icon(
painterResource(MR.images.ic_star_filled),
contentDescription = generalGetString(MR.strings.favorite_chat),
tint = MaterialTheme.colors.secondary,
modifier = Modifier
.padding(horizontal = 3.dp)
.padding(vertical = 1.dp)
.size(sp17)
.size(20.sp.toDp())
.offset(x = 2.5.sp.toDp())
)
}
}
Box(
Modifier.padding(top = sp46),
Modifier.padding(top = 46.sp.toDp()),
contentAlignment = Alignment.Center
) {
chatStatusImage()
@@ -364,13 +349,13 @@ fun ChatPreviewView(
@Composable
fun IncognitoIcon(incognito: Boolean) {
if (incognito) {
val sp21 = with(LocalDensity.current) { 21.sp.toDp() }
Icon(
painterResource(MR.images.ic_theater_comedy),
contentDescription = null,
tint = MaterialTheme.colors.secondary,
modifier = Modifier
.size(sp21)
.size(21.sp.toDp())
.offset(x = 1.sp.toDp())
)
}
}
@@ -388,6 +373,23 @@ fun unreadCountStr(n: Int): String {
return if (n < 1000) "$n" else "${n / 1000}" + stringResource(MR.strings.thousand_abbreviation)
}
@Composable fun ChatListTimestampView(ts: String) {
Box(contentAlignment = Alignment.BottomStart) {
// This should be the same font style as in title to make date located on the same line as title
Text(
" ",
style = MaterialTheme.typography.h3,
fontWeight = FontWeight.Bold,
)
Text(
ts,
Modifier.padding(bottom = 5.sp.toDp()).offset(x = if (appPlatform.isDesktop) 1.5.sp.toDp() else 0.dp),
color = MaterialTheme.colors.secondary,
style = MaterialTheme.typography.body2.copy(fontSize = 13.sp),
)
}
}
@Preview/*(
uiMode = Configuration.UI_MODE_NIGHT_YES,
showBackground = true,
@@ -1,5 +1,6 @@
package chat.simplex.common.views.chatlist
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
@@ -7,25 +8,26 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.ProfileImage
import chat.simplex.common.model.PendingContactConnection
import chat.simplex.common.model.getTimestampText
import chat.simplex.common.views.helpers.*
import chat.simplex.res.MR
@Composable
fun ContactConnectionView(contactConnection: PendingContactConnection) {
Row {
Box(Modifier.size(72.dp), contentAlignment = Alignment.Center) {
ProfileImage(size = 54.dp, null, if (contactConnection.initiated) MR.images.ic_add_link else MR.images.ic_link)
Box(Modifier.size(72.dp * fontSizeSqrtMultiplier), contentAlignment = Alignment.Center) {
ProfileImage(size = 54.dp * fontSizeSqrtMultiplier, null, if (contactConnection.initiated) MR.images.ic_add_link else MR.images.ic_link)
}
Column(
modifier = Modifier
.padding(horizontal = 8.dp)
.padding(start = 8.dp / fontSizeSqrtMultiplier, end = 8.sp.toDp())
.weight(1F)
) {
Text(
@@ -36,21 +38,25 @@ fun ContactConnectionView(contactConnection: PendingContactConnection) {
fontWeight = FontWeight.Bold,
color = MaterialTheme.colors.secondary
)
val height = with(LocalDensity.current) { 46.sp.toDp() }
Text(contactConnection.description, Modifier.heightIn(min = height), maxLines = 2, color = if (isInDarkTheme()) MessagePreviewDark else MessagePreviewLight)
Text(
contactConnection.description,
Modifier.heightIn(min = 46.sp.toDp()).padding(top = 3.sp.toDp()),
maxLines = 2,
style = TextStyle(
fontFamily = Inter,
fontSize = 15.sp,
color = if (isInDarkTheme()) MessagePreviewDark else MessagePreviewLight,
lineHeight = 21.sp
)
)
}
Box(
contentAlignment = Alignment.TopEnd
) {
val ts = getTimestampText(contactConnection.updatedAt)
Text(
ts,
color = MaterialTheme.colors.secondary,
style = MaterialTheme.typography.body2,
modifier = Modifier.padding(bottom = 5.dp)
)
ChatListTimestampView(ts)
Box(
Modifier.padding(top = 50.dp),
Modifier.padding(top = 50.sp.toDp()),
contentAlignment = Alignment.Center
) {
IncognitoIcon(contactConnection.incognito)
@@ -6,24 +6,25 @@ import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.TextStyle
import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.ChatInfoImage
import chat.simplex.common.model.ChatInfo
import chat.simplex.common.model.getTimestampText
import chat.simplex.common.views.helpers.*
import chat.simplex.res.MR
@Composable
fun ContactRequestView(contactRequest: ChatInfo.ContactRequest) {
Row {
ChatInfoImage(contactRequest, size = 72.dp)
ChatInfoImage(contactRequest, size = 72.dp * fontSizeSqrtMultiplier)
Column(
modifier = Modifier
.padding(horizontal = 8.dp)
.padding(start = 8.dp, end = 8.sp.toDp())
.weight(1F)
) {
Text(
@@ -32,21 +33,21 @@ fun ContactRequestView(contactRequest: ChatInfo.ContactRequest) {
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.h3,
fontWeight = FontWeight.Bold,
color = MaterialTheme.colors.primary
color = MaterialTheme.colors.primary,
)
Text(
stringResource(MR.strings.contact_wants_to_connect_with_you),
Modifier.heightIn(min = 46.sp.toDp()).padding(top = 3.sp.toDp()),
maxLines = 2,
style = TextStyle(
fontFamily = Inter,
fontSize = 15.sp,
color = if (isInDarkTheme()) MessagePreviewDark else MessagePreviewLight,
lineHeight = 21.sp
)
)
val height = with(LocalDensity.current) { 46.sp.toDp() }
Text(stringResource(MR.strings.contact_wants_to_connect_with_you), Modifier.heightIn(min = height), maxLines = 2, color = if (isInDarkTheme()) MessagePreviewDark else MessagePreviewLight)
}
val ts = getTimestampText(contactRequest.contactRequest.updatedAt)
Column(
Modifier.fillMaxHeight(),
) {
Text(
ts,
color = MaterialTheme.colors.secondary,
style = MaterialTheme.typography.body2,
modifier = Modifier.padding(bottom = 5.dp)
)
}
ChatListTimestampView(ts)
}
}
@@ -284,7 +284,7 @@ fun UserProfilePickerItem(
Text(
unreadCountStr(unreadCount),
color = Color.White,
fontSize = 11.sp,
fontSize = 10.sp,
modifier = Modifier
.background(MaterialTheme.colors.primaryVariant, shape = CircleShape)
.padding(2.dp)
@@ -69,16 +69,19 @@ class AlertManager {
fun showAlertDialogButtonsColumn(
title: String,
text: String? = null,
textAlign: TextAlign = TextAlign.Center,
dismissible: Boolean = true,
onDismissRequest: (() -> Unit)? = null,
hostDevice: Pair<Long?, String>? = null,
belowTextContent: @Composable (() -> Unit) = {},
buttons: @Composable () -> Unit,
) {
showAlert {
AlertDialog(
onDismissRequest = { onDismissRequest?.invoke(); hideAlert() },
onDismissRequest = { onDismissRequest?.invoke(); if (dismissible) hideAlert() },
title = alertTitle(title),
buttons = {
AlertContent(text, hostDevice, extraPadding = true) {
AlertContent(text, hostDevice, extraPadding = true, textAlign = textAlign, belowTextContent = belowTextContent) {
buttons()
}
},
@@ -286,7 +289,14 @@ private fun alertTitle(title: String): (@Composable () -> Unit)? {
}
@Composable
private fun AlertContent(text: String?, hostDevice: Pair<Long?, String>?, extraPadding: Boolean = false, content: @Composable (() -> Unit)) {
private fun AlertContent(
text: String?,
hostDevice: Pair<Long?, String>?,
extraPadding: Boolean = false,
textAlign: TextAlign = TextAlign.Center,
belowTextContent: @Composable (() -> Unit) = {},
content: @Composable (() -> Unit)
) {
BoxWithConstraints {
Column(
Modifier
@@ -300,17 +310,20 @@ private fun AlertContent(text: String?, hostDevice: Pair<Long?, String>?, extraP
CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.high) {
if (text != null) {
Column(Modifier.heightIn(max = this@BoxWithConstraints.maxHeight * 0.7f)
.padding(start = DEFAULT_PADDING, end = DEFAULT_PADDING)
.verticalScroll(rememberScrollState())
) {
SelectionContainer {
Text(
escapedHtmlToAnnotatedString(text, LocalDensity.current),
Modifier.fillMaxWidth().padding(start = DEFAULT_PADDING, end = DEFAULT_PADDING, bottom = DEFAULT_PADDING * 1.5f),
Modifier.fillMaxWidth(),
fontSize = 16.sp,
textAlign = TextAlign.Center,
textAlign = textAlign,
color = MaterialTheme.colors.secondary
)
}
belowTextContent()
Spacer(Modifier.height(DEFAULT_PADDING * 1.5f))
}
}
}
@@ -12,6 +12,7 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.*
import androidx.compose.ui.layout.ContentScale
@@ -27,7 +28,7 @@ import dev.icerock.moko.resources.ImageResource
import kotlin.math.max
@Composable
fun ChatInfoImage(chatInfo: ChatInfo, size: Dp, iconColor: Color = MaterialTheme.colors.secondaryVariant) {
fun ChatInfoImage(chatInfo: ChatInfo, size: Dp, iconColor: Color = MaterialTheme.colors.secondaryVariant, shadow: Boolean = false) {
val icon =
when (chatInfo) {
is ChatInfo.Group -> MR.images.ic_supervised_user_circle_filled
@@ -529,6 +529,12 @@ val fontSizeSqrtMultiplier: Float
val desktopDensityScaleMultiplier: Float
@Composable get() = if (appPlatform.isDesktop) remember { appPrefs.densityScale.state }.value else 1f
@Composable
fun TextUnit.toDp(): Dp {
check(type == TextUnitType.Sp) { "Only Sp can convert to Px" }
return Dp(value * LocalDensity.current.fontScale)
}
@Composable
fun DisposableEffectOnGone(always: () -> Unit = {}, whenDispose: () -> Unit = {}, whenGone: () -> Unit) {
DisposableEffect(Unit) {
@@ -66,7 +66,7 @@ private fun LinkAMobileLayout(
SectionView(generalGetString(MR.strings.this_device_name).uppercase()) {
DeviceNameField(deviceName.value ?: "") { updateDeviceName(it) }
SectionTextFooter(generalGetString(MR.strings.this_device_name_shared_with_mobile))
PreferenceToggle(stringResource(MR.strings.multicast_discoverable_via_local_network), remember { ChatModel.controller.appPrefs.offerRemoteMulticast.state }.value) {
PreferenceToggle(stringResource(MR.strings.multicast_discoverable_via_local_network), checked = remember { ChatModel.controller.appPrefs.offerRemoteMulticast.state }.value) {
ChatModel.controller.appPrefs.offerRemoteMulticast.set(it)
}
}

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