mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-06-06 22:02:29 +00:00
core, ui: chat banner (#6089)
* core: create banner item
* filter deletions
* fix query
* ios
* fixes
* remove comment
* revert diff
* refactor
* fix most tests
* fix tests
* spacer
* plans
* create banner for 1-time link initiator
* style in progress
* change background
* ui
* remove bio length limit
* ui
* create banner for client chat
* rename
* more contexts
* fix tests
* move
* fixed image size
* plans
* remove diff
* kotlin
* copy
* paddings
* paddings
* comment
* layout, messages
* fonts
* texts, icons
* kotlin refactor
* kotlin texts
* fix date
* Revert "fix date"
This reverts commit abbd48b334.
* date
* fix texts
* kotlin date
* color and corners
* kotlin
* color
* update banner, context menu in ios
* update texts, do not show epoch timestamp for banner
* fix texts
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
This commit is contained in:
@@ -316,7 +316,7 @@ func apiDeleteUser(_ userId: Int64, _ delSMPQueues: Bool, viewPwd: String?) asyn
|
||||
}
|
||||
|
||||
func apiStartChat(ctrl: chat_ctrl? = nil) throws -> Bool {
|
||||
let r: ChatResponse0 = try chatSendCmdSync(.startChat(mainApp: true, enableSndFiles: true, largeLinkData: false), ctrl: ctrl)
|
||||
let r: ChatResponse0 = try chatSendCmdSync(.startChat(mainApp: true, enableSndFiles: true, largeLinkData: true), ctrl: ctrl)
|
||||
switch r {
|
||||
case .chatStarted: return true
|
||||
case .chatRunning: return false
|
||||
|
||||
@@ -172,6 +172,7 @@ struct ChatItemContentView<Content: View>: View {
|
||||
case let .rcvDirectE2EEInfo(e2eeInfo): CIEventView(eventText: directE2EEInfoText(e2eeInfo))
|
||||
case .sndGroupE2EEInfo: CIEventView(eventText: e2eeInfoNoPQText())
|
||||
case .rcvGroupE2EEInfo: CIEventView(eventText: e2eeInfoNoPQText())
|
||||
case .chatBanner: EmptyView()
|
||||
case let .invalidJSON(json): CIInvalidJSONView(json: json)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -730,33 +730,48 @@ struct ChatView: View {
|
||||
case let .single(item, _, _): item.item
|
||||
case let .grouped(items, _, _, _, _, _, _, _): items.boxedValue.last!.item
|
||||
}
|
||||
let voiceNoFrame = voiceWithoutFrame(ci)
|
||||
let maxWidth = cInfo.chatType == .group
|
||||
? voiceNoFrame
|
||||
? (g.size.width - 28) - 42
|
||||
: (g.size.width - 28) * 0.84 - 42
|
||||
: voiceNoFrame
|
||||
? (g.size.width - 32)
|
||||
: (g.size.width - 32) * 0.84
|
||||
return ChatItemWithMenu(
|
||||
im: im,
|
||||
chat: $chat,
|
||||
index: index,
|
||||
isLastItem: index == mergedItems.boxedValue.items.count - 1,
|
||||
chatItem: ci,
|
||||
scrollToItem: scrollToItem,
|
||||
scrollToItemId: $scrollToItemId,
|
||||
merged: mergedItem,
|
||||
maxWidth: maxWidth,
|
||||
composeState: $composeState,
|
||||
selectedMember: $selectedMember,
|
||||
showChatInfoSheet: $showChatInfoSheet,
|
||||
revealedItems: $revealedItems,
|
||||
selectedChatItems: $selectedChatItems,
|
||||
forwardedChatItems: $forwardedChatItems,
|
||||
searchText: $searchText,
|
||||
closeKeyboardAndRun: closeKeyboardAndRun
|
||||
)
|
||||
return Group {
|
||||
if case .chatBanner = ci.content {
|
||||
VStack {
|
||||
ChatBannerView(chat: chat)
|
||||
.padding(.bottom, 90)
|
||||
.padding(.top, 8)
|
||||
|
||||
let listItem = mergedItem.newest()
|
||||
if let prevItem = listItem.prevItem {
|
||||
DateSeparator(date: prevItem.meta.itemTs).padding(8)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let voiceNoFrame = voiceWithoutFrame(ci)
|
||||
let maxWidth = cInfo.chatType == .group
|
||||
? voiceNoFrame
|
||||
? (g.size.width - 28) - 42
|
||||
: (g.size.width - 28) * 0.84 - 42
|
||||
: voiceNoFrame
|
||||
? (g.size.width - 32)
|
||||
: (g.size.width - 32) * 0.84
|
||||
ChatItemWithMenu(
|
||||
im: im,
|
||||
chat: $chat,
|
||||
index: index,
|
||||
isLastItem: index == mergedItems.boxedValue.items.count - 1,
|
||||
chatItem: ci,
|
||||
scrollToItem: scrollToItem,
|
||||
scrollToItemId: $scrollToItemId,
|
||||
merged: mergedItem,
|
||||
maxWidth: maxWidth,
|
||||
composeState: $composeState,
|
||||
selectedMember: $selectedMember,
|
||||
showChatInfoSheet: $showChatInfoSheet,
|
||||
revealedItems: $revealedItems,
|
||||
selectedChatItems: $selectedChatItems,
|
||||
forwardedChatItems: $forwardedChatItems,
|
||||
searchText: $searchText,
|
||||
closeKeyboardAndRun: closeKeyboardAndRun
|
||||
)
|
||||
}
|
||||
}
|
||||
// crashes on Cell size calculation without this line
|
||||
.environmentObject(ChatModel.shared)
|
||||
.environmentObject(theme) // crashes without this line when scrolling to the first unread in EndlessScrollVIew
|
||||
@@ -804,6 +819,138 @@ struct ChatView: View {
|
||||
}
|
||||
}
|
||||
|
||||
struct ChatBannerView: View {
|
||||
@EnvironmentObject var theme: AppTheme
|
||||
@AppStorage(DEFAULT_CHAT_ITEM_ROUNDNESS) private var roundness = defaultChatItemRoundness
|
||||
@ObservedObject var chat: Chat
|
||||
|
||||
var body: some View {
|
||||
let v = VStack(spacing: 8) {
|
||||
ChatInfoImage(chat: chat, size: alertProfileImageSize)
|
||||
|
||||
Text(chat.chatInfo.displayName)
|
||||
.font(.title3)
|
||||
.multilineTextAlignment(.center)
|
||||
.lineLimit(2)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
.frame(maxWidth: 240)
|
||||
|
||||
let fullName = chat.chatInfo.fullName.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
if fullName != "" && fullName != chat.chatInfo.displayName && fullName != chat.chatInfo.displayName.trimmingCharacters(in: .whitespacesAndNewlines) {
|
||||
Text(chat.chatInfo.fullName)
|
||||
.font(.subheadline)
|
||||
.multilineTextAlignment(.center)
|
||||
.lineLimit(3)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
.frame(maxWidth: 260)
|
||||
}
|
||||
|
||||
if let shortDescr = chat.chatInfo.shortDescr {
|
||||
Text(shortDescr)
|
||||
.font(.subheadline)
|
||||
.multilineTextAlignment(.center)
|
||||
.lineLimit(4)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
.padding(.horizontal)
|
||||
}
|
||||
|
||||
if let chatContext {
|
||||
Text(chatContext)
|
||||
.font(.callout)
|
||||
.foregroundColor(theme.colors.secondary)
|
||||
.padding(.top, 8)
|
||||
}
|
||||
}
|
||||
.frame(maxWidth: .infinity)
|
||||
.padding()
|
||||
.background(theme.appColors.receivedMessage)
|
||||
.clipShape(RoundedRectangle(cornerRadius: msgRectMaxRadius * roundness))
|
||||
if let (label, connLink) = chatAddress() {
|
||||
v.contextMenu {
|
||||
Button {
|
||||
let shareItems: [Any] = [connLink]
|
||||
showShareSheet(items: shareItems)
|
||||
} label: {
|
||||
Label(label, systemImage: "square.and.arrow.up")
|
||||
}
|
||||
}
|
||||
.padding(.horizontal)
|
||||
} else {
|
||||
v.padding(.horizontal)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func chatAddress() -> (label: LocalizedStringKey, connLink: String)? {
|
||||
switch chat.chatInfo {
|
||||
case let .direct(contact):
|
||||
if !contact.nextConnectPrepared && !contact.nextAcceptContactRequest {
|
||||
let connLink: String? = if let pct = contact.preparedContact, case .con = pct.uiConnLinkType {
|
||||
pct.connLinkToConnect.simplexChatUri()
|
||||
} else {
|
||||
contact.profile.contactLink
|
||||
}
|
||||
if let connLink {
|
||||
return ("SimpleX address", connLink)
|
||||
}
|
||||
}
|
||||
case let .group(groupInfo, _):
|
||||
if !groupInfo.nextConnectPrepared {
|
||||
if let pg = groupInfo.preparedGroup {
|
||||
let connLink = pg.connLinkToConnect.simplexChatUri()
|
||||
switch groupInfo.businessChat?.chatType {
|
||||
case .none: return ("Group link", connLink)
|
||||
case .business: return ("Business address", connLink)
|
||||
default: ()
|
||||
}
|
||||
}
|
||||
}
|
||||
default: ()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var chatContext: LocalizedStringKey? {
|
||||
switch chat.chatInfo {
|
||||
case let .direct(contact):
|
||||
if contact.nextConnectPrepared, let linkType = contact.preparedContact?.uiConnLinkType {
|
||||
switch linkType {
|
||||
case .inv:
|
||||
"Tap Connect to chat"
|
||||
case .con:
|
||||
"Tap Connect to send request"
|
||||
}
|
||||
} else if contact.nextAcceptContactRequest {
|
||||
"Accept contact request"
|
||||
} else {
|
||||
"Your contact"
|
||||
}
|
||||
case let .group(groupInfo, _):
|
||||
switch groupInfo.businessChat?.chatType {
|
||||
case .none:
|
||||
if groupInfo.nextConnectPrepared {
|
||||
"Tap Join group"
|
||||
} else {
|
||||
switch (groupInfo.membership.memberStatus) {
|
||||
case .memInvited: "Join group"
|
||||
case .memCreator: "Your group"
|
||||
default: "Group"
|
||||
}
|
||||
}
|
||||
case .business:
|
||||
if groupInfo.nextConnectPrepared {
|
||||
"Tap Connect to chat"
|
||||
} else {
|
||||
"Business connection"
|
||||
}
|
||||
case .customer:
|
||||
"Your business contact"
|
||||
}
|
||||
default: nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var connectingText: LocalizedStringKey? {
|
||||
switch (chat.chatInfo) {
|
||||
case let .direct(contact):
|
||||
@@ -879,7 +1026,7 @@ struct ChatView: View {
|
||||
|
||||
var body: some View {
|
||||
ZStack(alignment: .top) {
|
||||
if let date = model.date {
|
||||
if let date = model.date, date.timeIntervalSince1970 > 0 {
|
||||
DateSeparator(date: date)
|
||||
.padding(.vertical, 4).padding(.horizontal, 8)
|
||||
.background(.thinMaterial)
|
||||
|
||||
@@ -364,7 +364,11 @@ struct ChatPreviewView: View {
|
||||
}
|
||||
case let .group(groupInfo, _):
|
||||
if groupInfo.nextConnectPrepared {
|
||||
Text("Open to join")
|
||||
if groupInfo.businessChat?.chatType == .business {
|
||||
Text("Open to connect")
|
||||
} else {
|
||||
Text("Open to join")
|
||||
}
|
||||
} else {
|
||||
switch (groupInfo.membership.memberStatus) {
|
||||
case .memRejected: Text("rejected")
|
||||
|
||||
@@ -76,7 +76,7 @@ struct ChatTailPadding: ViewModifier {
|
||||
}
|
||||
}
|
||||
|
||||
private let msgRectMaxRadius: Double = 18
|
||||
let msgRectMaxRadius: Double = 18
|
||||
private let msgBubbleMaxRadius: Double = msgRectMaxRadius * 1.2
|
||||
private let msgTailWidth: Double = 9
|
||||
private let msgTailMinHeight: Double = msgTailWidth * 1.254 // ~56deg
|
||||
|
||||
@@ -28,7 +28,11 @@ struct ProfileImage: View {
|
||||
.resizable()
|
||||
.foregroundColor(c)
|
||||
.frame(width: size, height: size)
|
||||
.background(Circle().fill(backgroundColor != nil ? backgroundColor! : .clear))
|
||||
.background(
|
||||
Circle()
|
||||
.fill(backgroundColor != nil ? backgroundColor! : .clear)
|
||||
.frame(width: size - 2, height: size - 2) // less than size of Image to avoid slightly visible border
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1221,6 +1221,14 @@ swipe action</note>
|
||||
<target>Подобрен интерфейс</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Черна</target>
|
||||
@@ -1311,6 +1319,10 @@ swipe action</note>
|
||||
<target>Бизнес чатове</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -2524,6 +2536,10 @@ swipe action</note>
|
||||
<target>Описание</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Адрес на настолно устройство</target>
|
||||
@@ -6758,10 +6774,6 @@ chat item action</note>
|
||||
<source>Sent reply</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -6990,6 +7002,10 @@ chat item action</note>
|
||||
<target>Сподели с контактите</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -7367,10 +7383,22 @@ report reason</note>
|
||||
<target>Направи снимка</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Докосни бутона </target>
|
||||
@@ -8685,6 +8713,10 @@ Repeat connection request?</source>
|
||||
<target>Вашият адрес в SimpleX</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Вашите обаждания</target>
|
||||
@@ -8717,6 +8749,10 @@ Repeat connection request?</source>
|
||||
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Вашият контакт изпрати файл, който е по-голям от поддържания в момента максимален размер (%@).</target>
|
||||
@@ -8746,6 +8782,10 @@ Repeat connection request?</source>
|
||||
<target>Вашият текущ профил</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Вашите настройки</target>
|
||||
|
||||
@@ -1167,6 +1167,14 @@ swipe action</note>
|
||||
<source>Better user experience</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -1245,6 +1253,10 @@ swipe action</note>
|
||||
<source>Business chats</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -2420,6 +2432,10 @@ swipe action</note>
|
||||
<target>Popis</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -6533,10 +6549,6 @@ chat item action</note>
|
||||
<source>Sent reply</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -6761,6 +6773,10 @@ chat item action</note>
|
||||
<target>Sdílet s kontakty</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -7130,10 +7146,22 @@ report reason</note>
|
||||
<target>Vyfotit</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Klepněte na tlačítko </target>
|
||||
@@ -8393,6 +8421,10 @@ Repeat connection request?</source>
|
||||
<target>Vaše SimpleX adresa</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Vaše hovory</target>
|
||||
@@ -8425,6 +8457,10 @@ Repeat connection request?</source>
|
||||
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Kontakt odeslal soubor, který je větší než aktuálně podporovaná maximální velikost (%@).</target>
|
||||
@@ -8454,6 +8490,10 @@ Repeat connection request?</source>
|
||||
<target>Váš současný profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Vaše preference</target>
|
||||
|
||||
@@ -1257,6 +1257,14 @@ swipe action</note>
|
||||
<target>Verbesserte Nutzer-Erfahrung</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Schwarz</target>
|
||||
@@ -1347,6 +1355,10 @@ swipe action</note>
|
||||
<target>Geschäftliche Chats</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>Unternehmen</target>
|
||||
@@ -2649,6 +2661,10 @@ swipe action</note>
|
||||
<target>Beschreibung</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Desktop-Adresse</target>
|
||||
@@ -7183,11 +7199,6 @@ chat item action</note>
|
||||
<target>Gesendete Antwort</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<target>Wird nach der Verbindung an Ihren Kontakt gesendet.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>Summe aller gesendeten Nachrichten</target>
|
||||
@@ -7444,6 +7455,10 @@ chat item action</note>
|
||||
<target>Mit Kontakten teilen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<target>Verkürzter Link</target>
|
||||
@@ -7852,11 +7867,23 @@ report reason</note>
|
||||
<target>Machen Sie ein Foto</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<target>Tippen Sie im Menü auf SimpleX-Adresse erstellen, um sie später zu erstellen.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Schaltfläche antippen </target>
|
||||
@@ -9247,6 +9274,10 @@ Verbindungsanfrage wiederholen?</target>
|
||||
<target>Ihre SimpleX-Adresse</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Anrufe</target>
|
||||
@@ -9282,6 +9313,10 @@ Verbindungsanfrage wiederholen?</target>
|
||||
<target>Ihre Verbindung wurde auf %@ verschoben. Während Sie auf das Profil weitergeleitet wurden trat aber ein unerwarteter Fehler auf.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Ihr Kontakt hat eine Datei gesendet, die größer ist als die derzeit unterstützte maximale Größe (%@).</target>
|
||||
@@ -9312,6 +9347,10 @@ Verbindungsanfrage wiederholen?</target>
|
||||
<target>Mein aktuelles Chat-Profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Ihre Präferenzen</target>
|
||||
|
||||
@@ -1257,6 +1257,16 @@ swipe action</note>
|
||||
<target>Better user experience</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<target>Bio</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<target>Bio too large</target>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Black</target>
|
||||
@@ -1347,6 +1357,11 @@ swipe action</note>
|
||||
<target>Business chats</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<target>Business connection</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>Businesses</target>
|
||||
@@ -2649,6 +2664,11 @@ swipe action</note>
|
||||
<target>Description</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<target>Description too large</target>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Desktop address</target>
|
||||
@@ -7183,11 +7203,6 @@ chat item action</note>
|
||||
<target>Sent reply</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<target>Sent to your contact after connection.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>Sent total</target>
|
||||
@@ -7444,6 +7459,11 @@ chat item action</note>
|
||||
<target>Share with contacts</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<target>Short description</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<target>Short link</target>
|
||||
@@ -7852,11 +7872,26 @@ report reason</note>
|
||||
<target>Take picture</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<target>Tap Connect to chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<target>Tap Connect to send request</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<target>Tap Create SimpleX address in the menu to create it later.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<target>Tap Join group</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Tap button </target>
|
||||
@@ -9247,6 +9282,11 @@ Repeat connection request?</target>
|
||||
<target>Your SimpleX address</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<target>Your business contact</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Your calls</target>
|
||||
@@ -9282,6 +9322,11 @@ Repeat connection request?</target>
|
||||
<target>Your connection was moved to %@ but an error happened when switching profile.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<target>Your contact</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Your contact sent a file that is larger than currently supported maximum size (%@).</target>
|
||||
@@ -9312,6 +9357,11 @@ Repeat connection request?</target>
|
||||
<target>Your current profile</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<target>Your group</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Your preferences</target>
|
||||
|
||||
@@ -1257,6 +1257,14 @@ swipe action</note>
|
||||
<target>Experiencia de usuario mejorada</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Negro</target>
|
||||
@@ -1347,6 +1355,10 @@ swipe action</note>
|
||||
<target>Chats empresariales</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>Empresas</target>
|
||||
@@ -2649,6 +2661,10 @@ swipe action</note>
|
||||
<target>Descripción</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Dirección ordenador</target>
|
||||
@@ -7183,11 +7199,6 @@ chat item action</note>
|
||||
<target>Respuesta enviada</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<target>Enviado a tu contacto tras la conexión.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>Total enviados</target>
|
||||
@@ -7444,6 +7455,10 @@ chat item action</note>
|
||||
<target>Compartir con contactos</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<target>Enlace corto</target>
|
||||
@@ -7852,11 +7867,23 @@ report reason</note>
|
||||
<target>Tomar foto</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<target>Pulsa Crear dirección SimpleX en el menú para crearla más tarde.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Pulsa el botón </target>
|
||||
@@ -9247,6 +9274,10 @@ Repeat connection request?</source>
|
||||
<target>Mi dirección SimpleX</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Llamadas</target>
|
||||
@@ -9282,6 +9313,10 @@ Repeat connection request?</source>
|
||||
<target>Tu conexión ha sido trasladada a %@ pero ha ocurrido un error inesperado al redirigirte al perfil.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>El contacto ha enviado un archivo mayor al máximo admitido (%@).</target>
|
||||
@@ -9312,6 +9347,10 @@ Repeat connection request?</source>
|
||||
<target>Tu perfil actual</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Mis preferencias</target>
|
||||
|
||||
@@ -1147,6 +1147,14 @@ swipe action</note>
|
||||
<source>Better user experience</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -1224,6 +1232,10 @@ swipe action</note>
|
||||
<source>Business chats</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -2399,6 +2411,10 @@ swipe action</note>
|
||||
<target>Kuvaus</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -6506,10 +6522,6 @@ chat item action</note>
|
||||
<source>Sent reply</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -6734,6 +6746,10 @@ chat item action</note>
|
||||
<target>Jaa kontaktien kanssa</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -7102,10 +7118,22 @@ report reason</note>
|
||||
<target>Ota kuva</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Napauta painiketta </target>
|
||||
@@ -8364,6 +8392,10 @@ Repeat connection request?</source>
|
||||
<target>SimpleX-osoitteesi</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Puhelusi</target>
|
||||
@@ -8396,6 +8428,10 @@ Repeat connection request?</source>
|
||||
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Yhteyshenkilösi lähetti tiedoston, joka on suurempi kuin tällä hetkellä tuettu enimmäiskoko (%@).</target>
|
||||
@@ -8425,6 +8461,10 @@ Repeat connection request?</source>
|
||||
<target>Nykyinen profiilisi</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Asetuksesi</target>
|
||||
|
||||
@@ -1249,6 +1249,14 @@ swipe action</note>
|
||||
<target>Une meilleure expérience pour l'utilisateur</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Noir</target>
|
||||
@@ -1339,6 +1347,10 @@ swipe action</note>
|
||||
<target>Discussions professionnelles</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>Entreprises</target>
|
||||
@@ -2634,6 +2646,10 @@ swipe action</note>
|
||||
<target>Description</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Adresse de bureau</target>
|
||||
@@ -7070,10 +7086,6 @@ chat item action</note>
|
||||
<target>Réponse envoyée</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>Total envoyé</target>
|
||||
@@ -7325,6 +7337,10 @@ chat item action</note>
|
||||
<target>Partager avec vos contacts</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -7727,11 +7743,23 @@ report reason</note>
|
||||
<target>Prendre une photo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<target>Appuyez sur Créer une adresse SimpleX dans le menu pour la créer ultérieurement.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Appuyez sur le bouton </target>
|
||||
@@ -9108,6 +9136,10 @@ Répéter la demande de connexion ?</target>
|
||||
<target>Votre adresse SimpleX</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Vos appels</target>
|
||||
@@ -9142,6 +9174,10 @@ Répéter la demande de connexion ?</target>
|
||||
<target>Votre connexion a été déplacée vers %@ mais une erreur inattendue s'est produite lors de la redirection vers le profil.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Votre contact a envoyé un fichier plus grand que la taille maximale supportée actuellement(%@).</target>
|
||||
@@ -9172,6 +9208,10 @@ Répéter la demande de connexion ?</target>
|
||||
<target>Votre profil actuel</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Vos préférences</target>
|
||||
|
||||
@@ -1257,6 +1257,14 @@ swipe action</note>
|
||||
<target>Továbbfejlesztett felhasználói élmény</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Fekete</target>
|
||||
@@ -1347,6 +1355,10 @@ swipe action</note>
|
||||
<target>Üzleti csevegések</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>Üzleti</target>
|
||||
@@ -2649,6 +2661,10 @@ swipe action</note>
|
||||
<target>Leírás</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Számítógép címe</target>
|
||||
@@ -7183,11 +7199,6 @@ chat item action</note>
|
||||
<target>Válaszüzenet-buborék színe</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<target>Elküldés a partnernek a kapcsolódást követően.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>Összes elküldött üzenet</target>
|
||||
@@ -7444,6 +7455,10 @@ chat item action</note>
|
||||
<target>Megosztás a partnerekkel</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<target>Rövid hivatkozás</target>
|
||||
@@ -7852,11 +7867,23 @@ report reason</note>
|
||||
<target>Kép készítése</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<target>Koppintson a SimpleX-cím létrehozása menüpontra a későbbi létrehozáshoz.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Koppintson a </target>
|
||||
@@ -9247,6 +9274,10 @@ Repeat connection request?</source>
|
||||
<target>Profil SimpleX-címe</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Hívások</target>
|
||||
@@ -9282,6 +9313,10 @@ Repeat connection request?</source>
|
||||
<target>A kapcsolata át lett helyezve ide: %@, de egy váratlan hiba történt a profilra való átirányításkor.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>A partnere a jelenleg megengedett maximális méretű (%@) fájlnál nagyobbat küldött.</target>
|
||||
@@ -9312,6 +9347,10 @@ Repeat connection request?</source>
|
||||
<target>Jelenlegi profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Beállítások</target>
|
||||
|
||||
@@ -1257,6 +1257,14 @@ swipe action</note>
|
||||
<target>Esperienza utente migliorata</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Nero</target>
|
||||
@@ -1347,6 +1355,10 @@ swipe action</note>
|
||||
<target>Chat di lavoro</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>Lavorative</target>
|
||||
@@ -2649,6 +2661,10 @@ swipe action</note>
|
||||
<target>Descrizione</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Indirizzo desktop</target>
|
||||
@@ -7183,11 +7199,6 @@ chat item action</note>
|
||||
<target>Risposta inviata</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<target>Inviato al tuo contatto dopo la connessione.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>Totale inviato</target>
|
||||
@@ -7444,6 +7455,10 @@ chat item action</note>
|
||||
<target>Condividi con i contatti</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<target>Link breve</target>
|
||||
@@ -7852,11 +7867,23 @@ report reason</note>
|
||||
<target>Scatta foto</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<target>Tocca Crea indirizzo SimpleX nel menu per crearlo più tardi.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Tocca il pulsante </target>
|
||||
@@ -9247,6 +9274,10 @@ Ripetere la richiesta di connessione?</target>
|
||||
<target>Il tuo indirizzo SimpleX</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Le tue chiamate</target>
|
||||
@@ -9282,6 +9313,10 @@ Ripetere la richiesta di connessione?</target>
|
||||
<target>La tua connessione è stata spostata a %@, ma si è verificato un errore imprevisto durante il reindirizzamento al profilo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Il tuo contatto ha inviato un file più grande della dimensione massima attualmente supportata (%@).</target>
|
||||
@@ -9312,6 +9347,10 @@ Ripetere la richiesta di connessione?</target>
|
||||
<target>Il tuo profilo attuale</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Le tue preferenze</target>
|
||||
|
||||
@@ -1196,6 +1196,14 @@ swipe action</note>
|
||||
<source>Better user experience</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -1274,6 +1282,10 @@ swipe action</note>
|
||||
<source>Business chats</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -2469,6 +2481,10 @@ swipe action</note>
|
||||
<target>説明</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -6576,10 +6592,6 @@ chat item action</note>
|
||||
<source>Sent reply</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -6804,6 +6816,10 @@ chat item action</note>
|
||||
<target>連絡先と共有する</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -7173,10 +7189,22 @@ report reason</note>
|
||||
<target>写真を撮影</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>ボタンをタップ </target>
|
||||
@@ -8435,6 +8463,10 @@ Repeat connection request?</source>
|
||||
<target>あなたのSimpleXアドレス</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>あなたの通話</target>
|
||||
@@ -8467,6 +8499,10 @@ Repeat connection request?</source>
|
||||
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>連絡先が現在サポートされている最大サイズ (%@) より大きいファイルを送信しました。</target>
|
||||
@@ -8496,6 +8532,10 @@ Repeat connection request?</source>
|
||||
<target>現在のプロフィール</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>あなたの設定</target>
|
||||
|
||||
@@ -1254,6 +1254,14 @@ swipe action</note>
|
||||
<target>Betere gebruikerservaring</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Zwart</target>
|
||||
@@ -1344,6 +1352,10 @@ swipe action</note>
|
||||
<target>Zakelijke chats</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>bedrijven</target>
|
||||
@@ -2643,6 +2655,10 @@ swipe action</note>
|
||||
<target>Beschrijving</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Desktop adres</target>
|
||||
@@ -7149,10 +7165,6 @@ chat item action</note>
|
||||
<target>Antwoord verzonden</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>Totaal verzonden</target>
|
||||
@@ -7407,6 +7419,10 @@ chat item action</note>
|
||||
<target>Delen met contacten</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<target>Korte link</target>
|
||||
@@ -7814,11 +7830,23 @@ report reason</note>
|
||||
<target>Foto nemen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<target>Tik op SimpleX-adres maken in het menu om het later te maken.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Tik op de knop </target>
|
||||
@@ -9207,6 +9235,10 @@ Verbindingsverzoek herhalen?</target>
|
||||
<target>Uw SimpleX adres</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Uw oproepen</target>
|
||||
@@ -9241,6 +9273,10 @@ Verbindingsverzoek herhalen?</target>
|
||||
<target>Uw verbinding is verplaatst naar %@, maar er is een onverwachte fout opgetreden tijdens het omleiden naar het profiel.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Uw contact heeft een bestand verzonden dat groter is dan de momenteel ondersteunde maximale grootte (%@).</target>
|
||||
@@ -9271,6 +9307,10 @@ Verbindingsverzoek herhalen?</target>
|
||||
<target>Je huidige profiel</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Jouw voorkeuren</target>
|
||||
|
||||
@@ -1248,6 +1248,14 @@ swipe action</note>
|
||||
<target>Lepszy interfejs użytkownika</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Czarny</target>
|
||||
@@ -1338,6 +1346,10 @@ swipe action</note>
|
||||
<target>Czaty biznesowe</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>Firmy</target>
|
||||
@@ -2603,6 +2615,10 @@ swipe action</note>
|
||||
<target>Opis</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Adres komputera</target>
|
||||
@@ -6975,10 +6991,6 @@ chat item action</note>
|
||||
<target>Wyślij odpowiedź</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>Wysłano łącznie</target>
|
||||
@@ -7223,6 +7235,10 @@ chat item action</note>
|
||||
<target>Udostępnij kontaktom</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -7617,10 +7633,22 @@ report reason</note>
|
||||
<target>Zrób zdjęcie</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Naciśnij przycisk </target>
|
||||
@@ -8975,6 +9003,10 @@ Powtórzyć prośbę połączenia?</target>
|
||||
<target>Twój adres SimpleX</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Twoje połączenia</target>
|
||||
@@ -9009,6 +9041,10 @@ Powtórzyć prośbę połączenia?</target>
|
||||
<target>Twoje połączenie zostało przeniesione do %@, ale podczas przekierowywania do profilu wystąpił nieoczekiwany błąd.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Twój kontakt wysłał plik, który jest większy niż obecnie obsługiwany maksymalny rozmiar (%@).</target>
|
||||
@@ -9039,6 +9075,10 @@ Powtórzyć prośbę połączenia?</target>
|
||||
<target>Twój obecny profil</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Twoje preferencje</target>
|
||||
|
||||
@@ -1257,6 +1257,14 @@ swipe action</note>
|
||||
<target>Улучшенный интерфейс</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Черная</target>
|
||||
@@ -1347,6 +1355,10 @@ swipe action</note>
|
||||
<target>Бизнес разговоры</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>Бизнесы</target>
|
||||
@@ -2649,6 +2661,10 @@ swipe action</note>
|
||||
<target>Описание</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Адрес компьютера</target>
|
||||
@@ -7181,11 +7197,6 @@ chat item action</note>
|
||||
<target>Отправленный ответ</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<target>Отправляется Вашему контакту после соединения.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>Всего отправлено</target>
|
||||
@@ -7442,6 +7453,10 @@ chat item action</note>
|
||||
<target>Поделиться с контактами</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<target>Короткая ссылка</target>
|
||||
@@ -7850,11 +7865,23 @@ report reason</note>
|
||||
<target>Сделать фото</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<target>Нажмите Создать адрес SimpleX в меню, чтобы создать его позже.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Нажмите кнопку </target>
|
||||
@@ -9245,6 +9272,10 @@ Repeat connection request?</source>
|
||||
<target>Ваш адрес SimpleX</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Ваши звонки</target>
|
||||
@@ -9279,6 +9310,10 @@ Repeat connection request?</source>
|
||||
<target>Соединение было перемещено на %@, но при смене профиля произошла неожиданная ошибка.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Ваш контакт отправил файл, размер которого превышает максимальный размер (%@).</target>
|
||||
@@ -9309,6 +9344,10 @@ Repeat connection request?</source>
|
||||
<target>Ваш активный профиль</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Ваши предпочтения</target>
|
||||
|
||||
@@ -1139,6 +1139,14 @@ swipe action</note>
|
||||
<source>Better user experience</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -1216,6 +1224,10 @@ swipe action</note>
|
||||
<source>Business chats</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -2387,6 +2399,10 @@ swipe action</note>
|
||||
<target>คำอธิบาย</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -6481,10 +6497,6 @@ chat item action</note>
|
||||
<source>Sent reply</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -6709,6 +6721,10 @@ chat item action</note>
|
||||
<target>แชร์กับผู้ติดต่อ</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -7075,10 +7091,22 @@ report reason</note>
|
||||
<target>ถ่ายภาพ</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>แตะปุ่ม </target>
|
||||
@@ -8333,6 +8361,10 @@ Repeat connection request?</source>
|
||||
<target>ที่อยู่ SimpleX ของคุณ</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>การโทรของคุณ</target>
|
||||
@@ -8365,6 +8397,10 @@ Repeat connection request?</source>
|
||||
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>ผู้ติดต่อของคุณส่งไฟล์ที่ใหญ่กว่าขนาดสูงสุดที่รองรับในปัจจุบัน (%@)</target>
|
||||
@@ -8394,6 +8430,10 @@ Repeat connection request?</source>
|
||||
<target>โปรไฟล์ปัจจุบันของคุณ</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>การตั้งค่าของคุณ</target>
|
||||
|
||||
@@ -1257,6 +1257,14 @@ swipe action</note>
|
||||
<target>Daha iyi kullanıcı deneyimi</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Siyah</target>
|
||||
@@ -1347,6 +1355,10 @@ swipe action</note>
|
||||
<target>İş konuşmaları</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>İşletmeler</target>
|
||||
@@ -2649,6 +2661,10 @@ swipe action</note>
|
||||
<target>Açıklama</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Bilgisayar adresi</target>
|
||||
@@ -7183,11 +7199,6 @@ chat item action</note>
|
||||
<target>Gönderilen cevap</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<target>Bağlantıdan sonra kişinize gönderildi.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>Gönderilen tüm mesajların toplamı</target>
|
||||
@@ -7444,6 +7455,10 @@ chat item action</note>
|
||||
<target>Kişilerle paylaş</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<target>Kısa bağlantı</target>
|
||||
@@ -7852,11 +7867,23 @@ report reason</note>
|
||||
<target>Fotoğraf çek</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<target>Daha sonra oluşturmak için menüden BasitX adresi oluştur'a dokunun.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Tuşa bas </target>
|
||||
@@ -9247,6 +9274,10 @@ Bağlantı isteği tekrarlansın mı?</target>
|
||||
<target>SimpleX adresin</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Aramaların</target>
|
||||
@@ -9282,6 +9313,10 @@ Bağlantı isteği tekrarlansın mı?</target>
|
||||
<target>Bağlantınız %@ adresine taşındı ancak sizi profile yönlendirirken beklenmedik bir hata oluştu.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Kişiniz şu anda desteklenen maksimum boyuttan (%@) daha büyük bir dosya gönderdi.</target>
|
||||
@@ -9312,6 +9347,10 @@ Bağlantı isteği tekrarlansın mı?</target>
|
||||
<target>Mevcut profiliniz</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Tercihleriniz</target>
|
||||
|
||||
@@ -1254,6 +1254,14 @@ swipe action</note>
|
||||
<target>Покращений користувацький досвід</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>Чорний</target>
|
||||
@@ -1344,6 +1352,10 @@ swipe action</note>
|
||||
<target>Ділові чати</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>Бізнеси</target>
|
||||
@@ -2643,6 +2655,10 @@ swipe action</note>
|
||||
<target>Опис</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>Адреса робочого столу</target>
|
||||
@@ -7094,10 +7110,6 @@ chat item action</note>
|
||||
<target>Надіслано відповідь</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>Відправлено всього</target>
|
||||
@@ -7349,6 +7361,10 @@ chat item action</note>
|
||||
<target>Поділіться з контактами</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -7751,11 +7767,23 @@ report reason</note>
|
||||
<target>Сфотографуйте</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<target>Натисніть «Створити адресу SimpleX» у меню, щоб створити її пізніше.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>Натисніть кнопку </target>
|
||||
@@ -9132,6 +9160,10 @@ Repeat connection request?</source>
|
||||
<target>Ваша адреса SimpleX</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>Твої дзвінки</target>
|
||||
@@ -9166,6 +9198,10 @@ Repeat connection request?</source>
|
||||
<target>Ваше з'єднання було переміщено на %@, але під час перенаправлення на профіль сталася несподівана помилка.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>Ваш контакт надіслав файл, розмір якого перевищує підтримуваний на цей момент максимальний розмір (%@).</target>
|
||||
@@ -9196,6 +9232,10 @@ Repeat connection request?</source>
|
||||
<target>Ваш поточний профіль</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>Ваші уподобання</target>
|
||||
|
||||
@@ -1251,6 +1251,14 @@ swipe action</note>
|
||||
<target>更佳的使用体验</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve">
|
||||
<source>Bio</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve">
|
||||
<source>Bio too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Black" xml:space="preserve">
|
||||
<source>Black</source>
|
||||
<target>黑色</target>
|
||||
@@ -1341,6 +1349,10 @@ swipe action</note>
|
||||
<target>企业聊天</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Business connection" xml:space="preserve">
|
||||
<source>Business connection</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Businesses" xml:space="preserve">
|
||||
<source>Businesses</source>
|
||||
<target>企业</target>
|
||||
@@ -2635,6 +2647,10 @@ swipe action</note>
|
||||
<target>描述</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve">
|
||||
<source>Description too large</source>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Desktop address" xml:space="preserve">
|
||||
<source>Desktop address</source>
|
||||
<target>桌面地址</target>
|
||||
@@ -7099,10 +7115,6 @@ chat item action</note>
|
||||
<target>已发送回复</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
|
||||
<source>Sent to your contact after connection.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sent total" xml:space="preserve">
|
||||
<source>Sent total</source>
|
||||
<target>发送总数</target>
|
||||
@@ -7344,6 +7356,10 @@ chat item action</note>
|
||||
<target>与联系人分享</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short description" xml:space="preserve">
|
||||
<source>Short description</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Short link" xml:space="preserve">
|
||||
<source>Short link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -7742,10 +7758,22 @@ report reason</note>
|
||||
<target>拍照</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to chat" xml:space="preserve">
|
||||
<source>Tap Connect to chat</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to send request" xml:space="preserve">
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
|
||||
<source>Tap Create SimpleX address in the menu to create it later.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
<source>Tap button </source>
|
||||
<target>点击按钮 </target>
|
||||
@@ -9095,6 +9123,10 @@ Repeat connection request?</source>
|
||||
<target>您的 SimpleX 地址</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your business contact" xml:space="preserve">
|
||||
<source>Your business contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your calls" xml:space="preserve">
|
||||
<source>Your calls</source>
|
||||
<target>您的通话</target>
|
||||
@@ -9127,6 +9159,10 @@ Repeat connection request?</source>
|
||||
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact" xml:space="preserve">
|
||||
<source>Your contact</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||
<target>您的联系人发送的文件大于当前支持的最大大小 (%@)。</target>
|
||||
@@ -9156,6 +9192,10 @@ Repeat connection request?</source>
|
||||
<target>您当前的资料</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your group" xml:space="preserve">
|
||||
<source>Your group</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your preferences" xml:space="preserve">
|
||||
<source>Your preferences</source>
|
||||
<target>您的偏好设置</target>
|
||||
|
||||
@@ -2929,6 +2929,7 @@ public struct ChatItem: Identifiable, Decodable, Hashable {
|
||||
case .rcvDirectE2EEInfo: return false
|
||||
case .sndGroupE2EEInfo: return false
|
||||
case .rcvGroupE2EEInfo: return false
|
||||
case .chatBanner: return false
|
||||
case .invalidJSON: return false
|
||||
}
|
||||
}
|
||||
@@ -2996,6 +2997,7 @@ public struct ChatItem: Identifiable, Decodable, Hashable {
|
||||
case .rcvDirectE2EEInfo: return false
|
||||
case .sndGroupE2EEInfo: return false
|
||||
case .rcvGroupE2EEInfo: return false
|
||||
case .chatBanner: return false
|
||||
default: return true
|
||||
}
|
||||
}
|
||||
@@ -3656,6 +3658,7 @@ public enum CIContent: Decodable, ItemContent, Hashable {
|
||||
case rcvDirectE2EEInfo(e2eeInfo: E2EEInfo)
|
||||
case sndGroupE2EEInfo(e2eeInfo: E2EEInfo)
|
||||
case rcvGroupE2EEInfo(e2eeInfo: E2EEInfo)
|
||||
case chatBanner
|
||||
case invalidJSON(json: Data?)
|
||||
|
||||
public var text: String {
|
||||
@@ -3691,6 +3694,7 @@ public enum CIContent: Decodable, ItemContent, Hashable {
|
||||
case let .rcvDirectE2EEInfo(e2eeInfo): return directE2EEInfoStr(e2eeInfo)
|
||||
case .sndGroupE2EEInfo: return e2eeInfoNoPQStr
|
||||
case .rcvGroupE2EEInfo: return e2eeInfoNoPQStr
|
||||
case .chatBanner: return ""
|
||||
case .invalidJSON: return NSLocalizedString("invalid data", comment: "invalid chat item")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2813,6 +2813,7 @@ data class ChatItem (
|
||||
is CIContent.RcvDirectE2EEInfo -> false
|
||||
is CIContent.SndGroupE2EEInfo -> false
|
||||
is CIContent.RcvGroupE2EEInfo -> false
|
||||
is CIContent.ChatBanner -> false
|
||||
else -> true
|
||||
}
|
||||
|
||||
@@ -2879,6 +2880,7 @@ data class ChatItem (
|
||||
is CIContent.RcvDirectE2EEInfo -> false
|
||||
is CIContent.SndGroupE2EEInfo -> false
|
||||
is CIContent.RcvGroupE2EEInfo -> false
|
||||
is CIContent.ChatBanner -> false
|
||||
is CIContent.InvalidJSON -> false
|
||||
}
|
||||
|
||||
@@ -3549,6 +3551,7 @@ sealed class CIContent: ItemContent {
|
||||
@Serializable @SerialName("rcvDirectE2EEInfo") class RcvDirectE2EEInfo(val e2eeInfo: E2EEInfo): CIContent() { override val msgContent: MsgContent? get() = null }
|
||||
@Serializable @SerialName("sndGroupE2EEInfo") class SndGroupE2EEInfo(val e2eeInfo: E2EEInfo): CIContent() { override val msgContent: MsgContent? get() = null }
|
||||
@Serializable @SerialName("rcvGroupE2EEInfo") class RcvGroupE2EEInfo(val e2eeInfo: E2EEInfo): CIContent() { override val msgContent: MsgContent? get() = null }
|
||||
@Serializable @SerialName("chatBanner") object ChatBanner: CIContent() { override val msgContent: MsgContent? get() = null }
|
||||
@Serializable @SerialName("invalidJSON") data class InvalidJSON(val json: String): CIContent() { override val msgContent: MsgContent? get() = null }
|
||||
|
||||
override val text: String get() = when (this) {
|
||||
@@ -3582,6 +3585,7 @@ sealed class CIContent: ItemContent {
|
||||
is RcvDirectE2EEInfo -> directE2EEInfoStr(e2eeInfo)
|
||||
is SndGroupE2EEInfo -> e2eeInfoNoPQStr
|
||||
is RcvGroupE2EEInfo -> e2eeInfoNoPQStr
|
||||
is ChatBanner -> ""
|
||||
is InvalidJSON -> "invalid data"
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -883,7 +883,7 @@ object ChatController {
|
||||
}
|
||||
|
||||
suspend fun apiStartChat(ctrl: ChatCtrl? = null): Boolean {
|
||||
val r = sendCmd(null, CC.StartChat(mainApp = true, largeLinkData = false), ctrl)
|
||||
val r = sendCmd(null, CC.StartChat(mainApp = true, largeLinkData = true), ctrl)
|
||||
when (r.result) {
|
||||
is CR.ChatStarted -> return true
|
||||
is CR.ChatRunning -> return false
|
||||
|
||||
+181
-33
@@ -42,7 +42,9 @@ import chat.simplex.common.model.GroupInfo
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.platform.AudioPlayer
|
||||
import chat.simplex.common.views.newchat.ContactConnectionInfoView
|
||||
import chat.simplex.common.views.newchat.alertProfileImageSize
|
||||
import chat.simplex.res.MR
|
||||
import dev.icerock.moko.resources.ImageResource
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.flow.*
|
||||
import kotlinx.datetime.*
|
||||
@@ -1754,6 +1756,127 @@ fun BoxScope.ChatItemsList(
|
||||
ChatItemView(cItem, range, itemSeparation, previousItemSeparationLargeGap)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun ChatBannerView() {
|
||||
fun chatContext(): String? {
|
||||
return when (chatInfo) {
|
||||
is ChatInfo.Direct -> {
|
||||
val contact = chatInfo.contact
|
||||
val preparedLinkType = contact.preparedContact?.uiConnLinkType
|
||||
if (contact.nextConnectPrepared && preparedLinkType != null) {
|
||||
when (preparedLinkType) {
|
||||
ConnectionMode.Inv -> generalGetString(MR.strings.chat_banner_connect_to_chat)
|
||||
ConnectionMode.Con -> generalGetString(MR.strings.chat_banner_send_request_to_connect)
|
||||
}
|
||||
} else if (contact.nextAcceptContactRequest) {
|
||||
generalGetString(MR.strings.chat_banner_accept_contact_request)
|
||||
} else {
|
||||
generalGetString(MR.strings.chat_banner_your_contact)
|
||||
}
|
||||
}
|
||||
|
||||
is ChatInfo.Group -> {
|
||||
val groupInfo = chatInfo.groupInfo
|
||||
when (groupInfo.businessChat?.chatType) {
|
||||
null -> {
|
||||
if (groupInfo.nextConnectPrepared) {
|
||||
generalGetString(MR.strings.chat_banner_join_group)
|
||||
} else {
|
||||
when (groupInfo.membership.memberStatus) {
|
||||
GroupMemberStatus.MemInvited -> generalGetString(MR.strings.chat_banner_join_group)
|
||||
GroupMemberStatus.MemCreator -> generalGetString(MR.strings.chat_banner_your_group)
|
||||
else -> generalGetString(MR.strings.chat_banner_group)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BusinessChatType.Business ->
|
||||
if (groupInfo.nextConnectPrepared) {
|
||||
generalGetString(MR.strings.chat_banner_connect_to_chat)
|
||||
} else {
|
||||
generalGetString(MR.strings.chat_banner_business_connection)
|
||||
}
|
||||
BusinessChatType.Customer ->
|
||||
generalGetString(MR.strings.chat_banner_your_business_contact)
|
||||
}
|
||||
}
|
||||
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
Box(
|
||||
Modifier
|
||||
.clipChatItem()
|
||||
.background(MaterialTheme.appColors.receivedMessage)
|
||||
) {
|
||||
val bannerModifier = if (appPlatform.isDesktop) Modifier.width(400.dp) else Modifier.fillMaxWidth()
|
||||
Column(
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
modifier = bannerModifier
|
||||
.padding(horizontal = DEFAULT_PADDING)
|
||||
.padding(bottom = DEFAULT_PADDING)
|
||||
// ChatInfoImage has its own padding somewhere,
|
||||
// also not doing verticalArrangement = Arrangement.spacedBy(DEFAULT_PADDING_HALF) because of it
|
||||
.padding(top = DEFAULT_PADDING_HALF)
|
||||
.background(MaterialTheme.appColors.receivedMessage)
|
||||
) {
|
||||
ChatInfoImage(chatInfo, size = alertProfileImageSize, iconColor = MaterialTheme.colors.secondaryVariant.mixWith(MaterialTheme.colors.onBackground, 0.97f))
|
||||
Text(
|
||||
chatInfo.displayName,
|
||||
style = MaterialTheme.typography.h3,
|
||||
color = MaterialTheme.colors.onBackground,
|
||||
textAlign = TextAlign.Center,
|
||||
maxLines = 2,
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
modifier = Modifier
|
||||
.widthIn(max = 240.dp)
|
||||
)
|
||||
|
||||
val fullName = chatInfo.fullName.trim()
|
||||
if (fullName.isNotEmpty() && fullName != chatInfo.displayName && fullName != chatInfo.displayName.trim()) {
|
||||
Text(
|
||||
fullName,
|
||||
style = MaterialTheme.typography.h4,
|
||||
color = MaterialTheme.colors.onBackground,
|
||||
textAlign = TextAlign.Center,
|
||||
maxLines = 3,
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
modifier = Modifier
|
||||
.widthIn(max = 260.dp)
|
||||
.padding(top = DEFAULT_PADDING_HALF)
|
||||
)
|
||||
}
|
||||
|
||||
val descr = chatInfo.shortDescr?.trim()
|
||||
if (descr != null && descr != "") {
|
||||
Text(
|
||||
descr,
|
||||
style = MaterialTheme.typography.body2,
|
||||
color = MaterialTheme.colors.onBackground,
|
||||
textAlign = TextAlign.Center,
|
||||
maxLines = 4,
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
lineHeight = 21.sp,
|
||||
modifier = Modifier
|
||||
.padding(top = DEFAULT_PADDING_HALF)
|
||||
)
|
||||
}
|
||||
|
||||
val contextStr = chatContext()
|
||||
if (contextStr != null) {
|
||||
Text(
|
||||
contextStr,
|
||||
style = MaterialTheme.typography.body2,
|
||||
color = MaterialTheme.colors.secondary,
|
||||
modifier = Modifier.padding(top = DEFAULT_PADDING)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LazyColumnWithScrollBar(
|
||||
Modifier.align(Alignment.BottomCenter),
|
||||
state = listState.value,
|
||||
@@ -1768,42 +1891,62 @@ fun BoxScope.ChatItemsList(
|
||||
) {
|
||||
val mergedItemsValue = mergedItems.value
|
||||
itemsIndexed(mergedItemsValue.items, key = { _, merged -> keyForItem(merged.newest().item) }) { index, merged ->
|
||||
val isLastItem = index == mergedItemsValue.items.lastIndex
|
||||
val last = if (isLastItem) reversedChatItems.value.lastOrNull() else null
|
||||
val listItem = merged.newest()
|
||||
val item = listItem.item
|
||||
val range = if (merged is MergedItem.Grouped) {
|
||||
merged.rangeInReversed.value
|
||||
} else {
|
||||
null
|
||||
}
|
||||
val showAvatar = shouldShowAvatar(item, merged.oldest().nextItem)
|
||||
val isRevealed = remember { derivedStateOf { revealedItems.value.contains(item.id) } }
|
||||
val itemSeparation: ItemSeparation
|
||||
val prevItemSeparationLargeGap: Boolean
|
||||
if (merged is MergedItem.Single || isRevealed.value) {
|
||||
val prev = listItem.prevItem
|
||||
itemSeparation = getItemSeparation(item, prev)
|
||||
val nextForGap = if ((item.mergeCategory != null && item.mergeCategory == prev?.mergeCategory) || isLastItem) null else listItem.nextItem
|
||||
prevItemSeparationLargeGap = if (nextForGap == null) false else getItemSeparationLargeGap(nextForGap, item)
|
||||
} else {
|
||||
itemSeparation = getItemSeparation(item, null)
|
||||
prevItemSeparationLargeGap = false
|
||||
}
|
||||
ChatViewListItem(index == 0, rememberUpdatedState(range), showAvatar, item, itemSeparation, prevItemSeparationLargeGap, isRevealed) {
|
||||
if (merged is MergedItem.Grouped) merged.reveal(it, revealedItems)
|
||||
}
|
||||
|
||||
if (last != null) {
|
||||
// no using separate item(){} block in order to have total number of items in LazyColumn match number of merged items
|
||||
DateSeparator(last.meta.itemTs)
|
||||
}
|
||||
if (item.isRcvNew) {
|
||||
val itemIds = when (merged) {
|
||||
is MergedItem.Single -> listOf(merged.item.item.id)
|
||||
is MergedItem.Grouped -> merged.items.map { it.item.id }
|
||||
if (item.content is CIContent.ChatBanner) {
|
||||
Column {
|
||||
Box(
|
||||
contentAlignment = Alignment.Center,
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(horizontal = DEFAULT_PADDING)
|
||||
.padding(bottom = 90.dp, top = DEFAULT_PADDING)
|
||||
) {
|
||||
ChatBannerView()
|
||||
}
|
||||
|
||||
val prevItem = listItem.prevItem
|
||||
if (prevItem != null) {
|
||||
DateSeparator(prevItem.meta.itemTs)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
val isLastItem = index == mergedItemsValue.items.lastIndex
|
||||
val last = if (isLastItem) reversedChatItems.value.lastOrNull() else null
|
||||
val range = if (merged is MergedItem.Grouped) {
|
||||
merged.rangeInReversed.value
|
||||
} else {
|
||||
null
|
||||
}
|
||||
val showAvatar = shouldShowAvatar(item, merged.oldest().nextItem)
|
||||
val isRevealed = remember { derivedStateOf { revealedItems.value.contains(item.id) } }
|
||||
val itemSeparation: ItemSeparation
|
||||
val prevItemSeparationLargeGap: Boolean
|
||||
if (merged is MergedItem.Single || isRevealed.value) {
|
||||
val prev = listItem.prevItem
|
||||
itemSeparation = getItemSeparation(item, prev)
|
||||
val nextForGap = if ((item.mergeCategory != null && item.mergeCategory == prev?.mergeCategory) || isLastItem) null else listItem.nextItem
|
||||
prevItemSeparationLargeGap = if (nextForGap == null) false else getItemSeparationLargeGap(nextForGap, item)
|
||||
} else {
|
||||
itemSeparation = getItemSeparation(item, null)
|
||||
prevItemSeparationLargeGap = false
|
||||
}
|
||||
ChatViewListItem(index == 0, rememberUpdatedState(range), showAvatar, item, itemSeparation, prevItemSeparationLargeGap, isRevealed) {
|
||||
if (merged is MergedItem.Grouped) merged.reveal(it, revealedItems)
|
||||
}
|
||||
|
||||
if (last != null) {
|
||||
// no using separate item(){} block in order to have total number of items in LazyColumn match number of merged items
|
||||
DateSeparator(last.meta.itemTs)
|
||||
}
|
||||
if (item.isRcvNew) {
|
||||
val itemIds = when (merged) {
|
||||
is MergedItem.Single -> listOf(merged.item.item.id)
|
||||
is MergedItem.Grouped -> merged.items.map { it.item.id }
|
||||
}
|
||||
MarkItemsReadAfterDelay(keyForItem(item), itemIds, finishedInitialComposition, chatInfo.id, listState, markItemsRead)
|
||||
}
|
||||
MarkItemsReadAfterDelay(keyForItem(item), itemIds, finishedInitialComposition, chatInfo.id, listState, markItemsRead)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2256,7 +2399,12 @@ private fun FloatingDate(
|
||||
if (listState.value.layoutInfo.visibleItemsInfo.lastIndex >= 0) {
|
||||
val lastVisibleChatItem = lastFullyVisibleIemInListState(topPaddingToContentPx, density, fontSizeSqrtMultiplier, mergedItems, listState)
|
||||
val timeZone = TimeZone.currentSystemDefault()
|
||||
lastVisibleChatItem?.meta?.itemTs?.toLocalDateTime(timeZone)?.date?.atStartOfDayIn(timeZone)
|
||||
val itemTs = lastVisibleChatItem?.meta?.itemTs
|
||||
if (itemTs != null && itemTs.epochSeconds > 0) {
|
||||
itemTs.toLocalDateTime(timeZone).date.atStartOfDayIn(timeZone)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
+1
@@ -787,6 +787,7 @@ fun ChatItemView(
|
||||
is CIContent.RcvDirectE2EEInfo -> DirectE2EEInfoText(c.e2eeInfo)
|
||||
is CIContent.SndGroupE2EEInfo -> E2EEInfoNoPQText()
|
||||
is CIContent.RcvGroupE2EEInfo -> E2EEInfoNoPQText()
|
||||
is CIContent.ChatBanner -> Spacer(modifier = Modifier.size(0.dp))
|
||||
is CIContent.InvalidJSON -> {
|
||||
CIInvalidJSONView(c.json)
|
||||
DeleteItemMenu()
|
||||
|
||||
+4
-1
@@ -192,7 +192,10 @@ fun ChatPreviewView(
|
||||
|
||||
is ChatInfo.Group ->
|
||||
if (cInfo.groupInfo.nextConnectPrepared) {
|
||||
stringResource(MR.strings.group_preview_open_to_join) to Color.Unspecified
|
||||
stringResource(
|
||||
if (cInfo.groupInfo.businessChat?.chatType == BusinessChatType.Business) MR.strings.open_to_connect
|
||||
else MR.strings.group_preview_open_to_join
|
||||
) to Color.Unspecified
|
||||
} else {
|
||||
when (cInfo.groupInfo.membership.memberStatus) {
|
||||
GroupMemberStatus.MemRejected -> stringResource(MR.strings.group_preview_rejected) to Color.Unspecified
|
||||
|
||||
@@ -485,6 +485,17 @@
|
||||
<string name="group_new_support_chat_one">1 chat with a member</string>
|
||||
<string name="group_new_support_chats_short">%d chat(s)</string>
|
||||
|
||||
<!-- ChatBannerView -->
|
||||
<string name="chat_banner_connect_to_chat">Tap Connect to chat</string>
|
||||
<string name="chat_banner_send_request_to_connect">Tap Connect to send request</string>
|
||||
<string name="chat_banner_accept_contact_request">Accept contact request</string>
|
||||
<string name="chat_banner_your_contact">Your contact</string>
|
||||
<string name="chat_banner_join_group">Tap Join group</string>
|
||||
<string name="chat_banner_your_group">Your group</string>
|
||||
<string name="chat_banner_group">Group</string>
|
||||
<string name="chat_banner_business_connection">Business connection</string>
|
||||
<string name="chat_banner_your_business_contact">Your business contact</string>
|
||||
|
||||
<!-- ShareListView.kt -->
|
||||
<string name="share_message">Share message…</string>
|
||||
<string name="share_image">Share media…</string>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22" fill="#1f1f1f"><path d="M515-451.5 460-396q-9 8.5-9 19.75t9 20.25q9 9 20.25 9t20.2-9L604-459.95q8.5-8.37 8.5-20 0-11.64-8.5-20.55l-104-104q-8.5-8.5-19.75-8.5T460-604.25q-9 8.75-9 20t9 20.25l55 55H360q-12.5 0-20.5 8.25t-8 20.75q0 12.5 8 20.5t20.5 8h155ZM480.06-85q-80.97 0-153.13-31.26-72.15-31.27-125.79-85Q147.5-255 116.25-327.02 85-399.05 85-479.94q0-81.97 31.26-154.13 31.27-72.15 85-125.54Q255-813 327.02-844q72.03-31 152.92-31 81.97 0 154.13 31.13 72.17 31.13 125.55 84.5Q813-706 844-633.98q31 72.03 31 153.92 0 80.97-31.01 153.13-31.02 72.15-84.5 125.79Q706-147.5 633.98-116.25 561.95-85 480.06-85Zm-.09-57.5q140.53 0 239.03-98.97 98.5-98.96 98.5-238.5 0-140.53-98.47-239.03-98.46-98.5-239-98.5-139.53 0-238.53 98.47-99 98.46-99 239 0 139.53 98.97 238.53 98.96 99 238.5 99ZM480-480Z"/></svg>
|
||||
|
After Width: | Height: | Size: 885 B |
@@ -1766,6 +1766,7 @@ processChatCommand vr nm = \case
|
||||
groupPreferences = maybe defaultBusinessGroupPrefs businessGroupPrefs preferences
|
||||
groupProfile = businessGroupProfile profile groupPreferences
|
||||
(gInfo, hostMember) <- withStore $ \db -> createPreparedGroup db vr user groupProfile True ccLink welcomeSharedMsgId
|
||||
void $ createChatItem user (CDGroupSnd gInfo Nothing) False CIChatBanner Nothing (Just epochStart)
|
||||
let cd = CDGroupRcv gInfo Nothing hostMember
|
||||
createItem sharedMsgId content = createChatItem user cd True content sharedMsgId Nothing
|
||||
cInfo = GroupChat gInfo Nothing
|
||||
@@ -1777,7 +1778,9 @@ processChatCommand vr nm = \case
|
||||
pure $ CRNewPreparedChat user $ AChat SCTGroup chat
|
||||
ACCL _ (CCLink cReq _) -> do
|
||||
ct <- withStore $ \db -> createPreparedContact db user profile accLink welcomeSharedMsgId
|
||||
let createItem sharedMsgId content = createChatItem user (CDDirectRcv ct) False content sharedMsgId Nothing
|
||||
void $ createChatItem user (CDDirectSnd ct) False CIChatBanner Nothing (Just epochStart)
|
||||
let cd = CDDirectRcv ct
|
||||
createItem sharedMsgId content = createChatItem user cd False content sharedMsgId Nothing
|
||||
cInfo = DirectChat ct
|
||||
void $ createItem Nothing $ CIRcvDirectE2EEInfo $ E2EInfo $ connRequestPQEncryption cReq
|
||||
void $ createFeatureEnabledItems_ user ct
|
||||
@@ -1790,6 +1793,7 @@ processChatCommand vr nm = \case
|
||||
let GroupShortLinkData {groupProfile = gp@GroupProfile {description}} = groupSLinkData
|
||||
welcomeSharedMsgId <- forM description $ \_ -> getSharedMsgId
|
||||
(gInfo, hostMember) <- withStore $ \db -> createPreparedGroup db vr user gp False ccLink welcomeSharedMsgId
|
||||
void $ createChatItem user (CDGroupSnd gInfo Nothing) False CIChatBanner Nothing (Just epochStart)
|
||||
let cd = CDGroupRcv gInfo Nothing hostMember
|
||||
cInfo = GroupChat gInfo Nothing
|
||||
void $ createGroupFeatureItems_ user cd True CIRcvGroupFeature gInfo
|
||||
@@ -2111,6 +2115,7 @@ processChatCommand vr nm = \case
|
||||
incognitoProfile <- if incognito then Just <$> liftIO generateRandomProfile else pure Nothing
|
||||
gInfo <- withFastStore $ \db -> createNewGroup db vr gVar user gProfile incognitoProfile
|
||||
let cd = CDGroupSnd gInfo Nothing
|
||||
createInternalChatItem user cd CIChatBanner (Just epochStart)
|
||||
createInternalChatItem user cd (CISndGroupE2EEInfo E2EInfo {pqEnabled = Just PQEncOff}) Nothing
|
||||
createGroupFeatureItems user cd CISndGroupFeature gInfo
|
||||
pure $ CRGroupCreated user gInfo
|
||||
@@ -2565,6 +2570,7 @@ processChatCommand vr nm = \case
|
||||
(connId, (CCLink cReq _, _serviceId)) <- withAgent $ \a -> createConnection a nm (aUserId user) True SCMInvitation Nothing Nothing IKPQOff subMode
|
||||
-- [incognito] reuse membership incognito profile
|
||||
ct <- withFastStore' $ \db -> createMemberContact db user connId cReq g m mConn subMode
|
||||
void $ createChatItem user (CDDirectSnd ct) False CIChatBanner Nothing (Just epochStart)
|
||||
-- TODO not sure it is correct to set connections status here?
|
||||
lift $ setContactNetworkStatus ct NSConnected
|
||||
pure $ CRNewMemberContact user ct g m
|
||||
|
||||
@@ -48,7 +48,8 @@ import Data.Text (Text)
|
||||
import qualified Data.Text as T
|
||||
import Data.Text.Encoding (encodeUtf8)
|
||||
import Data.Time (addUTCTime)
|
||||
import Data.Time.Clock (UTCTime, diffUTCTime, getCurrentTime, nominalDiffTimeToSeconds)
|
||||
import Data.Time.Calendar (fromGregorian)
|
||||
import Data.Time.Clock (UTCTime (..), diffUTCTime, getCurrentTime, nominalDiffTimeToSeconds, secondsToDiffTime)
|
||||
import Simplex.Chat.Call
|
||||
import Simplex.Chat.Controller
|
||||
import Simplex.Chat.Files
|
||||
@@ -2529,3 +2530,6 @@ timeItToView s action = do
|
||||
let diff = diffToMilliseconds $ diffUTCTime t2 t1
|
||||
toView' $ CEvtTimedAction s diff
|
||||
pure a
|
||||
|
||||
epochStart :: UTCTime
|
||||
epochStart = UTCTime (fromGregorian 1970 1 1) (secondsToDiffTime 0)
|
||||
|
||||
@@ -577,6 +577,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
|
||||
-- TODO [short links] get contact request by contactRequestId, check encryption (UserContactRequest.pqSupport)?
|
||||
when (directOrUsed ct') $ case (preparedContact ct', contactRequestId' ct') of
|
||||
(Nothing, Nothing) -> do
|
||||
createInternalChatItem user (CDDirectSnd ct') CIChatBanner (Just epochStart)
|
||||
createE2EItem
|
||||
createFeatureEnabledItems user ct'
|
||||
(Just PreparedContact {connLinkToConnect = ACCL _ (CCLink cReq _)}, _) ->
|
||||
@@ -1337,6 +1338,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
|
||||
-- they will be updated after connection is accepted.
|
||||
upsertDirectRequestItem cd (requestMsg_, prevSharedMsgId_)
|
||||
Nothing -> do
|
||||
void $ createChatItem user (CDDirectSnd ct) False CIChatBanner Nothing (Just epochStart)
|
||||
let e2eContent = CIRcvDirectE2EEInfo $ E2EInfo $ Just $ CR.pqSupportToEnc $ reqPQSup
|
||||
void $ createChatItem user cd False e2eContent Nothing Nothing
|
||||
void $ createFeatureEnabledItems_ user ct
|
||||
@@ -1366,6 +1368,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
|
||||
-- they will be updated after connection is accepted.
|
||||
upsertBusinessRequestItem cd (requestMsg_, prevSharedMsgId_)
|
||||
Nothing -> do
|
||||
void $ createChatItem user (CDGroupSnd gInfo Nothing) False CIChatBanner Nothing (Just epochStart)
|
||||
-- TODO [short links] possibly, we can just keep them created where they are created on the business side due to auto-accept
|
||||
-- let e2eContent = CIRcvGroupE2EEInfo $ E2EInfo $ Just False -- no PQ encryption in groups
|
||||
-- void $ createChatItem user cd False e2eContent Nothing Nothing
|
||||
@@ -2249,6 +2252,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
|
||||
when (fromMemId == memId) $ throwChatError CEGroupDuplicateMemberId
|
||||
-- [incognito] if direct connection with host is incognito, create membership using the same incognito profile
|
||||
(gInfo@GroupInfo {groupId, localDisplayName, groupProfile, membership}, hostId) <- withStore $ \db -> createGroupInvitation db vr user ct inv customUserProfileId
|
||||
void $ createChatItem user (CDGroupSnd gInfo Nothing) False CIChatBanner Nothing (Just epochStart)
|
||||
let GroupMember {groupMemberId, memberId = membershipMemId} = membership
|
||||
if sameGroupLinkId groupLinkId groupLinkId'
|
||||
then do
|
||||
@@ -3089,6 +3093,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
|
||||
dm <- encodeConnInfo $ XInfo p
|
||||
joinAgentConnectionAsync user True connReq dm subMode
|
||||
createItems mCt' m' = do
|
||||
createInternalChatItem user (CDDirectSnd mCt') CIChatBanner (Just epochStart)
|
||||
(g', m'', scopeInfo) <- mkGroupChatScope g m'
|
||||
createInternalChatItem user (CDGroupRcv g' scopeInfo m'') (CIRcvGroupEvent RGEMemberCreatedContact) Nothing
|
||||
toView $ CEvtNewMemberContactReceivedInv user mCt' g' m''
|
||||
|
||||
@@ -165,6 +165,7 @@ data CIContent (d :: MsgDirection) where
|
||||
CIRcvDirectE2EEInfo :: E2EInfo -> CIContent 'MDRcv
|
||||
CISndGroupE2EEInfo :: E2EInfo -> CIContent 'MDSnd -- when new group is created
|
||||
CIRcvGroupE2EEInfo :: E2EInfo -> CIContent 'MDRcv -- when enabled with some member
|
||||
CIChatBanner :: CIContent 'MDSnd
|
||||
CIInvalidJSON :: Text -> CIContent d -- this is also used for logical database errors, e.g. SEBadChatItem
|
||||
|
||||
-- ^ This type is used both in API and in DB, so we use different JSON encodings for the database and for the API
|
||||
@@ -292,6 +293,7 @@ ciContentToText = \case
|
||||
CIRcvDirectE2EEInfo e2eeInfo -> directE2EInfoToText e2eeInfo
|
||||
CISndGroupE2EEInfo e2eeInfo -> groupE2EInfoToText e2eeInfo
|
||||
CIRcvGroupE2EEInfo e2eeInfo -> groupE2EInfoToText e2eeInfo
|
||||
CIChatBanner -> "chat banner"
|
||||
CIInvalidJSON _ -> "invalid content JSON"
|
||||
|
||||
directE2EInfoToText :: E2EInfo -> Text
|
||||
@@ -471,6 +473,7 @@ data JSONCIContent
|
||||
| JCIRcvDirectE2EEInfo {e2eeInfo :: E2EInfo}
|
||||
| JCISndGroupE2EEInfo {e2eeInfo :: E2EInfo}
|
||||
| JCIRcvGroupE2EEInfo {e2eeInfo :: E2EInfo}
|
||||
| JCIChatBanner
|
||||
| JCIInvalidJSON {direction :: MsgDirection, json :: Text}
|
||||
|
||||
jsonCIContent :: forall d. MsgDirectionI d => CIContent d -> JSONCIContent
|
||||
@@ -505,6 +508,7 @@ jsonCIContent = \case
|
||||
CIRcvDirectE2EEInfo e2eeInfo -> JCIRcvDirectE2EEInfo e2eeInfo
|
||||
CISndGroupE2EEInfo e2eeInfo -> JCISndGroupE2EEInfo e2eeInfo
|
||||
CIRcvGroupE2EEInfo e2eeInfo -> JCIRcvGroupE2EEInfo e2eeInfo
|
||||
CIChatBanner -> JCIChatBanner
|
||||
CIInvalidJSON json -> JCIInvalidJSON (toMsgDirection $ msgDirection @d) json
|
||||
|
||||
aciContentJSON :: JSONCIContent -> ACIContent
|
||||
@@ -539,6 +543,7 @@ aciContentJSON = \case
|
||||
JCIRcvDirectE2EEInfo {e2eeInfo} -> ACIContent SMDRcv $ CIRcvDirectE2EEInfo e2eeInfo
|
||||
JCISndGroupE2EEInfo {e2eeInfo} -> ACIContent SMDSnd $ CISndGroupE2EEInfo e2eeInfo
|
||||
JCIRcvGroupE2EEInfo {e2eeInfo} -> ACIContent SMDRcv $ CIRcvGroupE2EEInfo e2eeInfo
|
||||
JCIChatBanner -> ACIContent SMDSnd CIChatBanner
|
||||
JCIInvalidJSON dir json -> case fromMsgDirection dir of
|
||||
AMsgDirection d -> ACIContent d $ CIInvalidJSON json
|
||||
|
||||
@@ -574,6 +579,7 @@ data DBJSONCIContent
|
||||
| DBJCIRcvDirectE2EEInfo {e2eeInfo :: E2EInfo}
|
||||
| DBJCISndGroupE2EEInfo {e2eeInfo :: E2EInfo}
|
||||
| DBJCIRcvGroupE2EEInfo {e2eeInfo :: E2EInfo}
|
||||
| DBJCIChatBanner
|
||||
| DBJCIInvalidJSON {direction :: MsgDirection, json :: Text}
|
||||
|
||||
dbJsonCIContent :: forall d. MsgDirectionI d => CIContent d -> DBJSONCIContent
|
||||
@@ -608,6 +614,7 @@ dbJsonCIContent = \case
|
||||
CIRcvDirectE2EEInfo e2eeInfo -> DBJCIRcvDirectE2EEInfo e2eeInfo
|
||||
CISndGroupE2EEInfo e2eeInfo -> DBJCISndGroupE2EEInfo e2eeInfo
|
||||
CIRcvGroupE2EEInfo e2eeInfo -> DBJCIRcvGroupE2EEInfo e2eeInfo
|
||||
CIChatBanner -> DBJCIChatBanner
|
||||
CIInvalidJSON json -> DBJCIInvalidJSON (toMsgDirection $ msgDirection @d) json
|
||||
|
||||
aciContentDBJSON :: DBJSONCIContent -> ACIContent
|
||||
@@ -642,6 +649,7 @@ aciContentDBJSON = \case
|
||||
DBJCIRcvDirectE2EEInfo e2eeInfo -> ACIContent SMDRcv $ CIRcvDirectE2EEInfo e2eeInfo
|
||||
DBJCISndGroupE2EEInfo e2eeInfo -> ACIContent SMDSnd $ CISndGroupE2EEInfo e2eeInfo
|
||||
DBJCIRcvGroupE2EEInfo e2eeInfo -> ACIContent SMDRcv $ CIRcvGroupE2EEInfo e2eeInfo
|
||||
DBJCIChatBanner -> ACIContent SMDSnd CIChatBanner
|
||||
DBJCIInvalidJSON dir json -> case fromMsgDirection dir of
|
||||
AMsgDirection d -> ACIContent d $ CIInvalidJSON json
|
||||
|
||||
@@ -749,4 +757,5 @@ toCIContentTag ciContent = case ciContent of
|
||||
CIRcvDirectE2EEInfo _ -> "rcvDirectE2EEInfo"
|
||||
CISndGroupE2EEInfo _ -> "sndGroupE2EEInfo"
|
||||
CIRcvGroupE2EEInfo _ -> "rcvGroupE2EEInfo"
|
||||
CIChatBanner -> "chatBanner"
|
||||
CIInvalidJSON _ -> "invalidJSON"
|
||||
|
||||
@@ -191,7 +191,7 @@ deleteContactCIs db user@User {userId} ct@Contact {contactId} = do
|
||||
forM_ connIds $ \connId ->
|
||||
DB.execute db "DELETE FROM messages WHERE connection_id = ?" (Only connId)
|
||||
DB.execute db "DELETE FROM chat_item_reactions WHERE contact_id = ?" (Only contactId)
|
||||
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND contact_id = ?" (userId, contactId)
|
||||
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND item_content_tag != 'chatBanner'" (userId, contactId)
|
||||
|
||||
getContactConnIds_ :: DB.Connection -> User -> Contact -> IO [Int64]
|
||||
getContactConnIds_ db User {userId} Contact {contactId} =
|
||||
@@ -212,7 +212,7 @@ deleteGroupChatItemsMessages :: DB.Connection -> User -> GroupInfo -> IO ()
|
||||
deleteGroupChatItemsMessages db User {userId} GroupInfo {groupId} = do
|
||||
DB.execute db "DELETE FROM messages WHERE group_id = ?" (Only groupId)
|
||||
DB.execute db "DELETE FROM chat_item_reactions WHERE group_id = ?" (Only groupId)
|
||||
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND group_id = ?" (userId, groupId)
|
||||
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND group_id = ? AND item_content_tag != 'chatBanner'" (userId, groupId)
|
||||
|
||||
createNewSndMessage :: MsgEncodingI e => DB.Connection -> TVar ChaChaDRG -> ConnOrGroupId -> ChatMsgEvent e -> (SharedMsgId -> EncodedChatMessage) -> ExceptT StoreError IO SndMessage
|
||||
createNewSndMessage db gVar connOrGroupId chatMsgEvent encodeMessage =
|
||||
@@ -3416,7 +3416,7 @@ deleteContactExpiredCIs db user@User {userId} ct@Contact {contactId} expirationD
|
||||
forM_ connIds $ \connId ->
|
||||
DB.execute db "DELETE FROM messages WHERE connection_id = ? AND created_at <= ?" (connId, expirationDate)
|
||||
DB.execute db "DELETE FROM chat_item_reactions WHERE contact_id = ? AND created_at <= ?" (contactId, expirationDate)
|
||||
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND created_at <= ?" (userId, contactId, expirationDate)
|
||||
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND created_at <= ? AND item_content_tag != 'chatBanner'" (userId, contactId, expirationDate)
|
||||
|
||||
getGroupExpiredFileInfo :: DB.Connection -> User -> GroupInfo -> UTCTime -> UTCTime -> IO [CIFileInfo]
|
||||
getGroupExpiredFileInfo db User {userId} GroupInfo {groupId} expirationDate createdAtCutoff =
|
||||
@@ -3430,7 +3430,7 @@ deleteGroupExpiredCIs :: DB.Connection -> User -> GroupInfo -> UTCTime -> UTCTim
|
||||
deleteGroupExpiredCIs db User {userId} GroupInfo {groupId} expirationDate createdAtCutoff = do
|
||||
DB.execute db "DELETE FROM messages WHERE group_id = ? AND created_at <= ?" (groupId, min expirationDate createdAtCutoff)
|
||||
DB.execute db "DELETE FROM chat_item_reactions WHERE group_id = ? AND reaction_ts <= ? AND created_at <= ?" (groupId, expirationDate, createdAtCutoff)
|
||||
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND group_id = ? AND item_ts <= ? AND created_at <= ?" (userId, groupId, expirationDate, createdAtCutoff)
|
||||
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND group_id = ? AND item_ts <= ? AND created_at <= ? AND item_content_tag != 'chatBanner'" (userId, groupId, expirationDate, createdAtCutoff)
|
||||
|
||||
createCIModeration :: DB.Connection -> GroupInfo -> GroupMember -> MemberId -> SharedMsgId -> MessageId -> UTCTime -> IO ()
|
||||
createCIModeration db GroupInfo {groupId} moderatorMember itemMemberId itemSharedMId msgId moderatedAtTs =
|
||||
|
||||
@@ -555,8 +555,9 @@ Query:
|
||||
INSERT INTO rcv_queues
|
||||
( host, port, rcv_id, conn_id, rcv_private_key, rcv_dh_secret, e2e_priv_key, e2e_dh_secret,
|
||||
snd_id, queue_mode, status, rcv_queue_id, rcv_primary, replace_rcv_queue_id, smp_client_version, server_key_hash,
|
||||
link_id, link_key, link_priv_sig_key, link_enc_fixed_data
|
||||
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);
|
||||
link_id, link_key, link_priv_sig_key, link_enc_fixed_data,
|
||||
ntf_public_key, ntf_private_key, ntf_id, rcv_ntf_dh_secret
|
||||
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);
|
||||
|
||||
Plan:
|
||||
|
||||
@@ -951,6 +952,10 @@ Plan:
|
||||
Query: INSERT INTO xftp_servers (xftp_host, xftp_port, xftp_key_hash) VALUES (?,?,?)
|
||||
Plan:
|
||||
|
||||
Query: SELECT 1 FROM connections WHERE conn_id = ? AND deleted_at_wait_delivery < ? LIMIT 1
|
||||
Plan:
|
||||
SEARCH connections USING PRIMARY KEY (conn_id=?)
|
||||
|
||||
Query: SELECT 1 FROM encrypted_rcv_message_hashes WHERE conn_id = ? AND hash = ? LIMIT 1
|
||||
Plan:
|
||||
SEARCH encrypted_rcv_message_hashes USING COVERING INDEX idx_encrypted_rcv_message_hashes_hash (conn_id=? AND hash=?)
|
||||
|
||||
@@ -5358,9 +5358,21 @@ SEARCH chat_items USING COVERING INDEX idx_chat_items_fwd_from_chat_item_id (fwd
|
||||
SEARCH files USING COVERING INDEX idx_files_chat_item_id (chat_item_id=?)
|
||||
SEARCH groups USING COVERING INDEX idx_groups_chat_item_id (chat_item_id=?)
|
||||
|
||||
Query: DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND created_at <= ?
|
||||
Query: DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND created_at <= ? AND item_content_tag != 'chatBanner'
|
||||
Plan:
|
||||
SEARCH chat_items USING COVERING INDEX idx_chat_items_contacts_created_at (user_id=? AND contact_id=? AND created_at<?)
|
||||
SEARCH chat_items USING INDEX idx_chat_items_contacts_created_at (user_id=? AND contact_id=? AND created_at<?)
|
||||
SEARCH chat_item_mentions USING COVERING INDEX idx_chat_item_mentions_chat_item_id (chat_item_id=?)
|
||||
SEARCH group_snd_item_statuses USING COVERING INDEX idx_group_snd_item_statuses_chat_item_id (chat_item_id=?)
|
||||
SEARCH chat_item_versions USING COVERING INDEX idx_chat_item_versions_chat_item_id (chat_item_id=?)
|
||||
SEARCH calls USING COVERING INDEX idx_calls_chat_item_id (chat_item_id=?)
|
||||
SEARCH chat_item_messages USING COVERING INDEX sqlite_autoindex_chat_item_messages_2 (chat_item_id=?)
|
||||
SEARCH chat_items USING COVERING INDEX idx_chat_items_fwd_from_chat_item_id (fwd_from_chat_item_id=?)
|
||||
SEARCH files USING COVERING INDEX idx_files_chat_item_id (chat_item_id=?)
|
||||
SEARCH groups USING COVERING INDEX idx_groups_chat_item_id (chat_item_id=?)
|
||||
|
||||
Query: DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND item_content_tag != 'chatBanner'
|
||||
Plan:
|
||||
SEARCH chat_items USING INDEX idx_chat_items_contacts_created_at (user_id=? AND contact_id=?)
|
||||
SEARCH chat_item_mentions USING COVERING INDEX idx_chat_item_mentions_chat_item_id (chat_item_id=?)
|
||||
SEARCH group_snd_item_statuses USING COVERING INDEX idx_group_snd_item_statuses_chat_item_id (chat_item_id=?)
|
||||
SEARCH chat_item_versions USING COVERING INDEX idx_chat_item_versions_chat_item_id (chat_item_id=?)
|
||||
@@ -5394,6 +5406,18 @@ SEARCH chat_items USING COVERING INDEX idx_chat_items_fwd_from_chat_item_id (fwd
|
||||
SEARCH files USING COVERING INDEX idx_files_chat_item_id (chat_item_id=?)
|
||||
SEARCH groups USING COVERING INDEX idx_groups_chat_item_id (chat_item_id=?)
|
||||
|
||||
Query: DELETE FROM chat_items WHERE user_id = ? AND group_id = ? AND item_content_tag != 'chatBanner'
|
||||
Plan:
|
||||
SEARCH chat_items USING INDEX idx_chat_items_groups_user_mention (user_id=? AND group_id=?)
|
||||
SEARCH chat_item_mentions USING COVERING INDEX idx_chat_item_mentions_chat_item_id (chat_item_id=?)
|
||||
SEARCH group_snd_item_statuses USING COVERING INDEX idx_group_snd_item_statuses_chat_item_id (chat_item_id=?)
|
||||
SEARCH chat_item_versions USING COVERING INDEX idx_chat_item_versions_chat_item_id (chat_item_id=?)
|
||||
SEARCH calls USING COVERING INDEX idx_calls_chat_item_id (chat_item_id=?)
|
||||
SEARCH chat_item_messages USING COVERING INDEX sqlite_autoindex_chat_item_messages_2 (chat_item_id=?)
|
||||
SEARCH chat_items USING COVERING INDEX idx_chat_items_fwd_from_chat_item_id (fwd_from_chat_item_id=?)
|
||||
SEARCH files USING COVERING INDEX idx_files_chat_item_id (chat_item_id=?)
|
||||
SEARCH groups USING COVERING INDEX idx_groups_chat_item_id (chat_item_id=?)
|
||||
|
||||
Query: DELETE FROM chat_items WHERE user_id = ? AND note_folder_id = ?
|
||||
Plan:
|
||||
SEARCH chat_items USING COVERING INDEX idx_chat_items_notes_created_at (user_id=? AND note_folder_id=?)
|
||||
|
||||
+42
-43
@@ -233,10 +233,7 @@ testAddContact = versionTestMatrix2 runTestAddContact
|
||||
bob #$> ("/_read chat @2", id, "ok")
|
||||
alice #$> ("/read user", id, "ok")
|
||||
alice #$> ("/_read user 1", id, "ok")
|
||||
features =
|
||||
if pqExpected
|
||||
then chatFeatures
|
||||
else (0, e2eeInfoNoPQStr) : tail chatFeatures
|
||||
features = if pqExpected then chatFeatures else chatFeaturesNoPQ
|
||||
|
||||
testRetryConnecting :: HasCallStack => TestParams -> IO ()
|
||||
testRetryConnecting ps = testChatCfgOpts2 cfg' opts' aliceProfile bobProfile test ps
|
||||
@@ -557,9 +554,9 @@ testContactClear =
|
||||
alice <##> bob
|
||||
threadDelay 500000
|
||||
alice #$> ("/clear bob", id, "bob: all messages are removed locally ONLY")
|
||||
alice #$> ("/_get chat @2 count=100", chat, [])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
|
||||
bob #$> ("/clear alice", id, "alice: all messages are removed locally ONLY")
|
||||
bob #$> ("/_get chat @2 count=100", chat, [])
|
||||
bob #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
|
||||
|
||||
testDeleteContactDeletesProfile :: HasCallStack => TestParams -> IO ()
|
||||
testDeleteContactDeletesProfile =
|
||||
@@ -611,7 +608,7 @@ testDeleteConversationKeepContact =
|
||||
alice ##> "/_delete @2 messages"
|
||||
alice <## "bob: contact is deleted"
|
||||
|
||||
alice @@@ [("@bob", "")] -- UI would filter
|
||||
alice @@@ [("@bob", "chat banner")] -- UI would filter
|
||||
bob @@@ [("@alice", "hey")]
|
||||
bob #> "@alice hi"
|
||||
alice <# "bob> hi"
|
||||
@@ -916,13 +913,13 @@ testDirectLiveMessage =
|
||||
connectUsers alice bob
|
||||
-- non-empty live message is sent instantly
|
||||
alice `send` "/live @bob hello"
|
||||
bob <# "alice> [LIVE started] use /show [on/off/7] hello"
|
||||
bob <# "alice> [LIVE started] use /show [on/off/8] hello"
|
||||
alice ##> ("/_update item @2 " <> itemId 1 <> " text hello there")
|
||||
alice <# "@bob [LIVE] hello there"
|
||||
bob <# "alice> [LIVE ended] hello there"
|
||||
-- empty live message is also sent instantly
|
||||
alice `send` "/live @bob"
|
||||
bob <# "alice> [LIVE started] use /show [on/off/8]"
|
||||
bob <# "alice> [LIVE started] use /show [on/off/9]"
|
||||
alice ##> ("/_update item @2 " <> itemId 2 <> " text hello 2")
|
||||
alice <# "@bob [LIVE] hello 2"
|
||||
bob <# "alice> [LIVE ended] hello 2"
|
||||
@@ -2002,7 +1999,7 @@ testUsersDifferentCIExpirationTTL ps = do
|
||||
-- first user messages
|
||||
alice ##> "/user alice"
|
||||
showActiveUser alice "alice (Alice)"
|
||||
alice #$> ("/_get chat @2 count=100", chat, [])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
|
||||
|
||||
-- second user messages
|
||||
alice ##> "/user alisa"
|
||||
@@ -2011,7 +2008,7 @@ testUsersDifferentCIExpirationTTL ps = do
|
||||
|
||||
threadDelay 2000000
|
||||
|
||||
alice #$> ("/_get chat @6 count=100", chat, [])
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
|
||||
where
|
||||
cfg = testCfg {initialCleanupManagerDelay = 0, cleanupManagerStepDelay = 0, ciExpirationInterval = 500000}
|
||||
|
||||
@@ -2085,7 +2082,7 @@ testUsersRestartCIExpiration ps = do
|
||||
-- first user messages
|
||||
alice ##> "/user alice"
|
||||
showActiveUser alice "alice (Alice)"
|
||||
alice #$> ("/_get chat @2 count=100", chat, [])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
|
||||
|
||||
-- second user messages
|
||||
alice ##> "/user alisa"
|
||||
@@ -2094,7 +2091,7 @@ testUsersRestartCIExpiration ps = do
|
||||
|
||||
threadDelay 4000000
|
||||
|
||||
alice #$> ("/_get chat @6 count=100", chat, [])
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
|
||||
where
|
||||
cfg = testCfg {initialCleanupManagerDelay = 0, cleanupManagerStepDelay = 0, ciExpirationInterval = 500000}
|
||||
|
||||
@@ -2143,7 +2140,7 @@ testEnableCIExpirationOnlyForOneUser ps = do
|
||||
-- messages are deleted for first user
|
||||
alice ##> "/user alice"
|
||||
showActiveUser alice "alice (Alice)"
|
||||
alice #$> ("/_get chat @2 count=100", chat, [])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
|
||||
|
||||
-- messages are not deleted for second user
|
||||
alice ##> "/user alisa"
|
||||
@@ -2204,7 +2201,7 @@ testDisableCIExpirationOnlyForOneUser ps = do
|
||||
threadDelay 2000000
|
||||
|
||||
-- second user messages are deleted
|
||||
alice #$> ("/_get chat @6 count=100", chat, [])
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
|
||||
|
||||
withTestChatCfg ps cfg "alice" $ \alice -> do
|
||||
alice <## "1 contacts connected (use /cs for the list)"
|
||||
@@ -2218,12 +2215,12 @@ testDisableCIExpirationOnlyForOneUser ps = do
|
||||
bob #> "@alisa alisa 4"
|
||||
alice <# "bob> alisa 4"
|
||||
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1, "alisa 3"), (0, "alisa 4")])
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner"), (1, "alisa 3"), (0, "alisa 4")])
|
||||
|
||||
threadDelay 2000000
|
||||
|
||||
-- second user messages are deleted
|
||||
alice #$> ("/_get chat @6 count=100", chat, [])
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
|
||||
where
|
||||
cfg = testCfg {initialCleanupManagerDelay = 0, cleanupManagerStepDelay = 0, ciExpirationInterval = 500000}
|
||||
|
||||
@@ -2263,11 +2260,11 @@ testUsersTimedMessages ps = do
|
||||
|
||||
alice ##> "/user alice"
|
||||
showActiveUser alice "alice (Alice)"
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "alice 1"), (0, "alice 2")])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner"), (1, "alice 1"), (0, "alice 2")])
|
||||
|
||||
alice ##> "/user alisa"
|
||||
showActiveUser alice "alisa"
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1, "alisa 1"), (0, "alisa 2")])
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner"), (1, "alisa 1"), (0, "alisa 2")])
|
||||
|
||||
threadDelay 1000000
|
||||
|
||||
@@ -2278,11 +2275,11 @@ testUsersTimedMessages ps = do
|
||||
|
||||
alice ##> "/user alice"
|
||||
showActiveUser alice "alice (Alice)"
|
||||
alice #$> ("/_get chat @2 count=100", chat, [])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
|
||||
|
||||
alice ##> "/user alisa"
|
||||
showActiveUser alice "alisa"
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1, "alisa 1"), (0, "alisa 2")])
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner"), (1, "alisa 1"), (0, "alisa 2")])
|
||||
|
||||
threadDelay 1000000
|
||||
|
||||
@@ -2293,7 +2290,7 @@ testUsersTimedMessages ps = do
|
||||
|
||||
alice ##> "/user"
|
||||
showActiveUser alice "alisa"
|
||||
alice #$> ("/_get chat @6 count=100", chat, [])
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
|
||||
|
||||
-- first user messages
|
||||
alice ##> "/user alice"
|
||||
@@ -2319,11 +2316,11 @@ testUsersTimedMessages ps = do
|
||||
|
||||
alice ##> "/user alice"
|
||||
showActiveUser alice "alice (Alice)"
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "alice 3"), (0, "alice 4")])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner"), (1, "alice 3"), (0, "alice 4")])
|
||||
|
||||
alice ##> "/user alisa"
|
||||
showActiveUser alice "alisa"
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1, "alisa 3"), (0, "alisa 4")])
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner"), (1, "alisa 3"), (0, "alisa 4")])
|
||||
|
||||
-- messages are deleted after restart
|
||||
threadDelay 1000000
|
||||
@@ -2335,11 +2332,11 @@ testUsersTimedMessages ps = do
|
||||
|
||||
alice ##> "/user alice"
|
||||
showActiveUser alice "alice (Alice)"
|
||||
alice #$> ("/_get chat @2 count=100", chat, [])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
|
||||
|
||||
alice ##> "/user alisa"
|
||||
showActiveUser alice "alisa"
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1, "alisa 3"), (0, "alisa 4")])
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner"), (1, "alisa 3"), (0, "alisa 4")])
|
||||
|
||||
threadDelay 1000000
|
||||
|
||||
@@ -2350,7 +2347,7 @@ testUsersTimedMessages ps = do
|
||||
|
||||
alice ##> "/user"
|
||||
showActiveUser alice "alisa"
|
||||
alice #$> ("/_get chat @6 count=100", chat, [])
|
||||
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
|
||||
where
|
||||
configureTimedMessages :: HasCallStack => TestCC -> TestCC -> String -> String -> IO ()
|
||||
configureTimedMessages alice bob bobId ttl = do
|
||||
@@ -2406,20 +2403,21 @@ testUserPrivacy =
|
||||
alice <## "alice (Alice)"
|
||||
alice <## "alisa (active, hidden, muted, unread: 1)"
|
||||
-- hidden message is saved
|
||||
alice ##> "/tail"
|
||||
alice ##> "/tail 11"
|
||||
alice <##? chatHistory
|
||||
alice ##> "/_get items count=10"
|
||||
alice ##> "/_get items count=11"
|
||||
alice <##? chatHistory
|
||||
alice ##> "/_get items before=13 count=10"
|
||||
alice ##> "/_get items before=15 count=10"
|
||||
alice
|
||||
<##? [ ConsoleString ("bob> " <> e2eeInfoPQStr),
|
||||
<##? [ "@bob chat banner",
|
||||
ConsoleString ("bob> " <> e2eeInfoPQStr),
|
||||
"bob> Disappearing messages: allowed",
|
||||
"bob> Full deletion: off",
|
||||
"bob> Message reactions: enabled",
|
||||
"bob> Voice messages: enabled",
|
||||
"bob> Audio/video calls: enabled"
|
||||
]
|
||||
alice ##> "/_get items around=11 count=2"
|
||||
alice ##> "/_get items around=13 count=2"
|
||||
alice
|
||||
<##? [ "bob> Full deletion: off",
|
||||
"bob> Message reactions: enabled",
|
||||
@@ -2427,7 +2425,7 @@ testUserPrivacy =
|
||||
"bob> Audio/video calls: enabled",
|
||||
"@bob hello"
|
||||
]
|
||||
alice ##> "/_get items after=12 count=10"
|
||||
alice ##> "/_get items after=14 count=10"
|
||||
alice
|
||||
<##? [ "@bob hello",
|
||||
"bob> hey",
|
||||
@@ -2491,7 +2489,8 @@ testUserPrivacy =
|
||||
alice <## "messages are shown"
|
||||
alice <## "profile is visible"
|
||||
chatHistory =
|
||||
[ ConsoleString ("bob> " <> e2eeInfoPQStr),
|
||||
[ "@bob chat banner",
|
||||
ConsoleString ("bob> " <> e2eeInfoPQStr),
|
||||
"bob> Disappearing messages: allowed",
|
||||
"bob> Full deletion: off",
|
||||
"bob> Message reactions: enabled",
|
||||
@@ -2529,7 +2528,7 @@ testSetChatItemTTL =
|
||||
alice #$> ("/_get chat @2 count=100", chatF, chatFeaturesF <> [((1, "1"), Nothing), ((0, "2"), Nothing), ((1, ""), Just "test.jpg"), ((1, "3"), Nothing), ((0, "4"), Nothing)])
|
||||
checkActionDeletesFile "./tests/tmp/app_files/test.jpg" $
|
||||
alice #$> ("/_ttl 1 2", id, "ok")
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "3"), (0, "4")]) -- when expiration is turned on, first cycle is synchronous
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner"), (1, "3"), (0, "4")]) -- when expiration is turned on, first cycle is synchronous
|
||||
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "1"), (1, "2"), (0, ""), (0, "3"), (1, "4")])
|
||||
alice #$> ("/_ttl 1", id, "old messages are set to be deleted after: 2 second(s)")
|
||||
alice #$> ("/ttl week", id, "ok")
|
||||
@@ -2563,7 +2562,7 @@ testSetDirectChatTTL =
|
||||
alice #$> ("/_get chat @2 count=100", chatF, chatFeaturesF <> [((1, "1"), Nothing), ((0, "2"), Nothing), ((1, "3"), Nothing), ((0, "4"), Nothing)])
|
||||
alice #$> ("/_ttl 1 2", id, "ok")
|
||||
-- when expiration is turned on, first cycle is synchronous
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "3"), (0, "4")])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner"), (1, "3"), (0, "4")])
|
||||
|
||||
-- chat @3 doesn't expire since it was set to not expire
|
||||
alice #$> ("/_get chat @3 count=100", chat, chatFeatures <> [(1, "10"), (0, "11")])
|
||||
@@ -2576,14 +2575,14 @@ testSetDirectChatTTL =
|
||||
bob #> "@alice 6"
|
||||
alice <# "bob> 6"
|
||||
alice #$> ("/_get chat @3 count=100", chat, chatFeatures <> [(1, "10"), (0, "11")])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "3"), (0, "4"), (1, "5"), (0, "6")])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner"), (1, "3"), (0, "4"), (1, "5"), (0, "6")])
|
||||
|
||||
-- set ttl for chat @3, only chat @3 is affected since global ttl is disabled
|
||||
alice #$> ("/_ttl 1 @3 1", id, "ok")
|
||||
alice #$> ("/ttl @cath", id, "old messages are set to be deleted after: 1 second(s)")
|
||||
threadDelay 3000000
|
||||
alice #$> ("/_get chat @3 count=100", chat, [])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "3"), (0, "4"), (1, "5"), (0, "6")])
|
||||
alice #$> ("/_get chat @3 count=100", chat, [(1, "chat banner")])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner"), (1, "3"), (0, "4"), (1, "5"), (0, "6")])
|
||||
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "1"), (1, "2"), (0, "3"), (1, "4"), (0, "5"), (1, "6")])
|
||||
|
||||
-- set ttl to never expire again
|
||||
@@ -2593,16 +2592,16 @@ testSetDirectChatTTL =
|
||||
cath #> "@alice 13"
|
||||
alice <# "cath> 13"
|
||||
threadDelay 3000000
|
||||
alice #$> ("/_get chat @3 count=100", chat, [(1, "12"), (0, "13")])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "3"), (0, "4"), (1, "5"), (0, "6")])
|
||||
alice #$> ("/_get chat @3 count=100", chat, [(1, "chat banner"), (1, "12"), (0, "13")])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner"), (1, "3"), (0, "4"), (1, "5"), (0, "6")])
|
||||
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "1"), (1, "2"), (0, "3"), (1, "4"), (0, "5"), (1, "6")])
|
||||
|
||||
-- set ttl back to default
|
||||
alice #$> ("/ttl @cath default", id, "ok")
|
||||
alice #$> ("/ttl @cath", id, "old messages are set to delete according to default user config")
|
||||
alice #$> ("/_ttl 1 2", id, "ok")
|
||||
alice #$> ("/_get chat @3 count=100", chat, [])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [])
|
||||
alice #$> ("/_get chat @3 count=100", chat, [(1, "chat banner")])
|
||||
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner")])
|
||||
|
||||
alice #$> ("/ttl @cath day", id, "ok")
|
||||
alice #$> ("/ttl @cath", id, "old messages are set to be deleted after: one day")
|
||||
|
||||
@@ -345,11 +345,11 @@ testGroupShared alice bob cath checkMessages = do
|
||||
-- test clearing chat
|
||||
threadDelay 1000000
|
||||
alice #$> ("/clear #team", id, "#team: all messages are removed locally ONLY")
|
||||
alice #$> ("/_get chat #1 count=100", chat, [])
|
||||
alice #$> ("/_get chat #1 count=100", chat, [(1,"chat banner")])
|
||||
bob #$> ("/clear #team", id, "#team: all messages are removed locally ONLY")
|
||||
bob #$> ("/_get chat #1 count=100", chat, [])
|
||||
bob #$> ("/_get chat #1 count=100", chat, [(1,"chat banner")])
|
||||
cath #$> ("/clear #team", id, "#team: all messages are removed locally ONLY")
|
||||
cath #$> ("/_get chat #1 count=100", chat, [])
|
||||
cath #$> ("/_get chat #1 count=100", chat, [(1,"chat banner")])
|
||||
where
|
||||
getReadChats :: HasCallStack => String -> String -> IO ()
|
||||
getReadChats msgItem1 msgItem2 = do
|
||||
@@ -588,7 +588,7 @@ testGroup2 =
|
||||
]
|
||||
dan <##> alice
|
||||
-- show last messages
|
||||
alice ##> "/t #club 19"
|
||||
alice ##> "/t #club 20"
|
||||
alice -- these strings are expected in any order because of sorting by time and rounding of time for sent
|
||||
<##?
|
||||
( map (ConsoleString . ("#club " <> )) groupFeatureStrs
|
||||
|
||||
@@ -2220,7 +2220,7 @@ testSetContactPrefs = testChat2 aliceProfile bobProfile $
|
||||
alice ##> "/_set prefs @2 {}"
|
||||
alice <## "your preferences for bob did not change"
|
||||
(bob </)
|
||||
let startFeatures = [(0, e2eeInfoPQStr), (0, "Disappearing messages: allowed"), (0, "Full deletion: off"), (0, "Message reactions: enabled"), (0, "Voice messages: off"), (0, "Audio/video calls: enabled")]
|
||||
let startFeatures = [(1, "chat banner"), (0, e2eeInfoPQStr), (0, "Disappearing messages: allowed"), (0, "Full deletion: off"), (0, "Message reactions: enabled"), (0, "Voice messages: off"), (0, "Audio/video calls: enabled")]
|
||||
alice #$> ("/_get chat @2 count=100", chat, startFeatures)
|
||||
bob #$> ("/_get chat @2 count=100", chat, startFeatures)
|
||||
let sendVoice = "/_send @2 json [{\"filePath\": \"test.txt\", \"msgContent\": {\"type\": \"voice\", \"text\": \"\", \"duration\": 10}}]"
|
||||
|
||||
@@ -271,6 +271,11 @@ chat'' = read
|
||||
chatFeatures :: [(Int, String)]
|
||||
chatFeatures = map (\(a, _, _) -> a) chatFeatures''
|
||||
|
||||
chatFeaturesNoPQ :: [(Int, String)]
|
||||
chatFeaturesNoPQ =
|
||||
map (\(a, _, _) -> a) $
|
||||
((1, "chat banner"), Nothing, Nothing) : ((0, e2eeInfoNoPQStr), Nothing, Nothing) : chatFeatures_
|
||||
|
||||
chatFeatures' :: [((Int, String), Maybe (Int, String))]
|
||||
chatFeatures' = map (\(a, b, _) -> (a, b)) chatFeatures''
|
||||
|
||||
@@ -278,9 +283,11 @@ chatFeaturesF :: [((Int, String), Maybe String)]
|
||||
chatFeaturesF = map (\(a, _, c) -> (a, c)) chatFeatures''
|
||||
|
||||
chatFeatures'' :: [((Int, String), Maybe (Int, String), Maybe String)]
|
||||
chatFeatures'' =
|
||||
[ ((0, e2eeInfoPQStr), Nothing, Nothing),
|
||||
((0, "Disappearing messages: allowed"), Nothing, Nothing),
|
||||
chatFeatures'' = ((1, "chat banner"), Nothing, Nothing) : ((0, e2eeInfoPQStr), Nothing, Nothing) : chatFeatures_
|
||||
|
||||
chatFeatures_ :: [((Int, String), Maybe (Int, String), Maybe String)]
|
||||
chatFeatures_ =
|
||||
[ ((0, "Disappearing messages: allowed"), Nothing, Nothing),
|
||||
((0, "Full deletion: off"), Nothing, Nothing),
|
||||
((0, "Message reactions: enabled"), Nothing, Nothing),
|
||||
((0, "Voice messages: enabled"), Nothing, Nothing),
|
||||
@@ -300,7 +307,7 @@ groupFeatures :: [(Int, String)]
|
||||
groupFeatures = map (\(a, _, _) -> a) $ groupFeatures'' 0
|
||||
|
||||
groupFeaturesNoE2E :: [(Int, String)]
|
||||
groupFeaturesNoE2E = map (\(a, _, _) -> a) $ groupFeatures_ 0
|
||||
groupFeaturesNoE2E = map (\(a, _, _) -> a) $ ((1, "chat banner"), Nothing, Nothing) : groupFeatures_ 0
|
||||
|
||||
sndGroupFeatures :: [(Int, String)]
|
||||
sndGroupFeatures = map (\(a, _, _) -> a) $ groupFeatures'' 1
|
||||
@@ -309,7 +316,7 @@ groupFeatureStrs :: [String]
|
||||
groupFeatureStrs = map (\(a, _, _) -> snd a) $ groupFeatures'' 0
|
||||
|
||||
groupFeatures'' :: Int -> [((Int, String), Maybe (Int, String), Maybe String)]
|
||||
groupFeatures'' dir = ((dir, e2eeInfoNoPQStr), Nothing, Nothing) : groupFeatures_ dir
|
||||
groupFeatures'' dir = ((1, "chat banner"), Nothing, Nothing) : ((dir, e2eeInfoNoPQStr), Nothing, Nothing) : groupFeatures_ dir
|
||||
|
||||
groupFeatures_ :: Int -> [((Int, String), Maybe (Int, String), Maybe String)]
|
||||
groupFeatures_ dir =
|
||||
@@ -330,7 +337,8 @@ businessGroupFeatures = map (\(a, _, _) -> a) $ businessGroupFeatures'' 0
|
||||
businessGroupFeatures'' :: Int -> [((Int, String), Maybe (Int, String), Maybe String)]
|
||||
businessGroupFeatures'' dir =
|
||||
-- [ ((dir, e2eeInfoNoPQStr), Nothing, Nothing),
|
||||
[ ((dir, "Disappearing messages: on"), Nothing, Nothing),
|
||||
[ ((1, "chat banner"), Nothing, Nothing),
|
||||
((dir, "Disappearing messages: on"), Nothing, Nothing),
|
||||
((dir, "Direct messages: off"), Nothing, Nothing),
|
||||
((dir, "Full deletion: off"), Nothing, Nothing),
|
||||
((dir, "Message reactions: on"), Nothing, Nothing),
|
||||
@@ -505,6 +513,8 @@ dropTime_ :: String -> Maybe String
|
||||
dropTime_ msg = case splitAt 6 msg of
|
||||
([m, m', ':', s, s', ' '], text) ->
|
||||
if all isDigit [m, m', s, s'] then Just text else Nothing
|
||||
([month, month', '-', d, d', ' '], text) ->
|
||||
if all isDigit [month, month', d, d'] then Just text else Nothing
|
||||
_ -> Nothing
|
||||
|
||||
dropStrPrefix :: HasCallStack => String -> String -> String
|
||||
|
||||
Reference in New Issue
Block a user