mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-04-27 10:45:54 +00:00
Merge branch 'master' into master-android
This commit is contained in:
@@ -33,7 +33,7 @@ jobs:
|
||||
user: ${{ secrets.STATUS_SIMPLEX_WEBHOOK_USER }}
|
||||
pass: ${{ secrets.STATUS_SIMPLEX_WEBHOOK_PASS }}
|
||||
run: |
|
||||
if [ -f "${GITHUB_WORKSPACE}/$TAG/_sha256sums" ]; then
|
||||
if [ -f "${GITHUB_WORKSPACE}/${TAG}-simplex-chat/_sha256sums" ]; then
|
||||
exit 0
|
||||
else
|
||||
curl --proto '=https' --tlsv1.2 -sSf \
|
||||
|
||||
@@ -72,9 +72,9 @@ You must:
|
||||
|
||||
Messages not following these rules will be deleted, the right to send messages may be revoked, and the access to the new members to the group may be temporarily restricted, to prevent re-joining under a different name - our imperfect group moderation does not have a better solution at the moment.
|
||||
|
||||
You can join an English-speaking users group if you want to ask any questions: [#SimpleX users group](https://simplex.chat/contact#/?v=2-7&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FiBkJE72asZX1NUZaYFIeKRVk6oVjb-iv%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAinqu3j74AMjODLoIRR487ZW6ysip_dlpD6Zxk18SPFY%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22groupLinkId%22%3A%223wAFGCLygQHR5AwynZOHlQ%3D%3D%22%7D)
|
||||
You can join an English-speaking users group if you want to ask any questions: [#SimpleX users group](https://smp4.simplex.im/g#hr4lvFeBmndWMKTwqiodPz3VBo_6UmdGWocXd1SupsM)
|
||||
|
||||
There is also a group [#simplex-devs](https://simplex.chat/contact#/?v=1-4&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FvYCRjIflKNMGYlfTkuHe4B40qSlQ0439%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAHNdcqNbzXZhyMoSBjT2R0-Eb1EPaLyUg3KZjn-kmM1w%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22PD20tcXjw7IpkkMCfR6HLA%3D%3D%22%7D) for developers who build on SimpleX platform:
|
||||
There is also a group [#simplex-devs](https://smp6.simplex.im/g#Drx3efC-n418AuSpzTspw9SER0iJwrQTmKBafQHwkKM) for developers who build on SimpleX platform:
|
||||
|
||||
- chat bots and automations
|
||||
- integrations with other apps
|
||||
@@ -83,7 +83,7 @@ There is also a group [#simplex-devs](https://simplex.chat/contact#/?v=1-4&smp=s
|
||||
|
||||
There are groups in other languages, that we have the apps interface translated into. These groups are for testing, and asking questions to other SimpleX Chat users:
|
||||
|
||||
[\#SimpleX-DE](https://simplex.chat/contact#/?v=1-4&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FmfiivxDKWFuowXrQOp11jsY8TuP__rBL%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAiz3pKNwvKudckFYMUfgoT0s96B0jfZ7ALHAu7rtE9HQ%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22jZeJpXGrRXQJU_-MSJ_v2A%3D%3D%22%7D) (German-speaking), [\#SimpleX-ES](https://simplex.chat/contact#/?v=2-4&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FJ5ES83pJimY2BRklS8fvy_iQwIU37xra%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA0F0STP6UqN_12_k2cjjTrIjFgBGeWhOAmbY1qlk3pnM%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22VmUU0fqmYdCRmVCyvStvHA%3D%3D%22%7D) (Spanish-speaking), [\#SimpleX-FR](https://simplex.chat/contact#/?v=2-7&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FxCHBE_6PBRMqNEpm4UQDHXb9cz-mN7dd%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAetqlcM7zTCRw-iatnwCrvpJSto7lq5Yv6AsBMWv7GSM%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22foO5Xw4hhjOa_x7zET7otw%3D%3D%22%7D) (French-speaking), [\#SimpleX-RU](https://simplex.chat/contact#/?v=2-4&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FVXQTB0J2lLjYkgjWByhl6-1qmb5fgZHh%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAI6JaEWezfSwvcoTEkk6au-gkjrXR2ew2OqZYMYBvayk%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22ORH9OEe8Duissh-hslfeVg%3D%3D%22%7D) (Russian-speaking), [\#SimpleX-IT](https://simplex.chat/contact#/?v=2-7&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FqpHu0psOUdYfc11yQCzSyq5JhijrBzZT%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEACZ_7fbwlM45wl6cGif8cY47oPQ_AMdP0ATqOYLA6zHY%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%229uRQRTir3ealdcSfB0zsrw%3D%3D%22%7D) (Italian-speaking).
|
||||
[\#SimpleX-DE](https://smp6.simplex.im/g#V6tQ-lJqsdgJJdJiLPtP326oQFKHvwinIbgruZ9K2oU) (German-speaking), [\#SimpleX-ES](https://smp5.simplex.im/g#xJ5kwDLq2305O5FmpUzvgRIXXAcAJ9S5BItCd2Wmloc) (Spanish-speaking), [\#SimpleX-FR](https://smp6.simplex.im/g#cVOpB0CKd6hEf2aWQ6sJ22E2DVgQLtdHoiSdKxXeKqk) (French-speaking), [\#SimpleX-RU](https://smp5.simplex.im/g#vwXRdfG5SgtaG6aVcITiUGd--Ux0rY1IuH4QXYxlq3U) (Russian-speaking), [\#SimpleX-IT](https://smp5.simplex.im/g#BtRcjsl29ULFNBSE2OPhp1UwZfW7PW9gUYFQTKHdjqU) (Italian-speaking).
|
||||
|
||||
You can join either by opening these links in the app or by opening them in a desktop browser and scanning the QR code.
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -93,7 +93,18 @@ struct MsgContentView: View {
|
||||
|
||||
@inline(__always)
|
||||
private func msgContentView() -> some View {
|
||||
let r = messageText(text, formattedText, textStyle: textStyle, sender: sender, mentions: mentions, userMemberId: userMemberId, showSecrets: showSecrets, backgroundColor: containerBackground, prefix: prefix)
|
||||
let r = messageText(
|
||||
text,
|
||||
formattedText,
|
||||
textStyle: textStyle,
|
||||
sender: sender,
|
||||
mentions: mentions,
|
||||
userMemberId: userMemberId,
|
||||
showSecrets: showSecrets,
|
||||
commands: chat.chatInfo.useCommands && chat.chatInfo.sndReady,
|
||||
backgroundColor: containerBackground,
|
||||
prefix: prefix
|
||||
)
|
||||
let s = r.string
|
||||
let t: Text
|
||||
if let mt = meta {
|
||||
@@ -104,7 +115,7 @@ struct MsgContentView: View {
|
||||
} else {
|
||||
t = Text(AttributedString(s))
|
||||
}
|
||||
return msgTextResultView(r, t, showSecrets: $showSecrets)
|
||||
return msgTextResultView(r, t, showSecrets: $showSecrets, sendCommand: { cmd in sendCommandMsg(chat, cmd) })
|
||||
}
|
||||
|
||||
@inline(__always)
|
||||
@@ -120,14 +131,27 @@ struct MsgContentView: View {
|
||||
}
|
||||
}
|
||||
|
||||
func msgTextResultView(_ r: MsgTextResult, _ t: Text, showSecrets: Binding<Set<Int>>? = nil, centered: Bool = false, smallFont: Bool = false) -> some View {
|
||||
func msgTextResultView(
|
||||
_ r: MsgTextResult,
|
||||
_ t: Text,
|
||||
showSecrets: Binding<Set<Int>>? = nil,
|
||||
sendCommand: ((String) -> Void)? = nil,
|
||||
centered: Bool = false,
|
||||
smallFont: Bool = false
|
||||
) -> some View {
|
||||
t.if(r.hasSecrets, transform: hiddenSecretsView)
|
||||
.if(r.handleTaps) { $0.overlay(handleTextTaps(r.string, showSecrets: showSecrets, centered: centered, smallFont: smallFont)) }
|
||||
.if(r.handleTaps) { $0.overlay(handleTextTaps(r.string, showSecrets: showSecrets, sendCommand: sendCommand, centered: centered, smallFont: smallFont)) }
|
||||
}
|
||||
|
||||
// smallFont parameter is used to pad height, otherwise CTFrameGetLines fails to see them as lines - it's needed if font is not .body
|
||||
@inline(__always)
|
||||
private func handleTextTaps(_ s: NSAttributedString, showSecrets: Binding<Set<Int>>? = nil, centered: Bool, smallFont: Bool) -> some View {
|
||||
private func handleTextTaps(
|
||||
_ s: NSAttributedString,
|
||||
showSecrets: Binding<Set<Int>>? = nil,
|
||||
sendCommand: ((String) -> Void)? = nil,
|
||||
centered: Bool,
|
||||
smallFont: Bool
|
||||
) -> some View {
|
||||
return GeometryReader { g in
|
||||
Rectangle()
|
||||
.fill(Color.clear)
|
||||
@@ -163,23 +187,25 @@ private func handleTextTaps(_ s: NSAttributedString, showSecrets: Binding<Set<In
|
||||
}
|
||||
}
|
||||
}
|
||||
if let index, let (url, browser) = attributedStringLink(s, for: index) {
|
||||
if let index, let (uri, browser) = attributedStringLink(s, for: index) {
|
||||
if browser {
|
||||
openBrowserAlert(uri: url)
|
||||
} else {
|
||||
openBrowserAlert(uri: uri)
|
||||
} else if let url = URL(string: uri) {
|
||||
UIApplication.shared.open(url)
|
||||
} else {
|
||||
showInvalidLinkAlert(uri)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func attributedStringLink(_ s: NSAttributedString, for index: CFIndex) -> (URL, Bool)? {
|
||||
var linkURL: URL?
|
||||
func attributedStringLink(_ s: NSAttributedString, for index: CFIndex) -> (String, Bool)? {
|
||||
var linkURL: String?
|
||||
var browser: Bool = false
|
||||
s.enumerateAttributes(in: NSRange(location: 0, length: s.length)) { attrs, range, stop in
|
||||
if index >= range.location && index < range.location + range.length {
|
||||
if let url = attrs[linkAttrKey] as? NSURL {
|
||||
linkURL = url.absoluteURL
|
||||
if let url = attrs[linkAttrKey] as? String {
|
||||
linkURL = url
|
||||
browser = attrs[webLinkAttrKey] != nil
|
||||
} else if let showSecrets, let i = attrs[secretAttrKey] as? Int {
|
||||
if showSecrets.wrappedValue.contains(i) {
|
||||
@@ -187,6 +213,8 @@ private func handleTextTaps(_ s: NSAttributedString, showSecrets: Binding<Set<In
|
||||
} else {
|
||||
showSecrets.wrappedValue.insert(i)
|
||||
}
|
||||
} else if let sendCommand, let cmd = attrs[commandAttrKey] as? String {
|
||||
sendCommand(cmd)
|
||||
}
|
||||
stop.pointee = true
|
||||
}
|
||||
@@ -218,6 +246,8 @@ private let webLinkAttrKey = NSAttributedString.Key("chat.simplex.app.webLink")
|
||||
|
||||
private let secretAttrKey = NSAttributedString.Key("chat.simplex.app.secret")
|
||||
|
||||
private let commandAttrKey = NSAttributedString.Key("chat.simplex.app.command")
|
||||
|
||||
typealias MsgTextResult = (string: NSMutableAttributedString, hasSecrets: Bool, handleTaps: Bool)
|
||||
|
||||
@inline(__always)
|
||||
@@ -240,6 +270,7 @@ func markdownText(
|
||||
mentions: mentions,
|
||||
userMemberId: userMemberId,
|
||||
showSecrets: showSecrets,
|
||||
commands: false,
|
||||
backgroundColor: UIColor(backgroundColor)
|
||||
)
|
||||
}
|
||||
@@ -254,6 +285,7 @@ func messageText(
|
||||
mentions: [String: CIMention]?,
|
||||
userMemberId: String?,
|
||||
showSecrets: Set<Int>?,
|
||||
commands: Bool = false,
|
||||
backgroundColor: UIColor,
|
||||
prefix: NSAttributedString? = nil
|
||||
) -> MsgTextResult {
|
||||
@@ -326,22 +358,41 @@ func messageText(
|
||||
case .uri:
|
||||
attrs = linkAttrs()
|
||||
if !preview {
|
||||
let s = t.lowercased()
|
||||
let link = s.hasPrefix("http://") || s.hasPrefix("https://")
|
||||
let link = t.hasPrefix("http://") || t.hasPrefix("https://")
|
||||
? t
|
||||
: "https://" + t
|
||||
attrs[linkAttrKey] = NSURL(string: link)
|
||||
attrs[linkAttrKey] = link
|
||||
attrs[webLinkAttrKey] = true
|
||||
handleTaps = true
|
||||
}
|
||||
case let .simplexLink(linkType, simplexUri, smpHosts):
|
||||
case let .hyperLink(text, uri):
|
||||
attrs = linkAttrs()
|
||||
if let text { t = text }
|
||||
if !preview {
|
||||
attrs[linkAttrKey] = NSURL(string: simplexUri)
|
||||
attrs[linkAttrKey] = uri
|
||||
attrs[webLinkAttrKey] = true
|
||||
handleTaps = true
|
||||
}
|
||||
if case .description = privacySimplexLinkModeDefault.get() {
|
||||
t = simplexLinkText(linkType, smpHosts)
|
||||
case let .simplexLink(text, linkType, simplexUri, smpHosts):
|
||||
attrs = linkAttrs()
|
||||
if !preview {
|
||||
attrs[linkAttrKey] = simplexUri
|
||||
handleTaps = true
|
||||
}
|
||||
if let s = text ?? (privacySimplexLinkModeDefault.get() == .description ? linkType.description : nil) {
|
||||
res.append(NSAttributedString(string: s + " ", attributes: attrs))
|
||||
italic = italic ?? UIFont(descriptor: descr.withSymbolicTraits(.traitItalic) ?? descr, size: descr.pointSize)
|
||||
attrs[.font] = italic
|
||||
t = viaHost(smpHosts)
|
||||
}
|
||||
case let .command(cmdStr):
|
||||
snippet = snippet ?? UIFont.monospacedSystemFont(ofSize: descr.pointSize, weight: .regular)
|
||||
attrs[.font] = snippet
|
||||
t = "/" + cmdStr
|
||||
if !preview && commands {
|
||||
attrs[.foregroundColor] = uiLinkColor
|
||||
attrs[commandAttrKey] = t
|
||||
handleTaps = true
|
||||
}
|
||||
case let .mention(memberName):
|
||||
if let m = mentions?[memberName] {
|
||||
@@ -364,13 +415,13 @@ func messageText(
|
||||
case .email:
|
||||
attrs = linkAttrs()
|
||||
if !preview {
|
||||
attrs[linkAttrKey] = NSURL(string: "mailto:" + ft.text)
|
||||
attrs[linkAttrKey] = "mailto:" + ft.text
|
||||
handleTaps = true
|
||||
}
|
||||
case .phone:
|
||||
attrs = linkAttrs()
|
||||
if !preview {
|
||||
attrs[linkAttrKey] = NSURL(string: "tel:" + t.replacingOccurrences(of: " ", with: ""))
|
||||
attrs[linkAttrKey] = "tel:" + t.replacingOccurrences(of: " ", with: "")
|
||||
handleTaps = true
|
||||
}
|
||||
case .unknown: ()
|
||||
@@ -400,7 +451,11 @@ private func mentionText(_ name: String) -> String {
|
||||
}
|
||||
|
||||
func simplexLinkText(_ linkType: SimplexLinkType, _ smpHosts: [String]) -> String {
|
||||
linkType.description + " " + "(via \(smpHosts.first ?? "?"))"
|
||||
linkType.description + " " + viaHost(smpHosts)
|
||||
}
|
||||
|
||||
func viaHost(_ smpHosts: [String]) -> String {
|
||||
"(via \(smpHosts.first ?? "?"))"
|
||||
}
|
||||
|
||||
struct MsgContentView_Previews: PreviewProvider {
|
||||
|
||||
@@ -59,6 +59,7 @@ struct ChatView: View {
|
||||
@State private var ignoreLoadingRequests: Int64? = nil
|
||||
@State private var animatedScrollingInProgress: Bool = false
|
||||
@State private var showUserSupportChatSheet = false
|
||||
@State private var showCommandsMenu = false
|
||||
|
||||
@State private var scrollView: EndlessScrollView<MergedItem> = EndlessScrollView(frame: .zero)
|
||||
|
||||
@@ -109,6 +110,9 @@ struct ChatView: View {
|
||||
if let groupInfo = chat.chatInfo.groupInfo, !composeState.message.isEmpty {
|
||||
GroupMentionsView(im: im, groupInfo: groupInfo, composeState: $composeState, selectedRange: $selectedRange, keyboardVisible: $keyboardVisible)
|
||||
}
|
||||
if !chat.chatInfo.menuCommands.isEmpty {
|
||||
CommandsMenuView(chat: chat, composeState: $composeState, selectedRange: $selectedRange, showCommandsMenu: $showCommandsMenu)
|
||||
}
|
||||
FloatingButtons(im: im, theme: theme, scrollView: scrollView, chat: chat, loadingMoreItems: $loadingMoreItems, loadingTopItems: $loadingTopItems, requestedTopScroll: $requestedTopScroll, loadingBottomItems: $loadingBottomItems, requestedBottomScroll: $requestedBottomScroll, animatedScrollingInProgress: $animatedScrollingInProgress, listState: scrollView.listState, model: floatingButtonModel, reloadItems: {
|
||||
mergedItems.boxedValue = MergedItems.create(im, revealedItems)
|
||||
scrollView.updateItems(mergedItems.boxedValue.items)
|
||||
@@ -135,6 +139,7 @@ struct ChatView: View {
|
||||
chat: chat,
|
||||
im: im,
|
||||
composeState: $composeState,
|
||||
showCommandsMenu: $showCommandsMenu,
|
||||
keyboardVisible: $keyboardVisible,
|
||||
keyboardHiddenDate: $keyboardHiddenDate,
|
||||
selectedRange: $selectedRange,
|
||||
@@ -919,10 +924,12 @@ struct ChatView: View {
|
||||
case .inv:
|
||||
"Tap Connect to chat"
|
||||
case .con:
|
||||
"Tap Connect to send request"
|
||||
contact.isBot ? "Tap Connect to use bot" : "Tap Connect to send request"
|
||||
}
|
||||
} else if contact.nextAcceptContactRequest {
|
||||
"Accept contact request"
|
||||
} else if case .bot = contact.profile.peerType {
|
||||
"Bot"
|
||||
} else {
|
||||
"Your contact"
|
||||
}
|
||||
@@ -956,9 +963,7 @@ struct ChatView: View {
|
||||
switch (chat.chatInfo) {
|
||||
case let .direct(contact):
|
||||
if !contact.sndReady && contact.active && !contact.sendMsgToConnect && !contact.nextAcceptContactRequest {
|
||||
contact.preparedContact?.uiConnLinkType == .con
|
||||
? "contact should accept…"
|
||||
: contact.contactGroupMemberId != nil
|
||||
(contact.preparedContact?.uiConnLinkType == .con && !contact.isBot) || contact.contactGroupMemberId != nil
|
||||
? "contact should accept…"
|
||||
: "connecting…"
|
||||
} else {
|
||||
|
||||
@@ -0,0 +1,187 @@
|
||||
//
|
||||
// CommandsMenuView.swift
|
||||
// SimpleX (iOS)
|
||||
//
|
||||
// Created by EP on 03/08/2025.
|
||||
// Copyright © 2025 SimpleX Chat. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import SimpleXChat
|
||||
|
||||
let COMMAND_ROW_SIZE: CGFloat = 48
|
||||
let MAX_VISIBLE_COMMAND_ROWS: CGFloat = 5.8
|
||||
|
||||
struct CommandsMenuView: View {
|
||||
@EnvironmentObject var m: ChatModel
|
||||
@EnvironmentObject var theme: AppTheme
|
||||
@ObservedObject var chat: Chat
|
||||
@Binding var composeState: ComposeState
|
||||
@Binding var selectedRange: NSRange
|
||||
@Binding var showCommandsMenu: Bool
|
||||
|
||||
@State private var currentCommands: [ChatBotCommand] = []
|
||||
@State private var menuTreeBackPath: [(label: String, commands: [ChatBotCommand])] = []
|
||||
@State private var keywordWidth: CGFloat = 0
|
||||
|
||||
var body: some View {
|
||||
ZStack(alignment: .bottom) {
|
||||
if !currentCommands.isEmpty {
|
||||
Color.white.opacity(0.01)
|
||||
.edgesIgnoringSafeArea(.all)
|
||||
.onTapGesture {
|
||||
showCommandsMenu = false
|
||||
currentCommands = []
|
||||
menuTreeBackPath = []
|
||||
}
|
||||
VStack(spacing: 0) {
|
||||
Spacer()
|
||||
let cmdsCount = currentCommands.count + (menuTreeBackPath.isEmpty ? 0 : 1)
|
||||
let scroll = ScrollView {
|
||||
VStack(spacing: 0) {
|
||||
if let prev = menuTreeBackPath.last {
|
||||
Divider()
|
||||
menuLabelRow(prev)
|
||||
}
|
||||
ForEach(currentCommands, id: \.self, content: commandRow)
|
||||
}
|
||||
}
|
||||
.frame(maxWidth: .infinity, maxHeight: COMMAND_ROW_SIZE * min(MAX_VISIBLE_COMMAND_ROWS, CGFloat(cmdsCount)))
|
||||
.background(theme.colors.background)
|
||||
|
||||
if #available(iOS 16.0, *) {
|
||||
scroll.scrollDismissesKeyboard(.never)
|
||||
} else {
|
||||
scroll
|
||||
}
|
||||
}
|
||||
.onPreferenceChange(DetermineWidth.Key.self) { keywordWidth = $0 }
|
||||
}
|
||||
}
|
||||
.onChange(of: composeState.message) { message in
|
||||
let msg = message.trimmingCharacters(in: .whitespaces)
|
||||
if msg == "/" {
|
||||
currentCommands = chat.chatInfo.menuCommands
|
||||
} else if msg.first == "/" {
|
||||
currentCommands = filterShownCommands(chat.chatInfo.menuCommands, msg.dropFirst())
|
||||
} else {
|
||||
showCommandsMenu = false
|
||||
currentCommands = []
|
||||
}
|
||||
menuTreeBackPath = []
|
||||
}
|
||||
.onChange(of: showCommandsMenu) { show in
|
||||
currentCommands = show ? chat.chatInfo.menuCommands : []
|
||||
menuTreeBackPath = []
|
||||
}
|
||||
}
|
||||
|
||||
private func menuLabelRow(_ prev: (label: String, commands: [ChatBotCommand])) -> some View {
|
||||
HStack {
|
||||
Image(systemName: "chevron.left")
|
||||
.foregroundColor(theme.colors.secondary)
|
||||
Text(prev.label)
|
||||
.fontWeight(.medium)
|
||||
.frame(maxWidth: .infinity)
|
||||
}
|
||||
.padding(.horizontal)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
.frame(height: COMMAND_ROW_SIZE, alignment: .center)
|
||||
.contentShape(Rectangle())
|
||||
.onTapGesture {
|
||||
if !menuTreeBackPath.isEmpty {
|
||||
currentCommands = menuTreeBackPath.removeLast().commands
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ViewBuilder
|
||||
private func commandRow(_ command: ChatBotCommand) -> some View {
|
||||
Divider()
|
||||
switch command {
|
||||
case let .command(keyword, label, params):
|
||||
HStack {
|
||||
Text(label)
|
||||
.lineLimit(1)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
Text("/" + keyword)
|
||||
.font(.subheadline)
|
||||
.lineLimit(1)
|
||||
.foregroundColor(theme.colors.secondary)
|
||||
.frame(minWidth: keywordWidth, alignment: .trailing)
|
||||
.overlay(DetermineWidth())
|
||||
}
|
||||
.padding(.horizontal)
|
||||
.frame(height: COMMAND_ROW_SIZE, alignment: .center)
|
||||
.contentShape(Rectangle())
|
||||
.onTapGesture {
|
||||
if let params {
|
||||
composeState.message = "/\(keyword) \(params)"
|
||||
selectedRange = NSRange(location: composeState.message.count, length: 0)
|
||||
} else {
|
||||
composeState.message = ""
|
||||
sendCommandMsg(chat, "/\(keyword)")
|
||||
}
|
||||
showCommandsMenu = false
|
||||
currentCommands = []
|
||||
menuTreeBackPath = []
|
||||
}
|
||||
case let .menu(label, cmds):
|
||||
HStack {
|
||||
Text(label)
|
||||
.fontWeight(.medium)
|
||||
.lineLimit(1)
|
||||
Spacer()
|
||||
Image(systemName: "chevron.right")
|
||||
.foregroundColor(theme.colors.secondary)
|
||||
}
|
||||
.padding(.horizontal)
|
||||
.frame(height: COMMAND_ROW_SIZE, alignment: .center)
|
||||
.contentShape(Rectangle())
|
||||
.onTapGesture {
|
||||
menuTreeBackPath.append((label: label, commands: currentCommands))
|
||||
currentCommands = cmds
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func filterShownCommands(_ commands: [ChatBotCommand], _ msg: String.SubSequence) -> [ChatBotCommand] {
|
||||
var cmds: [ChatBotCommand] = []
|
||||
for command in commands {
|
||||
switch command {
|
||||
case let .command(keyword, _, _):
|
||||
if keyword.starts(with: msg) {
|
||||
cmds.append(command)
|
||||
}
|
||||
case let .menu(_, innerCmds):
|
||||
cmds.append(contentsOf: filterShownCommands(innerCmds, msg))
|
||||
}
|
||||
}
|
||||
return cmds
|
||||
}
|
||||
}
|
||||
|
||||
func sendCommandMsg(_ chat: Chat, _ cmd: String) {
|
||||
if chat.chatInfo.sndReady {
|
||||
Task {
|
||||
if let chatItems = await apiSendMessages(
|
||||
type: chat.chatInfo.chatType,
|
||||
id: chat.chatInfo.apiId,
|
||||
scope: chat.chatInfo.groupChatScope(),
|
||||
composedMessages: [ComposedMessage(msgContent: .text(cmd))]
|
||||
) {
|
||||
await MainActor.run {
|
||||
for ci in chatItems {
|
||||
ChatModel.shared.addChatItem(chat.chatInfo, ci)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
showAlert(
|
||||
NSLocalizedString("You can't send messages!", comment: "alert title"),
|
||||
message: NSLocalizedString("To send commands you must be connected.", comment: "alert message"),
|
||||
actions: { [okAlertAction] }
|
||||
)
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -323,15 +323,16 @@ struct ComposeView: View {
|
||||
@ObservedObject var chat: Chat
|
||||
@ObservedObject var im: ItemsModel
|
||||
@Binding var composeState: ComposeState
|
||||
@Binding var showCommandsMenu: Bool
|
||||
@Binding var keyboardVisible: Bool
|
||||
@Binding var keyboardHiddenDate: Date
|
||||
@Binding var selectedRange: NSRange
|
||||
var disabledText: LocalizedStringKey? = nil
|
||||
|
||||
@State var linkUrl: URL? = nil
|
||||
@State var linkUrl: String? = nil
|
||||
@State var hasSimplexLink: Bool = false
|
||||
@State var prevLinkUrl: URL? = nil
|
||||
@State var pendingLinkUrl: URL? = nil
|
||||
@State var prevLinkUrl: String? = nil
|
||||
@State var pendingLinkUrl: String? = nil
|
||||
@State var cancelledLinks: Set<String> = []
|
||||
|
||||
@Environment(\.colorScheme) private var colorScheme
|
||||
@@ -352,6 +353,8 @@ struct ComposeView: View {
|
||||
@UserDefault(DEFAULT_PRIVACY_SAVE_LAST_DRAFT) private var saveLastDraft = true
|
||||
@UserDefault(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial
|
||||
@AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false
|
||||
@AppStorage(GROUP_DEFAULT_PRIVACY_SANITIZE_LINKS, store: groupDefaults) private var privacySanitizeLinks = true
|
||||
@State private var updatingCompose = false
|
||||
|
||||
var body: some View {
|
||||
VStack(spacing: 0) {
|
||||
@@ -410,18 +413,7 @@ struct ComposeView: View {
|
||||
|
||||
if chat.chatInfo.groupInfo?.nextConnectPrepared == true {
|
||||
if chat.chatInfo.groupInfo?.businessChat == nil {
|
||||
Button(action: connectPreparedGroup) {
|
||||
ZStack(alignment: .trailing) {
|
||||
Label("Join group", systemImage: "person.2.fill")
|
||||
.frame(maxWidth: .infinity)
|
||||
if composeState.progressByTimeout {
|
||||
ProgressView()
|
||||
.padding()
|
||||
}
|
||||
}
|
||||
}
|
||||
.frame(height: 60)
|
||||
.disabled(composeState.inProgress)
|
||||
connectButtonView("Join group", icon: "person.2.fill", connect: connectPreparedGroup)
|
||||
} else {
|
||||
sendContactRequestView(disableSendButton, icon: "briefcase.fill", sendRequest: connectPreparedGroup)
|
||||
}
|
||||
@@ -429,27 +421,22 @@ struct ComposeView: View {
|
||||
contextSendMessageToConnect("Send direct message to connect")
|
||||
Divider()
|
||||
HStack (alignment: .center) {
|
||||
attachmentButton().disabled(true)
|
||||
attachmentAndCommandsButtons().disabled(true)
|
||||
sendMessageView(disableSendButton, sendToConnect: sendMemberContactInvitation)
|
||||
}
|
||||
.padding(.horizontal, 12)
|
||||
} else if contact?.nextConnectPrepared == true, let linkType = contact?.preparedContact?.uiConnLinkType {
|
||||
} else if let contact,
|
||||
contact.nextConnectPrepared == true,
|
||||
let linkType = contact.preparedContact?.uiConnLinkType {
|
||||
switch linkType {
|
||||
case .inv:
|
||||
Button(action: sendConnectPreparedContact) {
|
||||
ZStack(alignment: .trailing) {
|
||||
Label("Connect", systemImage: "person.fill.badge.plus")
|
||||
.frame(maxWidth: .infinity)
|
||||
if composeState.progressByTimeout {
|
||||
ProgressView()
|
||||
.padding()
|
||||
}
|
||||
}
|
||||
}
|
||||
.frame(height: 60)
|
||||
.disabled(composeState.inProgress)
|
||||
connectButtonView("Connect", icon: "person.fill.badge.plus", connect: sendConnectPreparedContact)
|
||||
case .con:
|
||||
sendContactRequestView(disableSendButton, icon: "person.fill.badge.plus", sendRequest: sendConnectPreparedContactRequest)
|
||||
if contact.isBot {
|
||||
connectButtonView("Connect", icon: "bolt.fill", connect: sendConnectPreparedContact)
|
||||
} else {
|
||||
sendContactRequestView(disableSendButton, icon: "person.fill.badge.plus", sendRequest: sendConnectPreparedContactRequest)
|
||||
}
|
||||
}
|
||||
} else if contact?.nextAcceptContactRequest == true, let crId = contact?.contactRequestId {
|
||||
ContextContactRequestActionsView(contactRequestId: crId)
|
||||
@@ -457,7 +444,7 @@ struct ComposeView: View {
|
||||
ContextMemberContactActionsView(contact: ct, groupDirectInv: groupDirectInv)
|
||||
} else {
|
||||
HStack (alignment: .center) {
|
||||
attachmentButton()
|
||||
attachmentAndCommandsButtons()
|
||||
sendMessageView(disableSendButton)
|
||||
}
|
||||
.padding(.horizontal, 12)
|
||||
@@ -469,8 +456,26 @@ struct ComposeView: View {
|
||||
.ignoresSafeArea(.all, edges: .bottom)
|
||||
}
|
||||
.onChange(of: composeState.message) { msg in
|
||||
let parsedMsg = parseSimpleXMarkdown(msg)
|
||||
composeState = composeState.copy(parsedMessage: parsedMsg ?? FormattedText.plain(msg))
|
||||
if updatingCompose {
|
||||
updatingCompose = false
|
||||
return
|
||||
}
|
||||
var parsedMsg = parseSimpleXMarkdown(msg)
|
||||
if privacySanitizeLinks, let parsed = parsedMsg {
|
||||
let r = sanitizeMessage(parsed)
|
||||
if let sanitizedPos = r.sanitizedPos {
|
||||
updatingCompose = true
|
||||
composeState = composeState.copy(message: r.message, parsedMessage: r.parsedMsg)
|
||||
if sanitizedPos < selectedRange.location {
|
||||
selectedRange = NSRange(location: sanitizedPos, length: 0)
|
||||
}
|
||||
parsedMsg = r.parsedMsg
|
||||
} else {
|
||||
composeState = composeState.copy(parsedMessage: parsedMsg)
|
||||
}
|
||||
} else {
|
||||
composeState = composeState.copy(parsedMessage: parsedMsg ?? FormattedText.plain(msg))
|
||||
}
|
||||
if composeState.linkPreviewAllowed {
|
||||
if msg.count > 0 {
|
||||
showLinkPreview(parsedMsg)
|
||||
@@ -479,7 +484,7 @@ struct ComposeView: View {
|
||||
hasSimplexLink = false
|
||||
}
|
||||
} else if msg.count > 0 && !chat.groupFeatureEnabled(.simplexLinks) {
|
||||
(_, hasSimplexLink) = getSimplexLink(parsedMsg)
|
||||
(_, hasSimplexLink) = getMessageLinks(parsedMsg)
|
||||
} else {
|
||||
hasSimplexLink = false
|
||||
}
|
||||
@@ -635,6 +640,21 @@ struct ComposeView: View {
|
||||
}
|
||||
}
|
||||
|
||||
private func connectButtonView(_ label: LocalizedStringKey, icon: String, connect: @escaping () -> Void) -> some View {
|
||||
Button(action: connect) {
|
||||
ZStack(alignment: .trailing) {
|
||||
Label(label, systemImage: icon)
|
||||
.frame(maxWidth: .infinity)
|
||||
if composeState.progressByTimeout {
|
||||
ProgressView()
|
||||
.padding()
|
||||
}
|
||||
}
|
||||
}
|
||||
.frame(height: 60)
|
||||
.disabled(composeState.inProgress)
|
||||
}
|
||||
|
||||
private func sendContactRequestView(_ disableSendButton: Bool, icon: String, sendRequest: @escaping () -> Void) -> some View {
|
||||
HStack (alignment: .center) {
|
||||
sendMessageView(
|
||||
@@ -703,6 +723,35 @@ struct ComposeView: View {
|
||||
}
|
||||
}
|
||||
|
||||
@ViewBuilder private func attachmentAndCommandsButtons() -> some View {
|
||||
let msg = composeState.message.trimmingCharacters(in: .whitespaces)
|
||||
let showAttachment = chat.chatInfo.contact?.profile.peerType != .bot || chat.chatInfo.featureEnabled(.files)
|
||||
let showCommands = chat.chatInfo.useCommands && (!showAttachment || msg.isEmpty || msg.starts(with: "/"))
|
||||
if showCommands {
|
||||
commandsButton()
|
||||
}
|
||||
if showAttachment {
|
||||
attachmentButton()
|
||||
.padding(.trailing, 3)
|
||||
.if(showCommands) { v in v.padding(.leading, 3) }
|
||||
}
|
||||
}
|
||||
|
||||
private func commandsButton() -> some View {
|
||||
Button {
|
||||
showCommandsMenu.toggle()
|
||||
} label: {
|
||||
Text(verbatim: "//")
|
||||
.font(.title3)
|
||||
.italic()
|
||||
.contentShape(Rectangle())
|
||||
}
|
||||
.disabled(!chat.chatInfo.sendMsgEnabled || chat.chatInfo.menuCommands.isEmpty)
|
||||
.frame(width: 25, height: 25)
|
||||
.tint(theme.colors.primary)
|
||||
.padding(.bottom, 2)
|
||||
}
|
||||
|
||||
@ViewBuilder private func attachmentButton() -> some View {
|
||||
let b = Button {
|
||||
showChooseSource = true
|
||||
@@ -714,12 +763,11 @@ struct ComposeView: View {
|
||||
.frame(width: 25, height: 25)
|
||||
.tint(theme.colors.primary)
|
||||
if im.secondaryIMFilter == nil,
|
||||
case let .group(g, _) = chat.chatInfo,
|
||||
!g.fullGroupPreferences.files.on(for: g.membership) {
|
||||
!chat.chatInfo.featureEnabled(.files) {
|
||||
b.disabled(true).onTapGesture {
|
||||
AlertManager.shared.showAlertMsg(
|
||||
title: "Files and media prohibited!",
|
||||
message: "Only group owners can enable files and media."
|
||||
message: chat.chatInfo.groupInfo == nil ? nil : "Only group owners can enable files and media."
|
||||
)
|
||||
}
|
||||
} else {
|
||||
@@ -750,7 +798,6 @@ struct ComposeView: View {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO [short links] different messages for business
|
||||
private func sendConnectPreparedContactRequest() {
|
||||
hideKeyboard()
|
||||
let empty = composeState.whitespaceOnly
|
||||
@@ -818,7 +865,7 @@ struct ComposeView: View {
|
||||
switch (composeState.preview) {
|
||||
case let .linkPreview(linkPreview: linkPreview):
|
||||
if let parsedMsg = parseSimpleXMarkdown(msgText),
|
||||
let url = getSimplexLink(parsedMsg).url,
|
||||
let url = getMessageLinks(parsedMsg).url,
|
||||
let linkPreview = linkPreview,
|
||||
url == linkPreview.uri {
|
||||
return .link(text: msgText, preview: linkPreview)
|
||||
@@ -1421,7 +1468,7 @@ struct ComposeView: View {
|
||||
|
||||
private func showLinkPreview(_ parsedMsg: [FormattedText]?) {
|
||||
prevLinkUrl = linkUrl
|
||||
(linkUrl, hasSimplexLink) = getSimplexLink(parsedMsg)
|
||||
(linkUrl, hasSimplexLink) = getMessageLinks(parsedMsg)
|
||||
if let url = linkUrl {
|
||||
if url != composeState.linkPreview?.uri && url != pendingLinkUrl {
|
||||
pendingLinkUrl = url
|
||||
@@ -1438,39 +1485,38 @@ struct ComposeView: View {
|
||||
}
|
||||
}
|
||||
|
||||
private func getSimplexLink(_ parsedMsg: [FormattedText]?) -> (url: URL?, hasSimplexLink: Bool) {
|
||||
private func getMessageLinks(_ parsedMsg: [FormattedText]?) -> (url: String?, hasSimplexLink: Bool) {
|
||||
guard let parsedMsg else { return (nil, false) }
|
||||
let url: URL? = if let uri = parsedMsg.first(where: { ft in
|
||||
ft.format == .uri && !cancelledLinks.contains(ft.text) && !isSimplexLink(ft.text)
|
||||
}) {
|
||||
URL(string: uri.text)
|
||||
} else {
|
||||
nil
|
||||
}
|
||||
let simplexLink = parsedMsgHasSimplexLink(parsedMsg)
|
||||
return (url, simplexLink)
|
||||
for ft in parsedMsg {
|
||||
if let link = ft.linkUri, !cancelledLinks.contains(link) && !isSimplexLink(link) {
|
||||
return (link, simplexLink)
|
||||
}
|
||||
}
|
||||
return (nil, simplexLink)
|
||||
}
|
||||
|
||||
private func isSimplexLink(_ link: String) -> Bool {
|
||||
link.starts(with: "https://simplex.chat") || link.starts(with: "http://simplex.chat")
|
||||
link.starts(with: "https://simplex.chat") || link.starts(with: "http://simplex.chat") || link.starts(with: "simplex:/")
|
||||
}
|
||||
|
||||
private func cancelLinkPreview() {
|
||||
if let pendingLink = pendingLinkUrl?.absoluteString {
|
||||
if let pendingLink = pendingLinkUrl {
|
||||
cancelledLinks.insert(pendingLink)
|
||||
}
|
||||
if let uri = composeState.linkPreview?.uri.absoluteString {
|
||||
if let uri = composeState.linkPreview?.uri {
|
||||
cancelledLinks.insert(uri)
|
||||
}
|
||||
pendingLinkUrl = nil
|
||||
composeState = composeState.copy(preview: .noPreview)
|
||||
}
|
||||
|
||||
private func loadLinkPreview(_ url: URL) {
|
||||
if pendingLinkUrl == url {
|
||||
private func loadLinkPreview(_ urlStr: String) {
|
||||
if pendingLinkUrl == urlStr, let url = URL(string: urlStr) {
|
||||
composeState = composeState.copy(preview: .linkPreview(linkPreview: nil))
|
||||
getLinkPreview(url: url) { linkPreview in
|
||||
if let linkPreview, pendingLinkUrl == url {
|
||||
if let linkPreview, pendingLinkUrl == urlStr {
|
||||
privacyLinkPreviewsShowAlertGroupDefault.set(false) // to avoid showing alert to current users, show alert in v6.5
|
||||
composeState = composeState.copy(preview: .linkPreview(linkPreview: linkPreview))
|
||||
} else {
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||||
@@ -1490,32 +1536,31 @@ struct ComposeView: View {
|
||||
}
|
||||
}
|
||||
|
||||
struct ComposeView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
let chat = Chat(chatInfo: ChatInfo.sampleData.direct, chatItems: [])
|
||||
let im = ItemsModel.shared
|
||||
@State var composeState = ComposeState(message: "hello")
|
||||
@State var selectedRange = NSRange()
|
||||
|
||||
return Group {
|
||||
ComposeView(
|
||||
chat: chat,
|
||||
im: im,
|
||||
composeState: $composeState,
|
||||
keyboardVisible: Binding.constant(true),
|
||||
keyboardHiddenDate: Binding.constant(Date.now),
|
||||
selectedRange: $selectedRange
|
||||
)
|
||||
.environmentObject(ChatModel())
|
||||
ComposeView(
|
||||
chat: chat,
|
||||
im: im,
|
||||
composeState: $composeState,
|
||||
keyboardVisible: Binding.constant(true),
|
||||
keyboardHiddenDate: Binding.constant(Date.now),
|
||||
selectedRange: $selectedRange
|
||||
)
|
||||
.environmentObject(ChatModel())
|
||||
func sanitizeMessage(_ parsedMsg: [FormattedText]) -> (message: String, parsedMsg: [FormattedText], sanitizedPos: Int?) {
|
||||
var pos: Int = 0
|
||||
var updatedMsg = ""
|
||||
var sanitizedPos: Int? = nil
|
||||
let updatedParsedMsg = parsedMsg.map { ft in
|
||||
var updated = ft
|
||||
switch ft.format {
|
||||
case .uri:
|
||||
if let sanitized = parseSanitizeUri(ft.text)?.uriInfo?.sanitized {
|
||||
updated = FormattedText(text: sanitized, format: .uri)
|
||||
pos += updated.text.count
|
||||
sanitizedPos = pos
|
||||
}
|
||||
case let .hyperLink(text, uri):
|
||||
if let sanitized = parseSanitizeUri(uri)?.uriInfo?.sanitized {
|
||||
let updatedText = if let text { "[\(text)](\(sanitized))" } else { sanitized }
|
||||
updated = FormattedText(text: updatedText, format: .hyperLink(showText: text, linkUri: sanitized))
|
||||
pos += updated.text.count
|
||||
sanitizedPos = pos
|
||||
}
|
||||
default:
|
||||
pos += ft.text.count
|
||||
}
|
||||
updatedMsg += updated.text
|
||||
return updated
|
||||
}
|
||||
return (message: updatedMsg, parsedMsg: updatedParsedMsg, sanitizedPos: sanitizedPos)
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ struct GroupMentionsView: View {
|
||||
}
|
||||
}
|
||||
.frame(maxHeight: MEMBER_ROW_SIZE * min(MAX_VISIBLE_MEMBER_ROWS, CGFloat(filtered.count)))
|
||||
.background(Color(UIColor.systemBackground))
|
||||
.background(theme.colors.background)
|
||||
|
||||
if #available(iOS 16.0, *) {
|
||||
scroll.scrollDismissesKeyboard(.never)
|
||||
|
||||
@@ -629,7 +629,7 @@ struct ChatListSearchBar: View {
|
||||
} else {
|
||||
if let link = strHasSingleSimplexLink(t.trimmingCharacters(in: .whitespaces)) { // if SimpleX link is pasted, show connection dialogue
|
||||
searchFocussed = false
|
||||
if case let .simplexLink(linkType, _, smpHosts) = link.format {
|
||||
if case let .simplexLink(_, linkType, _, smpHosts) = link.format {
|
||||
ignoreSearchTextChange = true
|
||||
searchText = simplexLinkText(linkType, smpHosts)
|
||||
}
|
||||
|
||||
@@ -351,12 +351,14 @@ struct ChatPreviewView: View {
|
||||
if contact.isContactCard {
|
||||
Text("Tap to Connect")
|
||||
.foregroundColor(theme.colors.primary)
|
||||
} else if contact.isBot && contact.nextConnectPrepared {
|
||||
Text("Open to use bot")
|
||||
} else if contact.sendMsgToConnect {
|
||||
Text("Open to connect")
|
||||
} else if contact.nextAcceptContactRequest {
|
||||
Text("Open to accept")
|
||||
} else if !contact.sndReady && contact.activeConn != nil && contact.active {
|
||||
contact.preparedContact?.uiConnLinkType == .con
|
||||
(contact.preparedContact?.uiConnLinkType == .con && !contact.isBot) || contact.contactGroupMemberId != nil
|
||||
? Text("contact should accept…")
|
||||
: Text("connecting…")
|
||||
} else {
|
||||
|
||||
@@ -27,6 +27,7 @@ struct ProfileImage: View {
|
||||
Image(systemName: iconName)
|
||||
.resizable()
|
||||
.foregroundColor(c)
|
||||
.scaledToFit()
|
||||
.frame(width: size, height: size)
|
||||
.background(
|
||||
Circle()
|
||||
|
||||
@@ -381,7 +381,7 @@ struct ContactsListSearchBar: View {
|
||||
} else {
|
||||
if let link = strHasSingleSimplexLink(t.trimmingCharacters(in: .whitespaces)) { // if SimpleX link is pasted, show connection dialogue
|
||||
searchFocussed = false
|
||||
if case let .simplexLink(linkType, _, smpHosts) = link.format {
|
||||
if case let .simplexLink(_, linkType, _, smpHosts) = link.format {
|
||||
ignoreSearchTextChange = true
|
||||
searchText = simplexLinkText(linkType, smpHosts)
|
||||
}
|
||||
|
||||
@@ -1039,7 +1039,11 @@ private func showPrepareContactAlert(
|
||||
profileImage:
|
||||
ProfileImage(
|
||||
imageStr: contactShortLinkData.profile.image,
|
||||
iconName: contactShortLinkData.business ? "briefcase.circle.fill" : "person.crop.circle.fill",
|
||||
iconName: contactShortLinkData.business
|
||||
? "briefcase.circle.fill"
|
||||
: contactShortLinkData.profile.peerType == .bot
|
||||
? "cube.fill"
|
||||
: "person.crop.circle.fill",
|
||||
size: alertProfileImageSize
|
||||
),
|
||||
theme: theme,
|
||||
@@ -1112,7 +1116,7 @@ private func showOpenKnownContactAlert(
|
||||
profileImage:
|
||||
ProfileImage(
|
||||
imageStr: contact.profile.image,
|
||||
iconName: "person.crop.circle.fill",
|
||||
iconName: contact.chatIconName,
|
||||
size: alertProfileImageSize
|
||||
),
|
||||
theme: theme,
|
||||
@@ -1138,7 +1142,7 @@ private func showOpenKnownGroupAlert(
|
||||
profileImage:
|
||||
ProfileImage(
|
||||
imageStr: groupInfo.groupProfile.image,
|
||||
iconName: groupInfo.businessChat == nil ? "person.2.circle.fill" : "briefcase.circle.fill",
|
||||
iconName: groupInfo.chatIconName,
|
||||
size: alertProfileImageSize
|
||||
),
|
||||
theme: theme,
|
||||
|
||||
@@ -14,6 +14,7 @@ struct DeveloperView: View {
|
||||
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
||||
@AppStorage(GROUP_DEFAULT_CONFIRM_DB_UPGRADES, store: groupDefaults) private var confirmDatabaseUpgrades = false
|
||||
@State private var hintsUnchanged = hintDefaultsUnchanged()
|
||||
@State private var simplexLinkMode = privacySimplexLinkModeDefault.get()
|
||||
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
|
||||
@@ -65,6 +66,21 @@ struct DeveloperView: View {
|
||||
Text("Developer options")
|
||||
}
|
||||
}
|
||||
Section("Deprecated options") {
|
||||
settingsRow("link", color: theme.colors.secondary) {
|
||||
Picker("SimpleX links", selection: $simplexLinkMode) {
|
||||
ForEach(
|
||||
SimpleXLinkMode.values + (SimpleXLinkMode.values.contains(simplexLinkMode) ? [] : [simplexLinkMode])
|
||||
) { mode in
|
||||
Text(mode.text)
|
||||
}
|
||||
}
|
||||
}
|
||||
.frame(height: 36)
|
||||
.onChange(of: simplexLinkMode) { mode in
|
||||
privacySimplexLinkModeDefault.set(mode)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,11 +14,11 @@ struct PrivacySettings: View {
|
||||
@EnvironmentObject var theme: AppTheme
|
||||
@AppStorage(DEFAULT_PRIVACY_ACCEPT_IMAGES) private var autoAcceptImages = true
|
||||
@AppStorage(DEFAULT_PRIVACY_LINK_PREVIEWS) private var useLinkPreviews = true
|
||||
@AppStorage(GROUP_DEFAULT_PRIVACY_SANITIZE_LINKS, store: groupDefaults) private var privacySanitizeLinks = true
|
||||
@AppStorage(DEFAULT_PRIVACY_SHOW_CHAT_PREVIEWS) private var showChatPreviews = true
|
||||
@AppStorage(DEFAULT_PRIVACY_SAVE_LAST_DRAFT) private var saveLastDraft = true
|
||||
@AppStorage(GROUP_DEFAULT_PRIVACY_ENCRYPT_LOCAL_FILES, store: groupDefaults) private var encryptLocalFiles = true
|
||||
@AppStorage(GROUP_DEFAULT_PRIVACY_ASK_TO_APPROVE_RELAYS, store: groupDefaults) private var askToApproveRelays = true
|
||||
@State private var simplexLinkMode = privacySimplexLinkModeDefault.get()
|
||||
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
||||
@AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false
|
||||
@AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false
|
||||
@@ -75,8 +75,12 @@ struct PrivacySettings: View {
|
||||
Toggle("Send link previews", isOn: $useLinkPreviews)
|
||||
.onChange(of: useLinkPreviews) { linkPreviews in
|
||||
privacyLinkPreviewsGroupDefault.set(linkPreviews)
|
||||
privacyLinkPreviewsShowAlertGroupDefault.set(false) // to avoid showing alert to current users, show alert in v6.5
|
||||
}
|
||||
}
|
||||
settingsRow("link", color: theme.colors.secondary) {
|
||||
Toggle("Remove link tracking", isOn: $privacySanitizeLinks)
|
||||
}
|
||||
settingsRow("message", color: theme.colors.secondary) {
|
||||
Toggle("Show last messages", isOn: $showChatPreviews)
|
||||
}
|
||||
@@ -89,19 +93,6 @@ struct PrivacySettings: View {
|
||||
m.draftChatId = nil
|
||||
}
|
||||
}
|
||||
settingsRow("link", color: theme.colors.secondary) {
|
||||
Picker("SimpleX links", selection: $simplexLinkMode) {
|
||||
ForEach(
|
||||
SimpleXLinkMode.values + (SimpleXLinkMode.values.contains(simplexLinkMode) ? [] : [simplexLinkMode])
|
||||
) { mode in
|
||||
Text(mode.text)
|
||||
}
|
||||
}
|
||||
}
|
||||
.frame(height: 36)
|
||||
.onChange(of: simplexLinkMode) { mode in
|
||||
privacySimplexLinkModeDefault.set(mode)
|
||||
}
|
||||
} header: {
|
||||
Text("Chats")
|
||||
.foregroundColor(theme.colors.secondary)
|
||||
|
||||
@@ -1374,12 +1374,14 @@
|
||||
<target state="translated">خطأ في تغيير الإعدادات</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error creating address" xml:space="preserve">
|
||||
<trans-unit id="Error creating address" xml:space="preserve" approved="no">
|
||||
<source>Error creating address</source>
|
||||
<target state="translated">خطأ في إنشاء العنوان</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error creating group" xml:space="preserve">
|
||||
<trans-unit id="Error creating group" xml:space="preserve" approved="no">
|
||||
<source>Error creating group</source>
|
||||
<target state="translated">خطأ في إنشاء المجموعة</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error creating group link" xml:space="preserve">
|
||||
@@ -5757,6 +5759,102 @@ This is your own one-time link!</source>
|
||||
<source>Encryption re-negotiation failed.</source>
|
||||
<target state="translated">فشل إعادة التفاوض على التشفير.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accept as member" xml:space="preserve" approved="no">
|
||||
<source>Accept as member</source>
|
||||
<target state="translated">اقبل كعضو</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accept as observer" xml:space="preserve" approved="no">
|
||||
<source>Accept as observer</source>
|
||||
<target state="translated">اقبل كمراقب</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accept contact request" xml:space="preserve" approved="no">
|
||||
<source>Accept contact request</source>
|
||||
<target state="translated">اقبل طلب الاتصال</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accept member" xml:space="preserve" approved="no">
|
||||
<source>Accept member</source>
|
||||
<target state="translated">اقبل العضو</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Add message" xml:space="preserve" approved="no">
|
||||
<source>Add message</source>
|
||||
<target state="translated">أضف رسالة</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="All servers" xml:space="preserve" approved="no">
|
||||
<source>All servers</source>
|
||||
<target state="translated">كل الخوادم</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio" xml:space="preserve" approved="no">
|
||||
<source>Bio</source>
|
||||
<target state="translated">نبذة</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bio too large" xml:space="preserve" approved="no">
|
||||
<source>Bio too large</source>
|
||||
<target state="translated">النبذة كبيرة جدًا</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Can't change profile" xml:space="preserve" approved="no">
|
||||
<source>Can't change profile</source>
|
||||
<target state="needs-translation">لا يمكن تغيير الحساب</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Chat with admins" xml:space="preserve" approved="no">
|
||||
<source>Chat with admins</source>
|
||||
<target state="translated">تحدث مع المدراء</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Chat with member" xml:space="preserve" approved="no">
|
||||
<source>Chat with member</source>
|
||||
<target state="translated">تحدث مع العضو</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Chat with members before they join." xml:space="preserve" approved="no">
|
||||
<source>Chat with members before they join.</source>
|
||||
<target state="translated">تحدث مع الأعضاء قبل انضمامهم.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Chats with members" xml:space="preserve" approved="no">
|
||||
<source>Chats with members</source>
|
||||
<target state="translated">تحدث مع الأعضاء</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Connect faster! 🚀" xml:space="preserve" approved="no">
|
||||
<source>Connect faster! 🚀</source>
|
||||
<target state="translated">اتصل بسرعة! 🚀</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Contact requests from groups" xml:space="preserve" approved="no">
|
||||
<source>Contact requests from groups</source>
|
||||
<target state="translated">طلبات الاتصال من المجموعات</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Create your address" xml:space="preserve" approved="no">
|
||||
<source>Create your address</source>
|
||||
<target state="translated">أنشئ عنوانك</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete chat with member?" xml:space="preserve" approved="no">
|
||||
<source>Delete chat with member?</source>
|
||||
<target state="translated">حذف المحادثة مع العضو؟</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description too large" xml:space="preserve" approved="no">
|
||||
<source>Description too large</source>
|
||||
<target state="translated">الوصف كبير جدًا</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Empty message!" xml:space="preserve" approved="no">
|
||||
<source>Empty message!</source>
|
||||
<target state="translated">رسالة فارغة!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enable disappearing messages by default." xml:space="preserve" approved="no">
|
||||
<source>Enable disappearing messages by default.</source>
|
||||
<target state="needs-translation">فعّل حذف الرسائل تلقائيا.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error accepting member" xml:space="preserve" approved="no">
|
||||
<source>Error accepting member</source>
|
||||
<target state="translated">خطأ في قبول العضو</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error adding short link" xml:space="preserve" approved="no">
|
||||
<source>Error adding short link</source>
|
||||
<target state="translated">خطأ في إضافة الرابط القصير</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error changing chat profile" xml:space="preserve" approved="no">
|
||||
<source>Error changing chat profile</source>
|
||||
<target state="translated">خطأ في تغيير حساب المحادثات</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve" approved="no">
|
||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||
<target state="needs-translation">خطأ في الإتصال بخادم التحويل @%. حاول مجددا بعد حين.</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="ar" datatype="plaintext">
|
||||
|
||||
@@ -855,6 +855,10 @@ swipe action</note>
|
||||
<target>Позволи понижаване</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Позволи необратимо изтриване на съобщение само ако вашият контакт го рарешава. (24 часа)</target>
|
||||
@@ -939,6 +943,10 @@ swipe action</note>
|
||||
<target>Позволи на вашите контакти да изпращат изчезващи съобщения.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Позволи на вашите контакти да изпращат гласови съобщения.</target>
|
||||
@@ -1287,6 +1295,10 @@ swipe action</note>
|
||||
<target>Размазване на медия</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>И вие, и вашият контакт можете да добавяте реакции към съобщението.</target>
|
||||
@@ -1307,6 +1319,10 @@ swipe action</note>
|
||||
<target>И вие, и вашият контакт можете да изпращате изчезващи съобщения.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>И вие, и вашият контакт можете да изпращате гласови съобщения.</target>
|
||||
@@ -2547,6 +2563,10 @@ swipe action</note>
|
||||
<target>Потвърждениe за доставка!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Описание</target>
|
||||
@@ -3607,6 +3627,10 @@ snd error text</note>
|
||||
<target>Файлове и медия</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>Файловете и медията са забранени в тази група.</target>
|
||||
@@ -4269,7 +4293,7 @@ More improvements are coming soon!</source>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Невалиден линк</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5378,6 +5402,10 @@ Requires compatible VPN.</source>
|
||||
<target>Само вие можете да изпращате изчезващи съобщения.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Само вие можете да изпращате гласови съобщения.</target>
|
||||
@@ -5403,6 +5431,10 @@ Requires compatible VPN.</source>
|
||||
<target>Само вашият контакт може да изпраща изчезващи съобщения.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Само вашият контакт може да изпраща гласови съобщения.</target>
|
||||
@@ -5432,10 +5464,18 @@ Requires compatible VPN.</source>
|
||||
<target>Отвори конзолата</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Отвори група</target>
|
||||
@@ -5470,6 +5510,10 @@ Requires compatible VPN.</source>
|
||||
<source>Open to join</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>Приложението се отваря…</target>
|
||||
@@ -6161,6 +6205,10 @@ swipe action</note>
|
||||
<source>Remove image</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Острани член</target>
|
||||
@@ -7431,6 +7479,10 @@ report reason</note>
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -7815,6 +7867,10 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
<source>To send</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>За поддръжка на незабавни push известия, базата данни за чат трябва да бъде мигрирана.</target>
|
||||
@@ -8658,7 +8714,7 @@ Repeat join request?</source>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Не може да изпращате съобщения!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -819,6 +819,10 @@ swipe action</note>
|
||||
<source>Allow downgrade</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Povolte nevratné smazání zprávy pouze v případě, že vám to váš kontakt dovolí. (24 hodin)</target>
|
||||
@@ -901,6 +905,10 @@ swipe action</note>
|
||||
<target>Umožněte svým kontaktům odesílat mizící zprávy.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Povolte svým kontaktům odesílání hlasových zpráv.</target>
|
||||
@@ -1219,6 +1227,10 @@ swipe action</note>
|
||||
<source>Blur media</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Vy i váš kontakt můžete přidávat reakce na zprávy.</target>
|
||||
@@ -1239,6 +1251,10 @@ swipe action</note>
|
||||
<target>Vy i váš kontakt můžete posílat mizící zprávy.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Hlasové zprávy můžete posílat vy i váš kontakt.</target>
|
||||
@@ -2439,6 +2455,10 @@ swipe action</note>
|
||||
<target>Potvrzení o doručení!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Popis</target>
|
||||
@@ -3469,6 +3489,10 @@ snd error text</note>
|
||||
<target>Soubory a média</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>Soubory a média jsou zakázány v této skupině.</target>
|
||||
@@ -4108,7 +4132,7 @@ More improvements are coming soon!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5185,6 +5209,10 @@ Vyžaduje povolení sítě VPN.</target>
|
||||
<target>Mizící zprávy můžete odesílat pouze vy.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Hlasové zprávy můžete posílat pouze vy.</target>
|
||||
@@ -5210,6 +5238,10 @@ Vyžaduje povolení sítě VPN.</target>
|
||||
<target>Zmizelé zprávy může odesílat pouze váš kontakt.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Hlasové zprávy může odesílat pouze váš kontakt.</target>
|
||||
@@ -5239,10 +5271,18 @@ Vyžaduje povolení sítě VPN.</target>
|
||||
<target>Otevřete konzolu chatu</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<note>new chat action</note>
|
||||
@@ -5275,6 +5315,10 @@ Vyžaduje povolení sítě VPN.</target>
|
||||
<source>Open to join</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -5944,6 +5988,10 @@ swipe action</note>
|
||||
<source>Remove image</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Odstranit člena</target>
|
||||
@@ -7190,6 +7238,10 @@ report reason</note>
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -7564,6 +7616,10 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření.</target>
|
||||
<source>To send</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Pro podporu doručování okamžitých upozornění musí být přenesena chat databáze.</target>
|
||||
@@ -8365,7 +8421,7 @@ Repeat join request?</source>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Nemůžete posílat zprávy!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -867,6 +867,10 @@ swipe action</note>
|
||||
<target>Herabstufung erlauben</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Erlauben Sie das unwiederbringliche Löschen von Nachrichten nur dann, wenn es Ihnen Ihr Kontakt ebenfalls erlaubt. (24 Stunden)</target>
|
||||
@@ -952,6 +956,10 @@ swipe action</note>
|
||||
<target>Erlauben Sie Ihren Kontakten das Senden von verschwindenden Nachrichten.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Erlauben Sie Ihren Kontakten Sprachnachrichten zu senden.</target>
|
||||
@@ -1312,6 +1320,10 @@ swipe action</note>
|
||||
<target>Medien verpixeln</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Sowohl Sie, als auch Ihr Kontakt können Reaktionen auf Nachrichten geben.</target>
|
||||
@@ -1332,6 +1344,10 @@ swipe action</note>
|
||||
<target>Ihr Kontakt und Sie können beide verschwindende Nachrichten senden.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Sowohl Ihr Kontakt, als auch Sie können Sprachnachrichten senden.</target>
|
||||
@@ -1636,7 +1652,7 @@ set passcode view</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Chat with members before they join." xml:space="preserve">
|
||||
<source>Chat with members before they join.</source>
|
||||
<target>Chat mit Mitgliedern bevor sie beitreten.</target>
|
||||
<target>Mit Mitgliedern chatten bevor sie beitreten.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Chats" xml:space="preserve">
|
||||
@@ -2087,6 +2103,7 @@ Das ist Ihr eigener Einmal-Link!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Contact requests from groups" xml:space="preserve">
|
||||
<source>Contact requests from groups</source>
|
||||
<target>KONTAKTANFRAGEN VON GRUPPEN</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Contact will be deleted - this cannot be undone!" xml:space="preserve">
|
||||
@@ -2663,6 +2680,10 @@ swipe action</note>
|
||||
<target>Empfangsbestätigungen!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Beschreibung</target>
|
||||
@@ -3021,7 +3042,7 @@ chat item action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enable disappearing messages by default." xml:space="preserve">
|
||||
<source>Enable disappearing messages by default.</source>
|
||||
<target>Verschwindende Nachrichten per Voreinstellung aktiviert.</target>
|
||||
<target>Verschwindende Nachrichten sind per Voreinstellung aktiviert.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enable for all" xml:space="preserve">
|
||||
@@ -3531,6 +3552,7 @@ chat item action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error setting auto-accept" xml:space="preserve">
|
||||
<source>Error setting auto-accept</source>
|
||||
<target>Fehler bei der Einstellung des automatischen Akzeptierens</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
|
||||
@@ -3794,6 +3816,10 @@ snd error text</note>
|
||||
<target>Dateien und Medien</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>In dieser Gruppe sind Dateien und Medien nicht erlaubt.</target>
|
||||
@@ -4495,7 +4521,7 @@ Weitere Verbesserungen sind bald verfügbar!</target>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Ungültiger Link</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -4662,7 +4688,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Keep your chats clean" xml:space="preserve">
|
||||
<source>Keep your chats clean</source>
|
||||
<target>Halten Sie Ihre Chats übersichtlich</target>
|
||||
<target>Ihre Chats übersichtlich halten</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||
@@ -4872,6 +4898,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Member is deleted - can't accept request" xml:space="preserve">
|
||||
<source>Member is deleted - can't accept request</source>
|
||||
<target>Mitglied ist gelöscht - Anfrage kann nicht angenommen werden</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Member reports" xml:space="preserve">
|
||||
@@ -5684,6 +5711,10 @@ Dies erfordert die Aktivierung eines VPNs.</target>
|
||||
<target>Nur Sie können verschwindende Nachrichten senden.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Nur Sie können Sprachnachrichten versenden.</target>
|
||||
@@ -5709,6 +5740,10 @@ Dies erfordert die Aktivierung eines VPNs.</target>
|
||||
<target>Nur Ihr Kontakt kann verschwindende Nachrichten senden.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Nur Ihr Kontakt kann Sprachnachrichten versenden.</target>
|
||||
@@ -5739,11 +5774,19 @@ Dies erfordert die Aktivierung eines VPNs.</target>
|
||||
<target>Chat-Konsole öffnen</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<target>Nutzungsbedingungen öffnen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Gruppe öffnen</target>
|
||||
@@ -5784,6 +5827,10 @@ Dies erfordert die Aktivierung eines VPNs.</target>
|
||||
<target>Zum Beitreten öffnen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>App wird geöffnet…</target>
|
||||
@@ -6529,6 +6576,10 @@ swipe action</note>
|
||||
<target>Bild entfernen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Mitglied entfernen</target>
|
||||
@@ -7377,7 +7428,7 @@ chat item action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Set profile bio and welcome message." xml:space="preserve">
|
||||
<source>Set profile bio and welcome message.</source>
|
||||
<target>Geben Sie eine Profil-Biografie und eine Begrüßungsmeldung ein.</target>
|
||||
<target>Sie können eine Profil-Biografie und eine Begrüßungsmeldung eingeben.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Set the message shown to new members!" xml:space="preserve">
|
||||
@@ -7914,6 +7965,10 @@ report reason</note>
|
||||
<target>Verbinden tippen, um die Anfrage zu senden</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -8238,6 +8293,7 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
|
||||
</trans-unit>
|
||||
<trans-unit id="This setting is for your current profile **%@**." xml:space="preserve">
|
||||
<source>This setting is for your current profile **%@**.</source>
|
||||
<target>Diese Einstellung gilt für Ihr aktuelles Profil **%@**.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Time to disappear is set only for new contacts." xml:space="preserve">
|
||||
@@ -8327,6 +8383,10 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
|
||||
<target>Für das Senden</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Um sofortige Push-Benachrichtigungen zu unterstützen, muss die Chat-Datenbank migriert werden.</target>
|
||||
@@ -9224,7 +9284,7 @@ Verbindungsanfrage wiederholen?</target>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Sie können keine Nachrichten versenden!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
@@ -10315,10 +10375,12 @@ time to disappear</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested connection" xml:space="preserve">
|
||||
<source>requested connection</source>
|
||||
<target>Angefragte Verbindung</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested connection from group %@" xml:space="preserve">
|
||||
<source>requested connection from group %@</source>
|
||||
<target>Angefragte Verbindung von Gruppe %@</target>
|
||||
<note>rcv direct event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested to connect" xml:space="preserve">
|
||||
|
||||
@@ -867,6 +867,11 @@ swipe action</note>
|
||||
<target>Allow downgrade</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<target>Allow files and media only if your contact allows them.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</target>
|
||||
@@ -952,6 +957,11 @@ swipe action</note>
|
||||
<target>Allow your contacts to send disappearing messages.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<target>Allow your contacts to send files and media.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Allow your contacts to send voice messages.</target>
|
||||
@@ -1312,6 +1322,11 @@ swipe action</note>
|
||||
<target>Blur media</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<target>Bot</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Both you and your contact can add message reactions.</target>
|
||||
@@ -1332,6 +1347,11 @@ swipe action</note>
|
||||
<target>Both you and your contact can send disappearing messages.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<target>Both you and your contact can send files and media.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Both you and your contact can send voice messages.</target>
|
||||
@@ -2664,6 +2684,11 @@ swipe action</note>
|
||||
<target>Delivery receipts!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<target>Deprecated options</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Description</target>
|
||||
@@ -3796,6 +3821,11 @@ snd error text</note>
|
||||
<target>Files and media</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<target>Files and media are prohibited in this chat.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>Files and media are prohibited.</target>
|
||||
@@ -4497,7 +4527,7 @@ More improvements are coming soon!</target>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Invalid link</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5687,6 +5717,11 @@ Requires compatible VPN.</target>
|
||||
<target>Only you can send disappearing messages.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<target>Only you can send files and media.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Only you can send voice messages.</target>
|
||||
@@ -5712,6 +5747,11 @@ Requires compatible VPN.</target>
|
||||
<target>Only your contact can send disappearing messages.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<target>Only your contact can send files and media.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Only your contact can send voice messages.</target>
|
||||
@@ -5742,11 +5782,21 @@ Requires compatible VPN.</target>
|
||||
<target>Open chat console</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<target>Open clean link</target>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<target>Open conditions</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<target>Open full link</target>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Open group</target>
|
||||
@@ -5787,6 +5837,11 @@ Requires compatible VPN.</target>
|
||||
<target>Open to join</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<target>Open to use bot</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>Opening app…</target>
|
||||
@@ -6532,6 +6587,11 @@ swipe action</note>
|
||||
<target>Remove image</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<target>Remove link tracking</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Remove member</target>
|
||||
@@ -7917,6 +7977,11 @@ report reason</note>
|
||||
<target>Tap Connect to send request</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</source>
|
||||
<target>Tap Connect to use bot</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>
|
||||
@@ -8331,6 +8396,11 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
<target>To send</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<target>To send commands you must be connected.</target>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>To support instant push notifications the chat database has to be migrated.</target>
|
||||
@@ -9228,7 +9298,7 @@ Repeat join request?</target>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>You can't send messages!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -859,7 +859,7 @@ swipe action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
|
||||
<source>Allow disappearing messages only if your contact allows it to you.</source>
|
||||
<target>Se permiten los mensajes temporales pero sólo si tu contacto también los permite para tí.</target>
|
||||
<target>Se permiten los mensajes temporales pero sólo si tu contacto también los permite.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow downgrade" xml:space="preserve">
|
||||
@@ -867,9 +867,13 @@ swipe action</note>
|
||||
<target>Permitir versión anterior</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Se permite la eliminación irreversible de mensajes pero sólo si tu contacto también la permite para tí. (24 horas)</target>
|
||||
<target>Se permite la eliminación irreversible de mensajes pero sólo si tu contacto también lo permite. (24 horas)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow message reactions only if your contact allows them." xml:space="preserve">
|
||||
@@ -952,6 +956,10 @@ swipe action</note>
|
||||
<target>Permites a tus contactos enviar mensajes temporales.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Permites a tus contactos enviar mensajes de voz.</target>
|
||||
@@ -1312,6 +1320,10 @@ swipe action</note>
|
||||
<target>Difuminar multimedia</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Tanto tú como tu contacto podéis añadir reacciones a los mensajes.</target>
|
||||
@@ -1332,6 +1344,10 @@ swipe action</note>
|
||||
<target>Tanto tú como tu contacto podéis enviar mensajes temporales.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Tanto tú como tu contacto podéis enviar mensajes de voz.</target>
|
||||
@@ -1626,7 +1642,7 @@ set passcode view</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Chat with admins" xml:space="preserve">
|
||||
<source>Chat with admins</source>
|
||||
<target>Chatea con los administradores</target>
|
||||
<target>Chatea con administradores</target>
|
||||
<note>chat toolbar</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Chat with member" xml:space="preserve">
|
||||
@@ -1676,7 +1692,7 @@ set passcode view</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Choose file" xml:space="preserve">
|
||||
<source>Choose file</source>
|
||||
<target>Elije archivo</target>
|
||||
<target>Elegir archivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Choose from library" xml:space="preserve">
|
||||
@@ -2087,6 +2103,7 @@ This is your own one-time link!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Contact requests from groups" xml:space="preserve">
|
||||
<source>Contact requests from groups</source>
|
||||
<target>Solicitudes de contacto en grupo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Contact will be deleted - this cannot be undone!" xml:space="preserve">
|
||||
@@ -2663,6 +2680,10 @@ swipe action</note>
|
||||
<target>¡Confirmación de entrega!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Descripción</target>
|
||||
@@ -3531,6 +3552,7 @@ chat item action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error setting auto-accept" xml:space="preserve">
|
||||
<source>Error setting auto-accept</source>
|
||||
<target>Error al configurar auto aceptar</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
|
||||
@@ -3794,6 +3816,10 @@ snd error text</note>
|
||||
<target>Archivos y multimedia</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>Los archivos y multimedia no están permitidos en este grupo.</target>
|
||||
@@ -4495,7 +4521,7 @@ More improvements are coming soon!</source>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Enlace no válido</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -4605,17 +4631,17 @@ More improvements are coming soon!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Join" xml:space="preserve">
|
||||
<source>Join</source>
|
||||
<target>Unirte</target>
|
||||
<target>Unirme</target>
|
||||
<note>swipe action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Join as %@" xml:space="preserve">
|
||||
<source>Join as %@</source>
|
||||
<target>unirte como %@</target>
|
||||
<target>Unirme como %@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Join group" xml:space="preserve">
|
||||
<source>Join group</source>
|
||||
<target>Unirte al grupo</target>
|
||||
<target>Unirme al grupo</target>
|
||||
<note>new chat sheet title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Join group conversations" xml:space="preserve">
|
||||
@@ -4625,7 +4651,7 @@ More improvements are coming soon!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Join incognito" xml:space="preserve">
|
||||
<source>Join incognito</source>
|
||||
<target>Unirte en modo incógnito</target>
|
||||
<target>Unirme en modo incógnito</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||
@@ -4872,6 +4898,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Member is deleted - can't accept request" xml:space="preserve">
|
||||
<source>Member is deleted - can't accept request</source>
|
||||
<target>Miembro eliminado, no puede aceptar solicitudes</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Member reports" xml:space="preserve">
|
||||
@@ -4881,7 +4908,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Member role will be changed to "%@". All chat members will be notified." xml:space="preserve">
|
||||
<source>Member role will be changed to "%@". All chat members will be notified.</source>
|
||||
<target>El rol del miembro cambiará a "%@" y todos serán notificados.</target>
|
||||
<target>El rol del miembro cambiará a "%@". Se notificará en el chat.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Member role will be changed to "%@". All group members will be notified." xml:space="preserve">
|
||||
@@ -5071,7 +5098,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||
<source>Messages from %@ will be shown!</source>
|
||||
<target>¡Los mensajes de %@ serán mostrados!</target>
|
||||
<target>¡Los mensajes nuevos de %@ serán mostrados!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Messages in this chat will never be deleted." xml:space="preserve">
|
||||
@@ -5391,7 +5418,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="No chats with members" xml:space="preserve">
|
||||
<source>No chats with members</source>
|
||||
<target>Sin chats con miembros</target>
|
||||
<target>Sin chats</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="No contacts selected" xml:space="preserve">
|
||||
@@ -5684,6 +5711,10 @@ Requiere activación de la VPN.</target>
|
||||
<target>Sólo tú puedes enviar mensajes temporales.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Sólo tú puedes enviar mensajes de voz.</target>
|
||||
@@ -5709,6 +5740,10 @@ Requiere activación de la VPN.</target>
|
||||
<target>Sólo tu contacto puede enviar mensajes temporales.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Sólo tu contacto puede enviar mensajes de voz.</target>
|
||||
@@ -5739,11 +5774,19 @@ Requiere activación de la VPN.</target>
|
||||
<target>Abrir consola de Chat</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<target>Abrir condiciones</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Grupo abierto</target>
|
||||
@@ -5781,7 +5824,11 @@ Requiere activación de la VPN.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to join" xml:space="preserve">
|
||||
<source>Open to join</source>
|
||||
<target>Abrir para unirte</target>
|
||||
<target>Abre para unirte</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
@@ -6529,6 +6576,10 @@ swipe action</note>
|
||||
<target>Eliminar imagen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Expulsar miembro</target>
|
||||
@@ -7598,7 +7649,7 @@ chat item action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX address or 1-time link?" xml:space="preserve">
|
||||
<source>SimpleX address or 1-time link?</source>
|
||||
<target>¿Dirección SimpleX o enlace de un uso?</target>
|
||||
<target>¿Dirección SimpleX o enlace de un solo uso?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="SimpleX address settings" xml:space="preserve">
|
||||
@@ -7914,6 +7965,10 @@ report reason</note>
|
||||
<target>Pulsa Conectar para enviar solicitud</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -7921,7 +7976,7 @@ report reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Join group" xml:space="preserve">
|
||||
<source>Tap Join group</source>
|
||||
<target>Pulsa Unirte al grupo</target>
|
||||
<target>Pulsa Unirme al grupo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap button " xml:space="preserve">
|
||||
@@ -7951,7 +8006,7 @@ report reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap to paste link" xml:space="preserve">
|
||||
<source>Tap to paste link</source>
|
||||
<target>Pulsa para pegar el enlacePulsa para pegar enlace</target>
|
||||
<target>Pulsa aquí para pegar el enlace</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap to scan" xml:space="preserve">
|
||||
@@ -8203,7 +8258,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="This display name is invalid. Please choose another name." xml:space="preserve">
|
||||
<source>This display name is invalid. Please choose another name.</source>
|
||||
<target>Éste nombre mostrado no es válido. Por favor, elije otro nombre.</target>
|
||||
<target>Éste nombre mostrado no es válido. Por favor, elige otro nombre.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||
@@ -8238,6 +8293,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="This setting is for your current profile **%@**." xml:space="preserve">
|
||||
<source>This setting is for your current profile **%@**.</source>
|
||||
<target>Esta configuración se aplica al perfil actual **%@**.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Time to disappear is set only for new contacts." xml:space="preserve">
|
||||
@@ -8327,6 +8383,10 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
|
||||
<target>Para enviar</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Para permitir las notificaciones automáticas instantáneas, la base de datos se debe migrar.</target>
|
||||
@@ -8429,7 +8489,7 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
|
||||
</trans-unit>
|
||||
<trans-unit id="Unblock member for all?" xml:space="preserve">
|
||||
<source>Unblock member for all?</source>
|
||||
<target>¿Desbloquear el miembro para todos?</target>
|
||||
<target>¿Desbloquear al miembro para todos?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||
@@ -9218,13 +9278,13 @@ Repeat join request?</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="You can view your reports in Chat with admins." xml:space="preserve">
|
||||
<source>You can view your reports in Chat with admins.</source>
|
||||
<target>Puedes ver tus informes en Chat con los administradores.</target>
|
||||
<target>Puedes ver tus informes en Chat con administradores.</target>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>¡No puedes enviar mensajes!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
@@ -9340,12 +9400,12 @@ Repeat connection request?</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="You will stop receiving messages from this chat. Chat history will be preserved." xml:space="preserve">
|
||||
<source>You will stop receiving messages from this chat. Chat history will be preserved.</source>
|
||||
<target>Dejarás de recibir mensajes de este chat. El historial del chat se conserva.</target>
|
||||
<target>Dejarás de recibir mensajes del chat. El historial del chat se conserva.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You will stop receiving messages from this group. Chat history will be preserved." xml:space="preserve">
|
||||
<source>You will stop receiving messages from this group. Chat history will be preserved.</source>
|
||||
<target>Dejarás de recibir mensajes de este grupo. El historial del chat se conservará.</target>
|
||||
<target>Dejarás de recibir mensajes del grupo. El historial del chat se conservará.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You won't lose your contacts if you later delete your address." xml:space="preserve">
|
||||
@@ -9796,12 +9856,12 @@ marked deleted chat item preview text</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="contact not ready" xml:space="preserve">
|
||||
<source>contact not ready</source>
|
||||
<target>el contacto no está listo</target>
|
||||
<target>en espera de ser aceptado</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="contact should accept…" xml:space="preserve">
|
||||
<source>contact should accept…</source>
|
||||
<target>el contacto debe aceptar…</target>
|
||||
<target>el contacto debe aceptarte…</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="creator" xml:space="preserve">
|
||||
@@ -10315,10 +10375,12 @@ time to disappear</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested connection" xml:space="preserve">
|
||||
<source>requested connection</source>
|
||||
<target>conexión solicitada</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested connection from group %@" xml:space="preserve">
|
||||
<source>requested connection from group %@</source>
|
||||
<target>conexión solicitada desde el grupo %@</target>
|
||||
<note>rcv direct event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested to connect" xml:space="preserve">
|
||||
|
||||
@@ -792,6 +792,10 @@ swipe action</note>
|
||||
<source>Allow downgrade</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Salli peruuttamaton viestien poisto vain, jos kontaktisi sallii ne sinulle. (24 tuntia)</target>
|
||||
@@ -874,6 +878,10 @@ swipe action</note>
|
||||
<target>Salli kontaktiesi lähettää katoavia viestejä.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Salli kontaktiesi lähettää ääniviestejä.</target>
|
||||
@@ -1191,6 +1199,10 @@ swipe action</note>
|
||||
<source>Blur media</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Sekä sinä että kontaktisi voivat käyttää viestireaktioita.</target>
|
||||
@@ -1211,6 +1223,10 @@ swipe action</note>
|
||||
<target>Sekä sinä että kontaktisi voitte lähettää katoavia viestejä.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Sekä sinä että kontaktisi voitte lähettää ääniviestejä.</target>
|
||||
@@ -2410,6 +2426,10 @@ swipe action</note>
|
||||
<target>Toimituskuittaukset!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Kuvaus</target>
|
||||
@@ -3437,6 +3457,10 @@ snd error text</note>
|
||||
<target>Tiedostot ja media</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>Tiedostot ja media ovat tässä ryhmässä kiellettyjä.</target>
|
||||
@@ -4076,7 +4100,7 @@ More improvements are coming soon!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5152,6 +5176,10 @@ Edellyttää VPN:n sallimista.</target>
|
||||
<target>Vain sinä voit lähettää katoavia viestejä.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Vain sinä voit lähettää ääniviestejä.</target>
|
||||
@@ -5177,6 +5205,10 @@ Edellyttää VPN:n sallimista.</target>
|
||||
<target>Vain kontaktisi voi lähettää katoavia viestejä.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Vain kontaktisi voi lähettää ääniviestejä.</target>
|
||||
@@ -5205,10 +5237,18 @@ Edellyttää VPN:n sallimista.</target>
|
||||
<target>Avaa keskustelukonsoli</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<note>new chat action</note>
|
||||
@@ -5241,6 +5281,10 @@ Edellyttää VPN:n sallimista.</target>
|
||||
<source>Open to join</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -5910,6 +5954,10 @@ swipe action</note>
|
||||
<source>Remove image</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Poista jäsen</target>
|
||||
@@ -7154,6 +7202,10 @@ report reason</note>
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -7528,6 +7580,10 @@ Sinua kehotetaan suorittamaan todennus loppuun, ennen kuin tämä ominaisuus ote
|
||||
<source>To send</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Keskustelujen-tietokanta on siirrettävä välittömien push-ilmoitusten tukemiseksi.</target>
|
||||
@@ -8328,7 +8384,7 @@ Repeat join request?</source>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Et voi lähettää viestejä!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -861,6 +861,10 @@ swipe action</note>
|
||||
<target>Autoriser la rétrogradation</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Autoriser la suppression irréversible des messages uniquement si votre contact vous l'autorise. (24 heures)</target>
|
||||
@@ -946,6 +950,10 @@ swipe action</note>
|
||||
<target>Autorise votre contact à envoyer des messages éphémères.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Autorise vos contacts à envoyer des messages vocaux.</target>
|
||||
@@ -1303,6 +1311,10 @@ swipe action</note>
|
||||
<target>Flouter les médias</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Vous et votre contact pouvez ajouter des réactions aux messages.</target>
|
||||
@@ -1323,6 +1335,10 @@ swipe action</note>
|
||||
<target>Vous et votre contact êtes tous deux en mesure d'envoyer des messages éphémères.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Vous et votre contact êtes tous deux en mesure d'envoyer des messages vocaux.</target>
|
||||
@@ -2645,6 +2661,10 @@ swipe action</note>
|
||||
<target>Justificatifs de réception !</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Description</target>
|
||||
@@ -3767,6 +3787,10 @@ snd error text</note>
|
||||
<target>Fichiers et médias</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>Les fichiers et les médias sont interdits dans ce groupe.</target>
|
||||
@@ -4454,7 +4478,7 @@ D'autres améliorations sont à venir !</target>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Lien invalide</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5611,6 +5635,10 @@ Nécessite l'activation d'un VPN.</target>
|
||||
<target>Seulement vous pouvez envoyer des messages éphémères.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Vous seul pouvez envoyer des messages vocaux.</target>
|
||||
@@ -5636,6 +5664,10 @@ Nécessite l'activation d'un VPN.</target>
|
||||
<target>Seulement votre contact peut envoyer des messages éphémères.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Seul votre contact peut envoyer des messages vocaux.</target>
|
||||
@@ -5666,11 +5698,19 @@ Nécessite l'activation d'un VPN.</target>
|
||||
<target>Ouvrir la console du chat</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<target>Ouvrir les conditions</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Ouvrir le groupe</target>
|
||||
@@ -5705,6 +5745,10 @@ Nécessite l'activation d'un VPN.</target>
|
||||
<source>Open to join</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>Ouverture de l'app…</target>
|
||||
@@ -6435,6 +6479,10 @@ swipe action</note>
|
||||
<target>Enlever l'image</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Retirer le membre</target>
|
||||
@@ -7779,6 +7827,10 @@ report reason</note>
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -8184,6 +8236,10 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
|
||||
<target>Pour envoyer</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Pour prendre en charge les notifications push instantanées, la base de données du chat doit être migrée.</target>
|
||||
@@ -9065,7 +9121,7 @@ Répéter la demande d'adhésion ?</target>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Vous ne pouvez pas envoyer de messages !</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -867,6 +867,10 @@ swipe action</note>
|
||||
<target>Visszafejlesztés engedélyezése</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Az üzenetek végleges törlése csak abban az esetben van engedélyezve, ha a partnere is engedélyezi. (24 óra)</target>
|
||||
@@ -952,6 +956,10 @@ swipe action</note>
|
||||
<target>Az eltűnő üzenetek küldésének engedélyezése a partnerei számára.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>A hangüzenetek küldése engedélyezve van a partnerei számára.</target>
|
||||
@@ -1312,6 +1320,10 @@ swipe action</note>
|
||||
<target>Médiatartalom elhomályosítása</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Mindkét fél hozzáadhat az üzenetekhez reakciókat.</target>
|
||||
@@ -1332,6 +1344,10 @@ swipe action</note>
|
||||
<target>Mindkét fél küldhet eltűnő üzeneteket.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Mindkét fél küldhet hangüzeneteket.</target>
|
||||
@@ -2087,6 +2103,7 @@ Ez a saját egyszer használható meghívója!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Contact requests from groups" xml:space="preserve">
|
||||
<source>Contact requests from groups</source>
|
||||
<target>Partneri kapcsolatkérések a csoportokból</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Contact will be deleted - this cannot be undone!" xml:space="preserve">
|
||||
@@ -2663,6 +2680,10 @@ swipe action</note>
|
||||
<target>Kézbesítési jelentések!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Leírás</target>
|
||||
@@ -3531,6 +3552,7 @@ chat item action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error setting auto-accept" xml:space="preserve">
|
||||
<source>Error setting auto-accept</source>
|
||||
<target>Hiba az automatikus elfogadás beállításakor</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
|
||||
@@ -3794,6 +3816,10 @@ snd error text</note>
|
||||
<target>Fájlok és médiatartalmak</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>A fájlok- és a médiatartalmak küldése le van tiltva.</target>
|
||||
@@ -4495,7 +4521,7 @@ További fejlesztések hamarosan!</target>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Érvénytelen hivatkozás</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -4872,6 +4898,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Member is deleted - can't accept request" xml:space="preserve">
|
||||
<source>Member is deleted - can't accept request</source>
|
||||
<target>A tag törölve lett – nem lehet elfogadni a kérést</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Member reports" xml:space="preserve">
|
||||
@@ -5684,6 +5711,10 @@ VPN engedélyezése szükséges.</target>
|
||||
<target>Csak Ön tud eltűnő üzeneteket küldeni.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Csak Ön tud hangüzeneteket küldeni.</target>
|
||||
@@ -5709,6 +5740,10 @@ VPN engedélyezése szükséges.</target>
|
||||
<target>Csak a partnere tud eltűnő üzeneteket küldeni.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Csak a partnere tud hangüzeneteket küldeni.</target>
|
||||
@@ -5739,11 +5774,19 @@ VPN engedélyezése szükséges.</target>
|
||||
<target>Csevegési konzol megnyitása</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<target>Feltételek megnyitása</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Csoport megnyitása</target>
|
||||
@@ -5784,6 +5827,10 @@ VPN engedélyezése szükséges.</target>
|
||||
<target>Megnyitás a csatlakozáshoz</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>Az alkalmazás megnyitása…</target>
|
||||
@@ -6529,6 +6576,10 @@ swipe action</note>
|
||||
<target>Kép eltávolítása</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Eltávolítás</target>
|
||||
@@ -7914,6 +7965,10 @@ report reason</note>
|
||||
<target>Koppintson a „Kapcsolódás” gombra a kérés elküldéséhez</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -8238,6 +8293,7 @@ Ez valamilyen hiba vagy sérült kapcsolat esetén fordulhat elő.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="This setting is for your current profile **%@**." xml:space="preserve">
|
||||
<source>This setting is for your current profile **%@**.</source>
|
||||
<target>Ez a beállítás csak a jelenlegi **%@** nevű csevegési profiljára vonatkozik.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Time to disappear is set only for new contacts." xml:space="preserve">
|
||||
@@ -8327,6 +8383,10 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll
|
||||
<target>A küldéshez</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Az azonnali push-értesítések támogatásához a csevegési adatbázis átköltöztetése szükséges.</target>
|
||||
@@ -9224,7 +9284,7 @@ Megismétli a csatlakozási kérést?</target>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Nem lehet üzeneteket küldeni!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
@@ -10137,7 +10197,7 @@ pref value</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="moderated by %@" xml:space="preserve">
|
||||
<source>moderated by %@</source>
|
||||
<target>moderálva lett %@ által</target>
|
||||
<target>%@ moderálta ezt az üzenetet</target>
|
||||
<note>marked deleted chat item preview text</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="moderator" xml:space="preserve">
|
||||
@@ -10315,10 +10375,12 @@ time to disappear</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested connection" xml:space="preserve">
|
||||
<source>requested connection</source>
|
||||
<target>partneri kapcsolatot kért</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested connection from group %@" xml:space="preserve">
|
||||
<source>requested connection from group %@</source>
|
||||
<target>a(z) %@ nevű csoportból partneri kapcsolatot kért</target>
|
||||
<note>rcv direct event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested to connect" xml:space="preserve">
|
||||
|
||||
@@ -867,6 +867,10 @@ swipe action</note>
|
||||
<target>Consenti downgrade</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Consenti l'eliminazione irreversibile dei messaggi solo se il contatto la consente a te. (24 ore)</target>
|
||||
@@ -952,6 +956,10 @@ swipe action</note>
|
||||
<target>Permetti ai tuoi contatti di inviare messaggi a tempo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Permetti ai tuoi contatti di inviare messaggi vocali.</target>
|
||||
@@ -1312,6 +1320,10 @@ swipe action</note>
|
||||
<target>Sfocatura dei file multimediali</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Sia tu che il tuo contatto potete aggiungere reazioni ai messaggi.</target>
|
||||
@@ -1332,6 +1344,10 @@ swipe action</note>
|
||||
<target>Sia tu che il tuo contatto potete inviare messaggi a tempo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Sia tu che il tuo contatto potete inviare messaggi vocali.</target>
|
||||
@@ -2087,6 +2103,7 @@ Questo è il tuo link una tantum!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Contact requests from groups" xml:space="preserve">
|
||||
<source>Contact requests from groups</source>
|
||||
<target>Richieste di contatto dai gruppi</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Contact will be deleted - this cannot be undone!" xml:space="preserve">
|
||||
@@ -2663,6 +2680,10 @@ swipe action</note>
|
||||
<target>Ricevute di consegna!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Descrizione</target>
|
||||
@@ -3531,6 +3552,7 @@ chat item action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error setting auto-accept" xml:space="preserve">
|
||||
<source>Error setting auto-accept</source>
|
||||
<target>Errore impostando l'accettazione automatica</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
|
||||
@@ -3794,6 +3816,10 @@ snd error text</note>
|
||||
<target>File e multimediali</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>File e contenuti multimediali sono vietati in questo gruppo.</target>
|
||||
@@ -4495,7 +4521,7 @@ Altri miglioramenti sono in arrivo!</target>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Link non valido</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -4872,6 +4898,7 @@ Questo è il tuo link per il gruppo %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Member is deleted - can't accept request" xml:space="preserve">
|
||||
<source>Member is deleted - can't accept request</source>
|
||||
<target>Il membro è eliminato - impossibile accettare la richiesta</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Member reports" xml:space="preserve">
|
||||
@@ -5684,6 +5711,10 @@ Richiede l'attivazione della VPN.</target>
|
||||
<target>Solo tu puoi inviare messaggi a tempo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Solo tu puoi inviare messaggi vocali.</target>
|
||||
@@ -5709,6 +5740,10 @@ Richiede l'attivazione della VPN.</target>
|
||||
<target>Solo il tuo contatto può inviare messaggi a tempo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Solo il tuo contatto può inviare messaggi vocali.</target>
|
||||
@@ -5739,11 +5774,19 @@ Richiede l'attivazione della VPN.</target>
|
||||
<target>Apri la console della chat</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<target>Apri le condizioni</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Apri gruppo</target>
|
||||
@@ -5784,6 +5827,10 @@ Richiede l'attivazione della VPN.</target>
|
||||
<target>Apri per entrare</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>Apertura dell'app…</target>
|
||||
@@ -6529,6 +6576,10 @@ swipe action</note>
|
||||
<target>Rimuovi immagine</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Rimuovi membro</target>
|
||||
@@ -7914,6 +7965,10 @@ report reason</note>
|
||||
<target>Tocca Connetti per inviare la richiesta</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -8238,6 +8293,7 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
|
||||
</trans-unit>
|
||||
<trans-unit id="This setting is for your current profile **%@**." xml:space="preserve">
|
||||
<source>This setting is for your current profile **%@**.</source>
|
||||
<target>Questa impostazione è per il tuo profilo attuale **%@**.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Time to disappear is set only for new contacts." xml:space="preserve">
|
||||
@@ -8327,6 +8383,10 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio
|
||||
<target>Per inviare</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Per supportare le notifiche push istantanee, il database della chat deve essere migrato.</target>
|
||||
@@ -9224,7 +9284,7 @@ Ripetere la richiesta di ingresso?</target>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Non puoi inviare messaggi!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
@@ -10315,10 +10375,12 @@ time to disappear</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested connection" xml:space="preserve">
|
||||
<source>requested connection</source>
|
||||
<target>connessione richiesta</target>
|
||||
<note>rcv group event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested connection from group %@" xml:space="preserve">
|
||||
<source>requested connection from group %@</source>
|
||||
<target>connessione richiesta dal gruppo %@</target>
|
||||
<note>rcv direct event chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="requested to connect" xml:space="preserve">
|
||||
|
||||
@@ -192,6 +192,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="%d seconds(s)" xml:space="preserve">
|
||||
<source>%d seconds(s)</source>
|
||||
<target>%d 秒</target>
|
||||
<note>delete after time</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d skipped message(s)" xml:space="preserve">
|
||||
@@ -206,7 +207,6 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld" xml:space="preserve">
|
||||
<source>%lld</source>
|
||||
<target/>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld %@" xml:space="preserve">
|
||||
@@ -465,6 +465,7 @@ time interval</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="1 year" xml:space="preserve">
|
||||
<source>1 year</source>
|
||||
<target>1年</target>
|
||||
<note>delete after time</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="1-time link" xml:space="preserve">
|
||||
@@ -548,6 +549,7 @@ time interval</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="About operators" xml:space="preserve">
|
||||
<source>About operators</source>
|
||||
<target>オペレーターについて</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accent" xml:space="preserve">
|
||||
@@ -564,14 +566,17 @@ swipe action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accept as member" xml:space="preserve">
|
||||
<source>Accept as member</source>
|
||||
<target>メンバーとして承認する</target>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accept as observer" xml:space="preserve">
|
||||
<source>Accept as observer</source>
|
||||
<target>オブザーバーとして承認する</target>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accept conditions" xml:space="preserve">
|
||||
<source>Accept conditions</source>
|
||||
<target>条件に同意する</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accept connection request?" xml:space="preserve">
|
||||
@@ -581,6 +586,7 @@ swipe action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accept contact request" xml:space="preserve">
|
||||
<source>Accept contact request</source>
|
||||
<target>連絡先リクエストを受け入れる</target>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accept contact request from %@?" xml:space="preserve">
|
||||
@@ -596,10 +602,12 @@ swipe action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accept member" xml:space="preserve">
|
||||
<source>Accept member</source>
|
||||
<target>メンバーを承認する</target>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Accepted conditions" xml:space="preserve">
|
||||
<source>Accepted conditions</source>
|
||||
<target>承諾された条件</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Acknowledged" xml:space="preserve">
|
||||
@@ -831,6 +839,10 @@ swipe action</note>
|
||||
<source>Allow downgrade</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>送信相手も永久メッセージ削除を許可する時のみに許可する。(24時間)</target>
|
||||
@@ -915,6 +927,10 @@ swipe action</note>
|
||||
<target>送信相手が消えるメッセージを送るのを許可する。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>送信相手からの音声メッセージを許可する。</target>
|
||||
@@ -1240,6 +1256,10 @@ swipe action</note>
|
||||
<source>Blur media</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>自分も相手もメッセージへのリアクションを追加できます。</target>
|
||||
@@ -1260,6 +1280,10 @@ swipe action</note>
|
||||
<target>あなたと連絡相手が消えるメッセージを送信できます。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>あなたと連絡相手が音声メッセージを送信できます。</target>
|
||||
@@ -2480,6 +2504,10 @@ swipe action</note>
|
||||
<target>配信通知!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>説明</target>
|
||||
@@ -3510,6 +3538,10 @@ snd error text</note>
|
||||
<target>ファイルとメディア</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>このグループでは、ファイルとメディアは禁止されています。</target>
|
||||
@@ -4149,7 +4181,7 @@ More improvements are coming soon!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5228,6 +5260,10 @@ VPN を有効にする必要があります。</target>
|
||||
<target>消えるメッセージを送れるのはあなただけです。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>音声メッセージを送れるのはあなただけです。</target>
|
||||
@@ -5253,6 +5289,10 @@ VPN を有効にする必要があります。</target>
|
||||
<target>消えるメッセージを送れるのはあなたの連絡相手だけです。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>音声メッセージを送れるのはあなたの連絡相手だけです。</target>
|
||||
@@ -5282,10 +5322,18 @@ VPN を有効にする必要があります。</target>
|
||||
<target>チャットのコンソールを開く</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<note>new chat action</note>
|
||||
@@ -5318,6 +5366,10 @@ VPN を有効にする必要があります。</target>
|
||||
<source>Open to join</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -5987,6 +6039,10 @@ swipe action</note>
|
||||
<source>Remove image</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>メンバーを除名する</target>
|
||||
@@ -7225,6 +7281,10 @@ report reason</note>
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -7598,6 +7658,10 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
<source>To send</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>インスタント プッシュ通知をサポートするには、チャット データベースを移行する必要があります。</target>
|
||||
@@ -8399,7 +8463,7 @@ Repeat join request?</source>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>メッセージを送信できませんでした!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -865,6 +865,10 @@ swipe action</note>
|
||||
<target>Downgraden toestaan</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Sta het definitief verwijderen van berichten alleen toe als uw contact dit toestaat. (24 uur)</target>
|
||||
@@ -950,6 +954,10 @@ swipe action</note>
|
||||
<target>Sta toe dat uw contacten verdwijnende berichten verzenden.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Sta toe dat uw contacten spraak berichten verzenden.</target>
|
||||
@@ -1308,6 +1316,10 @@ swipe action</note>
|
||||
<target>Vervaag media</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Zowel u als uw contact kunnen bericht reacties toevoegen.</target>
|
||||
@@ -1328,6 +1340,10 @@ swipe action</note>
|
||||
<target>Zowel jij als je contact kunnen verdwijnende berichten sturen.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Zowel jij als je contact kunnen spraak berichten verzenden.</target>
|
||||
@@ -2654,6 +2670,10 @@ swipe action</note>
|
||||
<target>Ontvangstbewijzen!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Beschrijving</target>
|
||||
@@ -3778,6 +3798,10 @@ snd error text</note>
|
||||
<target>Bestanden en media</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>Bestanden en media zijn niet toegestaan.</target>
|
||||
@@ -4478,7 +4502,7 @@ Binnenkort meer verbeteringen!</target>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Ongeldige link</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5660,6 +5684,10 @@ Vereist het inschakelen van VPN.</target>
|
||||
<target>Alleen jij kunt verdwijnende berichten verzenden.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Alleen jij kunt spraak berichten verzenden.</target>
|
||||
@@ -5685,6 +5713,10 @@ Vereist het inschakelen van VPN.</target>
|
||||
<target>Alleen uw contact kan verdwijnende berichten verzenden.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Alleen uw contact kan spraak berichten verzenden.</target>
|
||||
@@ -5715,11 +5747,19 @@ Vereist het inschakelen van VPN.</target>
|
||||
<target>Chat console openen</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<target>Open voorwaarden</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Open groep</target>
|
||||
@@ -5755,6 +5795,10 @@ Vereist het inschakelen van VPN.</target>
|
||||
<source>Open to join</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>App openen…</target>
|
||||
@@ -6498,6 +6542,10 @@ swipe action</note>
|
||||
<target>Verwijder afbeelding</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Lid verwijderen</target>
|
||||
@@ -7866,6 +7914,10 @@ report reason</note>
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -8275,6 +8327,10 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
|
||||
<target>Om te verzenden</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Om directe push meldingen te ondersteunen, moet de chat database worden gemigreerd.</target>
|
||||
@@ -9163,7 +9219,7 @@ Deelnameverzoek herhalen?</target>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Je kunt geen berichten versturen!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -861,6 +861,10 @@ swipe action</note>
|
||||
<target>Zezwól na obniżenie wersji</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Zezwalaj na nieodwracalne usuwanie wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli. (24 godziny)</target>
|
||||
@@ -946,6 +950,10 @@ swipe action</note>
|
||||
<target>Zezwól swoim kontaktom na wysyłanie znikających wiadomości.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Zezwól swoim kontaktom na wysyłanie wiadomości głosowych.</target>
|
||||
@@ -1302,6 +1310,10 @@ swipe action</note>
|
||||
<target>Rozmycie mediów</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Zarówno Ty, jak i Twój kontakt możecie dodawać reakcje wiadomości.</target>
|
||||
@@ -1322,6 +1334,10 @@ swipe action</note>
|
||||
<target>Zarówno Ty, jak i Twój kontakt możecie wysyłać znikające wiadomości.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Zarówno Ty, jak i Twój kontakt możecie wysyłać wiadomości głosowe.</target>
|
||||
@@ -2614,6 +2630,10 @@ swipe action</note>
|
||||
<target>Potwierdzenia dostawy!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Opis</target>
|
||||
@@ -3708,6 +3728,10 @@ snd error text</note>
|
||||
<target>Pliki i media</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>Pliki i media są zabronione w tej grupie.</target>
|
||||
@@ -4386,7 +4410,7 @@ More improvements are coming soon!</source>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Nieprawidłowy link</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5525,6 +5549,10 @@ Wymaga włączenia VPN.</target>
|
||||
<target>Tylko Ty możesz wysyłać znikające wiadomości.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Tylko Ty możesz wysyłać wiadomości głosowe.</target>
|
||||
@@ -5550,6 +5578,10 @@ Wymaga włączenia VPN.</target>
|
||||
<target>Tylko Twój kontakt może wysyłać znikające wiadomości.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Tylko Twój kontakt może wysyłać wiadomości głosowe.</target>
|
||||
@@ -5579,10 +5611,18 @@ Wymaga włączenia VPN.</target>
|
||||
<target>Otwórz konsolę czatu</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Grupa otwarta</target>
|
||||
@@ -5617,6 +5657,10 @@ Wymaga włączenia VPN.</target>
|
||||
<source>Open to join</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>Otwieranie aplikacji…</target>
|
||||
@@ -6341,6 +6385,10 @@ swipe action</note>
|
||||
<target>Usuń obraz</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Usuń członka</target>
|
||||
@@ -7669,6 +7717,10 @@ report reason</note>
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -8064,6 +8116,10 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.</ta
|
||||
<source>To send</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Aby obsługiwać natychmiastowe powiadomienia push, należy zmigrować bazę danych czatu.</target>
|
||||
@@ -8933,7 +8989,7 @@ Powtórzyć prośbę dołączenia?</target>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Nie możesz wysyłać wiadomości!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -39,7 +39,7 @@ Available in v5.1</source>
|
||||
</trans-unit>
|
||||
<trans-unit id=" (can be copied)" xml:space="preserve" approved="no">
|
||||
<source> (can be copied)</source>
|
||||
<target state="translated"> .(pode ser copiado)</target>
|
||||
<target state="translated"> (pode ser copiado)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="!1 colored!" xml:space="preserve" approved="no">
|
||||
|
||||
@@ -867,6 +867,10 @@ swipe action</note>
|
||||
<target>Разрешить прямую доставку</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Разрешить необратимое удаление сообщений, только если Ваш контакт разрешает это Вам. (24 часа)</target>
|
||||
@@ -952,6 +956,10 @@ swipe action</note>
|
||||
<target>Разрешить Вашим контактам отправлять исчезающие сообщения.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Разрешить Вашим контактам отправлять голосовые сообщения.</target>
|
||||
@@ -1312,6 +1320,10 @@ swipe action</note>
|
||||
<target>Размытие изображений</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>И Вы, и Ваш контакт можете добавлять реакции на сообщения.</target>
|
||||
@@ -1332,6 +1344,10 @@ swipe action</note>
|
||||
<target>Вы и Ваш контакт можете отправлять исчезающие сообщения.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Вы и Ваш контакт можете отправлять голосовые сообщения.</target>
|
||||
@@ -2664,6 +2680,10 @@ swipe action</note>
|
||||
<target>Отчёты о доставке!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Описание</target>
|
||||
@@ -3796,6 +3816,10 @@ snd error text</note>
|
||||
<target>Файлы и медиа</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>Файлы и медиа запрещены в этой группе.</target>
|
||||
@@ -4496,7 +4520,7 @@ More improvements are coming soon!</source>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Ошибка ссылки</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5686,6 +5710,10 @@ Requires compatible VPN.</source>
|
||||
<target>Только Вы можете отправлять исчезающие сообщения.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Только Вы можете отправлять голосовые сообщения.</target>
|
||||
@@ -5711,6 +5739,10 @@ Requires compatible VPN.</source>
|
||||
<target>Только Ваш контакт может отправлять исчезающие сообщения.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Только Ваш контакт может отправлять голосовые сообщения.</target>
|
||||
@@ -5741,11 +5773,19 @@ Requires compatible VPN.</source>
|
||||
<target>Открыть консоль</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<target>Открыть условия</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Открыть группу</target>
|
||||
@@ -5786,6 +5826,10 @@ Requires compatible VPN.</source>
|
||||
<target>Откройте чтобы вступить</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>Приложение отрывается…</target>
|
||||
@@ -6531,6 +6575,10 @@ swipe action</note>
|
||||
<target>Удалить изображение</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Удалить члена группы</target>
|
||||
@@ -7916,6 +7964,10 @@ report reason</note>
|
||||
<target>Нажмите Соединиться, чтобы отправить запрос</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -8330,6 +8382,10 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
<target>Для оправки</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Для поддержки мгновенный доставки уведомлений данные чата должны быть перемещены.</target>
|
||||
@@ -9227,7 +9283,7 @@ Repeat join request?</source>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Вы не можете отправлять сообщения!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -784,6 +784,10 @@ swipe action</note>
|
||||
<source>Allow downgrade</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>อนุญาตให้ลบข้อความแบบถาวรเฉพาะในกรณีที่ผู้ติดต่อของคุณอนุญาตให้คุณเท่านั้น</target>
|
||||
@@ -866,6 +870,10 @@ swipe action</note>
|
||||
<target>อนุญาตให้ผู้ติดต่อของคุณส่งข้อความที่จะหายไปหลังปิดแชท (disappearing messages)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>อนุญาตให้ผู้ติดต่อของคุณส่งข้อความเสียง</target>
|
||||
@@ -1183,6 +1191,10 @@ swipe action</note>
|
||||
<source>Blur media</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>ทั้งคุณและผู้ติดต่อของคุณสามารถเพิ่มปฏิกิริยาของข้อความได้</target>
|
||||
@@ -1203,6 +1215,10 @@ swipe action</note>
|
||||
<target>ทั้งคุณและผู้ติดต่อของคุณสามารถส่งข้อความที่หายไปได้</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>ทั้งคุณและผู้ติดต่อของคุณสามารถส่งข้อความเสียงได้</target>
|
||||
@@ -2398,6 +2414,10 @@ swipe action</note>
|
||||
<target>ใบตอบรับการจัดส่ง!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>คำอธิบาย</target>
|
||||
@@ -3422,6 +3442,10 @@ snd error text</note>
|
||||
<target>ไฟล์และสื่อ</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>ไฟล์และสื่อเป็นสิ่งต้องห้ามในกลุ่มนี้</target>
|
||||
@@ -4060,7 +4084,7 @@ More improvements are coming soon!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5131,6 +5155,10 @@ Requires compatible VPN.</source>
|
||||
<target>มีเพียงคุณเท่านั้นที่สามารถส่งข้อความที่จะหายไปหลังจากเวลาที่กำหนดหลังการอ่าน (disappearing messages) ได้</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>มีเพียงคุณเท่านั้นที่สามารถส่งข้อความเสียงได้</target>
|
||||
@@ -5156,6 +5184,10 @@ Requires compatible VPN.</source>
|
||||
<target>เฉพาะผู้ติดต่อของคุณเท่านั้นที่สามารถส่งข้อความที่จะหายไปหลังจากเวลาที่กำหนดหลังการอ่าน (disappearing messages) ได้</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>ผู้ติดต่อของคุณเท่านั้นที่สามารถส่งข้อความเสียงได้</target>
|
||||
@@ -5184,10 +5216,18 @@ Requires compatible VPN.</source>
|
||||
<target>เปิดคอนโซลการแชท</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<note>new chat action</note>
|
||||
@@ -5220,6 +5260,10 @@ Requires compatible VPN.</source>
|
||||
<source>Open to join</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
@@ -5887,6 +5931,10 @@ swipe action</note>
|
||||
<source>Remove image</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>ลบสมาชิกออก</target>
|
||||
@@ -7127,6 +7175,10 @@ report reason</note>
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -7500,6 +7552,10 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
<source>To send</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>เพื่อรองรับการแจ้งเตือนแบบทันที ฐานข้อมูลการแชทจะต้องได้รับการโยกย้าย</target>
|
||||
@@ -8298,7 +8354,7 @@ Repeat join request?</source>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>คุณไม่สามารถส่งข้อความได้!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -867,6 +867,10 @@ swipe action</note>
|
||||
<target>Sürüm düşürmeye izin ver</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Konuştuğun kişi, kalıcı olarak silinebilen mesajlara izin veriyorsa sen de ver. (24 saat içinde)</target>
|
||||
@@ -952,6 +956,10 @@ swipe action</note>
|
||||
<target>Kişilerinizin kaybolan mesajlar göndermesine izin verin.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Kişilerinizin sesli mesajlar göndermesine izin verin.</target>
|
||||
@@ -1312,6 +1320,10 @@ swipe action</note>
|
||||
<target>Medyayı bulanıklaştır</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Sen ve konuştuğun kişi mesaj tepkileri ekleyebilir.</target>
|
||||
@@ -1332,6 +1344,10 @@ swipe action</note>
|
||||
<target>Sen ve konuştuğun kişi kaybolan mesajlar gönderebilir.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Sen ve konuştuğun kişi sesli mesaj gönderebilir.</target>
|
||||
@@ -2087,6 +2103,7 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Contact requests from groups" xml:space="preserve">
|
||||
<source>Contact requests from groups</source>
|
||||
<target>Gruplardan gelen iletişim talepleri</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Contact will be deleted - this cannot be undone!" xml:space="preserve">
|
||||
@@ -2206,6 +2223,7 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Create your address" xml:space="preserve">
|
||||
<source>Create your address</source>
|
||||
<target>Adresinizi oluşturun</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Create your profile" xml:space="preserve">
|
||||
@@ -2662,6 +2680,10 @@ swipe action</note>
|
||||
<target>Mesaj gönderildi bilgisi!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Açıklama</target>
|
||||
@@ -3020,6 +3042,7 @@ chat item action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enable disappearing messages by default." xml:space="preserve">
|
||||
<source>Enable disappearing messages by default.</source>
|
||||
<target>Varsayılan olarak kaybolan mesajları etkinleştirin.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enable for all" xml:space="preserve">
|
||||
@@ -3792,6 +3815,10 @@ snd error text</note>
|
||||
<target>Dosyalar ve medya</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>Dosyalar ve medya bu grupta yasaklandı.</target>
|
||||
@@ -4493,7 +4520,7 @@ Daha fazla iyileştirme yakında geliyor!</target>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Geçersiz bağlantı</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5681,6 +5708,10 @@ VPN'nin etkinleştirilmesi gerekir.</target>
|
||||
<target>Sadece sen kaybolan mesajlar gönderebilirsin.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Sadece sen sesli mesajlar gönderebilirsin.</target>
|
||||
@@ -5706,6 +5737,10 @@ VPN'nin etkinleştirilmesi gerekir.</target>
|
||||
<target>Sadece karşıdaki kişi kaybolan mesajlar gönderebilir.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Sadece karşıdaki kişi sesli mesajlar gönderebilir.</target>
|
||||
@@ -5736,11 +5771,19 @@ VPN'nin etkinleştirilmesi gerekir.</target>
|
||||
<target>Sohbet konsolunu aç</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<target>Açık koşullar</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Grubu aç</target>
|
||||
@@ -5781,6 +5824,10 @@ VPN'nin etkinleştirilmesi gerekir.</target>
|
||||
<target>Katılmak için aç</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>Uygulama açılıyor…</target>
|
||||
@@ -6526,6 +6573,10 @@ swipe action</note>
|
||||
<target>Resmi kaldır</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Kişiyi sil</target>
|
||||
@@ -7906,6 +7957,10 @@ report reason</note>
|
||||
<target>Bağlan'a dokunarak isteği gönderin</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -8316,6 +8371,10 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec
|
||||
<target>Göndermek için</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Anlık anlık bildirimleri desteklemek için sohbet veritabanının taşınması gerekir.</target>
|
||||
@@ -9205,7 +9264,7 @@ Katılma isteği tekrarlansın mı?</target>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Mesajlar gönderemezsiniz!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -867,6 +867,10 @@ swipe action</note>
|
||||
<target>Дозволити пониження версії</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>Дозволяйте безповоротне видалення повідомлень, тільки якщо контакт дозволяє вам це зробити. (24 години)</target>
|
||||
@@ -952,6 +956,10 @@ swipe action</note>
|
||||
<target>Дозвольте своїм контактам надсилати зникаючі повідомлення.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>Дозвольте своїм контактам надсилати голосові повідомлення.</target>
|
||||
@@ -1312,6 +1320,10 @@ swipe action</note>
|
||||
<target>Розмиття медіа</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>Реакції на повідомлення можете додавати як ви, так і ваш контакт.</target>
|
||||
@@ -1332,6 +1344,10 @@ swipe action</note>
|
||||
<target>Ви і ваш контакт можете надсилати зникаючі повідомлення.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>Надсилати голосові повідомлення можете як ви, так і ваш контакт.</target>
|
||||
@@ -2663,6 +2679,10 @@ swipe action</note>
|
||||
<target>Квитанції про доставку!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>Опис</target>
|
||||
@@ -3794,6 +3814,10 @@ snd error text</note>
|
||||
<target>Файли і медіа</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>Файли та медіа в цій групі заборонені.</target>
|
||||
@@ -4495,7 +4519,7 @@ More improvements are coming soon!</source>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>Невірне посилання</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5684,6 +5708,10 @@ Requires compatible VPN.</source>
|
||||
<target>Тільки ви можете надсилати зникаючі повідомлення.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>Тільки ви можете надсилати голосові повідомлення.</target>
|
||||
@@ -5709,6 +5737,10 @@ Requires compatible VPN.</source>
|
||||
<target>Тільки ваш контакт може надсилати зникаючі повідомлення.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>Тільки ваш контакт може надсилати голосові повідомлення.</target>
|
||||
@@ -5739,11 +5771,19 @@ Requires compatible VPN.</source>
|
||||
<target>Відкрийте консоль чату</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<target>Відкриті умови</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>Відкрита група</target>
|
||||
@@ -5784,6 +5824,10 @@ Requires compatible VPN.</source>
|
||||
<target>Відкрито для приєднання</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>Відкриваємо програму…</target>
|
||||
@@ -6529,6 +6573,10 @@ swipe action</note>
|
||||
<target>Видалити зображення</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>Видалити учасника</target>
|
||||
@@ -7914,6 +7962,10 @@ report reason</note>
|
||||
<target>Натисніть Підключитися, щоб відправити запит</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -8327,6 +8379,10 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
<target>Щоб відправити</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>Для підтримки миттєвих push-повідомлень необхідно перенести базу даних чату.</target>
|
||||
@@ -9224,7 +9280,7 @@ Repeat join request?</source>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>Ви не можете надсилати повідомлення!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -862,6 +862,10 @@ swipe action</note>
|
||||
<target>允许降级</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow files and media only if your contact allows them." xml:space="preserve">
|
||||
<source>Allow files and media only if your contact allows them.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target>仅有您的联系人许可后才允许不可撤回消息移除</target>
|
||||
@@ -947,6 +951,10 @@ swipe action</note>
|
||||
<target>允许您的联系人发送限时消息。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send files and media." xml:space="preserve">
|
||||
<source>Allow your contacts to send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target>允许您的联系人发送语音消息。</target>
|
||||
@@ -1305,6 +1313,10 @@ swipe action</note>
|
||||
<target>模糊媒体</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bot" xml:space="preserve">
|
||||
<source>Bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||
<source>Both you and your contact can add message reactions.</source>
|
||||
<target>您和您的联系人都可以添加消息回应。</target>
|
||||
@@ -1325,6 +1337,10 @@ swipe action</note>
|
||||
<target>您和您的联系人都可以发送限时消息。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send files and media." xml:space="preserve">
|
||||
<source>Both you and your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Both you and your contact can send voice messages." xml:space="preserve">
|
||||
<source>Both you and your contact can send voice messages.</source>
|
||||
<target>您和您的联系人都可以发送语音消息。</target>
|
||||
@@ -2646,6 +2662,10 @@ swipe action</note>
|
||||
<target>送达回执!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Deprecated options" xml:space="preserve">
|
||||
<source>Deprecated options</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Description" xml:space="preserve">
|
||||
<source>Description</source>
|
||||
<target>描述</target>
|
||||
@@ -3767,6 +3787,10 @@ snd error text</note>
|
||||
<target>文件和媒体</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited in this chat." xml:space="preserve">
|
||||
<source>Files and media are prohibited in this chat.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Files and media are prohibited." xml:space="preserve">
|
||||
<source>Files and media are prohibited.</source>
|
||||
<target>此群组中禁止文件和媒体。</target>
|
||||
@@ -4467,7 +4491,7 @@ More improvements are coming soon!</source>
|
||||
<trans-unit id="Invalid link" xml:space="preserve">
|
||||
<source>Invalid link</source>
|
||||
<target>无效链接</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
@@ -5645,6 +5669,10 @@ Requires compatible VPN.</source>
|
||||
<target>只有您可以发送限时消息。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send files and media." xml:space="preserve">
|
||||
<source>Only you can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only you can send voice messages." xml:space="preserve">
|
||||
<source>Only you can send voice messages.</source>
|
||||
<target>只有您可以发送语音消息。</target>
|
||||
@@ -5670,6 +5698,10 @@ Requires compatible VPN.</source>
|
||||
<target>只有您的联系人才可以发送限时消息。</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send files and media." xml:space="preserve">
|
||||
<source>Only your contact can send files and media.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
|
||||
<source>Only your contact can send voice messages.</source>
|
||||
<target>只有您的联系人可以发送语音消息。</target>
|
||||
@@ -5700,11 +5732,19 @@ Requires compatible VPN.</source>
|
||||
<target>打开聊天控制台</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open clean link" xml:space="preserve">
|
||||
<source>Open clean link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open conditions" xml:space="preserve">
|
||||
<source>Open conditions</source>
|
||||
<target>打开条款</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open full link" xml:space="preserve">
|
||||
<source>Open full link</source>
|
||||
<note>alert action</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open group" xml:space="preserve">
|
||||
<source>Open group</source>
|
||||
<target>打开群</target>
|
||||
@@ -5739,6 +5779,10 @@ Requires compatible VPN.</source>
|
||||
<source>Open to join</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open to use bot" xml:space="preserve">
|
||||
<source>Open to use bot</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Opening app…" xml:space="preserve">
|
||||
<source>Opening app…</source>
|
||||
<target>正在打开应用程序…</target>
|
||||
@@ -6465,6 +6509,10 @@ swipe action</note>
|
||||
<target>移除图片</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove link tracking" xml:space="preserve">
|
||||
<source>Remove link tracking</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Remove member" xml:space="preserve">
|
||||
<source>Remove member</source>
|
||||
<target>删除成员</target>
|
||||
@@ -7794,6 +7842,10 @@ report reason</note>
|
||||
<source>Tap Connect to send request</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Tap Connect to use bot" xml:space="preserve">
|
||||
<source>Tap Connect to use bot</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>
|
||||
@@ -8186,6 +8238,10 @@ You will be prompted to complete authentication before this feature is enabled.<
|
||||
<source>To send</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To send commands you must be connected." xml:space="preserve">
|
||||
<source>To send commands you must be connected.</source>
|
||||
<note>alert message</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||
<source>To support instant push notifications the chat database has to be migrated.</source>
|
||||
<target>为了支持即时推送通知,聊天数据库必须被迁移。</target>
|
||||
@@ -9053,7 +9109,7 @@ Repeat join request?</source>
|
||||
<trans-unit id="You can't send messages!" xml:space="preserve">
|
||||
<source>You can't send messages!</source>
|
||||
<target>您无法发送消息!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
<note>alert title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
|
||||
<source>You could not be verified; please try again.</source>
|
||||
|
||||
@@ -390,7 +390,7 @@ enum SharedContent {
|
||||
switch self {
|
||||
case let .image(preview, _): .image(text: comment, image: preview)
|
||||
case let .movie(preview, duration, _): .video(text: comment, image: preview, duration: duration)
|
||||
case let .url(preview): .link(text: preview.uri.absoluteString + (comment == "" ? "" : "\n" + comment), preview: preview)
|
||||
case let .url(preview): .link(text: preview.uri + (comment == "" ? "" : "\n" + comment), preview: preview)
|
||||
case .text: .text(comment)
|
||||
case .data: .file(comment)
|
||||
}
|
||||
@@ -464,12 +464,13 @@ fileprivate func getSharedContent(_ ip: NSItemProvider) async -> Result<SharedCo
|
||||
// Prepare Link message
|
||||
case .url:
|
||||
if let url = try? await ip.loadItem(forTypeIdentifier: type.identifier) as? URL {
|
||||
let content: SharedContent =
|
||||
if privacyLinkPreviewsGroupDefault.get(), let linkPreview = await getLinkPreview(for: url) {
|
||||
.url(preview: linkPreview)
|
||||
} else {
|
||||
.text(string: url.absoluteString)
|
||||
}
|
||||
let content: SharedContent
|
||||
if privacyLinkPreviewsGroupDefault.get(), let linkPreview = await getLinkPreview(for: url) {
|
||||
privacyLinkPreviewsShowAlertGroupDefault.set(false) // to avoid showing alert to current users, show alert in v6.5
|
||||
content = .url(preview: linkPreview)
|
||||
} else {
|
||||
content = .text(string: url.absoluteString)
|
||||
}
|
||||
return .success(content)
|
||||
} else { return .failure(ErrorAlert("Error preparing message")) }
|
||||
|
||||
|
||||
@@ -172,7 +172,7 @@ struct ShareView: View {
|
||||
VStack(alignment: .center, spacing: 4) {
|
||||
Text(linkPreview.title)
|
||||
.lineLimit(1)
|
||||
Text(linkPreview.uri.absoluteString)
|
||||
Text(linkPreview.uri)
|
||||
.font(.caption)
|
||||
.lineLimit(1)
|
||||
.foregroundColor(.secondary)
|
||||
|
||||
@@ -183,8 +183,8 @@
|
||||
64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */; };
|
||||
64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829982D54AEED006B9E89 /* libgmp.a */; };
|
||||
64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829992D54AEEE006B9E89 /* libffi.a */; };
|
||||
64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE-ghc9.6.3.a */; };
|
||||
64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE.a */; };
|
||||
64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC-ghc9.6.3.a */; };
|
||||
64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC.a */; };
|
||||
64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */; };
|
||||
64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */; };
|
||||
64D0C2C229FA57AB00B38D5F /* UserAddressLearnMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */; };
|
||||
@@ -250,6 +250,7 @@
|
||||
D77B92DC2952372200A5A1CC /* SwiftyGif in Frameworks */ = {isa = PBXBuildFile; productRef = D77B92DB2952372200A5A1CC /* SwiftyGif */; };
|
||||
D7F0E33929964E7E0068AF69 /* LZString in Frameworks */ = {isa = PBXBuildFile; productRef = D7F0E33829964E7E0068AF69 /* LZString */; };
|
||||
E51CC1E62C62085600DB91FE /* OneHandUICard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E51CC1E52C62085600DB91FE /* OneHandUICard.swift */; };
|
||||
E559A0A12E3F77EE00B26F74 /* CommandsMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E559A0A02E3F77EE00B26F74 /* CommandsMenuView.swift */; };
|
||||
E5DCF8DB2C56FAC1007928CC /* SimpleXChat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE2BA682845308900EC33A6 /* SimpleXChat.framework */; };
|
||||
E5DCF9712C590272007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF96F2C590272007928CC /* Localizable.strings */; };
|
||||
E5DCF9842C5902CE007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF9822C5902CE007928CC /* Localizable.strings */; };
|
||||
@@ -554,8 +555,8 @@
|
||||
64C3B0202A0D359700E19930 /* CustomTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTimePicker.swift; sourceTree = "<group>"; };
|
||||
64C829982D54AEED006B9E89 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
|
||||
64C829992D54AEEE006B9E89 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
|
||||
64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE-ghc9.6.3.a"; sourceTree = "<group>"; };
|
||||
64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE.a"; sourceTree = "<group>"; };
|
||||
64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC-ghc9.6.3.a"; sourceTree = "<group>"; };
|
||||
64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC.a"; sourceTree = "<group>"; };
|
||||
64C8299C2D54AEEE006B9E89 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
|
||||
64D0C2BF29F9688300B38D5F /* UserAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressView.swift; sourceTree = "<group>"; };
|
||||
64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressLearnMore.swift; sourceTree = "<group>"; };
|
||||
@@ -617,6 +618,7 @@
|
||||
D741547929AF90B00022400A /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/System/Library/Frameworks/PushKit.framework; sourceTree = DEVELOPER_DIR; };
|
||||
D7AA2C3429A936B400737B40 /* MediaEncryption.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; name = MediaEncryption.playground; path = Shared/MediaEncryption.playground; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
|
||||
E51CC1E52C62085600DB91FE /* OneHandUICard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OneHandUICard.swift; sourceTree = "<group>"; };
|
||||
E559A0A02E3F77EE00B26F74 /* CommandsMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandsMenuView.swift; sourceTree = "<group>"; };
|
||||
E5DCF9702C590272007928CC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
E5DCF9722C590274007928CC /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
E5DCF9732C590275007928CC /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
@@ -716,8 +718,8 @@
|
||||
64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */,
|
||||
64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */,
|
||||
64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */,
|
||||
64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE-ghc9.6.3.a in Frameworks */,
|
||||
64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE.a in Frameworks */,
|
||||
64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC-ghc9.6.3.a in Frameworks */,
|
||||
64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC.a in Frameworks */,
|
||||
CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -781,6 +783,7 @@
|
||||
5C2E260E27A30FDC00F70299 /* ChatView.swift */,
|
||||
5C7505A727B6D34800BE3227 /* ChatInfoToolbar.swift */,
|
||||
5C971E1C27AEBEF600C8A3CE /* ChatInfoView.swift */,
|
||||
E559A0A02E3F77EE00B26F74 /* CommandsMenuView.swift */,
|
||||
5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */,
|
||||
5CE4407127ADB1D0007B033A /* Emoji.swift */,
|
||||
5CADE79B292131E900072E13 /* ContactPreferencesView.swift */,
|
||||
@@ -802,8 +805,8 @@
|
||||
64C829992D54AEEE006B9E89 /* libffi.a */,
|
||||
64C829982D54AEED006B9E89 /* libgmp.a */,
|
||||
64C8299C2D54AEEE006B9E89 /* libgmpxx.a */,
|
||||
64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE-ghc9.6.3.a */,
|
||||
64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-B5zq2t60gbA45EwEeb0rfE.a */,
|
||||
64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC-ghc9.6.3.a */,
|
||||
64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.2.1-K3DJnRKS60C6Ik3NluxepC.a */,
|
||||
);
|
||||
path = Libraries;
|
||||
sourceTree = "<group>";
|
||||
@@ -1522,6 +1525,7 @@
|
||||
8CBC14862D357CDB00BBD901 /* StorageView.swift in Sources */,
|
||||
5C9A5BDB2871E05400A5B906 /* SetNotificationsMode.swift in Sources */,
|
||||
5CB0BA8E2827126500B3292C /* OnboardingView.swift in Sources */,
|
||||
E559A0A12E3F77EE00B26F74 /* CommandsMenuView.swift in Sources */,
|
||||
6442E0BE2880182D00CEC0F9 /* GroupChatInfoView.swift in Sources */,
|
||||
8CC956EE2BC0041000412A11 /* NetworkObserver.swift in Sources */,
|
||||
5C2E261227A30FEA00F70299 /* TerminalView.swift in Sources */,
|
||||
|
||||
@@ -186,6 +186,30 @@ struct ParsedServerAddress: Decodable {
|
||||
var parseError: String
|
||||
}
|
||||
|
||||
public func parseSanitizeUri(_ s: String) -> ParsedUri? {
|
||||
var c = s.cString(using: .utf8)!
|
||||
if let cjson = chat_parse_uri(&c) {
|
||||
if let d = dataFromCString(cjson) {
|
||||
do {
|
||||
return try jsonDecoder.decode(ParsedUri.self, from: d)
|
||||
} catch {
|
||||
logger.error("parseSanitizeUri jsonDecoder.decode error: \(error.localizedDescription)")
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
public struct ParsedUri: Decodable {
|
||||
public var uriInfo: UriInfo?
|
||||
public var parseError: String
|
||||
}
|
||||
|
||||
public struct UriInfo: Decodable {
|
||||
public var scheme: String
|
||||
public var sanitized: String?
|
||||
}
|
||||
|
||||
@inline(__always)
|
||||
public func fromCString(_ c: UnsafeMutablePointer<CChar>) -> String {
|
||||
let s = String.init(cString: c)
|
||||
|
||||
@@ -27,6 +27,8 @@ let GROUP_DEFAULT_APP_LOCAL_AUTH_ENABLED = "appLocalAuthEnabled"
|
||||
public let GROUP_DEFAULT_ALLOW_SHARE_EXTENSION = "allowShareExtension"
|
||||
// replaces DEFAULT_PRIVACY_LINK_PREVIEWS
|
||||
let GROUP_DEFAULT_PRIVACY_LINK_PREVIEWS = "privacyLinkPreviews"
|
||||
public let GROUP_DEFAULT_PRIVACY_LINK_PREVIEWS_SHOW_ALERT = "privacyLinkPreviewsShowAlert"
|
||||
public let GROUP_DEFAULT_PRIVACY_SANITIZE_LINKS = "privacySanitizeLinks"
|
||||
// This setting is a main one, while having an unused duplicate from the past: DEFAULT_PRIVACY_ACCEPT_IMAGES
|
||||
let GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES = "privacyAcceptImages"
|
||||
public let GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE = "privacyTransferImagesInline" // no longer used
|
||||
@@ -95,6 +97,8 @@ public func registerGroupDefaults() {
|
||||
GROUP_DEFAULT_APP_LOCAL_AUTH_ENABLED: true,
|
||||
GROUP_DEFAULT_ALLOW_SHARE_EXTENSION: false,
|
||||
GROUP_DEFAULT_PRIVACY_LINK_PREVIEWS: true,
|
||||
GROUP_DEFAULT_PRIVACY_LINK_PREVIEWS_SHOW_ALERT: true,
|
||||
GROUP_DEFAULT_PRIVACY_SANITIZE_LINKS: true,
|
||||
GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES: true,
|
||||
GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE: false,
|
||||
GROUP_DEFAULT_PRIVACY_ENCRYPT_LOCAL_FILES: true,
|
||||
@@ -222,6 +226,8 @@ public let allowShareExtensionGroupDefault = BoolDefault(defaults: groupDefaults
|
||||
|
||||
public let privacyLinkPreviewsGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_LINK_PREVIEWS)
|
||||
|
||||
public let privacyLinkPreviewsShowAlertGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_LINK_PREVIEWS_SHOW_ALERT)
|
||||
|
||||
// This setting is a main one, while having an unused duplicate from the past: DEFAULT_PRIVACY_ACCEPT_IMAGES
|
||||
public let privacyAcceptImagesGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES)
|
||||
|
||||
|
||||
@@ -115,7 +115,8 @@ public struct Profile: Codable, NamedChat, Hashable {
|
||||
shortDescr: String? = nil,
|
||||
image: String? = nil,
|
||||
contactLink: String? = nil,
|
||||
preferences: Preferences? = nil
|
||||
preferences: Preferences? = nil,
|
||||
peerType: ChatPeerType? = nil
|
||||
) {
|
||||
self.displayName = displayName
|
||||
self.fullName = fullName
|
||||
@@ -131,6 +132,7 @@ public struct Profile: Codable, NamedChat, Hashable {
|
||||
public var image: String?
|
||||
public var contactLink: String?
|
||||
public var preferences: Preferences?
|
||||
public var peerType: ChatPeerType?
|
||||
public var localAlias: String { get { "" } }
|
||||
|
||||
var profileViewName: String {
|
||||
@@ -152,6 +154,7 @@ public struct LocalProfile: Codable, NamedChat, Hashable {
|
||||
image: String? = nil,
|
||||
contactLink: String? = nil,
|
||||
preferences: Preferences? = nil,
|
||||
peerType: ChatPeerType? = nil,
|
||||
localAlias: String
|
||||
) {
|
||||
self.profileId = profileId
|
||||
@@ -161,6 +164,7 @@ public struct LocalProfile: Codable, NamedChat, Hashable {
|
||||
self.image = image
|
||||
self.contactLink = contactLink
|
||||
self.preferences = preferences
|
||||
self.peerType = peerType
|
||||
self.localAlias = localAlias
|
||||
}
|
||||
|
||||
@@ -171,6 +175,7 @@ public struct LocalProfile: Codable, NamedChat, Hashable {
|
||||
public var image: String?
|
||||
public var contactLink: String?
|
||||
public var preferences: Preferences?
|
||||
public var peerType: ChatPeerType?
|
||||
public var localAlias: String
|
||||
|
||||
var profileViewName: String {
|
||||
@@ -188,6 +193,11 @@ public struct LocalProfile: Codable, NamedChat, Hashable {
|
||||
)
|
||||
}
|
||||
|
||||
public enum ChatPeerType: String, Codable {
|
||||
case human
|
||||
case bot
|
||||
}
|
||||
|
||||
public func toLocalProfile (_ profileId: Int64, _ profile: Profile, _ localAlias: String) -> LocalProfile {
|
||||
LocalProfile(
|
||||
profileId: profileId,
|
||||
@@ -197,6 +207,7 @@ public func toLocalProfile (_ profileId: Int64, _ profile: Profile, _ localAlias
|
||||
image: profile.image,
|
||||
contactLink: profile.contactLink,
|
||||
preferences: profile.preferences,
|
||||
peerType: profile.peerType,
|
||||
localAlias: localAlias
|
||||
)
|
||||
}
|
||||
@@ -208,7 +219,8 @@ public func fromLocalProfile (_ profile: LocalProfile) -> Profile {
|
||||
shortDescr: profile.shortDescr,
|
||||
image: profile.image,
|
||||
contactLink: profile.contactLink,
|
||||
preferences: profile.preferences
|
||||
preferences: profile.preferences,
|
||||
peerType: profile.peerType
|
||||
)
|
||||
}
|
||||
|
||||
@@ -249,20 +261,26 @@ public struct FullPreferences: Decodable, Equatable, Hashable {
|
||||
public var fullDelete: SimplePreference
|
||||
public var reactions: SimplePreference
|
||||
public var voice: SimplePreference
|
||||
public var files: SimplePreference
|
||||
public var calls: SimplePreference
|
||||
public var commands: [ChatBotCommand]
|
||||
|
||||
public init(
|
||||
timedMessages: TimedMessagesPreference,
|
||||
fullDelete: SimplePreference,
|
||||
reactions: SimplePreference,
|
||||
voice: SimplePreference,
|
||||
calls: SimplePreference
|
||||
files: SimplePreference,
|
||||
calls: SimplePreference,
|
||||
commands: [ChatBotCommand]
|
||||
) {
|
||||
self.timedMessages = timedMessages
|
||||
self.fullDelete = fullDelete
|
||||
self.reactions = reactions
|
||||
self.voice = voice
|
||||
self.files = files
|
||||
self.calls = calls
|
||||
self.commands = commands
|
||||
}
|
||||
|
||||
public static let sampleData = FullPreferences(
|
||||
@@ -270,7 +288,9 @@ public struct FullPreferences: Decodable, Equatable, Hashable {
|
||||
fullDelete: SimplePreference(allow: .no),
|
||||
reactions: SimplePreference(allow: .yes),
|
||||
voice: SimplePreference(allow: .yes),
|
||||
calls: SimplePreference(allow: .yes)
|
||||
files: SimplePreference(allow: .always),
|
||||
calls: SimplePreference(allow: .yes),
|
||||
commands: []
|
||||
)
|
||||
}
|
||||
|
||||
@@ -279,20 +299,26 @@ public struct Preferences: Codable, Hashable {
|
||||
public var fullDelete: SimplePreference?
|
||||
public var reactions: SimplePreference?
|
||||
public var voice: SimplePreference?
|
||||
public var files: SimplePreference?
|
||||
public var calls: SimplePreference?
|
||||
public var commands: [ChatBotCommand]?
|
||||
|
||||
public init(
|
||||
timedMessages: TimedMessagesPreference?,
|
||||
fullDelete: SimplePreference?,
|
||||
reactions: SimplePreference?,
|
||||
voice: SimplePreference?,
|
||||
calls: SimplePreference?
|
||||
files: SimplePreference?,
|
||||
calls: SimplePreference?,
|
||||
commands: [ChatBotCommand]?
|
||||
) {
|
||||
self.timedMessages = timedMessages
|
||||
self.fullDelete = fullDelete
|
||||
self.reactions = reactions
|
||||
self.voice = voice
|
||||
self.files = files
|
||||
self.calls = calls
|
||||
self.commands = commands
|
||||
}
|
||||
|
||||
func copy(
|
||||
@@ -300,14 +326,18 @@ public struct Preferences: Codable, Hashable {
|
||||
fullDelete: SimplePreference? = nil,
|
||||
reactions: SimplePreference? = nil,
|
||||
voice: SimplePreference? = nil,
|
||||
calls: SimplePreference? = nil
|
||||
files: SimplePreference? = nil,
|
||||
calls: SimplePreference? = nil,
|
||||
commands: [ChatBotCommand]? = nil
|
||||
) -> Preferences {
|
||||
Preferences(
|
||||
timedMessages: timedMessages ?? self.timedMessages,
|
||||
fullDelete: fullDelete ?? self.fullDelete,
|
||||
reactions: reactions ?? self.reactions,
|
||||
voice: voice ?? self.voice,
|
||||
calls: calls ?? self.calls
|
||||
files: files ?? self.files,
|
||||
calls: calls ?? self.calls,
|
||||
commands: commands ?? self.commands
|
||||
)
|
||||
}
|
||||
|
||||
@@ -317,6 +347,7 @@ public struct Preferences: Codable, Hashable {
|
||||
case .fullDelete: return copy(fullDelete: SimplePreference(allow: allowed))
|
||||
case .reactions: return copy(reactions: SimplePreference(allow: allowed))
|
||||
case .voice: return copy(voice: SimplePreference(allow: allowed))
|
||||
case .files: return copy(voice: SimplePreference(allow: allowed))
|
||||
case .calls: return copy(calls: SimplePreference(allow: allowed))
|
||||
}
|
||||
}
|
||||
@@ -326,17 +357,72 @@ public struct Preferences: Codable, Hashable {
|
||||
fullDelete: SimplePreference(allow: .no),
|
||||
reactions: SimplePreference(allow: .yes),
|
||||
voice: SimplePreference(allow: .yes),
|
||||
calls: SimplePreference(allow: .yes)
|
||||
files: SimplePreference(allow: .always),
|
||||
calls: SimplePreference(allow: .yes),
|
||||
commands: nil
|
||||
)
|
||||
}
|
||||
|
||||
public indirect enum ChatBotCommand: Hashable {
|
||||
case command(keyword: String, label: String, params: String?)
|
||||
case menu(label: String, commands: [ChatBotCommand])
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case type
|
||||
case keyword
|
||||
case label
|
||||
case params
|
||||
case hidden
|
||||
case commands
|
||||
}
|
||||
}
|
||||
|
||||
extension ChatBotCommand: Decodable {
|
||||
public init(from decoder: Decoder) throws {
|
||||
let c = try decoder.container(keyedBy: CodingKeys.self)
|
||||
let type = try c.decode(String.self, forKey: CodingKeys.type)
|
||||
switch type {
|
||||
case "command":
|
||||
let keyword = try c.decode(String.self, forKey: CodingKeys.keyword)
|
||||
let label = try c.decode(String.self, forKey: CodingKeys.label)
|
||||
let params = c.contains(CodingKeys.params) ? try c.decode((String?).self, forKey: CodingKeys.params) : nil
|
||||
self = .command(keyword: keyword, label: label, params: params)
|
||||
case "menu":
|
||||
let label = try c.decode(String.self, forKey: CodingKeys.label)
|
||||
let commands = try c.decode(([ChatBotCommand]).self, forKey: CodingKeys.commands)
|
||||
self = .menu(label: label, commands: commands)
|
||||
default:
|
||||
throw DecodingError.dataCorruptedError(forKey: CodingKeys.type, in: c, debugDescription: "Unsupported command type: \(type)")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension ChatBotCommand: Encodable {
|
||||
public func encode(to encoder: Encoder) throws {
|
||||
var c = encoder.container(keyedBy: CodingKeys.self)
|
||||
switch self {
|
||||
case let .command(keyword, label, params):
|
||||
try c.encode("command", forKey: .type)
|
||||
try c.encode(keyword, forKey: .keyword)
|
||||
try c.encode(label, forKey: .label)
|
||||
if let params { try c.encode(params, forKey: .params) }
|
||||
case let .menu(label, commands):
|
||||
try c.encode("menu", forKey: .type)
|
||||
try c.encode(label, forKey: .label)
|
||||
try c.encode(commands, forKey: .commands)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public func fullPreferencesToPreferences(_ fullPreferences: FullPreferences) -> Preferences {
|
||||
Preferences(
|
||||
timedMessages: fullPreferences.timedMessages,
|
||||
fullDelete: fullPreferences.fullDelete,
|
||||
reactions: fullPreferences.reactions,
|
||||
voice: fullPreferences.voice,
|
||||
calls: fullPreferences.calls
|
||||
files: fullPreferences.files,
|
||||
calls: fullPreferences.calls,
|
||||
commands: fullPreferences.commands
|
||||
)
|
||||
}
|
||||
|
||||
@@ -346,7 +432,9 @@ public func contactUserPreferencesToPreferences(_ contactUserPreferences: Contac
|
||||
fullDelete: contactUserPreferences.fullDelete.userPreference.preference,
|
||||
reactions: contactUserPreferences.reactions.userPreference.preference,
|
||||
voice: contactUserPreferences.voice.userPreference.preference,
|
||||
calls: contactUserPreferences.calls.userPreference.preference
|
||||
files: contactUserPreferences.files.userPreference.preference,
|
||||
calls: contactUserPreferences.calls.userPreference.preference,
|
||||
commands: contactUserPreferences.commands
|
||||
)
|
||||
}
|
||||
|
||||
@@ -484,20 +572,26 @@ public struct ContactUserPreferences: Decodable, Hashable {
|
||||
public var fullDelete: ContactUserPreference<SimplePreference>
|
||||
public var reactions: ContactUserPreference<SimplePreference>
|
||||
public var voice: ContactUserPreference<SimplePreference>
|
||||
public var files: ContactUserPreference<SimplePreference>
|
||||
public var calls: ContactUserPreference<SimplePreference>
|
||||
public var commands: [ChatBotCommand]?
|
||||
|
||||
public init(
|
||||
timedMessages: ContactUserPreference<TimedMessagesPreference>,
|
||||
fullDelete: ContactUserPreference<SimplePreference>,
|
||||
reactions: ContactUserPreference<SimplePreference>,
|
||||
voice: ContactUserPreference<SimplePreference>,
|
||||
calls: ContactUserPreference<SimplePreference>
|
||||
files: ContactUserPreference<SimplePreference>,
|
||||
calls: ContactUserPreference<SimplePreference>,
|
||||
commands: [ChatBotCommand]?
|
||||
) {
|
||||
self.timedMessages = timedMessages
|
||||
self.fullDelete = fullDelete
|
||||
self.reactions = reactions
|
||||
self.voice = voice
|
||||
self.files = files
|
||||
self.calls = calls
|
||||
self.commands = commands
|
||||
}
|
||||
|
||||
public static let sampleData = ContactUserPreferences(
|
||||
@@ -521,11 +615,17 @@ public struct ContactUserPreferences: Decodable, Hashable {
|
||||
userPreference: ContactUserPref<SimplePreference>.user(preference: SimplePreference(allow: .yes)),
|
||||
contactPreference: SimplePreference(allow: .yes)
|
||||
),
|
||||
files: ContactUserPreference<SimplePreference>(
|
||||
enabled: FeatureEnabled(forUser: true, forContact: true),
|
||||
userPreference: ContactUserPref<SimplePreference>.user(preference: SimplePreference(allow: .yes)),
|
||||
contactPreference: SimplePreference(allow: .yes)
|
||||
),
|
||||
calls: ContactUserPreference<SimplePreference>(
|
||||
enabled: FeatureEnabled(forUser: true, forContact: true),
|
||||
userPreference: ContactUserPref<SimplePreference>.user(preference: SimplePreference(allow: .yes)),
|
||||
contactPreference: SimplePreference(allow: .yes)
|
||||
)
|
||||
),
|
||||
commands: nil
|
||||
)
|
||||
}
|
||||
|
||||
@@ -598,6 +698,7 @@ public enum ChatFeature: String, Decodable, Feature, Hashable {
|
||||
case fullDelete
|
||||
case reactions
|
||||
case voice
|
||||
case files
|
||||
case calls
|
||||
|
||||
public var id: Self { self }
|
||||
@@ -624,6 +725,7 @@ public enum ChatFeature: String, Decodable, Feature, Hashable {
|
||||
case .fullDelete: return NSLocalizedString("Delete for everyone", comment: "chat feature")
|
||||
case .reactions: return NSLocalizedString("Message reactions", comment: "chat feature")
|
||||
case .voice: return NSLocalizedString("Voice messages", comment: "chat feature")
|
||||
case .files: return NSLocalizedString("Files and media", comment: "chat feature")
|
||||
case .calls: return NSLocalizedString("Audio/video calls", comment: "chat feature")
|
||||
}
|
||||
}
|
||||
@@ -634,6 +736,7 @@ public enum ChatFeature: String, Decodable, Feature, Hashable {
|
||||
case .fullDelete: return "trash.slash"
|
||||
case .reactions: return "face.smiling"
|
||||
case .voice: return "mic"
|
||||
case .files: return "doc"
|
||||
case .calls: return "phone"
|
||||
}
|
||||
}
|
||||
@@ -644,6 +747,7 @@ public enum ChatFeature: String, Decodable, Feature, Hashable {
|
||||
case .fullDelete: return "trash.slash.fill"
|
||||
case .reactions: return "face.smiling.fill"
|
||||
case .voice: return "mic.fill"
|
||||
case .files: return "doc.fill"
|
||||
case .calls: return "phone.fill"
|
||||
}
|
||||
}
|
||||
@@ -681,6 +785,12 @@ public enum ChatFeature: String, Decodable, Feature, Hashable {
|
||||
case .yes: return "Allow voice messages only if your contact allows them."
|
||||
case .no: return "Prohibit sending voice messages."
|
||||
}
|
||||
case .files:
|
||||
switch allowed {
|
||||
case .always: return "Allow your contacts to send files and media."
|
||||
case .yes: return "Allow files and media only if your contact allows them."
|
||||
case .no: return "Prohibit sending files and media."
|
||||
}
|
||||
case .calls:
|
||||
switch allowed {
|
||||
case .always: return "Allow your contacts to call you."
|
||||
@@ -724,6 +834,14 @@ public enum ChatFeature: String, Decodable, Feature, Hashable {
|
||||
: enabled.forContact
|
||||
? "Only your contact can send voice messages."
|
||||
: "Voice messages are prohibited in this chat."
|
||||
case .files:
|
||||
return enabled.forUser && enabled.forContact
|
||||
? "Both you and your contact can send files and media."
|
||||
: enabled.forUser
|
||||
? "Only you can send files and media."
|
||||
: enabled.forContact
|
||||
? "Only your contact can send files and media."
|
||||
: "Files and media are prohibited in this chat."
|
||||
case .calls:
|
||||
return enabled.forUser && enabled.forContact
|
||||
? "Both you and your contact can make calls."
|
||||
@@ -957,7 +1075,9 @@ public struct ContactFeaturesAllowed: Equatable, Hashable {
|
||||
public var fullDelete: ContactFeatureAllowed
|
||||
public var reactions: ContactFeatureAllowed
|
||||
public var voice: ContactFeatureAllowed
|
||||
public var files: ContactFeatureAllowed
|
||||
public var calls: ContactFeatureAllowed
|
||||
public var commands: [ChatBotCommand]?
|
||||
|
||||
public init(
|
||||
timedMessagesAllowed: Bool,
|
||||
@@ -965,14 +1085,18 @@ public struct ContactFeaturesAllowed: Equatable, Hashable {
|
||||
fullDelete: ContactFeatureAllowed,
|
||||
reactions: ContactFeatureAllowed,
|
||||
voice: ContactFeatureAllowed,
|
||||
calls: ContactFeatureAllowed
|
||||
files: ContactFeatureAllowed,
|
||||
calls: ContactFeatureAllowed,
|
||||
commands: [ChatBotCommand]?
|
||||
) {
|
||||
self.timedMessagesAllowed = timedMessagesAllowed
|
||||
self.timedMessagesTTL = timedMessagesTTL
|
||||
self.fullDelete = fullDelete
|
||||
self.reactions = reactions
|
||||
self.voice = voice
|
||||
self.files = files
|
||||
self.calls = calls
|
||||
self.commands = commands
|
||||
}
|
||||
|
||||
public static let sampleData = ContactFeaturesAllowed(
|
||||
@@ -981,7 +1105,9 @@ public struct ContactFeaturesAllowed: Equatable, Hashable {
|
||||
fullDelete: ContactFeatureAllowed.userDefault(.no),
|
||||
reactions: ContactFeatureAllowed.userDefault(.yes),
|
||||
voice: ContactFeatureAllowed.userDefault(.yes),
|
||||
calls: ContactFeatureAllowed.userDefault(.yes)
|
||||
files: ContactFeatureAllowed.userDefault(.always),
|
||||
calls: ContactFeatureAllowed.userDefault(.yes),
|
||||
commands: nil
|
||||
)
|
||||
}
|
||||
|
||||
@@ -994,7 +1120,9 @@ public func contactUserPrefsToFeaturesAllowed(_ contactUserPreferences: ContactU
|
||||
fullDelete: contactUserPrefToFeatureAllowed(contactUserPreferences.fullDelete),
|
||||
reactions: contactUserPrefToFeatureAllowed(contactUserPreferences.reactions),
|
||||
voice: contactUserPrefToFeatureAllowed(contactUserPreferences.voice),
|
||||
calls: contactUserPrefToFeatureAllowed(contactUserPreferences.calls)
|
||||
files: contactUserPrefToFeatureAllowed(contactUserPreferences.files),
|
||||
calls: contactUserPrefToFeatureAllowed(contactUserPreferences.calls),
|
||||
commands: contactUserPreferences.commands
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1016,7 +1144,9 @@ public func contactFeaturesAllowedToPrefs(_ contactFeaturesAllowed: ContactFeatu
|
||||
fullDelete: contactFeatureAllowedToPref(contactFeaturesAllowed.fullDelete),
|
||||
reactions: contactFeatureAllowedToPref(contactFeaturesAllowed.reactions),
|
||||
voice: contactFeatureAllowedToPref(contactFeaturesAllowed.voice),
|
||||
calls: contactFeatureAllowedToPref(contactFeaturesAllowed.calls)
|
||||
files: contactFeatureAllowedToPref(contactFeaturesAllowed.files),
|
||||
calls: contactFeatureAllowedToPref(contactFeaturesAllowed.calls),
|
||||
commands: contactFeaturesAllowed.commands
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1057,6 +1187,7 @@ public struct FullGroupPreferences: Decodable, Equatable, Hashable {
|
||||
public var simplexLinks: RoleGroupPreference
|
||||
public var reports: GroupPreference
|
||||
public var history: GroupPreference
|
||||
public var commands: [ChatBotCommand]
|
||||
|
||||
public init(
|
||||
timedMessages: TimedMessagesGroupPreference,
|
||||
@@ -1067,7 +1198,8 @@ public struct FullGroupPreferences: Decodable, Equatable, Hashable {
|
||||
files: RoleGroupPreference,
|
||||
simplexLinks: RoleGroupPreference,
|
||||
reports: GroupPreference,
|
||||
history: GroupPreference
|
||||
history: GroupPreference,
|
||||
commands: [ChatBotCommand]
|
||||
) {
|
||||
self.timedMessages = timedMessages
|
||||
self.directMessages = directMessages
|
||||
@@ -1078,6 +1210,7 @@ public struct FullGroupPreferences: Decodable, Equatable, Hashable {
|
||||
self.simplexLinks = simplexLinks
|
||||
self.reports = reports
|
||||
self.history = history
|
||||
self.commands = commands
|
||||
}
|
||||
|
||||
public static let sampleData = FullGroupPreferences(
|
||||
@@ -1089,7 +1222,8 @@ public struct FullGroupPreferences: Decodable, Equatable, Hashable {
|
||||
files: RoleGroupPreference(enable: .on, role: nil),
|
||||
simplexLinks: RoleGroupPreference(enable: .on, role: nil),
|
||||
reports: GroupPreference(enable: .on),
|
||||
history: GroupPreference(enable: .on)
|
||||
history: GroupPreference(enable: .on),
|
||||
commands: []
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1103,6 +1237,7 @@ public struct GroupPreferences: Codable, Hashable {
|
||||
public var simplexLinks: RoleGroupPreference?
|
||||
public var reports: GroupPreference?
|
||||
public var history: GroupPreference?
|
||||
public var commands: [ChatBotCommand]?
|
||||
|
||||
public init(
|
||||
timedMessages: TimedMessagesGroupPreference? = nil,
|
||||
@@ -1113,7 +1248,8 @@ public struct GroupPreferences: Codable, Hashable {
|
||||
files: RoleGroupPreference? = nil,
|
||||
simplexLinks: RoleGroupPreference? = nil,
|
||||
reports: GroupPreference? = nil,
|
||||
history: GroupPreference? = nil
|
||||
history: GroupPreference? = nil,
|
||||
commands: [ChatBotCommand]? = nil
|
||||
) {
|
||||
self.timedMessages = timedMessages
|
||||
self.directMessages = directMessages
|
||||
@@ -1124,6 +1260,7 @@ public struct GroupPreferences: Codable, Hashable {
|
||||
self.simplexLinks = simplexLinks
|
||||
self.reports = reports
|
||||
self.history = history
|
||||
self.commands = commands
|
||||
}
|
||||
|
||||
public static let sampleData = GroupPreferences(
|
||||
@@ -1135,7 +1272,8 @@ public struct GroupPreferences: Codable, Hashable {
|
||||
files: RoleGroupPreference(enable: .on, role: nil),
|
||||
simplexLinks: RoleGroupPreference(enable: .on, role: nil),
|
||||
reports: GroupPreference(enable: .on),
|
||||
history: GroupPreference(enable: .on)
|
||||
history: GroupPreference(enable: .on),
|
||||
commands: nil
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1149,7 +1287,8 @@ public func toGroupPreferences(_ fullPreferences: FullGroupPreferences) -> Group
|
||||
files: fullPreferences.files,
|
||||
simplexLinks: fullPreferences.simplexLinks,
|
||||
reports: fullPreferences.reports,
|
||||
history: fullPreferences.history
|
||||
history: fullPreferences.history,
|
||||
commands: fullPreferences.commands
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1368,6 +1507,19 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
|
||||
}
|
||||
}
|
||||
|
||||
public var sndReady: Bool {
|
||||
switch self {
|
||||
case let .direct(contact): contact.sndReady
|
||||
case let .group(groupInfo, groupScope):
|
||||
groupInfo.membership.memberActive
|
||||
&& (groupScope != nil || (!groupInfo.membership.memberPending && groupInfo.membership.memberRole != .observer))
|
||||
case .local: true
|
||||
case .contactRequest: false
|
||||
case .contactConnection: false
|
||||
case .invalidJSON: false
|
||||
}
|
||||
}
|
||||
|
||||
public var chatDeleted: Bool {
|
||||
get {
|
||||
switch self {
|
||||
@@ -1502,6 +1654,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
|
||||
case .fullDelete: return cups.fullDelete.enabled.forUser
|
||||
case .reactions: return cups.reactions.enabled.forUser
|
||||
case .voice: return cups.voice.enabled.forUser
|
||||
case .files: return cups.files.enabled.forUser
|
||||
case .calls: return cups.calls.enabled.forUser
|
||||
}
|
||||
case let .group(groupInfo, _):
|
||||
@@ -1511,12 +1664,17 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
|
||||
case .fullDelete: return prefs.fullDelete.on
|
||||
case .reactions: return prefs.reactions.on
|
||||
case .voice: return prefs.voice.on(for: groupInfo.membership)
|
||||
case .files: return prefs.files.on(for: groupInfo.membership)
|
||||
case .calls: return false
|
||||
}
|
||||
case .local:
|
||||
switch feature {
|
||||
case .timedMessages: return false
|
||||
case .fullDelete: return false
|
||||
case .reactions: return false
|
||||
case .voice: return true
|
||||
default: return false
|
||||
case .files: return true
|
||||
case .calls: return false
|
||||
}
|
||||
default: return false
|
||||
}
|
||||
@@ -1619,6 +1777,22 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable {
|
||||
if case .group = self { true } else { false }
|
||||
}
|
||||
|
||||
public var useCommands: Bool {
|
||||
switch self {
|
||||
case let .direct(c): c.isBot
|
||||
case let .group(g, _): (g.groupProfile.groupPreferences?.commands?.count ?? 0) > 0
|
||||
default: false
|
||||
}
|
||||
}
|
||||
|
||||
public var menuCommands: [ChatBotCommand] {
|
||||
switch self {
|
||||
case let .direct(c): c.isBot ? c.profile.preferences?.commands ?? [] : []
|
||||
case let .group(g, _): g.groupProfile.groupPreferences?.commands ?? []
|
||||
default: []
|
||||
}
|
||||
}
|
||||
|
||||
public var chatTags: [Int64]? {
|
||||
switch self {
|
||||
case let .direct(contact): return contact.chatTags
|
||||
@@ -1803,16 +1977,26 @@ public struct Contact: Identifiable, Decodable, NamedChat, Hashable {
|
||||
(activeConn == nil || activeConn?.connStatus == .prepared) && profile.contactLink != nil && active && preparedContact == nil && contactRequestId == nil
|
||||
}
|
||||
|
||||
@inline(__always)
|
||||
public var isBot: Bool {
|
||||
profile.peerType == .bot
|
||||
}
|
||||
|
||||
public var contactConnIncognito: Bool {
|
||||
activeConn?.customUserProfileId != nil
|
||||
}
|
||||
|
||||
public var chatIconName: String {
|
||||
isBot ? "cube.fill" : "person.crop.circle.fill"
|
||||
}
|
||||
|
||||
public func allowsFeature(_ feature: ChatFeature) -> Bool {
|
||||
switch feature {
|
||||
case .timedMessages: return mergedPreferences.timedMessages.contactPreference.allow != .no
|
||||
case .fullDelete: return mergedPreferences.fullDelete.contactPreference.allow != .no
|
||||
case .reactions: return mergedPreferences.reactions.contactPreference.allow != .no
|
||||
case .voice: return mergedPreferences.voice.contactPreference.allow != .no
|
||||
case .files: return mergedPreferences.files.contactPreference.allow != .no
|
||||
case .calls: return mergedPreferences.calls.contactPreference.allow != .no
|
||||
}
|
||||
}
|
||||
@@ -1823,6 +2007,7 @@ public struct Contact: Identifiable, Decodable, NamedChat, Hashable {
|
||||
case .fullDelete: return mergedPreferences.fullDelete.userPreference.preference.allow != .no
|
||||
case .reactions: return mergedPreferences.reactions.userPreference.preference.allow != .no
|
||||
case .voice: return mergedPreferences.voice.userPreference.preference.allow != .no
|
||||
case .files: return mergedPreferences.files.userPreference.preference.allow != .no
|
||||
case .calls: return mergedPreferences.calls.userPreference.preference.allow != .no
|
||||
}
|
||||
}
|
||||
@@ -4426,6 +4611,11 @@ public struct FormattedText: Decodable, Hashable {
|
||||
public var text: String
|
||||
public var format: Format?
|
||||
|
||||
public init(text: String, format: Format? = nil) {
|
||||
self.text = text
|
||||
self.format = format
|
||||
}
|
||||
|
||||
public static func plain(_ text: String) -> [FormattedText] {
|
||||
text.isEmpty
|
||||
? []
|
||||
@@ -4435,6 +4625,14 @@ public struct FormattedText: Decodable, Hashable {
|
||||
public var isSecret: Bool {
|
||||
if case .secret = format { true } else { false }
|
||||
}
|
||||
|
||||
public var linkUri: String? {
|
||||
switch format {
|
||||
case .uri: text
|
||||
case let .hyperLink(_, linkUri): linkUri
|
||||
default: nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum Format: Decodable, Equatable, Hashable {
|
||||
@@ -4445,7 +4643,9 @@ public enum Format: Decodable, Equatable, Hashable {
|
||||
case secret
|
||||
case colored(color: FormatColor)
|
||||
case uri
|
||||
case simplexLink(linkType: SimplexLinkType, simplexUri: String, smpHosts: [String])
|
||||
case hyperLink(showText: String?, linkUri: String)
|
||||
case simplexLink(showText: String?, linkType: SimplexLinkType, simplexUri: String, smpHosts: [String])
|
||||
case command(commandStr: String)
|
||||
case mention(memberName: String)
|
||||
case email
|
||||
case phone
|
||||
@@ -4562,14 +4762,14 @@ extension ReportReason: Decodable {
|
||||
|
||||
// Struct to use with simplex API
|
||||
public struct LinkPreview: Codable, Equatable, Hashable {
|
||||
public init(uri: URL, title: String, description: String = "", image: String) {
|
||||
public init(uri: String, title: String, description: String = "", image: String) {
|
||||
self.uri = uri
|
||||
self.title = title
|
||||
self.description = description
|
||||
self.image = image
|
||||
}
|
||||
|
||||
public var uri: URL
|
||||
public var uri: String
|
||||
public var title: String
|
||||
// TODO remove once optional in haskell
|
||||
public var description: String = ""
|
||||
|
||||
@@ -93,7 +93,7 @@ private func canForwardToChat(_ cInfo: ChatInfo) -> Bool {
|
||||
|
||||
public func chatIconName(_ cInfo: ChatInfo) -> String {
|
||||
switch cInfo {
|
||||
case .direct: "person.crop.circle.fill"
|
||||
case let .direct(contact): contact.chatIconName
|
||||
case let .group(groupInfo, _): groupInfo.chatIconName
|
||||
case .local: "folder.circle.fill"
|
||||
case .contactRequest: "person.crop.circle.fill"
|
||||
|
||||
@@ -446,7 +446,7 @@ public func getLinkPreview(url: URL, cb: @escaping (LinkPreview?) -> Void) {
|
||||
let resized = resizeImageToStrSizeSync(image, maxDataSize: 14000),
|
||||
let title = metadata.title,
|
||||
let uri = metadata.originalURL {
|
||||
linkPreview = LinkPreview(uri: uri, title: title, image: resized)
|
||||
linkPreview = LinkPreview(uri: uri.absoluteString, title: title, image: resized)
|
||||
}
|
||||
}
|
||||
cb(linkPreview)
|
||||
|
||||
@@ -24,6 +24,7 @@ extern char *chat_send_cmd_retry(chat_ctrl ctl, char *cmd, int retryNum);
|
||||
extern char *chat_recv_msg_wait(chat_ctrl ctl, int wait);
|
||||
extern char *chat_parse_markdown(char *str);
|
||||
extern char *chat_parse_server(char *str);
|
||||
extern char *chat_parse_uri(char *str);
|
||||
extern char *chat_password_hash(char *pwd, char *salt);
|
||||
extern char *chat_valid_name(char *name);
|
||||
extern int chat_json_length(char *str);
|
||||
|
||||
@@ -4301,7 +4301,7 @@ chat item action */
|
||||
/* alert message */
|
||||
"You can view invitation link again in connection details." = "Можете да видите отново линкът за покана в подробностите за връзката.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Не може да изпращате съобщения!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -3363,7 +3363,7 @@ chat item action */
|
||||
/* No comment provided by engineer. */
|
||||
"You can use markdown to format messages:" = "K formátování zpráv můžete použít markdown:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Nemůžete posílat zprávy!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -1087,7 +1087,7 @@ set passcode view */
|
||||
"Chat with member" = "Chat mit einem Mitglied";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Chat with members before they join." = "Chat mit Mitgliedern bevor sie beitreten.";
|
||||
"Chat with members before they join." = "Mit Mitgliedern chatten bevor sie beitreten.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Chats" = "Chats";
|
||||
@@ -1410,6 +1410,9 @@ set passcode view */
|
||||
/* No comment provided by engineer. */
|
||||
"Contact preferences" = "Kontakt-Präferenzen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Contact requests from groups" = "KONTAKTANFRAGEN VON GRUPPEN";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"contact should accept…" = "Kontakt sollte akzeptieren…";
|
||||
|
||||
@@ -2011,7 +2014,7 @@ chat item action */
|
||||
"Enable camera access" = "Kamera-Zugriff aktivieren";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enable disappearing messages by default." = "Verschwindende Nachrichten per Voreinstellung aktiviert.";
|
||||
"Enable disappearing messages by default." = "Verschwindende Nachrichten sind per Voreinstellung aktiviert.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enable Flux in Network & servers settings for better metadata privacy." = "Für einen besseren Metadatenschutz Flux in den Netzwerk- und Servereinstellungen aktivieren.";
|
||||
@@ -2367,6 +2370,9 @@ chat item action */
|
||||
/* No comment provided by engineer. */
|
||||
"Error sending message" = "Fehler beim Senden der Nachricht";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error setting auto-accept" = "Fehler bei der Einstellung des automatischen Akzeptierens";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error setting delivery receipts!" = "Fehler beim Setzen von Empfangsbestätigungen!";
|
||||
|
||||
@@ -3105,7 +3111,7 @@ snd error text */
|
||||
"Keep unused invitation?" = "Nicht genutzte Einladung behalten?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Keep your chats clean" = "Halten Sie Ihre Chats übersichtlich";
|
||||
"Keep your chats clean" = "Ihre Chats übersichtlich halten";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Keep your connections" = "Ihre Verbindungen beibehalten";
|
||||
@@ -3248,6 +3254,9 @@ snd error text */
|
||||
/* item status text */
|
||||
"Member inactive" = "Mitglied inaktiv";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Member is deleted - can't accept request" = "Mitglied ist gelöscht - Anfrage kann nicht angenommen werden";
|
||||
|
||||
/* chat feature */
|
||||
"Member reports" = "Mitglieder-Meldungen";
|
||||
|
||||
@@ -4422,6 +4431,12 @@ swipe action */
|
||||
/* No comment provided by engineer. */
|
||||
"request to join rejected" = "Beitrittsanfrage abgelehnt";
|
||||
|
||||
/* rcv group event chat item */
|
||||
"requested connection" = "Angefragte Verbindung";
|
||||
|
||||
/* rcv direct event chat item */
|
||||
"requested connection from group %@" = "Angefragte Verbindung von Gruppe %@";
|
||||
|
||||
/* chat list item title */
|
||||
"requested to connect" = "Zur Verbindung aufgefordert";
|
||||
|
||||
@@ -4898,7 +4913,7 @@ chat item action */
|
||||
"Set passphrase to export" = "Passwort für den Export festlegen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set profile bio and welcome message." = "Geben Sie eine Profil-Biografie und eine Begrüßungsmeldung ein.";
|
||||
"Set profile bio and welcome message." = "Sie können eine Profil-Biografie und eine Begrüßungsmeldung eingeben.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set the message shown to new members!" = "Definieren Sie eine Begrüßungsmeldung, die neuen Mitgliedern angezeigt wird!";
|
||||
@@ -5430,6 +5445,9 @@ report reason */
|
||||
/* No comment provided by engineer. */
|
||||
"This setting applies to messages in your current chat profile **%@**." = "Diese Einstellung gilt für Nachrichten in Ihrem aktuellen Chat-Profil **%@**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"This setting is for your current profile **%@**." = "Diese Einstellung gilt für Ihr aktuelles Profil **%@**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Time to disappear is set only for new contacts." = "Die Zeit bis zum Verschwinden wird nur für neue Kontakte eingestellt.";
|
||||
|
||||
@@ -6090,7 +6108,7 @@ report reason */
|
||||
/* alert message */
|
||||
"You can view your reports in Chat with admins." = "Sie können Ihre Meldungen im Chat mit den Administratoren sehen.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Sie können keine Nachrichten versenden!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -552,13 +552,13 @@ swipe action */
|
||||
"Allow calls?" = "¿Permitir llamadas?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow disappearing messages only if your contact allows it to you." = "Se permiten los mensajes temporales pero sólo si tu contacto también los permite para tí.";
|
||||
"Allow disappearing messages only if your contact allows it to you." = "Se permiten los mensajes temporales pero sólo si tu contacto también los permite.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow downgrade" = "Permitir versión anterior";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Se permite la eliminación irreversible de mensajes pero sólo si tu contacto también la permite para tí. (24 horas)";
|
||||
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Se permite la eliminación irreversible de mensajes pero sólo si tu contacto también lo permite. (24 horas)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow message reactions only if your contact allows them." = "Se permiten las reacciones a los mensajes pero sólo si tu contacto también las permite.";
|
||||
@@ -1081,7 +1081,7 @@ set passcode view */
|
||||
"Chat will be deleted for you - this cannot be undone!" = "El chat será eliminado para tí. ¡No puede deshacerse!";
|
||||
|
||||
/* chat toolbar */
|
||||
"Chat with admins" = "Chatea con los administradores";
|
||||
"Chat with admins" = "Chatea con administradores";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Chat with member" = "Chat con miembro";
|
||||
@@ -1111,7 +1111,7 @@ set passcode view */
|
||||
"Choose _Migrate from another device_ on the new device and scan QR code." = "En el nuevo dispositivo selecciona _Migrar desde otro dispositivo_ y escanéa el código QR.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Choose file" = "Elije archivo";
|
||||
"Choose file" = "Elegir archivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Choose from library" = "Elige de la biblioteca";
|
||||
@@ -1405,13 +1405,16 @@ set passcode view */
|
||||
"Contact name" = "Contacto";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"contact not ready" = "el contacto no está listo";
|
||||
"contact not ready" = "en espera de ser aceptado";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Contact preferences" = "Preferencias de contacto";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"contact should accept…" = "el contacto debe aceptar…";
|
||||
"Contact requests from groups" = "Solicitudes de contacto en grupo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"contact should accept…" = "el contacto debe aceptarte…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Contact will be deleted - this cannot be undone!" = "El contacto será eliminado. ¡No puede deshacerse!";
|
||||
@@ -2367,6 +2370,9 @@ chat item action */
|
||||
/* No comment provided by engineer. */
|
||||
"Error sending message" = "Error al enviar mensaje";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error setting auto-accept" = "Error al configurar auto aceptar";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error setting delivery receipts!" = "¡Error al configurar confirmaciones de entrega!";
|
||||
|
||||
@@ -3072,19 +3078,19 @@ snd error text */
|
||||
"Japanese interface" = "Interfáz en japonés";
|
||||
|
||||
/* swipe action */
|
||||
"Join" = "Unirte";
|
||||
"Join" = "Unirme";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Join as %@" = "unirte como %@";
|
||||
"Join as %@" = "Unirme como %@";
|
||||
|
||||
/* new chat sheet title */
|
||||
"Join group" = "Unirte al grupo";
|
||||
"Join group" = "Unirme al grupo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Join group conversations" = "Unirse a la conversación del grupo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Join incognito" = "Unirte en modo incógnito";
|
||||
"Join incognito" = "Unirme en modo incógnito";
|
||||
|
||||
/* new chat action */
|
||||
"Join your group?\nThis is your link for group %@!" = "¿Unirse a tu grupo?\n¡Este es tu enlace para el grupo %@!";
|
||||
@@ -3248,11 +3254,14 @@ snd error text */
|
||||
/* item status text */
|
||||
"Member inactive" = "Miembro inactivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Member is deleted - can't accept request" = "Miembro eliminado, no puede aceptar solicitudes";
|
||||
|
||||
/* chat feature */
|
||||
"Member reports" = "Informes de miembros";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Member role will be changed to \"%@\". All chat members will be notified." = "El rol del miembro cambiará a \"%@\" y todos serán notificados.";
|
||||
"Member role will be changed to \"%@\". All chat members will be notified." = "El rol del miembro cambiará a \"%@\". Se notificará en el chat.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Member role will be changed to \"%@\". All group members will be notified." = "El rol del miembro cambiará a \"%@\" y se notificará al grupo.";
|
||||
@@ -3372,7 +3381,7 @@ snd error text */
|
||||
"Messages are protected by **end-to-end encryption**." = "Los mensajes están protegidos mediante **cifrado de extremo a extremo**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Messages from %@ will be shown!" = "¡Los mensajes de %@ serán mostrados!";
|
||||
"Messages from %@ will be shown!" = "¡Los mensajes nuevos de %@ serán mostrados!";
|
||||
|
||||
/* alert message */
|
||||
"Messages in this chat will never be deleted." = "Los mensajes de esta conversación nunca se eliminan.";
|
||||
@@ -3591,7 +3600,7 @@ snd error text */
|
||||
"No chats in list %@" = "Sin chats en la lista %@";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"No chats with members" = "Sin chats con miembros";
|
||||
"No chats with members" = "Sin chats";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"No contacts selected" = "Ningún contacto seleccionado";
|
||||
@@ -3848,7 +3857,7 @@ new chat action */
|
||||
"Open to connect" = "Abrir para conectar";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Open to join" = "Abrir para unirte";
|
||||
"Open to join" = "Abre para unirte";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Opening app…" = "Iniciando aplicación…";
|
||||
@@ -4422,6 +4431,12 @@ swipe action */
|
||||
/* No comment provided by engineer. */
|
||||
"request to join rejected" = "petición para unirse rechazada";
|
||||
|
||||
/* rcv group event chat item */
|
||||
"requested connection" = "conexión solicitada";
|
||||
|
||||
/* rcv direct event chat item */
|
||||
"requested connection from group %@" = "conexión solicitada desde el grupo %@";
|
||||
|
||||
/* chat list item title */
|
||||
"requested to connect" = "solicitado para conectar";
|
||||
|
||||
@@ -5013,7 +5028,7 @@ chat item action */
|
||||
"SimpleX address and 1-time links are safe to share via any messenger." = "Compartir enlaces de un solo uso y direcciones SimpleX es seguro a través de cualquier medio.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"SimpleX address or 1-time link?" = "¿Dirección SimpleX o enlace de un uso?";
|
||||
"SimpleX address or 1-time link?" = "¿Dirección SimpleX o enlace de un solo uso?";
|
||||
|
||||
/* alert title */
|
||||
"SimpleX address settings" = "Auto aceptar configuración";
|
||||
@@ -5221,7 +5236,7 @@ report reason */
|
||||
"Tap Create SimpleX address in the menu to create it later." = "Pulsa Crear dirección SimpleX en el menú para crearla más tarde.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Tap Join group" = "Pulsa Unirte al grupo";
|
||||
"Tap Join group" = "Pulsa Unirme al grupo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Tap to activate profile." = "Pulsa sobre un perfil para activarlo.";
|
||||
@@ -5236,7 +5251,7 @@ report reason */
|
||||
"Tap to join incognito" = "Pulsa para unirte en modo incógnito";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Tap to paste link" = "Pulsa para pegar el enlacePulsa para pegar enlace";
|
||||
"Tap to paste link" = "Pulsa aquí para pegar el enlace";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Tap to scan" = "Pulsa para escanear";
|
||||
@@ -5410,7 +5425,7 @@ report reason */
|
||||
"This device name" = "Nombre del dispositivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"This display name is invalid. Please choose another name." = "Éste nombre mostrado no es válido. Por favor, elije otro nombre.";
|
||||
"This display name is invalid. Please choose another name." = "Éste nombre mostrado no es válido. Por favor, elige otro nombre.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"This group has over %lld members, delivery receipts are not sent." = "Este grupo tiene más de %lld miembros, no se enviarán confirmaciones de entrega.";
|
||||
@@ -5430,6 +5445,9 @@ report reason */
|
||||
/* No comment provided by engineer. */
|
||||
"This setting applies to messages in your current chat profile **%@**." = "Esta configuración se aplica a los mensajes del perfil actual **%@**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"This setting is for your current profile **%@**." = "Esta configuración se aplica al perfil actual **%@**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Time to disappear is set only for new contacts." = "Mensajes temporales activados sólo para los contactos nuevos.";
|
||||
|
||||
@@ -5542,7 +5560,7 @@ report reason */
|
||||
"Unblock member" = "Desbloquear miembro";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unblock member for all?" = "¿Desbloquear el miembro para todos?";
|
||||
"Unblock member for all?" = "¿Desbloquear al miembro para todos?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Unblock member?" = "¿Desbloquear miembro?";
|
||||
@@ -6088,9 +6106,9 @@ report reason */
|
||||
"You can view invitation link again in connection details." = "Puedes ver el enlace de invitación de nuevo en los detalles de la conexión.";
|
||||
|
||||
/* alert message */
|
||||
"You can view your reports in Chat with admins." = "Puedes ver tus informes en Chat con los administradores.";
|
||||
"You can view your reports in Chat with admins." = "Puedes ver tus informes en Chat con administradores.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "¡No puedes enviar mensajes!";
|
||||
|
||||
/* chat item text */
|
||||
@@ -6187,10 +6205,10 @@ report reason */
|
||||
"You will still receive calls and notifications from muted profiles when they are active." = "Seguirás recibiendo llamadas y notificaciones de los perfiles silenciados cuando estén activos.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You will stop receiving messages from this chat. Chat history will be preserved." = "Dejarás de recibir mensajes de este chat. El historial del chat se conserva.";
|
||||
"You will stop receiving messages from this chat. Chat history will be preserved." = "Dejarás de recibir mensajes del chat. El historial del chat se conserva.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You will stop receiving messages from this group. Chat history will be preserved." = "Dejarás de recibir mensajes de este grupo. El historial del chat se conservará.";
|
||||
"You will stop receiving messages from this group. Chat history will be preserved." = "Dejarás de recibir mensajes del grupo. El historial del chat se conservará.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You won't lose your contacts if you later delete your address." = "Si lo eliminas más tarde tus contactos no se perderán.";
|
||||
|
||||
@@ -3258,7 +3258,7 @@ chat item action */
|
||||
/* No comment provided by engineer. */
|
||||
"You can use markdown to format messages:" = "Voit käyttää markdownia viestien muotoiluun:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Et voi lähettää viestejä!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -5540,7 +5540,7 @@ chat item action */
|
||||
/* alert message */
|
||||
"You can view invitation link again in connection details." = "Vous pouvez à nouveau consulter le lien d'invitation dans les détails de la connexion.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Vous ne pouvez pas envoyer de messages !";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -1410,6 +1410,9 @@ set passcode view */
|
||||
/* No comment provided by engineer. */
|
||||
"Contact preferences" = "Partnerbeállítások";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Contact requests from groups" = "Partneri kapcsolatkérések a csoportokból";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"contact should accept…" = "a partnernek el kell fogadnia…";
|
||||
|
||||
@@ -2367,6 +2370,9 @@ chat item action */
|
||||
/* No comment provided by engineer. */
|
||||
"Error sending message" = "Hiba történt az üzenet elküldésekor";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error setting auto-accept" = "Hiba az automatikus elfogadás beállításakor";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error setting delivery receipts!" = "Hiba történt a kézbesítési jelentések beállításakor!";
|
||||
|
||||
@@ -3248,6 +3254,9 @@ snd error text */
|
||||
/* item status text */
|
||||
"Member inactive" = "Inaktív tag";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Member is deleted - can't accept request" = "A tag törölve lett – nem lehet elfogadni a kérést";
|
||||
|
||||
/* chat feature */
|
||||
"Member reports" = "Tagok jelentései";
|
||||
|
||||
@@ -3447,7 +3456,7 @@ snd error text */
|
||||
"Moderated at: %@" = "Moderálva: %@";
|
||||
|
||||
/* marked deleted chat item preview text */
|
||||
"moderated by %@" = "moderálva lett %@ által";
|
||||
"moderated by %@" = "%@ moderálta ezt az üzenetet";
|
||||
|
||||
/* member role */
|
||||
"moderator" = "moderátor";
|
||||
@@ -4422,6 +4431,12 @@ swipe action */
|
||||
/* No comment provided by engineer. */
|
||||
"request to join rejected" = "csatlakozási kérés elutasítva";
|
||||
|
||||
/* rcv group event chat item */
|
||||
"requested connection" = "partneri kapcsolatot kért";
|
||||
|
||||
/* rcv direct event chat item */
|
||||
"requested connection from group %@" = "a(z) %@ nevű csoportból partneri kapcsolatot kért";
|
||||
|
||||
/* chat list item title */
|
||||
"requested to connect" = "függőben lévő kapcsolat";
|
||||
|
||||
@@ -5430,6 +5445,9 @@ report reason */
|
||||
/* No comment provided by engineer. */
|
||||
"This setting applies to messages in your current chat profile **%@**." = "Ez a beállítás csak az Ön jelenlegi **%@** nevű csevegési profiljában lévő üzenetekre vonatkozik.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"This setting is for your current profile **%@**." = "Ez a beállítás csak a jelenlegi **%@** nevű csevegési profiljára vonatkozik.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Time to disappear is set only for new contacts." = "Az üzeneteltűnési idő csak az új partnerekre vonatkozik.";
|
||||
|
||||
@@ -6090,7 +6108,7 @@ report reason */
|
||||
/* alert message */
|
||||
"You can view your reports in Chat with admins." = "A jelentéseket megtekintheti a „Csevegés az adminisztrátorokkal” menüben.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Nem lehet üzeneteket küldeni!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -1410,6 +1410,9 @@ set passcode view */
|
||||
/* No comment provided by engineer. */
|
||||
"Contact preferences" = "Preferenze del contatto";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Contact requests from groups" = "Richieste di contatto dai gruppi";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"contact should accept…" = "il contatto dovrebbe accettare…";
|
||||
|
||||
@@ -2367,6 +2370,9 @@ chat item action */
|
||||
/* No comment provided by engineer. */
|
||||
"Error sending message" = "Errore nell'invio del messaggio";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error setting auto-accept" = "Errore impostando l'accettazione automatica";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error setting delivery receipts!" = "Errore nell'impostazione delle ricevute di consegna!";
|
||||
|
||||
@@ -3248,6 +3254,9 @@ snd error text */
|
||||
/* item status text */
|
||||
"Member inactive" = "Membro inattivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Member is deleted - can't accept request" = "Il membro è eliminato - impossibile accettare la richiesta";
|
||||
|
||||
/* chat feature */
|
||||
"Member reports" = "Segnalazioni dei membri";
|
||||
|
||||
@@ -4422,6 +4431,12 @@ swipe action */
|
||||
/* No comment provided by engineer. */
|
||||
"request to join rejected" = "richiesta di entrare rifiutata";
|
||||
|
||||
/* rcv group event chat item */
|
||||
"requested connection" = "connessione richiesta";
|
||||
|
||||
/* rcv direct event chat item */
|
||||
"requested connection from group %@" = "connessione richiesta dal gruppo %@";
|
||||
|
||||
/* chat list item title */
|
||||
"requested to connect" = "richiesto di connettersi";
|
||||
|
||||
@@ -5430,6 +5445,9 @@ report reason */
|
||||
/* No comment provided by engineer. */
|
||||
"This setting applies to messages in your current chat profile **%@**." = "Questa impostazione si applica ai messaggi del profilo di chat attuale **%@**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"This setting is for your current profile **%@**." = "Questa impostazione è per il tuo profilo attuale **%@**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Time to disappear is set only for new contacts." = "Il tempo di scomparsa è impostato solo per i contatti nuovi.";
|
||||
|
||||
@@ -6090,7 +6108,7 @@ report reason */
|
||||
/* alert message */
|
||||
"You can view your reports in Chat with admins." = "Puoi vedere le tue segnalazioni nella chat con gli amministratori.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Non puoi inviare messaggi!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -178,15 +178,15 @@
|
||||
/* time interval */
|
||||
"%d sec" = "%d 秒";
|
||||
|
||||
/* delete after time */
|
||||
"%d seconds(s)" = "%d 秒";
|
||||
|
||||
/* integrity error chat item */
|
||||
"%d skipped message(s)" = "%d 件のスキップされたメッセージ";
|
||||
|
||||
/* time interval */
|
||||
"%d weeks" = "%d 週";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"%lld" = "";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"%lld %@" = "%lld %@";
|
||||
|
||||
@@ -283,6 +283,9 @@ time interval */
|
||||
time interval */
|
||||
"1 week" = "1週間";
|
||||
|
||||
/* delete after time */
|
||||
"1 year" = "1年";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"1-time link" = "使い捨てリンク";
|
||||
|
||||
@@ -322,6 +325,9 @@ time interval */
|
||||
/* No comment provided by engineer. */
|
||||
"Abort changing address?" = "アドレス変更を中止しますか?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"About operators" = "オペレーターについて";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"About SimpleX Chat" = "SimpleX Chat について";
|
||||
|
||||
@@ -334,9 +340,21 @@ alert action
|
||||
swipe action */
|
||||
"Accept" = "承諾";
|
||||
|
||||
/* alert action */
|
||||
"Accept as member" = "メンバーとして承認する";
|
||||
|
||||
/* alert action */
|
||||
"Accept as observer" = "オブザーバーとして承認する";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Accept conditions" = "条件に同意する";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Accept connection request?" = "接続要求を承認?";
|
||||
|
||||
/* alert title */
|
||||
"Accept contact request" = "連絡先リクエストを受け入れる";
|
||||
|
||||
/* notification body */
|
||||
"Accept contact request from %@?" = "%@ からの連絡要求を受け入れますか?";
|
||||
|
||||
@@ -344,9 +362,15 @@ swipe action */
|
||||
swipe action */
|
||||
"Accept incognito" = "シークレットモードで承諾";
|
||||
|
||||
/* alert title */
|
||||
"Accept member" = "メンバーを承認する";
|
||||
|
||||
/* call status */
|
||||
"accepted call" = "受けた通話";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Accepted conditions" = "承諾された条件";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts." = "プロフィールにアドレスを追加し、連絡先があなたのアドレスを他の人と共有できるようにします。プロフィールの更新は連絡先に送信されます。";
|
||||
|
||||
@@ -3459,7 +3483,7 @@ chat item action */
|
||||
/* No comment provided by engineer. */
|
||||
"You can use markdown to format messages:" = "メッセージの書式にmarkdownを使用することができます:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "メッセージを送信できませんでした!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -5898,7 +5898,7 @@ report reason */
|
||||
/* alert message */
|
||||
"You can view your reports in Chat with admins." = "U kunt uw rapporten bekijken in Chat met beheerders.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Je kunt geen berichten versturen!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -5156,7 +5156,7 @@ chat item action */
|
||||
/* alert message */
|
||||
"You can view invitation link again in connection details." = "Możesz zobaczyć link zaproszenia ponownie w szczegółach połączenia.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Nie możesz wysyłać wiadomości!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -6108,7 +6108,7 @@ report reason */
|
||||
/* alert message */
|
||||
"You can view your reports in Chat with admins." = "Вы можете найти Ваши жалобы в Чате с админами.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Вы не можете отправлять сообщения!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -3168,7 +3168,7 @@ chat item action */
|
||||
/* No comment provided by engineer. */
|
||||
"You can use markdown to format messages:" = "คุณสามารถใช้มาร์กดาวน์เพื่อจัดรูปแบบข้อความ:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "คุณไม่สามารถส่งข้อความได้!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -1410,6 +1410,9 @@ set passcode view */
|
||||
/* No comment provided by engineer. */
|
||||
"Contact preferences" = "Kişi tercihleri";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Contact requests from groups" = "Gruplardan gelen iletişim talepleri";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"contact should accept…" = "kişi kabul etmeli…";
|
||||
|
||||
@@ -1482,6 +1485,9 @@ set passcode view */
|
||||
/* No comment provided by engineer. */
|
||||
"Create SimpleX address" = "SimpleX adresi oluştur";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Create your address" = "Adresinizi oluşturun";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Create your profile" = "Profilini oluştur";
|
||||
|
||||
@@ -2007,6 +2013,9 @@ chat item action */
|
||||
/* No comment provided by engineer. */
|
||||
"Enable camera access" = "Kamera erişimini etkinleştir";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enable disappearing messages by default." = "Varsayılan olarak kaybolan mesajları etkinleştirin.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enable Flux in Network & servers settings for better metadata privacy." = "Daha iyi meta veri gizliliği için Ağ & sunucu ayarlarında Flux'u etkinleştirin.";
|
||||
|
||||
@@ -6033,7 +6042,7 @@ report reason */
|
||||
/* alert message */
|
||||
"You can view your reports in Chat with admins." = "Raporlarınızı Yöneticilerle Sohbet bölümünde görüntüleyebilirsiniz.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Mesajlar gönderemezsiniz!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -6090,7 +6090,7 @@ report reason */
|
||||
/* alert message */
|
||||
"You can view your reports in Chat with admins." = "Ви можете переглянути свої звіти у чаті з адміністраторами.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "Ви не можете надсилати повідомлення!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -5507,7 +5507,7 @@ chat item action */
|
||||
/* alert message */
|
||||
"You can view invitation link again in connection details." = "您可以在连接详情中再次查看邀请链接。";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
/* alert title */
|
||||
"You can't send messages!" = "您无法发送消息!";
|
||||
|
||||
/* chat item text */
|
||||
|
||||
@@ -64,6 +64,7 @@ extern char *chat_recv_msg(chat_ctrl ctrl); // deprecated
|
||||
extern char *chat_recv_msg_wait(chat_ctrl ctrl, const int wait);
|
||||
extern char *chat_parse_markdown(const char *str);
|
||||
extern char *chat_parse_server(const char *str);
|
||||
extern char *chat_parse_uri(const char *str);
|
||||
extern char *chat_password_hash(const char *pwd, const char *salt);
|
||||
extern char *chat_valid_name(const char *name);
|
||||
extern int chat_json_length(const char *str);
|
||||
@@ -146,6 +147,14 @@ Java_chat_simplex_common_platform_CoreKt_chatParseServer(JNIEnv *env, __unused j
|
||||
return res;
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_chat_simplex_common_platform_CoreKt_chatParseUri(JNIEnv *env, __unused jclass clazz, jstring str) {
|
||||
const char *_str = (*env)->GetStringUTFChars(env, str, JNI_FALSE);
|
||||
jstring res = (*env)->NewStringUTF(env, chat_parse_uri(_str));
|
||||
(*env)->ReleaseStringUTFChars(env, str, _str);
|
||||
return res;
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_chat_simplex_common_platform_CoreKt_chatPasswordHash(JNIEnv *env, __unused jclass clazz, jstring pwd, jstring salt) {
|
||||
const char *_pwd = (*env)->GetStringUTFChars(env, pwd, JNI_FALSE);
|
||||
|
||||
@@ -37,6 +37,7 @@ extern char *chat_recv_msg(chat_ctrl ctrl); // deprecated
|
||||
extern char *chat_recv_msg_wait(chat_ctrl ctrl, const int wait);
|
||||
extern char *chat_parse_markdown(const char *str);
|
||||
extern char *chat_parse_server(const char *str);
|
||||
extern char *chat_parse_uri(const char *str);
|
||||
extern char *chat_password_hash(const char *pwd, const char *salt);
|
||||
extern char *chat_valid_name(const char *name);
|
||||
extern int chat_json_length(const char *str);
|
||||
@@ -156,6 +157,14 @@ Java_chat_simplex_common_platform_CoreKt_chatParseServer(JNIEnv *env, jclass cla
|
||||
return res;
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_chat_simplex_common_platform_CoreKt_chatParseUri(JNIEnv *env, jclass clazz, jstring str) {
|
||||
const char *_str = encode_to_utf8_chars(env, str);
|
||||
jstring res = decode_to_utf8_string(env, chat_parse_uri(_str));
|
||||
(*env)->ReleaseStringUTFChars(env, str, _str);
|
||||
return res;
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_chat_simplex_common_platform_CoreKt_chatPasswordHash(JNIEnv *env, jclass clazz, jstring pwd, jstring salt) {
|
||||
const char *_pwd = encode_to_utf8_chars(env, pwd);
|
||||
|
||||
+73
-22
@@ -1633,6 +1633,18 @@ sealed class ChatInfo: SomeChat, NamedChat {
|
||||
|
||||
val sendMsgEnabled get() = userCantSendReason == null
|
||||
|
||||
val sndReady: Boolean get() =
|
||||
when(this) {
|
||||
is Direct -> contact.sndReady
|
||||
is Group ->
|
||||
groupInfo.membership.memberActive
|
||||
&& (groupChatScope != null || (!groupInfo.membership.memberPending && groupInfo.membership.memberRole != GroupMemberRole.Observer))
|
||||
is Local -> true
|
||||
is ContactRequest -> false
|
||||
is ContactConnection -> false
|
||||
is InvalidJSON -> false
|
||||
}
|
||||
|
||||
fun groupChatScope(): GroupChatScope? = when (this) {
|
||||
is Group -> groupChatScope?.toChatScope()
|
||||
else -> null
|
||||
@@ -1676,6 +1688,20 @@ sealed class ChatInfo: SomeChat, NamedChat {
|
||||
|
||||
val hasMentions: Boolean get() = this is Group
|
||||
|
||||
val useCommands: Boolean get() = when(this) {
|
||||
is Direct -> contact.isBot
|
||||
is Group -> groupInfo.groupProfile.groupPreferences?.commands?.isNotEmpty() ?: false
|
||||
else -> false
|
||||
}
|
||||
|
||||
val menuCommands: List<ChatBotCommand> get() = when(this) {
|
||||
is Direct ->
|
||||
if (contact.isBot) contact.profile.preferences?.commands ?: emptyList()
|
||||
else emptyList()
|
||||
is Group -> groupInfo.groupProfile.groupPreferences?.commands ?: emptyList()
|
||||
else -> emptyList()
|
||||
}
|
||||
|
||||
val contactCard: Boolean
|
||||
get() = when (this) {
|
||||
is Direct -> contact.isContactCard
|
||||
@@ -1759,6 +1785,7 @@ data class Contact(
|
||||
ChatFeature.FullDelete -> mergedPreferences.fullDelete.enabled.forUser
|
||||
ChatFeature.Reactions -> mergedPreferences.reactions.enabled.forUser
|
||||
ChatFeature.Voice -> mergedPreferences.voice.enabled.forUser
|
||||
ChatFeature.Files -> mergedPreferences.files.enabled.forUser
|
||||
ChatFeature.Calls -> mergedPreferences.calls.enabled.forUser
|
||||
}
|
||||
override val timedMessagesTTL: Int? get() = with(mergedPreferences.timedMessages) { if (enabled.forUser) userPreference.pref.ttl else null }
|
||||
@@ -1775,7 +1802,6 @@ data class Contact(
|
||||
return profile.chatViewName.lowercase().contains(s) || profile.displayName.lowercase().contains(s) || profile.fullName.lowercase().contains(s)
|
||||
}
|
||||
|
||||
|
||||
val directOrUsed: Boolean get() =
|
||||
if (activeConn != null) {
|
||||
(activeConn.connLevel == 0 && !activeConn.viaGroupLink) || contactUsed
|
||||
@@ -1783,16 +1809,22 @@ data class Contact(
|
||||
true
|
||||
}
|
||||
|
||||
val isContactCard: Boolean =
|
||||
val isContactCard: Boolean get() =
|
||||
(activeConn == null || activeConn.connStatus == ConnStatus.Prepared) && profile.contactLink != null && active && preparedContact == null && contactRequestId == null
|
||||
|
||||
val contactConnIncognito =
|
||||
val isBot: Boolean get() = profile.peerType == ChatPeerType.Bot
|
||||
|
||||
val contactConnIncognito: Boolean get() =
|
||||
activeConn?.customUserProfileId != null
|
||||
|
||||
val chatIconName: ImageResource get() =
|
||||
if (isBot) MR.images.ic_cube else MR.images.ic_account_circle_filled
|
||||
|
||||
fun allowsFeature(feature: ChatFeature): Boolean = when (feature) {
|
||||
ChatFeature.TimedMessages -> mergedPreferences.timedMessages.contactPreference.allow != FeatureAllowed.NO
|
||||
ChatFeature.FullDelete -> mergedPreferences.fullDelete.contactPreference.allow != FeatureAllowed.NO
|
||||
ChatFeature.Voice -> mergedPreferences.voice.contactPreference.allow != FeatureAllowed.NO
|
||||
ChatFeature.Files -> mergedPreferences.files.contactPreference.allow != FeatureAllowed.NO
|
||||
ChatFeature.Reactions -> mergedPreferences.reactions.contactPreference.allow != FeatureAllowed.NO
|
||||
ChatFeature.Calls -> mergedPreferences.calls.contactPreference.allow != FeatureAllowed.NO
|
||||
}
|
||||
@@ -1802,6 +1834,7 @@ data class Contact(
|
||||
ChatFeature.FullDelete -> mergedPreferences.fullDelete.userPreference.pref.allow != FeatureAllowed.NO
|
||||
ChatFeature.Reactions -> mergedPreferences.reactions.userPreference.pref.allow != FeatureAllowed.NO
|
||||
ChatFeature.Voice -> mergedPreferences.voice.userPreference.pref.allow != FeatureAllowed.NO
|
||||
ChatFeature.Files -> mergedPreferences.files.userPreference.pref.allow != FeatureAllowed.NO
|
||||
ChatFeature.Calls -> mergedPreferences.calls.userPreference.pref.allow != FeatureAllowed.NO
|
||||
}
|
||||
|
||||
@@ -1931,14 +1964,15 @@ data class Profile(
|
||||
override val image: String? = null,
|
||||
override val localAlias : String = "",
|
||||
val contactLink: String? = null,
|
||||
val preferences: ChatPreferences? = null
|
||||
val preferences: ChatPreferences? = null,
|
||||
val peerType: ChatPeerType? = null
|
||||
): NamedChat {
|
||||
val profileViewName: String
|
||||
get() {
|
||||
return if (fullName == "" || displayName == fullName) displayName else "$displayName ($fullName)"
|
||||
}
|
||||
|
||||
fun toLocalProfile(profileId: Long): LocalProfile = LocalProfile(profileId, displayName, fullName, shortDescr, image, localAlias, contactLink, preferences)
|
||||
fun toLocalProfile(profileId: Long): LocalProfile = LocalProfile(profileId, displayName, fullName, shortDescr, image, localAlias, contactLink, preferences, peerType)
|
||||
|
||||
companion object {
|
||||
val sampleData = Profile(
|
||||
@@ -1958,11 +1992,12 @@ data class LocalProfile(
|
||||
override val image: String? = null,
|
||||
override val localAlias: String,
|
||||
val contactLink: String? = null,
|
||||
val preferences: ChatPreferences? = null
|
||||
val preferences: ChatPreferences? = null,
|
||||
val peerType: ChatPeerType? = null
|
||||
): NamedChat {
|
||||
val profileViewName: String = localAlias.ifEmpty { if (fullName == "" || displayName == fullName) displayName else "$displayName ($fullName)" }
|
||||
|
||||
fun toProfile(): Profile = Profile(displayName, fullName, shortDescr, image, localAlias, contactLink, preferences)
|
||||
fun toProfile(): Profile = Profile(displayName, fullName, shortDescr, image, localAlias, contactLink, preferences, peerType)
|
||||
|
||||
companion object {
|
||||
val sampleData = LocalProfile(
|
||||
@@ -1976,6 +2011,12 @@ data class LocalProfile(
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable
|
||||
enum class ChatPeerType {
|
||||
@SerialName("human") Human,
|
||||
@SerialName("bot") Bot
|
||||
}
|
||||
|
||||
@Serializable
|
||||
data class UserProfileUpdateSummary(
|
||||
val updateSuccesses: Int,
|
||||
@@ -2030,6 +2071,7 @@ data class GroupInfo (
|
||||
ChatFeature.FullDelete -> fullGroupPreferences.fullDelete.on
|
||||
ChatFeature.Reactions -> fullGroupPreferences.reactions.on
|
||||
ChatFeature.Voice -> fullGroupPreferences.voice.on(membership)
|
||||
ChatFeature.Files -> fullGroupPreferences.files.on(membership)
|
||||
ChatFeature.Calls -> false
|
||||
}
|
||||
override val timedMessagesTTL: Int? get() = with(fullGroupPreferences.timedMessages) { if (on) ttl else null }
|
||||
@@ -2484,7 +2526,14 @@ class NoteFolder(
|
||||
override val nextConnectPrepared get() = false
|
||||
override val profileChangeProhibited get() = false
|
||||
override val incognito get() = false
|
||||
override fun featureEnabled(feature: ChatFeature) = feature == ChatFeature.Voice
|
||||
override fun featureEnabled(feature: ChatFeature) = when (feature) {
|
||||
ChatFeature.TimedMessages -> false
|
||||
ChatFeature.FullDelete -> false
|
||||
ChatFeature.Reactions -> false
|
||||
ChatFeature.Voice -> true
|
||||
ChatFeature.Files -> true
|
||||
ChatFeature.Calls -> false
|
||||
}
|
||||
override val timedMessagesTTL: Int? get() = null
|
||||
override val displayName get() = generalGetString(MR.strings.note_folder_local_display_name)
|
||||
override val fullName get() = ""
|
||||
@@ -4320,19 +4369,12 @@ sealed class MsgChatLink {
|
||||
|
||||
@Serializable
|
||||
class FormattedText(val text: String, val format: Format? = null) {
|
||||
fun link(mode: SimplexLinkMode): String? = when (format) {
|
||||
is Format.Uri -> if (text.startsWith("http://", ignoreCase = true) || text.startsWith("https://", ignoreCase = true)) text else "https://$text"
|
||||
is Format.SimplexLink -> if (mode == SimplexLinkMode.BROWSER) text else format.simplexUri
|
||||
is Format.Email -> "mailto:$text"
|
||||
is Format.Phone -> "tel:$text"
|
||||
else -> null
|
||||
}
|
||||
|
||||
fun viewText(mode: SimplexLinkMode): String =
|
||||
if (format is Format.SimplexLink && mode == SimplexLinkMode.DESCRIPTION) simplexLinkText(format.linkType, format.smpHosts) else text
|
||||
|
||||
fun simplexLinkText(linkType: SimplexLinkType, smpHosts: List<String>): String =
|
||||
"${linkType.description} (${String.format(generalGetString(MR.strings.simplex_link_connection), smpHosts.firstOrNull() ?: "?")})"
|
||||
val linkUri: String? get() =
|
||||
when (format) {
|
||||
is Format.Uri -> text
|
||||
is Format.HyperLink -> format.linkUri
|
||||
else -> null
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun plain(text: String): List<FormattedText> = if (text.isEmpty()) emptyList() else listOf(FormattedText(text))
|
||||
@@ -4348,7 +4390,14 @@ sealed class Format {
|
||||
@Serializable @SerialName("secret") class Secret: Format()
|
||||
@Serializable @SerialName("colored") class Colored(val color: FormatColor): Format()
|
||||
@Serializable @SerialName("uri") class Uri: Format()
|
||||
@Serializable @SerialName("simplexLink") class SimplexLink(val linkType: SimplexLinkType, val simplexUri: String, val smpHosts: List<String>): Format()
|
||||
@Serializable @SerialName("hyperLink") class HyperLink(val showText: String?, val linkUri: String): Format()
|
||||
@Serializable @SerialName("simplexLink") class SimplexLink(val showText: String?, val linkType: SimplexLinkType, val simplexUri: String, val smpHosts: List<String>): Format() {
|
||||
val simplexLinkText: String get() =
|
||||
"${linkType.description} $viaHosts"
|
||||
val viaHosts: String get() =
|
||||
"(${String.format(generalGetString(MR.strings.simplex_link_connection), smpHosts.firstOrNull() ?: "?")})"
|
||||
}
|
||||
@Serializable @SerialName("command") class Command(val commandStr: String): Format()
|
||||
@Serializable @SerialName("mention") class Mention(val memberName: String): Format()
|
||||
@Serializable @SerialName("email") class Email: Format()
|
||||
@Serializable @SerialName("phone") class Phone: Format()
|
||||
@@ -4362,7 +4411,9 @@ sealed class Format {
|
||||
is Secret -> SpanStyle(color = Color.Transparent, background = SecretColor)
|
||||
is Colored -> SpanStyle(color = this.color.uiColor)
|
||||
is Uri -> linkStyle
|
||||
is HyperLink -> linkStyle
|
||||
is SimplexLink -> linkStyle
|
||||
is Command -> SpanStyle(color = MaterialTheme.colors.primary, fontFamily = FontFamily.Monospace)
|
||||
is Mention -> SpanStyle(fontWeight = FontWeight.Medium)
|
||||
is Email -> linkStyle
|
||||
is Phone -> linkStyle
|
||||
|
||||
+78
-6
@@ -19,6 +19,7 @@ import androidx.compose.ui.unit.dp
|
||||
import chat.simplex.common.model.ChatController.getNetCfg
|
||||
import chat.simplex.common.model.ChatController.setNetCfg
|
||||
import chat.simplex.common.model.ChatModel.changingActiveUserMutex
|
||||
import chat.simplex.common.model.GroupFeature.Files
|
||||
import chat.simplex.common.model.MsgContent.MCUnknown
|
||||
import chat.simplex.common.model.SMPProxyFallback.AllowProtected
|
||||
import chat.simplex.common.model.SMPProxyMode.Always
|
||||
@@ -103,6 +104,9 @@ class AppPreferences {
|
||||
val privacyProtectScreen = mkBoolPreference(SHARED_PREFS_PRIVACY_PROTECT_SCREEN, true)
|
||||
val privacyAcceptImages = mkBoolPreference(SHARED_PREFS_PRIVACY_ACCEPT_IMAGES, true)
|
||||
val privacyLinkPreviews = mkBoolPreference(SHARED_PREFS_PRIVACY_LINK_PREVIEWS, true)
|
||||
val privacyLinkPreviewsShowAlert = mkBoolPreference(SHARED_PREFS_PRIVACY_LINK_PREVIEWS_SHOW_ALERT, true)
|
||||
val privacySanitizeLinks = mkBoolPreference(SHARED_PREFS_PRIVACY_SANITIZE_LINKS, true)
|
||||
// TODO remove
|
||||
val privacyChatListOpenLinks = mkEnumPreference(SHARED_PREFS_PRIVACY_CHAT_LIST_OPEN_LINKS, PrivacyChatListOpenLinksMode.ASK) { PrivacyChatListOpenLinksMode.values().firstOrNull { it.name == this } }
|
||||
val simplexLinkMode: SharedPreference<SimplexLinkMode> = mkSafeEnumPreference(SHARED_PREFS_PRIVACY_SIMPLEX_LINK_MODE, SimplexLinkMode.default)
|
||||
val privacyShowChatPreviews = mkBoolPreference(SHARED_PREFS_PRIVACY_SHOW_CHAT_PREVIEWS, true)
|
||||
@@ -368,7 +372,9 @@ class AppPreferences {
|
||||
private const val SHARED_PREFS_PRIVACY_ACCEPT_IMAGES = "PrivacyAcceptImages"
|
||||
private const val SHARED_PREFS_PRIVACY_TRANSFER_IMAGES_INLINE = "PrivacyTransferImagesInline"
|
||||
private const val SHARED_PREFS_PRIVACY_LINK_PREVIEWS = "PrivacyLinkPreviews"
|
||||
private const val SHARED_PREFS_PRIVACY_CHAT_LIST_OPEN_LINKS = "ChatListOpenLinks"
|
||||
private const val SHARED_PREFS_PRIVACY_LINK_PREVIEWS_SHOW_ALERT = "PrivacyLinkPreviewsShowAlert"
|
||||
private const val SHARED_PREFS_PRIVACY_SANITIZE_LINKS = "PrivacySanitizeLinks"
|
||||
private const val SHARED_PREFS_PRIVACY_CHAT_LIST_OPEN_LINKS = "ChatListOpenLinks" // TODO remove
|
||||
private const val SHARED_PREFS_PRIVACY_SIMPLEX_LINK_MODE = "PrivacySimplexLinkMode"
|
||||
private const val SHARED_PREFS_PRIVACY_SHOW_CHAT_PREVIEWS = "PrivacyShowChatPreviews"
|
||||
private const val SHARED_PREFS_PRIVACY_SAVE_LAST_DRAFT = "PrivacySaveLastDraft"
|
||||
@@ -2643,8 +2649,6 @@ object ChatController {
|
||||
if (cItem.isActiveReport) {
|
||||
chatModel.chatsContext.increaseGroupReportsCounter(rhId, cInfo.id)
|
||||
}
|
||||
}
|
||||
withContext(Dispatchers.Main) {
|
||||
chatModel.secondaryChatsContext.value?.addChatItem(rhId, cInfo, cItem)
|
||||
}
|
||||
} else if (cItem.isRcvNew && cInfo.ntfsEnabled(cItem)) {
|
||||
@@ -4630,6 +4634,19 @@ data class ParsedServerAddress (
|
||||
var parseError: String
|
||||
)
|
||||
|
||||
fun parseSanitizeUri(s: String): ParsedUri? {
|
||||
val parsed = chatParseUri(s)
|
||||
return runCatching { json.decodeFromString(ParsedUri.serializer(), parsed) }
|
||||
.onFailure { Log.d(TAG, "parseSanitizeUri decode error: $it") }
|
||||
.getOrNull()
|
||||
}
|
||||
|
||||
@Serializable
|
||||
data class ParsedUri(val uriInfo: UriInfo?, val parseError: String)
|
||||
|
||||
@Serializable
|
||||
data class UriInfo(val scheme: String, val sanitized: String?)
|
||||
|
||||
@Serializable
|
||||
data class NetCfg(
|
||||
val socksProxy: String?,
|
||||
@@ -4881,14 +4898,18 @@ data class FullChatPreferences(
|
||||
val fullDelete: SimpleChatPreference,
|
||||
val reactions: SimpleChatPreference,
|
||||
val voice: SimpleChatPreference,
|
||||
val files: SimpleChatPreference,
|
||||
val calls: SimpleChatPreference,
|
||||
val commands: List<ChatBotCommand>
|
||||
) {
|
||||
fun toPreferences(): ChatPreferences = ChatPreferences(
|
||||
timedMessages = timedMessages,
|
||||
fullDelete = fullDelete,
|
||||
reactions = reactions,
|
||||
voice = voice,
|
||||
calls = calls
|
||||
files = files,
|
||||
calls = calls,
|
||||
commands = commands,
|
||||
)
|
||||
|
||||
companion object {
|
||||
@@ -4897,7 +4918,9 @@ data class FullChatPreferences(
|
||||
fullDelete = SimpleChatPreference(allow = FeatureAllowed.NO),
|
||||
reactions = SimpleChatPreference(allow = FeatureAllowed.YES),
|
||||
voice = SimpleChatPreference(allow = FeatureAllowed.YES),
|
||||
files = SimpleChatPreference(allow = FeatureAllowed.YES),
|
||||
calls = SimpleChatPreference(allow = FeatureAllowed.YES),
|
||||
commands = listOf(),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -4908,7 +4931,9 @@ data class ChatPreferences(
|
||||
val fullDelete: SimpleChatPreference?,
|
||||
val reactions: SimpleChatPreference?,
|
||||
val voice: SimpleChatPreference?,
|
||||
val files: SimpleChatPreference?,
|
||||
val calls: SimpleChatPreference?,
|
||||
val commands: List<ChatBotCommand>?,
|
||||
) {
|
||||
fun setAllowed(feature: ChatFeature, allowed: FeatureAllowed = FeatureAllowed.YES, param: Int? = null): ChatPreferences =
|
||||
when (feature) {
|
||||
@@ -4916,6 +4941,7 @@ data class ChatPreferences(
|
||||
ChatFeature.FullDelete -> this.copy(fullDelete = SimpleChatPreference(allow = allowed))
|
||||
ChatFeature.Reactions -> this.copy(reactions = SimpleChatPreference(allow = allowed))
|
||||
ChatFeature.Voice -> this.copy(voice = SimpleChatPreference(allow = allowed))
|
||||
ChatFeature.Files -> this.copy(files = SimpleChatPreference(allow = allowed))
|
||||
ChatFeature.Calls -> this.copy(calls = SimpleChatPreference(allow = allowed))
|
||||
}
|
||||
|
||||
@@ -4925,7 +4951,9 @@ data class ChatPreferences(
|
||||
fullDelete = SimpleChatPreference(allow = FeatureAllowed.NO),
|
||||
reactions = SimpleChatPreference(allow = FeatureAllowed.YES),
|
||||
voice = SimpleChatPreference(allow = FeatureAllowed.YES),
|
||||
files = SimpleChatPreference(allow = FeatureAllowed.YES),
|
||||
calls = SimpleChatPreference(allow = FeatureAllowed.YES),
|
||||
commands = null,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -4953,6 +4981,12 @@ data class TimedMessagesPreference(
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable
|
||||
sealed class ChatBotCommand {
|
||||
@Serializable @SerialName("command") class Command(val keyword: String, val label: String, val params: String?): ChatBotCommand()
|
||||
@Serializable @SerialName("menu") class Menu(val label: String, val commands: List<ChatBotCommand>): ChatBotCommand()
|
||||
}
|
||||
|
||||
@Serializable
|
||||
data class PresentedServersSummary(
|
||||
val statsStartedAt: Instant,
|
||||
@@ -5203,14 +5237,18 @@ data class ContactUserPreferences(
|
||||
val fullDelete: ContactUserPreference,
|
||||
val reactions: ContactUserPreference,
|
||||
val voice: ContactUserPreference,
|
||||
val files: ContactUserPreference,
|
||||
val calls: ContactUserPreference,
|
||||
val commands: List<ChatBotCommand>?,
|
||||
) {
|
||||
fun toPreferences(): ChatPreferences = ChatPreferences(
|
||||
timedMessages = timedMessages.userPreference.pref,
|
||||
fullDelete = fullDelete.userPreference.pref,
|
||||
reactions = reactions.userPreference.pref,
|
||||
voice = voice.userPreference.pref,
|
||||
calls = calls.userPreference.pref
|
||||
files = files.userPreference.pref,
|
||||
calls = calls.userPreference.pref,
|
||||
commands = commands,
|
||||
)
|
||||
|
||||
companion object {
|
||||
@@ -5235,11 +5273,17 @@ data class ContactUserPreferences(
|
||||
userPreference = ContactUserPref.User(preference = SimpleChatPreference(allow = FeatureAllowed.YES)),
|
||||
contactPreference = SimpleChatPreference(allow = FeatureAllowed.YES)
|
||||
),
|
||||
files = ContactUserPreference(
|
||||
enabled = FeatureEnabled(forUser = true, forContact = true),
|
||||
userPreference = ContactUserPref.User(preference = SimpleChatPreference(allow = FeatureAllowed.YES)),
|
||||
contactPreference = SimpleChatPreference(allow = FeatureAllowed.YES)
|
||||
),
|
||||
calls = ContactUserPreference(
|
||||
enabled = FeatureEnabled(forUser = true, forContact = true),
|
||||
userPreference = ContactUserPref.User(preference = SimpleChatPreference(allow = FeatureAllowed.YES)),
|
||||
contactPreference = SimpleChatPreference(allow = FeatureAllowed.YES)
|
||||
),
|
||||
commands = null,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -5329,6 +5373,7 @@ enum class ChatFeature: Feature {
|
||||
@SerialName("fullDelete") FullDelete,
|
||||
@SerialName("reactions") Reactions,
|
||||
@SerialName("voice") Voice,
|
||||
@SerialName("files") Files,
|
||||
@SerialName("calls") Calls;
|
||||
|
||||
val asymmetric: Boolean get() = when (this) {
|
||||
@@ -5348,6 +5393,7 @@ enum class ChatFeature: Feature {
|
||||
FullDelete -> generalGetString(MR.strings.full_deletion)
|
||||
Reactions -> generalGetString(MR.strings.message_reactions)
|
||||
Voice -> generalGetString(MR.strings.voice_messages)
|
||||
Files -> generalGetString(MR.strings.files_and_media)
|
||||
Calls -> generalGetString(MR.strings.audio_video_calls)
|
||||
}
|
||||
|
||||
@@ -5357,6 +5403,7 @@ enum class ChatFeature: Feature {
|
||||
FullDelete -> painterResource(MR.images.ic_delete_forever)
|
||||
Reactions -> painterResource(MR.images.ic_add_reaction)
|
||||
Voice -> painterResource(MR.images.ic_keyboard_voice)
|
||||
Files -> painterResource(MR.images.ic_draft)
|
||||
Calls -> painterResource(MR.images.ic_call)
|
||||
}
|
||||
|
||||
@@ -5366,6 +5413,7 @@ enum class ChatFeature: Feature {
|
||||
FullDelete -> painterResource(MR.images.ic_delete_forever_filled)
|
||||
Reactions -> painterResource(MR.images.ic_add_reaction_filled)
|
||||
Voice -> painterResource(MR.images.ic_keyboard_voice_filled)
|
||||
Files -> painterResource(MR.images.ic_draft_filled)
|
||||
Calls -> painterResource(MR.images.ic_call_filled)
|
||||
}
|
||||
|
||||
@@ -5386,11 +5434,16 @@ enum class ChatFeature: Feature {
|
||||
FeatureAllowed.YES -> generalGetString(MR.strings.allow_message_reactions_only_if)
|
||||
FeatureAllowed.NO -> generalGetString(MR.strings.prohibit_message_reactions)
|
||||
}
|
||||
Voice -> when (allowed) {
|
||||
Voice -> when (allowed) {
|
||||
FeatureAllowed.ALWAYS -> generalGetString(MR.strings.allow_your_contacts_to_send_voice_messages)
|
||||
FeatureAllowed.YES -> generalGetString(MR.strings.allow_voice_messages_only_if)
|
||||
FeatureAllowed.NO -> generalGetString(MR.strings.prohibit_sending_voice_messages)
|
||||
}
|
||||
Files -> when (allowed) {
|
||||
FeatureAllowed.ALWAYS -> generalGetString(MR.strings.allow_your_contacts_to_send_files_and_media)
|
||||
FeatureAllowed.YES -> generalGetString(MR.strings.allow_files_and_media_only_if)
|
||||
FeatureAllowed.NO -> generalGetString(MR.strings.prohibit_sending_files_and_media)
|
||||
}
|
||||
Calls -> when (allowed) {
|
||||
FeatureAllowed.ALWAYS -> generalGetString(MR.strings.allow_your_contacts_to_call)
|
||||
FeatureAllowed.YES -> generalGetString(MR.strings.allow_calls_only_if)
|
||||
@@ -5424,6 +5477,12 @@ enum class ChatFeature: Feature {
|
||||
enabled.forContact -> generalGetString(MR.strings.only_your_contact_can_send_voice)
|
||||
else -> generalGetString(MR.strings.voice_prohibited_in_this_chat)
|
||||
}
|
||||
Files -> when {
|
||||
enabled.forUser && enabled.forContact -> generalGetString(MR.strings.both_you_and_your_contact_can_send_files)
|
||||
enabled.forUser -> generalGetString(MR.strings.only_you_can_send_files)
|
||||
enabled.forContact -> generalGetString(MR.strings.only_your_contact_can_send_files)
|
||||
else -> generalGetString(MR.strings.files_prohibited_in_this_chat)
|
||||
}
|
||||
Calls -> when {
|
||||
enabled.forUser && enabled.forContact -> generalGetString(MR.strings.both_you_and_your_contact_can_make_calls)
|
||||
enabled.forUser -> generalGetString(MR.strings.only_you_can_make_calls)
|
||||
@@ -5618,7 +5677,9 @@ data class ContactFeaturesAllowed(
|
||||
val fullDelete: ContactFeatureAllowed,
|
||||
val reactions: ContactFeatureAllowed,
|
||||
val voice: ContactFeatureAllowed,
|
||||
val files: ContactFeatureAllowed,
|
||||
val calls: ContactFeatureAllowed,
|
||||
val commands: List<ChatBotCommand>?,
|
||||
) {
|
||||
companion object {
|
||||
val sampleData = ContactFeaturesAllowed(
|
||||
@@ -5627,7 +5688,9 @@ data class ContactFeaturesAllowed(
|
||||
fullDelete = ContactFeatureAllowed.UserDefault(FeatureAllowed.NO),
|
||||
reactions = ContactFeatureAllowed.UserDefault(FeatureAllowed.YES),
|
||||
voice = ContactFeatureAllowed.UserDefault(FeatureAllowed.YES),
|
||||
files = ContactFeatureAllowed.UserDefault(FeatureAllowed.YES),
|
||||
calls = ContactFeatureAllowed.UserDefault(FeatureAllowed.YES),
|
||||
commands = null,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -5641,7 +5704,9 @@ fun contactUserPrefsToFeaturesAllowed(contactUserPreferences: ContactUserPrefere
|
||||
fullDelete = contactUserPrefToFeatureAllowed(contactUserPreferences.fullDelete),
|
||||
reactions = contactUserPrefToFeatureAllowed(contactUserPreferences.reactions),
|
||||
voice = contactUserPrefToFeatureAllowed(contactUserPreferences.voice),
|
||||
files = contactUserPrefToFeatureAllowed(contactUserPreferences.files),
|
||||
calls = contactUserPrefToFeatureAllowed(contactUserPreferences.calls),
|
||||
commands = contactUserPreferences.commands,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -5661,7 +5726,9 @@ fun contactFeaturesAllowedToPrefs(contactFeaturesAllowed: ContactFeaturesAllowed
|
||||
fullDelete = contactFeatureAllowedToPref(contactFeaturesAllowed.fullDelete),
|
||||
reactions = contactFeatureAllowedToPref(contactFeaturesAllowed.reactions),
|
||||
voice = contactFeatureAllowedToPref(contactFeaturesAllowed.voice),
|
||||
files = contactFeatureAllowedToPref(contactFeaturesAllowed.files),
|
||||
calls = contactFeatureAllowedToPref(contactFeaturesAllowed.calls),
|
||||
commands = contactFeaturesAllowed.commands,
|
||||
)
|
||||
|
||||
fun contactFeatureAllowedToPref(contactFeatureAllowed: ContactFeatureAllowed): SimpleChatPreference? =
|
||||
@@ -5697,6 +5764,7 @@ data class FullGroupPreferences(
|
||||
val simplexLinks: RoleGroupPreference,
|
||||
val reports: GroupPreference,
|
||||
val history: GroupPreference,
|
||||
val commands: List<ChatBotCommand>,
|
||||
) {
|
||||
fun toGroupPreferences(): GroupPreferences =
|
||||
GroupPreferences(
|
||||
@@ -5709,6 +5777,7 @@ data class FullGroupPreferences(
|
||||
simplexLinks = simplexLinks,
|
||||
reports = reports,
|
||||
history = history,
|
||||
commands = commands,
|
||||
)
|
||||
|
||||
companion object {
|
||||
@@ -5722,6 +5791,7 @@ data class FullGroupPreferences(
|
||||
simplexLinks = RoleGroupPreference(GroupFeatureEnabled.ON, role = null),
|
||||
reports = GroupPreference(GroupFeatureEnabled.ON),
|
||||
history = GroupPreference(GroupFeatureEnabled.ON),
|
||||
commands = listOf()
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -5737,6 +5807,7 @@ data class GroupPreferences(
|
||||
val simplexLinks: RoleGroupPreference? = null,
|
||||
val reports: GroupPreference? = null,
|
||||
val history: GroupPreference? = null,
|
||||
val commands: List<ChatBotCommand>? = null
|
||||
) {
|
||||
companion object {
|
||||
val sampleData = GroupPreferences(
|
||||
@@ -5749,6 +5820,7 @@ data class GroupPreferences(
|
||||
simplexLinks = RoleGroupPreference(GroupFeatureEnabled.ON, role = null),
|
||||
reports = GroupPreference(GroupFeatureEnabled.ON),
|
||||
history = GroupPreference(GroupFeatureEnabled.ON),
|
||||
commands = null,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ external fun chatRecvMsg(ctrl: ChatCtrl): String
|
||||
external fun chatRecvMsgWait(ctrl: ChatCtrl, timeout: Int): String
|
||||
external fun chatParseMarkdown(str: String): String
|
||||
external fun chatParseServer(str: String): String
|
||||
external fun chatParseUri(str: String): String
|
||||
external fun chatPasswordHash(pwd: String, salt: String): String
|
||||
external fun chatValidName(name: String): String
|
||||
external fun chatJsonLength(str: String): Int
|
||||
|
||||
+47
-33
@@ -102,19 +102,21 @@ fun ChatView(
|
||||
val chat = chatModel.chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }
|
||||
// They have their own iterator inside for a reason to prevent crash "Reading a state that was created after the snapshot..."
|
||||
val remoteHostId = remember { derivedStateOf { chatModel.chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }?.remoteHostId } }
|
||||
val activeChatInfo = remember { derivedStateOf {
|
||||
var chatInfo = chatModel.chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }?.chatInfo
|
||||
val activeChat = remember { derivedStateOf {
|
||||
var chat = chatModel.chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }
|
||||
val chatInfo = chat?.chatInfo
|
||||
if (
|
||||
chatsCtx.secondaryContextFilter is SecondaryContextFilter.GroupChatScopeContext
|
||||
&& chat != null
|
||||
&& chatInfo is ChatInfo.Group
|
||||
) {
|
||||
val scopeInfo = chatsCtx.secondaryContextFilter.groupScopeInfo
|
||||
chatInfo = chatInfo.copy(groupChatScope = scopeInfo)
|
||||
chat = chat.copy(chatInfo = chatInfo.copy(groupChatScope = scopeInfo))
|
||||
}
|
||||
chatInfo
|
||||
chat
|
||||
} }
|
||||
val user = chatModel.currentUser.value
|
||||
val chatInfo = activeChatInfo.value
|
||||
val chatInfo = activeChat.value?.chatInfo
|
||||
if (chat == null || chatInfo == null || user == null) {
|
||||
LaunchedEffect(Unit) {
|
||||
chatModel.chatId.value = null
|
||||
@@ -138,6 +140,7 @@ fun ChatView(
|
||||
val attachmentBottomSheetState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden)
|
||||
val scope = rememberCoroutineScope()
|
||||
val selectedChatItems = rememberSaveable { mutableStateOf(null as Set<Long>?) }
|
||||
val showCommandsMenu = rememberSaveable { mutableStateOf(false) }
|
||||
if (appPlatform.isAndroid) {
|
||||
DisposableEffect(Unit) {
|
||||
onDispose {
|
||||
@@ -186,7 +189,6 @@ fun ChatView(
|
||||
chatsCtx.chats.value.firstOrNull { chat -> chat.chatInfo.id == staleChatId.value }?.chatStats?.unreadCount ?: 0
|
||||
}
|
||||
}
|
||||
val reportsCount = reportsCount(chatInfo.id)
|
||||
val clipboard = LocalClipboardManager.current
|
||||
CompositionLocalProvider(
|
||||
LocalAppBarHandler provides rememberAppBarHandler(chatInfo.id, keyboardCoversBar = false),
|
||||
@@ -214,7 +216,7 @@ fun ChatView(
|
||||
ChatLayout(
|
||||
chatsCtx = chatsCtx,
|
||||
remoteHostId = remoteHostId,
|
||||
chatInfo = activeChatInfo,
|
||||
chat = activeChat,
|
||||
unreadCount,
|
||||
composeState,
|
||||
composeView = { focusRequester ->
|
||||
@@ -237,7 +239,7 @@ fun ChatView(
|
||||
)
|
||||
}
|
||||
ComposeView(
|
||||
rhId = remoteHostId.value, chatModel, chatsCtx, Chat(remoteHostId = chatRh, chatInfo = chatInfo, chatItems = emptyList()), composeState, attachmentOption,
|
||||
rhId = remoteHostId.value, chatModel, chatsCtx, Chat(remoteHostId = chatRh, chatInfo = chatInfo, chatItems = emptyList()), composeState, showCommandsMenu, attachmentOption,
|
||||
showChooseAttachment = { scope.launch { attachmentBottomSheetState.show() } },
|
||||
focusRequester = focusRequester
|
||||
)
|
||||
@@ -347,7 +349,7 @@ fun ChatView(
|
||||
ModalManager.end.showCustomModal { close ->
|
||||
val appBar = remember { mutableStateOf(null as @Composable (BoxScope.() -> Unit)?) }
|
||||
ModalView(close, appBar = appBar.value) {
|
||||
val chatInfo = remember { activeChatInfo }.value
|
||||
val chatInfo = remember { activeChat }.value?.chatInfo
|
||||
if (chatInfo is ChatInfo.Direct) {
|
||||
var contactInfo: Pair<ConnectionStats?, Profile?>? by remember { mutableStateOf(preloadedContactInfo) }
|
||||
var code: String? by remember { mutableStateOf(preloadedCode) }
|
||||
@@ -377,7 +379,7 @@ fun ChatView(
|
||||
}
|
||||
}
|
||||
LaunchedEffect(Unit) {
|
||||
snapshotFlow { activeChatInfo.value?.id }
|
||||
snapshotFlow { activeChat.value?.id }
|
||||
.drop(1)
|
||||
.collect {
|
||||
appBar.value = null
|
||||
@@ -389,37 +391,37 @@ fun ChatView(
|
||||
}
|
||||
},
|
||||
showReports = {
|
||||
val info = activeChatInfo.value ?: return@ChatLayout
|
||||
val cInfo = activeChat.value?.chatInfo ?: return@ChatLayout
|
||||
if (ModalManager.end.hasModalsOpen()) {
|
||||
ModalManager.end.closeModals()
|
||||
return@ChatLayout
|
||||
}
|
||||
hideKeyboard(view)
|
||||
scope.launch {
|
||||
showGroupReportsView(staleChatId, scrollToItemId, info)
|
||||
showGroupReportsView(staleChatId, scrollToItemId, cInfo)
|
||||
}
|
||||
},
|
||||
showSupportChats = {
|
||||
val info = activeChatInfo.value ?: return@ChatLayout
|
||||
val cInfo = activeChat.value?.chatInfo ?: return@ChatLayout
|
||||
if (ModalManager.end.hasModalsOpen()) {
|
||||
ModalManager.end.closeModals()
|
||||
return@ChatLayout
|
||||
}
|
||||
hideKeyboard(view)
|
||||
scope.launch {
|
||||
if (info is ChatInfo.Group && info.groupInfo.membership.memberRole >= GroupMemberRole.Moderator) {
|
||||
if (cInfo is ChatInfo.Group && cInfo.groupInfo.membership.memberRole >= GroupMemberRole.Moderator) {
|
||||
ModalManager.end.showCustomModal { close ->
|
||||
MemberSupportView(
|
||||
chatRh,
|
||||
chat,
|
||||
info.groupInfo,
|
||||
cInfo.groupInfo,
|
||||
scrollToItemId,
|
||||
close
|
||||
)
|
||||
}
|
||||
} else if (info is ChatInfo.Group) {
|
||||
} else if (cInfo is ChatInfo.Group) {
|
||||
val scopeInfo = GroupChatScopeInfo.MemberSupport(groupMember_ = null)
|
||||
val supportChatInfo = ChatInfo.Group(info.groupInfo, groupChatScope = scopeInfo)
|
||||
val supportChatInfo = ChatInfo.Group(cInfo.groupInfo, groupChatScope = scopeInfo)
|
||||
scope.launch {
|
||||
showMemberSupportChatView(
|
||||
chatModel.chatId,
|
||||
@@ -723,7 +725,8 @@ fun ChatView(
|
||||
onComposed,
|
||||
developerTools = chatModel.controller.appPrefs.developerTools.get(),
|
||||
showViaProxy = chatModel.controller.appPrefs.showSentViaProxy.get(),
|
||||
showSearch = showSearch
|
||||
showSearch = showSearch,
|
||||
showCommandsMenu = showCommandsMenu
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -768,9 +771,7 @@ private fun connectingText(chatInfo: ChatInfo): String? {
|
||||
&& !chatInfo.contact.sendMsgToConnect
|
||||
&& !chatInfo.contact.nextAcceptContactRequest
|
||||
) {
|
||||
if (chatInfo.contact.preparedContact?.uiConnLinkType == ConnectionMode.Con) {
|
||||
generalGetString(MR.strings.contact_should_accept)
|
||||
} else if (chatInfo.contact.contactGroupMemberId != null) {
|
||||
if ((chatInfo.contact.preparedContact?.uiConnLinkType == ConnectionMode.Con && !chatInfo.contact.isBot) || chatInfo.contact.contactGroupMemberId != null) {
|
||||
generalGetString(MR.strings.contact_should_accept)
|
||||
} else {
|
||||
generalGetString(MR.strings.contact_connection_pending)
|
||||
@@ -807,7 +808,7 @@ fun startChatCall(remoteHostId: Long?, chatInfo: ChatInfo, media: CallMediaType)
|
||||
fun ChatLayout(
|
||||
chatsCtx: ChatModel.ChatsContext,
|
||||
remoteHostId: State<Long?>,
|
||||
chatInfo: State<ChatInfo?>,
|
||||
chat: State<Chat?>,
|
||||
unreadCount: State<Int>,
|
||||
composeState: MutableState<ComposeState>,
|
||||
composeView: (@Composable (FocusRequester?) -> Unit),
|
||||
@@ -854,8 +855,10 @@ fun ChatLayout(
|
||||
onComposed: suspend (chatId: String) -> Unit,
|
||||
developerTools: Boolean,
|
||||
showViaProxy: Boolean,
|
||||
showSearch: MutableState<Boolean>
|
||||
showSearch: MutableState<Boolean>,
|
||||
showCommandsMenu: MutableState<Boolean>
|
||||
) {
|
||||
val chatInfo = remember { derivedStateOf { chat.value?.chatInfo } }
|
||||
val scope = rememberCoroutineScope()
|
||||
val attachmentDisabled = remember { derivedStateOf { composeState.value.attachmentDisabled } }
|
||||
Box(
|
||||
@@ -886,19 +889,20 @@ fun ChatLayout(
|
||||
val composeViewHeight = remember { mutableStateOf(0.dp) }
|
||||
Box(Modifier.fillMaxSize().chatViewBackgroundModifier(MaterialTheme.colors, MaterialTheme.wallpaper, LocalAppBarHandler.current?.backgroundGraphicsLayerSize, LocalAppBarHandler.current?.backgroundGraphicsLayer, drawWallpaper = chatsCtx.secondaryContextFilter == null)) {
|
||||
val remoteHostId = remember { remoteHostId }.value
|
||||
val chatInfo = remember { chatInfo }.value
|
||||
val chat = remember { chat }.value
|
||||
val chatInfo = chat?.chatInfo
|
||||
val oneHandUI = remember { appPrefs.oneHandUI.state }
|
||||
val chatBottomBar = remember { appPrefs.chatBottomBar.state }
|
||||
val composeViewFocusRequester = remember { if (appPlatform.isDesktop) FocusRequester() else null }
|
||||
AdaptingBottomPaddingLayout(Modifier, CHAT_COMPOSE_LAYOUT_ID, composeViewHeight) {
|
||||
if (chatInfo != null) {
|
||||
if (chat != null) {
|
||||
Box(Modifier.fillMaxSize(), contentAlignment = Alignment.BottomCenter) {
|
||||
// disables scrolling to top of chat item on click inside the bubble
|
||||
CompositionLocalProvider(LocalBringIntoViewSpec provides object : BringIntoViewSpec {
|
||||
override fun calculateScrollDistance(offset: Float, size: Float, containerSize: Float): Float = 0f
|
||||
}) {
|
||||
ChatItemsList(
|
||||
chatsCtx, remoteHostId, chatInfo, unreadCount, composeState, composeViewHeight, searchValue,
|
||||
chatsCtx, remoteHostId, chat, unreadCount, composeState, composeViewHeight, searchValue,
|
||||
useLinkPreviews, linkMode, scrollToItemId, selectedChatItems, showMemberInfo, showChatInfo = info, loadMessages, deleteMessage, deleteMessages, archiveReports,
|
||||
receiveFile, cancelFile, joinGroup, acceptCall, acceptFeature, openDirectChat, forwardItem,
|
||||
updateContactStats, updateMemberStats, syncContactConnection, syncMemberConnection, findModelChat, findModelMember,
|
||||
@@ -920,6 +924,11 @@ fun ChatLayout(
|
||||
)
|
||||
}
|
||||
}
|
||||
if (chatInfo != null && chatInfo.menuCommands.isNotEmpty()) {
|
||||
Column(Modifier.align(Alignment.BottomStart).padding(bottom = composeViewHeight.value)) {
|
||||
CommandsMenuView(chatsCtx, chat, composeState, showCommandsMenu)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (chatsCtx.contentTag == MsgContentTag.Report) {
|
||||
@@ -1362,7 +1371,7 @@ private var reportsListState: LazyListState? = null
|
||||
fun BoxScope.ChatItemsList(
|
||||
chatsCtx: ChatModel.ChatsContext,
|
||||
remoteHostId: Long?,
|
||||
chatInfo: ChatInfo,
|
||||
chat: Chat,
|
||||
unreadCount: State<Int>,
|
||||
composeState: MutableState<ComposeState>,
|
||||
composeViewHeight: State<Dp>,
|
||||
@@ -1399,6 +1408,7 @@ fun BoxScope.ChatItemsList(
|
||||
developerTools: Boolean,
|
||||
showViaProxy: Boolean
|
||||
) {
|
||||
val chatInfo = chat.chatInfo
|
||||
val loadingTopItems = remember { mutableStateOf(false) }
|
||||
val loadingBottomItems = remember { mutableStateOf(false) }
|
||||
// just for changing local var here based on request
|
||||
@@ -1561,7 +1571,7 @@ fun BoxScope.ChatItemsList(
|
||||
highlightedItems.value = setOf()
|
||||
}
|
||||
}
|
||||
ChatItemView(chatsCtx, remoteHostId, chatInfo, cItem, composeState, provider, useLinkPreviews = useLinkPreviews, linkMode = linkMode, revealed = revealed, highlighted = highlighted, hoveredItemId = hoveredItemId, range = range, searchIsNotBlank = searchValueIsNotBlank, fillMaxWidth = fillMaxWidth, selectedChatItems = selectedChatItems, selectChatItem = { selectUnselectChatItem(true, cItem, revealed, selectedChatItems, reversedChatItems) }, deleteMessage = deleteMessage, deleteMessages = deleteMessages, archiveReports = archiveReports, receiveFile = receiveFile, cancelFile = cancelFile, joinGroup = joinGroup, acceptCall = acceptCall, acceptFeature = acceptFeature, openDirectChat = openDirectChat, forwardItem = forwardItem, updateContactStats = updateContactStats, updateMemberStats = updateMemberStats, syncContactConnection = syncContactConnection, syncMemberConnection = syncMemberConnection, findModelChat = findModelChat, findModelMember = findModelMember, scrollToItem = scrollToItem, scrollToItemId = scrollToItemId, scrollToQuotedItemFromItem = scrollToQuotedItemFromItem, setReaction = setReaction, showItemDetails = showItemDetails, reveal = reveal, showMemberInfo = showMemberInfo, showChatInfo = showChatInfo, developerTools = developerTools, showViaProxy = showViaProxy, itemSeparation = itemSeparation, showTimestamp = itemSeparation.timestamp)
|
||||
ChatItemView(chatsCtx, remoteHostId, chat, cItem, composeState, provider, useLinkPreviews = useLinkPreviews, linkMode = linkMode, revealed = revealed, highlighted = highlighted, hoveredItemId = hoveredItemId, range = range, searchIsNotBlank = searchValueIsNotBlank, fillMaxWidth = fillMaxWidth, selectedChatItems = selectedChatItems, selectChatItem = { selectUnselectChatItem(true, cItem, revealed, selectedChatItems, reversedChatItems) }, deleteMessage = deleteMessage, deleteMessages = deleteMessages, archiveReports = archiveReports, receiveFile = receiveFile, cancelFile = cancelFile, joinGroup = joinGroup, acceptCall = acceptCall, acceptFeature = acceptFeature, openDirectChat = openDirectChat, forwardItem = forwardItem, updateContactStats = updateContactStats, updateMemberStats = updateMemberStats, syncContactConnection = syncContactConnection, syncMemberConnection = syncMemberConnection, findModelChat = findModelChat, findModelMember = findModelMember, scrollToItem = scrollToItem, scrollToItemId = scrollToItemId, scrollToQuotedItemFromItem = scrollToQuotedItemFromItem, setReaction = setReaction, showItemDetails = showItemDetails, reveal = reveal, showMemberInfo = showMemberInfo, showChatInfo = showChatInfo, developerTools = developerTools, showViaProxy = showViaProxy, itemSeparation = itemSeparation, showTimestamp = itemSeparation.timestamp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1769,10 +1779,12 @@ fun BoxScope.ChatItemsList(
|
||||
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)
|
||||
ConnectionMode.Con -> generalGetString(if (contact.isBot) MR.strings.chat_banner_connect_to_use_bot else MR.strings.chat_banner_send_request_to_connect)
|
||||
}
|
||||
} else if (contact.nextAcceptContactRequest) {
|
||||
generalGetString(MR.strings.chat_banner_accept_contact_request)
|
||||
} else if (contact.isBot) {
|
||||
generalGetString(MR.strings.chat_banner_bot)
|
||||
} else {
|
||||
generalGetString(MR.strings.chat_banner_your_contact)
|
||||
}
|
||||
@@ -3304,7 +3316,7 @@ fun PreviewChatLayout() {
|
||||
ChatLayout(
|
||||
chatsCtx = ChatModel.ChatsContext(secondaryContextFilter = null),
|
||||
remoteHostId = remember { mutableStateOf(null) },
|
||||
chatInfo = remember { mutableStateOf(ChatInfo.Direct.sampleData) },
|
||||
chat = remember { mutableStateOf(Chat.sampleData) },
|
||||
unreadCount = unreadCount,
|
||||
composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = true)) },
|
||||
composeView = { _ -> },
|
||||
@@ -3351,7 +3363,8 @@ fun PreviewChatLayout() {
|
||||
onComposed = {},
|
||||
developerTools = false,
|
||||
showViaProxy = false,
|
||||
showSearch = remember { mutableStateOf(false) }
|
||||
showSearch = remember { mutableStateOf(false) },
|
||||
showCommandsMenu = remember { mutableStateOf(false) }
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -3383,7 +3396,7 @@ fun PreviewGroupChatLayout() {
|
||||
ChatLayout(
|
||||
chatsCtx = ChatModel.ChatsContext(secondaryContextFilter = null),
|
||||
remoteHostId = remember { mutableStateOf(null) },
|
||||
chatInfo = remember { mutableStateOf(ChatInfo.Direct.sampleData) },
|
||||
chat = remember { mutableStateOf(Chat.sampleData) },
|
||||
unreadCount = unreadCount,
|
||||
composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = true)) },
|
||||
composeView = { _ -> },
|
||||
@@ -3430,7 +3443,8 @@ fun PreviewGroupChatLayout() {
|
||||
onComposed = {},
|
||||
developerTools = false,
|
||||
showViaProxy = false,
|
||||
showSearch = remember { mutableStateOf(false) }
|
||||
showSearch = remember { mutableStateOf(false) },
|
||||
showCommandsMenu = remember { mutableStateOf(false) }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+244
@@ -0,0 +1,244 @@
|
||||
package chat.simplex.common.views.chat
|
||||
|
||||
import androidx.compose.animation.core.Animatable
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.lazy.itemsIndexed
|
||||
import androidx.compose.material.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.layout.layout
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.text.TextRange
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.IntOffset
|
||||
import androidx.compose.ui.unit.dp
|
||||
import chat.simplex.common.model.*
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.ui.theme.DEFAULT_PADDING
|
||||
import chat.simplex.common.ui.theme.DEFAULT_PADDING_HALF
|
||||
import chat.simplex.common.views.chat.group.*
|
||||
import chat.simplex.common.views.chat.item.sendCommandMsg
|
||||
import chat.simplex.common.views.helpers.commandMenuAnimSpec
|
||||
import chat.simplex.res.MR
|
||||
import dev.icerock.moko.resources.compose.painterResource
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
private val COMMAND_MENU_ROW_SIZE = 48.dp
|
||||
private val MAX_COMMAND_MENU_HEIGHT = COMMAND_MENU_ROW_SIZE * 6 - 8.dp
|
||||
|
||||
@Composable
|
||||
fun CommandsMenuView(
|
||||
chatsCtx: ChatModel.ChatsContext,
|
||||
chat: Chat,
|
||||
composeState: MutableState<ComposeState>,
|
||||
showCommandsMenu: MutableState<Boolean>
|
||||
) {
|
||||
val maxHeightInPx = with(LocalDensity.current) { windowHeight().toPx() }
|
||||
val offsetY = remember { Animatable(maxHeightInPx) }
|
||||
val scope = rememberCoroutineScope()
|
||||
|
||||
val currentCommands = remember { mutableStateOf<List<ChatBotCommand>>(emptyList()) }
|
||||
val menuTreeBackPath = remember { mutableStateOf<List<Pair<String, List<ChatBotCommand>>>>(emptyList()) }
|
||||
|
||||
fun filterShownCommands(commands: List<ChatBotCommand>, msg: CharSequence): List<ChatBotCommand> {
|
||||
val cmds = mutableListOf<ChatBotCommand>()
|
||||
for (cmd in commands) {
|
||||
when (cmd) {
|
||||
is ChatBotCommand.Command ->
|
||||
if (cmd.keyword.startsWith(msg)) {
|
||||
cmds.add(cmd)
|
||||
}
|
||||
is ChatBotCommand.Menu ->
|
||||
cmds.addAll(filterShownCommands(cmd.commands, msg))
|
||||
}
|
||||
}
|
||||
return cmds
|
||||
}
|
||||
|
||||
suspend fun closeCommandsMenu() {
|
||||
showCommandsMenu.value = false
|
||||
currentCommands.value = emptyList()
|
||||
menuTreeBackPath.value = emptyList()
|
||||
if (offsetY.value != 0f) {
|
||||
return
|
||||
}
|
||||
offsetY.animateTo(
|
||||
targetValue = maxHeightInPx,
|
||||
animationSpec = commandMenuAnimSpec()
|
||||
)
|
||||
}
|
||||
|
||||
fun messageChanged(message: String) {
|
||||
val msg = message.trim()
|
||||
menuTreeBackPath.value = emptyList()
|
||||
if (msg == "/") {
|
||||
currentCommands.value = chat.chatInfo.menuCommands
|
||||
} else if (msg.startsWith("/")) {
|
||||
currentCommands.value = filterShownCommands(chat.chatInfo.menuCommands, msg.drop(1))
|
||||
} else {
|
||||
scope.launch { closeCommandsMenu() }
|
||||
}
|
||||
}
|
||||
|
||||
LaunchedEffect(currentCommands.value.isNotEmpty()) {
|
||||
if (currentCommands.value.isNotEmpty()) {
|
||||
offsetY.animateTo(
|
||||
targetValue = 0f,
|
||||
animationSpec = commandMenuAnimSpec()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
LaunchedEffect(composeState.value.message) {
|
||||
messageChanged(composeState.value.message.text)
|
||||
}
|
||||
|
||||
LaunchedEffect(showCommandsMenu.value) {
|
||||
if (showCommandsMenu.value) {
|
||||
currentCommands.value = chat.chatInfo.menuCommands
|
||||
menuTreeBackPath.value = emptyList()
|
||||
} else {
|
||||
closeCommandsMenu()
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun MenuLabelRow(prev: Pair<String, List<ChatBotCommand>>) {
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(COMMAND_MENU_ROW_SIZE)
|
||||
.clickable {
|
||||
if (menuTreeBackPath.value.isNotEmpty()) {
|
||||
currentCommands.value = menuTreeBackPath.value.last().second
|
||||
menuTreeBackPath.value = menuTreeBackPath.value.dropLast(1)
|
||||
}
|
||||
},
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Row(Modifier.padding(horizontal = DEFAULT_PADDING), verticalAlignment = Alignment.CenterVertically) {
|
||||
Icon(
|
||||
painterResource(MR.images.ic_arrow_back_ios_new),
|
||||
contentDescription = null,
|
||||
tint = MaterialTheme.colors.secondary
|
||||
)
|
||||
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
|
||||
Text(
|
||||
text = prev.first,
|
||||
style = MaterialTheme.typography.body2,
|
||||
textAlign = TextAlign.Center,
|
||||
fontWeight = FontWeight.Medium,
|
||||
maxLines = 1,
|
||||
modifier = Modifier.weight(1f),
|
||||
overflow = TextOverflow.Ellipsis
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun CommandRow(cmd: ChatBotCommand) {
|
||||
when (cmd) {
|
||||
is ChatBotCommand.Command -> {
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(COMMAND_MENU_ROW_SIZE)
|
||||
.clickable {
|
||||
if (cmd.params != null) {
|
||||
val msg = "/${cmd.keyword} ${cmd.params}"
|
||||
composeState.value = ComposeState(message = ComposeMessage(msg, TextRange(msg.length)), useLinkPreviews = true)
|
||||
} else {
|
||||
composeState.value = ComposeState(message = ComposeMessage(), useLinkPreviews = true)
|
||||
sendCommandMsg(chatsCtx, chat,"/${cmd.keyword}")
|
||||
}
|
||||
scope.launch { closeCommandsMenu() }
|
||||
},
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Row(Modifier.padding(horizontal = DEFAULT_PADDING), verticalAlignment = Alignment.CenterVertically) {
|
||||
Text(
|
||||
text = cmd.label,
|
||||
style = MaterialTheme.typography.body1,
|
||||
maxLines = 1,
|
||||
modifier = Modifier.weight(1f),
|
||||
textAlign = TextAlign.Start,
|
||||
overflow = TextOverflow.Ellipsis
|
||||
)
|
||||
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
|
||||
Text(
|
||||
text = "/${cmd.keyword}",
|
||||
style = MaterialTheme.typography.body2,
|
||||
maxLines = 1,
|
||||
color = MaterialTheme.colors.secondary
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
is ChatBotCommand.Menu ->
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(COMMAND_MENU_ROW_SIZE)
|
||||
.clickable {
|
||||
menuTreeBackPath.value += Pair(cmd.label, currentCommands.value)
|
||||
currentCommands.value = cmd.commands
|
||||
},
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Row(Modifier.padding(horizontal = DEFAULT_PADDING), verticalAlignment = Alignment.CenterVertically) {
|
||||
Text(
|
||||
text = cmd.label,
|
||||
style = MaterialTheme.typography.body1,
|
||||
fontWeight = FontWeight.Medium,
|
||||
maxLines = 1,
|
||||
modifier = Modifier.weight(1f),
|
||||
overflow = TextOverflow.Ellipsis
|
||||
)
|
||||
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
|
||||
Icon(
|
||||
painterResource(MR.images.ic_chevron_right),
|
||||
contentDescription = null,
|
||||
tint = MaterialTheme.colors.secondary
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.offset { IntOffset(0, offsetY.value.toInt()) }
|
||||
.clickable(indication = null, interactionSource = remember { MutableInteractionSource() }) {
|
||||
scope.launch { closeCommandsMenu() }
|
||||
},
|
||||
contentAlignment = Alignment.BottomStart
|
||||
) {
|
||||
LazyColumnWithScrollBarNoAppBar(
|
||||
Modifier
|
||||
.heightIn(max = MAX_COMMAND_MENU_HEIGHT)
|
||||
.background(MaterialTheme.colors.surface),
|
||||
maxHeight = remember { mutableStateOf(MAX_COMMAND_MENU_HEIGHT) },
|
||||
containerAlignment = Alignment.BottomEnd
|
||||
) {
|
||||
itemsIndexed(currentCommands.value, key = { i, cmd -> "$i ${cmd.hashCode()}" }) { i, command ->
|
||||
if (i == 0) {
|
||||
val prev = menuTreeBackPath.value.lastOrNull()
|
||||
if (prev != null) {
|
||||
Divider()
|
||||
MenuLabelRow(prev)
|
||||
}
|
||||
}
|
||||
Divider()
|
||||
Box(Modifier.fillMaxWidth()) { CommandRow(command) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+113
-20
@@ -17,7 +17,9 @@ import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.ImageBitmap
|
||||
import androidx.compose.ui.graphics.painter.Painter
|
||||
import androidx.compose.ui.text.TextRange
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.font.FontStyle
|
||||
import androidx.compose.ui.text.style.TextDecoration
|
||||
import dev.icerock.moko.resources.compose.painterResource
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
@@ -345,6 +347,7 @@ fun ComposeView(
|
||||
chatsCtx: ChatModel.ChatsContext,
|
||||
chat: Chat,
|
||||
composeState: MutableState<ComposeState>,
|
||||
showCommandsMenu: MutableState<Boolean>,
|
||||
attachmentOption: MutableState<AttachmentOption?>,
|
||||
showChooseAttachment: () -> Unit,
|
||||
focusRequester: FocusRequester?,
|
||||
@@ -353,16 +356,21 @@ fun ComposeView(
|
||||
fun isSimplexLink(link: String): Boolean =
|
||||
link.startsWith("https://simplex.chat", true) || link.startsWith("http://simplex.chat", true)
|
||||
|
||||
fun getSimplexLink(parsedMsg: List<FormattedText>?): Pair<String?, Boolean> {
|
||||
fun getMessageLinks(parsedMsg: List<FormattedText>?): Pair<String?, Boolean> {
|
||||
if (parsedMsg == null) return null to false
|
||||
val link = parsedMsg.firstOrNull { ft -> ft.format is Format.Uri && !cancelledLinks.contains(ft.text) && !isSimplexLink(ft.text) }
|
||||
val simplexLink = parsedMsg.any { ft -> ft.format is Format.SimplexLink }
|
||||
return link?.text to simplexLink
|
||||
for (ft in parsedMsg) {
|
||||
val link = ft.linkUri
|
||||
if (link != null && !cancelledLinks.contains(link) && !isSimplexLink(link)) {
|
||||
return link to simplexLink
|
||||
}
|
||||
}
|
||||
return null to simplexLink
|
||||
}
|
||||
|
||||
val linkUrl = rememberSaveable { mutableStateOf<String?>(null) }
|
||||
// default value parsed because of draft
|
||||
val hasSimplexLink = rememberSaveable { mutableStateOf(getSimplexLink(parseToMarkdown(composeState.value.message.text)).second) }
|
||||
val hasSimplexLink = rememberSaveable { mutableStateOf(getMessageLinks(parseToMarkdown(composeState.value.message.text)).second) }
|
||||
val prevLinkUrl = rememberSaveable { mutableStateOf<String?>(null) }
|
||||
val pendingLinkUrl = rememberSaveable { mutableStateOf<String?>(null) }
|
||||
val useLinkPreviews = chatModel.controller.appPrefs.privacyLinkPreviews.get()
|
||||
@@ -379,6 +387,7 @@ fun ComposeView(
|
||||
if (wait != null) delay(wait)
|
||||
val lp = getLinkPreview(url)
|
||||
if (lp != null && pendingLinkUrl.value == url) {
|
||||
chatModel.controller.appPrefs.privacyLinkPreviewsShowAlert.set(false) // to avoid showing alert to current users, show alert in v6.5
|
||||
composeState.value = composeState.value.copy(preview = ComposePreview.CLinkPreview(lp))
|
||||
pendingLinkUrl.value = null
|
||||
} else if (pendingLinkUrl.value == url) {
|
||||
@@ -391,7 +400,7 @@ fun ComposeView(
|
||||
|
||||
fun showLinkPreview(parsedMessage: List<FormattedText>?) {
|
||||
prevLinkUrl.value = linkUrl.value
|
||||
val linkParsed = getSimplexLink(parsedMessage)
|
||||
val linkParsed = getMessageLinks(parsedMessage)
|
||||
linkUrl.value = linkParsed.first
|
||||
hasSimplexLink.value = linkParsed.second
|
||||
val url = linkUrl.value
|
||||
@@ -483,7 +492,7 @@ fun ComposeView(
|
||||
if (!chatItems.isNullOrEmpty()) {
|
||||
chatItems.forEach { aChatItem ->
|
||||
withContext(Dispatchers.Main) {
|
||||
chatsCtx.addChatItem(chat.remoteHostId, cInfo, aChatItem.chatItem)
|
||||
chatsCtx.addChatItem(chat.remoteHostId, aChatItem.chatInfo, aChatItem.chatItem)
|
||||
}
|
||||
}
|
||||
return chatItems.first().chatItem
|
||||
@@ -498,7 +507,7 @@ fun ComposeView(
|
||||
return when (val composePreview = composeState.value.preview) {
|
||||
is ComposePreview.CLinkPreview -> {
|
||||
val parsedMsg = parseToMarkdown(msgText)
|
||||
val url = getSimplexLink(parsedMsg).first
|
||||
val url = getMessageLinks(parsedMsg).first
|
||||
val lp = composePreview.linkPreview
|
||||
if (lp != null && url == lp.uri) {
|
||||
MsgContent.MCLink(msgText, preview = lp)
|
||||
@@ -593,7 +602,6 @@ fun ComposeView(
|
||||
}
|
||||
|
||||
suspend fun sendMessageAsync(text: String?, live: Boolean, ttl: Int?): List<ChatItem>? {
|
||||
val cInfo = chat.chatInfo
|
||||
val cs = composeState.value
|
||||
var sent: List<ChatItem>?
|
||||
var lastMessageFailedToSend: ComposeState? = null
|
||||
@@ -859,9 +867,53 @@ fun ComposeView(
|
||||
}
|
||||
}
|
||||
|
||||
fun sanitizeMessage(parsedMsg: List<FormattedText>): Triple<String, List<FormattedText>, Int?> {
|
||||
var pos = 0
|
||||
var updatedMsg = ""
|
||||
var sanitizedPos: Int? = null
|
||||
val updatedParsedMsg = parsedMsg.map { ft ->
|
||||
var updated = ft
|
||||
when(ft.format) {
|
||||
is Format.Uri -> {
|
||||
val sanitized = parseSanitizeUri(ft.text)?.uriInfo?.sanitized
|
||||
if (sanitized != null) {
|
||||
updated = FormattedText(text = sanitized, format = Format.Uri())
|
||||
pos += updated.text.count()
|
||||
sanitizedPos = pos
|
||||
}
|
||||
}
|
||||
is Format.HyperLink -> {
|
||||
val sanitized = parseSanitizeUri(ft.format.linkUri)?.uriInfo?.sanitized
|
||||
if (sanitized != null) {
|
||||
val updatedText = if (ft.format.showText == null) sanitized else "[${ft.format.showText}]($sanitized)"
|
||||
updated = FormattedText(text = updatedText, format = Format.HyperLink(showText = ft.format.showText, linkUri = sanitized))
|
||||
pos += updated.text.count()
|
||||
sanitizedPos = pos
|
||||
}
|
||||
}
|
||||
else ->
|
||||
pos += ft.text.count()
|
||||
}
|
||||
updatedMsg += updated.text
|
||||
updated
|
||||
}
|
||||
return Triple(updatedMsg, updatedParsedMsg, sanitizedPos)
|
||||
}
|
||||
|
||||
fun onMessageChange(s: ComposeMessage) {
|
||||
val parsedMessage = parseToMarkdown(s.text)
|
||||
composeState.value = composeState.value.copy(message = s, parsedMessage = parsedMessage ?: FormattedText.plain(s.text))
|
||||
var parsedMessage = parseToMarkdown(s.text)
|
||||
if (chatModel.controller.appPrefs.privacySanitizeLinks.state.value && parsedMessage != null) {
|
||||
val (updatedMsg, updatedParsedMsg, sanitizedPos) = sanitizeMessage(parsedMessage)
|
||||
if (sanitizedPos == null) {
|
||||
composeState.value = composeState.value.copy(message = s, parsedMessage = parsedMessage)
|
||||
} else {
|
||||
val message = if (sanitizedPos < s.selection.start) s.copy(text = updatedMsg) else ComposeMessage(updatedMsg, TextRange(sanitizedPos, sanitizedPos))
|
||||
composeState.value = composeState.value.copy(message = message, parsedMessage = updatedParsedMsg)
|
||||
parsedMessage = updatedParsedMsg
|
||||
}
|
||||
} else {
|
||||
composeState.value = composeState.value.copy(message = s, parsedMessage = parsedMessage ?: FormattedText.plain(s.text))
|
||||
}
|
||||
if (isShortEmoji(s.text)) {
|
||||
textStyle.value = if (s.text.codePoints().count() < 4) largeEmojiFont else mediumEmojiFont
|
||||
} else {
|
||||
@@ -874,7 +926,7 @@ fun ComposeView(
|
||||
hasSimplexLink.value = false
|
||||
}
|
||||
} else if (s.text.isNotEmpty() && !chat.groupFeatureEnabled(GroupFeature.SimplexLinks)) {
|
||||
hasSimplexLink.value = getSimplexLink(parsedMessage).second
|
||||
hasSimplexLink.value = getMessageLinks(parsedMessage).second
|
||||
} else {
|
||||
hasSimplexLink.value = false
|
||||
}
|
||||
@@ -1064,6 +1116,22 @@ fun ComposeView(
|
||||
val userCantSendReason = rememberUpdatedState(chat.chatInfo.userCantSendReason)
|
||||
val nextSendGrpInv = rememberUpdatedState(chat.nextSendGrpInv)
|
||||
|
||||
@Composable
|
||||
fun CommandsButton() {
|
||||
val commandsEnabled = chat.chatInfo.sendMsgEnabled && chat.chatInfo.menuCommands.isNotEmpty()
|
||||
IconButton(
|
||||
onClick = { showCommandsMenu.value = !showCommandsMenu.value },
|
||||
enabled = commandsEnabled
|
||||
) {
|
||||
Box(
|
||||
modifier = Modifier.size(28.dp).clip(CircleShape),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Text("//", style = MaterialTheme.typography.h3.copy(fontStyle = FontStyle.Italic, color = if (commandsEnabled) MaterialTheme.colors.primary else MaterialTheme.colors.secondary))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun AttachmentButton() {
|
||||
val isGroupAndProhibitedFiles =
|
||||
@@ -1087,7 +1155,6 @@ fun ComposeView(
|
||||
&& !nextSendGrpInv.value
|
||||
IconButton(
|
||||
attachmentClicked,
|
||||
Modifier.padding(start = 3.dp, end = 1.dp, bottom = if (appPlatform.isAndroid) 2.sp.toDp() else 5.sp.toDp() * fontSizeSqrtMultiplier),
|
||||
enabled = attachmentEnabled
|
||||
) {
|
||||
Icon(
|
||||
@@ -1101,6 +1168,24 @@ fun ComposeView(
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun AttachmentAndCommandsButtons() {
|
||||
val cInfo = chat.chatInfo
|
||||
Row(
|
||||
Modifier.padding(start = 3.dp, end = 1.dp, bottom = if (appPlatform.isAndroid) 2.sp.toDp() else 5.sp.toDp() * fontSizeSqrtMultiplier),
|
||||
horizontalArrangement = Arrangement.spacedBy((-8).dp)
|
||||
) {
|
||||
val msg = composeState.value.message.text.trim()
|
||||
val showAttachment = cInfo !is ChatInfo.Direct || cInfo.contact.profile.peerType != ChatPeerType.Bot || cInfo.featureEnabled(ChatFeature.Files)
|
||||
if (cInfo.useCommands && (!showAttachment || msg.isEmpty() || msg.startsWith("/"))) {
|
||||
CommandsButton()
|
||||
}
|
||||
if (showAttachment) {
|
||||
AttachmentButton()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val allowedVoiceByPrefs = remember(chat.chatInfo) { chat.chatInfo.featureEnabled(ChatFeature.Voice) }
|
||||
LaunchedEffect(allowedVoiceByPrefs) {
|
||||
if (!allowedVoiceByPrefs && composeState.value.preview is ComposePreview.VoicePreview) {
|
||||
@@ -1280,7 +1365,7 @@ fun ComposeView(
|
||||
)
|
||||
Text(
|
||||
text,
|
||||
style = MaterialTheme.typography.caption,
|
||||
style = MaterialTheme.typography.body2,
|
||||
color = if (composeState.value.inProgress) MaterialTheme.colors.secondary else MaterialTheme.colors.primary
|
||||
)
|
||||
}
|
||||
@@ -1433,7 +1518,7 @@ fun ComposeView(
|
||||
ContextSendMessageToConnect(generalGetString(MR.strings.compose_send_direct_message_to_connect))
|
||||
Divider()
|
||||
Row(Modifier.padding(end = 8.dp), verticalAlignment = Alignment.Bottom) {
|
||||
AttachmentButton()
|
||||
AttachmentAndCommandsButtons()
|
||||
SendMsgView_(
|
||||
disableSendButton = disableSendButton,
|
||||
sendToConnect = { withApi { sendMemberContactInvitation() } }
|
||||
@@ -1453,11 +1538,19 @@ fun ComposeView(
|
||||
connect = { withApi { sendConnectPreparedContact() } }
|
||||
)
|
||||
ConnectionMode.Con ->
|
||||
SendContactRequestView(
|
||||
disableSendButton = disableSendButton,
|
||||
icon = MR.images.ic_person_add_filled,
|
||||
sendRequest = { showSendConnectPreparedContactAlert() }
|
||||
)
|
||||
if (chat.chatInfo.contact.isBot) {
|
||||
ConnectButtonView(
|
||||
text = stringResource(MR.strings.compose_view_connect),
|
||||
icon = MR.images.ic_bolt_filled,
|
||||
connect = { withApi { sendConnectPreparedContact() } }
|
||||
)
|
||||
} else {
|
||||
SendContactRequestView(
|
||||
disableSendButton = disableSendButton,
|
||||
icon = MR.images.ic_person_add_filled,
|
||||
sendRequest = { showSendConnectPreparedContactAlert() }
|
||||
)
|
||||
}
|
||||
}
|
||||
} else if (
|
||||
chat.chatInfo is ChatInfo.Direct
|
||||
@@ -1480,7 +1573,7 @@ fun ComposeView(
|
||||
)
|
||||
} else {
|
||||
Row(Modifier.padding(end = 8.dp), verticalAlignment = Alignment.Bottom) {
|
||||
AttachmentButton()
|
||||
AttachmentAndCommandsButtons()
|
||||
SendMsgView_(disableSendButton = disableSendButton)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -77,7 +77,7 @@ fun SelectedItemsButtonsToolbar(
|
||||
val forwardCountProhibited = remember { mutableStateOf(false) }
|
||||
Box {
|
||||
// It's hard to measure exact height of ComposeView with different fontSizes. Better to depend on actual ComposeView, even empty
|
||||
ComposeView(rhId = null, chatModel = chatModel, chatModel.chatsContext, Chat.sampleData, remember { mutableStateOf(ComposeState(useLinkPreviews = false)) }, remember { mutableStateOf(null) }, {}, remember { FocusRequester() })
|
||||
ComposeView(rhId = null, chatModel = chatModel, chatModel.chatsContext, Chat.sampleData, remember { mutableStateOf(ComposeState(useLinkPreviews = false)) }, remember { mutableStateOf(false) }, remember { mutableStateOf(null) }, {}, remember { FocusRequester() })
|
||||
Row(
|
||||
Modifier
|
||||
.matchParentSize()
|
||||
|
||||
+1
-1
@@ -44,7 +44,7 @@ fun SelectedItemsMembersToolbar(
|
||||
) {
|
||||
// It's hard to measure exact height of ComposeView with different fontSizes. Better to depend on actual ComposeView, even empty
|
||||
Box(Modifier.alpha(0f)) {
|
||||
ComposeView(rhId = null, chatModel = chatModel, chatModel.chatsContext, Chat.sampleData, remember { mutableStateOf(ComposeState(useLinkPreviews = false)) }, remember { mutableStateOf(null) }, {}, remember { FocusRequester() })
|
||||
ComposeView(rhId = null, chatModel = chatModel, chatModel.chatsContext, Chat.sampleData, remember { mutableStateOf(ComposeState(useLinkPreviews = false)) }, remember { mutableStateOf(false) }, remember { mutableStateOf(null) }, {}, remember { FocusRequester() })
|
||||
}
|
||||
Row(
|
||||
Modifier
|
||||
|
||||
+5
-4
@@ -65,7 +65,7 @@ data class ChatItemReactionMenuItem (
|
||||
fun ChatItemView(
|
||||
chatsCtx: ChatModel.ChatsContext,
|
||||
rhId: Long?,
|
||||
cInfo: ChatInfo,
|
||||
chat: Chat,
|
||||
cItem: ChatItem,
|
||||
composeState: MutableState<ComposeState>,
|
||||
imageProvider: (() -> ImageGalleryProvider)? = null,
|
||||
@@ -109,6 +109,7 @@ fun ChatItemView(
|
||||
itemSeparation: ItemSeparation,
|
||||
preview: Boolean = false,
|
||||
) {
|
||||
val cInfo = chat.chatInfo
|
||||
val uriHandler = LocalUriHandler.current
|
||||
val sent = cItem.chatDir.sent
|
||||
val alignment = if (sent) Alignment.CenterEnd else Alignment.CenterStart
|
||||
@@ -327,7 +328,7 @@ fun ChatItemView(
|
||||
) {
|
||||
@Composable
|
||||
fun framedItemView() {
|
||||
FramedItemView(chatsCtx, cInfo, cItem, uriHandler, imageProvider, linkMode = linkMode, showViaProxy = showViaProxy, showMenu, showTimestamp = showTimestamp, tailVisible = itemSeparation.largeGap, receiveFile, onLinkLongClick, scrollToItem, scrollToItemId, scrollToQuotedItemFromItem)
|
||||
FramedItemView(chatsCtx, chat, cItem, uriHandler, imageProvider, linkMode = linkMode, showViaProxy = showViaProxy, showMenu, showTimestamp = showTimestamp, tailVisible = itemSeparation.largeGap, receiveFile, onLinkLongClick, scrollToItem, scrollToItemId, scrollToQuotedItemFromItem)
|
||||
}
|
||||
|
||||
fun deleteMessageQuestionText(): String {
|
||||
@@ -1449,7 +1450,7 @@ fun PreviewChatItemView(
|
||||
ChatItemView(
|
||||
chatsCtx = ChatModel.ChatsContext(secondaryContextFilter = null),
|
||||
rhId = null,
|
||||
ChatInfo.Direct.sampleData,
|
||||
Chat.sampleData,
|
||||
chatItem,
|
||||
useLinkPreviews = true,
|
||||
linkMode = SimplexLinkMode.DESCRIPTION,
|
||||
@@ -1500,7 +1501,7 @@ fun PreviewChatItemViewDeletedContent() {
|
||||
ChatItemView(
|
||||
chatsCtx = ChatModel.ChatsContext(secondaryContextFilter = null),
|
||||
rhId = null,
|
||||
ChatInfo.Direct.sampleData,
|
||||
Chat.sampleData,
|
||||
ChatItem.getDeletedContentSampleData(),
|
||||
useLinkPreviews = true,
|
||||
linkMode = SimplexLinkMode.DESCRIPTION,
|
||||
|
||||
+43
-10
@@ -21,14 +21,17 @@ import androidx.compose.ui.unit.*
|
||||
import chat.simplex.common.model.*
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.ui.theme.*
|
||||
import chat.simplex.common.views.chat.ComposeState
|
||||
import chat.simplex.common.views.helpers.*
|
||||
import chat.simplex.res.MR
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlin.math.ceil
|
||||
|
||||
@Composable
|
||||
fun FramedItemView(
|
||||
chatsCtx: ChatModel.ChatsContext,
|
||||
chatInfo: ChatInfo,
|
||||
chat: Chat,
|
||||
ci: ChatItem,
|
||||
uriHandler: UriHandler? = null,
|
||||
imageProvider: (() -> ImageGalleryProvider)? = null,
|
||||
@@ -43,6 +46,7 @@ fun FramedItemView(
|
||||
scrollToItemId: MutableState<Long?>,
|
||||
scrollToQuotedItemFromItem: (Long) -> Unit = {},
|
||||
) {
|
||||
val chatInfo = chat.chatInfo
|
||||
val sent = ci.chatDir.sent
|
||||
val chatTTL = chatInfo.timedMessagesTTL
|
||||
|
||||
@@ -182,7 +186,7 @@ fun FramedItemView(
|
||||
fun ciFileView(ci: ChatItem, text: String) {
|
||||
CIFileView(ci.file, ci.meta.itemEdited, showMenu, false, receiveFile)
|
||||
if (text != "" || ci.meta.isLive) {
|
||||
CIMarkdownText(ci, chatInfo, chatTTL, linkMode = linkMode, uriHandler, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
CIMarkdownText(chatsCtx, ci, chat, chatTTL, linkMode = linkMode, uriHandler, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -295,7 +299,7 @@ fun FramedItemView(
|
||||
if (mc.text == "" && !ci.meta.isLive) {
|
||||
metaColor = Color.White
|
||||
} else {
|
||||
CIMarkdownText(ci, chatInfo, chatTTL, linkMode, uriHandler, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
CIMarkdownText(chatsCtx, ci, chat, chatTTL, linkMode, uriHandler, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
}
|
||||
}
|
||||
is MsgContent.MCVideo -> {
|
||||
@@ -303,26 +307,26 @@ fun FramedItemView(
|
||||
if (mc.text == "" && !ci.meta.isLive) {
|
||||
metaColor = Color.White
|
||||
} else {
|
||||
CIMarkdownText(ci, chatInfo, chatTTL, linkMode, uriHandler, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
CIMarkdownText(chatsCtx, ci, chat, chatTTL, linkMode, uriHandler, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
}
|
||||
}
|
||||
is MsgContent.MCVoice -> {
|
||||
CIVoiceView(mc.duration, ci.file, ci.meta.itemEdited, ci.chatDir.sent, hasText = true, ci, timedMessagesTTL = chatTTL, showViaProxy = showViaProxy, showTimestamp = showTimestamp, longClick = { onLinkLongClick("") }, receiveFile = receiveFile)
|
||||
if (mc.text != "") {
|
||||
CIMarkdownText(ci, chatInfo, chatTTL, linkMode, uriHandler, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
CIMarkdownText(chatsCtx, ci, chat, chatTTL, linkMode, uriHandler, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
}
|
||||
}
|
||||
is MsgContent.MCFile -> ciFileView(ci, mc.text)
|
||||
is MsgContent.MCUnknown ->
|
||||
if (ci.file == null) {
|
||||
CIMarkdownText(ci, chatInfo, chatTTL, linkMode, uriHandler, onLinkLongClick, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
CIMarkdownText(chatsCtx, ci, chat, chatTTL, linkMode, uriHandler, onLinkLongClick, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
} else {
|
||||
ciFileView(ci, mc.text)
|
||||
}
|
||||
is MsgContent.MCLink -> {
|
||||
ChatItemLinkView(mc.preview, showMenu, onLongClick = { showMenu.value = true })
|
||||
Box(Modifier.widthIn(max = DEFAULT_MAX_IMAGE_WIDTH)) {
|
||||
CIMarkdownText(ci, chatInfo, chatTTL, linkMode, uriHandler, onLinkLongClick, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
CIMarkdownText(chatsCtx, ci, chat, chatTTL, linkMode, uriHandler, onLinkLongClick, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
}
|
||||
}
|
||||
is MsgContent.MCReport -> {
|
||||
@@ -331,9 +335,9 @@ fun FramedItemView(
|
||||
append(if (mc.text.isEmpty()) mc.reason.text else "${mc.reason.text}: ")
|
||||
}
|
||||
}
|
||||
CIMarkdownText(ci, chatInfo, chatTTL, linkMode, uriHandler, onLinkLongClick, showViaProxy = showViaProxy, showTimestamp = showTimestamp, prefix = prefix)
|
||||
CIMarkdownText(chatsCtx, ci, chat, chatTTL, linkMode, uriHandler, onLinkLongClick, showViaProxy = showViaProxy, showTimestamp = showTimestamp, prefix = prefix)
|
||||
}
|
||||
else -> CIMarkdownText(ci, chatInfo, chatTTL, linkMode, uriHandler, onLinkLongClick, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
else -> CIMarkdownText(chatsCtx, ci, chat, chatTTL, linkMode, uriHandler, onLinkLongClick, showViaProxy = showViaProxy, showTimestamp = showTimestamp)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -353,8 +357,9 @@ fun FramedItemView(
|
||||
|
||||
@Composable
|
||||
fun CIMarkdownText(
|
||||
chatsCtx: ChatModel.ChatsContext,
|
||||
ci: ChatItem,
|
||||
chatInfo: ChatInfo,
|
||||
chat: Chat,
|
||||
chatTTL: Int?,
|
||||
linkMode: SimplexLinkMode,
|
||||
uriHandler: UriHandler?,
|
||||
@@ -364,9 +369,11 @@ fun CIMarkdownText(
|
||||
prefix: AnnotatedString? = null
|
||||
) {
|
||||
Box(Modifier.padding(vertical = 7.dp, horizontal = 12.dp)) {
|
||||
val chatInfo = chat.chatInfo
|
||||
val text = if (ci.meta.isLive) ci.content.msgContent?.text ?: ci.text else ci.text
|
||||
MarkdownText(
|
||||
text, if (text.isEmpty()) emptyList() else ci.formattedText, toggleSecrets = true,
|
||||
sendCommandMsg = if (chatInfo.useCommands && chat.chatInfo.sndReady) { { msg -> sendCommandMsg(chatsCtx, chat, msg) } } else null,
|
||||
meta = ci.meta, chatTTL = chatTTL, linkMode = linkMode,
|
||||
mentions = ci.mentions, userMemberId = when {
|
||||
chatInfo is ChatInfo.Group -> chatInfo.groupInfo.membership.memberId
|
||||
@@ -377,6 +384,32 @@ fun CIMarkdownText(
|
||||
}
|
||||
}
|
||||
|
||||
fun sendCommandMsg(chatsCtx: ChatModel.ChatsContext, chat: Chat, msg: String) {
|
||||
if (chat.chatInfo.sndReady) {
|
||||
withLongRunningApi(slow = 60_000) {
|
||||
val cInfo = chat.chatInfo
|
||||
val chatItems =
|
||||
chatModel.controller.apiSendMessages(
|
||||
rh = chat.remoteHostId,
|
||||
type = cInfo.chatType,
|
||||
id = cInfo.apiId,
|
||||
scope = cInfo.groupChatScope(),
|
||||
composedMessages = listOf(ComposedMessage(fileSource = null, quotedItemId = null, msgContent = MsgContent.MCText(msg), mentions = emptyMap()))
|
||||
)
|
||||
if (!chatItems.isNullOrEmpty()) {
|
||||
chatItems.forEach { aChatItem ->
|
||||
withContext(Dispatchers.Main) {
|
||||
chatsCtx.addChatItem(chat.remoteHostId, aChatItem.chatInfo, aChatItem.chatItem)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
AlertManager.shared.showAlertMsg(MR.strings.cant_send_message_alert_title, MR.strings.cant_send_commands_alert_text)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const val CHAT_IMAGE_LAYOUT_ID = "chatImage"
|
||||
const val CHAT_BUBBLE_LAYOUT_ID = "chatBubble"
|
||||
const val CHAT_COMPOSE_LAYOUT_ID = "chatCompose"
|
||||
|
||||
+205
-72
@@ -1,5 +1,8 @@
|
||||
package chat.simplex.common.views.chat.item
|
||||
|
||||
import SectionItemView
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.text.BasicText
|
||||
import androidx.compose.foundation.text.InlineTextContent
|
||||
import androidx.compose.material.MaterialTheme
|
||||
@@ -11,15 +14,16 @@ import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.input.pointer.*
|
||||
import androidx.compose.ui.platform.*
|
||||
import androidx.compose.ui.text.*
|
||||
import androidx.compose.ui.text.font.FontFamily
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.text.AnnotatedString.Range
|
||||
import androidx.compose.ui.text.font.*
|
||||
import androidx.compose.ui.text.style.*
|
||||
import androidx.compose.ui.unit.LayoutDirection
|
||||
import androidx.compose.ui.unit.sp
|
||||
import chat.simplex.common.model.*
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.ui.theme.CurrentColors
|
||||
import chat.simplex.common.views.helpers.*
|
||||
import chat.simplex.res.*
|
||||
import kotlinx.coroutines.*
|
||||
|
||||
val reserveTimestampStyle = SpanStyle(color = Color.Transparent)
|
||||
@@ -61,6 +65,7 @@ fun MarkdownText (
|
||||
mentions: Map<String, CIMention>? = null,
|
||||
userMemberId: String? = null,
|
||||
toggleSecrets: Boolean,
|
||||
sendCommandMsg: ((String) -> Unit)? = null,
|
||||
style: TextStyle = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.onSurface, lineHeight = 22.sp),
|
||||
maxLines: Int = Int.MAX_VALUE,
|
||||
overflow: TextOverflow = TextOverflow.Clip,
|
||||
@@ -134,51 +139,111 @@ fun MarkdownText (
|
||||
}
|
||||
Text(annotatedText, style = style, modifier = modifier, maxLines = maxLines, overflow = overflow, inlineContent = inlineContent?.second ?: mapOf())
|
||||
} else {
|
||||
var hasAnnotations = false
|
||||
var hasLinks = false
|
||||
var hasSecrets = false
|
||||
var hasCommands = false
|
||||
val annotatedText = buildAnnotatedString {
|
||||
inlineContent?.first?.invoke(this)
|
||||
appendSender(this, sender, senderBold)
|
||||
if (prefix != null) append(prefix)
|
||||
for ((i, ft) in formattedText.withIndex()) {
|
||||
if (ft.format == null) append(ft.text)
|
||||
else if (toggleSecrets && ft.format is Format.Secret) {
|
||||
val ftStyle = ft.format.style
|
||||
hasAnnotations = true
|
||||
val key = i.toString()
|
||||
withAnnotation(tag = "SECRET", annotation = key) {
|
||||
if (showSecrets[key] == true) append(ft.text) else withStyle(ftStyle) { append(ft.text) }
|
||||
}
|
||||
} else if (ft.format is Format.Mention) {
|
||||
val mention = mentions?.get(ft.format.memberName)
|
||||
|
||||
if (mention != null) {
|
||||
if (mention.memberRef != null) {
|
||||
val displayName = mention.memberRef.displayName
|
||||
val name = if (mention.memberRef.localAlias.isNullOrEmpty()) {
|
||||
displayName
|
||||
} else {
|
||||
"${mention.memberRef.localAlias} ($displayName)"
|
||||
}
|
||||
val mentionStyle = if (mention.memberId == userMemberId) ft.format.style.copy(color = MaterialTheme.colors.primary) else ft.format.style
|
||||
|
||||
withStyle(mentionStyle) { append(mentionText(name)) }
|
||||
} else {
|
||||
withStyle( ft.format.style) { append(mentionText(ft.format.memberName)) }
|
||||
}
|
||||
} else {
|
||||
append(ft.text)
|
||||
}
|
||||
} else {
|
||||
val link = ft.link(linkMode)
|
||||
if (link != null) {
|
||||
hasAnnotations = true
|
||||
else when(ft.format) {
|
||||
is Format.Bold -> withStyle(ft.format.style) { append(ft.text) }
|
||||
is Format.Italic -> withStyle(ft.format.style) { append(ft.text) }
|
||||
is Format.StrikeThrough -> withStyle(ft.format.style) { append(ft.text) }
|
||||
is Format.Snippet -> withStyle(ft.format.style) { append(ft.text) }
|
||||
is Format.Colored -> withStyle(ft.format.style) { append(ft.text) }
|
||||
is Format.Secret -> {
|
||||
val ftStyle = ft.format.style
|
||||
withAnnotation(tag = if (ft.format is Format.SimplexLink) "SIMPLEX_URL" else "URL", annotation = link) {
|
||||
withStyle(ftStyle) { append(ft.viewText(linkMode)) }
|
||||
if (toggleSecrets) {
|
||||
hasSecrets = true
|
||||
val key = i.toString()
|
||||
withAnnotation(tag = "SECRET", annotation = key) {
|
||||
if (showSecrets[key] == true) append(ft.text) else withStyle(ftStyle) { append(ft.text) }
|
||||
}
|
||||
} else {
|
||||
withStyle(ftStyle) { append(ft.text) }
|
||||
}
|
||||
} else {
|
||||
withStyle(ft.format.style) { append(ft.text) }
|
||||
}
|
||||
is Format.Mention -> {
|
||||
val mention = mentions?.get(ft.format.memberName)
|
||||
if (mention != null) {
|
||||
val ftStyle = ft.format.style
|
||||
if (mention.memberRef != null) {
|
||||
val displayName = mention.memberRef.displayName
|
||||
val name = if (mention.memberRef.localAlias.isNullOrEmpty()) {
|
||||
displayName
|
||||
} else {
|
||||
"${mention.memberRef.localAlias} ($displayName)"
|
||||
}
|
||||
val mentionStyle = if (mention.memberId == userMemberId) ftStyle.copy(color = MaterialTheme.colors.primary) else ftStyle
|
||||
withStyle(mentionStyle) { append(mentionText(name)) }
|
||||
} else {
|
||||
withStyle(ftStyle) { append(mentionText(ft.format.memberName)) }
|
||||
}
|
||||
} else {
|
||||
append(ft.text)
|
||||
}
|
||||
}
|
||||
is Format.Command ->
|
||||
if (sendCommandMsg == null) {
|
||||
append(ft.text)
|
||||
} else {
|
||||
hasCommands = true
|
||||
val ftStyle = ft.format.style
|
||||
val cmd = ft.format.commandStr
|
||||
withAnnotation(tag = "COMMAND", annotation = cmd) {
|
||||
withStyle(ftStyle) { append("/$cmd") }
|
||||
}
|
||||
}
|
||||
is Format.Uri -> {
|
||||
hasLinks = true
|
||||
val ftStyle = Format.linkStyle
|
||||
val s = ft.text
|
||||
val link = if (s.startsWith("http://") || s.startsWith("https://")) s else "https://$s"
|
||||
withAnnotation(tag = "WEB_URL", annotation = link) {
|
||||
withStyle(ftStyle) { append(ft.text) }
|
||||
}
|
||||
}
|
||||
is Format.HyperLink -> {
|
||||
hasLinks = true
|
||||
val ftStyle = Format.linkStyle
|
||||
withAnnotation(tag = "WEB_URL", annotation = ft.format.linkUri) {
|
||||
withStyle(ftStyle) { append(ft.format.showText ?: ft.text) }
|
||||
}
|
||||
}
|
||||
is Format.SimplexLink -> {
|
||||
hasLinks = true
|
||||
val ftStyle = Format.linkStyle
|
||||
val link =
|
||||
if (linkMode == SimplexLinkMode.BROWSER && ft.format.showText == null && !ft.text.startsWith("[")) ft.text
|
||||
else ft.format.simplexUri
|
||||
val t = ft.format.showText ?: if (linkMode == SimplexLinkMode.DESCRIPTION) ft.format.linkType.description else null
|
||||
withAnnotation(tag = "SIMPLEX_URL", annotation = link) {
|
||||
if (t == null) {
|
||||
withStyle(ftStyle) { append(ft.text) }
|
||||
} else {
|
||||
withStyle(ftStyle) { append("$t ") }
|
||||
withStyle(ftStyle.copy(fontStyle = FontStyle.Italic)) { append(ft.format.viaHosts) }
|
||||
}
|
||||
}
|
||||
}
|
||||
is Format.Email -> {
|
||||
hasLinks = true
|
||||
val ftStyle = Format.linkStyle
|
||||
withAnnotation(tag = "OTHER_URL", annotation = "mailto:${ft.text}") {
|
||||
withStyle(ftStyle) { append(ft.text) }
|
||||
}
|
||||
}
|
||||
is Format.Phone -> {
|
||||
hasLinks = true
|
||||
val ftStyle = Format.linkStyle
|
||||
withAnnotation(tag = "OTHER_URL", annotation = "tel:${ft.text}") {
|
||||
withStyle(ftStyle) { append(ft.text) }
|
||||
}
|
||||
}
|
||||
is Format.Unknown -> append(ft.text)
|
||||
}
|
||||
}
|
||||
if (meta?.isLive == true) {
|
||||
@@ -189,51 +254,51 @@ fun MarkdownText (
|
||||
withStyle(reserveTimestampStyle) { append("\n" + metaText) }
|
||||
else */if (meta != null) withStyle(reserveTimestampStyle) { append(reserve) }
|
||||
}
|
||||
if (hasAnnotations && uriHandler != null) {
|
||||
if ((hasLinks && uriHandler != null) || hasSecrets || (hasCommands && sendCommandMsg != null)) {
|
||||
val icon = remember { mutableStateOf(PointerIcon.Default) }
|
||||
ClickableText(annotatedText, style = style, modifier = modifier.pointerHoverIcon(icon.value), maxLines = maxLines, overflow = overflow,
|
||||
onLongClick = { offset ->
|
||||
annotatedText.getStringAnnotations(tag = "URL", start = offset, end = offset)
|
||||
.firstOrNull()?.let { annotation -> onLinkLongClick(annotation.item) }
|
||||
annotatedText.getStringAnnotations(tag = "SIMPLEX_URL", start = offset, end = offset)
|
||||
.firstOrNull()?.let { annotation -> onLinkLongClick(annotation.item) }
|
||||
if (hasLinks) {
|
||||
val withAnnotation: (String, (Range<String>) -> Unit) -> Unit = { tag, f ->
|
||||
annotatedText.getStringAnnotations(tag, start = offset, end = offset).firstOrNull()?.let(f)
|
||||
}
|
||||
withAnnotation("WEB_URL") { a -> onLinkLongClick(a.item) }
|
||||
withAnnotation("SIMPLEX_URL") { a -> onLinkLongClick(a.item) }
|
||||
withAnnotation("OTHER_URL") { a -> onLinkLongClick(a.item) }
|
||||
}
|
||||
},
|
||||
onClick = { offset ->
|
||||
annotatedText.getStringAnnotations(tag = "URL", start = offset, end = offset)
|
||||
.firstOrNull()?.let { annotation ->
|
||||
try {
|
||||
uriHandler.openUri(annotation.item)
|
||||
} catch (e: Exception) {
|
||||
// It can happen, for example, when you click on a text 0.00001 but don't have any app that can catch
|
||||
// `tel:` scheme in url installed on a device (no phone app or contacts, maybe)
|
||||
Log.e(TAG, "Open url: ${e.stackTraceToString()}")
|
||||
}
|
||||
}
|
||||
annotatedText.getStringAnnotations(tag = "SIMPLEX_URL", start = offset, end = offset)
|
||||
.firstOrNull()?.let { annotation ->
|
||||
uriHandler.openVerifiedSimplexUri(annotation.item)
|
||||
}
|
||||
annotatedText.getStringAnnotations(tag = "SECRET", start = offset, end = offset)
|
||||
.firstOrNull()?.let { annotation ->
|
||||
val key = annotation.item
|
||||
val withAnnotation: (String, (Range<String>) -> Unit) -> Unit = { tag, f ->
|
||||
annotatedText.getStringAnnotations(tag, start = offset, end = offset).firstOrNull()?.let(f)
|
||||
}
|
||||
if (hasLinks && uriHandler != null) {
|
||||
withAnnotation("WEB_URL") { a -> openBrowserAlert(a.item, uriHandler) }
|
||||
withAnnotation("OTHER_URL") { a -> safeOpenUri(a.item, uriHandler) }
|
||||
withAnnotation("SIMPLEX_URL") { a -> uriHandler.openVerifiedSimplexUri(a.item) }
|
||||
}
|
||||
if (hasSecrets) {
|
||||
withAnnotation("SECRET") { a ->
|
||||
val key = a.item
|
||||
showSecrets[key] = !(showSecrets[key] ?: false)
|
||||
}
|
||||
}
|
||||
if (hasCommands && sendCommandMsg != null) {
|
||||
withAnnotation("COMMAND") { a -> sendCommandMsg("/${a.item}") }
|
||||
}
|
||||
},
|
||||
onHover = { offset ->
|
||||
icon.value = annotatedText.getStringAnnotations(tag = "URL", start = offset, end = offset)
|
||||
.firstOrNull()?.let {
|
||||
val hasAnnotation: (String) -> Boolean = { tag -> annotatedText.hasStringAnnotations(tag, start = offset, end = offset) }
|
||||
icon.value =
|
||||
if (hasAnnotation("WEB_URL") || hasAnnotation("SIMPLEX_URL") || hasAnnotation("OTHER_URL") || hasAnnotation("SECRET") || hasAnnotation("COMMAND")) {
|
||||
PointerIcon.Hand
|
||||
} ?: annotatedText.getStringAnnotations(tag = "SIMPLEX_URL", start = offset, end = offset)
|
||||
.firstOrNull()?.let {
|
||||
PointerIcon.Hand
|
||||
} ?: annotatedText.getStringAnnotations(tag = "SECRET", start = offset, end = offset)
|
||||
.firstOrNull()?.let {
|
||||
PointerIcon.Hand
|
||||
} ?: PointerIcon.Default
|
||||
} else {
|
||||
PointerIcon.Default
|
||||
}
|
||||
},
|
||||
shouldConsumeEvent = { offset ->
|
||||
annotatedText.getStringAnnotations(tag = "URL", start = offset, end = offset).any()
|
||||
annotatedText.getStringAnnotations(tag = "SIMPLEX_URL", start = offset, end = offset).any()
|
||||
annotatedText.hasStringAnnotations(tag = "WEB_URL", start = offset, end = offset)
|
||||
|| annotatedText.hasStringAnnotations(tag = "SIMPLEX_URL", start = offset, end = offset)
|
||||
|| annotatedText.hasStringAnnotations(tag = "OTHER_URL", start = offset, end = offset)
|
||||
}
|
||||
)
|
||||
} else {
|
||||
@@ -302,6 +367,74 @@ fun ClickableText(
|
||||
)
|
||||
}
|
||||
|
||||
fun openBrowserAlert(uri: String, uriHandler: UriHandler) {
|
||||
val (res, err) = sanitizeUri(uri)
|
||||
if (res == null) {
|
||||
showInvalidLinkAlert(uri, err)
|
||||
} else {
|
||||
val message = if (uri.count() > 160) uri.substring(0, 159) + "…" else uri
|
||||
val sanitizedUri = res.second
|
||||
if (sanitizedUri == null) {
|
||||
AlertManager.shared.showAlertDialog(
|
||||
generalGetString(MR.strings.privacy_chat_list_open_web_link_question),
|
||||
message,
|
||||
confirmText = generalGetString(MR.strings.open_verb),
|
||||
onConfirm = { safeOpenUri(uri, uriHandler) }
|
||||
)
|
||||
} else {
|
||||
AlertManager.shared.showAlertDialogButtonsColumn(
|
||||
generalGetString(MR.strings.privacy_chat_list_open_web_link_question),
|
||||
message,
|
||||
buttons = {
|
||||
Column {
|
||||
SectionItemView({
|
||||
AlertManager.shared.hideAlert()
|
||||
safeOpenUri(uri, uriHandler)
|
||||
}) {
|
||||
Text(generalGetString(MR.strings.privacy_chat_list_open_full_web_link), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.error)
|
||||
}
|
||||
SectionItemView({
|
||||
AlertManager.shared.hideAlert()
|
||||
safeOpenUri(sanitizedUri, uriHandler)
|
||||
}) {
|
||||
Text(generalGetString(MR.strings.privacy_chat_list_open_clean_web_link), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.primary)
|
||||
}
|
||||
SectionItemView({
|
||||
AlertManager.shared.hideAlert()
|
||||
}) {
|
||||
Text(generalGetString(MR.strings.cancel_verb), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.primary)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun safeOpenUri(uri: String, uriHandler: UriHandler) {
|
||||
try {
|
||||
uriHandler.openUri(uri)
|
||||
} catch (e: Exception) {
|
||||
// It can happen, for example, when you click on a text 0.00001 but don't have any app that can catch
|
||||
// `tel:` scheme in url installed on a device (no phone app or contacts, maybe)
|
||||
Log.e(TAG, "Open url: ${e.stackTraceToString()}")
|
||||
showInvalidLinkAlert(uri, error = e.message)
|
||||
}
|
||||
}
|
||||
|
||||
fun showInvalidLinkAlert(uri: String, error: String? = null) {
|
||||
val message = if (error.isNullOrEmpty()) { uri } else { error + "\n" + uri }
|
||||
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_parsing_uri_title), message)
|
||||
}
|
||||
|
||||
fun sanitizeUri(s: String): Pair<Pair<Boolean, String?>?, String?> {
|
||||
val parsed = parseSanitizeUri(s)
|
||||
return if (parsed?.uriInfo != null) {
|
||||
(true to parsed.uriInfo.sanitized) to null
|
||||
} else {
|
||||
null to parsed?.parseError
|
||||
}
|
||||
}
|
||||
|
||||
private fun isRtl(s: CharSequence): Boolean {
|
||||
for (element in s) {
|
||||
val d = Character.getDirectionality(element)
|
||||
|
||||
+1
-1
@@ -659,7 +659,7 @@ private fun ChatListSearchBar(listState: LazyListState, searchText: MutableState
|
||||
// if SimpleX link is pasted, show connection dialogue
|
||||
hideKeyboard(view)
|
||||
if (link.format is Format.SimplexLink) {
|
||||
val linkText = link.simplexLinkText(link.format.linkType, link.format.smpHosts)
|
||||
val linkText = link.format.simplexLinkText
|
||||
searchText.value = searchText.value.copy(linkText, selection = TextRange.Zero)
|
||||
}
|
||||
searchShowingSimplexLink.value = true
|
||||
|
||||
+6
-32
@@ -176,12 +176,14 @@ fun ChatPreviewView(
|
||||
is ChatInfo.Direct ->
|
||||
if (cInfo.contact.isContactCard) {
|
||||
stringResource(MR.strings.contact_tap_to_connect) to MaterialTheme.colors.primary
|
||||
} else if (cInfo.contact.isBot && cInfo.contact.nextConnectPrepared) {
|
||||
stringResource(MR.strings.open_to_use_bot) to Color.Unspecified
|
||||
} else if (cInfo.contact.sendMsgToConnect) {
|
||||
stringResource(MR.strings.open_to_connect) to Color.Unspecified
|
||||
} else if (cInfo.contact.nextAcceptContactRequest) {
|
||||
stringResource(MR.strings.open_to_accept) to Color.Unspecified
|
||||
} else if (!cInfo.contact.sndReady && cInfo.contact.activeConn != null && cInfo.contact.active) {
|
||||
if (cInfo.contact.preparedContact?.uiConnLinkType == ConnectionMode.Con) {
|
||||
if ((cInfo.contact.preparedContact?.uiConnLinkType == ConnectionMode.Con && !cInfo.contact.isBot) || cInfo.contact.contactGroupMemberId != null) {
|
||||
stringResource(MR.strings.contact_should_accept) to Color.Unspecified
|
||||
} else {
|
||||
stringResource(MR.strings.contact_connection_pending) to Color.Unspecified
|
||||
@@ -296,37 +298,9 @@ fun ChatPreviewView(
|
||||
val uriHandler = LocalUriHandler.current
|
||||
when (mc) {
|
||||
is MsgContent.MCLink -> SmallContentPreview {
|
||||
val linkClicksEnabled = remember { appPrefs.privacyChatListOpenLinks.state }.value != PrivacyChatListOpenLinksMode.NO
|
||||
IconButton({
|
||||
when (appPrefs.privacyChatListOpenLinks.get()) {
|
||||
PrivacyChatListOpenLinksMode.YES -> uriHandler.openUriCatching(mc.preview.uri)
|
||||
PrivacyChatListOpenLinksMode.NO -> defaultClickAction()
|
||||
PrivacyChatListOpenLinksMode.ASK -> AlertManager.shared.showAlertDialogButtonsColumn(
|
||||
title = generalGetString(MR.strings.privacy_chat_list_open_web_link_question),
|
||||
text = mc.preview.uri,
|
||||
buttons = {
|
||||
Column {
|
||||
if (chatModel.chatId.value != chat.id) {
|
||||
SectionItemView({
|
||||
AlertManager.shared.hideAlert()
|
||||
defaultClickAction()
|
||||
}) {
|
||||
Text(stringResource(MR.strings.open_chat), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.primary)
|
||||
}
|
||||
}
|
||||
SectionItemView({
|
||||
AlertManager.shared.hideAlert()
|
||||
uriHandler.openUriCatching(mc.preview.uri)
|
||||
}
|
||||
) {
|
||||
Text(stringResource(MR.strings.privacy_chat_list_open_web_link), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.primary)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
},
|
||||
if (linkClicksEnabled) Modifier.desktopPointerHoverIconHand() else Modifier,
|
||||
IconButton(
|
||||
{ openBrowserAlert(mc.preview.uri, uriHandler) },
|
||||
Modifier.desktopPointerHoverIconHand(),
|
||||
) {
|
||||
Image(base64ToBitmap(mc.preview.image), null, contentScale = ContentScale.Crop)
|
||||
}
|
||||
|
||||
+6
-6
@@ -2,14 +2,14 @@ package chat.simplex.common.views.helpers
|
||||
|
||||
import androidx.compose.animation.core.*
|
||||
|
||||
fun <T> chatListAnimationSpec() = tween<T>(durationMillis = 250, easing = FastOutSlowInEasing)
|
||||
|
||||
fun <T> newChatSheetAnimSpec() = tween<T>(256, 0, LinearEasing)
|
||||
fun <T> chatListAnimationSpec() = tween<T>(durationMillis = 350, easing = FastOutSlowInEasing)
|
||||
|
||||
fun <T> audioProgressBarAnimationSpec() = tween<T>(durationMillis = 30, easing = LinearEasing)
|
||||
|
||||
fun <T> userPickerAnimSpec() = tween<T>(256, 0, FastOutSlowInEasing)
|
||||
fun <T> userPickerAnimSpec() = tween<T>(350, 0, FastOutSlowInEasing)
|
||||
|
||||
fun <T> mentionPickerAnimSpec() = tween<T>(256, 0, FastOutSlowInEasing)
|
||||
fun <T> mentionPickerAnimSpec() = tween<T>(350, 0, FastOutSlowInEasing)
|
||||
|
||||
fun <T> contextUserPickerAnimSpec() = tween<T>(256, 0, FastOutSlowInEasing)
|
||||
fun <T> commandMenuAnimSpec() = tween<T>(350, 0, FastOutSlowInEasing)
|
||||
|
||||
fun <T> contextUserPickerAnimSpec() = tween<T>(350, 0, FastOutSlowInEasing)
|
||||
|
||||
+1
@@ -33,6 +33,7 @@ fun ChatInfoImage(chatInfo: ChatInfo, size: Dp, iconColor: Color = MaterialTheme
|
||||
when (chatInfo) {
|
||||
is ChatInfo.Group -> chatInfo.groupInfo.chatIconName
|
||||
is ChatInfo.Local -> MR.images.ic_folder_filled
|
||||
is ChatInfo.Direct -> chatInfo.contact.chatIconName
|
||||
else -> MR.images.ic_account_circle_filled
|
||||
}
|
||||
ProfileImage(size, chatInfo.image, icon, if (chatInfo is ChatInfo.Local) NoteFolderIconColor else iconColor)
|
||||
|
||||
+7
-4
@@ -63,7 +63,7 @@ private suspend fun planAndConnectTask(
|
||||
val (connectionLink, connectionPlan) = result
|
||||
val link = strHasSingleSimplexLink(shortOrFullLink.trim())
|
||||
val linkText = if (link?.format is Format.SimplexLink)
|
||||
"<br><br><u>${link.simplexLinkText(link.format.linkType, link.format.smpHosts)}</u>"
|
||||
"<br><br><u>${link.format.simplexLinkText}</u>"
|
||||
else
|
||||
""
|
||||
when (connectionPlan) {
|
||||
@@ -390,7 +390,7 @@ private fun showOpenKnownContactAlert(chatModel: ChatModel, rhId: Long?, close:
|
||||
ProfileImage(
|
||||
size = alertProfileImageSize,
|
||||
image = contact.profile.image,
|
||||
icon = MR.images.ic_account_circle_filled
|
||||
icon = contact.chatIconName
|
||||
)
|
||||
},
|
||||
confirmText = generalGetString(if (contact.nextConnectPrepared) MR.strings.connect_plan_open_new_chat else MR.strings.connect_plan_open_chat),
|
||||
@@ -474,7 +474,7 @@ private fun showOpenKnownGroupAlert(chatModel: ChatModel, rhId: Long?, close: ((
|
||||
ProfileImage(
|
||||
size = alertProfileImageSize,
|
||||
image = groupInfo.groupProfile.image,
|
||||
icon = if (groupInfo.businessChat == null) MR.images.ic_supervised_user_circle_filled else MR.images.ic_work_filled_padded
|
||||
icon = groupInfo.chatIconName
|
||||
)
|
||||
},
|
||||
confirmText = generalGetString(
|
||||
@@ -515,7 +515,10 @@ fun showPrepareContactAlert(
|
||||
ProfileImage(
|
||||
size = alertProfileImageSize,
|
||||
image = contactShortLinkData.profile.image,
|
||||
icon = if (contactShortLinkData.business) MR.images.ic_work_filled_padded else MR.images.ic_account_circle_filled
|
||||
icon =
|
||||
if (contactShortLinkData.business) MR.images.ic_work_filled_padded
|
||||
else if (contactShortLinkData.profile.peerType == ChatPeerType.Bot) MR.images.ic_cube
|
||||
else MR.images.ic_account_circle_filled
|
||||
)
|
||||
},
|
||||
confirmText = generalGetString(MR.strings.connect_plan_open_new_chat),
|
||||
|
||||
+2
-4
@@ -519,10 +519,8 @@ private fun ContactsSearchBar(
|
||||
// if SimpleX link is pasted, show connection dialogue
|
||||
hideKeyboard(view)
|
||||
if (link.format is Format.SimplexLink) {
|
||||
val linkText =
|
||||
link.simplexLinkText(link.format.linkType, link.format.smpHosts)
|
||||
searchText.value =
|
||||
searchText.value.copy(linkText, selection = TextRange.Zero)
|
||||
val linkText = link.format.simplexLinkText
|
||||
searchText.value = searchText.value.copy(linkText, selection = TextRange.Zero)
|
||||
}
|
||||
searchShowingSimplexLink.value = true
|
||||
searchChatFilteredBySimplexLink.value = null
|
||||
|
||||
+9
-9
@@ -2,18 +2,10 @@ package chat.simplex.common.views.usersettings
|
||||
|
||||
import SectionBottomSpacer
|
||||
import SectionDividerSpaced
|
||||
import SectionSpacer
|
||||
import SectionTextFooter
|
||||
import SectionView
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalUriHandler
|
||||
import chat.simplex.common.model.*
|
||||
import chat.simplex.common.model.ChatController.appPrefs
|
||||
import chat.simplex.common.platform.*
|
||||
import dev.icerock.moko.resources.compose.painterResource
|
||||
@@ -67,7 +59,15 @@ fun DeveloperView(withAuth: (title: String, desc: String, block: () -> Unit) ->
|
||||
SettingsPreferenceItem(painterResource(MR.images.ic_avg_pace), stringResource(MR.strings.show_slow_api_calls), appPreferences.showSlowApiCalls)
|
||||
}
|
||||
}
|
||||
SectionBottomSpacer()
|
||||
SectionDividerSpaced(maxTopPadding = true)
|
||||
SectionView(stringResource(MR.strings.deprecated_options_section).uppercase()) {
|
||||
val simplexLinkMode = chatModel.controller.appPrefs.simplexLinkMode
|
||||
SimpleXLinkOptions(chatModel.simplexLinkMode, onSelected = {
|
||||
simplexLinkMode.set(it)
|
||||
chatModel.simplexLinkMode.value = it
|
||||
})
|
||||
SectionBottomSpacer()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+12
-30
@@ -56,16 +56,22 @@ fun PrivacySettingsView(
|
||||
setPerformLA: (Boolean) -> Unit
|
||||
) {
|
||||
ColumnWithScrollBar {
|
||||
val simplexLinkMode = chatModel.controller.appPrefs.simplexLinkMode
|
||||
AppBarTitle(stringResource(MR.strings.your_privacy))
|
||||
PrivacyDeviceSection(showSettingsModal, setPerformLA)
|
||||
SectionDividerSpaced()
|
||||
|
||||
SectionView(stringResource(MR.strings.settings_section_title_chats)) {
|
||||
SettingsPreferenceItem(painterResource(MR.images.ic_travel_explore), stringResource(MR.strings.send_link_previews), chatModel.controller.appPrefs.privacyLinkPreviews)
|
||||
ChatListLinksOptions(appPrefs.privacyChatListOpenLinks.state, onSelected = {
|
||||
appPrefs.privacyChatListOpenLinks.set(it)
|
||||
})
|
||||
SettingsPreferenceItem(
|
||||
painterResource(MR.images.ic_travel_explore),
|
||||
stringResource(MR.strings.send_link_previews),
|
||||
chatModel.controller.appPrefs.privacyLinkPreviews,
|
||||
onChange = { _ -> chatModel.controller.appPrefs.privacyLinkPreviewsShowAlert.set(false) } // to avoid showing alert to current users, show alert in v6.5
|
||||
)
|
||||
SettingsPreferenceItem(
|
||||
painterResource(MR.images.ic_link),
|
||||
stringResource(MR.strings.sanitize_links_toggle),
|
||||
chatModel.controller.appPrefs.privacySanitizeLinks
|
||||
)
|
||||
SettingsPreferenceItem(
|
||||
painterResource(MR.images.ic_chat_bubble),
|
||||
stringResource(MR.strings.privacy_show_last_messages),
|
||||
@@ -84,10 +90,6 @@ fun PrivacySettingsView(
|
||||
chatModel.draftChatId.value = null
|
||||
}
|
||||
})
|
||||
SimpleXLinkOptions(chatModel.simplexLinkMode, onSelected = {
|
||||
simplexLinkMode.set(it)
|
||||
chatModel.simplexLinkMode.value = it
|
||||
})
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
|
||||
@@ -218,27 +220,7 @@ fun PrivacySettingsView(
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun ChatListLinksOptions(state: State<PrivacyChatListOpenLinksMode>, onSelected: (PrivacyChatListOpenLinksMode) -> Unit) {
|
||||
val values = remember {
|
||||
PrivacyChatListOpenLinksMode.entries.map {
|
||||
when (it) {
|
||||
PrivacyChatListOpenLinksMode.YES -> it to generalGetString(MR.strings.privacy_chat_list_open_links_yes)
|
||||
PrivacyChatListOpenLinksMode.NO -> it to generalGetString(MR.strings.privacy_chat_list_open_links_no)
|
||||
PrivacyChatListOpenLinksMode.ASK -> it to generalGetString(MR.strings.privacy_chat_list_open_links_ask)
|
||||
}
|
||||
}
|
||||
}
|
||||
ExposedDropDownSettingRow(
|
||||
generalGetString(MR.strings.privacy_chat_list_open_links),
|
||||
values,
|
||||
state,
|
||||
icon = painterResource(MR.images.ic_open_in_new),
|
||||
onSelected = onSelected
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun SimpleXLinkOptions(simplexLinkModeState: State<SimplexLinkMode>, onSelected: (SimplexLinkMode) -> Unit) {
|
||||
fun SimpleXLinkOptions(simplexLinkModeState: State<SimplexLinkMode>, onSelected: (SimplexLinkMode) -> Unit) {
|
||||
val modeValues = listOf(SimplexLinkMode.DESCRIPTION, SimplexLinkMode.FULL)
|
||||
val pickerValues = modeValues + if (modeValues.contains(simplexLinkModeState.value)) emptyList() else listOf(simplexLinkModeState.value)
|
||||
val values = remember {
|
||||
|
||||
@@ -449,6 +449,7 @@
|
||||
<string name="no_chats_found">No chats found</string>
|
||||
<string name="contact_tap_to_connect">Tap to Connect</string>
|
||||
<string name="open_to_connect">Open to connect</string>
|
||||
<string name="open_to_use_bot">Open to use bot</string>
|
||||
<string name="open_to_accept">Open to accept</string>
|
||||
<string name="contact_should_accept">contact should accept…</string>
|
||||
<string name="connect_with_contact_name_question">Connect with %1$s?</string>
|
||||
@@ -489,8 +490,10 @@
|
||||
<!-- 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_connect_to_use_bot">Tap Connect to use bot</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_bot">Bot</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>
|
||||
@@ -562,6 +565,7 @@
|
||||
<string name="you_are_observer">you are observer</string>
|
||||
<string name="reviewed_by_admins">reviewed by admins</string>
|
||||
<string name="cant_send_message_member_has_old_version">member has old version</string>
|
||||
<string name="cant_send_commands_alert_text">To send commands you must be connected.</string>
|
||||
|
||||
<!-- Images - chat.simplex.app.views.chat.item.CIImageView.kt -->
|
||||
<string name="image_descr">Image</string>
|
||||
@@ -1068,6 +1072,7 @@
|
||||
<string name="debug_logs">Enable logs</string>
|
||||
<string name="developer_options">Database IDs and Transport isolation option.</string>
|
||||
<string name="developer_options_section">Developer options</string>
|
||||
<string name="deprecated_options_section">Deprecated options</string>
|
||||
<string name="show_internal_errors">Show internal errors</string>
|
||||
<string name="show_slow_api_calls">Show slow API calls</string>
|
||||
<string name="shutdown_alert_question">Shutdown?</string>
|
||||
@@ -1364,6 +1369,7 @@
|
||||
<string name="app_will_ask_to_confirm_unknown_file_servers">The app will ask to confirm downloads from unknown file servers (except .onion or when SOCKS proxy is enabled).</string>
|
||||
<string name="without_tor_or_vpn_ip_address_will_be_visible_to_file_servers">Without Tor or VPN, your IP address will be visible to file servers.</string>
|
||||
<string name="send_link_previews">Send link previews</string>
|
||||
<string name="sanitize_links_toggle">Remove link tracking</string>
|
||||
<string name="privacy_show_last_messages">Show last messages</string>
|
||||
<string name="privacy_message_draft">Message draft</string>
|
||||
<string name="full_backup">App data backup</string>
|
||||
@@ -1430,6 +1436,8 @@
|
||||
<string name="privacy_chat_list_open_links_ask">Ask</string>
|
||||
<string name="privacy_chat_list_open_web_link_question">Open web link?</string>
|
||||
<string name="privacy_chat_list_open_web_link">Open link</string>
|
||||
<string name="privacy_chat_list_open_full_web_link">Open full link</string>
|
||||
<string name="privacy_chat_list_open_clean_web_link">Open clean link</string>
|
||||
|
||||
<!-- Settings sections -->
|
||||
<string name="settings_section_title_you">YOU</string>
|
||||
@@ -2157,6 +2165,9 @@
|
||||
<string name="allow_your_contacts_to_send_voice_messages">Allow your contacts to send voice messages.</string>
|
||||
<string name="allow_voice_messages_only_if">Allow voice messages only if your contact allows them.</string>
|
||||
<string name="prohibit_sending_voice_messages">Prohibit sending voice messages.</string>
|
||||
<string name="allow_your_contacts_to_send_files_and_media">Allow your contacts to send files and media.</string>
|
||||
<string name="allow_files_and_media_only_if">Allow files and media only if your contact allows them.</string>
|
||||
<string name="prohibit_sending_files_and_media">Prohibit sending files and media.</string>
|
||||
<string name="allow_your_contacts_adding_message_reactions">Allow your contacts adding message reactions.</string>
|
||||
<string name="allow_message_reactions_only_if">Allow message reactions only if your contact allows them.</string>
|
||||
<string name="prohibit_message_reactions">Prohibit message reactions.</string>
|
||||
@@ -2175,6 +2186,10 @@
|
||||
<string name="only_you_can_send_voice">Only you can send voice messages.</string>
|
||||
<string name="only_your_contact_can_send_voice">Only your contact can send voice messages.</string>
|
||||
<string name="voice_prohibited_in_this_chat">Voice messages are prohibited in this chat.</string>
|
||||
<string name="both_you_and_your_contact_can_send_files">Both you and your contact can send files and media.</string>
|
||||
<string name="only_you_can_send_files">Only you can send files and media.</string>
|
||||
<string name="only_your_contact_can_send_files">Only your contact can send files and media.</string>
|
||||
<string name="files_prohibited_in_this_chat">Files and media are prohibited in this chat.</string>
|
||||
<string name="both_you_and_your_contact_can_add_message_reactions">Both you and your contact can add message reactions.</string>
|
||||
<string name="only_you_can_add_message_reactions">Only you can add message reactions.</string>
|
||||
<string name="only_your_contact_can_add_message_reactions">Only your contact can add message reactions.</string>
|
||||
|
||||
@@ -1201,8 +1201,8 @@
|
||||
<string name="you_will_be_connected_when_your_connection_request_is_accepted">Ще бъдете свързани, когато заявката ви за връзка бъде приета, моля, изчакайте или проверете по-късно!</string>
|
||||
<string name="you_will_be_connected_when_your_contacts_device_is_online">Ще бъдете свързани, когато устройството на вашия контакт е онлайн, моля, изчакайте или проверете по-късно!</string>
|
||||
<string name="you_wont_lose_your_contacts_if_delete_address">Няма да загубите контактите си, ако по-късно изтриете адреса си.</string>
|
||||
<string name="your_settings">Вашите настройки</string>
|
||||
<string name="your_simplex_contact_address">Вашият адрес в SimpleX</string>
|
||||
<string name="your_settings">Настройки</string>
|
||||
<string name="your_simplex_contact_address">SimpleX адрес</string>
|
||||
<string name="smp_servers_use_server_for_new_conn">Използвай за нови връзки</string>
|
||||
<string name="your_XFTP_servers">Вашите XFTP сървъри</string>
|
||||
<string name="use_simplex_chat_servers__question">Използвай сървърите на SimpleX Chat\?</string>
|
||||
@@ -1260,7 +1260,7 @@
|
||||
<string name="you_control_your_chat">Вие контролирате своя чат!</string>
|
||||
<string name="wrong_passphrase_title">Грешна парола!</string>
|
||||
<string name="voice_messages">Гласови съобщения</string>
|
||||
<string name="your_preferences">Вашите настройки</string>
|
||||
<string name="your_preferences">Настройки</string>
|
||||
<string name="whats_new">Какво е новото</string>
|
||||
<string name="v4_3_irreversible_message_deletion_desc">Вашите контакти могат да позволят пълното изтриване на съобщението.</string>
|
||||
<string name="update_database_passphrase">Актуализирай паролата на базата данни</string>
|
||||
@@ -1376,7 +1376,7 @@
|
||||
<string name="error_creating_member_contact">Грешка при създаване на контакт с член</string>
|
||||
<string name="compose_send_direct_message_to_connect">Изпрати лично съобщение за свързване</string>
|
||||
<string name="member_contact_send_direct_message">изпрати за свързване</string>
|
||||
<string name="rcv_group_event_member_created_contact">свързан директно</string>
|
||||
<string name="rcv_group_event_member_created_contact">заявка за връзка</string>
|
||||
<string name="expand_verb">Разшири</string>
|
||||
<string name="v5_4_block_group_members">Блокиране на членове на групата</string>
|
||||
<string name="connect_plan_repeat_connection_request">Изпрати отново заявката за свързване?</string>
|
||||
@@ -2171,7 +2171,7 @@
|
||||
<string name="view_updated_conditions">Вижте актуализираните условия</string>
|
||||
<string name="xiaomi_ignore_battery_optimization"><![CDATA[<b>Xiaomi устройства </b>: моля, активирайте Autostart в системните настройки, за да работят известията.]]></string>
|
||||
<string name="message_deleted_or_not_received_error_title">Няма съобщение</string>
|
||||
<string name="or_to_share_privately">Или да се сподели лично</string>
|
||||
<string name="or_to_share_privately">Или сподели лично</string>
|
||||
<string name="all_message_and_files_e2e_encrypted"><![CDATA[Всички съобщения и файлове се изпращат <b>криптирани от край до край</b>, с постквантова сигурност в директните съобщения.]]></string>
|
||||
<string name="onboarding_notifications_mode_off_desc_short">Без фонова услуга</string>
|
||||
<string name="onboarding_notifications_mode_periodic_desc_short">Проверявай за съобщения на всеки 10 минути</string>
|
||||
@@ -2504,4 +2504,8 @@
|
||||
<string name="share_old_link_alert_button">Сподели стар линк</string>
|
||||
<string name="share_group_profile_via_link_alert_text">Линкът ще бъде кратък и профилът на групата ще бъде споделен чрез него.</string>
|
||||
<string name="upgrade_group_link">Обнови групов линк</string>
|
||||
<string name="settings_section_title_contact_requests_from_groups">ЗАЯВКИ ЗА КОНТАКТ ОТ ГРУПИ</string>
|
||||
<string name="member_is_deleted_cant_accept_request">Членът е изтрит - не може да се приеме заявката</string>
|
||||
<string name="rcv_direct_event_group_inv_link_received">заявка за връзка от група %1$s</string>
|
||||
<string name="this_setting_is_for_your_current_profile">Тази настройка е за текущия профил</string>
|
||||
</resources>
|
||||
|
||||
@@ -524,7 +524,7 @@
|
||||
<string name="confirm_new_passphrase">Confirmeu el nou mot de pas…</string>
|
||||
<string name="change_database_passphrase_question">Voleu canviar la frase de pas per a la base de dades?</string>
|
||||
<string name="rcv_group_event_member_connected">connectat</string>
|
||||
<string name="rcv_group_event_member_created_contact">connectat directament</string>
|
||||
<string name="rcv_group_event_member_created_contact">connexió sol·licitada</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_changing_for_member">canviant d\'adreça per %s…</string>
|
||||
<string name="group_member_status_connected">connectat</string>
|
||||
<string name="group_member_status_complete">complet</string>
|
||||
@@ -2477,4 +2477,8 @@
|
||||
<string name="share_old_link_alert_button">Compartir l\'enllaç antic</string>
|
||||
<string name="share_group_profile_via_link_alert_text">L\'enllaç serà curt i el perfil del grup es compartirà a través d\'ell.</string>
|
||||
<string name="upgrade_group_link">Actualitzar l\'enllaç del grup</string>
|
||||
<string name="settings_section_title_contact_requests_from_groups">SOL·LICITUDS DE CONTACTE DE GRUPS</string>
|
||||
<string name="member_is_deleted_cant_accept_request">Membre eliminat(da); no es pot acceptar la sol·licitud.</string>
|
||||
<string name="rcv_direct_event_group_inv_link_received">connexió sol·licitada del grup %1$s</string>
|
||||
<string name="this_setting_is_for_your_current_profile">Aquesta configuració és per al perfil actual</string>
|
||||
</resources>
|
||||
|
||||
@@ -2432,4 +2432,22 @@
|
||||
<string name="connect_plan_open_chat">Otevřít chat</string>
|
||||
<string name="connect_plan_open_new_chat">Otevřít nový chat</string>
|
||||
<string name="connect_plan_open_new_group">Otevřít novou skupinu</string>
|
||||
<string name="compose_view_connect">Připojit</string>
|
||||
<string name="v6_4_connect_faster">Připojte se rychleji! 🚀</string>
|
||||
<string name="settings_section_title_contact_requests_from_groups">POŽADAVKY NA PŘIPOJENÍ ZE SKUPIN</string>
|
||||
<string name="contact_should_accept">kontakt by měl přijmout…</string>
|
||||
<string name="v6_4_1_short_address_create">Vytvořit vaši adresu</string>
|
||||
<string name="group_descr_too_large">Popis příliš dlouhý</string>
|
||||
<string name="v6_4_1_keep_chats_clean_descr">Povolení mizících zpráv ve výchozím nastavení.</string>
|
||||
<string name="error_changing_user">Chyba změny profilu</string>
|
||||
<string name="error_preparing_contact">Chyba otevření chatu</string>
|
||||
<string name="error_preparing_group">Chyba otevření skupiny</string>
|
||||
<string name="error_rejecting_contact_request">Chyba odmítnutí žádosti o kontakt</string>
|
||||
<string name="chat_banner_group">Skupina</string>
|
||||
<string name="compose_view_join_group">Připojit ke skupině</string>
|
||||
<string name="v6_4_1_keep_chats_clean">Udržujte chat čistý</string>
|
||||
<string name="v6_4_message_delivery_descr">Méně provozu na mobilních sítích.</string>
|
||||
<string name="loading_profile">Načítání profilu…</string>
|
||||
<string name="member_is_deleted_cant_accept_request">Člen je smazán - nemůže přijmout žádost</string>
|
||||
<string name="v6_4_role_moderator">Nová skupinová role: Moderátor</string>
|
||||
</resources>
|
||||
|
||||
@@ -2543,7 +2543,7 @@
|
||||
<string name="context_user_picker_cant_change_profile_alert_title">Änderung des Profils nicht möglich</string>
|
||||
<string name="context_user_picker_cant_change_profile_alert_message">Wenn Sie nach dem Verbindungsversuch ein anderes Profil verwenden möchten, löschen Sie den Chat und verwenden Sie den Link erneut.</string>
|
||||
<string name="v6_4_support_chat">Chat mit Administratoren</string>
|
||||
<string name="v6_4_review_members_descr">Chat mit Mitgliedern bevor sie beitreten.</string>
|
||||
<string name="v6_4_review_members_descr">Mit Mitgliedern chatten bevor sie beitreten.</string>
|
||||
<string name="v6_4_connect_faster">Schneller miteinander verbinden! 🚀</string>
|
||||
<string name="v6_4_message_delivery_descr">Weniger Datenverkehr in mobilen Netzen.</string>
|
||||
<string name="v6_4_connect_faster_descr">Sobald Sie auf Verbinden tippen, erhalten Sie sofort eine Nachricht.</string>
|
||||
@@ -2573,9 +2573,9 @@
|
||||
<string name="v6_4_1_new_interface_languages">4 neue Sprachen für die Bedienoberfläche</string>
|
||||
<string name="v6_4_1_new_interface_languages_descr">Katalanisch, Indonesisch, Rumänisch und Vietnamesisch - Dank unserer Nutzer!</string>
|
||||
<string name="v6_4_1_short_address_create">Ihre Adresse erstellen</string>
|
||||
<string name="v6_4_1_keep_chats_clean_descr">Verschwindende Nachrichten per Voreinstellung aktiviert.</string>
|
||||
<string name="v6_4_1_keep_chats_clean">Halten Sie Ihre Chats übersichtlich</string>
|
||||
<string name="v6_4_1_welcome_contacts_descr">Geben Sie eine Profil-Biografie und eine Begrüßungsmeldung ein.</string>
|
||||
<string name="v6_4_1_keep_chats_clean_descr">Verschwindende Nachrichten sind per Voreinstellung aktiviert.</string>
|
||||
<string name="v6_4_1_keep_chats_clean">Ihre Chats übersichtlich halten</string>
|
||||
<string name="v6_4_1_welcome_contacts_descr">Sie können eine Profil-Biografie und eine Begrüßungsmeldung eingeben.</string>
|
||||
<string name="v6_4_1_short_address_share">Ihre Adresse teilen</string>
|
||||
<string name="v6_4_1_short_address">Verkürzte SimpleX-Adresse</string>
|
||||
<string name="time_to_disappear_is_set_only_for_new_contacts">Die Zeit bis zum Verschwinden wird nur für neue Kontakte eingestellt.</string>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<string name="v4_3_improved_server_configuration_desc">Añadir servidores mediante el escaneo de códigos QR.</string>
|
||||
<string name="smp_servers_preset_add">Añadir servidores predefinidos</string>
|
||||
<string name="all_group_members_will_remain_connected">Todos los miembros del grupo permanecerán conectados.</string>
|
||||
<string name="allow_irreversible_message_deletion_only_if">Se permite la eliminación irreversible de mensajes pero sólo si tu contacto también lo permite para tí. (24 horas)</string>
|
||||
<string name="allow_irreversible_message_deletion_only_if">Se permite la eliminación irreversible de mensajes pero sólo si tu contacto también lo permite. (24 horas)</string>
|
||||
<string name="keychain_allows_to_receive_ntfs">Android Keystore se usará para almacenar la frase de contraseña de forma segura después de cambiarla o reiniciar la aplicación - permitirá recibir notificaciones.</string>
|
||||
<string name="allow_your_contacts_to_send_disappearing_messages">Permites a tus contactos enviar mensajes temporales</string>
|
||||
<string name="allow_your_contacts_to_send_voice_messages">Permites a tus contactos enviar mensajes de voz.</string>
|
||||
@@ -304,7 +304,7 @@
|
||||
<string name="image_saved">Imagen guardada en la Galería</string>
|
||||
<string name="file_will_be_received_when_contact_is_online">El archivo se recibirá cuando el contacto esté en línea, por favor espera o revisa más tarde.</string>
|
||||
<string name="add_contact">Enlace de invitación de un uso</string>
|
||||
<string name="paste_the_link_you_received">Pegar el enlace recibido</string>
|
||||
<string name="paste_the_link_you_received">Pega el enlace recibido</string>
|
||||
<string name="error_saving_group_profile">Error al guardar perfil de grupo</string>
|
||||
<string name="exit_without_saving">Salir sin guardar</string>
|
||||
<string name="file_saved">Archivo guardado</string>
|
||||
@@ -443,8 +443,8 @@
|
||||
<string name="only_client_devices_store_contacts_groups_e2e_encrypted_messages">Sólo los dispositivos cliente almacenan perfiles de usuario, contactos, grupos y mensajes.</string>
|
||||
<string name="onboarding_notifications_mode_subtitle">Cómo afecta a la batería</string>
|
||||
<string name="onboarding_notifications_mode_service">Instantánea</string>
|
||||
<string name="join_group_button">Unirte</string>
|
||||
<string name="join_group_incognito_button">Unirte en modo incógnito</string>
|
||||
<string name="join_group_button">Unirme</string>
|
||||
<string name="join_group_incognito_button">Unirme en modo incógnito</string>
|
||||
<string name="conn_level_desc_indirect">indirecta (%1$s)</string>
|
||||
<string name="theme_light">Claro</string>
|
||||
<string name="chat_preferences_on">Activado</string>
|
||||
@@ -495,7 +495,7 @@
|
||||
<string name="message_delivery_error_title">Error en la entrega del mensaje</string>
|
||||
<string name="message_delivery_error_desc">Lo más probable es que este contacto haya eliminado la conexión contigo.</string>
|
||||
<string name="moderate_verb">Moderar</string>
|
||||
<string name="group_preview_join_as">Unirte como %s</string>
|
||||
<string name="group_preview_join_as">Unirme como %s</string>
|
||||
<string name="images_limit_desc">Sólo se pueden enviar 10 imágenes al mismo tiempo</string>
|
||||
<string name="large_file">¡Archivo grande!</string>
|
||||
<string name="mute_chat">Silenciar</string>
|
||||
@@ -518,7 +518,7 @@
|
||||
<string name="ok">OK</string>
|
||||
<string name="only_stored_on_members_devices">(sólo almacenado por miembros del grupo)</string>
|
||||
<string name="markdown_help">Ayuda sintaxis markdown</string>
|
||||
<string name="network_and_servers">Servidores y Red</string>
|
||||
<string name="network_and_servers">Servidores y Redes</string>
|
||||
<string name="network_use_onion_hosts_prefer_desc">Se usarán hosts .onion si están disponibles.</string>
|
||||
<string name="italic_text">cursiva</string>
|
||||
<string name="incoming_audio_call">Llamada audio entrante</string>
|
||||
@@ -715,7 +715,7 @@
|
||||
<string name="icon_descr_sent_msg_status_unauthorized_send">envío no autorizado</string>
|
||||
<string name="set_contact_name">Escribe un nombre para el contacto</string>
|
||||
<string name="unknown_error">Error desconocido</string>
|
||||
<string name="member_role_will_be_changed_with_notification">El rol cambiará a %s. Todos serán notificados.</string>
|
||||
<string name="member_role_will_be_changed_with_notification">El rol cambiará a %s. Se notificará en el grupo.</string>
|
||||
<string name="v4_2_security_assessment_desc">La seguridad de SimpleX Chat ha sido auditada por Trail of Bits.</string>
|
||||
<string name="v4_4_disappearing_messages_desc">Los mensajes enviados se eliminarán una vez transcurrido el tiempo establecido.</string>
|
||||
<string name="ntf_channel_messages">Mensajes de chat SimpleX</string>
|
||||
@@ -924,7 +924,7 @@
|
||||
<string name="you_have_no_chats">No tienes chats</string>
|
||||
<string name="contact_sent_large_file">El contacto ha enviado un archivo mayor al máximo admitido (%1$s ).</string>
|
||||
<string name="integrity_msg_skipped">%1$d mensaje(s) omitido(s)</string>
|
||||
<string name="you_will_stop_receiving_messages_from_this_group_chat_history_will_be_preserved">Dejarás de recibir mensajes de este grupo. El historial del chat se conservará.</string>
|
||||
<string name="you_will_stop_receiving_messages_from_this_group_chat_history_will_be_preserved">Dejarás de recibir mensajes del grupo. El historial del chat se conservará.</string>
|
||||
<string name="view_security_code">Mostrar código de seguridad</string>
|
||||
<string name="you_need_to_allow_to_send_voice">Para poder enviar mensajes de voz antes debes permitir que tu contacto pueda enviarlos.</string>
|
||||
<string name="voice_messages_prohibited">¡Mensajes de voz no permitidos!</string>
|
||||
@@ -1424,7 +1424,7 @@
|
||||
<string name="connect_plan_open_group">Grupo abierto</string>
|
||||
<string name="desktop_connection_terminated">Conexión finalizada</string>
|
||||
<string name="this_device_version"><![CDATA[<i>(este dispositivo v%s)</i>]]></string>
|
||||
<string name="unblock_member_desc">¡Los mensajes de %s serán mostrados!</string>
|
||||
<string name="unblock_member_desc">¡Los mensajes nuevos de %s serán mostrados!</string>
|
||||
<string name="enter_this_device_name">Nombre de este dispositivo…</string>
|
||||
<string name="error">Error</string>
|
||||
<string name="connect_to_desktop">Conectar con ordenador</string>
|
||||
@@ -1534,7 +1534,7 @@
|
||||
<string name="add_contact_tab">Añadir contacto</string>
|
||||
<string name="tap_to_scan">Pulsa para escanear</string>
|
||||
<string name="keep_invitation_link">Guardar</string>
|
||||
<string name="tap_to_paste_link">Pulsa para pegar el enlace</string>
|
||||
<string name="tap_to_paste_link">Pulsa aquí para pegar el enlace</string>
|
||||
<string name="search_or_paste_simplex_link">Buscar o pegar enlace SimpleX</string>
|
||||
<string name="v5_5_message_delivery_descr">Con uso reducido de batería.</string>
|
||||
<string name="blocked_by_admin_item_description">bloqueado por administrador</string>
|
||||
@@ -1552,7 +1552,7 @@
|
||||
<string name="block_for_all_question">¿Bloqear miembro para todos?</string>
|
||||
<string name="share_text_created_at">Creado: %s</string>
|
||||
<string name="block_for_all">Bloquear para todos</string>
|
||||
<string name="unblock_for_all_question">¿Desbloquear el miembro para todos?</string>
|
||||
<string name="unblock_for_all_question">¿Desbloquear al miembro para todos?</string>
|
||||
<string name="unblock_for_all">Desbloquear para todos</string>
|
||||
<string name="member_info_member_blocked">bloqueado</string>
|
||||
<string name="member_blocked_by_admin">bloqueado por administrador</string>
|
||||
@@ -1577,7 +1577,7 @@
|
||||
<string name="remote_ctrl_error_bad_invitation">El ordenador tiene un código de invitación incorrecto</string>
|
||||
<string name="remote_ctrl_error_disconnected">El ordenador ha sido desconectado</string>
|
||||
<string name="group_member_status_unknown">estado desconocido</string>
|
||||
<string name="database_migration_in_progress">Migración de la base de datos en curso. \nPodría tardar varios minutos.</string>
|
||||
<string name="database_migration_in_progress">Migrando base de datos.\nPuede tardar varios minutos.</string>
|
||||
<string name="remote_ctrl_error_bad_version">El ordenador tiene una versión sin soporte. Por favor, asegúrate de usar la misma versión en ambos dispositivos</string>
|
||||
<string name="profile_update_event_contact_name_changed">el contacto %1$s ha cambiado a %2$s</string>
|
||||
<string name="profile_update_event_updated_profile">perfil actualizado</string>
|
||||
@@ -2122,7 +2122,7 @@
|
||||
<string name="address_settings">Ajustes de dirección</string>
|
||||
<string name="create_1_time_link">Crear enlace de un solo uso</string>
|
||||
<string name="for_social_media">Para redes sociales</string>
|
||||
<string name="simplex_address_or_1_time_link">¿Dirección SimpleX o enlace de un uso?</string>
|
||||
<string name="simplex_address_or_1_time_link">¿Dirección SimpleX o enlace de un solo uso?</string>
|
||||
<string name="onboarding_choose_server_operators">Operadores de servidores</string>
|
||||
<string name="onboarding_network_operators">Operadores de red</string>
|
||||
<string name="onboarding_network_operators_conditions_will_be_accepted">Las condiciones de los operadores habilitados serán aceptadas después de 30 días.</string>
|
||||
@@ -2143,7 +2143,7 @@
|
||||
<string name="error_server_operator_changed">El operador del servidor ha cambiado.</string>
|
||||
<string name="error_server_protocol_changed">El protocolo del servidor ha cambiado.</string>
|
||||
<string name="appearance_app_toolbars">Barras de herramientas</string>
|
||||
<string name="appearance_bars_blur_radius">Difuminar</string>
|
||||
<string name="appearance_bars_blur_radius">Difuminado</string>
|
||||
<string name="v6_2_improved_chat_navigation">Navegación en el chat mejorada</string>
|
||||
<string name="v6_2_network_decentralization">Descentralización de la red</string>
|
||||
<string name="v6_2_improved_chat_navigation_descr">- El chat abre en el primer mensaje no leído.\n- Desplazamiento hasta los mensajes citados.</string>
|
||||
@@ -2222,8 +2222,8 @@
|
||||
<string name="delete_chat_for_self_cannot_undo_warning">El chat será eliminado para tí. ¡No puede deshacerse!</string>
|
||||
<string name="only_chat_owners_can_change_prefs">Sólo los propietarios del chat pueden cambiar las preferencias.</string>
|
||||
<string name="member_will_be_removed_from_chat_cannot_be_undone">El miembro será eliminado del chat. ¡No puede deshacerse!</string>
|
||||
<string name="member_role_will_be_changed_with_notification_chat">El rol cambiará a %s. Todos serán notificados.</string>
|
||||
<string name="you_will_stop_receiving_messages_from_this_chat_chat_history_will_be_preserved">Dejarás de recibir mensajes de este chat. El historial del chat se conserva.</string>
|
||||
<string name="member_role_will_be_changed_with_notification_chat">El rol cambiará a %s. Se notificará en el chat.</string>
|
||||
<string name="you_will_stop_receiving_messages_from_this_chat_chat_history_will_be_preserved">Dejarás de recibir mensajes del chat. El historial del chat se conserva.</string>
|
||||
<string name="how_it_helps_privacy">Cómo ayuda a la privacidad</string>
|
||||
<string name="onboarding_network_operators_cant_see_who_talks_to_whom">Cuando está habilitado más de un operador, ninguno dispone de los metadatos para conocer quién se comunica con quién.</string>
|
||||
<string name="chat_main_profile_sent">Tu perfil de chat será enviado a los miembros de chat</string>
|
||||
@@ -2359,7 +2359,7 @@
|
||||
<string name="group_preview_rejected">rechazado</string>
|
||||
<string name="group_member_status_rejected">rechazado</string>
|
||||
<string name="button_remove_members_question">¿Expulsar miembros?</string>
|
||||
<string name="unblock_members_desc">¡Los mensajes de estos miembros serán mostrados!</string>
|
||||
<string name="unblock_members_desc">¡Los mensajes nuevos de estos miembros serán mostrados!</string>
|
||||
<string name="unblock_members_for_all_question">¿Desbloquear los miembros para todos?</string>
|
||||
<string name="block_members_desc">¡Todos los mensajes nuevos de estos miembros estarán ocultos!</string>
|
||||
<string name="block_members_for_all_question">¿Bloquear miembros para todos?</string>
|
||||
@@ -2394,14 +2394,14 @@
|
||||
<string name="snd_group_event_member_accepted">has aceptado al miembro</string>
|
||||
<string name="group_member_status_pending_review">pendiente de revisión</string>
|
||||
<string name="group_member_status_pending_review_short">por revisar</string>
|
||||
<string name="button_support_chat">Chat con los administradores</string>
|
||||
<string name="button_support_chat">Chat con administradores</string>
|
||||
<string name="button_support_chat_member">Chat con miembro</string>
|
||||
<string name="reviewed_by_admins">en revisión por los administradores</string>
|
||||
<string name="rcv_group_event_member_accepted">%1$s aceptado</string>
|
||||
<string name="member_criteria_off">desactivado</string>
|
||||
<string name="member_admission">Admisión de miembros</string>
|
||||
<string name="cant_send_message_member_has_old_version">el miembro usa una versión antigua</string>
|
||||
<string name="no_support_chats">Sin chats con miembros</string>
|
||||
<string name="no_support_chats">Sin chats</string>
|
||||
<string name="error_deleting_member_support_chat">Error al eliminar el chat con el miembro</string>
|
||||
<string name="group_new_support_chats">%d chats con miembros</string>
|
||||
<string name="group_new_support_messages">%d mensajes</string>
|
||||
@@ -2411,19 +2411,19 @@
|
||||
<string name="cant_send_message_generic">no se pueden enviar mensajes</string>
|
||||
<string name="cant_send_message_contact_deleted">contacto eliminado</string>
|
||||
<string name="cant_send_message_contact_disabled">contacto desactivado</string>
|
||||
<string name="cant_send_message_contact_not_ready">el contacto no está listo</string>
|
||||
<string name="cant_send_message_contact_not_ready">en espera de ser aceptado</string>
|
||||
<string name="cant_send_message_group_deleted">el grupo ha sido eliminado</string>
|
||||
<string name="cant_send_message_contact_not_synchronized">no sincronizado</string>
|
||||
<string name="cant_send_message_mem_removed">expulsado del grupo</string>
|
||||
<string name="cant_send_message_rejected">petición para unirse rechazada</string>
|
||||
<string name="cant_send_message_alert_title">¡No puedes enviar mensajes!</string>
|
||||
<string name="report_sent_alert_msg_view_in_support_chat">Puedes ver tus informes en Chat con los administradores</string>
|
||||
<string name="report_sent_alert_msg_view_in_support_chat">Puedes ver tus informes en Chat con administradores</string>
|
||||
<string name="cant_send_message_you_left">has salido</string>
|
||||
<string name="rcv_group_event_user_accepted">te ha aceptado</string>
|
||||
<string name="rcv_group_event_new_member_pending_review">Un miembro nuevo desea unirse al grupo.</string>
|
||||
<string name="member_criteria_all">todos</string>
|
||||
<string name="member_support">Chat con miembros</string>
|
||||
<string name="support_chat">Chat con los administradores</string>
|
||||
<string name="support_chat">Chat con administradores</string>
|
||||
<string name="delete_member_support_chat_button">Eliminar chat</string>
|
||||
<string name="delete_member_support_chat_alert_title">¿Eliminar chat con el miembro?</string>
|
||||
<string name="reject_pending_member_button">Rechazar</string>
|
||||
@@ -2442,12 +2442,12 @@
|
||||
<string name="v6_4_review_members_descr">Chatea con el miembro antes de unirse.</string>
|
||||
<string name="compose_view_connect">Conectar</string>
|
||||
<string name="v6_4_connect_faster">¡Conéctate más rápido! 🚀</string>
|
||||
<string name="contact_should_accept">el contacto debe aceptar…</string>
|
||||
<string name="contact_should_accept">el contacto debe aceptarte…</string>
|
||||
<string name="error_changing_user">Error al cambiar el perfil</string>
|
||||
<string name="error_preparing_contact">Error al abrir el chat</string>
|
||||
<string name="error_preparing_group">Error al abrir el grupo</string>
|
||||
<string name="error_rejecting_contact_request">Error al rechazar la solicitud del contacto</string>
|
||||
<string name="compose_view_join_group">Unirte al grupo</string>
|
||||
<string name="compose_view_join_group">Unirme al grupo</string>
|
||||
<string name="v6_4_message_delivery_descr">Menos tráfico en redes móviles.</string>
|
||||
<string name="v6_4_connect_faster_descr">Tras pulsar Contactar, mensajea ya.</string>
|
||||
<string name="v6_4_role_moderator">Nuevo rol de grupo: Moderador</string>
|
||||
@@ -2457,7 +2457,7 @@
|
||||
<string name="connect_plan_open_new_group">Abrir grupo nuevo</string>
|
||||
<string name="open_to_accept">Abrir para aceptar</string>
|
||||
<string name="open_to_connect">Abrir para conectar</string>
|
||||
<string name="group_preview_open_to_join">Abrir para unirte</string>
|
||||
<string name="group_preview_open_to_join">Abre para unirte</string>
|
||||
<string name="private_routing_timeout">Timeout enrutamiento privado</string>
|
||||
<string name="share_profile_via_link_alert_text">La dirección pasará a ser corta y tu perfil será compartido mediante la dirección.</string>
|
||||
<string name="network_option_protocol_timeout_background">Timeout protocolo en segundo plano</string>
|
||||
@@ -2491,7 +2491,7 @@
|
||||
<string name="chat_banner_group">Grupo</string>
|
||||
<string name="chat_banner_connect_to_chat">Pulsa Conectar para chatear</string>
|
||||
<string name="chat_banner_send_request_to_connect">Pulsa Conectar para enviar solicitud</string>
|
||||
<string name="chat_banner_join_group">Pulsa Unirte al grupo</string>
|
||||
<string name="chat_banner_join_group">Pulsa Unirme al grupo</string>
|
||||
<string name="time_to_disappear_is_set_only_for_new_contacts">Mensajes temporales activados sólo para los contactos nuevos.</string>
|
||||
<string name="connect_use_incognito_profile">Usar perfil incógnito</string>
|
||||
<string name="chat_banner_your_business_contact">Mi contacto empresarial</string>
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
<string name="abort_switch_receiving_address">لغو تغییر نشانی</string>
|
||||
<string name="abort_switch_receiving_address_question">تغییر نشانی را لغو میکنید؟</string>
|
||||
<string name="about_simplex">درباره سیمپلاکس(SimpleX)</string>
|
||||
<string name="connect_via_contact_link">به وسیله نشانی مخاطب متصل میشوید؟</string>
|
||||
<string name="connect_via_invitation_link">به وسیله لینک یک بار مصرف متصل میشوید؟</string>
|
||||
<string name="connect_use_new_incognito_profile">از پروفایل ناشناس جدید استفاده کن</string>
|
||||
<string name="connect_via_contact_link">با نشانی مخاطب ارتباط برقرار شود؟</string>
|
||||
<string name="connect_via_invitation_link">با لینک یک بار مصرف ارتباط برقرار شود؟</string>
|
||||
<string name="connect_use_new_incognito_profile">استفاده از پروفایل ناشناس جدید</string>
|
||||
<string name="opening_database">در حال باز کردن پایگاه داده…</string>
|
||||
<string name="profile_will_be_sent_to_contact_sending_link">پروفایل شما به مخاطبی که این لینک را از او دریافت کردید، فرستاده خواهد شد.</string>
|
||||
<string name="connect_via_link_incognito">متصل شدن به صورت ناشناس</string>
|
||||
<string name="connect_via_link_incognito">اتصال ناشناس</string>
|
||||
<string name="non_content_uri_alert_text">شما یک مسیر نامعتبر فایل به اشتراک گذاشتید. موضوع را به توسعهدهندگان برنامه گزارش دهید.</string>
|
||||
<string name="receiving_files_not_yet_supported">هنوز از دریافت فایل پشتیبانی نمیشود</string>
|
||||
<string name="invalid_message_format">قالب پیام نامعتبر</string>
|
||||
@@ -30,7 +30,7 @@
|
||||
<string name="server_connecting">در حال اتصال</string>
|
||||
<string name="thousand_abbreviation">k</string>
|
||||
<string name="connect_via_group_link">به گروه میپیوندید؟</string>
|
||||
<string name="connect_use_current_profile">از پروفایل کنونی استفاده کن</string>
|
||||
<string name="connect_use_current_profile">استفاده از پروفایل کنونی</string>
|
||||
<string name="you_will_join_group">به تمام اعضای گروه متصل خواهید شد.</string>
|
||||
<string name="connect_via_link_verb">متصل شدن</string>
|
||||
<string name="non_content_uri_alert_title">مسیر نامعتبر فایل</string>
|
||||
@@ -1001,14 +1001,14 @@
|
||||
<string name="past_member_vName">عضو پیشین %1$s</string>
|
||||
<string name="icon_descr_expand_role">بسط دادن انتخاب نقش</string>
|
||||
<string name="database_passphrase_will_be_updated">عبارت عبور رمزنگاری پایگاه داده بهروز خواهد شد.</string>
|
||||
<string name="rcv_group_event_member_created_contact">مستقیما متصل شد</string>
|
||||
<string name="rcv_group_event_member_created_contact">درخواست اتصال کرد</string>
|
||||
<string name="rcv_group_event_1_member_connected">%s متصل شد</string>
|
||||
<string name="joining_group">پیوستن به گروه</string>
|
||||
<string name="update_database">بهروزرسانی</string>
|
||||
<string name="confirm_new_passphrase">تایید عبارت عبور جدید…</string>
|
||||
<string name="encrypt_database_question">پایگاه داده رمزنگاری شود؟</string>
|
||||
<string name="incompatible_database_version">نسخه پایگاه داده ناسازگار</string>
|
||||
<string name="rcv_group_event_updated_group_profile">پروفایل گروه بهروز شد</string>
|
||||
<string name="rcv_group_event_updated_group_profile">پروفایل گروه بهروز شده</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_completed_for_member">شما نشانی را برای %s تغییر دادید</string>
|
||||
<string name="snd_conn_event_switch_queue_phase_completed">شما نشانی را تغییر دادید</string>
|
||||
<string name="conn_event_ratchet_sync_allowed">تجدید مذاکره رمزنگاری مجاز است</string>
|
||||
@@ -2320,7 +2320,7 @@
|
||||
<string name="settings_section_title_chat_database">پایگاه داده چت</string>
|
||||
<string name="duplicates_label">تکراریها</string>
|
||||
<string name="edit_chat_list_menu_action">تغییر</string>
|
||||
<string name="v6_2_network_decentralization_enable_flux">Flux را در تنظیمات شبکه و سرورها فعال کنید تا حریم خصوصی متاداده بهتر شود.</string>
|
||||
<string name="v6_2_network_decentralization_enable_flux">Flux را در تنظیمات شبکه و سرورها فعال کنید تا حریم خصوصی فراداده بهتر شود.</string>
|
||||
<string name="debug_logs">فعال کردن لاگها</string>
|
||||
<string name="encryption_renegotiation_in_progress">مذاکره مجدد رمزنگاری در حال انجام است.</string>
|
||||
<string name="servers_info_modal_error_title">خطا</string>
|
||||
@@ -2352,7 +2352,7 @@
|
||||
<string name="sync_connection_question">اتصال اصلاح شود؟</string>
|
||||
<string name="appearance_font_size">اندازه فونت</string>
|
||||
<string name="report_archive_for_all_moderators">برای همه مدیران</string>
|
||||
<string name="v6_2_network_decentralization_enable_flux_reason">برای بهبود حریم خصوصی متاداده.</string>
|
||||
<string name="v6_2_network_decentralization_enable_flux_reason">برای بهبود حریم خصوصی فراداده.</string>
|
||||
<string name="onboarding_network_operators_app_will_use_for_routing">به عنوان مثال، اگر مخاطب شما پیامها را از طریق یک سرور چت SimpleX دریافت کند، برنامه شما آنها را از طریق یک سرور Flux تحویل خواهد داد.</string>
|
||||
<string name="report_archive_for_me">برای من</string>
|
||||
<string name="operator_use_for_messages_private_routing">برای مسیریابی خصوصی</string>
|
||||
@@ -2508,4 +2508,8 @@
|
||||
<string name="v6_4_1_short_address_share">آدرس خود را به اشتراک بگذارید</string>
|
||||
<string name="v6_4_1_new_interface_languages">۴ زبان جدید رابط کاربری</string>
|
||||
<string name="v6_4_1_new_interface_languages_descr">کاتالان، اندونزیایی، رومانیایی و ویتنامی - با تشکر از کاربران ما!</string>
|
||||
<string name="member_is_deleted_cant_accept_request">عضو حذف شده است - نمیتوان درخواست را قبول کرد</string>
|
||||
<string name="this_setting_is_for_your_current_profile">این تنظیمات برای پروفایل فعلی شماست</string>
|
||||
<string name="settings_section_title_contact_requests_from_groups">درخواستهای تماس از گروهها</string>
|
||||
<string name="rcv_direct_event_group_inv_link_received">درخواست اتصال از گروه %1$s</string>
|
||||
</resources>
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
<string name="connect_button">Kapcsolódás</string>
|
||||
<string name="connect_via_member_address_alert_title">Közvetlenül kapcsolódik?</string>
|
||||
<string name="smp_server_test_connect">Kapcsolódás</string>
|
||||
<string name="rcv_group_event_member_created_contact">partnerkapcsolatot kért</string>
|
||||
<string name="rcv_group_event_member_created_contact">partneri kapcsolatot kért</string>
|
||||
<string name="connection_local_display_name">kapcsolat %1$d</string>
|
||||
<string name="status_contact_has_e2e_encryption">a partner e2e titkosítással rendelkezik</string>
|
||||
<string name="v5_4_incognito_groups_descr">Csoport létrehozása véletlenszerű profillal.</string>
|
||||
@@ -846,7 +846,7 @@
|
||||
<string name="settings_section_title_messages">ÜZENETEK ÉS FÁJLOK</string>
|
||||
<string name="group_member_role_member">tag</string>
|
||||
<string name="make_private_connection">Privát kapcsolat létrehozása</string>
|
||||
<string name="moderated_item_description">moderálva lett %s által</string>
|
||||
<string name="moderated_item_description">%s moderálta ezt az üzenetet</string>
|
||||
<string name="import_theme_error_desc">Győződjön meg arról, hogy a fájl helyes YAML-szintaxist tartalmaz. Exportálja a témát, hogy legyen egy példa a témafájl szerkezetére.</string>
|
||||
<string name="italic_text">dőlt</string>
|
||||
<string name="non_content_uri_alert_title">Érvénytelen a fájl elérési útvonala</string>
|
||||
@@ -2481,6 +2481,6 @@
|
||||
<string name="share_old_link_alert_button">Régi hivatkozás megosztása</string>
|
||||
<string name="settings_section_title_contact_requests_from_groups">PARTNERI KAPCSOLATKÉRÉSEK A CSOPORTOKBÓL</string>
|
||||
<string name="member_is_deleted_cant_accept_request">A tag törölve lett – nem lehet elfogadni a kérést</string>
|
||||
<string name="rcv_direct_event_group_inv_link_received">a(z) %1$s nevű csoportból partnerkapcsolatot kért</string>
|
||||
<string name="rcv_direct_event_group_inv_link_received">a(z) %1$s nevű csoportból partneri kapcsolatot kért</string>
|
||||
<string name="this_setting_is_for_your_current_profile">Ez a beállítás a jelenlegi profiljára vonatkozik</string>
|
||||
</resources>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="22px" viewBox="0 -960 960 960" width="22px" fill="#000000"><path d="m451.5-89.5-298-172q-14.25-8.43-21.62-21.46-7.38-13.04-7.38-28.54V-649q0-15 7.38-28.29 7.37-13.28 21.62-21.71l298-171.5q13.83-8 28.66-8 14.84 0 28.84 8L807-699q13.75 8.43 21.13 21.71Q835.5-664 835.5-649v337.5q0 15.5-7.37 28.79-7.38 13.28-21.13 21.21l-298 172q-14.33 8-29.16 8-14.84 0-28.34-8Zm0-374V-156l28.5 16.5 29-16.5v-307.66L778-620v-28.5L745.5-667 480-512 214-667l-32 18.16V-619l269.5 155.5Z"/></svg>
|
||||
|
After Width: | Height: | Size: 522 B |
@@ -1380,7 +1380,7 @@
|
||||
<string name="error_creating_member_contact">Errore di creazione del contatto</string>
|
||||
<string name="compose_send_direct_message_to_connect">Invia messaggio diretto per connetterti</string>
|
||||
<string name="member_contact_send_direct_message">invia per connettere</string>
|
||||
<string name="rcv_group_event_member_created_contact">si è connesso/a direttamente</string>
|
||||
<string name="rcv_group_event_member_created_contact">connessione richiesta</string>
|
||||
<string name="expand_verb">Espandi</string>
|
||||
<string name="connect_plan_repeat_connection_request">Ripetere la richiesta di connessione?</string>
|
||||
<string name="rcv_direct_event_contact_deleted">contatto eliminato</string>
|
||||
@@ -2515,4 +2515,8 @@
|
||||
<string name="share_old_link_alert_button">Condividi il link vecchio</string>
|
||||
<string name="share_group_profile_via_link_alert_text">Il link sarà breve e il profilo del gruppo verrà condiviso attraverso il link.</string>
|
||||
<string name="upgrade_group_link">Aggiorna il link del gruppo</string>
|
||||
<string name="settings_section_title_contact_requests_from_groups">RICHIESTE DI CONTATTO DAI GRUPPI</string>
|
||||
<string name="member_is_deleted_cant_accept_request">Il membro è eliminato - impossibile accettare la richiesta</string>
|
||||
<string name="rcv_direct_event_group_inv_link_received">connessione richiesta dal gruppo %1$s</string>
|
||||
<string name="this_setting_is_for_your_current_profile">Questa impostazione è per il tuo profilo attuale</string>
|
||||
</resources>
|
||||
|
||||
@@ -2018,4 +2018,28 @@
|
||||
<string name="onboarding_conditions_accept">承諾</string>
|
||||
<string name="onboarding_conditions_private_chats_not_accessible">サーバオペレータは、プライベートチャット・グループ・連絡先にはアクセスできません。</string>
|
||||
<string name="onboarding_conditions_by_using_you_agree">SimpleX Chat を利用することで、以下の事項に同意したものと見なされます:\n- パブリックグループでは合法なコンテンツのみを送信すること。\n- 他のユーザを尊重すること、またスパムメッセージを送信しないこと。</string>
|
||||
<string name="connect_plan_open_chat">チャットを開く</string>
|
||||
<string name="connect_plan_open_new_chat">新しいチャットを開始</string>
|
||||
<string name="connect_plan_open_new_group">新しいグループを開始</string>
|
||||
<string name="error_parsing_uri_title">無効なリンク</string>
|
||||
<string name="error_parsing_uri_desc">SimpleXのリンクが正しいか確認してください</string>
|
||||
<string name="report_item_visibility_submitter">あなたとモデレーターのみが見ることができます</string>
|
||||
<string name="report_item_visibility_moderators">送信者とモデレーターのみが見ることができます</string>
|
||||
<string name="report_item_archived">アーカイブされたレポート</string>
|
||||
<string name="report_item_archived_by">%sによってアーカイブされたレポート</string>
|
||||
<string name="e2ee_info_e2ee"><![CDATA[Messages are protected by <b>E2E暗号化</b>.]]></string>
|
||||
<string name="display_name_requested_to_connect">接続を要求されました</string>
|
||||
<string name="display_name_accepted_invitation">招待を受け入れました</string>
|
||||
<string name="simplex_link_channel">SimpleXチャンネルのリンク</string>
|
||||
<string name="report_reason_spam">スパム</string>
|
||||
<string name="report_reason_illegal">不適切なコンテンツ</string>
|
||||
<string name="report_reason_community">コミュニティガイドライン違反</string>
|
||||
<string name="report_reason_profile">不適切なプロフィール</string>
|
||||
<string name="report_reason_other">他の理由</string>
|
||||
<string name="failed_to_save_servers">サーバーの保存中にエラーが発生しました</string>
|
||||
<string name="no_message_servers_configured">メッセージサーバーがありません</string>
|
||||
<string name="no_message_servers_configured_for_receiving">メッセージを受信するサーバーがありません</string>
|
||||
<string name="no_message_servers_configured_for_private_routing">プライベートメッセージルーティング用のサーバーがありません。</string>
|
||||
<string name="no_media_servers_configured">メディアおよびファイルサーバーは存在しません。</string>
|
||||
<string name="no_media_servers_configured_for_sending">ファイルを送信するサーバーがありません。</string>
|
||||
</resources>
|
||||
|
||||
@@ -268,7 +268,7 @@
|
||||
<string name="chat_preferences_contact_allows">O contacto permite</string>
|
||||
<string name="chat_preferences">Preferências de conversa</string>
|
||||
<string name="app_name">SimpleX</string>
|
||||
<string name="thousand_abbreviation">m</string>
|
||||
<string name="thousand_abbreviation">mil</string>
|
||||
<string name="connect_via_contact_link">Conectar através do endereço de contacto?</string>
|
||||
<string name="connect_via_invitation_link">Conectar via link de convite?</string>
|
||||
<string name="connect_via_group_link">Conectar através da ligação do grupo\?</string>
|
||||
@@ -971,8 +971,9 @@
|
||||
<string name="all_users">Todos os perfis</string>
|
||||
<string name="connect_plan_already_connecting">Já conectando!</string>
|
||||
<string name="connect_plan_already_joining_the_group">Já entrando no grupo!</string>
|
||||
<string name="forward_files_failed_to_receive_desc">%1$d arquivo(s) falharam o download.</string>
|
||||
<string name="n_file_errors">%1$d erro(s) no arquivo:\n%2$s</string>
|
||||
<string name="forward_files_in_progress_desc">%1$d arquivo(s) estão sendo baixados.</string>
|
||||
<string name="forward_files_missing_desc">%1$d arquivo(s) foram deletados.</string>
|
||||
<string name="forward_files_failed_to_receive_desc">Não foi possível descarregar %1$d ficheiros(s).</string>
|
||||
<string name="n_file_errors">%1$d erro(s) nos ficheiros:\n%2$s</string>
|
||||
<string name="forward_files_in_progress_desc">Ainda a descarregar %1$d ficheiros(s).</string>
|
||||
<string name="forward_files_missing_desc">%1$d ficheiros(s) eliminado(s).</string>
|
||||
<string name="forward_files_not_accepted_desc">Não foi possível descarregar %1$d ficheiro(s).</string>
|
||||
</resources>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<string name="group_info_section_title_num_members">%1$s MEMBRI</string>
|
||||
<string name="chat_item_ttl_day">1 zi</string>
|
||||
<string name="send_disappearing_message_1_minute">1 minut</string>
|
||||
<string name="one_time_link_short">Link de unică folosință</string>
|
||||
<string name="one_time_link_short">Link unic</string>
|
||||
<string name="send_disappearing_message_5_minutes">5 minute</string>
|
||||
<string name="about_simplex">Despre SimpleX</string>
|
||||
<string name="learn_more_about_address">Despre adresa SimpleX</string>
|
||||
@@ -135,7 +135,7 @@
|
||||
<string name="migrate_to_device_apply_onion">Aplică</string>
|
||||
<string name="create_profile">Creează profil</string>
|
||||
<string name="create_another_profile_button">Creează profil</string>
|
||||
<string name="v4_2_auto_accept_contact_requests">Acceptă automat cererile de contactare</string>
|
||||
<string name="v4_2_auto_accept_contact_requests">Acceptare automată a cererilor de contact</string>
|
||||
<string name="custom_time_picker_custom">personalizat</string>
|
||||
<string name="maximum_supported_file_size">În prezent dimensiunea maximă pentru fișiere este %1$s.</string>
|
||||
<string name="create_simplex_address">Creează adresă SimpleX</string>
|
||||
@@ -186,8 +186,8 @@
|
||||
<string name="restore_database_alert_confirm">Restaurați</string>
|
||||
<string name="refresh_qr_code">Reîmprospătează</string>
|
||||
<string name="revoke_file__title">Revocați fișierul?</string>
|
||||
<string name="revoke_file__confirm">Revocați</string>
|
||||
<string name="sync_connection_force_question">Renegociați criptarea?</string>
|
||||
<string name="revoke_file__confirm">Revocă</string>
|
||||
<string name="sync_connection_force_question">Renegociezi criptarea?</string>
|
||||
<string name="reset_verb">Resetare</string>
|
||||
<string name="reject">Respinge</string>
|
||||
<string name="save_passphrase_in_settings">Salvați fraza de acces în setări</string>
|
||||
@@ -205,16 +205,16 @@
|
||||
<string name="save_profile_password">Salvați parola profilului</string>
|
||||
<string name="save_passphrase_and_open_chat">Salvați fraza de acces și deschideți chatul</string>
|
||||
<string name="group_members_2">%s și %s</string>
|
||||
<string name="renegotiate_encryption">Renegociați criptarea</string>
|
||||
<string name="save_and_notify_contact">Salvați și notificați contactul</string>
|
||||
<string name="save_and_notify_contacts">Salvați și notificați contactele</string>
|
||||
<string name="save_and_notify_group_members">Salvați și notificați membrii grupului</string>
|
||||
<string name="renegotiate_encryption">Renegociază criptarea</string>
|
||||
<string name="save_and_notify_contact">Salvează și notifică contactul</string>
|
||||
<string name="save_and_notify_contacts">Salvează și notifică contactele</string>
|
||||
<string name="save_and_notify_group_members">Salvează și notifică membrii grupului</string>
|
||||
<string name="notifications_mode_off">Rulează când aplicația este deschisă</string>
|
||||
<string name="reply_verb">Răspunde</string>
|
||||
<string name="revoke_file__action">Revocați fișierul</string>
|
||||
<string name="revoke_file__action">Revocă fișierul</string>
|
||||
<string name="save_servers_button">Salvează</string>
|
||||
<string name="save_settings_question">Salvați setările?</string>
|
||||
<string name="save_preferences_question">Salvați preferințele?</string>
|
||||
<string name="save_preferences_question">Salvezi preferințele?</string>
|
||||
<string name="settings_restart_app">Repornire</string>
|
||||
<string name="restore_database">Restaurați copia de rezervă a bazei de date</string>
|
||||
<string name="restore_database_alert_title">Restaurați copia de rezervă a bazei de date?</string>
|
||||
@@ -232,7 +232,7 @@
|
||||
<string name="save_passphrase_in_keychain">Salvați fraza de acces în Keystore</string>
|
||||
<string name="save_group_profile">Salvați profilul grupului</string>
|
||||
<string name="wallpaper_scale_repeat">Repetă</string>
|
||||
<string name="send_link_previews">Trimiteți previzualizări de linkuri</string>
|
||||
<string name="send_link_previews">Trimite previzualizări de linkuri</string>
|
||||
<string name="set_passphrase">Setați frază de acces</string>
|
||||
<string name="share_address">Partajează adresa</string>
|
||||
<string name="info_row_sent_at">Trimis la</string>
|
||||
@@ -297,7 +297,7 @@
|
||||
<string name="profile_update_event_set_new_picture">setați o nouă poză de profil</string>
|
||||
<string name="share_text_sent_at">Trimis la: %s</string>
|
||||
<string name="conn_stats_section_title_servers">SERVERE</string>
|
||||
<string name="send_live_message">Trimiteți mesaj live</string>
|
||||
<string name="send_live_message">Trimite mesaj în direct</string>
|
||||
<string name="migrate_to_device_bytes_downloaded">%s descărcat</string>
|
||||
<string name="share_address_with_contacts_question">Partajați adresa cu contactele?</string>
|
||||
<string name="settings_notification_preview_mode_title">Afișează previzualizare</string>
|
||||
@@ -321,7 +321,7 @@
|
||||
<string name="system_restricted_background_desc">SimpleX nu poate rula în fundal. Vei primi notificări doar atunci când aplicația rulează.</string>
|
||||
<string name="simplex_service_notification_title">Serviciul SimpleX Chat</string>
|
||||
<string name="icon_descr_address">Adresă SimpleX</string>
|
||||
<string name="settings_shutdown">Oprește</string>
|
||||
<string name="settings_shutdown">Oprire</string>
|
||||
<string name="simplex_links">Linkuri SimpleX</string>
|
||||
<string name="simplex_links_are_prohibited_in_group">Linkurile SimpleX sunt interzise.</string>
|
||||
<string name="v4_2_security_assessment_desc">Securitatea chatului SimpleX a fost auditată de Trail of Bits.</string>
|
||||
@@ -359,7 +359,7 @@
|
||||
<string name="always_use_relay">Folosește mereu releu</string>
|
||||
<string name="chat_theme_apply_to_mode">Aplică pentru</string>
|
||||
<string name="add_contact_or_create_group">Începe o nouă conversație</string>
|
||||
<string name="star_on_github">Stea pe GitHub</string>
|
||||
<string name="star_on_github">Acordă o stea pe GitHub</string>
|
||||
<string name="conn_event_disabled_pq">criptare standard end-to-end</string>
|
||||
<string name="notifications_mode_periodic">Pornește periodic</string>
|
||||
<string name="network_smp_proxy_mode_always">Mereu</string>
|
||||
@@ -421,7 +421,7 @@
|
||||
<string name="alert_title_contact_connection_pending">Contactul nu este conectat încă!</string>
|
||||
<string name="connect_via_link">Conectare prin link</string>
|
||||
<string name="you_can_view_invitation_link_again">Puteți vedea din nou linkul de invitație în detaliile conexiunii.</string>
|
||||
<string name="your_chat_profiles">Profilurile tale de chat</string>
|
||||
<string name="your_chat_profiles">Profilurile tale de conversație</string>
|
||||
<string name="create_chat_profile">Creează profil de chat</string>
|
||||
<string name="callstatus_ended">apel încheiat %1$s</string>
|
||||
<string name="create_profile_button">Creează</string>
|
||||
@@ -520,7 +520,7 @@
|
||||
<string name="connect_plan_connect_to_yourself">Te conectezi la tine?</string>
|
||||
<string name="migrate_from_device_check_connection_and_try_again">Verifică conexiunea la internet și încearcă din nou</string>
|
||||
<string name="settings_section_title_chat_colors">Culori conversație</string>
|
||||
<string name="settings_section_title_chat_theme">Temă pentru chat</string>
|
||||
<string name="settings_section_title_chat_theme">Tema conversației</string>
|
||||
<string name="onboarding_notifications_mode_periodic_desc"><![CDATA[<b>Bun pentru baterie</b>. Aplicația verifică mesajele la fiecare 10 minute. Pot fi pierdute apeluri sau mesaje urgente.]]></string>
|
||||
<string name="theme_black">Negru</string>
|
||||
<string name="block_for_all_question">Blocați membrul pentru toți?</string>
|
||||
@@ -545,7 +545,7 @@
|
||||
<string name="app_version_code">Versiunea aplicației: %s</string>
|
||||
<string name="network_session_mode_user_description"><![CDATA[O conexiune separată TCP (și SOCKS credential), va fi folosită <b>pentru fiecare profil de conversație pe care le aveți în aplicație</b>]]></string>
|
||||
<string name="network_smp_proxy_fallback_allow_downgrade">Permiteți downgrade-ul</string>
|
||||
<string name="network_session_mode_entity_description"><![CDATA[O conexiune separată TCP (și SOCKS credential) va fi folosită <b>pentru fiecare contact și membru de grup</b> \n<b>Va rugăm considerați că:</b> dacă aveți prea multe conexiuni, consumul dumneavoastră de baterie și trafic de internet pot fi considerabil mai mari, iar unele conexiuni pot eșua.]]></string>
|
||||
<string name="network_session_mode_entity_description"><![CDATA[O conexiune TCP separată (și o acreditare SOCKS) va fi folosită <b>pentru fiecare contact și membru al grupului</b>.\n<b>Rețineți</b>: dacă aveți multe conexiuni, consumul bateriei și al traficului de date poate crește considerabil, iar unele conexiuni pot eșua.]]></string>
|
||||
<string name="desktop_connection_terminated">Conexiune terminată</string>
|
||||
<string name="connecting_to_desktop">Se conectează la desktop</string>
|
||||
<string name="icon_descr_asked_to_receive">S-a solicitat primirea imaginii</string>
|
||||
@@ -554,7 +554,7 @@
|
||||
<string name="callstate_connected">conectat</string>
|
||||
<string name="confirm_passcode">Confirmați codul de access</string>
|
||||
<string name="confirm_database_upgrades">Confirmare actualizare bază de date</string>
|
||||
<string name="rcv_group_event_changed_member_role">"schimbat rolul lui %s la %s"</string>
|
||||
<string name="rcv_group_event_changed_member_role">a schimbat rolul lui %s în %s</string>
|
||||
<string name="rcv_group_event_member_connected">conectat</string>
|
||||
<string name="group_member_status_introduced">se conectează (introdus)</string>
|
||||
<string name="group_member_status_connected">conectat</string>
|
||||
@@ -586,13 +586,13 @@
|
||||
<string name="clear_chat_button">Șterge conversația</string>
|
||||
<string name="connect_button">Conectare</string>
|
||||
<string name="chat_console">Consolă conversație</string>
|
||||
<string name="confirm_password">Confirmați parola</string>
|
||||
<string name="confirm_password">Confirmă parola</string>
|
||||
<string name="colored_text">colorat</string>
|
||||
<string name="migrate_from_device_all_data_will_be_uploaded">Toate contactele, conversațiile și fișierele dvs. vor fi criptate securizat și încărcate în fragmente către releele XFTP configurate.</string>
|
||||
<string name="icon_descr_video_asked_to_receive">S-a solicitat primirea videoclipului</string>
|
||||
<string name="smp_server_test_compare_file">Comparați fișierul</string>
|
||||
<string name="impossible_to_recover_passphrase"><![CDATA[<b>Vă rugăm să rețineți</b>: nu veți putea recupera sau schimba parola dacă o veți pierde.]]></string>
|
||||
<string name="rcv_group_event_changed_your_role">schimbat rolul dumneavoastră la %s</string>
|
||||
<string name="rcv_group_event_changed_your_role">rolul tău a fost schimbat în %s</string>
|
||||
<string name="server_connected">conectat</string>
|
||||
<string name="server_connecting">se conectează</string>
|
||||
<string name="notification_contact_connected">conectat</string>
|
||||
@@ -600,7 +600,7 @@
|
||||
<string name="icon_descr_close_button">Buton de închidere</string>
|
||||
<string name="clear_verification">Ștergeți verificarea</string>
|
||||
<string name="configure_ICE_servers">Configurare servere ICE</string>
|
||||
<string name="rcv_group_event_member_created_contact">conectat direct</string>
|
||||
<string name="rcv_group_event_member_created_contact">conexiune solicitată</string>
|
||||
<string name="group_member_status_announced">se conectează (anunțat)</string>
|
||||
<string name="onboarding_notifications_mode_off_desc"><![CDATA[<b>Cel mai bun pentru baterie.</b> Veți primi notificări doar când aplicația rulează (FĂRĂ servicii de fundal).]]></string>
|
||||
<string name="icon_descr_call_connecting">Se conectează apelul</string>
|
||||
@@ -634,7 +634,7 @@
|
||||
<string name="decryption_error">Eroare de decriptare</string>
|
||||
<string name="delete_image">Șterge imaginea</string>
|
||||
<string name="delete_after">Șterge după</string>
|
||||
<string name="full_deletion">Ștergeți pentru toată lumea</string>
|
||||
<string name="full_deletion">Șterge pentru toată lumea</string>
|
||||
<string name="simplex_link_mode_description">Descriere</string>
|
||||
<string name="smp_server_test_delete_file">Șterge fișierul</string>
|
||||
<string name="smp_server_test_delete_queue">Șterge coada</string>
|
||||
@@ -645,12 +645,12 @@
|
||||
<string name="ttl_days">%d zile</string>
|
||||
<string name="ttl_day">%d zi</string>
|
||||
<string name="delete_address">Șterge adresa</string>
|
||||
<string name="delete_messages">Ștergeți mesajele</string>
|
||||
<string name="delete_messages">Șterge mesajele</string>
|
||||
<string name="delete_messages__question">Ștergeți %d mesaje?</string>
|
||||
<string name="delete_address__question">Ștergi adresa?</string>
|
||||
<string name="delete_files_and_media_all">Șterge toate fișierele</string>
|
||||
<string name="delete_link">Șterge linkul</string>
|
||||
<string name="delete_link_question">Ștergeți linkul?</string>
|
||||
<string name="delete_link_question">Ștergi linkul?</string>
|
||||
<string name="custom_time_unit_days">zile</string>
|
||||
<string name="delete_verb">Șterge</string>
|
||||
<string name="delete_message__question">Ștergeți mesajul?</string>
|
||||
@@ -659,7 +659,7 @@
|
||||
<string name="smp_servers_delete_server">Ștergeți serverul</string>
|
||||
<string name="delete_database">Șterge baza de date</string>
|
||||
<string name="rcv_direct_event_contact_deleted">contact șters</string>
|
||||
<string name="delete_group_question">Ștergeți grupul?</string>
|
||||
<string name="delete_group_question">Ștergi grupul?</string>
|
||||
<string name="migrate_from_device_delete_database_from_device">Șterge baza de date de pe acest dispozitiv</string>
|
||||
<string name="delete_chat_profile">Șterge profil de conversație</string>
|
||||
<string name="delete_files_and_media_for_all_users">Șterge fișierele pentru toate profilurile de chat</string>
|
||||
@@ -685,7 +685,7 @@
|
||||
<string name="app_check_for_updates_notice_title">Verifică pentru actualizări</string>
|
||||
<string name="create_address_button">Creează</string>
|
||||
<string name="privacy_media_blur_radius">Estompează media</string>
|
||||
<string name="settings_section_title_chat_database">BAZĂ DE DATE DISCUȚIE</string>
|
||||
<string name="settings_section_title_chat_database">BAZĂ DE DATE CONVERSAȚIE</string>
|
||||
<string name="v6_0_connect_faster_descr">Conectează-te cu prietenii mai ușor.</string>
|
||||
<string name="attempts_label">încercări</string>
|
||||
<string name="completed">Completat</string>
|
||||
@@ -717,13 +717,13 @@
|
||||
<string name="cant_call_contact_connecting_wait_alert_text">Se conectează la contact, vă rugăm să așteptați sau să verificați mai târziu!</string>
|
||||
<string name="network_settings_title">Setări avansate</string>
|
||||
<string name="toolbar_settings">Setări</string>
|
||||
<string name="your_settings">Setările tale</string>
|
||||
<string name="your_settings">Setări</string>
|
||||
<string name="encrypted_audio_call">apel audio criptat e2e</string>
|
||||
<string name="encrypted_video_call">apel video criptat e2e</string>
|
||||
<string name="settings_section_title_device">DISPOZITIV</string>
|
||||
<string name="settings_section_title_experimenta">EXPERIMENTAL</string>
|
||||
<string name="encrypt_database">Criptează</string>
|
||||
<string name="decryption_errors">erori la descifrare</string>
|
||||
<string name="decryption_errors">erori de decriptare</string>
|
||||
<string name="settings_section_title_you">TU</string>
|
||||
<string name="status_no_e2e_encryption">nicio criptare e2e</string>
|
||||
<string name="status_e2e_encrypted">criptat e2e</string>
|
||||
@@ -747,7 +747,7 @@
|
||||
<string name="simplex_link_mode_browser">Prin browser</string>
|
||||
<string name="report_reason_spam">Spam</string>
|
||||
<string name="report_reason_illegal">Conținut inadecvat</string>
|
||||
<string name="report_reason_community">Încălcă normelor comunitare</string>
|
||||
<string name="report_reason_community">Încălcarea liniilor directoare ale comunității</string>
|
||||
<string name="report_reason_profile">Profil inadecvat</string>
|
||||
<string name="report_reason_other">Alt motiv</string>
|
||||
<string name="error_saving_smp_servers">Eroare la salvarea serverelor SMP</string>
|
||||
@@ -761,7 +761,7 @@
|
||||
<string name="encryption_renegotiation_error">Eroare de renegociere a criptării</string>
|
||||
<string name="display_name_invited_to_connect">invitat să se conecteze</string>
|
||||
<string name="description_via_contact_address_link_incognito">incognito prin linkul adresei de contact</string>
|
||||
<string name="description_via_one_time_link">printr-un link de unică folosință</string>
|
||||
<string name="description_via_one_time_link">prin link de unică folosință</string>
|
||||
<string name="group_reports_active_one">1 raport</string>
|
||||
<string name="chat_item_ttl_year">1 an</string>
|
||||
<string name="forwarded_description">redirecționat</string>
|
||||
@@ -819,9 +819,9 @@
|
||||
<string name="import_database_question">Importați baza de date de chat?</string>
|
||||
<string name="delete_report">Ștergeți raportul</string>
|
||||
<string name="forward_multiple">Redirecționați mesajele…</string>
|
||||
<string name="only_delete_conversation">Ștergeți doar conversația</string>
|
||||
<string name="only_delete_conversation">Șterge doar conversația</string>
|
||||
<string name="keep_unused_invitation_question">Păstrezi invitația nefolosită?</string>
|
||||
<string name="display_name">Introduceți numele dumneavoastră:</string>
|
||||
<string name="display_name">Introdu numele tău:</string>
|
||||
<string name="permissions_grant">Acordați permisiunea (permisiunile) de a efectua apeluri</string>
|
||||
<string name="onboarding_notifications_mode_battery">Notificări și baterie</string>
|
||||
<string name="open_verb">Deschide</string>
|
||||
@@ -948,7 +948,7 @@
|
||||
<string name="edit_verb">Editează</string>
|
||||
<string name="info_menu">Info</string>
|
||||
<string name="forwarded_from_chat_item_info_title">Redirecționat de la</string>
|
||||
<string name="delete_members_messages__question">Șterge %d mesaje de la membri?</string>
|
||||
<string name="delete_members_messages__question">Ștergi cele %d mesaje ale membrilor?</string>
|
||||
<string name="group_reports_member_reports">Rapoarte de membri</string>
|
||||
<string name="files_and_media_prohibited">Fișierele și conținutul media sunt interzise!</string>
|
||||
<string name="file_not_found">Fișierul nu a fost găsit</string>
|
||||
@@ -1037,13 +1037,13 @@
|
||||
<string name="smp_servers_new_server">Server nou</string>
|
||||
<string name="ensure_ICE_server_address_are_correct_format_and_unique">Asigurați -vă că adresele Serverului WebRTC ICE sunt în format corect, separate pe linii și nu sunt duplicate.</string>
|
||||
<string name="update_network_smp_proxy_fallback_question">Rutarea mesajelor</string>
|
||||
<string name="edit_image">Editați imaginea</string>
|
||||
<string name="edit_image">Editează imaginea</string>
|
||||
<string name="permissions_open_settings">Deschide setările</string>
|
||||
<string name="permissions_grant_in_settings">Acordare în setări</string>
|
||||
<string name="onboarding_notifications_mode_service">Instant</string>
|
||||
<string name="onboarding_notifications_mode_subtitle">Cum afectează bateria</string>
|
||||
<string name="receipts_contacts_enable_keep_overrides">Activare (păstrați suprascrierile)</string>
|
||||
<string name="enabled_self_destruct_passcode">Activați codul de autodistrugere</string>
|
||||
<string name="enabled_self_destruct_passcode">Activează codul de autodistrugere</string>
|
||||
<string name="member_info_section_title_member">MEMBRU</string>
|
||||
<string name="operator_info_title">Operator de rețea</string>
|
||||
<string name="linked_desktops">Desktop-uri conectate</string>
|
||||
@@ -1077,7 +1077,7 @@
|
||||
<string name="permissions_required">Acordare permisiuni</string>
|
||||
<string name="audio_device_earpiece">Cască</string>
|
||||
<string name="icon_descr_hang_up">Închide</string>
|
||||
<string name="encrypt_local_files">Criptați fișierele locale</string>
|
||||
<string name="encrypt_local_files">Criptează fișierele locale</string>
|
||||
<string name="lock_after">Blochează după</string>
|
||||
<string name="lock_mode">Mod de blocare</string>
|
||||
<string name="new_passcode">Cod de acces nou</string>
|
||||
@@ -1091,7 +1091,7 @@
|
||||
<string name="conn_level_desc_indirect">indirect (%1$s)</string>
|
||||
<string name="fix_connection_not_supported_by_group_member">Remedierea nu este acceptată de membrul grupului</string>
|
||||
<string name="operator">Operator</string>
|
||||
<string name="make_profile_private">Faceți profilul privat!</string>
|
||||
<string name="make_profile_private">Fă profilul privat!</string>
|
||||
<string name="operator_open_conditions">Deschideți contiții</string>
|
||||
<string name="dont_show_again">Nu mai afișa</string>
|
||||
<string name="incognito_info_allows">Permite să aibă multe conexiuni anonime fără date partajate între ele într -un singur profil de chat.</string>
|
||||
@@ -1114,7 +1114,7 @@
|
||||
<string name="group_new_support_chats">%d conversații cu membri</string>
|
||||
<string name="feature_enabled">activat</string>
|
||||
<string name="connection_error_quota_desc">Conexiunea a atins limita de mesaje nelivrate, este posibil ca persoana de contact să fie offline.</string>
|
||||
<string name="auth_disable_simplex_lock">Dezactivați SimpleX Lock</string>
|
||||
<string name="auth_disable_simplex_lock">Dezactivează blocarea SimpleX</string>
|
||||
<string name="migrate_from_device_error_saving_settings">Eroare la salvarea setărilor</string>
|
||||
<string name="disconnect_desktop_question">Deconectezi desktopul?</string>
|
||||
<string name="dont_enable_receipts">Nu activați</string>
|
||||
@@ -1131,7 +1131,7 @@
|
||||
<string name="error_deleting_pending_contact_connection">Eroare la ștergerea conexiunii de contact în așteptare</string>
|
||||
<string name="snd_conn_event_ratchet_sync_agreed">criptare agreată pentru %s</string>
|
||||
<string name="enter_welcome_message_optional">Introduceți mesajul de bun venit… (opțional)</string>
|
||||
<string name="v5_3_encrypt_local_files">Criptați fișierele stocate și media</string>
|
||||
<string name="v5_3_encrypt_local_files">Criptează fișierele și conținutul media stocat</string>
|
||||
<string name="error_accepting_operator_conditions">Eroare la acceptarea condițiilor</string>
|
||||
<string name="error_enabling_delivery_receipts">Eroare la activarea confirmărilor de livrare!</string>
|
||||
<string name="file_error">Eroare fișier</string>
|
||||
@@ -1169,7 +1169,7 @@
|
||||
<string name="invite_to_chat_button">Invitați la conversație</string>
|
||||
<string name="new_member_role">Nou rol de membru</string>
|
||||
<string name="button_add_members">Invitați membrii</string>
|
||||
<string name="button_edit_group_profile">Editați profilul de grup</string>
|
||||
<string name="button_edit_group_profile">Editează profilul grupului</string>
|
||||
<string name="delete_group_for_self_cannot_undo_warning">Grupul va fi șters pentru dvs. - această acțiune nu poate fi anulată!</string>
|
||||
<string name="member_will_be_removed_from_group_cannot_be_undone">Membrul va fi eliminat din grup - acest lucru nu poate fi anulat!</string>
|
||||
<string name="members_will_be_removed_from_chat_cannot_be_undone">Membrii vor fi eliminați din chat - acest lucru nu poate fi anulat!</string>
|
||||
@@ -1288,7 +1288,7 @@
|
||||
<string name="v6_0_private_routing_descr">Vă protejează adresa și conexiunile IP.</string>
|
||||
<string name="chat_theme_apply_to_light_mode">Mod luminos</string>
|
||||
<string name="v5_7_forward_descr">Sursa mesajelor rămâne privată.</string>
|
||||
<string name="v4_4_live_messages">Mesaje live</string>
|
||||
<string name="v4_4_live_messages">Mesaje în direct</string>
|
||||
<string name="network_proxy_incorrect_config_desc">Asigurați-vă că configurația proxy este corectă.</string>
|
||||
<string name="message_delivery_error_desc">Cel mai probabil acest contact a șters conexiunea cu dvs.</string>
|
||||
<string name="message_delivery_warning_title">Avertizare de livrare a mesajelor</string>
|
||||
@@ -1313,7 +1313,7 @@
|
||||
<string name="snd_group_event_group_profile_updated">profilul grupului a fost actualizat</string>
|
||||
<string name="group_member_role_owner">proprietar</string>
|
||||
<string name="button_delete_chat">Șterge conversația</string>
|
||||
<string name="group_member_status_left">ieșit</string>
|
||||
<string name="group_member_status_left">părăsit</string>
|
||||
<string name="fix_connection_not_supported_by_contact">Remedierea nu este suportată de contact</string>
|
||||
<string name="servers_info_sessions_errors">Erori</string>
|
||||
<string name="connect_plan_open_group">Deschide grupul</string>
|
||||
@@ -1333,7 +1333,7 @@
|
||||
<string name="learn_more">Află mai multe</string>
|
||||
<string name="invite_friends_short">Invită</string>
|
||||
<string name="error_initializing_web_view_wrong_arch">Eroare la inițializarea WebView. Asigurați-vă că aveți WebView instalat și că arhitectura sa suportată este arm64.\nEroare: %s</string>
|
||||
<string name="make_private_connection">Faceți o conexiune privată</string>
|
||||
<string name="make_private_connection">Stabilește o conexiune privată</string>
|
||||
<string name="open_simplex_chat_to_accept_call">Deschide SimpleX Chat pentru a accepta apelul</string>
|
||||
<string name="enable_lock">Activați blocarea</string>
|
||||
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Se poate întâmpla atunci când tu sau conexiunea ta ați folosit backupul vechi al bazei de date.</string>
|
||||
@@ -1416,7 +1416,7 @@
|
||||
<string name="message_reactions">Reacții la mesaje</string>
|
||||
<string name="expired_label">expirat</string>
|
||||
<string name="app_check_for_updates_button_download">Descărcați %s (%s)</string>
|
||||
<string name="app_check_for_updates_button_install">Instalați update</string>
|
||||
<string name="app_check_for_updates_button_install">Instalează actualizarea</string>
|
||||
<string name="dont_create_address">Nu crea adresă</string>
|
||||
<string name="onboarding_network_operators_app_will_use_for_routing">De exemplu, dacă persoana de contact primește mesaje prin intermediul unui server SimpleX Chat, aplicația le va livra prin intermediul unui server Flux.</string>
|
||||
<string name="call_desktop_permission_denied_safari">Deschide Setările Safari / Site-uri web / Microfon, apoi selectează Permite pentru localhost.</string>
|
||||
@@ -1452,7 +1452,7 @@
|
||||
<string name="v5_3_discover_join_groups">Descoperă și alătură-te grupurilor</string>
|
||||
<string name="v5_2_disappear_one_message_descr">Chiar și atunci când este dezactivat în conversație.</string>
|
||||
<string name="v5_2_more_things_descr">- livrare mai stabilă a mesajelor.\n- grupuri mai bune.\n- și multe altele!</string>
|
||||
<string name="v5_2_disappear_one_message">Face ca un mesaj să dispară</string>
|
||||
<string name="v5_2_disappear_one_message">Fă un mesaj să dispară</string>
|
||||
<string name="v5_6_app_data_migration_descr">Migrați către un alt dispozitiv prin codul QR.</string>
|
||||
<string name="v6_0_delete_many_messages_descr">Ștergeți până la 20 de mesaje odată.</string>
|
||||
<string name="connect_plan_join_your_group">Vrei să te alături grupului tău?</string>
|
||||
@@ -1460,7 +1460,7 @@
|
||||
<string name="service_notifications">Notificări instant!</string>
|
||||
<string name="turn_off_system_restriction_button">Deschide setările aplicației</string>
|
||||
<string name="la_seconds">%d secunde</string>
|
||||
<string name="auth_enable_simplex_lock">Activați SimpleX Lock</string>
|
||||
<string name="auth_enable_simplex_lock">Activează blocarea SimpleX</string>
|
||||
<string name="error_showing_desktop_notification">Eroare la afișarea notificării, contactați dezvoltatorii.</string>
|
||||
<string name="message_delivery_error_title">Eroare de livrare a mesajelor</string>
|
||||
<string name="snd_error_relay">Eroare server destinație: %1$s</string>
|
||||
@@ -1487,12 +1487,12 @@
|
||||
<string name="notifications">Notificări</string>
|
||||
<string name="only_group_owners_can_enable_voice">Doar proprietarii grupului pot activa mesajele vocale.</string>
|
||||
<string name="edit_chat_list_menu_action">Editați</string>
|
||||
<string name="live_message">Mesaj live!</string>
|
||||
<string name="live_message">Mesaj în direct!</string>
|
||||
<string name="mute_all_chat">Fără sunet toate</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="image_descr_link_preview">Previzualizare imagine din link</string>
|
||||
<string name="new_chat">Conversație nouă</string>
|
||||
<string name="one_time_link">Link invitație unică</string>
|
||||
<string name="one_time_link">Link de invitație unic</string>
|
||||
<string name="message_servers">Servere mesaje</string>
|
||||
<string name="smp_servers_other">Alte servere SMP</string>
|
||||
<string name="smp_servers_enter_manually">Introduceți serverul manual</string>
|
||||
@@ -1513,14 +1513,14 @@
|
||||
<string name="chat_item_ttl_none">niciodată</string>
|
||||
<string name="no_received_app_files">Niciun fișier primit sau trimis</string>
|
||||
<string name="new_passphrase">Frază de acces nouă…</string>
|
||||
<string name="encrypt_database_question">Criptați baza de date?</string>
|
||||
<string name="encrypt_database_question">Criptezi baza de date?</string>
|
||||
<string name="enter_correct_passphrase">Introduceți fraza de acces corectă.</string>
|
||||
<string name="join_group_question">Vrei să te alături grupului?</string>
|
||||
<string name="database_migrations">Migrații: %s</string>
|
||||
<string name="join_group_button">Alătură-te</string>
|
||||
<string name="leave_group_button">Părăsiți</string>
|
||||
<string name="leave_chat_question">Părăsiți conversația?</string>
|
||||
<string name="rcv_group_event_member_left">ieșit</string>
|
||||
<string name="rcv_group_event_member_left">a părăsit</string>
|
||||
<string name="rcv_group_event_invited_via_your_group_link">invitat prin linkul dvs. de grup</string>
|
||||
<string name="rcv_group_event_new_member_pending_review">Un membru nou vrea să se alăture grupului.</string>
|
||||
<string name="conn_event_ratchet_sync_agreed">criptare agreată</string>
|
||||
@@ -1580,7 +1580,7 @@
|
||||
<string name="export_theme">Exportă tema</string>
|
||||
<string name="import_theme">Importați tema</string>
|
||||
<string name="import_theme_error">Eroare la importul temei</string>
|
||||
<string name="error_accepting_contact_request">Eroare la acceptarea solicitării de contact</string>
|
||||
<string name="error_accepting_contact_request">Eroare la acceptarea cererii de contact</string>
|
||||
<string name="smp_server_test_download_file">Descărcați fișierul</string>
|
||||
<string name="error_deleting_contact">Eroare la ștergerea contactului</string>
|
||||
<string name="error_creating_address">Eroare la crearea adresei</string>
|
||||
@@ -1628,7 +1628,7 @@
|
||||
<string name="network_preset_servers_title">Servere presetate</string>
|
||||
<string name="la_please_remember_to_store_password">Vă rugăm să o rețineți sau să o păstrați în siguranță - nu există nicio modalitate de a recupera o parolă pierdută!</string>
|
||||
<string name="privacy_and_security">Confidențialitate și securitate</string>
|
||||
<string name="protect_app_screen">Protejați ecranul aplicației</string>
|
||||
<string name="protect_app_screen">Protejează ecranul aplicației</string>
|
||||
<string name="settings_section_title_profile_images">Imagini de profil</string>
|
||||
<string name="store_passphrase_securely_without_recover">Vă rugăm să stocați în siguranță fraza de acces, NU veți putea accesa chatul dacă o pierdeți.</string>
|
||||
<string name="prohibit_sending_voice_messages">Interziceți trimiterea de mesaje vocale.</string>
|
||||
@@ -1739,7 +1739,7 @@
|
||||
<string name="servers_info_reset_stats_alert_confirm">Resetare</string>
|
||||
<string name="chat_list_group_reports">Rapoarte</string>
|
||||
<string name="message_queue_info_server_info">informații despre coada serverului: %1$s\n\nultimul mesaj primit: %2$s</string>
|
||||
<string name="network_options_save_and_reconnect">Salvați și reconectați</string>
|
||||
<string name="network_options_save_and_reconnect">Salvează și reconectează-te</string>
|
||||
<string name="report_compose_reason_header_other">Raportați altceva: doar moderatorii grupului îl vor vedea.</string>
|
||||
<string name="info_view_search_button">caută</string>
|
||||
<string name="text_field_set_chat_placeholder">Setați numele chatului…</string>
|
||||
@@ -1752,7 +1752,7 @@
|
||||
<string name="operator_review_conditions">Examinați condițiile</string>
|
||||
<string name="report_verb">Raport</string>
|
||||
<string name="switch_receiving_address_desc">Adresa de primire va fi schimbată la un alt server. Schimbarea adresei se va finaliza după ce expeditorul se conectează online.</string>
|
||||
<string name="save_admission_question">Salvați setările pentru admitere?</string>
|
||||
<string name="save_admission_question">Salvezi setările de acces?</string>
|
||||
<string name="onboarding_network_operators_review_later">Revizuiți mai târziu</string>
|
||||
<string name="receipts_groups_override_disabled">Trimiterea confirmărilor este dezactivată pentru %d grupuri</string>
|
||||
<string name="group_member_status_pending_review_short">recenzie</string>
|
||||
@@ -1802,7 +1802,7 @@
|
||||
<string name="select_chat_profile">Selectează profilul de chat</string>
|
||||
<string name="save_auto_accept_settings">Salvați setările de acceptare automată</string>
|
||||
<string name="save_list">Salvați lista</string>
|
||||
<string name="settings_section_title_delivery_receipts">TRIMITEȚI CONFIRMĂRI DE LIVRARE LA</string>
|
||||
<string name="settings_section_title_delivery_receipts">TRIMITE CONFIRMĂRI DE LIVRARE LA</string>
|
||||
<string name="self_destruct_passcode_changed">Parola de autodistrugere a fost schimbată!</string>
|
||||
<string name="info_row_updated_at">Înregistrare actualizată la</string>
|
||||
<string name="onboarding_select_network_operators_to_use">Selectează operatorii de rețea de utilizat.</string>
|
||||
@@ -1851,7 +1851,7 @@
|
||||
<string name="file_error_auth">Cheie greșită sau adresă necunoscută a fragmentului de fișier - cel mai probabil fișierul este șters.</string>
|
||||
<string name="videos_limit_title">Prea multe videoclipuri!</string>
|
||||
<string name="icon_descr_video_snd_complete">Videoclip trimis</string>
|
||||
<string name="stop_sharing">Opriți partajarea</string>
|
||||
<string name="stop_sharing">Oprește partajarea</string>
|
||||
<string name="webrtc_ice_servers">Servere ICE WebRTC</string>
|
||||
<string name="upgrade_and_open_chat">Actualizați și deschideți chatul</string>
|
||||
<string name="uploaded_files">Fișiere încărcate</string>
|
||||
@@ -1904,7 +1904,7 @@
|
||||
<string name="network_proxy_auth_mode_isolate_by_auth_entity">Folosește acreditări proxy diferite pentru fiecare conexiune.</string>
|
||||
<string name="simplex_address_or_1_time_link">Adresă SimpleX sau link unic?</string>
|
||||
<string name="to_protect_privacy_simplex_has_ids_for_queues">Pentru a vă proteja confidențialitatea, SimpleX folosește ID-uri separate pentru fiecare dintre contactele dvs.</string>
|
||||
<string name="you_are_invited_to_group">Ești invitat(ă) în grup</string>
|
||||
<string name="you_are_invited_to_group">Ai fost invitat în grup</string>
|
||||
<string name="operator_use_for_messages_receiving">Pentru a primi</string>
|
||||
<string name="operator_use_for_files">Utilizare pentru fișiere</string>
|
||||
<string name="operator_use_for_sending">Pentru a trimite</string>
|
||||
@@ -1933,7 +1933,7 @@
|
||||
<string name="group_member_status_unknown_short">necunoscut</string>
|
||||
<string name="you_can_hide_or_mute_user_profile">Poți ascunde sau dezactiva notificările unui profil de utilizator – ține apăsat pentru meniu.</string>
|
||||
<string name="chat_preferences_you_allow">Ați permis</string>
|
||||
<string name="share_1_time_link_with_a_friend">Partajează link cu utilizare unică cu un prieten</string>
|
||||
<string name="share_1_time_link_with_a_friend">Partajează linkul unic cu un prieten</string>
|
||||
<string name="v4_3_voice_messages">Mesaje vocale</string>
|
||||
<string name="voice_message_send_text">Mesaj vocal…</string>
|
||||
<string name="network_socks_proxy_settings">Setări proxy SOCKS</string>
|
||||
@@ -1946,11 +1946,11 @@
|
||||
<string name="voice_messages_prohibited">Mesajele vocale sunt interzise!</string>
|
||||
<string name="you_accepted_connection">Ați acceptat conexiunea</string>
|
||||
<string name="share_address_publicly">Partajează adresa public</string>
|
||||
<string name="share_this_1_time_link">Partajează acest link de invitație cu utilizare unică</string>
|
||||
<string name="share_this_1_time_link">Partajează acest link de invitație unic</string>
|
||||
<string name="to_verify_compare">Pentru a verifica criptarea end-to-end cu contactul dvs., comparați (sau scanați) codul de pe dispozitivele dvs.</string>
|
||||
<string name="smp_servers_use_server_for_new_conn">Utilizare pentru conexiuni noi</string>
|
||||
<string name="network_socks_toggle_use_socks_proxy">Utilizați proxy SOCKS</string>
|
||||
<string name="stop_sharing_address">Opriți partajarea adresei?</string>
|
||||
<string name="stop_sharing_address">Oprești partajarea adresei?</string>
|
||||
<string name="onboarding_notifications_mode_off">Când aplicația rulează</string>
|
||||
<string name="onboarding_network_operators_app_will_use_different_operators">Aplicația vă protejează confidențialitatea utilizând operatori diferiți în fiecare conversație.</string>
|
||||
<string name="view_conditions">Vizualizați condițiile</string>
|
||||
@@ -1997,7 +1997,7 @@
|
||||
<string name="file_not_approved_descr">Fără Tor sau VPN, adresa ta IP va fi vizibilă pentru aceste retransmiteri XFTP:\n%1$s.</string>
|
||||
<string name="update_database_passphrase">Actualizați parola bazei de date</string>
|
||||
<string name="stop_snd_file__title">Opriți trimiterea fișierului?</string>
|
||||
<string name="strikethrough_text">lovitură</string>
|
||||
<string name="strikethrough_text">tăiere</string>
|
||||
<string name="next_generation_of_private_messaging">Viitorul mesageriei</string>
|
||||
<string name="call_desktop_permission_denied_title">Pentru a efectua apeluri, permiteți utilizarea microfonului. Încheiați apelul și încercați să sunați din nou.</string>
|
||||
<string name="onboarding_network_operators_cant_see_who_talks_to_whom">Când sunt activați mai mulți operatori, niciunul dintre ei nu are metadate pentru a afla cine comunică cu cine.</string>
|
||||
@@ -2093,13 +2093,13 @@
|
||||
<string name="unlink_desktop_question">Deconectați desktopul?</string>
|
||||
<string name="waiting_for_desktop">Se așteaptă desktopul…</string>
|
||||
<string name="images_limit_title">Prea multe imagini!</string>
|
||||
<string name="smp_server_test_upload_file">Încărcați fișierul</string>
|
||||
<string name="smp_server_test_upload_file">Încarcă fișier</string>
|
||||
<string name="chat_help_tap_button">Atinge butonul</string>
|
||||
<string name="tap_to_scan">Atingeți pentru a scana</string>
|
||||
<string name="to_share_with_your_contact">(pentru a partaja cu persoana de contact)</string>
|
||||
<string name="to_start_a_new_chat_help_header">Pentru a începe o nouă conversație</string>
|
||||
<string name="gallery_video_button">Video</string>
|
||||
<string name="share_invitation_link">Partajează link cu utilizare unică</string>
|
||||
<string name="share_invitation_link">Partajează link unic</string>
|
||||
<string name="this_link_is_not_a_valid_connection_link">Acest link nu este un link de conectare valid!</string>
|
||||
<string name="this_QR_code_is_not_a_link">Acest cod QR nu este un link!</string>
|
||||
<string name="short_link_button_text">Link scurt</string>
|
||||
@@ -2161,7 +2161,7 @@
|
||||
<string name="report_archive_alert_desc">Raportul va fi arhivat pentru dvs.</string>
|
||||
<string name="address_creation_instruction">Atingeți Creează o adresă SimpleX în meniu pentru a o crea mai târziu.</string>
|
||||
<string name="this_text_is_available_in_settings">Acest text este disponibil în setări</string>
|
||||
<string name="group_preview_you_are_invited">ești invitat în grup</string>
|
||||
<string name="group_preview_you_are_invited">Ești invitat în grup</string>
|
||||
<string name="icon_descr_waiting_for_image">Se așteaptă imaginea</string>
|
||||
<string name="waiting_for_image">Se așteaptă imaginea</string>
|
||||
<string name="icon_descr_waiting_for_video">Se așteaptă videoclipul</string>
|
||||
@@ -2174,7 +2174,7 @@
|
||||
<string name="share_simplex_address_on_social_media">Partajează adresa SimpleX pe rețelele de socializare.</string>
|
||||
<string name="scan_qr_to_connect_to_contact">Pentru a se conecta, contactul dvs. poate scana codul QR sau poate folosi linkul din aplicație.</string>
|
||||
<string name="you_can_set_connection_name_to_remember">Puteți seta numele conexiunii, pentru a vă aminti cu cine a fost partajat linkul.</string>
|
||||
<string name="simplex_address_and_1_time_links_are_safe_to_share">Adresa SimpleX și linkurile unice pot fi partajate în siguranță prin orice serviciu de mesagerie.</string>
|
||||
<string name="simplex_address_and_1_time_links_are_safe_to_share">Adresa SimpleX și linkurile unice pot fi partajate în siguranță prin orice aplicație de mesagerie.</string>
|
||||
<string name="code_you_scanned_is_not_simplex_link_qr_code">Codul scanat nu este un cod QR de tip link SimpleX.</string>
|
||||
<string name="smp_servers_test_server">Server de testare</string>
|
||||
<string name="smp_servers_test_servers">Servere de testare</string>
|
||||
@@ -2235,7 +2235,7 @@
|
||||
<string name="chunks_deleted">Bucăți șterse</string>
|
||||
<string name="your_ICE_servers">Serverele tale ICE</string>
|
||||
<string name="snd_group_event_member_deleted">ai eliminat %1$s</string>
|
||||
<string name="your_preferences">Preferințele dumneavoastră</string>
|
||||
<string name="your_preferences">Preferințele tale</string>
|
||||
<string name="chat_list_add_list">Adaugă listă</string>
|
||||
<string name="chat_list_all">Toate</string>
|
||||
<string name="you_can_still_view_conversation_with_contact">Puteți vizualiza în continuare conversația cu %1$s în lista de conversații.</string>
|
||||
@@ -2245,7 +2245,7 @@
|
||||
<string name="connection_error_blocked">Conexiune blocată</string>
|
||||
<string name="connection_error_blocked_desc">Conexiunea este blocată de operatorul serverului:\n%1$s.</string>
|
||||
<string name="all_message_and_files_e2e_encrypted"><![CDATA[Toate mesajele și fișierele sunt trimise <b>criptate end-to-end</b>, cu securitate post-cuantică în mesajele directe.]]></string>
|
||||
<string name="appearance_app_toolbars">Bare de instrumente ale aplicației</string>
|
||||
<string name="appearance_app_toolbars">Bare de instrumente</string>
|
||||
<string name="v6_1_better_security">Securitate îmbunătățită ✅</string>
|
||||
<string name="delete_chat_list_warning">Toate conversațiile vor fi eliminate din lista %s, iar lista va fi ștearsă</string>
|
||||
<string name="switching_profile_error_message">Conexiunea dvs. a fost mutată la %s, dar a apărut o eroare neașteptată la redirecționarea către profil.</string>
|
||||
@@ -2257,20 +2257,20 @@
|
||||
<string name="privacy_chat_list_open_links_ask">Întreabă</string>
|
||||
<string name="operator_same_conditions_will_be_applied"><![CDATA[Aceleași condiții se vor aplica și operatorului <b>%s</b>.]]></string>
|
||||
<string name="change_automatic_deletion_question">Schimbați ștergerea automată a mesajelor?</string>
|
||||
<string name="address_or_1_time_link">Adresă sau link de unică folosință?</string>
|
||||
<string name="address_or_1_time_link">Adresă sau link unic?</string>
|
||||
<string name="network_session_mode_session">Sesiune de aplicație</string>
|
||||
<string name="contact_list_header_title">Contactele dvs.</string>
|
||||
<string name="network_proxy_auth_mode_username_password">Este posibil ca datele dumneavoastră de autentificare să fie trimise necriptate.</string>
|
||||
<string name="contact_list_header_title">Contactele tale</string>
|
||||
<string name="network_proxy_auth_mode_username_password">Datele tale de conectare pot fi trimise necriptat.</string>
|
||||
<string name="business_address">Adresă de afaceri</string>
|
||||
<string name="add_your_team_members_to_conversations">Adăugați membrii echipei dvs. la conversații.</string>
|
||||
<string name="onboarding_notifications_mode_periodic_desc_short">Verifică mesajele la fiecare 10 minute</string>
|
||||
<string name="operator_in_order_to_use_accept_conditions"><![CDATA[Pentru a utiliza serverele <b>%s</b>, acceptați condițiile de utilizare.]]></string>
|
||||
<string name="auth_confirm_credential">Confirmați autentificarea dvs</string>
|
||||
<string name="auth_confirm_credential">Confirmă-ți datele de autentificare</string>
|
||||
<string name="auth_open_chat_profiles">Schimbă profilurile de chat</string>
|
||||
<string name="chat_list_contacts">Contacte</string>
|
||||
<string name="sync_connection_desc">Conexiunea necesită renegocierea criptării.</string>
|
||||
<string name="your_simplex_contact_address">Adresa ta SimpleX</string>
|
||||
<string name="create_1_time_link">Creează link de unică folosință</string>
|
||||
<string name="create_1_time_link">Creează link unic</string>
|
||||
<string name="your_current_profile">Profilul tău actual</string>
|
||||
<string name="onboarding_notifications_mode_service_desc_short">Aplicația rulează întotdeauna în fundal</string>
|
||||
<string name="rcv_group_event_member_accepted">acceptat %1$s</string>
|
||||
@@ -2282,8 +2282,8 @@
|
||||
<string name="v6_0_your_contacts_descr">Arhivează contactele pentru a discuta mai târziu.</string>
|
||||
<string name="connect_plan_you_are_already_connecting_to_vName"><![CDATA[Vă conectați deja la <b>%1$s</b>.]]></string>
|
||||
<string name="non_content_uri_alert_text">Ai partajat o cale de fișier nevalidă. Raportează problema dezvoltatorilor aplicației.</string>
|
||||
<string name="mobile_tap_open_in_mobile_app_then_tap_connect_in_app"><![CDATA[📱 mobil: atingeți <b>Deschideți în aplicația mobilă</b>, apoi atingeți <b>Conectați-vă</b> în aplicație.]]></string>
|
||||
<string name="add_short_link">Adaugă link scurt</string>
|
||||
<string name="mobile_tap_open_in_mobile_app_then_tap_connect_in_app"><![CDATA[📱 mobil: atinge <b>Deschide în aplicația mobilă</b>, apoi atinge <b>Conectare</b> în aplicație.]]></string>
|
||||
<string name="add_short_link">Actualizează adresa</string>
|
||||
<string name="onboarding_conditions_configure_server_operators">Configurați operatorii serverului</string>
|
||||
<string name="onboarding_network_operators_conditions_will_be_accepted">Condițiile vor fi acceptate pentru operatorii activați după 30 de zile.</string>
|
||||
<string name="call_desktop_permission_denied_chrome">Faceți clic pe butonul de informații de lângă câmpul de adresă pentru a permite utilizarea microfonului.</string>
|
||||
@@ -2295,10 +2295,10 @@
|
||||
<string name="you_can_share_group_link_anybody_will_be_able_to_connect">Poți partaja un link sau un cod QR - oricine se va putea alătura grupului. Nu vei pierde membrii grupului dacă îl ștergi ulterior.</string>
|
||||
<string name="block_members_for_all_question">Blocați membrii pentru toți?</string>
|
||||
<string name="info_row_chat">Chat</string>
|
||||
<string name="operators_conditions_accepted_for"><![CDATA[Condițiile sunt acceptate pentru operatorul(ii): <b>%s</b>.]]></string>
|
||||
<string name="operators_conditions_accepted_for"><![CDATA[Condițiile au fost acceptate pentru operatorul: <b>%s</b>.]]></string>
|
||||
<string name="operator_conditions_accepted_on">Condiții acceptate pe: %s.</string>
|
||||
<string name="operator_conditions_accepted_for_enabled_operators_on">Condițiile vor fi acceptate automat pentru operatorii activați pe: %s.</string>
|
||||
<string name="operator_conditions_accepted_for_some"><![CDATA[Condițiile sunt deja acceptate pentru următorii operatori: <b>%s</b>.]]></string>
|
||||
<string name="operator_conditions_accepted_for_some"><![CDATA[Condițiile au fost acceptate pentru operatorul: <b>%s</b>.]]></string>
|
||||
<string name="operator_conditions_will_be_applied"><![CDATA[Aceste condiții se vor aplica și pentru: <b>%s</b>.]]></string>
|
||||
<string name="operators_conditions_will_also_apply"><![CDATA[Aceste condiții se vor aplica și pentru: <b>%s</b>.]]></string>
|
||||
<string name="operator_conditions_of_use">Condiții de utilizare</string>
|
||||
@@ -2320,7 +2320,7 @@
|
||||
<string name="button_add_friends">Adaugă prieteni</string>
|
||||
<string name="button_add_team_members">Adaugă membri echipei</string>
|
||||
<string name="connect_plan_chat_already_exists">Chatul există deja!</string>
|
||||
<string name="you_can_also_connect_by_clicking_the_link"><![CDATA[Vă puteți conecta și dând clic pe link. Dacă se deschide în browser, faceți clic pe butonul <b>Deschideți în aplicația mobilă</b>.]]></string>
|
||||
<string name="you_can_also_connect_by_clicking_the_link"><![CDATA[Poți să te conectezi și dând clic pe link. Dacă se deschide în browser, apasă pe butonul <b>Deschide în aplicația mobilă</b>.]]></string>
|
||||
<string name="onboarding_network_operators_continue">Continuă</string>
|
||||
<string name="remote_host_error_disconnected"><![CDATA[Telefonul<b>%s</b> a fost deconectat]]></string>
|
||||
<string name="onboarding_network_about_operators">Despre operatori</string>
|
||||
@@ -2338,7 +2338,7 @@
|
||||
<string name="rcv_group_event_user_accepted">invitație acceptată</string>
|
||||
<string name="you_can_share_your_address">Puteți să vă împărtășiți adresa ca link sau cod QR - oricine se poate conecta la dvs.</string>
|
||||
<string name="onboarding_conditions_accept">Acceptă</string>
|
||||
<string name="your_privacy">Confidențialitatea dumneavoastră</string>
|
||||
<string name="your_privacy">Confidențialitatea ta</string>
|
||||
<string name="accept_conditions">Acceptă condițiile</string>
|
||||
<string name="appearance_zoom">Zoom</string>
|
||||
<string name="connect_plan_you_are_already_joining_the_group_vName"><![CDATA[Deja te alături grupului <b>%1$s</b>.]]></string>
|
||||
@@ -2369,10 +2369,10 @@
|
||||
<string name="remote_host_disconnected_from"><![CDATA[Deconectat de la mobil <b>%s</b> cu motivul: %s]]></string>
|
||||
<string name="remote_host_was_disconnected_toast"><![CDATA[Telefonul<b>%s</b> a fost deconectat]]></string>
|
||||
<string name="new_desktop"><![CDATA[<i>(nou)</i>]]></string>
|
||||
<string name="smp_servers_your_server">Serverul dumneavoastră</string>
|
||||
<string name="smp_servers_your_server">Serverul tău</string>
|
||||
<string name="you_need_to_allow_calls">Trebuie să îi permiți contactului tău să te sune pentru a-l putea suna.</string>
|
||||
<string name="smp_servers_your_server_address">Adresa serverului dvs.</string>
|
||||
<string name="your_servers">Serverele dumneavoastră</string>
|
||||
<string name="your_servers">Serverele tale</string>
|
||||
<string name="you_will_be_connected_when_group_host_device_is_online">Vei fi conectat la grup atunci când dispozitivul gazdei grupului va fi online, te rugăm să aștepți sau să verifici mai târziu!</string>
|
||||
<string name="people_can_connect_only_via_links_you_share">Tu decizi cine se poate conecta.</string>
|
||||
<string name="you_will_be_connected_when_your_connection_request_is_accepted">Vei fi conectat când cererea ta de conectare va fi acceptată, te rugăm să aștepți sau să verifici mai târziu!</string>
|
||||
@@ -2380,7 +2380,7 @@
|
||||
<string name="v6_1_better_user_experience">Experiență de utilizare îmbunătățită</string>
|
||||
<string name="group_new_support_chat_one">1 chat cu un membru</string>
|
||||
<string name="report_archive_alert_desc_all">Toate rapoartele vor fi arhivate pentru dvs.</string>
|
||||
<string name="read_more_in_github_with_link"><![CDATA[Citiți mai multe în <font color="#0088ff">repozitoriul nostru GitHub</font>.]]></string>
|
||||
<string name="read_more_in_github_with_link"><![CDATA[Citește mai multe în <font color="#0088ff">depozitul nostru GitHub</font>.]]></string>
|
||||
<string name="turn_off_battery_optimization"><![CDATA[<b>Permiteți</b> în următoarea fereastră de dialog să primească notificări instantaneu.]]></string>
|
||||
<string name="address_settings">Setări adresă</string>
|
||||
<string name="archive_reports">Arhivare rapoarte</string>
|
||||
@@ -2388,10 +2388,10 @@
|
||||
<string name="member_criteria_all">toți</string>
|
||||
<string name="chat_list_businesses">Afaceri</string>
|
||||
<string name="onboarding_conditions_by_using_you_agree">Prin utilizarea SimpleX Chat sunteți de acord să:\n- trimiteți doar conținut legal în grupurile publice.\n- respectați ceilalți utilizatori – fără spam.</string>
|
||||
<string name="one_time_link_can_be_used_with_one_contact_only"><![CDATA[Linkul unic poate fi folosit <i> cu un singur contact</i> - partajați personal sau prin orice mesagerie.]]></string>
|
||||
<string name="one_time_link_can_be_used_with_one_contact_only"><![CDATA[Linkul unic poate fi folosit <i>doar cu un singur contact</i> - partajează-l personal sau prin orice altă aplicație de mesagerie.]]></string>
|
||||
<string name="migrate_from_device_you_must_not_start_database_on_two_device">Nu trebuie să utilizați aceeași bază de date pe două dispozitive.</string>
|
||||
<string name="if_you_cannot_meet_in_person_show_QR_in_video_call_or_via_another_channel"><![CDATA[Dacă nu vă puteți întâlni în persoană, <b>arătați codul QR în apelul video</b> sau distribuiți linkul.]]></string>
|
||||
<string name="open_on_mobile_and_scan_qr_code"><![CDATA[Deschideți <i>Utilizează de pe desktop</i> în aplicația mobilă și scanați codul QR.]]></string>
|
||||
<string name="open_on_mobile_and_scan_qr_code"><![CDATA[Deschide <i>Utilizare de pe desktop</i> în aplicația mobilă și scanează codul QR.]]></string>
|
||||
<string name="to_preserve_privacy_simplex_has_background_service_instead_of_push_notifications_it_uses_a_few_pc_battery"><![CDATA[Pentru a îmbunătăți confidențialitatea, <b>SimpleX rulează în fundal</b> în loc să utilizeze notificări push.]]></string>
|
||||
<string name="system_restricted_background_in_call_warn"><![CDATA[Pentru a efectua apeluri în fundal, vă rugăm să alegeți <b>Utilizarea bateriei aplicației</b> / <b>Nerestricționat</b> în setările aplicației.]]></string>
|
||||
<string name="chunks_downloaded">Bucăți descărcate</string>
|
||||
@@ -2428,4 +2428,26 @@
|
||||
<string name="open_to_connect">Deschide pentru conectare</string>
|
||||
<string name="group_preview_open_to_join">Deschide pentru a te alătura</string>
|
||||
<string name="private_routing_timeout">Timp de așteptare depășit pentru rutarea privată</string>
|
||||
<string name="v6_4_connect_faster_descr">Te poți conecta la conversație și poți trimite mesaje imediat ce apeși pe Conectare.</string>
|
||||
<string name="v6_4_role_moderator">Rol nou în grup: Moderator</string>
|
||||
<string name="group_short_descr_field">Descriere scurtă:</string>
|
||||
<string name="sent_to_your_contact_after_connection">Trimis contactului tău după conectare.</string>
|
||||
<string name="share_profile_via_link">Actualizezi la o adresă permanentă?</string>
|
||||
<string name="address_welcome_message">Mesaj de bun venit</string>
|
||||
<string name="settings_section_title_contact_requests_from_groups">SOLICITĂRI DE CONTACT DE LA GRUPURI</string>
|
||||
<string name="this_setting_is_for_your_current_profile">Această setare este pentru profilul tău actual</string>
|
||||
<string name="share_old_address_alert_button">Partajează adresa veche</string>
|
||||
<string name="share_old_link_alert_button">Partajează linkul vechi</string>
|
||||
<string name="loading_profile">Se încarcă profilul…</string>
|
||||
<string name="rcv_direct_event_group_inv_link_received">cerere de conectare din grupul %1$s</string>
|
||||
<string name="error_preparing_contact">Eroare la deschiderea conversației</string>
|
||||
<string name="error_preparing_group">Eroare la deschiderea grupului</string>
|
||||
<string name="v6_4_message_delivery_descr">Mai puțin trafic pe rețelele mobile.</string>
|
||||
<string name="share_profile_via_link_alert_text">Adresa va fi scurtă, iar profilul tău va fi partajat prin intermediul acestei adrese.</string>
|
||||
<string name="share_profile_via_link_alert_confirm">Actualizează</string>
|
||||
<string name="v6_4_1_short_address">Adresă SimpleX scurtă</string>
|
||||
<string name="chat_banner_connect_to_chat">Atinge Conectare pentru a începe conversația</string>
|
||||
<string name="v6_4_1_short_address_create">Creează-ți adresa</string>
|
||||
<string name="chat_banner_accept_contact_request">Acceptă cererea de contact</string>
|
||||
<string name="compose_view_send_contact_request_alert_text"><![CDATA[Vei putea trimite mesaje <b>doar după ce cererea ta este acceptată</b>.]]></string>
|
||||
</resources>
|
||||
|
||||
@@ -372,7 +372,7 @@
|
||||
<string name="smp_servers_check_address">Проверьте адрес сервера и попробуйте снова.</string>
|
||||
<string name="smp_servers_delete_server">Удалить сервер</string>
|
||||
<string name="install_simplex_chat_for_terminal">SimpleX Chat для терминала</string>
|
||||
<string name="star_on_github">Поставить звёздочку в GitHub</string>
|
||||
<string name="star_on_github">Поставить звёздочку на GitHub</string>
|
||||
<string name="contribute">Внести свой вклад</string>
|
||||
<string name="rate_the_app">Оценить приложение</string>
|
||||
<string name="use_simplex_chat_servers__question">Использовать серверы предосталенные SimpleX Chat?</string>
|
||||
@@ -1463,7 +1463,7 @@
|
||||
<string name="compose_send_direct_message_to_connect">Послать прямое сообщение контакту</string>
|
||||
<string name="error_sending_message_contact_invitation">Ошибка отправки приглашения</string>
|
||||
<string name="member_contact_send_direct_message">Отправьте сообщение чтобы соединиться</string>
|
||||
<string name="rcv_group_event_member_created_contact">соединен напрямую</string>
|
||||
<string name="rcv_group_event_member_created_contact">запрос на соединение</string>
|
||||
<string name="expand_verb">Раскрыть</string>
|
||||
<string name="v5_4_block_group_members">Блокируйте членов группы</string>
|
||||
<string name="connect_plan_repeat_connection_request">Повторить запрос на соединение?</string>
|
||||
|
||||
@@ -2502,4 +2502,5 @@
|
||||
<string name="bio_too_large">Biyografi çok uzun</string>
|
||||
<string name="group_descr_too_large">Açıklama çok büyük</string>
|
||||
<string name="time_to_disappear_is_set_only_for_new_contacts">Kaybolma süresi yalnızca yeni kişiler için ayarlanır.</string>
|
||||
<string name="connect_use_incognito_profile">Gizli profil kullan</string>
|
||||
</resources>
|
||||
|
||||
@@ -2075,4 +2075,54 @@
|
||||
<string name="v6_1_message_dates_descr">更好的訊息日期。</string>
|
||||
<string name="v6_2_network_decentralization_enable_flux_reason">為了更好的元資料隱私。</string>
|
||||
<string name="migrate_to_device_try_again">你可以再試一次。</string>
|
||||
<string name="connect_use_incognito_profile">使用匿名個人檔案</string>
|
||||
<string name="connect_plan_open_chat">開啟聊天</string>
|
||||
<string name="compose_view_connect">連接</string>
|
||||
<string name="share_profile_via_link_alert_confirm">升級</string>
|
||||
<string name="chat_banner_group">群組</string>
|
||||
<string name="recent_history">可見的紀錄</string>
|
||||
<string name="possible_slow_function_title">慢速函數</string>
|
||||
<string name="network_type_ethernet">有線以太網</string>
|
||||
<string name="color_wallpaper_background">桌布背景</string>
|
||||
<string name="color_wallpaper_tint">桌布輔色</string>
|
||||
<string name="subscription_results_ignored">訂閱已忽略</string>
|
||||
<string name="subscription_errors">訂閱錯誤</string>
|
||||
<string name="network_proxy_auth">代理身份驗證</string>
|
||||
<string name="icon_descr_sound_muted">已靜音</string>
|
||||
<string name="connection_error_quota">未送達的訊息</string>
|
||||
<string name="message_deleted_or_not_received_error_title">沒有訊息</string>
|
||||
<string name="network_preset_servers_title">預設伺服器</string>
|
||||
<string name="operator_review_conditions">審閱使用條款</string>
|
||||
<string name="operator_servers_title">%s 個伺服器</string>
|
||||
<string name="view_conditions">檢視使用條款</string>
|
||||
<string name="operator_use_for_messages_receiving">接收</string>
|
||||
<string name="operator_open_conditions">開啟使用條款</string>
|
||||
<string name="operator_open_changes">開啟變更</string>
|
||||
<string name="v6_2_network_decentralization">網路去中心化</string>
|
||||
<string name="leave_chat_question">離開聊天?</string>
|
||||
<string name="button_leave_chat">離開聊天</string>
|
||||
<string name="debug_logs">啟用日誌</string>
|
||||
<string name="no_chats">沒有聊天</string>
|
||||
<string name="group_reports_member_reports">成員舉報</string>
|
||||
<string name="report_archive_for_me">僅自己</string>
|
||||
<string name="notification_group_report">舉報:%s</string>
|
||||
<string name="group_member_status_pending_approval">待批准</string>
|
||||
<string name="operator_updated_conditions">已更新使用條款</string>
|
||||
<string name="network_smp_web_port_preset">預設伺服器</string>
|
||||
<string name="compose_view_join_group">加入群組</string>
|
||||
<string name="compose_view_add_message">增加訊息</string>
|
||||
<string name="compose_view_send_request">傳送請求</string>
|
||||
<string name="context_user_picker_your_profile">你的個人資料</string>
|
||||
<string name="address_welcome_message">歡迎訊息</string>
|
||||
<string name="share_profile_via_link">升級地址?</string>
|
||||
<string name="loading_profile">正在載入個人資料…</string>
|
||||
<string name="short_descr">你的簡介:</string>
|
||||
<string name="group_short_descr_field">簡短描述:</string>
|
||||
<string name="chat_banner_your_contact">你的聯絡人</string>
|
||||
<string name="chat_banner_your_group">你的群組</string>
|
||||
<string name="chat_banner_business_connection">商業連接</string>
|
||||
<string name="privacy_show_last_messages">顯示最近的訊息</string>
|
||||
<string name="v5_3_simpler_incognito_mode">簡化的匿名模式</string>
|
||||
<string name="contact_tap_to_connect">點擊以連接</string>
|
||||
<string name="settings_section_title_use_from_desktop">從桌面使用</string>
|
||||
</resources>
|
||||
|
||||
@@ -11,10 +11,11 @@ import Data.Text (Text)
|
||||
import Options.Applicative
|
||||
import Simplex.Chat.Bot.KnownContacts
|
||||
import Simplex.Chat.Controller (updateStr, versionNumber, versionString)
|
||||
import Simplex.Chat.Options (ChatCmdLog (..), ChatOpts (..), CoreChatOpts, coreChatOptsP)
|
||||
import Simplex.Chat.Options (ChatCmdLog (..), ChatOpts (..), CoreChatOpts, CreateBotOpts (..), coreChatOptsP)
|
||||
|
||||
data BroadcastBotOpts = BroadcastBotOpts
|
||||
{ coreOptions :: CoreChatOpts,
|
||||
botDisplayName :: Text,
|
||||
publishers :: [KnownContact],
|
||||
welcomeMessage :: Text,
|
||||
prohibitedMessage :: Text
|
||||
@@ -29,6 +30,12 @@ defaultProhibitedMessage ps = "Sorry, only these users can broadcast messages: "
|
||||
broadcastBotOpts :: FilePath -> FilePath -> Parser BroadcastBotOpts
|
||||
broadcastBotOpts appDir defaultDbName = do
|
||||
coreOptions <- coreChatOptsP appDir defaultDbName
|
||||
botDisplayName <-
|
||||
strOption
|
||||
( long "display-name"
|
||||
<> metavar "DISPLAY_NAME"
|
||||
<> help "The display name of the broadcast bot"
|
||||
)
|
||||
publishers <-
|
||||
option
|
||||
parseKnownContacts
|
||||
@@ -55,6 +62,7 @@ broadcastBotOpts appDir defaultDbName = do
|
||||
pure
|
||||
BroadcastBotOpts
|
||||
{ coreOptions,
|
||||
botDisplayName,
|
||||
publishers,
|
||||
welcomeMessage = fromMaybe (defaultWelcomeMessage publishers) welcomeMessage_,
|
||||
prohibitedMessage = fromMaybe (defaultProhibitedMessage publishers) prohibitedMessage_
|
||||
@@ -72,7 +80,7 @@ getBroadcastBotOpts appDir defaultDbName =
|
||||
versionAndUpdate = versionStr <> "\n" <> updateStr
|
||||
|
||||
mkChatOpts :: BroadcastBotOpts -> ChatOpts
|
||||
mkChatOpts BroadcastBotOpts {coreOptions} =
|
||||
mkChatOpts BroadcastBotOpts {coreOptions, botDisplayName} =
|
||||
ChatOpts
|
||||
{ coreOptions,
|
||||
chatCmd = "",
|
||||
@@ -86,5 +94,6 @@ mkChatOpts BroadcastBotOpts {coreOptions} =
|
||||
autoAcceptFileSize = 0,
|
||||
muteNotifications = True,
|
||||
markRead = False,
|
||||
createBot = Just CreateBotOpts {botDisplayName, allowFiles = False},
|
||||
maintenance = False
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ import qualified Data.Text as T
|
||||
import Options.Applicative
|
||||
import Simplex.Chat.Bot.KnownContacts
|
||||
import Simplex.Chat.Controller (updateStr, versionNumber, versionString)
|
||||
import Simplex.Chat.Options (ChatCmdLog (..), ChatOpts (..), CoreChatOpts, coreChatOptsP)
|
||||
import Simplex.Chat.Options (ChatCmdLog (..), ChatOpts (..), CoreChatOpts, CreateBotOpts (..), coreChatOptsP)
|
||||
|
||||
data DirectoryOpts = DirectoryOpts
|
||||
{ coreOptions :: CoreChatOpts,
|
||||
@@ -119,7 +119,7 @@ directoryOpts appDir defaultDbName = do
|
||||
<> help "The display name of the directory service bot, without *'s and spaces (SimpleX-Directory)"
|
||||
<> value "SimpleX-Directory"
|
||||
)
|
||||
runCLI <-
|
||||
runCLI <-
|
||||
switch
|
||||
( long "run-cli"
|
||||
<> help "Run directory service as CLI"
|
||||
@@ -155,7 +155,7 @@ getDirectoryOpts appDir defaultDbName =
|
||||
versionAndUpdate = versionStr <> "\n" <> updateStr
|
||||
|
||||
mkChatOpts :: DirectoryOpts -> ChatOpts
|
||||
mkChatOpts DirectoryOpts {coreOptions} =
|
||||
mkChatOpts DirectoryOpts {coreOptions, serviceName} =
|
||||
ChatOpts
|
||||
{ coreOptions,
|
||||
chatCmd = "",
|
||||
@@ -169,5 +169,6 @@ mkChatOpts DirectoryOpts {coreOptions} =
|
||||
autoAcceptFileSize = 0,
|
||||
muteNotifications = True,
|
||||
markRead = False,
|
||||
createBot = Just CreateBotOpts {botDisplayName = serviceName, allowFiles = False},
|
||||
maintenance = False
|
||||
}
|
||||
|
||||
+63
-1
@@ -1,6 +1,8 @@
|
||||
# SimpleX Chat bot API
|
||||
|
||||
- [Why create a bot](#why-create-a-bot)
|
||||
- [What is SimpleX bot](#what-is-simplex-bot)
|
||||
- [How to configure bot profile](#how-to-configure-bot-profile)
|
||||
- [How to create a bot](#how-to-create-a-bot)
|
||||
- [Sending commands](#sending-commands)
|
||||
- [Processing events](#processing-events)
|
||||
@@ -12,8 +14,9 @@
|
||||
## Why create a bot
|
||||
|
||||
You can implement SimpleX Chat for these and many other scenarios:
|
||||
- customer support - both as a single- and a multi-agent support chat (using SimpleX Chat [business address]() feature),
|
||||
- customer support - both as a single- and a multi-agent support chat (using SimpleX Chat [business address](https://simplex.chat/docs/business.html) feature),
|
||||
- information search and retrieval bots, with or without LLM integration,
|
||||
- moderation bots, to moderate your group and communities.
|
||||
- broadcast bot, when messages from your trusted users are forwarded to all connected contacts - e.g., see our SimpleX Status bot in the app ([source code](../apps/simplex-broadcast-bot/)),
|
||||
- feedback bot, when messages from connected contacts are forwarded to a preset list of your trusted users,
|
||||
- P2P trading bots, connecting buyers and sellers,
|
||||
@@ -22,6 +25,65 @@ You can implement SimpleX Chat for these and many other scenarios:
|
||||
We will share all useful bots you create in the bottom of this page - please submit a PR to add it.
|
||||
|
||||
|
||||
## What is SimpleX bot
|
||||
|
||||
SimpleX bot is a participant of SimpleX network. Theoretically, bot can do everything that a usual SimpleX Chat user can do – send and receive messages and files, connect to addresses and join groups, etc. But to be useful, a bot should distinguish itself as a bot, and to provide an interface for the users to interact with it.
|
||||
|
||||
## How to configure bot profile
|
||||
|
||||
Starting from v6.4.3, SimpleX Chat apps support bot configuration to distinguish bots, to highlight commands in messages, and to show command menus.
|
||||
|
||||
### Set up bot profile
|
||||
|
||||
To distinguish SimpleX user profile as a bot, set its `peerType` property to `"bot"`. It can be done in one of these ways:
|
||||
- using CLI options `--create-bot-display-name` and `create-bot-allow-files` when first starting CLI to create bot profile,
|
||||
- using command `/create bot [files=on] <name>[ <bio>]` (if name contains spaces, it must be in single quotes), when creating additional bot profiles in the same database,
|
||||
- by configuring bot commands that the users will see in the UI when they type `/` character or tap `//` button with `/set bot commands ...` CLI command (see syntax below),
|
||||
- by using [APIUpdateProfile](./api/COMMANDS.md#apiupdateprofile) bot command to set `peerType` and configure bot commands at the same time.
|
||||
|
||||
### Configure bot commands
|
||||
|
||||
Bot commands are messages that start from `/` character. Normally, they would consist of lowercase latin letters, but commands can use any letters, digits and underscores. Commands can have parameters.
|
||||
|
||||
All commands in messages will be highlighted in the chats with the bot, and when users tap them, they will be instantly sent. If the message has a single line and starts from `/` character, the whole message will be highlighted. Otherwise, if command is included as part of the message, it will be highlighted until the first space after `/` character: e.g., `/list` command in Directory service shows user's groups.
|
||||
|
||||
*Please note*: commands in messages will be highlighted based purely on `/` character, regardless of whether they are supported by the bot or included in bot configuration. It allows bots to have "hidden" commands that bot would support, but that won't be shown in the menu. But it may also lead to mistakes if bot sends incorrect commands in the instructions to the users.
|
||||
|
||||
Bots can also send highlighted commands with parameters. To do that, bots should surround both command and its parameters in single quotes: e.g., `/'role 2'`. Quotes won't show in the apps UI, and if the user taps this command, it will be sent as `/role 2`.
|
||||
|
||||
Configured bot commands will be be offered to the users as a menu, and for quick lookup as the user types.
|
||||
|
||||
Bot commands configuration is a property in `preferences` object in bot profile received by the user. These preferences can be configured both on the bot user profile level, to offer the same commands to all connected users, and as overrides for specific contacts, to offer different commands to different bot contacts.
|
||||
|
||||
Configuring commands in bot user can be done either with [APIUpdateProfile](./api/COMMANDS.md#apiupdateprofile) or with `/set bot commands` CLI command:
|
||||
|
||||
```
|
||||
/set bot commands <commands>
|
||||
```
|
||||
|
||||
where:
|
||||
|
||||
```
|
||||
commands = <commandOrMenu>[,<commandOrMenu>...]
|
||||
commandOrMenu = command | menu
|
||||
command = '<label>':/'<keyword>[ <params>]'
|
||||
menu = '<label>':{<commands>}
|
||||
```
|
||||
|
||||
This syntax allows creating nested menus of commands with and without parameters. You must enclose parameter names with the characters `<` and `>`. Currently, users have to edit command templates to set actual parameters, but in the future there will be UI support to fill in parameters based on this syntax. For example, some of SimpleX Directory service commands could be configured with this command:
|
||||
|
||||
```
|
||||
/set bot commands 'How to use bot':/help,'Show your groups':/list,'Your group settings':{'Set default role':/'role <ID>','Set anti-spam filter':/'filter <ID>'}
|
||||
```
|
||||
|
||||
Configuring commands for specific contacts can be done with [APISetContactPrefs](./api/COMMANDS.md#apisetcontactprefs) command.
|
||||
|
||||
### Bots and business addresses
|
||||
|
||||
A useful scenario would be when bot is used to accept requests to bot's business address, so that a new business chat is created for every connecting user, and then invites other people from the business, as appropriate.
|
||||
|
||||
Business chat is a special group chat under the hood, but the connected customer sees business avatar, and all users that bot would add to the group later see customer' avatar. This chat will inherits preferences from the bot profile, so if you want to allow customers to send files, you need to allow them in the bot. And if bot has any commands configured, they will also be available to customers in the menu.
|
||||
|
||||
## How to create a bot
|
||||
|
||||
[SimpleX Chat CLI](../docs/CLI.md) can be run as a local WebSockets server on any port:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user