Merge branch 'stable' into stable-android
@@ -234,6 +234,8 @@ You can use SimpleX with your own servers and still communicate with people usin
|
||||
|
||||
Recent and important updates:
|
||||
|
||||
[Mar 23, 2024. SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration.](./blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.md)
|
||||
|
||||
[Mar 14, 2024. SimpleX Chat v5.6 beta: adding quantum resistance to Signal double ratchet algorithm.](./blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.md)
|
||||
|
||||
[Jan 24, 2024. SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect.](./blog/20240124-simplex-chat-infrastructure-costs-v5-5-simplex-ux-private-notes-group-history.md)
|
||||
@@ -377,8 +379,9 @@ Please also join [#simplex-devs](https://simplex.chat/contact#/?v=1-2&smp=smp%3A
|
||||
- ✅ Using mobile profiles from the desktop app.
|
||||
- ✅ Private notes.
|
||||
- ✅ Improve sending videos (including encryption of locally stored videos).
|
||||
- ✅ Post-quantum resistant key exchange in double ratchet protocol.
|
||||
- 🏗 Improve stability and reduce battery usage.
|
||||
- 🏗 Improve experience for the new users.
|
||||
- 🏗 Post-quantum resistant key exchange in double ratchet protocol.
|
||||
- 🏗 Large groups, communities and public channels.
|
||||
- 🏗 Message delivery relay for senders (to conceal IP address from the recipients' servers and to reduce the traffic).
|
||||
- Privacy & security slider - a simple way to set all settings at once.
|
||||
|
||||
@@ -21,6 +21,8 @@ public let CURRENT_CHAT_VERSION: Int = 2
|
||||
// version range that supports establishing direct connection with a group member (xGrpDirectInvVRange in core)
|
||||
public let CREATE_MEMBER_CONTACT_VRANGE = VersionRange(minVersion: 2, maxVersion: CURRENT_CHAT_VERSION)
|
||||
|
||||
private let networkStatusesLock = DispatchQueue(label: "chat.simplex.app.network-statuses.lock")
|
||||
|
||||
enum TerminalItem: Identifiable {
|
||||
case cmd(Date, ChatCommand)
|
||||
case resp(Date, ChatResponse)
|
||||
@@ -1566,34 +1568,30 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
||||
m.removeChat(mergedContact.id)
|
||||
}
|
||||
}
|
||||
case let .contactsSubscribed(_, contactRefs):
|
||||
await updateContactsStatus(contactRefs, status: .connected)
|
||||
case let .contactsDisconnected(_, contactRefs):
|
||||
await updateContactsStatus(contactRefs, status: .disconnected)
|
||||
case let .contactSubSummary(_, contactSubscriptions):
|
||||
await MainActor.run {
|
||||
for sub in contactSubscriptions {
|
||||
// no need to update contact here, and it is slow
|
||||
// if active(user) {
|
||||
// m.updateContact(sub.contact)
|
||||
// }
|
||||
if let err = sub.contactError {
|
||||
processContactSubError(sub.contact, err)
|
||||
} else {
|
||||
m.setContactNetworkStatus(sub.contact, .connected)
|
||||
}
|
||||
}
|
||||
}
|
||||
case let .networkStatus(status, connections):
|
||||
await MainActor.run {
|
||||
// dispatch queue to synchronize access
|
||||
networkStatusesLock.sync {
|
||||
var ns = m.networkStatuses
|
||||
// slow loop is on the background thread
|
||||
for cId in connections {
|
||||
m.networkStatuses[cId] = status
|
||||
ns[cId] = status
|
||||
}
|
||||
// fast model update is on the main thread
|
||||
DispatchQueue.main.sync {
|
||||
m.networkStatuses = ns
|
||||
}
|
||||
}
|
||||
case let .networkStatuses(_, statuses): ()
|
||||
await MainActor.run {
|
||||
// dispatch queue to synchronize access
|
||||
networkStatusesLock.sync {
|
||||
var ns = m.networkStatuses
|
||||
// slow loop is on the background thread
|
||||
for s in statuses {
|
||||
m.networkStatuses[s.agentConnId] = s.networkStatus
|
||||
ns[s.agentConnId] = s.networkStatus
|
||||
}
|
||||
// fast model update is on the main thread
|
||||
DispatchQueue.main.sync {
|
||||
m.networkStatuses = ns
|
||||
}
|
||||
}
|
||||
case let .newChatItem(user, aChatItem):
|
||||
@@ -1944,26 +1942,6 @@ func chatItemSimpleUpdate(_ user: any UserLike, _ aChatItem: AChatItem) async {
|
||||
}
|
||||
}
|
||||
|
||||
func updateContactsStatus(_ contactRefs: [ContactRef], status: NetworkStatus) async {
|
||||
let m = ChatModel.shared
|
||||
await MainActor.run {
|
||||
for c in contactRefs {
|
||||
m.networkStatuses[c.agentConnId] = status
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func processContactSubError(_ contact: Contact, _ chatError: ChatError) {
|
||||
let m = ChatModel.shared
|
||||
var err: String
|
||||
switch chatError {
|
||||
case .errorAgent(agentError: .BROKER(_, .NETWORK)): err = "network"
|
||||
case .errorAgent(agentError: .SMP(smpErr: .AUTH)): err = "contact deleted"
|
||||
default: err = String(describing: chatError)
|
||||
}
|
||||
m.setContactNetworkStatus(contact, .error(connectionError: err))
|
||||
}
|
||||
|
||||
func refreshCallInvitations() throws {
|
||||
let m = ChatModel.shared
|
||||
let callInvitations = try justRefreshCallInvitations()
|
||||
|
||||
@@ -70,14 +70,14 @@ struct CIImageView: View {
|
||||
}
|
||||
|
||||
private func imageView(_ img: UIImage) -> some View {
|
||||
let w = img.size.width <= img.size.height ? maxWidth * 0.75 : img.imageData == nil ? .infinity : maxWidth
|
||||
let w = img.size.width <= img.size.height ? maxWidth * 0.75 : maxWidth
|
||||
DispatchQueue.main.async { imgWidth = w }
|
||||
return ZStack(alignment: .topTrailing) {
|
||||
if img.imageData == nil {
|
||||
Image(uiImage: img)
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(maxWidth: w)
|
||||
.frame(width: w)
|
||||
} else {
|
||||
SwiftyGif(image: img)
|
||||
.frame(width: w, height: w * img.size.height / img.size.width)
|
||||
|
||||
@@ -243,13 +243,13 @@ struct CIVideoView: View {
|
||||
}
|
||||
|
||||
private func imageView(_ img: UIImage) -> some View {
|
||||
let w = img.size.width <= img.size.height ? maxWidth * 0.75 : .infinity
|
||||
let w = img.size.width <= img.size.height ? maxWidth * 0.75 : maxWidth
|
||||
DispatchQueue.main.async { videoWidth = w }
|
||||
return ZStack(alignment: .topTrailing) {
|
||||
Image(uiImage: img)
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(maxWidth: w)
|
||||
.frame(width: w)
|
||||
loadingIndicator()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ struct ChatView: View {
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
@Environment(\.dismiss) var dismiss
|
||||
@Environment(\.presentationMode) var presentationMode
|
||||
@Environment(\.scenePhase) var scenePhase
|
||||
@State @ObservedObject var chat: Chat
|
||||
@State private var showChatInfoSheet: Bool = false
|
||||
@State private var showAddMembersSheet: Bool = false
|
||||
@@ -234,7 +235,9 @@ struct ChatView: View {
|
||||
|
||||
private func initChatView() {
|
||||
let cInfo = chat.chatInfo
|
||||
if case let .direct(contact) = cInfo {
|
||||
// This check prevents the call to apiContactInfo after the app is suspended, and the database is closed.
|
||||
if case .active = scenePhase,
|
||||
case let .direct(contact) = cInfo {
|
||||
Task {
|
||||
do {
|
||||
let (stats, _) = try await apiContactInfo(chat.chatInfo.apiId)
|
||||
@@ -511,6 +514,7 @@ struct ChatView: View {
|
||||
chat: chat,
|
||||
chatItem: ci,
|
||||
maxWidth: maxWidth,
|
||||
itemWidth: maxWidth,
|
||||
composeState: $composeState,
|
||||
selectedMember: $selectedMember,
|
||||
chatView: self
|
||||
@@ -523,6 +527,7 @@ struct ChatView: View {
|
||||
@ObservedObject var chat: Chat
|
||||
var chatItem: ChatItem
|
||||
var maxWidth: CGFloat
|
||||
@State var itemWidth: CGFloat
|
||||
@Binding var composeState: ComposeState
|
||||
@Binding var selectedMember: GMember?
|
||||
var chatView: ChatView
|
||||
@@ -651,7 +656,7 @@ struct ChatView: View {
|
||||
playbackState: $playbackState,
|
||||
playbackTime: $playbackTime
|
||||
)
|
||||
.uiKitContextMenu(maxWidth: maxWidth, menu: uiMenu, allowMenu: $allowMenu)
|
||||
.uiKitContextMenu(hasImageOrVideo: ci.content.msgContent?.isImageOrVideo == true, maxWidth: maxWidth, itemWidth: $itemWidth, menu: uiMenu, allowMenu: $allowMenu)
|
||||
.accessibilityLabel("")
|
||||
if ci.content.msgContent != nil && (ci.meta.itemDeleted == nil || revealed) && ci.reactions.count > 0 {
|
||||
chatItemReactions(ci)
|
||||
|
||||
@@ -12,6 +12,7 @@ private let fillColorLight = Color(uiColor: UIColor(red: 0.99, green: 0.99, blue
|
||||
struct UserPicker: View {
|
||||
@EnvironmentObject var m: ChatModel
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
@Environment(\.scenePhase) var scenePhase
|
||||
@Binding var showSettings: Bool
|
||||
@Binding var showConnectDesktop: Bool
|
||||
@Binding var userPickerVisible: Bool
|
||||
@@ -91,7 +92,10 @@ struct UserPicker: View {
|
||||
.opacity(userPickerVisible ? 1.0 : 0.0)
|
||||
.onAppear {
|
||||
do {
|
||||
m.users = try listUsers()
|
||||
// This check prevents the call of listUsers after the app is suspended, and the database is closed.
|
||||
if case .active = scenePhase {
|
||||
m.users = try listUsers()
|
||||
}
|
||||
} catch let error {
|
||||
logger.error("Error loading users \(responseError(error))")
|
||||
}
|
||||
|
||||
@@ -11,11 +11,20 @@ import UIKit
|
||||
import SwiftUI
|
||||
|
||||
extension View {
|
||||
func uiKitContextMenu(maxWidth: CGFloat, menu: Binding<UIMenu>, allowMenu: Binding<Bool>) -> some View {
|
||||
func uiKitContextMenu(hasImageOrVideo: Bool, maxWidth: CGFloat, itemWidth: Binding<CGFloat>, menu: Binding<UIMenu>, allowMenu: Binding<Bool>) -> some View {
|
||||
Group {
|
||||
if allowMenu.wrappedValue {
|
||||
InteractionView(content: self, maxWidth: maxWidth, menu: menu)
|
||||
.fixedSize(horizontal: true, vertical: false)
|
||||
if hasImageOrVideo {
|
||||
InteractionView(content:
|
||||
self.environmentObject(ChatModel.shared)
|
||||
.overlay(DetermineWidthImageVideoItem())
|
||||
.onPreferenceChange(DetermineWidthImageVideoItem.Key.self) { itemWidth.wrappedValue = $0 == 0 ? maxWidth : $0 }
|
||||
, maxWidth: maxWidth, itemWidth: itemWidth, menu: menu)
|
||||
.frame(maxWidth: itemWidth.wrappedValue)
|
||||
} else {
|
||||
InteractionView(content: self.environmentObject(ChatModel.shared), maxWidth: maxWidth, itemWidth: itemWidth, menu: menu)
|
||||
.fixedSize(horizontal: true, vertical: false)
|
||||
}
|
||||
} else {
|
||||
self
|
||||
}
|
||||
@@ -31,13 +40,14 @@ private class HostingViewHolder: UIView {
|
||||
struct InteractionView<Content: View>: UIViewRepresentable {
|
||||
let content: Content
|
||||
var maxWidth: CGFloat
|
||||
var itemWidth: Binding<CGFloat>
|
||||
@Binding var menu: UIMenu
|
||||
|
||||
func makeUIView(context: Context) -> UIView {
|
||||
let view = HostingViewHolder()
|
||||
view.contentSize = CGSizeMake(maxWidth, .infinity)
|
||||
view.backgroundColor = .clear
|
||||
let hostView = UIHostingController(rootView: content)
|
||||
view.contentSize = hostView.view.intrinsicContentSize
|
||||
hostView.view.translatesAutoresizingMaskIntoConstraints = false
|
||||
let constraints = [
|
||||
hostView.view.topAnchor.constraint(equalTo: view.topAnchor),
|
||||
@@ -57,7 +67,11 @@ struct InteractionView<Content: View>: UIViewRepresentable {
|
||||
}
|
||||
|
||||
func updateUIView(_ uiView: UIView, context: Context) {
|
||||
(uiView as! HostingViewHolder).contentSize = uiView.subviews[0].sizeThatFits(CGSizeMake(maxWidth, .infinity))
|
||||
let was = (uiView as! HostingViewHolder).contentSize
|
||||
(uiView as! HostingViewHolder).contentSize = uiView.subviews[0].sizeThatFits(CGSizeMake(itemWidth.wrappedValue, .infinity))
|
||||
if was != (uiView as! HostingViewHolder).contentSize {
|
||||
uiView.invalidateIntrinsicContentSize()
|
||||
}
|
||||
}
|
||||
|
||||
func makeCoordinator() -> Coordinator {
|
||||
|
||||
@@ -21,6 +21,19 @@ struct DetermineWidth: View {
|
||||
}
|
||||
}
|
||||
|
||||
struct DetermineWidthImageVideoItem: View {
|
||||
typealias Key = MaximumWidthImageVideoPreferenceKey
|
||||
var body: some View {
|
||||
GeometryReader { proxy in
|
||||
Color.clear
|
||||
.preference(
|
||||
key: MaximumWidthImageVideoPreferenceKey.self,
|
||||
value: proxy.size.width
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct MaximumWidthPreferenceKey: PreferenceKey {
|
||||
static var defaultValue: CGFloat = 0
|
||||
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
|
||||
@@ -28,6 +41,13 @@ struct MaximumWidthPreferenceKey: PreferenceKey {
|
||||
}
|
||||
}
|
||||
|
||||
struct MaximumWidthImageVideoPreferenceKey: PreferenceKey {
|
||||
static var defaultValue: CGFloat = 0
|
||||
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
|
||||
value = max(value, nextValue())
|
||||
}
|
||||
}
|
||||
|
||||
struct DetermineWidth_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
DetermineWidth()
|
||||
|
||||
@@ -631,6 +631,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Admins can block a member for all." xml:space="preserve">
|
||||
<source>Admins can block a member for all.</source>
|
||||
<target>Администраторите могат да блокират член за всички.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
|
||||
@@ -690,6 +691,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
|
||||
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
|
||||
<target>Всички ваши контакти, разговори и файлове ще бъдат сигурно криптирани и качени на парчета в конфигурираните XFTP релета.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow" xml:space="preserve">
|
||||
@@ -819,6 +821,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="App data migration" xml:space="preserve">
|
||||
<source>App data migration</source>
|
||||
<target>Миграция на данните от приложението</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
|
||||
@@ -858,14 +861,17 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Apply" xml:space="preserve">
|
||||
<source>Apply</source>
|
||||
<target>Приложи</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Archive and upload" xml:space="preserve">
|
||||
<source>Archive and upload</source>
|
||||
<target>Архивиране и качване</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Archiving database" xml:space="preserve">
|
||||
<source>Archiving database</source>
|
||||
<target>Архивиране на база данни</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Attach" xml:space="preserve">
|
||||
@@ -1060,6 +1066,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||
<source>Cancel migration</source>
|
||||
<target>Отмени миграцията</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
|
||||
@@ -1165,6 +1172,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Chat migrated!" xml:space="preserve">
|
||||
<source>Chat migrated!</source>
|
||||
<target>Чатът е мигриран!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Chat preferences" xml:space="preserve">
|
||||
@@ -1263,6 +1271,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm network settings" xml:space="preserve">
|
||||
<source>Confirm network settings</source>
|
||||
<target>Потвърди мрежовите настройки</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
|
||||
@@ -1277,10 +1286,12 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm that you remember database passphrase to migrate it." xml:space="preserve">
|
||||
<source>Confirm that you remember database passphrase to migrate it.</source>
|
||||
<target>Потвърдете, че помните паролата на базата данни, преди да я мигрирате.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm upload" xml:space="preserve">
|
||||
<source>Confirm upload</source>
|
||||
<target>Потвърди качването</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Connect" xml:space="preserve">
|
||||
@@ -1544,6 +1555,7 @@ This is your own one-time link!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Creating archive link" xml:space="preserve">
|
||||
<source>Creating archive link</source>
|
||||
<target>Създаване на архивен линк</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Creating link…" xml:space="preserve">
|
||||
@@ -1768,6 +1780,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete database from this device" xml:space="preserve">
|
||||
<source>Delete database from this device</source>
|
||||
<target>Изтриване на базата данни от това устройство</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete file" xml:space="preserve">
|
||||
@@ -2062,6 +2075,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Download failed" xml:space="preserve">
|
||||
<source>Download failed</source>
|
||||
<target>Неуспешно изтегляне</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Download file" xml:space="preserve">
|
||||
@@ -2071,10 +2085,12 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downloading archive" xml:space="preserve">
|
||||
<source>Downloading archive</source>
|
||||
<target>Архива се изтегля</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downloading link details" xml:space="preserve">
|
||||
<source>Downloading link details</source>
|
||||
<target>Подробности за линка се изтеглят</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Duplicate display name!" xml:space="preserve">
|
||||
@@ -2134,6 +2150,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
|
||||
<source>Enable in direct chats (BETA)!</source>
|
||||
<target>Активиране в личните чатове (БЕТА)!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enable instant notifications?" xml:space="preserve">
|
||||
@@ -2253,6 +2270,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enter passphrase" xml:space="preserve">
|
||||
<source>Enter passphrase</source>
|
||||
<target>Въведи парола</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||
@@ -2317,6 +2335,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
|
||||
<source>Error allowing contact PQ encryption</source>
|
||||
<target>Грешка при разрешаване на PQ криптиране за контакт</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error changing address" xml:space="preserve">
|
||||
@@ -2411,6 +2430,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error downloading the archive" xml:space="preserve">
|
||||
<source>Error downloading the archive</source>
|
||||
<target>Грешка при изтеглянето на архива</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
|
||||
@@ -2490,6 +2510,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error saving settings" xml:space="preserve">
|
||||
<source>Error saving settings</source>
|
||||
<target>Грешка при запазване на настройките</target>
|
||||
<note>when migrating</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error saving user password" xml:space="preserve">
|
||||
@@ -2564,10 +2585,12 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error uploading the archive" xml:space="preserve">
|
||||
<source>Error uploading the archive</source>
|
||||
<target>Грешка при качването на архива</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
|
||||
<source>Error verifying passphrase:</source>
|
||||
<target>Грешка при проверката на паролата:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: " xml:space="preserve">
|
||||
@@ -2622,6 +2645,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
|
||||
<source>Exported file doesn't exist</source>
|
||||
<target>Експортираният файл не съществува</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Exporting database archive…" xml:space="preserve">
|
||||
@@ -2696,10 +2720,12 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Finalize migration" xml:space="preserve">
|
||||
<source>Finalize migration</source>
|
||||
<target>Завърши миграцията</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Finalize migration on another device." xml:space="preserve">
|
||||
<source>Finalize migration on another device.</source>
|
||||
<target>Завършете миграцията на другото устройство.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
|
||||
@@ -2994,6 +3020,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Hungarian interface" xml:space="preserve">
|
||||
<source>Hungarian interface</source>
|
||||
<target>Унгарски интерфейс</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
|
||||
@@ -3063,10 +3090,12 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Import failed" xml:space="preserve">
|
||||
<source>Import failed</source>
|
||||
<target>Неуспешно импортиране</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Importing archive" xml:space="preserve">
|
||||
<source>Importing archive</source>
|
||||
<target>Импортиране на архив</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Improved message delivery" xml:space="preserve">
|
||||
@@ -3086,6 +3115,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="In order to continue, chat should be stopped." xml:space="preserve">
|
||||
<source>In order to continue, chat should be stopped.</source>
|
||||
<target>За да продължите, чатът трябва да бъде спрян.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="In reply to" xml:space="preserve">
|
||||
@@ -3202,6 +3232,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
<target>Невалидно потвърждение за мигриране</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||
@@ -3574,6 +3605,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Message too large" xml:space="preserve">
|
||||
<source>Message too large</source>
|
||||
<target>Съобщението е твърде голямо</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Messages" xml:space="preserve">
|
||||
@@ -3601,26 +3633,32 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate device" xml:space="preserve">
|
||||
<source>Migrate device</source>
|
||||
<target>Мигрирай устройството</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate from another device" xml:space="preserve">
|
||||
<source>Migrate from another device</source>
|
||||
<target>Мигриране от друго устройство</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate here" xml:space="preserve">
|
||||
<source>Migrate here</source>
|
||||
<target>Мигрирай тук</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate to another device" xml:space="preserve">
|
||||
<source>Migrate to another device</source>
|
||||
<target>Миграция към друго устройство</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
|
||||
<source>Migrate to another device via QR code.</source>
|
||||
<target>Мигрирайте към друго устройство чрез QR код.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrating" xml:space="preserve">
|
||||
<source>Migrating</source>
|
||||
<target>Мигриране</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||
@@ -3630,6 +3668,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migration complete" xml:space="preserve">
|
||||
<source>Migration complete</source>
|
||||
<target>Миграцията е завършена</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migration error:" xml:space="preserve">
|
||||
@@ -3993,6 +4032,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open migration to another device" xml:space="preserve">
|
||||
<source>Open migration to another device</source>
|
||||
<target>Отвори миграцията към друго устройство</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||
@@ -4012,6 +4052,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or paste archive link" xml:space="preserve">
|
||||
<source>Or paste archive link</source>
|
||||
<target>Или постави архивен линк</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or scan QR code" xml:space="preserve">
|
||||
@@ -4021,6 +4062,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or securely share this file link" xml:space="preserve">
|
||||
<source>Or securely share this file link</source>
|
||||
<target>Или сигурно споделете този линк към файла</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or show this code" xml:space="preserve">
|
||||
@@ -4110,6 +4152,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
|
||||
<source>Picture-in-picture calls</source>
|
||||
<target>Обаждания "картина в картина"</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
|
||||
@@ -4134,6 +4177,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
|
||||
<source>Please confirm that network settings are correct for this device.</source>
|
||||
<target>Моля, потвърдете, че мрежовите настройки са правилни за това устройство.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Please contact developers. Error: %@" xml:space="preserve">
|
||||
@@ -4195,6 +4239,7 @@ Error: %@</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
|
||||
<source>Post-quantum E2EE</source>
|
||||
<target>Постквантово E2EE</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
|
||||
@@ -4334,10 +4379,12 @@ Error: %@</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Push server" xml:space="preserve">
|
||||
<source>Push server</source>
|
||||
<target>Push сървър</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
|
||||
<source>Quantum resistant encryption</source>
|
||||
<target>Квантово устойчиво криптиране</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Rate the app" xml:space="preserve">
|
||||
@@ -4527,10 +4574,12 @@ Error: %@</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat download" xml:space="preserve">
|
||||
<source>Repeat download</source>
|
||||
<target>Повтори изтеглянето</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat import" xml:space="preserve">
|
||||
<source>Repeat import</source>
|
||||
<target>Повтори импортирането</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||
@@ -4540,6 +4589,7 @@ Error: %@</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat upload" xml:space="preserve">
|
||||
<source>Repeat upload</source>
|
||||
<target>Повтори качването</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Reply" xml:space="preserve">
|
||||
@@ -4644,6 +4694,7 @@ Error: %@</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Safer groups" xml:space="preserve">
|
||||
<source>Safer groups</source>
|
||||
<target>По-безопасни групи</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Save" xml:space="preserve">
|
||||
@@ -5013,6 +5064,7 @@ Error: %@</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Set passphrase" xml:space="preserve">
|
||||
<source>Set passphrase</source>
|
||||
<target>Задаване на парола</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Set passphrase to export" xml:space="preserve">
|
||||
@@ -5072,6 +5124,7 @@ Error: %@</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show QR code" xml:space="preserve">
|
||||
<source>Show QR code</source>
|
||||
<target>Покажи QR код</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show calls in phone history" xml:space="preserve">
|
||||
@@ -5216,6 +5269,7 @@ Error: %@</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Stop chat" xml:space="preserve">
|
||||
<source>Stop chat</source>
|
||||
<target>Спри чата</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
|
||||
@@ -5260,6 +5314,7 @@ Error: %@</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Stopping chat" xml:space="preserve">
|
||||
<source>Stopping chat</source>
|
||||
<target>Спиране на чата</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Submit" xml:space="preserve">
|
||||
@@ -5511,10 +5566,12 @@ It can happen because of some bug or when the connection is compromised.</source
|
||||
</trans-unit>
|
||||
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
|
||||
<source>This chat is protected by end-to-end encryption.</source>
|
||||
<target>Този чат е защитен чрез криптиране от край до край.</target>
|
||||
<note>E2EE info chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
|
||||
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
|
||||
<target>Този чат е защитен от квантово устойчиво криптиране от край до край.</target>
|
||||
<note>E2EE info chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="This device name" xml:space="preserve">
|
||||
@@ -5813,6 +5870,7 @@ To connect, please ask your contact to create another connection link and check
|
||||
</trans-unit>
|
||||
<trans-unit id="Upload failed" xml:space="preserve">
|
||||
<source>Upload failed</source>
|
||||
<target>Неуспешно качване</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Upload file" xml:space="preserve">
|
||||
@@ -5822,6 +5880,7 @@ To connect, please ask your contact to create another connection link and check
|
||||
</trans-unit>
|
||||
<trans-unit id="Uploading archive" xml:space="preserve">
|
||||
<source>Uploading archive</source>
|
||||
<target>Архивът се качва</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use .onion hosts" xml:space="preserve">
|
||||
@@ -5876,6 +5935,7 @@ To connect, please ask your contact to create another connection link and check
|
||||
</trans-unit>
|
||||
<trans-unit id="Use the app while in the call." xml:space="preserve">
|
||||
<source>Use the app while in the call.</source>
|
||||
<target>Използвайте приложението по време на разговора.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="User profile" xml:space="preserve">
|
||||
@@ -5915,10 +5975,12 @@ To connect, please ask your contact to create another connection link and check
|
||||
</trans-unit>
|
||||
<trans-unit id="Verify database passphrase" xml:space="preserve">
|
||||
<source>Verify database passphrase</source>
|
||||
<target>Проверете паролата на базата данни</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Verify passphrase" xml:space="preserve">
|
||||
<source>Verify passphrase</source>
|
||||
<target>Провери паролата</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Verify security code" xml:space="preserve">
|
||||
@@ -6013,6 +6075,7 @@ To connect, please ask your contact to create another connection link and check
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
|
||||
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
|
||||
<target>Внимание: стартирането на чата на множество устройства не се поддържа и ще доведе до неуспешно изпращане на съобщения</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
@@ -6037,6 +6100,7 @@ To connect, please ask your contact to create another connection link and check
|
||||
</trans-unit>
|
||||
<trans-unit id="Welcome message is too long" xml:space="preserve">
|
||||
<source>Welcome message is too long</source>
|
||||
<target>Съобщението при посрещане е твърде дълго</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="What's new" xml:space="preserve">
|
||||
@@ -6187,6 +6251,7 @@ Repeat join request?</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="You can give another try." xml:space="preserve">
|
||||
<source>You can give another try.</source>
|
||||
<target>Можете да опитате още веднъж.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
|
||||
@@ -7094,6 +7159,7 @@ SimpleX сървърите не могат да видят вашия профи
|
||||
</trans-unit>
|
||||
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
|
||||
<source>quantum resistant e2e encryption</source>
|
||||
<target>квантово устойчиво e2e криптиране</target>
|
||||
<note>chat item text</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="received answer…" xml:space="preserve">
|
||||
@@ -7173,6 +7239,7 @@ SimpleX сървърите не могат да видят вашия профи
|
||||
</trans-unit>
|
||||
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
|
||||
<source>standard end-to-end encryption</source>
|
||||
<target>стандартно криптиране от край до край</target>
|
||||
<note>chat item text</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="starting…" xml:space="preserve">
|
||||
|
||||
@@ -635,7 +635,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Admins can block a member for all." xml:space="preserve">
|
||||
<source>Admins can block a member for all.</source>
|
||||
<target>Administratoren können für ein Mitglied alle Funktionen blockieren.</target>
|
||||
<target>Administratoren können ein Gruppenmitglied für Alle blockieren.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
|
||||
@@ -1291,7 +1291,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm that you remember database passphrase to migrate it." xml:space="preserve">
|
||||
<source>Confirm that you remember database passphrase to migrate it.</source>
|
||||
<target>Für die Migration bestätigen Sie bitte, dass Sie sich an das Datenbank-Passwort erinnern.</target>
|
||||
<target>Bitte bestätigen Sie für die Migration, dass Sie sich an Ihr Datenbank-Passwort erinnern.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm upload" xml:space="preserve">
|
||||
@@ -3660,7 +3660,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
|
||||
<source>Migrate to another device via QR code.</source>
|
||||
<target>Über einen QR-Code auf ein anderes Gerät migrieren.</target>
|
||||
<target>Daten können über einen QR-Code auf ein anderes Gerät migriert werden.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrating" xml:space="preserve">
|
||||
@@ -5618,7 +5618,7 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
|
||||
</trans-unit>
|
||||
<trans-unit id="To ask any questions and to receive updates:" xml:space="preserve">
|
||||
<source>To ask any questions and to receive updates:</source>
|
||||
<target>Um Fragen zu stellen und Aktualisierungen zu erhalten:</target>
|
||||
<target>Um Fragen zu stellen und aktuelle Informationen zu erhalten:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="To connect, your contact can scan QR code or use the link in the app." xml:space="preserve">
|
||||
@@ -6508,7 +6508,7 @@ Sie können diese Verbindung abbrechen und den Kontakt entfernen (und es später
|
||||
</trans-unit>
|
||||
<trans-unit id="Your contacts will remain connected." xml:space="preserve">
|
||||
<source>Your contacts will remain connected.</source>
|
||||
<target>Ihre Kontakte bleiben verbunden.</target>
|
||||
<target>Ihre Kontakte bleiben weiterhin verbunden.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||
|
||||
@@ -134,6 +134,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ uploaded" xml:space="preserve">
|
||||
<source>%@ uploaded</source>
|
||||
<target>%@ cargado</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ wants to connect!" xml:space="preserve">
|
||||
@@ -1295,6 +1296,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="Confirm upload" xml:space="preserve">
|
||||
<source>Confirm upload</source>
|
||||
<target>Confirmar subida</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Connect" xml:space="preserve">
|
||||
@@ -1558,6 +1560,7 @@ This is your own one-time link!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Creating archive link" xml:space="preserve">
|
||||
<source>Creating archive link</source>
|
||||
<target>Creando enlace de archivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Creating link…" xml:space="preserve">
|
||||
@@ -1782,6 +1785,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete database from this device" xml:space="preserve">
|
||||
<source>Delete database from this device</source>
|
||||
<target>Eliminar base de datos de este dispositivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Delete file" xml:space="preserve">
|
||||
@@ -2076,6 +2080,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Download failed" xml:space="preserve">
|
||||
<source>Download failed</source>
|
||||
<target>Error en la descarga</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Download file" xml:space="preserve">
|
||||
@@ -2085,10 +2090,12 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downloading archive" xml:space="preserve">
|
||||
<source>Downloading archive</source>
|
||||
<target>Descargando archivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Downloading link details" xml:space="preserve">
|
||||
<source>Downloading link details</source>
|
||||
<target>Descargando detalles del enlace</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Duplicate display name!" xml:space="preserve">
|
||||
@@ -2148,6 +2155,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
|
||||
<source>Enable in direct chats (BETA)!</source>
|
||||
<target>Activar en chats directos (BETA)!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enable instant notifications?" xml:space="preserve">
|
||||
@@ -2267,6 +2275,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enter passphrase" xml:space="preserve">
|
||||
<source>Enter passphrase</source>
|
||||
<target>Introducir frase de contraseña</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||
@@ -2331,6 +2340,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
|
||||
<source>Error allowing contact PQ encryption</source>
|
||||
<target>Error al permitir cifrado PQ al contacto</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error changing address" xml:space="preserve">
|
||||
@@ -2425,6 +2435,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error downloading the archive" xml:space="preserve">
|
||||
<source>Error downloading the archive</source>
|
||||
<target>Error al descargar el archivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
|
||||
@@ -2504,6 +2515,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error saving settings" xml:space="preserve">
|
||||
<source>Error saving settings</source>
|
||||
<target>Error al guardar ajustes</target>
|
||||
<note>when migrating</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error saving user password" xml:space="preserve">
|
||||
@@ -2578,10 +2590,12 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error uploading the archive" xml:space="preserve">
|
||||
<source>Error uploading the archive</source>
|
||||
<target>Error al subir el archivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
|
||||
<source>Error verifying passphrase:</source>
|
||||
<target>Error al verificar la frase de contraseña:</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error: " xml:space="preserve">
|
||||
@@ -2636,6 +2650,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
|
||||
<source>Exported file doesn't exist</source>
|
||||
<target>El archivo exportado no existe</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Exporting database archive…" xml:space="preserve">
|
||||
@@ -2710,10 +2725,12 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Finalize migration" xml:space="preserve">
|
||||
<source>Finalize migration</source>
|
||||
<target>Finalizar la migración</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Finalize migration on another device." xml:space="preserve">
|
||||
<source>Finalize migration on another device.</source>
|
||||
<target>Finalizar la migración en otro dispositivo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
|
||||
@@ -3008,6 +3025,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Hungarian interface" xml:space="preserve">
|
||||
<source>Hungarian interface</source>
|
||||
<target>Interfaz húngara</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
|
||||
@@ -3077,10 +3095,12 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Import failed" xml:space="preserve">
|
||||
<source>Import failed</source>
|
||||
<target>Error de importación</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Importing archive" xml:space="preserve">
|
||||
<source>Importing archive</source>
|
||||
<target>Importando archivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Improved message delivery" xml:space="preserve">
|
||||
@@ -3100,6 +3120,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="In order to continue, chat should be stopped." xml:space="preserve">
|
||||
<source>In order to continue, chat should be stopped.</source>
|
||||
<target>Para continuar, el chat debe ser interrumpido.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="In reply to" xml:space="preserve">
|
||||
@@ -3216,6 +3237,7 @@ This cannot be undone!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
|
||||
<source>Invalid migration confirmation</source>
|
||||
<target>Confirmación de migración inválida</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||
@@ -3588,6 +3610,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Message too large" xml:space="preserve">
|
||||
<source>Message too large</source>
|
||||
<target>Mensaje demasiado grande</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Messages" xml:space="preserve">
|
||||
@@ -3607,34 +3630,42 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||
<target>Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo** con perfecta confidencialidad, repudio y recuperación tras ataques.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||
<target>Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo resistente a la computación cuántica** con perfecta confidencialidad, repudio y recuperación tras ataques.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate device" xml:space="preserve">
|
||||
<source>Migrate device</source>
|
||||
<target>Migrar dispositivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate from another device" xml:space="preserve">
|
||||
<source>Migrate from another device</source>
|
||||
<target>Migrar desde otro dispositivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate here" xml:space="preserve">
|
||||
<source>Migrate here</source>
|
||||
<target>Migrar aquí</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate to another device" xml:space="preserve">
|
||||
<source>Migrate to another device</source>
|
||||
<target>Migrar hacia otro dispositivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
|
||||
<source>Migrate to another device via QR code.</source>
|
||||
<target>Migrar hacia otro dispositivo mediante código QR.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrating" xml:space="preserve">
|
||||
<source>Migrating</source>
|
||||
<target>Migrando</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||
@@ -3644,6 +3675,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migration complete" xml:space="preserve">
|
||||
<source>Migration complete</source>
|
||||
<target>Migración completada</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migration error:" xml:space="preserve">
|
||||
@@ -4007,6 +4039,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open migration to another device" xml:space="preserve">
|
||||
<source>Open migration to another device</source>
|
||||
<target>Abrir la migración hacia otro dispositivo</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||
@@ -4026,6 +4059,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or paste archive link" xml:space="preserve">
|
||||
<source>Or paste archive link</source>
|
||||
<target>O pegar enlace del archivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or scan QR code" xml:space="preserve">
|
||||
@@ -4035,6 +4069,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or securely share this file link" xml:space="preserve">
|
||||
<source>Or securely share this file link</source>
|
||||
<target>O comparta de forma segura el enlace de este archivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or show this code" xml:space="preserve">
|
||||
@@ -4124,6 +4159,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
|
||||
<source>Picture-in-picture calls</source>
|
||||
<target>Llamadas picture-in-picture</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
|
||||
@@ -4148,6 +4184,7 @@ This is your link for group %@!</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
|
||||
<source>Please confirm that network settings are correct for this device.</source>
|
||||
<target>Por favor confirme que la configuración de red es correcta para este dispositivo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Please contact developers. Error: %@" xml:space="preserve">
|
||||
@@ -4209,6 +4246,7 @@ Error: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
|
||||
<source>Post-quantum E2EE</source>
|
||||
<target>E2EE postcuántica</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
|
||||
@@ -4348,10 +4386,12 @@ Error: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Push server" xml:space="preserve">
|
||||
<source>Push server</source>
|
||||
<target>Servidor push</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
|
||||
<source>Quantum resistant encryption</source>
|
||||
<target>Cifrado resistente a la tecnología cuántica</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Rate the app" xml:space="preserve">
|
||||
@@ -4541,10 +4581,12 @@ Error: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat download" xml:space="preserve">
|
||||
<source>Repeat download</source>
|
||||
<target>Repetir descarga</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat import" xml:space="preserve">
|
||||
<source>Repeat import</source>
|
||||
<target>Repetir importación</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||
@@ -4554,6 +4596,7 @@ Error: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat upload" xml:space="preserve">
|
||||
<source>Repeat upload</source>
|
||||
<target>Repetir la carga</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Reply" xml:space="preserve">
|
||||
@@ -4658,6 +4701,7 @@ Error: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Safer groups" xml:space="preserve">
|
||||
<source>Safer groups</source>
|
||||
<target>Grupos más seguros</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Save" xml:space="preserve">
|
||||
@@ -5027,6 +5071,7 @@ Error: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Set passphrase" xml:space="preserve">
|
||||
<source>Set passphrase</source>
|
||||
<target>Definir frase de contraseña</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Set passphrase to export" xml:space="preserve">
|
||||
@@ -5086,6 +5131,7 @@ Error: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show QR code" xml:space="preserve">
|
||||
<source>Show QR code</source>
|
||||
<target>Mostrar código QR</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show calls in phone history" xml:space="preserve">
|
||||
@@ -5230,6 +5276,7 @@ Error: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Stop chat" xml:space="preserve">
|
||||
<source>Stop chat</source>
|
||||
<target>Detener el chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
|
||||
@@ -5274,6 +5321,7 @@ Error: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Stopping chat" xml:space="preserve">
|
||||
<source>Stopping chat</source>
|
||||
<target>Detención del chat</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Submit" xml:space="preserve">
|
||||
@@ -5525,10 +5573,12 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
|
||||
<source>This chat is protected by end-to-end encryption.</source>
|
||||
<target>Este chat está protegido por cifrado de extremo a extremo.</target>
|
||||
<note>E2EE info chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
|
||||
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
|
||||
<target>Este chat está protegido por un cifrado de extremo a extremo resistente a tecnologías cuánticas.</target>
|
||||
<note>E2EE info chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="This device name" xml:space="preserve">
|
||||
@@ -5828,6 +5878,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
||||
</trans-unit>
|
||||
<trans-unit id="Upload failed" xml:space="preserve">
|
||||
<source>Upload failed</source>
|
||||
<target>Error de carga</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Upload file" xml:space="preserve">
|
||||
@@ -5837,6 +5888,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
||||
</trans-unit>
|
||||
<trans-unit id="Uploading archive" xml:space="preserve">
|
||||
<source>Uploading archive</source>
|
||||
<target>Subiendo el archivo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use .onion hosts" xml:space="preserve">
|
||||
@@ -5891,6 +5943,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
||||
</trans-unit>
|
||||
<trans-unit id="Use the app while in the call." xml:space="preserve">
|
||||
<source>Use the app while in the call.</source>
|
||||
<target>Usar la app durante la llamada.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="User profile" xml:space="preserve">
|
||||
@@ -5930,10 +5983,12 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
||||
</trans-unit>
|
||||
<trans-unit id="Verify database passphrase" xml:space="preserve">
|
||||
<source>Verify database passphrase</source>
|
||||
<target>Verificar la contraseña de la base de datos</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Verify passphrase" xml:space="preserve">
|
||||
<source>Verify passphrase</source>
|
||||
<target>Verificar frase de contraseña</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Verify security code" xml:space="preserve">
|
||||
@@ -6028,6 +6083,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
|
||||
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
|
||||
<target>Advertencia: el inicio del chat en varios dispositivos no es compatible y provocará fallos en la entrega de mensajes</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
@@ -6052,6 +6108,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
||||
</trans-unit>
|
||||
<trans-unit id="Welcome message is too long" xml:space="preserve">
|
||||
<source>Welcome message is too long</source>
|
||||
<target>El mensaje de bienvenida es demasiado largo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="What's new" xml:space="preserve">
|
||||
@@ -6111,6 +6168,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
||||
</trans-unit>
|
||||
<trans-unit id="You **must not** use the same database on two devices." xml:space="preserve">
|
||||
<source>You **must not** use the same database on two devices.</source>
|
||||
<target>**No debe** usar la misma base de datos en dos dispositivos.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You accepted connection" xml:space="preserve">
|
||||
@@ -6202,6 +6260,7 @@ Repeat join request?</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="You can give another try." xml:space="preserve">
|
||||
<source>You can give another try.</source>
|
||||
<target>Puede intentarlo de nuevo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
|
||||
@@ -7109,6 +7168,7 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
|
||||
<source>quantum resistant e2e encryption</source>
|
||||
<target>cifrado e2e resistente a la cuántica</target>
|
||||
<note>chat item text</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="received answer…" xml:space="preserve">
|
||||
@@ -7188,6 +7248,7 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
|
||||
<source>standard end-to-end encryption</source>
|
||||
<target>cifrado estándar de extremo a extremo</target>
|
||||
<note>chat item text</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="starting…" xml:space="preserve">
|
||||
|
||||
@@ -2155,7 +2155,7 @@ Cette opération ne peut être annulée !</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
|
||||
<source>Enable in direct chats (BETA)!</source>
|
||||
<target>Activé dans les conversations directes (BETA) !</target>
|
||||
<target>Activer dans les conversations directes (BETA) !</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Enable instant notifications?" xml:space="preserve">
|
||||
@@ -3635,7 +3635,7 @@ Voici votre lien pour le groupe %@ !</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||
<target>Les messages, fichiers et appels sont protégés par un chiffrement **2e2 résistant post-quantique** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction.</target>
|
||||
<target>Les messages, fichiers et appels sont protégés par un chiffrement **e2e résistant post-quantique** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate device" xml:space="preserve">
|
||||
@@ -5578,7 +5578,7 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
|
||||
</trans-unit>
|
||||
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
|
||||
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
|
||||
<target>Cette discussion est protégée par un chiffrement de bout en bout résistant post-quantique.</target>
|
||||
<target>Cette discussion est protégée par un chiffrement de bout en bout résistant aux technologies quantiques.</target>
|
||||
<note>E2EE info chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="This device name" xml:space="preserve">
|
||||
@@ -6082,7 +6082,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
|
||||
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
|
||||
<target>Attention : démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages</target>
|
||||
<target>Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
|
||||
@@ -5311,6 +5311,11 @@ SimpleX servers cannot see your profile.</source>
|
||||
<target state="translated">ללא היסטוריה</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ and %@" xml:space="preserve" approved="no">
|
||||
<source>%@ and %@</source>
|
||||
<target state="translated">%@ ו-%@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="he" datatype="plaintext">
|
||||
|
||||
@@ -3635,7 +3635,7 @@ Questo è il tuo link per il gruppo %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||
<target>I messaggi, i file e le chiamate sono protetti da **crittografia e2e resistente al quantistico** con perfect forward secrecy, ripudio e recupero da intrusione.</target>
|
||||
<target>I messaggi, i file e le chiamate sono protetti da **crittografia e2e resistente alla quantistica** con perfect forward secrecy, ripudio e recupero da intrusione.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate device" xml:space="preserve">
|
||||
@@ -4391,7 +4391,7 @@ Errore: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
|
||||
<source>Quantum resistant encryption</source>
|
||||
<target>Crittografia resistente al quantistico</target>
|
||||
<target>Crittografia resistente alla quantistica</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Rate the app" xml:space="preserve">
|
||||
@@ -5578,7 +5578,7 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
|
||||
</trans-unit>
|
||||
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
|
||||
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
|
||||
<target>Questa chat è protetta da crittografia end-to-end resistente al quantistico.</target>
|
||||
<target>Questa chat è protetta da crittografia end-to-end resistente alla quantistica.</target>
|
||||
<note>E2EE info chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="This device name" xml:space="preserve">
|
||||
@@ -6002,7 +6002,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
||||
</trans-unit>
|
||||
<trans-unit id="Via secure quantum resistant protocol." xml:space="preserve">
|
||||
<source>Via secure quantum resistant protocol.</source>
|
||||
<target>Tramite protocollo sicuro resistente al quantistico.</target>
|
||||
<target>Tramite protocollo sicuro resistente alla quantistica.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Video call" xml:space="preserve">
|
||||
@@ -7167,7 +7167,7 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
|
||||
<source>quantum resistant e2e encryption</source>
|
||||
<target>crittografia e2e resistente al quantistico</target>
|
||||
<target>crittografia e2e resistente alla quantistica</target>
|
||||
<note>chat item text</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="received answer…" xml:space="preserve">
|
||||
|
||||
@@ -4024,7 +4024,7 @@ Dit is jouw link voor groep %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open chat" xml:space="preserve">
|
||||
<source>Open chat</source>
|
||||
<target>Gesprekken openen</target>
|
||||
<target>Chat openen</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open chat console" xml:space="preserve">
|
||||
|
||||
@@ -15,32 +15,39 @@
|
||||
Available in v5.1</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id=" " xml:space="preserve">
|
||||
<trans-unit id=" " xml:space="preserve" approved="no">
|
||||
<source> </source>
|
||||
<target state="translated"> </target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id=" " xml:space="preserve">
|
||||
<trans-unit id=" " xml:space="preserve" approved="no">
|
||||
<source> </source>
|
||||
<target state="translated"> </target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id=" " xml:space="preserve">
|
||||
<trans-unit id=" " xml:space="preserve" approved="no">
|
||||
<source> </source>
|
||||
<target state="translated"> </target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id=" (" xml:space="preserve">
|
||||
<trans-unit id=" (" xml:space="preserve" approved="no">
|
||||
<source> (</source>
|
||||
<target state="translated"> (</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id=" (can be copied)" xml:space="preserve">
|
||||
<trans-unit id=" (can be copied)" xml:space="preserve" approved="no">
|
||||
<source> (can be copied)</source>
|
||||
<target state="translated"> .(pode ser copiado)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="!1 colored!" xml:space="preserve">
|
||||
<trans-unit id="!1 colored!" xml:space="preserve" approved="no">
|
||||
<source>!1 colored!</source>
|
||||
<target state="translated">!1 colorido!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="#secret#" xml:space="preserve">
|
||||
<trans-unit id="#secret#" xml:space="preserve" approved="no">
|
||||
<source>#secret#</source>
|
||||
<target state="translated">#secreto#</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@" xml:space="preserve">
|
||||
@@ -55,48 +62,59 @@ Available in v5.1</source>
|
||||
<source>%@ / %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||
<trans-unit id="%@ is connected!" xml:space="preserve" approved="no">
|
||||
<source>%@ is connected!</source>
|
||||
<target state="translated">%@ está conectado!</target>
|
||||
<note>notification title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ is not verified" xml:space="preserve">
|
||||
<trans-unit id="%@ is not verified" xml:space="preserve" approved="no">
|
||||
<source>%@ is not verified</source>
|
||||
<target state="translated">%@ não foi verificado</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ is verified" xml:space="preserve">
|
||||
<trans-unit id="%@ is verified" xml:space="preserve" approved="no">
|
||||
<source>%@ is verified</source>
|
||||
<target state="translated">%@ foi verificado</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ servers" xml:space="preserve">
|
||||
<trans-unit id="%@ servers" xml:space="preserve" approved="no">
|
||||
<source>%@ servers</source>
|
||||
<target state="translated">%@ servidores</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ wants to connect!" xml:space="preserve">
|
||||
<trans-unit id="%@ wants to connect!" xml:space="preserve" approved="no">
|
||||
<source>%@ wants to connect!</source>
|
||||
<target state="translated">%@ quer se conectar!</target>
|
||||
<note>notification title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d days" xml:space="preserve">
|
||||
<trans-unit id="%d days" xml:space="preserve" approved="no">
|
||||
<source>%d days</source>
|
||||
<target state="translated">%d dias</target>
|
||||
<note>message ttl</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d hours" xml:space="preserve">
|
||||
<trans-unit id="%d hours" xml:space="preserve" approved="no">
|
||||
<source>%d hours</source>
|
||||
<target state="translated">%d horas</target>
|
||||
<note>message ttl</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d min" xml:space="preserve">
|
||||
<trans-unit id="%d min" xml:space="preserve" approved="no">
|
||||
<source>%d min</source>
|
||||
<target state="translated">%d minuto</target>
|
||||
<note>message ttl</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d months" xml:space="preserve">
|
||||
<trans-unit id="%d months" xml:space="preserve" approved="no">
|
||||
<source>%d months</source>
|
||||
<target state="translated">%d meses</target>
|
||||
<note>message ttl</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d sec" xml:space="preserve">
|
||||
<trans-unit id="%d sec" xml:space="preserve" approved="no">
|
||||
<source>%d sec</source>
|
||||
<target state="translated">%d segundo</target>
|
||||
<note>message ttl</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d skipped message(s)" xml:space="preserve">
|
||||
<trans-unit id="%d skipped message(s)" xml:space="preserve" approved="no">
|
||||
<source>%d skipped message(s)</source>
|
||||
<target state="translated">%d mensagem(s) ignorada(s)</target>
|
||||
<note>integrity error chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld" xml:space="preserve">
|
||||
@@ -107,28 +125,34 @@ Available in v5.1</source>
|
||||
<source>%lld %@</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld contact(s) selected" xml:space="preserve">
|
||||
<trans-unit id="%lld contact(s) selected" xml:space="preserve" approved="no">
|
||||
<source>%lld contact(s) selected</source>
|
||||
<target state="translated">%lld contato(s) selecionado(s)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld file(s) with total size of %@" xml:space="preserve">
|
||||
<trans-unit id="%lld file(s) with total size of %@" xml:space="preserve" approved="no">
|
||||
<source>%lld file(s) with total size of %@</source>
|
||||
<target state="translated">%lld arquivo(s) com tamanho total de %@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld members" xml:space="preserve">
|
||||
<trans-unit id="%lld members" xml:space="preserve" approved="no">
|
||||
<source>%lld members</source>
|
||||
<target state="translated">%lld membros</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||
<trans-unit id="%lld minutes" xml:space="preserve" approved="no">
|
||||
<source>%lld minutes</source>
|
||||
<target state="translated">%lld minutos</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld second(s)" xml:space="preserve">
|
||||
<trans-unit id="%lld second(s)" xml:space="preserve" approved="no">
|
||||
<source>%lld second(s)</source>
|
||||
<target state="translated">%lld segundo(s)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld seconds" xml:space="preserve">
|
||||
<trans-unit id="%lld seconds" xml:space="preserve" approved="no">
|
||||
<source>%lld seconds</source>
|
||||
<target state="translated">%lld segundos</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lldd" xml:space="preserve">
|
||||
@@ -159,12 +183,14 @@ Available in v5.1</source>
|
||||
<source>%lldw</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
|
||||
<trans-unit id="%u messages failed to decrypt." xml:space="preserve" approved="no">
|
||||
<source>%u messages failed to decrypt.</source>
|
||||
<target state="translated">%u mensagens não foram descriptografadas.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%u messages skipped." xml:space="preserve">
|
||||
<trans-unit id="%u messages skipped." xml:space="preserve" approved="no">
|
||||
<source>%u messages skipped.</source>
|
||||
<target state="translated">%u mensagens ignoradas.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="(" xml:space="preserve">
|
||||
@@ -175,48 +201,56 @@ Available in v5.1</source>
|
||||
<source>)</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Add new contact**: to create your one-time QR Code for your contact." xml:space="preserve">
|
||||
<trans-unit id="**Add new contact**: to create your one-time QR Code for your contact." xml:space="preserve" approved="no">
|
||||
<source>**Add new contact**: to create your one-time QR Code or link for your contact.</source>
|
||||
<target state="translated">**Adicionar novo contato**: para criar seu QR Code único ou link para seu contato.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Create link / QR code** for your contact to use." xml:space="preserve">
|
||||
<source>**Create link / QR code** for your contact to use.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have." xml:space="preserve">
|
||||
<trans-unit id="**More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have." xml:space="preserve" approved="no">
|
||||
<source>**More private**: check new messages every 20 minutes. Device token is shared with SimpleX Chat server, but not how many contacts or messages you have.</source>
|
||||
<target state="translated">**Mais privado**: verifique novas mensagens a cada 20 minutos. O token do dispositivo é compartilhado com o servidor SimpleX Chat, mas não com quantos contatos ou mensagens você possui.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." xml:space="preserve">
|
||||
<trans-unit id="**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." xml:space="preserve" approved="no">
|
||||
<source>**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app).</source>
|
||||
<target state="translated">**Totalmente privado**: não use o servidor de notificações do SimpleX Chat, verifique as mensagens periodicamente em segundo plano (depende da frequência com que você usa o aplicativo).</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Paste received link** or open it in the browser and tap **Open in mobile app**." xml:space="preserve">
|
||||
<source>**Paste received link** or open it in the browser and tap **Open in mobile app**.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
|
||||
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve" approved="no">
|
||||
<source>**Please note**: you will NOT be able to recover or change passphrase if you lose it.</source>
|
||||
<target state="translated">**Atenção**: Você NÃO poderá recuperar ou alterar a senha caso a perca.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." xml:space="preserve">
|
||||
<trans-unit id="**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." xml:space="preserve" approved="no">
|
||||
<source>**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from.</source>
|
||||
<target state="translated">**Recomendado**: O token do dispositivo e as notificações são enviados ao servidor de notificação do SimpleX Chat, mas não o conteúdo, o tamanho da mensagem ou de quem ela é.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Scan QR code**: to connect to your contact in person or via video call." xml:space="preserve">
|
||||
<source>**Scan QR code**: to connect to your contact in person or via video call.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Warning**: Instant push notifications require passphrase saved in Keychain." xml:space="preserve">
|
||||
<trans-unit id="**Warning**: Instant push notifications require passphrase saved in Keychain." xml:space="preserve" approved="no">
|
||||
<source>**Warning**: Instant push notifications require passphrase saved in Keychain.</source>
|
||||
<target state="translated">**Aviso**: As notificações push instantâneas exigem uma senha salva nas Chaves.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
|
||||
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve" approved="no">
|
||||
<source>**e2e encrypted** audio call</source>
|
||||
<target state="translated">** Criptografado e2e** chamada de áudio</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**e2e encrypted** video call" xml:space="preserve">
|
||||
<trans-unit id="**e2e encrypted** video call" xml:space="preserve" approved="no">
|
||||
<source>**e2e encrypted** video call</source>
|
||||
<target state="translated">**Criptografado e2e** chamada de vídeo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="*bold*" xml:space="preserve">
|
||||
@@ -353,144 +387,175 @@ Available in v5.1</source>
|
||||
<source>All group members will remain connected.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you." xml:space="preserve">
|
||||
<trans-unit id="All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you." xml:space="preserve" approved="no">
|
||||
<source>All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you.</source>
|
||||
<target state="translated">Todas as mensagens serão apagadas – isso não pode ser desfeito! As mensagens serão apagadas SOMENTE para você.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="All your contacts will remain connected" xml:space="preserve">
|
||||
<source>All your contacts will remain connected</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow" xml:space="preserve">
|
||||
<trans-unit id="Allow" xml:space="preserve" approved="no">
|
||||
<source>Allow</source>
|
||||
<target state="translated">Permitir</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
|
||||
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve" approved="no">
|
||||
<source>Allow calls only if your contact allows them.</source>
|
||||
<target state="translated">Permita chamadas somente se seu contato permitir.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
|
||||
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve" approved="no">
|
||||
<source>Allow disappearing messages only if your contact allows it to you.</source>
|
||||
<target state="translated">Permita o desaparecimento de mensagens somente se o seu contato permitir.</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." xml:space="preserve">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow sending direct messages to members." xml:space="preserve">
|
||||
<trans-unit id="Allow sending direct messages to members." xml:space="preserve" approved="no">
|
||||
<source>Allow sending direct messages to members.</source>
|
||||
<target state="translated">Permitir o envio de mensagens diretas aos membros.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow sending disappearing messages." xml:space="preserve">
|
||||
<trans-unit id="Allow sending disappearing messages." xml:space="preserve" approved="no">
|
||||
<source>Allow sending disappearing messages.</source>
|
||||
<target state="translated">Permitir o envio de mensagens que desaparecem.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow to irreversibly delete sent messages." xml:space="preserve">
|
||||
<source>Allow to irreversibly delete sent messages.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow to send voice messages." xml:space="preserve">
|
||||
<trans-unit id="Allow to send voice messages." xml:space="preserve" approved="no">
|
||||
<source>Allow to send voice messages.</source>
|
||||
<target state="translated">Permitir enviar mensagens de voz.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow voice messages only if your contact allows them." xml:space="preserve">
|
||||
<trans-unit id="Allow voice messages only if your contact allows them." xml:space="preserve" approved="no">
|
||||
<source>Allow voice messages only if your contact allows them.</source>
|
||||
<target state="translated">Permita mensagens de voz apenas se o seu contato permitir.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow voice messages?" xml:space="preserve">
|
||||
<trans-unit id="Allow voice messages?" xml:space="preserve" approved="no">
|
||||
<source>Allow voice messages?</source>
|
||||
<target state="translated">Permitir mensagens de voz?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
|
||||
<trans-unit id="Allow your contacts to call you." xml:space="preserve" approved="no">
|
||||
<source>Allow your contacts to call you.</source>
|
||||
<target state="translated">Permita que seus contatos liguem para você.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to irreversibly delete sent messages." xml:space="preserve">
|
||||
<source>Allow your contacts to irreversibly delete sent messages.</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send disappearing messages." xml:space="preserve">
|
||||
<trans-unit id="Allow your contacts to send disappearing messages." xml:space="preserve" approved="no">
|
||||
<source>Allow your contacts to send disappearing messages.</source>
|
||||
<target state="translated">Permita que seus contatos enviem mensagens que desaparecem.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
|
||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve" approved="no">
|
||||
<source>Allow your contacts to send voice messages.</source>
|
||||
<target state="translated">Permita que seus contatos enviem mensagens de voz.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Already connected?" xml:space="preserve">
|
||||
<trans-unit id="Already connected?" xml:space="preserve" approved="no">
|
||||
<source>Already connected?</source>
|
||||
<target state="translated">Já conectado?</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Always use relay" xml:space="preserve">
|
||||
<trans-unit id="Always use relay" xml:space="preserve" approved="no">
|
||||
<source>Always use relay</source>
|
||||
<target state="translated">Sempre usar retransmissão</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Answer call" xml:space="preserve">
|
||||
<trans-unit id="Answer call" xml:space="preserve" approved="no">
|
||||
<source>Answer call</source>
|
||||
<target state="translated">Atender chamada</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="App build: %@" xml:space="preserve">
|
||||
<trans-unit id="App build: %@" xml:space="preserve" approved="no">
|
||||
<source>App build: %@</source>
|
||||
<target state="translated">Versão do Aplicativo: %@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="App icon" xml:space="preserve">
|
||||
<trans-unit id="App icon" xml:space="preserve" approved="no">
|
||||
<source>App icon</source>
|
||||
<target state="translated">Ícone do Aplicativo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="App passcode" xml:space="preserve">
|
||||
<trans-unit id="App passcode" xml:space="preserve" approved="no">
|
||||
<source>App passcode</source>
|
||||
<target state="translated">Senha do Aplicativo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="App version" xml:space="preserve">
|
||||
<trans-unit id="App version" xml:space="preserve" approved="no">
|
||||
<source>App version</source>
|
||||
<target state="translated">Versão do Aplicativo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="App version: v%@" xml:space="preserve">
|
||||
<trans-unit id="App version: v%@" xml:space="preserve" approved="no">
|
||||
<source>App version: v%@</source>
|
||||
<target state="translated">Versão do Aplicativo: v%@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Appearance" xml:space="preserve">
|
||||
<trans-unit id="Appearance" xml:space="preserve" approved="no">
|
||||
<source>Appearance</source>
|
||||
<target state="translated">Aparência</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Attach" xml:space="preserve">
|
||||
<trans-unit id="Attach" xml:space="preserve" approved="no">
|
||||
<source>Attach</source>
|
||||
<target state="translated">Anexar</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Audio & video calls" xml:space="preserve">
|
||||
<trans-unit id="Audio & video calls" xml:space="preserve" approved="no">
|
||||
<source>Audio & video calls</source>
|
||||
<target state="translated">Chamadas de áudio e vídeo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Audio and video calls" xml:space="preserve">
|
||||
<trans-unit id="Audio and video calls" xml:space="preserve" approved="no">
|
||||
<source>Audio and video calls</source>
|
||||
<target state="translated">Chamadas de áudio e vídeo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Audio/video calls" xml:space="preserve">
|
||||
<trans-unit id="Audio/video calls" xml:space="preserve" approved="no">
|
||||
<source>Audio/video calls</source>
|
||||
<target state="translated">Chamadas de áudio/vídeo</target>
|
||||
<note>chat feature</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
|
||||
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve" approved="no">
|
||||
<source>Audio/video calls are prohibited.</source>
|
||||
<target state="translated">Chamadas de áudio/vídeo são proibidas.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Authentication cancelled" xml:space="preserve">
|
||||
<trans-unit id="Authentication cancelled" xml:space="preserve" approved="no">
|
||||
<source>Authentication cancelled</source>
|
||||
<target state="translated">Autenticação cancelada</target>
|
||||
<note>PIN entry</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Authentication failed" xml:space="preserve">
|
||||
<trans-unit id="Authentication failed" xml:space="preserve" approved="no">
|
||||
<source>Authentication failed</source>
|
||||
<target state="translated">Falha na autenticação</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Authentication is required before the call is connected, but you may miss calls." xml:space="preserve">
|
||||
<trans-unit id="Authentication is required before the call is connected, but you may miss calls." xml:space="preserve" approved="no">
|
||||
<source>Authentication is required before the call is connected, but you may miss calls.</source>
|
||||
<target state="translated">A autenticação é necessária antes que a chamada seja conectada, mas você pode perder chamadas.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Authentication unavailable" xml:space="preserve">
|
||||
<trans-unit id="Authentication unavailable" xml:space="preserve" approved="no">
|
||||
<source>Authentication unavailable</source>
|
||||
<target state="translated">Autenticação indisponível</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Auto-accept contact requests" xml:space="preserve">
|
||||
<trans-unit id="Auto-accept contact requests" xml:space="preserve" approved="no">
|
||||
<source>Auto-accept contact requests</source>
|
||||
<target state="translated">Aceitar solicitações de contato automaticamente</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Auto-accept images" xml:space="preserve">
|
||||
@@ -4162,6 +4227,226 @@ SimpleX servers cannot see your profile.</source>
|
||||
<source>\~strike~</source>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="## In reply to" xml:space="preserve" approved="no">
|
||||
<source>## In reply to</source>
|
||||
<target state="translated">## Em resposta a</target>
|
||||
<note>copied message info</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ uploaded" xml:space="preserve" approved="no">
|
||||
<source>%@ uploaded</source>
|
||||
<target state="translated">%@ enviado</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%d weeks" xml:space="preserve" approved="no">
|
||||
<source>%d weeks</source>
|
||||
<target state="translated">%d semanas</target>
|
||||
<note>time interval</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld messages blocked by admin" xml:space="preserve" approved="no">
|
||||
<source>%lld messages blocked by admin</source>
|
||||
<target state="translated">%lld mensagens bloqueadas pelo administrador</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld new interface languages" xml:space="preserve" approved="no">
|
||||
<source>%lld new interface languages</source>
|
||||
<target state="translated">%lld novas interface de idiomas</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Add contact**: to create a new invitation link, or connect via a link you received." xml:space="preserve" approved="no">
|
||||
<source>**Add contact**: to create a new invitation link, or connect via a link you received.</source>
|
||||
<target state="translated">**Adicionar contato**: para criar um novo link de convite ou conectar-se por meio de um link que você recebeu.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Create group**: to create a new group." xml:space="preserve" approved="no">
|
||||
<source>**Create group**: to create a new group.</source>
|
||||
<target state="translated">**Criar grupo**: para criar um novo grupo.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve" approved="no">
|
||||
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
|
||||
<target state="translated">**Observação**: usar o mesmo banco de dados em dois dispositivos interromperá a descriptografia de mensagens de suas conexões, como proteção de segurança.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="## History" xml:space="preserve" approved="no">
|
||||
<source>## History</source>
|
||||
<target state="translated">## Histórico</target>
|
||||
<note>copied message info</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve" approved="no">
|
||||
<source>**Warning**: the archive will be removed.</source>
|
||||
<target state="translated">**Atenção**: O arquivo será removido.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ and %@" xml:space="preserve" approved="no">
|
||||
<source>%@ and %@</source>
|
||||
<target state="translated">%@ e %@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ and %@ connected" xml:space="preserve" approved="no">
|
||||
<source>%@ and %@ connected</source>
|
||||
<target state="translated">%@ e %@ conectado</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ at %@:" xml:space="preserve" approved="no">
|
||||
<source>%1$@ at %2$@:</source>
|
||||
<target state="translated">%1$@ em %2$@:</target>
|
||||
<note>copied message info, <sender> at <time></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ connected" xml:space="preserve" approved="no">
|
||||
<source>%@ connected</source>
|
||||
<target state="translated">%@ conectado</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve" approved="no">
|
||||
<source>%@, %@ and %lld members</source>
|
||||
<target state="translated">%@, %@ e %lld membros</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve" approved="no">
|
||||
<source>%@, %@ and %lld other members connected</source>
|
||||
<target state="translated">%@, %@ e %lld outros membros conectados</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld group events" xml:space="preserve" approved="no">
|
||||
<source>%lld group events</source>
|
||||
<target state="translated">%lld eventos de grupo</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld messages marked deleted" xml:space="preserve" approved="no">
|
||||
<source>%lld messages marked deleted</source>
|
||||
<target state="translated">%lld mensagens marcadas como excluídas</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld messages blocked" xml:space="preserve" approved="no">
|
||||
<source>%lld messages blocked</source>
|
||||
<target state="translated">%lld mensagens bloqueadas</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%lld messages moderated by %@" xml:space="preserve" approved="no">
|
||||
<source>%lld messages moderated by %@</source>
|
||||
<target state="translated">%lld mensagens moderadas por %@</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="(this device v%@)" xml:space="preserve" approved="no">
|
||||
<source>(this device v%@)</source>
|
||||
<target state="translated">(este dispositivo v%@)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="All data is erased when it is entered." xml:space="preserve" approved="no">
|
||||
<source>All data is erased when it is entered.</source>
|
||||
<target state="translated">Todos os dados são apagados quando são inseridos.</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" approved="no">
|
||||
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||
<target state="translated">Permita a exclusão irreversível de mensagens somente se o seu contato permitir. (24 horas)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Apply" xml:space="preserve" approved="no">
|
||||
<source>Apply</source>
|
||||
<target state="translated">Aplicar</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Archive and upload" xml:space="preserve" approved="no">
|
||||
<source>Archive and upload</source>
|
||||
<target state="translated">Arquivar e fazer envio</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve" approved="no">
|
||||
<source>All new messages from %@ will be hidden!</source>
|
||||
<target state="translated">Todas as novas mensagens de %@ ficarão ocultas!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Already connecting!" xml:space="preserve" approved="no">
|
||||
<source>Already connecting!</source>
|
||||
<target state="translated">Já conectando!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve" approved="no">
|
||||
<source>App encrypts new local files (except videos).</source>
|
||||
<target state="translated">O aplicativo criptografa novos arquivos locais (exceto vídeos).</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="App passcode is replaced with self-destruct passcode." xml:space="preserve" approved="no">
|
||||
<source>App passcode is replaced with self-destruct passcode.</source>
|
||||
<target state="translated">A senha do Aplicativo é substituída pela senha de autodestruição.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve" approved="no">
|
||||
<source>All your contacts will remain connected.</source>
|
||||
<target state="translated">Todos os seus contatos permanecerão conectados.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="All your contacts will remain connected. Profile update will be sent to your contacts." xml:space="preserve" approved="no">
|
||||
<source>All your contacts will remain connected. Profile update will be sent to your contacts.</source>
|
||||
<target state="translated">Todos os seus contatos permanecerão conectados. A atualização do perfil será enviada para seus contatos.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow to send files and media." xml:space="preserve" approved="no">
|
||||
<source>Allow to send files and media.</source>
|
||||
<target state="translated">Permitir o envio de arquivos e mídia.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="App data migration" xml:space="preserve" approved="no">
|
||||
<source>App data migration</source>
|
||||
<target state="translated">Migração de dados de aplicativos</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Archiving database" xml:space="preserve" approved="no">
|
||||
<source>Archiving database</source>
|
||||
<target state="translated">Arquivando banco de dados</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="All messages will be deleted - this cannot be undone!" xml:space="preserve" approved="no">
|
||||
<source>All messages will be deleted - this cannot be undone!</source>
|
||||
<target state="translated">Todas as mensagens serão apagadas – isso não pode ser desfeito!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve" approved="no">
|
||||
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
|
||||
<target state="translated">Todos os seus contatos, conversas e arquivos serão criptografados com segurança e enviados em partes para retransmissões XFTP configuradas.</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" approved="no">
|
||||
<source>Allow message reactions only if your contact allows them.</source>
|
||||
<target state="translated">Permita reações às mensagens somente se o seu contato permitir.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow message reactions." xml:space="preserve" approved="no">
|
||||
<source>Allow message reactions.</source>
|
||||
<target state="translated">Permitir reações às mensagens.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts to irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
|
||||
<source>Allow your contacts to irreversibly delete sent messages. (24 hours)</source>
|
||||
<target state="translated">Permita que seus contatos apaguem irreversivelmente as mensagens enviadas. (24 horas)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Already joining the group!" xml:space="preserve" approved="no">
|
||||
<source>Already joining the group!</source>
|
||||
<target state="translated">Entrando no grupo!</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="An empty chat profile with the provided name is created, and the app opens as usual." xml:space="preserve" approved="no">
|
||||
<source>An empty chat profile with the provided name is created, and the app opens as usual.</source>
|
||||
<target state="translated">Um perfil de conversa vazio com o nome fornecido é criado e o aplicativo abre normalmente.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Auto-accept" xml:space="preserve" approved="no">
|
||||
<source>Auto-accept</source>
|
||||
<target state="translated">Aceitar automaticamente</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow your contacts adding message reactions." xml:space="preserve" approved="no">
|
||||
<source>Allow your contacts adding message reactions.</source>
|
||||
<target state="translated">Permita que seus contatos adicionem reações às mensagens.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Allow to irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
|
||||
<source>Allow to irreversibly delete sent messages. (24 hours)</source>
|
||||
<target state="translated">Permitir apagar irreversivelmente as mensagens enviadas. (24 horas)</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="pt" datatype="plaintext">
|
||||
|
||||
@@ -6082,7 +6082,7 @@ To connect, please ask your contact to create another connection link and check
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
|
||||
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
|
||||
<target>Внимание: запуск чата на нескольких устройствах не поддерживается и приведет к сбоям доставки сообщений.</target>
|
||||
<target>Внимание: запуск чата на нескольких устройствах не поддерживается и приведет к сбоям доставки сообщений</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ at %@:" xml:space="preserve">
|
||||
<source>%1$@ at %2$@:</source>
|
||||
<target>%1$@, %2$@ de</target>
|
||||
<target>1$@, %2$@'de:</target>
|
||||
<note>copied message info, <sender> at <time></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="%@ connected" xml:space="preserve">
|
||||
@@ -2340,6 +2340,7 @@ Bu geri alınamaz!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error allowing contact PQ encryption" xml:space="preserve">
|
||||
<source>Error allowing contact PQ encryption</source>
|
||||
<target>İletişim PQ şifrelemesine izin verirken hata oluştu</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Error changing address" xml:space="preserve">
|
||||
@@ -3024,6 +3025,7 @@ Bu geri alınamaz!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Hungarian interface" xml:space="preserve">
|
||||
<source>Hungarian interface</source>
|
||||
<target>Macarca arayüz</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ICE servers (one per line)" xml:space="preserve">
|
||||
@@ -3628,34 +3630,42 @@ Bu senin grup için bağlantın %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||
<target>Mesajlar, dosyalar ve aramalar **uçtan uca şifreleme** ile mükemmel ileri gizlilik, inkar ve izinsiz giriş kurtarma ile korunur.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||
<source>Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||
<target>Mesajlar, dosyalar ve aramalar **kuantum dirençli e2e şifreleme** ile mükemmel ileri gizlilik, inkar ve zorla girme kurtarma ile korunur.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate device" xml:space="preserve">
|
||||
<source>Migrate device</source>
|
||||
<target>Cihazı taşıma</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate from another device" xml:space="preserve">
|
||||
<source>Migrate from another device</source>
|
||||
<target>Başka bir cihazdan geçiş yapın</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate here" xml:space="preserve">
|
||||
<source>Migrate here</source>
|
||||
<target>Buraya göç edin</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate to another device" xml:space="preserve">
|
||||
<source>Migrate to another device</source>
|
||||
<target>Başka bir cihaza taşıma</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
|
||||
<source>Migrate to another device via QR code.</source>
|
||||
<target>QR kodu aracılığıyla başka bir cihaza geçiş yapın.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrating" xml:space="preserve">
|
||||
<source>Migrating</source>
|
||||
<target>Göçmenlik</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||
@@ -3665,6 +3675,7 @@ Bu senin grup için bağlantın %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migration complete" xml:space="preserve">
|
||||
<source>Migration complete</source>
|
||||
<target>Geçiş tamamlandı</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Migration error:" xml:space="preserve">
|
||||
@@ -4028,6 +4039,7 @@ Bu senin grup için bağlantın %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open migration to another device" xml:space="preserve">
|
||||
<source>Open migration to another device</source>
|
||||
<target>Başka bir cihaza açık geçiş</target>
|
||||
<note>authentication reason</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||
@@ -4047,6 +4059,7 @@ Bu senin grup için bağlantın %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or paste archive link" xml:space="preserve">
|
||||
<source>Or paste archive link</source>
|
||||
<target>Veya arşiv bağlantısını yapıştırın</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or scan QR code" xml:space="preserve">
|
||||
@@ -4056,6 +4069,7 @@ Bu senin grup için bağlantın %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or securely share this file link" xml:space="preserve">
|
||||
<source>Or securely share this file link</source>
|
||||
<target>Veya bu dosya bağlantısını güvenli bir şekilde paylaşın</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Or show this code" xml:space="preserve">
|
||||
@@ -4145,6 +4159,7 @@ Bu senin grup için bağlantın %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
|
||||
<source>Picture-in-picture calls</source>
|
||||
<target>Resim içinde resim aramaları</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
|
||||
@@ -4169,6 +4184,7 @@ Bu senin grup için bağlantın %@!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
|
||||
<source>Please confirm that network settings are correct for this device.</source>
|
||||
<target>Lütfen bu cihaz için ağ ayarlarının doğru olduğunu onaylayın.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Please contact developers. Error: %@" xml:space="preserve">
|
||||
@@ -4230,6 +4246,7 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Post-quantum E2EE" xml:space="preserve">
|
||||
<source>Post-quantum E2EE</source>
|
||||
<target>Kuantum sonrası E2EE</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
|
||||
@@ -4369,10 +4386,12 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Push server" xml:space="preserve">
|
||||
<source>Push server</source>
|
||||
<target>Push sunucu</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
|
||||
<source>Quantum resistant encryption</source>
|
||||
<target>Kuantum dirençli şifreleme</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Rate the app" xml:space="preserve">
|
||||
@@ -4422,7 +4441,7 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Receipts are disabled" xml:space="preserve">
|
||||
<source>Receipts are disabled</source>
|
||||
<target>Görüldü devre dışı bırakıldı</target>
|
||||
<target>Makbuzlar devre dışı bırakıldı</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Received at" xml:space="preserve">
|
||||
@@ -4562,10 +4581,12 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat download" xml:space="preserve">
|
||||
<source>Repeat download</source>
|
||||
<target>Tekrar indir</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat import" xml:space="preserve">
|
||||
<source>Repeat import</source>
|
||||
<target>İthalatı tekrarla</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||
@@ -4575,6 +4596,7 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Repeat upload" xml:space="preserve">
|
||||
<source>Repeat upload</source>
|
||||
<target>Yüklemeyi tekrarla</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Reply" xml:space="preserve">
|
||||
@@ -4679,6 +4701,7 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Safer groups" xml:space="preserve">
|
||||
<source>Safer groups</source>
|
||||
<target>Daha güvenli gruplar</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Save" xml:space="preserve">
|
||||
@@ -4938,7 +4961,7 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
|
||||
<source>Sending delivery receipts will be enabled for all contacts.</source>
|
||||
<target>Görüldü bilgisi bütün kişileri için etkinleştirilecektir.</target>
|
||||
<target>Teslimat makbuzlarının gönderilmesi tüm kişiler için etkinleştirilecektir.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Sending file will be stopped." xml:space="preserve">
|
||||
@@ -5048,6 +5071,7 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Set passphrase" xml:space="preserve">
|
||||
<source>Set passphrase</source>
|
||||
<target>Parolayı ayarla</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Set passphrase to export" xml:space="preserve">
|
||||
@@ -5107,6 +5131,7 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show QR code" xml:space="preserve">
|
||||
<source>Show QR code</source>
|
||||
<target>QR kodunu göster</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Show calls in phone history" xml:space="preserve">
|
||||
@@ -5251,6 +5276,7 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Stop chat" xml:space="preserve">
|
||||
<source>Stop chat</source>
|
||||
<target>Sohbeti kes</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
|
||||
@@ -5295,6 +5321,7 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Stopping chat" xml:space="preserve">
|
||||
<source>Stopping chat</source>
|
||||
<target>Sohbeti durdurma</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Submit" xml:space="preserve">
|
||||
@@ -5324,7 +5351,7 @@ Hata: %@</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="TCP_KEEPCNT" xml:space="preserve">
|
||||
<source>TCP_KEEPCNT</source>
|
||||
<target>TCP_CNTYİTUT</target>
|
||||
<target>TCP_KEEPCNT</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="TCP_KEEPIDLE" xml:space="preserve">
|
||||
@@ -5546,10 +5573,12 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir.
|
||||
</trans-unit>
|
||||
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
|
||||
<source>This chat is protected by end-to-end encryption.</source>
|
||||
<target>Bu sohbet uçtan uca şifreleme ile korunmaktadır.</target>
|
||||
<note>E2EE info chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
|
||||
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
|
||||
<target>Bu sohbet kuantum dirençli uçtan uca şifreleme ile korunmaktadır.</target>
|
||||
<note>E2EE info chat item</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="This device name" xml:space="preserve">
|
||||
@@ -5848,6 +5877,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
|
||||
</trans-unit>
|
||||
<trans-unit id="Upload failed" xml:space="preserve">
|
||||
<source>Upload failed</source>
|
||||
<target>Yükleme başarısız</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Upload file" xml:space="preserve">
|
||||
@@ -5857,6 +5887,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
|
||||
</trans-unit>
|
||||
<trans-unit id="Uploading archive" xml:space="preserve">
|
||||
<source>Uploading archive</source>
|
||||
<target>Arşiv yükleme</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Use .onion hosts" xml:space="preserve">
|
||||
@@ -5911,6 +5942,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
|
||||
</trans-unit>
|
||||
<trans-unit id="Use the app while in the call." xml:space="preserve">
|
||||
<source>Use the app while in the call.</source>
|
||||
<target>Görüşme sırasında uygulamayı kullanın.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="User profile" xml:space="preserve">
|
||||
@@ -5950,10 +5982,12 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
|
||||
</trans-unit>
|
||||
<trans-unit id="Verify database passphrase" xml:space="preserve">
|
||||
<source>Verify database passphrase</source>
|
||||
<target>Veritabanı parolasını doğrulayın</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Verify passphrase" xml:space="preserve">
|
||||
<source>Verify passphrase</source>
|
||||
<target>Parolayı doğrula</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Verify security code" xml:space="preserve">
|
||||
@@ -6048,6 +6082,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
|
||||
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
|
||||
<target>Uyarı: birden fazla cihazda sohbet başlatmak desteklenmez ve mesaj teslim hatalarına neden olur</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
|
||||
@@ -6072,6 +6107,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
|
||||
</trans-unit>
|
||||
<trans-unit id="Welcome message is too long" xml:space="preserve">
|
||||
<source>Welcome message is too long</source>
|
||||
<target>Hoş geldiniz mesajı çok uzun</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="What's new" xml:space="preserve">
|
||||
@@ -6131,6 +6167,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
|
||||
</trans-unit>
|
||||
<trans-unit id="You **must not** use the same database on two devices." xml:space="preserve">
|
||||
<source>You **must not** use the same database on two devices.</source>
|
||||
<target>Aynı veritabanını iki cihazda **kullanmamalısınız**.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You accepted connection" xml:space="preserve">
|
||||
@@ -6222,6 +6259,7 @@ Katılma isteği tekrarlansın mı?</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="You can give another try." xml:space="preserve">
|
||||
<source>You can give another try.</source>
|
||||
<target>Bir kez daha deneyebilirsiniz.</target>
|
||||
<note>No comment provided by engineer.</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
|
||||
@@ -7129,6 +7167,7 @@ SimpleX sunucuları profilinizi göremez.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
|
||||
<source>quantum resistant e2e encryption</source>
|
||||
<target>kuantuma dayanıklı e2e şifreleme</target>
|
||||
<note>chat item text</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="received answer…" xml:space="preserve">
|
||||
@@ -7208,6 +7247,7 @@ SimpleX sunucuları profilinizi göremez.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
|
||||
<source>standard end-to-end encryption</source>
|
||||
<target>standart uçtan uca şifreleme</target>
|
||||
<note>chat item text</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="starting…" xml:space="preserve">
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
//
|
||||
// ConcurrentQueue.swift
|
||||
// SimpleX NSE
|
||||
//
|
||||
// Created by Evgeny on 08/12/2023.
|
||||
// Copyright © 2023 SimpleX Chat. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
struct DequeueElement<T> {
|
||||
var elementId: UUID?
|
||||
var task: Task<T?, Never>
|
||||
}
|
||||
|
||||
class ConcurrentQueue<T> {
|
||||
private var queue: [T] = []
|
||||
private var queueLock = DispatchQueue(label: "chat.simplex.app.SimpleX-NSE.concurrent-queue.lock.\(UUID())")
|
||||
private var continuations = [(elementId: UUID, continuation: CheckedContinuation<T?, Never>)]()
|
||||
|
||||
func enqueue(_ el: T) {
|
||||
resumeContinuation(el) { self.queue.append(el) }
|
||||
}
|
||||
|
||||
func frontEnqueue(_ el: T) {
|
||||
resumeContinuation(el) { self.queue.insert(el, at: 0) }
|
||||
}
|
||||
|
||||
private func resumeContinuation(_ el: T, add: @escaping () -> Void) {
|
||||
queueLock.sync {
|
||||
if let (_, cont) = continuations.first {
|
||||
continuations.remove(at: 0)
|
||||
cont.resume(returning: el)
|
||||
} else {
|
||||
add()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func dequeue() -> DequeueElement<T> {
|
||||
queueLock.sync {
|
||||
if queue.isEmpty {
|
||||
let elementId = UUID()
|
||||
let task = Task {
|
||||
await withCheckedContinuation { cont in
|
||||
continuations.append((elementId, cont))
|
||||
}
|
||||
}
|
||||
return DequeueElement(elementId: elementId, task: task)
|
||||
} else {
|
||||
let el = queue.remove(at: 0)
|
||||
return DequeueElement(task: Task { el })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func cancelDequeue(_ elementId: UUID) {
|
||||
queueLock.sync {
|
||||
let cancelled = continuations.filter { $0.elementId == elementId }
|
||||
continuations.removeAll { $0.elementId == elementId }
|
||||
cancelled.forEach { $0.continuation.resume(returning: nil) }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,110 +22,6 @@ let nseSuspendSchedule: SuspendSchedule = (2, 4)
|
||||
|
||||
let fastNSESuspendSchedule: SuspendSchedule = (1, 1)
|
||||
|
||||
typealias NtfStream = ConcurrentQueue<NSENotification>
|
||||
|
||||
// Notifications are delivered via concurrent queues, as they are all received from chat controller in a single loop that
|
||||
// writes to ConcurrentQueue and when notification is processed, the instance of Notification service extension reads from the queue.
|
||||
// One queue per connection (entity) is used.
|
||||
// The concurrent queues allow read cancellation, to ensure that notifications are not lost in case the current thread completes
|
||||
// before expected notification is read (multiple notifications can be expected, because one notification can be delivered for several messages).
|
||||
actor PendingNtfs {
|
||||
static let shared = PendingNtfs()
|
||||
private var ntfStreams: [String: NtfStream] = [:]
|
||||
|
||||
func createStream(_ id: String) async {
|
||||
logger.debug("NotificationService PendingNtfs.createStream: \(id)")
|
||||
if ntfStreams[id] == nil {
|
||||
ntfStreams[id] = ConcurrentQueue()
|
||||
logger.debug("NotificationService PendingNtfs.createStream: created ConcurrentQueue")
|
||||
}
|
||||
}
|
||||
|
||||
func readStream(_ id: String, for nse: NotificationService, ntfInfo: NtfMessages) async {
|
||||
logger.debug("NotificationService PendingNtfs.readStream: \(id) \(ntfInfo.ntfMessages.count)")
|
||||
if !ntfInfo.user.showNotifications {
|
||||
nse.setBestAttemptNtf(.empty)
|
||||
}
|
||||
if let s = ntfStreams[id] {
|
||||
logger.debug("NotificationService PendingNtfs.readStream: has stream")
|
||||
var expected = Set(ntfInfo.ntfMessages.map { $0.msgId })
|
||||
logger.debug("NotificationService PendingNtfs.readStream: expecting: \(expected)")
|
||||
var readCancelled = false
|
||||
var dequeued: DequeueElement<NSENotification>?
|
||||
nse.cancelRead = {
|
||||
readCancelled = true
|
||||
if let elementId = dequeued?.elementId {
|
||||
s.cancelDequeue(elementId)
|
||||
}
|
||||
}
|
||||
while !readCancelled {
|
||||
dequeued = s.dequeue()
|
||||
if let ntf = await dequeued?.task.value {
|
||||
if readCancelled {
|
||||
logger.debug("NotificationService PendingNtfs.readStream: read cancelled, put ntf to queue front")
|
||||
s.frontEnqueue(ntf)
|
||||
break
|
||||
} else if case let .msgInfo(info) = ntf {
|
||||
let found = expected.remove(info.msgId)
|
||||
if found != nil {
|
||||
logger.debug("NotificationService PendingNtfs.readStream: msgInfo, last: \(expected.isEmpty)")
|
||||
if expected.isEmpty { break }
|
||||
} else if let msgTs = ntfInfo.msgTs, info.msgTs > msgTs {
|
||||
logger.debug("NotificationService PendingNtfs.readStream: unexpected msgInfo")
|
||||
s.frontEnqueue(ntf)
|
||||
break
|
||||
}
|
||||
} else if ntfInfo.user.showNotifications {
|
||||
logger.debug("NotificationService PendingNtfs.readStream: setting best attempt")
|
||||
nse.setBestAttemptNtf(ntf)
|
||||
if ntf.isCallInvitation { break }
|
||||
}
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
nse.cancelRead = nil
|
||||
logger.debug("NotificationService PendingNtfs.readStream: exiting")
|
||||
}
|
||||
}
|
||||
|
||||
func writeStream(_ id: String, _ ntf: NSENotification) async {
|
||||
logger.debug("NotificationService PendingNtfs.writeStream: \(id)")
|
||||
if let s = ntfStreams[id] {
|
||||
logger.debug("NotificationService PendingNtfs.writeStream: writing ntf")
|
||||
s.enqueue(ntf)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The current implementation assumes concurrent notification delivery and uses semaphores
|
||||
// to process only one notification per connection (entity) at a time.
|
||||
class NtfStreamSemaphores {
|
||||
static let shared = NtfStreamSemaphores()
|
||||
private static let queue = DispatchQueue(label: "chat.simplex.app.SimpleX-NSE.notification-semaphores.lock")
|
||||
private var semaphores: [String: DispatchSemaphore] = [:]
|
||||
|
||||
func waitForStream(_ id: String) {
|
||||
streamSemaphore(id, value: 0)?.wait()
|
||||
}
|
||||
|
||||
func signalStreamReady(_ id: String) {
|
||||
streamSemaphore(id, value: 1)?.signal()
|
||||
}
|
||||
|
||||
// this function returns nil if semaphore is just created, so passed value shoud be coordinated with the desired end value of the semaphore
|
||||
private func streamSemaphore(_ id: String, value: Int) -> DispatchSemaphore? {
|
||||
NtfStreamSemaphores.queue.sync {
|
||||
if let s = semaphores[id] {
|
||||
return s
|
||||
} else {
|
||||
semaphores[id] = DispatchSemaphore(value: value)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum NSENotification {
|
||||
case nse(UNMutableNotificationContent)
|
||||
case callkit(RcvCallInvitation)
|
||||
@@ -149,7 +45,7 @@ class NSEThreads {
|
||||
static let shared = NSEThreads()
|
||||
private static let queue = DispatchQueue(label: "chat.simplex.app.SimpleX-NSE.notification-threads.lock")
|
||||
private var allThreads: Set<UUID> = []
|
||||
private var activeThreads: Set<UUID> = []
|
||||
private var activeThreads: [(UUID, NotificationService)] = []
|
||||
|
||||
func newThread() -> UUID {
|
||||
NSEThreads.queue.sync {
|
||||
@@ -158,19 +54,42 @@ class NSEThreads {
|
||||
}
|
||||
}
|
||||
|
||||
func startThread(_ t: UUID) {
|
||||
func startThread(_ t: UUID, _ service: NotificationService) {
|
||||
NSEThreads.queue.sync {
|
||||
if allThreads.contains(t) {
|
||||
_ = activeThreads.insert(t)
|
||||
activeThreads.append((t, service))
|
||||
} else {
|
||||
logger.warning("NotificationService startThread: thread \(t) was removed before it started")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func processNotification(_ id: ChatId, _ ntf: NSENotification) async -> Void {
|
||||
var waitTime: Int64 = 5_000_000000
|
||||
while waitTime > 0 {
|
||||
if let (_, nse) = rcvEntityThread(id),
|
||||
nse.shouldProcessNtf && nse.processReceivedNtf(ntf) {
|
||||
break
|
||||
} else {
|
||||
try? await Task.sleep(nanoseconds: 10_000000)
|
||||
waitTime -= 10_000000
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func rcvEntityThread(_ id: ChatId) -> (UUID, NotificationService)? {
|
||||
NSEThreads.queue.sync {
|
||||
activeThreads.first(where: { (_, nse) in nse.receiveEntityId == id })
|
||||
}
|
||||
}
|
||||
|
||||
func endThread(_ t: UUID) -> Bool {
|
||||
NSEThreads.queue.sync {
|
||||
let tActive = activeThreads.remove(t)
|
||||
let tActive: UUID? = if let index = activeThreads.firstIndex(where: { $0.0 == t }) {
|
||||
activeThreads.remove(at: index).0
|
||||
} else {
|
||||
nil
|
||||
}
|
||||
let t = allThreads.remove(t)
|
||||
if tActive != nil && activeThreads.isEmpty {
|
||||
return true
|
||||
@@ -198,8 +117,11 @@ class NotificationService: UNNotificationServiceExtension {
|
||||
// thread is added to allThreads here - if thread did not start chat,
|
||||
// chat does not need to be suspended but NSE state still needs to be set to "suspended".
|
||||
var threadId: UUID? = NSEThreads.shared.newThread()
|
||||
var notificationInfo: NtfMessages?
|
||||
var receiveEntityId: String?
|
||||
var cancelRead: (() -> Void)?
|
||||
var expectedMessages: Set<String> = []
|
||||
// return true if the message is taken - it prevents sending it to another NotificationService instance for processing
|
||||
var shouldProcessNtf = false
|
||||
var appSubscriber: AppSubscriber?
|
||||
var returnedSuspension = false
|
||||
|
||||
@@ -265,7 +187,7 @@ class NotificationService: UNNotificationServiceExtension {
|
||||
// check it here again
|
||||
appStateGroupDefault.get().inactive {
|
||||
// thread is added to activeThreads tracking set here - if thread started chat it needs to be suspended
|
||||
if let t = threadId { NSEThreads.shared.startThread(t) }
|
||||
if let t = threadId { NSEThreads.shared.startThread(t, self) }
|
||||
let dbStatus = startChat()
|
||||
if case .ok = dbStatus,
|
||||
let ntfInfo = apiGetNtfMessage(nonce: nonce, encNtfInfo: encNtfInfo) {
|
||||
@@ -276,17 +198,11 @@ class NotificationService: UNNotificationServiceExtension {
|
||||
? .nse(createConnectionEventNtf(ntfInfo.user, connEntity))
|
||||
: .empty
|
||||
)
|
||||
if let id = connEntity.id {
|
||||
if let id = connEntity.id, ntfInfo.msgTs != nil {
|
||||
notificationInfo = ntfInfo
|
||||
receiveEntityId = id
|
||||
NtfStreamSemaphores.shared.waitForStream(id)
|
||||
if receiveEntityId != nil {
|
||||
Task {
|
||||
logger.debug("NotificationService: receiveNtfMessages: in Task, connEntity id \(id)")
|
||||
await PendingNtfs.shared.createStream(id)
|
||||
await PendingNtfs.shared.readStream(id, for: self, ntfInfo: ntfInfo)
|
||||
deliverBestAttemptNtf()
|
||||
}
|
||||
}
|
||||
expectedMessages = Set(ntfInfo.ntfMessages.map { $0.msgId })
|
||||
shouldProcessNtf = true
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -302,6 +218,38 @@ class NotificationService: UNNotificationServiceExtension {
|
||||
deliverBestAttemptNtf(urgent: true)
|
||||
}
|
||||
|
||||
func processReceivedNtf(_ ntf: NSENotification) -> Bool {
|
||||
guard let ntfInfo = notificationInfo, let msgTs = ntfInfo.msgTs else { return false }
|
||||
if !ntfInfo.user.showNotifications {
|
||||
self.setBestAttemptNtf(.empty)
|
||||
}
|
||||
if case let .msgInfo(info) = ntf {
|
||||
let found = expectedMessages.remove(info.msgId)
|
||||
if found != nil {
|
||||
logger.debug("NotificationService processNtf: msgInfo, last: \(self.expectedMessages.isEmpty)")
|
||||
if expectedMessages.isEmpty {
|
||||
self.deliverBestAttemptNtf()
|
||||
}
|
||||
return true
|
||||
} else if info.msgTs > msgTs {
|
||||
logger.debug("NotificationService processNtf: unexpected msgInfo, let other instance to process it, stopping this one")
|
||||
self.deliverBestAttemptNtf()
|
||||
return false
|
||||
} else {
|
||||
logger.debug("NotificationService processNtf: unknown message, let other instance to process it")
|
||||
return false
|
||||
}
|
||||
} else if ntfInfo.user.showNotifications {
|
||||
logger.debug("NotificationService processNtf: setting best attempt")
|
||||
self.setBestAttemptNtf(ntf)
|
||||
if ntf.isCallInvitation {
|
||||
self.deliverBestAttemptNtf()
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func setBadgeCount() {
|
||||
badgeCount = ntfBadgeCountGroupDefault.get() + 1
|
||||
ntfBadgeCountGroupDefault.set(badgeCount)
|
||||
@@ -323,14 +271,9 @@ class NotificationService: UNNotificationServiceExtension {
|
||||
|
||||
private func deliverBestAttemptNtf(urgent: Bool = false) {
|
||||
logger.debug("NotificationService.deliverBestAttemptNtf")
|
||||
if let cancel = cancelRead {
|
||||
cancelRead = nil
|
||||
cancel()
|
||||
}
|
||||
if let id = receiveEntityId {
|
||||
receiveEntityId = nil
|
||||
NtfStreamSemaphores.shared.signalStreamReady(id)
|
||||
}
|
||||
// stop processing other messages
|
||||
shouldProcessNtf = false
|
||||
|
||||
let suspend: Bool
|
||||
if let t = threadId {
|
||||
threadId = nil
|
||||
@@ -572,7 +515,7 @@ func chatSuspended() {
|
||||
}
|
||||
|
||||
// A single loop is used per Notification service extension process to receive and process all messages depending on the NSE state
|
||||
// If the extension is not active yet, or suspended/suspending, or the app is running, the notifications will no be received.
|
||||
// If the extension is not active yet, or suspended/suspending, or the app is running, the notifications will not be received.
|
||||
func receiveMessages() async {
|
||||
logger.debug("NotificationService receiveMessages")
|
||||
while true {
|
||||
@@ -591,8 +534,7 @@ func receiveMessages() async {
|
||||
logger.debug("NotificationService receiveMsg: message")
|
||||
if let (id, ntf) = await receivedMsgNtf(msg) {
|
||||
logger.debug("NotificationService receiveMsg: notification")
|
||||
await PendingNtfs.shared.createStream(id)
|
||||
await PendingNtfs.shared.writeStream(id, ntf)
|
||||
await NSEThreads.shared.processNotification(id, ntf)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,11 +36,6 @@
|
||||
5C35CFC827B2782E00FB6C6D /* BGManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFC727B2782E00FB6C6D /* BGManager.swift */; };
|
||||
5C35CFCB27B2E91D00FB6C6D /* NtfManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFCA27B2E91D00FB6C6D /* NtfManager.swift */; };
|
||||
5C36027327F47AD5009F19D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C36027227F47AD5009F19D9 /* AppDelegate.swift */; };
|
||||
5C371E742BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E6F2BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a */; };
|
||||
5C371E752BACC5D600100AD3 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E702BACC5D600100AD3 /* libgmpxx.a */; };
|
||||
5C371E762BACC5D600100AD3 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E712BACC5D600100AD3 /* libffi.a */; };
|
||||
5C371E772BACC5D600100AD3 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E722BACC5D600100AD3 /* libgmp.a */; };
|
||||
5C371E782BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C371E732BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a */; };
|
||||
5C3A88CE27DF50170060F1C2 /* DetermineWidth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */; };
|
||||
5C3A88D127DF57800060F1C2 /* FramedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88D027DF57800060F1C2 /* FramedItemView.swift */; };
|
||||
5C3CCFCC2AE6BD3100C3F0C3 /* ConnectDesktopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3CCFCB2AE6BD3100C3F0C3 /* ConnectDesktopView.swift */; };
|
||||
@@ -116,6 +111,11 @@
|
||||
5CC2C0FC2809BF11000C35E3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FA2809BF11000C35E3 /* Localizable.strings */; };
|
||||
5CC2C0FF2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FD2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings */; };
|
||||
5CC868F329EB540C0017BBFD /* CIRcvDecryptionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC868F229EB540C0017BBFD /* CIRcvDecryptionError.swift */; };
|
||||
5CC932F52BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC932F02BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a */; };
|
||||
5CC932F62BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC932F12BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a */; };
|
||||
5CC932F72BBDD9FA008A1EB6 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC932F22BBDD9F9008A1EB6 /* libgmpxx.a */; };
|
||||
5CC932F82BBDD9FA008A1EB6 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC932F32BBDD9F9008A1EB6 /* libgmp.a */; };
|
||||
5CC932F92BBDD9FA008A1EB6 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CC932F42BBDD9F9008A1EB6 /* libffi.a */; };
|
||||
5CCB939C297EFCB100399E78 /* NavStackCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCB939B297EFCB100399E78 /* NavStackCompat.swift */; };
|
||||
5CD67B8F2B0E858A00C510B1 /* hs_init.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CD67B8D2B0E858A00C510B1 /* hs_init.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
5CD67B902B0E858A00C510B1 /* hs_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 5CD67B8E2B0E858A00C510B1 /* hs_init.c */; };
|
||||
@@ -144,7 +144,6 @@
|
||||
5CEACCED27DEA495000BD591 /* MsgContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCEC27DEA495000BD591 /* MsgContentView.swift */; };
|
||||
5CEBD7462A5C0A8F00665FE2 /* KeyboardPadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */; };
|
||||
5CEBD7482A5F115D00665FE2 /* SetDeliveryReceiptsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEBD7472A5F115D00665FE2 /* SetDeliveryReceiptsView.swift */; };
|
||||
5CF9371E2B23429500E1D781 /* ConcurrentQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF9371D2B23429500E1D781 /* ConcurrentQueue.swift */; };
|
||||
5CF937202B24DE8C00E1D781 /* SharedFileSubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF9371F2B24DE8C00E1D781 /* SharedFileSubscriber.swift */; };
|
||||
5CF937232B2503D000E1D781 /* NSESubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF937212B25034A00E1D781 /* NSESubscriber.swift */; };
|
||||
5CFA59C42860BC6200863A68 /* MigrateToAppGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFA59C32860BC6200863A68 /* MigrateToAppGroupView.swift */; };
|
||||
@@ -291,11 +290,6 @@
|
||||
5C371E4E2BA9AAA200100AD3 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
5C371E4F2BA9AB6400100AD3 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = "hu.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
5C371E502BA9AB6400100AD3 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
5C371E6F2BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a"; sourceTree = "<group>"; };
|
||||
5C371E702BACC5D600100AD3 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
|
||||
5C371E712BACC5D600100AD3 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
|
||||
5C371E722BACC5D600100AD3 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
|
||||
5C371E732BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a"; sourceTree = "<group>"; };
|
||||
5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetermineWidth.swift; sourceTree = "<group>"; };
|
||||
5C3A88D027DF57800060F1C2 /* FramedItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FramedItemView.swift; sourceTree = "<group>"; };
|
||||
5C3CCFCB2AE6BD3100C3F0C3 /* ConnectDesktopView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectDesktopView.swift; sourceTree = "<group>"; };
|
||||
@@ -408,6 +402,11 @@
|
||||
5CC2C0FB2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
5CC2C0FE2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = "ru.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
5CC868F229EB540C0017BBFD /* CIRcvDecryptionError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIRcvDecryptionError.swift; sourceTree = "<group>"; };
|
||||
5CC932F02BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a"; sourceTree = "<group>"; };
|
||||
5CC932F12BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a"; sourceTree = "<group>"; };
|
||||
5CC932F22BBDD9F9008A1EB6 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
|
||||
5CC932F32BBDD9F9008A1EB6 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
|
||||
5CC932F42BBDD9F9008A1EB6 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
|
||||
5CCB939B297EFCB100399E78 /* NavStackCompat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavStackCompat.swift; sourceTree = "<group>"; };
|
||||
5CD67B8D2B0E858A00C510B1 /* hs_init.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hs_init.h; sourceTree = "<group>"; };
|
||||
5CD67B8E2B0E858A00C510B1 /* hs_init.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = hs_init.c; sourceTree = "<group>"; };
|
||||
@@ -437,7 +436,6 @@
|
||||
5CEACCEC27DEA495000BD591 /* MsgContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MsgContentView.swift; sourceTree = "<group>"; };
|
||||
5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardPadding.swift; sourceTree = "<group>"; };
|
||||
5CEBD7472A5F115D00665FE2 /* SetDeliveryReceiptsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetDeliveryReceiptsView.swift; sourceTree = "<group>"; };
|
||||
5CF9371D2B23429500E1D781 /* ConcurrentQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConcurrentQueue.swift; sourceTree = "<group>"; };
|
||||
5CF9371F2B24DE8C00E1D781 /* SharedFileSubscriber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedFileSubscriber.swift; sourceTree = "<group>"; };
|
||||
5CF937212B25034A00E1D781 /* NSESubscriber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSESubscriber.swift; sourceTree = "<group>"; };
|
||||
5CFA59C32860BC6200863A68 /* MigrateToAppGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrateToAppGroupView.swift; sourceTree = "<group>"; };
|
||||
@@ -523,12 +521,12 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
5C371E752BACC5D600100AD3 /* libgmpxx.a in Frameworks */,
|
||||
5C371E742BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a in Frameworks */,
|
||||
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
|
||||
5C371E782BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a in Frameworks */,
|
||||
5C371E762BACC5D600100AD3 /* libffi.a in Frameworks */,
|
||||
5C371E772BACC5D600100AD3 /* libgmp.a in Frameworks */,
|
||||
5CC932F72BBDD9FA008A1EB6 /* libgmpxx.a in Frameworks */,
|
||||
5CC932F62BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a in Frameworks */,
|
||||
5CC932F52BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a in Frameworks */,
|
||||
5CC932F92BBDD9FA008A1EB6 /* libffi.a in Frameworks */,
|
||||
5CC932F82BBDD9FA008A1EB6 /* libgmp.a in Frameworks */,
|
||||
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -592,11 +590,11 @@
|
||||
5C764E5C279C70B7000C6508 /* Libraries */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5C371E712BACC5D600100AD3 /* libffi.a */,
|
||||
5C371E722BACC5D600100AD3 /* libgmp.a */,
|
||||
5C371E702BACC5D600100AD3 /* libgmpxx.a */,
|
||||
5C371E6F2BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv-ghc9.6.3.a */,
|
||||
5C371E732BACC5D600100AD3 /* libHSsimplex-chat-5.6.0.4-E0iWSIg8fcR48og4na41Dv.a */,
|
||||
5CC932F42BBDD9F9008A1EB6 /* libffi.a */,
|
||||
5CC932F32BBDD9F9008A1EB6 /* libgmp.a */,
|
||||
5CC932F22BBDD9F9008A1EB6 /* libgmpxx.a */,
|
||||
5CC932F02BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto-ghc9.6.3.a */,
|
||||
5CC932F12BBDD9F9008A1EB6 /* libHSsimplex-chat-5.6.1.1-KSjuZv7tE7cHRWd28F1Zto.a */,
|
||||
);
|
||||
path = Libraries;
|
||||
sourceTree = "<group>";
|
||||
@@ -800,7 +798,6 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
5CDCAD5128186DE400503DA2 /* SimpleX NSE.entitlements */,
|
||||
5CF9371D2B23429500E1D781 /* ConcurrentQueue.swift */,
|
||||
5CDCAD472818589900503DA2 /* NotificationService.swift */,
|
||||
5CDCAD492818589900503DA2 /* Info.plist */,
|
||||
5CB0BA862826CB3A00B3292C /* InfoPlist.strings */,
|
||||
@@ -1285,7 +1282,6 @@
|
||||
files = (
|
||||
5CDCAD482818589900503DA2 /* NotificationService.swift in Sources */,
|
||||
5CFE0922282EEAF60002594B /* ZoomableScrollView.swift in Sources */,
|
||||
5CF9371E2B23429500E1D781 /* ConcurrentQueue.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -1445,6 +1441,7 @@
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
@@ -1506,6 +1503,7 @@
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
@@ -1534,12 +1532,16 @@
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
|
||||
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 204;
|
||||
CURRENT_PROJECT_VERSION = 206;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||
ENABLE_BITCODE = NO;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = s;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "SimpleX--iOS--Info.plist";
|
||||
INFOPLIST_KEY_NSCameraUsageDescription = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||
@@ -1558,11 +1560,13 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 5.6;
|
||||
LLVM_LTO = YES_THIN;
|
||||
MARKETING_VERSION = 5.6.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
|
||||
PRODUCT_NAME = SimpleX;
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
@@ -1577,12 +1581,16 @@
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
|
||||
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 204;
|
||||
CURRENT_PROJECT_VERSION = 206;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||
ENABLE_BITCODE = NO;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
ENABLE_CODE_COVERAGE = NO;
|
||||
ENABLE_PREVIEWS = NO;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "SimpleX--iOS--Info.plist";
|
||||
INFOPLIST_KEY_NSCameraUsageDescription = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||
@@ -1601,7 +1609,8 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 5.6;
|
||||
LLVM_LTO = YES;
|
||||
MARKETING_VERSION = 5.6.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
|
||||
PRODUCT_NAME = SimpleX;
|
||||
SDKROOT = iphoneos;
|
||||
@@ -1657,12 +1666,15 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
|
||||
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 204;
|
||||
CURRENT_PROJECT_VERSION = 206;
|
||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||
ENABLE_BITCODE = NO;
|
||||
GCC_OPTIMIZATION_LEVEL = s;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "SimpleX NSE/Info.plist";
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "SimpleX NSE";
|
||||
@@ -1673,13 +1685,15 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 5.6;
|
||||
LLVM_LTO = YES;
|
||||
MARKETING_VERSION = 5.6.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Osize";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
@@ -1689,12 +1703,15 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
|
||||
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 204;
|
||||
CURRENT_PROJECT_VERSION = 206;
|
||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||
ENABLE_BITCODE = NO;
|
||||
ENABLE_CODE_COVERAGE = NO;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "SimpleX NSE/Info.plist";
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "SimpleX NSE";
|
||||
@@ -1705,13 +1722,15 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 5.6;
|
||||
LLVM_LTO = YES;
|
||||
MARKETING_VERSION = 5.6.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Osize";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
@@ -1723,14 +1742,17 @@
|
||||
buildSettings = {
|
||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
|
||||
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 204;
|
||||
CURRENT_PROJECT_VERSION = 206;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
ENABLE_BITCODE = NO;
|
||||
GCC_OPTIMIZATION_LEVEL = s;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 SimpleX Chat. All rights reserved.";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
@@ -1748,7 +1770,8 @@
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Libraries/sim",
|
||||
);
|
||||
MARKETING_VERSION = 5.6;
|
||||
LLVM_LTO = YES;
|
||||
MARKETING_VERSION = 5.6.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SDKROOT = iphoneos;
|
||||
@@ -1757,6 +1780,7 @@
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_INCLUDE_PATHS = "";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = ./SimpleXChat/SimpleX.h;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
@@ -1769,14 +1793,17 @@
|
||||
buildSettings = {
|
||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
|
||||
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 204;
|
||||
CURRENT_PROJECT_VERSION = 206;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
ENABLE_BITCODE = NO;
|
||||
ENABLE_CODE_COVERAGE = NO;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 SimpleX Chat. All rights reserved.";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
@@ -1794,7 +1821,8 @@
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Libraries/sim",
|
||||
);
|
||||
MARKETING_VERSION = 5.6;
|
||||
LLVM_LTO = YES;
|
||||
MARKETING_VERSION = 5.6.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SDKROOT = iphoneos;
|
||||
@@ -1803,6 +1831,7 @@
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_INCLUDE_PATHS = "";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = ./SimpleXChat/SimpleX.h;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
|
||||
@@ -557,11 +557,6 @@ public enum ChatResponse: Decodable, Error {
|
||||
case contactRequestRejected(user: UserRef)
|
||||
case contactUpdated(user: UserRef, toContact: Contact)
|
||||
case groupMemberUpdated(user: UserRef, groupInfo: GroupInfo, fromMember: GroupMember, toMember: GroupMember)
|
||||
// TODO remove events below
|
||||
case contactsSubscribed(server: String, contactRefs: [ContactRef])
|
||||
case contactsDisconnected(server: String, contactRefs: [ContactRef])
|
||||
case contactSubSummary(user: UserRef, contactSubscriptions: [ContactSubStatus])
|
||||
// TODO remove events above
|
||||
case networkStatus(networkStatus: NetworkStatus, connections: [String])
|
||||
case networkStatuses(user_: UserRef?, networkStatuses: [ConnNetworkStatus])
|
||||
case groupSubscribed(user: UserRef, groupInfo: GroupRef)
|
||||
@@ -724,9 +719,6 @@ public enum ChatResponse: Decodable, Error {
|
||||
case .contactRequestRejected: return "contactRequestRejected"
|
||||
case .contactUpdated: return "contactUpdated"
|
||||
case .groupMemberUpdated: return "groupMemberUpdated"
|
||||
case .contactsSubscribed: return "contactsSubscribed"
|
||||
case .contactsDisconnected: return "contactsDisconnected"
|
||||
case .contactSubSummary: return "contactSubSummary"
|
||||
case .networkStatus: return "networkStatus"
|
||||
case .networkStatuses: return "networkStatuses"
|
||||
case .groupSubscribed: return "groupSubscribed"
|
||||
@@ -885,9 +877,6 @@ public enum ChatResponse: Decodable, Error {
|
||||
case .contactRequestRejected: return noDetails
|
||||
case let .contactUpdated(u, toContact): return withUser(u, String(describing: toContact))
|
||||
case let .groupMemberUpdated(u, groupInfo, fromMember, toMember): return withUser(u, "groupInfo: \(groupInfo)\nfromMember: \(fromMember)\ntoMember: \(toMember)")
|
||||
case let .contactsSubscribed(server, contactRefs): return "server: \(server)\ncontacts:\n\(String(describing: contactRefs))"
|
||||
case let .contactsDisconnected(server, contactRefs): return "server: \(server)\ncontacts:\n\(String(describing: contactRefs))"
|
||||
case let .contactSubSummary(u, contactSubscriptions): return withUser(u, String(describing: contactSubscriptions))
|
||||
case let .networkStatus(status, conns): return "networkStatus: \(String(describing: status))\nconnections: \(String(describing: conns))"
|
||||
case let .networkStatuses(u, statuses): return withUser(u, String(describing: statuses))
|
||||
case let .groupSubscribed(u, groupInfo): return withUser(u, String(describing: groupInfo))
|
||||
@@ -1827,6 +1816,7 @@ public enum AgentErrorType: Decodable {
|
||||
case BROKER(brokerAddress: String, brokerErr: BrokerErrorType)
|
||||
case AGENT(agentErr: SMPAgentError)
|
||||
case INTERNAL(internalErr: String)
|
||||
case CRITICAL(offerRestart: Bool, criticalErr: String)
|
||||
case INACTIVE
|
||||
}
|
||||
|
||||
@@ -1878,6 +1868,8 @@ public enum XFTPErrorType: Decodable {
|
||||
case NO_FILE
|
||||
case HAS_FILE
|
||||
case FILE_IO
|
||||
case TIMEOUT
|
||||
case REDIRECT(redirectError: String)
|
||||
case INTERNAL
|
||||
}
|
||||
|
||||
@@ -1885,6 +1877,8 @@ public enum RCErrorType: Decodable {
|
||||
case `internal`(internalErr: String)
|
||||
case identity
|
||||
case noLocalAddress
|
||||
case newController
|
||||
case notDiscovered
|
||||
case tlsStartFailed
|
||||
case exception(exception: String)
|
||||
case ctrlAuth
|
||||
@@ -1910,6 +1904,7 @@ public enum ProtocolTransportError: Decodable {
|
||||
case badBlock
|
||||
case largeMsg
|
||||
case badSession
|
||||
case noServerAuth
|
||||
case handshake(handshakeErr: SMPHandshakeError)
|
||||
}
|
||||
|
||||
@@ -1917,6 +1912,7 @@ public enum SMPHandshakeError: Decodable {
|
||||
case PARSE
|
||||
case VERSION
|
||||
case IDENTITY
|
||||
case BAD_AUTH
|
||||
}
|
||||
|
||||
public enum SMPAgentError: Decodable {
|
||||
@@ -1938,10 +1934,13 @@ public enum RemoteCtrlError: Decodable {
|
||||
case badState
|
||||
case busy
|
||||
case timeout
|
||||
case noKnownControllers
|
||||
case badController
|
||||
case disconnected(remoteCtrlId: Int64, reason: String)
|
||||
case badInvitation
|
||||
case badVersion(appVersion: String)
|
||||
// case protocolError(protocolError: RemoteProtocolError)
|
||||
case hTTP2Error(http2Error: String)
|
||||
case protocolError
|
||||
}
|
||||
|
||||
public struct MigrationFileLinkData: Codable {
|
||||
|
||||
@@ -197,7 +197,7 @@ public let confirmDBUpgradesGroupDefault = BoolDefault(defaults: groupDefaults,
|
||||
|
||||
public let callKitEnabledGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_CALL_KIT_ENABLED)
|
||||
|
||||
public let pqExperimentalEnabledDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_ENCRYPT_LOCAL_FILES)
|
||||
public let pqExperimentalEnabledDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PQ_EXPERIMENTAL_ENABLED)
|
||||
|
||||
public class DateDefault {
|
||||
var defaults: UserDefaults
|
||||
|
||||
@@ -2120,7 +2120,7 @@ public enum ConnectionEntity: Decodable {
|
||||
public var id: String? {
|
||||
switch self {
|
||||
case let .rcvDirectMsgConnection(contact):
|
||||
return contact?.id ?? nil
|
||||
return contact?.id
|
||||
case let .rcvGroupMsgConnection(_, groupMember):
|
||||
return groupMember.id
|
||||
case let .userContactConnection(userContact):
|
||||
@@ -3209,6 +3209,14 @@ public enum MsgContent: Equatable {
|
||||
}
|
||||
}
|
||||
|
||||
public var isImageOrVideo: Bool {
|
||||
switch self {
|
||||
case .image: true
|
||||
case .video: true
|
||||
default: false
|
||||
}
|
||||
}
|
||||
|
||||
var cmdString: String {
|
||||
"json \(encodeJSON(self))"
|
||||
}
|
||||
|
||||
@@ -377,6 +377,9 @@
|
||||
/* member role */
|
||||
"admin" = "админ";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Admins can block a member for all." = "Администраторите могат да блокират член за всички.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Admins can create the links to join groups." = "Админите могат да създадат линкове за присъединяване към групи.";
|
||||
|
||||
@@ -416,6 +419,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Всички ваши контакти ще останат свързани. Актуализацията на профила ще бъде изпратена до вашите контакти.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Всички ваши контакти, разговори и файлове ще бъдат сигурно криптирани и качени на парчета в конфигурираните XFTP релета.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Allow" = "Позволи";
|
||||
|
||||
@@ -497,6 +503,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"App build: %@" = "Компилация на приложението: %@";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"App data migration" = "Миграция на данните от приложението";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"App encrypts new local files (except videos)." = "Приложението криптира нови локални файлове (с изключение на видеоклипове).";
|
||||
|
||||
@@ -518,6 +527,15 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Appearance" = "Изглед";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Apply" = "Приложи";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Archive and upload" = "Архивиране и качване";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Archiving database" = "Архивиране на база данни";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Attach" = "Прикачи";
|
||||
|
||||
@@ -665,6 +683,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Cancel" = "Отказ";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Cancel migration" = "Отмени миграцията";
|
||||
|
||||
/* feature offered item */
|
||||
"cancelled %@" = "отменен %@";
|
||||
|
||||
@@ -744,6 +765,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "Чатът е спрян. Ако вече сте използвали тази база данни на друго устройство, трябва да я прехвърлите обратно, преди да стартирате чата отново.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Chat migrated!" = "Чатът е мигриран!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Chat preferences" = "Чат настройки";
|
||||
|
||||
@@ -801,6 +825,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm database upgrades" = "Потвърди актуализаациите на базата данни";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm network settings" = "Потвърди мрежовите настройки";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm new passphrase…" = "Потвърди новата парола…";
|
||||
|
||||
@@ -810,6 +837,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm password" = "Потвърди парола";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm that you remember database passphrase to migrate it." = "Потвърдете, че помните паролата на базата данни, преди да я мигрирате.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm upload" = "Потвърди качването";
|
||||
|
||||
/* server test step */
|
||||
"Connect" = "Свързване";
|
||||
|
||||
@@ -1008,6 +1041,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Created on %@" = "Създаден на %@";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Creating archive link" = "Създаване на архивен линк";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Creating link…" = "Линкът се създава…";
|
||||
|
||||
@@ -1155,6 +1191,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete database" = "Изтрий базата данни";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete database from this device" = "Изтриване на базата данни от това устройство";
|
||||
|
||||
/* server test step */
|
||||
"Delete file" = "Изтрий файл";
|
||||
|
||||
@@ -1347,9 +1386,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Downgrade and open chat" = "Понижи версията и отвори чата";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Download failed" = "Неуспешно изтегляне";
|
||||
|
||||
/* server test step */
|
||||
"Download file" = "Свали файл";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downloading archive" = "Архива се изтегля";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downloading link details" = "Подробности за линка се изтеглят";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Duplicate display name!" = "Дублирано име!";
|
||||
|
||||
@@ -1383,6 +1431,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Enable for all" = "Активиране за всички";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enable in direct chats (BETA)!" = "Активиране в личните чатове (БЕТА)!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enable instant notifications?" = "Активирай незабавни известия?";
|
||||
|
||||
@@ -1497,6 +1548,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Enter Passcode" = "Въведете kодa за достъп";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enter passphrase" = "Въведи парола";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enter passphrase…" = "Въведи парола…";
|
||||
|
||||
@@ -1536,6 +1590,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error adding member(s)" = "Грешка при добавяне на член(ове)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error allowing contact PQ encryption" = "Грешка при разрешаване на PQ криптиране за контакт";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error changing address" = "Грешка при промяна на адреса";
|
||||
|
||||
@@ -1590,6 +1647,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error deleting user profile" = "Грешка при изтриване на потребителския профил";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error downloading the archive" = "Грешка при изтеглянето на архива";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error enabling delivery receipts!" = "Грешка при активирането на потвърждениeто за доставка!";
|
||||
|
||||
@@ -1635,6 +1695,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error saving passphrase to keychain" = "Грешка при запазване на парола в Кeychain";
|
||||
|
||||
/* when migrating */
|
||||
"Error saving settings" = "Грешка при запазване на настройките";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error saving user password" = "Грешка при запазване на потребителска парола";
|
||||
|
||||
@@ -1677,6 +1740,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error updating user privacy" = "Грешка при актуализиране на поверителността на потребителя";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error uploading the archive" = "Грешка при качването на архива";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error verifying passphrase:" = "Грешка при проверката на паролата:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: " = "Грешка: ";
|
||||
|
||||
@@ -1710,6 +1779,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Exported database archive." = "Експортиран архив на базата данни.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Exported file doesn't exist" = "Експортираният файл не съществува";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Exporting database archive…" = "Експортиране на архив на базата данни…";
|
||||
|
||||
@@ -1752,6 +1824,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Filter unread and favorite chats." = "Филтрирайте непрочетените и любимите чатове.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Finalize migration" = "Завърши миграцията";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Finalize migration on another device." = "Завършете миграцията на другото устройство.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Finally, we have them! 🚀" = "Най-накрая ги имаме! 🚀";
|
||||
|
||||
@@ -1935,6 +2013,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"How to use your servers" = "Как да използвате вашите сървъри";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hungarian interface" = "Унгарски интерфейс";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"ICE servers (one per line)" = "ICE сървъри (по един на ред)";
|
||||
|
||||
@@ -1974,6 +2055,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Import database" = "Импортиране на база данни";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Import failed" = "Неуспешно импортиране";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Importing archive" = "Импортиране на архив";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Improved message delivery" = "Подобрена доставка на съобщения";
|
||||
|
||||
@@ -1983,6 +2070,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Improved server configuration" = "Подобрена конфигурация на сървъра";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"In order to continue, chat should be stopped." = "За да продължите, чатът трябва да бъде спрян.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"In reply to" = "В отговор на";
|
||||
|
||||
@@ -2067,6 +2157,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Invalid link" = "Невалиден линк";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Invalid migration confirmation" = "Невалидно потвърждение за мигриране";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Invalid name!" = "Невалидно име!";
|
||||
|
||||
@@ -2331,6 +2424,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Message text" = "Текст на съобщението";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Message too large" = "Съобщението е твърде голямо";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Messages" = "Съобщения";
|
||||
|
||||
@@ -2340,9 +2436,30 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Messages from %@ will be shown!" = "Съобщенията от %@ ще бъдат показани!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate device" = "Мигрирай устройството";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate from another device" = "Мигриране от друго устройство";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate here" = "Мигрирай тук";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate to another device" = "Миграция към друго устройство";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate to another device via QR code." = "Мигрирайте към друго устройство чрез QR код.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrating" = "Мигриране";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrating database archive…" = "Архивът на базата данни се мигрира…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migration complete" = "Миграцията е завършена";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migration error:" = "Грешка при мигриране:";
|
||||
|
||||
@@ -2600,6 +2717,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Open group" = "Отвори група";
|
||||
|
||||
/* authentication reason */
|
||||
"Open migration to another device" = "Отвори миграцията към друго устройство";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Open Settings" = "Отвори настройки";
|
||||
|
||||
@@ -2612,9 +2732,15 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Opening app…" = "Приложението се отваря…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or paste archive link" = "Или постави архивен линк";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or scan QR code" = "Или сканирай QR код";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or securely share this file link" = "Или сигурно споделете този линк към файла";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or show this code" = "Или покажи този код";
|
||||
|
||||
@@ -2666,6 +2792,9 @@
|
||||
/* message decrypt error item */
|
||||
"Permanent decryption error" = "Постоянна грешка при декриптиране";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Picture-in-picture calls" = "Обаждания \"картина в картина\"";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"PING count" = "PING бройка";
|
||||
|
||||
@@ -2684,6 +2813,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Please check yours and your contact preferences." = "Моля, проверете вашите настройки и тези вашия за контакт.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please confirm that network settings are correct for this device." = "Моля, потвърдете, че мрежовите настройки са правилни за това устройство.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please contact developers.\nError: %@" = "Моля, свържете се с разработчиците.\nГрешка: %@";
|
||||
|
||||
@@ -2717,6 +2849,9 @@
|
||||
/* server test error */
|
||||
"Possibly, certificate fingerprint in server address is incorrect" = "Въжможно е пръстовият отпечатък на сертификата в адреса на сървъра да е неправилен";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Post-quantum E2EE" = "Постквантово E2EE";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Preserve the last message draft, with attachments." = "Запазете последната чернова на съобщението с прикачени файлове.";
|
||||
|
||||
@@ -2798,6 +2933,15 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Push notifications" = "Push известия";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Push server" = "Push сървър";
|
||||
|
||||
/* chat item text */
|
||||
"quantum resistant e2e encryption" = "квантово устойчиво e2e криптиране";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Quantum resistant encryption" = "Квантово устойчиво криптиране";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Rate the app" = "Оценете приложението";
|
||||
|
||||
@@ -2933,9 +3077,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat connection request?" = "Изпрати отново заявката за свързване?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat download" = "Повтори изтеглянето";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat import" = "Повтори импортирането";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat join request?" = "Изпрати отново заявката за присъединяване?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat upload" = "Повтори качването";
|
||||
|
||||
/* chat item action */
|
||||
"Reply" = "Отговори";
|
||||
|
||||
@@ -2993,6 +3146,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Run chat" = "Стартиране на чат";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Safer groups" = "По-безопасни групи";
|
||||
|
||||
/* chat item action */
|
||||
"Save" = "Запази";
|
||||
|
||||
@@ -3233,6 +3389,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Set passcode" = "Задай kод за достъп";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set passphrase" = "Задаване на парола";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set passphrase to export" = "Задай парола за експортиране";
|
||||
|
||||
@@ -3278,6 +3437,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Show preview" = "Показване на визуализация";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show QR code" = "Покажи QR код";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show:" = "Покажи:";
|
||||
|
||||
@@ -3338,6 +3500,9 @@
|
||||
/* notification title */
|
||||
"Somebody" = "Някой";
|
||||
|
||||
/* chat item text */
|
||||
"standard end-to-end encryption" = "стандартно криптиране от край до край";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Start chat" = "Започни чат";
|
||||
|
||||
@@ -3353,6 +3518,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Stop" = "Спри";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stop chat" = "Спри чата";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stop chat to enable database actions" = "Спрете чата, за да активирате действията с базата данни";
|
||||
|
||||
@@ -3380,6 +3548,9 @@
|
||||
/* authentication reason */
|
||||
"Stop SimpleX" = "Спри SimpleX";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stopping chat" = "Спиране на чата";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"strike" = "зачеркнат";
|
||||
|
||||
@@ -3530,6 +3701,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Това действие не може да бъде отменено - вашият профил, контакти, съобщения и файлове ще бъдат безвъзвратно загубени.";
|
||||
|
||||
/* E2EE info chat item */
|
||||
"This chat is protected by end-to-end encryption." = "Този чат е защитен чрез криптиране от край до край.";
|
||||
|
||||
/* E2EE info chat item */
|
||||
"This chat is protected by quantum resistant end-to-end encryption." = "Този чат е защитен от квантово устойчиво криптиране от край до край.";
|
||||
|
||||
/* notification title */
|
||||
"this contact" = "този контакт";
|
||||
|
||||
@@ -3722,9 +3899,15 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Upgrade and open chat" = "Актуализирай и отвори чата";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Upload failed" = "Неуспешно качване";
|
||||
|
||||
/* server test step */
|
||||
"Upload file" = "Качи файл";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Uploading archive" = "Архивът се качва";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use .onion hosts" = "Използвай .onion хостове";
|
||||
|
||||
@@ -3755,6 +3938,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Use SimpleX Chat servers?" = "Използвай сървърите на SimpleX Chat?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use the app while in the call." = "Използвайте приложението по време на разговора.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"User profile" = "Потребителски профил";
|
||||
|
||||
@@ -3782,6 +3968,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Verify connections" = "Потвърждение за свързване";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Verify database passphrase" = "Проверете паролата на базата данни";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Verify passphrase" = "Провери паролата";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Verify security code" = "Потвърди кода за сигурност";
|
||||
|
||||
@@ -3860,6 +4052,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"wants to connect to you!" = "иска да се свърже с вас!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Внимание: стартирането на чата на множество устройства не се поддържа и ще доведе до неуспешно изпращане на съобщения";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Предупреждение: Може да загубите някои данни!";
|
||||
|
||||
@@ -3875,6 +4070,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Welcome message" = "Съобщение при посрещане";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Welcome message is too long" = "Съобщението при посрещане е твърде дълго";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"What's new" = "Какво е новото";
|
||||
|
||||
@@ -3971,6 +4169,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"You can enable them later via app Privacy & Security settings." = "Можете да ги активирате по-късно през настройките за \"Поверителност и сигурност\" на приложението.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You can give another try." = "Можете да опитате още веднъж.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You can hide or mute a user profile - swipe it to the right." = "Можете да скриете или заглушите известията за потребителски профил - плъзнете надясно.";
|
||||
|
||||
|
||||
@@ -390,7 +390,7 @@
|
||||
"admin" = "Admin";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Admins can block a member for all." = "Administratoren können für ein Mitglied alle Funktionen blockieren.";
|
||||
"Admins can block a member for all." = "Administratoren können ein Gruppenmitglied für Alle blockieren.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Admins can create the links to join groups." = "Administratoren können Links für den Beitritt zu Gruppen erzeugen.";
|
||||
@@ -853,7 +853,7 @@
|
||||
"Confirm password" = "Passwort bestätigen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm that you remember database passphrase to migrate it." = "Für die Migration bestätigen Sie bitte, dass Sie sich an das Datenbank-Passwort erinnern.";
|
||||
"Confirm that you remember database passphrase to migrate it." = "Bitte bestätigen Sie für die Migration, dass Sie sich an Ihr Datenbank-Passwort erinnern.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm upload" = "Hochladen bestätigen";
|
||||
@@ -2470,7 +2470,7 @@
|
||||
"Migrate to another device" = "Auf ein anderes Gerät migrieren";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate to another device via QR code." = "Über einen QR-Code auf ein anderes Gerät migrieren.";
|
||||
"Migrate to another device via QR code." = "Daten können über einen QR-Code auf ein anderes Gerät migriert werden.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrating" = "Migrieren";
|
||||
@@ -3753,7 +3753,7 @@
|
||||
"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. */
|
||||
"To ask any questions and to receive updates:" = "Um Fragen zu stellen und Aktualisierungen zu erhalten:";
|
||||
"To ask any questions and to receive updates:" = "Um Fragen zu stellen und aktuelle Informationen zu erhalten:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"To connect, your contact can scan QR code or use the link in the app." = "Um eine Verbindung herzustellen, kann Ihr Kontakt den QR-Code scannen oder den Link in der App verwenden.";
|
||||
@@ -4359,7 +4359,7 @@
|
||||
"Your contacts can allow full message deletion." = "Ihre Kontakte können die unwiederbringliche Löschung von Nachrichten erlauben.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your contacts will remain connected." = "Ihre Kontakte bleiben verbunden.";
|
||||
"Your contacts will remain connected." = "Ihre Kontakte bleiben weiterhin verbunden.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Your current chat database will be DELETED and REPLACED with the imported one." = "Ihre aktuelle Chat-Datenbank wird GELÖSCHT und durch die Importierte ERSETZT.";
|
||||
|
||||
@@ -157,6 +157,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"%@ servers" = "Servidores %@";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"%@ uploaded" = "%@ cargado";
|
||||
|
||||
/* notification title */
|
||||
"%@ wants to connect!" = "¡ %@ quiere contactar!";
|
||||
|
||||
@@ -852,6 +855,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm that you remember database passphrase to migrate it." = "Confirme que recuerda la frase secreta de la base de datos para migrarla.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Confirm upload" = "Confirmar subida";
|
||||
|
||||
/* server test step */
|
||||
"Connect" = "Conectar";
|
||||
|
||||
@@ -1050,6 +1056,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Created on %@" = "Creado en %@";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Creating archive link" = "Creando enlace de archivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Creating link…" = "Creando enlace…";
|
||||
|
||||
@@ -1197,6 +1206,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Delete database" = "Eliminar base de datos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Delete database from this device" = "Eliminar base de datos de este dispositivo";
|
||||
|
||||
/* server test step */
|
||||
"Delete file" = "Eliminar archivo";
|
||||
|
||||
@@ -1389,9 +1401,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Downgrade and open chat" = "Degradar y abrir Chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Download failed" = "Error en la descarga";
|
||||
|
||||
/* server test step */
|
||||
"Download file" = "Descargar archivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downloading archive" = "Descargando archivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Downloading link details" = "Descargando detalles del enlace";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Duplicate display name!" = "¡Nombre mostrado duplicado!";
|
||||
|
||||
@@ -1425,6 +1446,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Enable for all" = "Activar para todos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enable in direct chats (BETA)!" = "Activar en chats directos (BETA)!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enable instant notifications?" = "¿Activar notificación instantánea?";
|
||||
|
||||
@@ -1539,6 +1563,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Enter Passcode" = "Introduce Código";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enter passphrase" = "Introducir frase de contraseña";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enter passphrase…" = "Introduce la contraseña…";
|
||||
|
||||
@@ -1578,6 +1605,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error adding member(s)" = "Error al añadir miembro(s)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error allowing contact PQ encryption" = "Error al permitir cifrado PQ al contacto";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error changing address" = "Error al cambiar servidor";
|
||||
|
||||
@@ -1632,6 +1662,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error deleting user profile" = "Error al eliminar perfil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error downloading the archive" = "Error al descargar el archivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error enabling delivery receipts!" = "¡Error al activar confirmaciones de entrega!";
|
||||
|
||||
@@ -1677,6 +1710,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error saving passphrase to keychain" = "Error al guardar contraseña en Keychain";
|
||||
|
||||
/* when migrating */
|
||||
"Error saving settings" = "Error al guardar ajustes";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error saving user password" = "Error al guardar contraseña de usuario";
|
||||
|
||||
@@ -1719,6 +1755,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error updating user privacy" = "Error al actualizar privacidad de usuario";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error uploading the archive" = "Error al subir el archivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error verifying passphrase:" = "Error al verificar la frase de contraseña:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error: " = "Error: ";
|
||||
|
||||
@@ -1752,6 +1794,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Exported database archive." = "Archivo de base de datos exportado.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Exported file doesn't exist" = "El archivo exportado no existe";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Exporting database archive…" = "Exportando base de datos…";
|
||||
|
||||
@@ -1794,6 +1839,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Filter unread and favorite chats." = "Filtra chats no leídos y favoritos.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Finalize migration" = "Finalizar la migración";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Finalize migration on another device." = "Finalizar la migración en otro dispositivo.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Finally, we have them! 🚀" = "¡Por fin los tenemos! 🚀";
|
||||
|
||||
@@ -1977,6 +2028,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"How to use your servers" = "Cómo usar los servidores";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hungarian interface" = "Interfaz húngara";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"ICE servers (one per line)" = "Servidores ICE (uno por línea)";
|
||||
|
||||
@@ -2016,6 +2070,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Import database" = "Importar base de datos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Import failed" = "Error de importación";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Importing archive" = "Importando archivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Improved message delivery" = "Entrega de mensajes mejorada";
|
||||
|
||||
@@ -2025,6 +2085,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Improved server configuration" = "Configuración del servidor mejorada";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"In order to continue, chat should be stopped." = "Para continuar, el chat debe ser interrumpido.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"In reply to" = "En respuesta a";
|
||||
|
||||
@@ -2109,6 +2172,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Invalid link" = "Enlace no válido";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Invalid migration confirmation" = "Confirmación de migración inválida";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Invalid name!" = "¡Nombre no válido!";
|
||||
|
||||
@@ -2373,6 +2439,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Message text" = "Contacto y texto";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Message too large" = "Mensaje demasiado grande";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Messages" = "Mensajes";
|
||||
|
||||
@@ -2382,9 +2451,36 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Messages from %@ will be shown!" = "¡Los mensajes de %@ serán mostrados!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo** con perfecta confidencialidad, repudio y recuperación tras ataques.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Los mensajes, archivos y llamadas están protegidos por **cifrado de extremo a extremo resistente a la computación cuántica** con perfecta confidencialidad, repudio y recuperación tras ataques.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate device" = "Migrar dispositivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate from another device" = "Migrar desde otro dispositivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate here" = "Migrar aquí";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate to another device" = "Migrar hacia otro dispositivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate to another device via QR code." = "Migrar hacia otro dispositivo mediante código QR.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrating" = "Migrando";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrating database archive…" = "Migrando base de datos…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migration complete" = "Migración completada";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migration error:" = "Error de migración:";
|
||||
|
||||
@@ -2642,6 +2738,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Open group" = "Grupo abierto";
|
||||
|
||||
/* authentication reason */
|
||||
"Open migration to another device" = "Abrir la migración hacia otro dispositivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Open Settings" = "Abrir Configuración";
|
||||
|
||||
@@ -2654,9 +2753,15 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Opening app…" = "Iniciando aplicación…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or paste archive link" = "O pegar enlace del archivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or scan QR code" = "O escanear código QR";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or securely share this file link" = "O comparta de forma segura el enlace de este archivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or show this code" = "O mostrar este código";
|
||||
|
||||
@@ -2708,6 +2813,9 @@
|
||||
/* message decrypt error item */
|
||||
"Permanent decryption error" = "Error permanente descifrado";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Picture-in-picture calls" = "Llamadas picture-in-picture";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"PING count" = "Contador PING";
|
||||
|
||||
@@ -2726,6 +2834,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Please check yours and your contact preferences." = "Comprueba tus preferencias y las de tu contacto.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please confirm that network settings are correct for this device." = "Por favor confirme que la configuración de red es correcta para este dispositivo.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please contact developers.\nError: %@" = "Por favor, contacta con los desarrolladores.\nError: %@";
|
||||
|
||||
@@ -2759,6 +2870,9 @@
|
||||
/* server test error */
|
||||
"Possibly, certificate fingerprint in server address is incorrect" = "Posiblemente la huella digital del certificado en la dirección del servidor es incorrecta";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Post-quantum E2EE" = "E2EE postcuántica";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Preserve the last message draft, with attachments." = "Conserva el último borrador del mensaje con los datos adjuntos.";
|
||||
|
||||
@@ -2840,6 +2954,15 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Push notifications" = "Notificaciones automáticas";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Push server" = "Servidor push";
|
||||
|
||||
/* chat item text */
|
||||
"quantum resistant e2e encryption" = "cifrado e2e resistente a la cuántica";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Quantum resistant encryption" = "Cifrado resistente a la tecnología cuántica";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Rate the app" = "Valora la aplicación";
|
||||
|
||||
@@ -2975,9 +3098,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat connection request?" = "¿Repetir solicitud de conexión?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat download" = "Repetir descarga";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat import" = "Repetir importación";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat join request?" = "¿Repetir solicitud de admisión?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat upload" = "Repetir la carga";
|
||||
|
||||
/* chat item action */
|
||||
"Reply" = "Responder";
|
||||
|
||||
@@ -3035,6 +3167,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Run chat" = "Ejecutar chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Safer groups" = "Grupos más seguros";
|
||||
|
||||
/* chat item action */
|
||||
"Save" = "Guardar";
|
||||
|
||||
@@ -3275,6 +3410,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Set passcode" = "Código autodestrucción";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set passphrase" = "Definir frase de contraseña";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set passphrase to export" = "Escribe la contraseña para exportar";
|
||||
|
||||
@@ -3320,6 +3458,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Show preview" = "Mostrar vista previa";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show QR code" = "Mostrar código QR";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show:" = "Mostrar:";
|
||||
|
||||
@@ -3380,6 +3521,9 @@
|
||||
/* notification title */
|
||||
"Somebody" = "Alguien";
|
||||
|
||||
/* chat item text */
|
||||
"standard end-to-end encryption" = "cifrado estándar de extremo a extremo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Start chat" = "Iniciar chat";
|
||||
|
||||
@@ -3395,6 +3539,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Stop" = "Detener";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stop chat" = "Detener el chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stop chat to enable database actions" = "Detén SimpleX para habilitar las acciones sobre la base de datos";
|
||||
|
||||
@@ -3422,6 +3569,9 @@
|
||||
/* authentication reason */
|
||||
"Stop SimpleX" = "Detener SimpleX";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stopping chat" = "Detención del chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"strike" = "tachado";
|
||||
|
||||
@@ -3572,6 +3722,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Esta acción es irreversible. Tu perfil, contactos, mensajes y archivos se perderán irreversiblemente.";
|
||||
|
||||
/* E2EE info chat item */
|
||||
"This chat is protected by end-to-end encryption." = "Este chat está protegido por cifrado de extremo a extremo.";
|
||||
|
||||
/* E2EE info chat item */
|
||||
"This chat is protected by quantum resistant end-to-end encryption." = "Este chat está protegido por un cifrado de extremo a extremo resistente a tecnologías cuánticas.";
|
||||
|
||||
/* notification title */
|
||||
"this contact" = "este contacto";
|
||||
|
||||
@@ -3764,9 +3920,15 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Upgrade and open chat" = "Actualizar y abrir Chat";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Upload failed" = "Error de carga";
|
||||
|
||||
/* server test step */
|
||||
"Upload file" = "Subir archivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Uploading archive" = "Subiendo el archivo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use .onion hosts" = "Usar hosts .onion";
|
||||
|
||||
@@ -3797,6 +3959,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Use SimpleX Chat servers?" = "¿Usar servidores SimpleX Chat?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use the app while in the call." = "Usar la app durante la llamada.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"User profile" = "Perfil de usuario";
|
||||
|
||||
@@ -3824,6 +3989,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Verify connections" = "Verificar conexiones";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Verify database passphrase" = "Verificar la contraseña de la base de datos";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Verify passphrase" = "Verificar frase de contraseña";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Verify security code" = "Comprobar código de seguridad";
|
||||
|
||||
@@ -3902,6 +4073,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"wants to connect to you!" = "¡quiere contactar contigo!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Advertencia: el inicio del chat en varios dispositivos no es compatible y provocará fallos en la entrega de mensajes";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Atención: ¡puedes perder algunos datos!";
|
||||
|
||||
@@ -3917,6 +4091,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Welcome message" = "Mensaje de bienvenida";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Welcome message is too long" = "El mensaje de bienvenida es demasiado largo";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"What's new" = "Novedades";
|
||||
|
||||
@@ -3953,6 +4130,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"You" = "Tú";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You **must not** use the same database on two devices." = "**No debe** usar la misma base de datos en dos dispositivos.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You accepted connection" = "Has aceptado la conexión";
|
||||
|
||||
@@ -4013,6 +4193,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"You can enable them later via app Privacy & Security settings." = "Puedes activarlos más tarde en la configuración de Privacidad y Seguridad.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You can give another try." = "Puede intentarlo de nuevo.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You can hide or mute a user profile - swipe it to the right." = "Puedes ocultar o silenciar un perfil deslizándolo a la derecha.";
|
||||
|
||||
|
||||
@@ -1447,7 +1447,7 @@
|
||||
"Enable for all" = "Activer pour tous";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enable in direct chats (BETA)!" = "Activé dans les conversations directes (BETA) !";
|
||||
"Enable in direct chats (BETA)!" = "Activer dans les conversations directes (BETA) !";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Enable instant notifications?" = "Activer les notifications instantanées ?";
|
||||
@@ -2455,7 +2455,7 @@
|
||||
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Les messages, fichiers et appels sont protégés par un chiffrement **de bout en bout** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Les messages, fichiers et appels sont protégés par un chiffrement **2e2 résistant post-quantique** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction.";
|
||||
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Les messages, fichiers et appels sont protégés par un chiffrement **e2e résistant post-quantique** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate device" = "Transférer l'appareil";
|
||||
@@ -3726,7 +3726,7 @@
|
||||
"This chat is protected by end-to-end encryption." = "Cette discussion est protégée par un chiffrement de bout en bout.";
|
||||
|
||||
/* E2EE info chat item */
|
||||
"This chat is protected by quantum resistant end-to-end encryption." = "Cette discussion est protégée par un chiffrement de bout en bout résistant post-quantique.";
|
||||
"This chat is protected by quantum resistant end-to-end encryption." = "Cette discussion est protégée par un chiffrement de bout en bout résistant aux technologies quantiques.";
|
||||
|
||||
/* notification title */
|
||||
"this contact" = "ce contact";
|
||||
@@ -4074,7 +4074,7 @@
|
||||
"wants to connect to you!" = "veut établir une connexion !";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Attention : démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages";
|
||||
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Attention : vous risquez de perdre des données !";
|
||||
|
||||
@@ -2455,7 +2455,7 @@
|
||||
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "I messaggi, i file e le chiamate sono protetti da **crittografia end-to-end** con perfect forward secrecy, ripudio e recupero da intrusione.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "I messaggi, i file e le chiamate sono protetti da **crittografia e2e resistente al quantistico** con perfect forward secrecy, ripudio e recupero da intrusione.";
|
||||
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "I messaggi, i file e le chiamate sono protetti da **crittografia e2e resistente alla quantistica** con perfect forward secrecy, ripudio e recupero da intrusione.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate device" = "Migra dispositivo";
|
||||
@@ -2958,10 +2958,10 @@
|
||||
"Push server" = "Server push";
|
||||
|
||||
/* chat item text */
|
||||
"quantum resistant e2e encryption" = "crittografia e2e resistente al quantistico";
|
||||
"quantum resistant e2e encryption" = "crittografia e2e resistente alla quantistica";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Quantum resistant encryption" = "Crittografia resistente al quantistico";
|
||||
"Quantum resistant encryption" = "Crittografia resistente alla quantistica";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Rate the app" = "Valuta l'app";
|
||||
@@ -3726,7 +3726,7 @@
|
||||
"This chat is protected by end-to-end encryption." = "Questa chat è protetta da crittografia end-to-end.";
|
||||
|
||||
/* E2EE info chat item */
|
||||
"This chat is protected by quantum resistant end-to-end encryption." = "Questa chat è protetta da crittografia end-to-end resistente al quantistico.";
|
||||
"This chat is protected by quantum resistant end-to-end encryption." = "Questa chat è protetta da crittografia end-to-end resistente alla quantistica.";
|
||||
|
||||
/* notification title */
|
||||
"this contact" = "questo contatto";
|
||||
@@ -4014,7 +4014,7 @@
|
||||
"via relay" = "via relay";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Via secure quantum resistant protocol." = "Tramite protocollo sicuro resistente al quantistico.";
|
||||
"Via secure quantum resistant protocol." = "Tramite protocollo sicuro resistente alla quantistica.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Video call" = "Videochiamata";
|
||||
|
||||
@@ -2730,7 +2730,7 @@
|
||||
"Open" = "Open";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Open chat" = "Gesprekken openen";
|
||||
"Open chat" = "Chat openen";
|
||||
|
||||
/* authentication reason */
|
||||
"Open chat console" = "Chat console openen";
|
||||
|
||||
@@ -4074,7 +4074,7 @@
|
||||
"wants to connect to you!" = "хочет соединиться с Вами!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Внимание: запуск чата на нескольких устройствах не поддерживается и приведет к сбоям доставки сообщений.";
|
||||
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Внимание: запуск чата на нескольких устройствах не поддерживается и приведет к сбоям доставки сообщений";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Предупреждение: Вы можете потерять какие то данные!";
|
||||
|
||||
@@ -137,7 +137,7 @@
|
||||
"%@ and %@ connected" = "%@ ve %@ bağlandı";
|
||||
|
||||
/* copied message info, <sender> at <time> */
|
||||
"%@ at %@:" = "%1$@, %2$@ de";
|
||||
"%@ at %@:" = "1$@, %2$@'de:";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"%@ connected" = "%@ bağlandı";
|
||||
@@ -1605,6 +1605,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Error adding member(s)" = "Üye(ler) eklenirken hata oluştu";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error allowing contact PQ encryption" = "İletişim PQ şifrelemesine izin verirken hata oluştu";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Error changing address" = "Adres değiştirilirken hata oluştu";
|
||||
|
||||
@@ -2025,6 +2028,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"How to use your servers" = "Sunucularını nasıl kullanabilirsin";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Hungarian interface" = "Macarca arayüz";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"ICE servers (one per line)" = "ICE sunucuları (her satıra bir tane)";
|
||||
|
||||
@@ -2445,9 +2451,36 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Messages from %@ will be shown!" = "%@ den gelen mesajlar gösterilecektir!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Mesajlar, dosyalar ve aramalar **uçtan uca şifreleme** ile mükemmel ileri gizlilik, inkar ve izinsiz giriş kurtarma ile korunur.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Mesajlar, dosyalar ve aramalar **kuantum dirençli e2e şifreleme** ile mükemmel ileri gizlilik, inkar ve zorla girme kurtarma ile korunur.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate device" = "Cihazı taşıma";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate from another device" = "Başka bir cihazdan geçiş yapın";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate here" = "Buraya göç edin";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate to another device" = "Başka bir cihaza taşıma";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrate to another device via QR code." = "QR kodu aracılığıyla başka bir cihaza geçiş yapın.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrating" = "Göçmenlik";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migrating database archive…" = "Veritabanı arşivine geçiliyor…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migration complete" = "Geçiş tamamlandı";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Migration error:" = "Geçiş hatası:";
|
||||
|
||||
@@ -2705,6 +2738,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Open group" = "Grubu aç";
|
||||
|
||||
/* authentication reason */
|
||||
"Open migration to another device" = "Başka bir cihaza açık geçiş";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Open Settings" = "Ayarları aç";
|
||||
|
||||
@@ -2717,9 +2753,15 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Opening app…" = "Uygulama açılıyor…";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or paste archive link" = "Veya arşiv bağlantısını yapıştırın";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or scan QR code" = "Veya QR kodu okut";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or securely share this file link" = "Veya bu dosya bağlantısını güvenli bir şekilde paylaşın";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Or show this code" = "Veya bu kodu göster";
|
||||
|
||||
@@ -2771,6 +2813,9 @@
|
||||
/* message decrypt error item */
|
||||
"Permanent decryption error" = "Kalıcı şifre çözümü hatası";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Picture-in-picture calls" = "Resim içinde resim aramaları";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"PING count" = "PING sayısı";
|
||||
|
||||
@@ -2789,6 +2834,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Please check yours and your contact preferences." = "Lütfen sizinkini ve iletişim tercihlerinizi kontrol edin.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please confirm that network settings are correct for this device." = "Lütfen bu cihaz için ağ ayarlarının doğru olduğunu onaylayın.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Please contact developers.\nError: %@" = "Lütfen geliştiricilerle irtibata geçin.\nHata: %@";
|
||||
|
||||
@@ -2822,6 +2870,9 @@
|
||||
/* server test error */
|
||||
"Possibly, certificate fingerprint in server address is incorrect" = "Muhtemelen, sunucu adresindeki parmakizi sertifikası doğru değil";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Post-quantum E2EE" = "Kuantum sonrası E2EE";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Preserve the last message draft, with attachments." = "Son mesaj taslağını ekleriyle birlikte koru.";
|
||||
|
||||
@@ -2903,6 +2954,15 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Push notifications" = "Anında bildirimler";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Push server" = "Push sunucu";
|
||||
|
||||
/* chat item text */
|
||||
"quantum resistant e2e encryption" = "kuantuma dayanıklı e2e şifreleme";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Quantum resistant encryption" = "Kuantum dirençli şifreleme";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Rate the app" = "Uygulamayı değerlendir";
|
||||
|
||||
@@ -2931,7 +2991,7 @@
|
||||
"Read more in our GitHub repository." = "Daha fazlasını GitHub depomuzdan oku.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Receipts are disabled" = "Görüldü devre dışı bırakıldı";
|
||||
"Receipts are disabled" = "Makbuzlar devre dışı bırakıldı";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"received answer…" = "alınan cevap…";
|
||||
@@ -3038,9 +3098,18 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat connection request?" = "Bağlantı isteği tekrarlansın mı?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat download" = "Tekrar indir";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat import" = "İthalatı tekrarla";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat join request?" = "Katılma isteği tekrarlansın mı?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Repeat upload" = "Yüklemeyi tekrarla";
|
||||
|
||||
/* chat item action */
|
||||
"Reply" = "Yanıtla";
|
||||
|
||||
@@ -3098,6 +3167,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Run chat" = "Sohbeti çalıştır";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Safer groups" = "Daha güvenli gruplar";
|
||||
|
||||
/* chat item action */
|
||||
"Save" = "Kaydet";
|
||||
|
||||
@@ -3267,7 +3339,7 @@
|
||||
"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "Görüldü bilgisi, tüm görünür sohbet profillerindeki tüm kişiler için etkinleştirilecektir.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Sending delivery receipts will be enabled for all contacts." = "Görüldü bilgisi bütün kişileri için etkinleştirilecektir.";
|
||||
"Sending delivery receipts will be enabled for all contacts." = "Teslimat makbuzlarının gönderilmesi tüm kişiler için etkinleştirilecektir.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Sending file will be stopped." = "Dosya gönderimi durdurulacaktır.";
|
||||
@@ -3338,6 +3410,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Set passcode" = "Şifre ayarla";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set passphrase" = "Parolayı ayarla";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Set passphrase to export" = "Dışa aktarmak için parola ayarla";
|
||||
|
||||
@@ -3383,6 +3458,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Show preview" = "Ön gösterimi göser";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show QR code" = "QR kodunu göster";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Show:" = "Göster:";
|
||||
|
||||
@@ -3443,6 +3521,9 @@
|
||||
/* notification title */
|
||||
"Somebody" = "Biri";
|
||||
|
||||
/* chat item text */
|
||||
"standard end-to-end encryption" = "standart uçtan uca şifreleme";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Start chat" = "Sohbeti başlat";
|
||||
|
||||
@@ -3458,6 +3539,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Stop" = "Dur";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stop chat" = "Sohbeti kes";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stop chat to enable database actions" = "Veritabanı eylemlerini etkinleştirmek için sohbeti durdur";
|
||||
|
||||
@@ -3485,6 +3569,9 @@
|
||||
/* authentication reason */
|
||||
"Stop SimpleX" = "SimpleX'i durdur";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Stopping chat" = "Sohbeti durdurma";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"strike" = "çizik";
|
||||
|
||||
@@ -3531,7 +3618,7 @@
|
||||
"TCP connection timeout" = "TCP bağlantı zaman aşımı";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"TCP_KEEPCNT" = "TCP_CNTYİTUT";
|
||||
"TCP_KEEPCNT" = "TCP_KEEPCNT";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"TCP_KEEPIDLE" = "TCP_BOŞTAKAL";
|
||||
@@ -3635,6 +3722,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Bu işlem geri alınamaz - profiliniz, kişileriniz, mesajlarınız ve dosyalarınız geri döndürülemez şekilde kaybolacaktır.";
|
||||
|
||||
/* E2EE info chat item */
|
||||
"This chat is protected by end-to-end encryption." = "Bu sohbet uçtan uca şifreleme ile korunmaktadır.";
|
||||
|
||||
/* E2EE info chat item */
|
||||
"This chat is protected by quantum resistant end-to-end encryption." = "Bu sohbet kuantum dirençli uçtan uca şifreleme ile korunmaktadır.";
|
||||
|
||||
/* notification title */
|
||||
"this contact" = "Bu kişi";
|
||||
|
||||
@@ -3827,9 +3920,15 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Upgrade and open chat" = "Yükselt ve sohbeti aç";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Upload failed" = "Yükleme başarısız";
|
||||
|
||||
/* server test step */
|
||||
"Upload file" = "Dosya yükle";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Uploading archive" = "Arşiv yükleme";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use .onion hosts" = ".onion ana bilgisayarlarını kullan";
|
||||
|
||||
@@ -3860,6 +3959,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Use SimpleX Chat servers?" = "SimpleX Chat sunucuları kullanılsın mı?";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use the app while in the call." = "Görüşme sırasında uygulamayı kullanın.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"User profile" = "Kullanıcı profili";
|
||||
|
||||
@@ -3887,6 +3989,12 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Verify connections" = "Bağlantıları doğrula";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Verify database passphrase" = "Veritabanı parolasını doğrulayın";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Verify passphrase" = "Parolayı doğrula";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Verify security code" = "Güvenlik kodunu doğrula";
|
||||
|
||||
@@ -3965,6 +4073,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"wants to connect to you!" = "bağlanmak istiyor!";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Uyarı: birden fazla cihazda sohbet başlatmak desteklenmez ve mesaj teslim hatalarına neden olur";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Warning: you may lose some data!" = "Uyarı: Bazı verileri kaybedebilirsin!";
|
||||
|
||||
@@ -3980,6 +4091,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Welcome message" = "Karşılama mesajı";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Welcome message is too long" = "Hoş geldiniz mesajı çok uzun";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"What's new" = "Neler yeni";
|
||||
|
||||
@@ -4016,6 +4130,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"You" = "Sen";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You **must not** use the same database on two devices." = "Aynı veritabanını iki cihazda **kullanmamalısınız**.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You accepted connection" = "Bağlantıyı onayladın";
|
||||
|
||||
@@ -4076,6 +4193,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"You can enable them later via app Privacy & Security settings." = "Daha sonra uygulamanın Gizlilik ve Güvenlik ayarlarından etkinleştirebilirsiniz.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You can give another try." = "Bir kez daha deneyebilirsiniz.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"You can hide or mute a user profile - swipe it to the right." = "Bir kullanıcı profilini gizleyebilir veya sessize alabilirsiniz - sağa kaydırın.";
|
||||
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
/* Privacy - Face ID Usage Description */
|
||||
"NSFaceIDUsageDescription" = "SimpleX використовує Face ID для локальної автентифікації";
|
||||
|
||||
/* Privacy - Local Network Usage Description */
|
||||
"NSLocalNetworkUsageDescription" = "SimpleX використовує доступ до локальної мережі, щоб дозволити користувачеві користуватися профілем чату через десктопну програму в тій же мережі.";
|
||||
|
||||
/* Privacy - Microphone Usage Description */
|
||||
"NSMicrophoneUsageDescription" = "SimpleX потребує доступу до мікрофона для аудіо та відео дзвінків, а також для запису голосових повідомлень.";
|
||||
|
||||
|
||||
@@ -8,12 +8,14 @@ plugins {
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion(34)
|
||||
compileSdk = 34
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "chat.simplex.app"
|
||||
minSdkVersion(28)
|
||||
targetSdkVersion(33)
|
||||
namespace = "chat.simplex.app"
|
||||
minSdk = 28
|
||||
//noinspection OldTargetApi
|
||||
targetSdk = 33
|
||||
// !!!
|
||||
// skip version code after release to F-Droid, as it uses two version codes
|
||||
versionCode = (extra["android.version_code"] as String).toInt()
|
||||
@@ -46,12 +48,7 @@ android {
|
||||
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
|
||||
}
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
freeCompilerArgs += "-opt-in=kotlinx.coroutines.DelicateCoroutinesApi"
|
||||
freeCompilerArgs += "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi"
|
||||
freeCompilerArgs += "-opt-in=androidx.compose.ui.text.ExperimentalTextApi"
|
||||
@@ -71,18 +68,20 @@ android {
|
||||
isMinifyEnabled = false
|
||||
}
|
||||
}
|
||||
packagingOptions {
|
||||
buildFeatures {
|
||||
buildConfig = true
|
||||
}
|
||||
packaging {
|
||||
resources {
|
||||
excludes += "/META-INF/{AL2.0,LGPL2.1}"
|
||||
}
|
||||
jniLibs.useLegacyPackaging = rootProject.extra["compression.level"] as Int != 0
|
||||
}
|
||||
android.sourceSets["main"].assets.setSrcDirs(listOf("../common/src/commonMain/resources/assets"))
|
||||
val isRelease = gradle.startParameter.taskNames.find { it.toLowerCase().contains("release") } != null
|
||||
val isBundle = gradle.startParameter.taskNames.find { it.toLowerCase().contains("bundle") } != null
|
||||
// if (isRelease) {
|
||||
val isRelease = gradle.startParameter.taskNames.find { it.lowercase().contains("release") } != null
|
||||
val isBundle = gradle.startParameter.taskNames.find { it.lowercase().contains("bundle") } != null
|
||||
// Comma separated list of languages that will be included in the apk
|
||||
android.defaultConfig.resConfigs(
|
||||
android.defaultConfig.resourceConfigurations += listOf(
|
||||
"en",
|
||||
"ar",
|
||||
"bg",
|
||||
@@ -104,7 +103,7 @@ android {
|
||||
"uk",
|
||||
"zh-rCN"
|
||||
)
|
||||
// }
|
||||
ndkVersion = "23.1.7779620"
|
||||
if (isBundle) {
|
||||
defaultConfig.ndk.abiFilters("arm64-v8a", "armeabi-v7a")
|
||||
} else {
|
||||
@@ -125,41 +124,44 @@ android {
|
||||
|
||||
dependencies {
|
||||
implementation(project(":common"))
|
||||
implementation("androidx.core:core-ktx:1.7.0")
|
||||
implementation("androidx.core:core-ktx:1.12.0")
|
||||
//implementation("androidx.compose.ui:ui:${rootProject.extra["compose.version"] as String}")
|
||||
//implementation("androidx.compose.material:material:$compose_version")
|
||||
//implementation("androidx.compose.ui:ui-tooling-preview:$compose_version")
|
||||
implementation("androidx.appcompat:appcompat:1.5.1")
|
||||
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.1")
|
||||
implementation("androidx.lifecycle:lifecycle-process:2.4.1")
|
||||
implementation("androidx.activity:activity-compose:1.5.0")
|
||||
val work_version = "2.7.1"
|
||||
implementation("androidx.work:work-runtime-ktx:$work_version")
|
||||
implementation("androidx.work:work-multiprocess:$work_version")
|
||||
implementation("androidx.appcompat:appcompat:1.6.1")
|
||||
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
|
||||
implementation("androidx.lifecycle:lifecycle-process:2.7.0")
|
||||
implementation("androidx.activity:activity-compose:1.8.2")
|
||||
val workVersion = "2.9.0"
|
||||
implementation("androidx.work:work-runtime-ktx:$workVersion")
|
||||
implementation("androidx.work:work-multiprocess:$workVersion")
|
||||
|
||||
implementation("com.jakewharton:process-phoenix:2.1.2")
|
||||
implementation("com.jakewharton:process-phoenix:2.2.0")
|
||||
|
||||
//Camera Permission
|
||||
implementation("com.google.accompanist:accompanist-permissions:0.23.0")
|
||||
|
||||
//implementation("androidx.compose.material:material-icons-extended:$compose_version")
|
||||
//implementation("androidx.compose.ui:ui-util:$compose_version")
|
||||
|
||||
testImplementation("junit:junit:4.13.2")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.3")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.5")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
|
||||
//androidTestImplementation("androidx.compose.ui:ui-test-junit4:$compose_version")
|
||||
debugImplementation("androidx.compose.ui:ui-tooling:1.4.3")
|
||||
debugImplementation("androidx.compose.ui:ui-tooling:1.6.4")
|
||||
}
|
||||
|
||||
tasks {
|
||||
val compressApk by creating {
|
||||
doLast {
|
||||
val isRelease = gradle.startParameter.taskNames.find { it.toLowerCase().contains("release") } != null
|
||||
val isRelease = gradle.startParameter.taskNames.find { it.lowercase().contains("release") } != null
|
||||
val buildType: String = if (isRelease) "release" else "debug"
|
||||
val javaHome = System.getProperties()["java.home"] ?: org.gradle.internal.jvm.Jvm.current().javaHome
|
||||
val sdkDir = android.sdkDirectory.absolutePath
|
||||
var keyAlias = ""
|
||||
var keyPassword = ""
|
||||
var storeFile = ""
|
||||
var storePassword = ""
|
||||
val keyAlias: String
|
||||
val keyPassword: String
|
||||
val storeFile: String
|
||||
val storePassword: String
|
||||
if (project.properties["android.injected.signing.key.alias"] != null) {
|
||||
keyAlias = project.properties["android.injected.signing.key.alias"] as String
|
||||
keyPassword = project.properties["android.injected.signing.key.password"] as String
|
||||
@@ -184,16 +186,16 @@ tasks {
|
||||
}
|
||||
exec {
|
||||
workingDir("../../../scripts/android")
|
||||
setEnvironment(mapOf("JAVA_HOME" to "$javaHome"))
|
||||
environment = mapOf("JAVA_HOME" to "$javaHome")
|
||||
commandLine = listOf(
|
||||
"./compress-and-sign-apk.sh",
|
||||
"${rootProject.extra["compression.level"]}",
|
||||
"$outputDir",
|
||||
"$sdkDir",
|
||||
"$storeFile",
|
||||
"$storePassword",
|
||||
"$keyAlias",
|
||||
"$keyPassword"
|
||||
sdkDir,
|
||||
storeFile,
|
||||
storePassword,
|
||||
keyAlias,
|
||||
keyPassword
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ import android.content.*
|
||||
import android.content.pm.PackageManager
|
||||
import android.net.Uri
|
||||
import android.os.*
|
||||
import android.os.SystemClock
|
||||
import android.provider.Settings
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material.*
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.app.*
|
||||
import android.app.TaskStackBuilder
|
||||
import android.content.*
|
||||
import android.content.pm.PackageManager
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.BitmapFactory
|
||||
import android.hardware.display.DisplayManager
|
||||
import android.media.AudioAttributes
|
||||
@@ -218,7 +219,7 @@ object NtfManager {
|
||||
.setGroup(MessageGroup)
|
||||
.setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_CHILDREN)
|
||||
.setSmallIcon(R.drawable.ntf_icon)
|
||||
.setLargeIcon(null)
|
||||
.setLargeIcon(null as Bitmap?)
|
||||
.setColor(0x88FFFF)
|
||||
.setAutoCancel(true)
|
||||
.setVibrate(null)
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package chat.simplex.app.views.call
|
||||
|
||||
import android.Manifest
|
||||
import android.app.*
|
||||
import android.content.*
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.res.Configuration
|
||||
import android.graphics.Rect
|
||||
import android.os.*
|
||||
@@ -28,6 +30,7 @@ import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import chat.simplex.app.*
|
||||
import chat.simplex.app.R
|
||||
@@ -36,10 +39,12 @@ import chat.simplex.app.model.NtfManager
|
||||
import chat.simplex.app.model.NtfManager.AcceptCallAction
|
||||
import chat.simplex.common.model.*
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.platform.chatModel
|
||||
import chat.simplex.common.ui.theme.*
|
||||
import chat.simplex.common.views.call.*
|
||||
import chat.simplex.common.views.helpers.*
|
||||
import chat.simplex.res.MR
|
||||
import com.google.accompanist.permissions.rememberMultiplePermissionsState
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.datetime.Clock
|
||||
@@ -109,9 +114,20 @@ class CallActivity: ComponentActivity(), ServiceConnection {
|
||||
m.callCommand.add(WCallCommand.Layout(layoutType))
|
||||
}
|
||||
|
||||
private fun hasGrantedPermissions(): Boolean {
|
||||
val grantedAudio = ContextCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED
|
||||
val grantedCamera = !callSupportsVideo() || ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
|
||||
return grantedAudio && grantedCamera
|
||||
}
|
||||
|
||||
override fun onBackPressed() {
|
||||
if (isOnLockScreenNow()) {
|
||||
super.onBackPressed()
|
||||
} else if (!hasGrantedPermissions() && !callSupportsVideo()) {
|
||||
val call = m.activeCall.value
|
||||
if (call != null) {
|
||||
withBGApi { chatModel.callManager.endCall(call) }
|
||||
}
|
||||
} else {
|
||||
m.activeCallViewIsCollapsed.value = true
|
||||
}
|
||||
@@ -223,8 +239,21 @@ fun CallActivityView() {
|
||||
}
|
||||
Box(Modifier.background(Color.Black)) {
|
||||
if (call != null) {
|
||||
val permissionsState = rememberMultiplePermissionsState(
|
||||
permissions = if (callSupportsVideo()) {
|
||||
listOf(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
|
||||
} else {
|
||||
listOf(Manifest.permission.RECORD_AUDIO)
|
||||
}
|
||||
)
|
||||
if (permissionsState.allPermissionsGranted) {
|
||||
ActiveCallView()
|
||||
} else {
|
||||
CallPermissionsView(remember { m.activeCallViewIsCollapsed }.value, callSupportsVideo()) {
|
||||
withBGApi { chatModel.callManager.endCall(call) }
|
||||
}
|
||||
}
|
||||
val view = LocalView.current
|
||||
ActiveCallView()
|
||||
if (callSupportsVideo()) {
|
||||
val scope = rememberCoroutineScope()
|
||||
LaunchedEffect(Unit) {
|
||||
@@ -252,6 +281,9 @@ fun CallActivityView() {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!m.activeCallViewIsCollapsed.value) {
|
||||
AlertManager.shared.showInView()
|
||||
}
|
||||
}
|
||||
LaunchedEffect(call == null) {
|
||||
if (call != null) {
|
||||
|
||||
@@ -47,6 +47,9 @@ buildscript {
|
||||
classpath(kotlin("gradle-plugin", version = rootProject.extra["kotlin.version"] as String))
|
||||
classpath("dev.icerock.moko:resources-generator:0.23.0")
|
||||
|
||||
// Workaround gradle sync issue: https://github.com/gmazzo/gradle-buildconfig-plugin/issues/137#issuecomment-1935739759
|
||||
classpath("com.squareup:kotlinpoet:1.16.0")
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
}
|
||||
@@ -80,6 +83,30 @@ plugins {
|
||||
id("org.jetbrains.kotlin.plugin.serialization") apply false
|
||||
}
|
||||
|
||||
// https://raymondctc.medium.com/configuring-your-sourcecompatibility-targetcompatibility-and-kotlinoptions-jvmtarget-all-at-once-66bf2198145f
|
||||
val jvmVersion: Provider<String> = providers.gradleProperty("kotlin.jvm.target")
|
||||
|
||||
configure(subprojects) {
|
||||
// Apply compileOptions to subprojects
|
||||
plugins.withType<com.android.build.gradle.BasePlugin>().configureEach {
|
||||
extensions.findByType<com.android.build.gradle.BaseExtension>()?.apply {
|
||||
jvmVersion.map { JavaVersion.toVersion(it) }.orNull?.let {
|
||||
compileOptions {
|
||||
sourceCompatibility = it
|
||||
targetCompatibility = it
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Apply kotlinOptions.jvmTarget to subprojects
|
||||
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
|
||||
kotlinOptions {
|
||||
if (jvmVersion.isPresent) jvmTarget = jvmVersion.get()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("clean", Delete::class) {
|
||||
delete(rootProject.buildDir)
|
||||
}
|
||||
|
||||
@@ -4,17 +4,16 @@ plugins {
|
||||
id("com.android.library")
|
||||
id("org.jetbrains.kotlin.plugin.serialization")
|
||||
id("dev.icerock.mobile.multiplatform-resources")
|
||||
id("com.github.gmazzo.buildconfig") version "4.0.4"
|
||||
id("com.github.gmazzo.buildconfig") version "5.3.5"
|
||||
}
|
||||
|
||||
group = "chat.simplex"
|
||||
version = extra["android.version_name"] as String
|
||||
|
||||
kotlin {
|
||||
android()
|
||||
jvm("desktop") {
|
||||
jvmToolchain(11)
|
||||
}
|
||||
androidTarget()
|
||||
jvm("desktop")
|
||||
applyDefaultHierarchyTemplate()
|
||||
sourceSets {
|
||||
all {
|
||||
languageSettings {
|
||||
@@ -35,20 +34,20 @@ kotlin {
|
||||
api(compose.runtime)
|
||||
api(compose.foundation)
|
||||
api(compose.material)
|
||||
api("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2")
|
||||
api("org.jetbrains.kotlinx:kotlinx-datetime:0.3.2")
|
||||
api("com.russhwolf:multiplatform-settings:1.0.0")
|
||||
api("com.charleskorn.kaml:kaml:0.43.0")
|
||||
api("dev.icerock.moko:resources-compose:0.23.0")
|
||||
api("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
|
||||
api("org.jetbrains.kotlinx:kotlinx-datetime:0.5.0")
|
||||
api("com.russhwolf:multiplatform-settings:1.1.1")
|
||||
api("com.charleskorn.kaml:kaml:0.58.0")
|
||||
api("org.jetbrains.compose.ui:ui-text:${rootProject.extra["compose.version"] as String}")
|
||||
implementation("org.jetbrains.compose.components:components-animatedimage:${rootProject.extra["compose.version"] as String}")
|
||||
//Barcode
|
||||
api("org.boofcv:boofcv-core:0.40.1")
|
||||
api("org.boofcv:boofcv-core:1.1.3")
|
||||
implementation("com.godaddy.android.colorpicker:compose-color-picker-jvm:0.7.0")
|
||||
// Link Previews
|
||||
implementation("org.jsoup:jsoup:1.13.1")
|
||||
implementation("org.jsoup:jsoup:1.17.2")
|
||||
// Resources
|
||||
implementation("dev.icerock.moko:resources:0.23.0")
|
||||
api("dev.icerock.moko:resources:0.23.0")
|
||||
api("dev.icerock.moko:resources-compose:0.23.0")
|
||||
}
|
||||
}
|
||||
val commonTest by getting {
|
||||
@@ -57,47 +56,50 @@ kotlin {
|
||||
}
|
||||
}
|
||||
val androidMain by getting {
|
||||
kotlin.srcDir("build/generated/moko/androidMain/src")
|
||||
dependencies {
|
||||
implementation("androidx.activity:activity-compose:1.5.0")
|
||||
val work_version = "2.7.1"
|
||||
implementation("androidx.work:work-runtime-ktx:$work_version")
|
||||
implementation("com.google.accompanist:accompanist-insets:0.23.0")
|
||||
implementation("dev.icerock.moko:resources:0.23.0")
|
||||
implementation("androidx.activity:activity-compose:1.8.2")
|
||||
val workVersion = "2.9.0"
|
||||
implementation("androidx.work:work-runtime-ktx:$workVersion")
|
||||
implementation("com.google.accompanist:accompanist-insets:0.30.1")
|
||||
|
||||
// Video support
|
||||
implementation("com.google.android.exoplayer:exoplayer:2.17.1")
|
||||
implementation("com.google.android.exoplayer:exoplayer:2.19.1")
|
||||
|
||||
// Biometric authentication
|
||||
implementation("androidx.biometric:biometric:1.2.0-alpha04")
|
||||
implementation("androidx.biometric:biometric:1.2.0-alpha05")
|
||||
|
||||
//Barcode
|
||||
implementation("org.boofcv:boofcv-android:0.40.1")
|
||||
implementation("org.boofcv:boofcv-android:1.1.3")
|
||||
|
||||
//Camera Permission
|
||||
implementation("com.google.accompanist:accompanist-permissions:0.23.0")
|
||||
implementation("com.google.accompanist:accompanist-permissions:0.34.0")
|
||||
|
||||
implementation("androidx.webkit:webkit:1.4.0")
|
||||
implementation("androidx.webkit:webkit:1.10.0")
|
||||
|
||||
// GIFs support
|
||||
implementation("io.coil-kt:coil-compose:2.1.0")
|
||||
implementation("io.coil-kt:coil-gif:2.1.0")
|
||||
implementation("io.coil-kt:coil-compose:2.6.0")
|
||||
implementation("io.coil-kt:coil-gif:2.6.0")
|
||||
|
||||
implementation("com.jakewharton:process-phoenix:2.1.2")
|
||||
implementation("com.jakewharton:process-phoenix:2.2.0")
|
||||
|
||||
val camerax_version = "1.1.0-beta01"
|
||||
implementation("androidx.camera:camera-core:${camerax_version}")
|
||||
implementation("androidx.camera:camera-camera2:${camerax_version}")
|
||||
implementation("androidx.camera:camera-lifecycle:${camerax_version}")
|
||||
implementation("androidx.camera:camera-view:${camerax_version}")
|
||||
val cameraXVersion = "1.3.2"
|
||||
implementation("androidx.camera:camera-core:${cameraXVersion}")
|
||||
implementation("androidx.camera:camera-camera2:${cameraXVersion}")
|
||||
implementation("androidx.camera:camera-lifecycle:${cameraXVersion}")
|
||||
implementation("androidx.camera:camera-view:${cameraXVersion}")
|
||||
|
||||
// Calls lifecycle listener
|
||||
implementation("androidx.lifecycle:lifecycle-process:2.4.1")
|
||||
}
|
||||
}
|
||||
val desktopMain by getting {
|
||||
dependencies {
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.7.1")
|
||||
implementation("com.github.Dansoftowner:jSystemThemeDetector:3.6")
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.8.0")
|
||||
implementation("com.github.Dansoftowner:jSystemThemeDetector:3.8")
|
||||
implementation("com.sshtools:two-slices:0.9.0-SNAPSHOT")
|
||||
implementation("org.slf4j:slf4j-simple:2.0.7")
|
||||
implementation("uk.co.caprica:vlcj:4.7.3")
|
||||
implementation("org.slf4j:slf4j-simple:2.0.12")
|
||||
implementation("uk.co.caprica:vlcj:4.8.2")
|
||||
implementation("com.github.NanoHttpd.nanohttpd:nanohttpd:efb2ebf85a")
|
||||
implementation("com.github.NanoHttpd.nanohttpd:nanohttpd-websocket:efb2ebf85a")
|
||||
}
|
||||
@@ -107,23 +109,21 @@ kotlin {
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion(34)
|
||||
namespace = "chat.simplex.common"
|
||||
compileSdk = 34
|
||||
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
|
||||
defaultConfig {
|
||||
minSdkVersion(28)
|
||||
targetSdkVersion(33)
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
minSdk = 28
|
||||
}
|
||||
testOptions.targetSdk = 33
|
||||
lint.targetSdk = 33
|
||||
val isAndroid = gradle.startParameter.taskNames.find {
|
||||
val lower = it.toLowerCase()
|
||||
val lower = it.lowercase()
|
||||
lower.contains("release") || lower.startsWith("assemble") || lower.startsWith("install")
|
||||
} != null
|
||||
if (isAndroid) {
|
||||
// This is not needed on Android but can't be moved to desktopMain because MR lib don't support this.
|
||||
// No other ways to exclude a file work but it's large and should be excluded
|
||||
// No other ways to exclude a file work, but it's large and should be excluded
|
||||
kotlin.sourceSets["commonMain"].resources.exclude("/MR/fonts/NotoColorEmoji-Regular.ttf")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package chat.simplex.common.helpers
|
||||
|
||||
import android.content.*
|
||||
import android.net.Uri
|
||||
import android.provider.Settings
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.views.helpers.AlertManager
|
||||
import chat.simplex.common.views.helpers.generalGetString
|
||||
import chat.simplex.res.MR
|
||||
|
||||
fun Context.openAppSettingsInSystem() {
|
||||
Intent().apply {
|
||||
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
|
||||
data = Uri.parse("package:${androidAppContext.packageName}")
|
||||
try {
|
||||
startActivity(this)
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
Log.e(TAG, e.stackTraceToString())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.showAllowPermissionInSettingsAlert(action: () -> Unit = ::openAppSettingsInSystem) {
|
||||
AlertManager.shared.showAlertMsg(
|
||||
title = generalGetString(MR.strings.permissions_grant_in_settings),
|
||||
text = generalGetString(MR.strings.permissions_find_in_settings_and_grant),
|
||||
confirmText = generalGetString(MR.strings.permissions_open_settings),
|
||||
onConfirm = action,
|
||||
)
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package chat.simplex.common.views.call
|
||||
|
||||
import SectionSpacer
|
||||
import SectionView
|
||||
import android.Manifest
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
@@ -24,17 +26,18 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.painter.Painter
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalLifecycleOwner
|
||||
import dev.icerock.moko.resources.compose.painterResource
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.compose.ui.viewinterop.AndroidView
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.LifecycleEventObserver
|
||||
import androidx.lifecycle.*
|
||||
import androidx.webkit.WebViewAssetLoader
|
||||
import androidx.webkit.WebViewClientCompat
|
||||
import chat.simplex.common.helpers.showAllowPermissionInSettingsAlert
|
||||
import chat.simplex.common.model.*
|
||||
import chat.simplex.common.ui.theme.*
|
||||
import chat.simplex.common.model.ChatModel
|
||||
@@ -42,13 +45,12 @@ import chat.simplex.common.model.Contact
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.views.helpers.*
|
||||
import chat.simplex.res.MR
|
||||
import com.google.accompanist.permissions.rememberMultiplePermissionsState
|
||||
import com.google.accompanist.permissions.*
|
||||
import dev.icerock.moko.resources.StringResource
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.filterNotNull
|
||||
import kotlinx.datetime.Clock
|
||||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.encodeToString
|
||||
|
||||
// Should be destroy()'ed and set as null when call is ended. Otherwise, it will be a leak
|
||||
@@ -209,7 +211,6 @@ actual fun ActiveCallView() {
|
||||
ActiveCallOverlay(call, chatModel, audioViaBluetooth)
|
||||
}
|
||||
}
|
||||
|
||||
val context = LocalContext.current
|
||||
DisposableEffect(Unit) {
|
||||
val activity = context as? Activity ?: return@DisposableEffect onDispose {}
|
||||
@@ -510,34 +511,138 @@ private fun DisabledBackgroundCallsButton() {
|
||||
// }
|
||||
//}
|
||||
|
||||
@Composable
|
||||
fun CallPermissionsView(pipActive: Boolean, hasVideo: Boolean, cancel: () -> Unit) {
|
||||
val audioPermission = rememberPermissionState(Manifest.permission.RECORD_AUDIO)
|
||||
val cameraPermission = rememberPermissionState(Manifest.permission.CAMERA)
|
||||
val permissionsState = rememberMultiplePermissionsState(
|
||||
permissions = if (hasVideo) {
|
||||
listOf(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
|
||||
} else {
|
||||
listOf(Manifest.permission.RECORD_AUDIO)
|
||||
}
|
||||
)
|
||||
val context = LocalContext.current
|
||||
val buttonEnabled = remember { mutableStateOf(true) }
|
||||
LaunchedEffect(Unit) {
|
||||
if (!pipActive) {
|
||||
permissionsState.launchMultiplePermissionRequestWithFallback(buttonEnabled, context::showAllowPermissionInSettingsAlert)
|
||||
}
|
||||
}
|
||||
|
||||
if (pipActive) {
|
||||
Column(Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.SpaceEvenly) {
|
||||
if (audioPermission.status is PermissionStatus.Denied) {
|
||||
Icon(
|
||||
painterResource(MR.images.ic_call_500),
|
||||
stringResource(MR.strings.permissions_record_audio),
|
||||
Modifier.size(24.dp),
|
||||
tint = Color(0xFFFFFFD8)
|
||||
)
|
||||
}
|
||||
if (hasVideo && cameraPermission.status is PermissionStatus.Denied) {
|
||||
Icon(
|
||||
painterResource(MR.images.ic_videocam),
|
||||
stringResource(MR.strings.permissions_camera),
|
||||
Modifier.size(24.dp),
|
||||
tint = Color(0xFFFFFFD8)
|
||||
)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ColumnWithScrollBar(Modifier.fillMaxSize()) {
|
||||
Spacer(Modifier.height(AppBarHeight))
|
||||
|
||||
AppBarTitle(stringResource(MR.strings.permissions_required))
|
||||
Spacer(Modifier.weight(1f))
|
||||
|
||||
val onClick = {
|
||||
if (permissionsState.shouldShowRationale) {
|
||||
context.showAllowPermissionInSettingsAlert()
|
||||
} else {
|
||||
permissionsState.launchMultiplePermissionRequestWithFallback(buttonEnabled, context::showAllowPermissionInSettingsAlert)
|
||||
}
|
||||
}
|
||||
Text(stringResource(MR.strings.permissions_grant), Modifier.fillMaxWidth().padding(horizontal = DEFAULT_PADDING), textAlign = TextAlign.Center, color = Color(0xFFFFFFD8))
|
||||
SectionSpacer()
|
||||
SectionView {
|
||||
Box(Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {
|
||||
val text = if (hasVideo && audioPermission.status is PermissionStatus.Denied && cameraPermission.status is PermissionStatus.Denied) {
|
||||
stringResource(MR.strings.permissions_camera_and_record_audio)
|
||||
} else if (audioPermission.status is PermissionStatus.Denied) {
|
||||
stringResource(MR.strings.permissions_record_audio)
|
||||
} else if (hasVideo && cameraPermission.status is PermissionStatus.Denied) {
|
||||
stringResource(MR.strings.permissions_camera)
|
||||
} else ""
|
||||
GrantPermissionButton(text, buttonEnabled.value, onClick)
|
||||
}
|
||||
}
|
||||
|
||||
Spacer(Modifier.weight(1f))
|
||||
Box(Modifier.fillMaxWidth().padding(bottom = if (hasVideo) 0.dp else DEFAULT_BOTTOM_PADDING), contentAlignment = Alignment.Center) {
|
||||
SimpleButtonFrame(cancel, Modifier.height(64.dp)) {
|
||||
Text(stringResource(MR.strings.call_service_notification_end_call), fontSize = 20.sp, color = Color(0xFFFFFFD8))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun GrantPermissionButton(text: String, enabled: Boolean, onClick: () -> Unit) {
|
||||
Row(
|
||||
Modifier
|
||||
.clickable(enabled = enabled, onClick = onClick)
|
||||
.heightIn(min = 30.dp)
|
||||
.background(WarningOrange.copy(0.3f), RoundedCornerShape(50)),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Text(text, Modifier.padding(horizontal = DEFAULT_PADDING, vertical = DEFAULT_PADDING_HALF), fontSize = 20.sp, color = WarningOrange)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The idea of this function is to ask system to show permission dialog and to see if it's really doing it.
|
||||
* Otherwise, show alert with a button that opens settings for manual permission granting
|
||||
* */
|
||||
private fun MultiplePermissionsState.launchMultiplePermissionRequestWithFallback(buttonEnabled: MutableState<Boolean>, fallback: () -> Unit) {
|
||||
buttonEnabled.value = false
|
||||
val lifecycleOwner = ProcessLifecycleOwner.get().lifecycle
|
||||
var useFallback = true
|
||||
val observer = LifecycleEventObserver { _, event ->
|
||||
if (event == Lifecycle.Event.ON_PAUSE) {
|
||||
useFallback = false
|
||||
buttonEnabled.value = true
|
||||
}
|
||||
}
|
||||
lifecycleOwner.addObserver(observer)
|
||||
withBGApi {
|
||||
delay(2000)
|
||||
if (useFallback && chatModel.activeCall.value != null) {
|
||||
fallback()
|
||||
}
|
||||
buttonEnabled.value = true
|
||||
}.invokeOnCompletion {
|
||||
// Main thread only
|
||||
withApi {
|
||||
lifecycleOwner.removeObserver(observer)
|
||||
}
|
||||
}
|
||||
launchMultiplePermissionRequest()
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun WebRTCView(callCommand: SnapshotStateList<WCallCommand>, onResponse: (WVAPIMessage) -> Unit) {
|
||||
val webView = remember { mutableStateOf<WebView?>(null) }
|
||||
val permissionsState = rememberMultiplePermissionsState(
|
||||
permissions = listOf(
|
||||
Manifest.permission.CAMERA,
|
||||
Manifest.permission.RECORD_AUDIO,
|
||||
Manifest.permission.MODIFY_AUDIO_SETTINGS,
|
||||
Manifest.permission.INTERNET
|
||||
)
|
||||
)
|
||||
fun processCommand(wv: WebView, cmd: WCallCommand) {
|
||||
val apiCall = WVAPICall(command = cmd)
|
||||
wv.evaluateJavascript("processCommand(${json.encodeToString(apiCall)})", null)
|
||||
}
|
||||
val lifecycleOwner = LocalLifecycleOwner.current
|
||||
DisposableEffect(lifecycleOwner) {
|
||||
val observer = LifecycleEventObserver { _, event ->
|
||||
if (event == Lifecycle.Event.ON_RESUME || event == Lifecycle.Event.ON_START) {
|
||||
permissionsState.launchMultiplePermissionRequest()
|
||||
}
|
||||
}
|
||||
lifecycleOwner.lifecycle.addObserver(observer)
|
||||
DisposableEffect(Unit) {
|
||||
onDispose {
|
||||
lifecycleOwner.lifecycle.removeObserver(observer)
|
||||
// val wv = webView.value
|
||||
// if (wv != null) processCommand(wv, WCallCommand.End)
|
||||
// webView.value?.destroy()
|
||||
// val wv = webView.value
|
||||
// if (wv != null) processCommand(wv, WCallCommand.End)
|
||||
// webView.value?.destroy()
|
||||
webView.value = null
|
||||
}
|
||||
}
|
||||
@@ -560,44 +665,42 @@ fun WebRTCView(callCommand: SnapshotStateList<WCallCommand>, onResponse: (WVAPIM
|
||||
.addPathHandler("/assets/www/", WebViewAssetLoader.AssetsPathHandler(LocalContext.current))
|
||||
.build()
|
||||
|
||||
if (permissionsState.allPermissionsGranted) {
|
||||
Box(Modifier.fillMaxSize()) {
|
||||
AndroidView(
|
||||
factory = { AndroidViewContext ->
|
||||
(staticWebView ?: WebView(androidAppContext)).apply {
|
||||
layoutParams = ViewGroup.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
)
|
||||
this.webChromeClient = object: WebChromeClient() {
|
||||
override fun onPermissionRequest(request: PermissionRequest) {
|
||||
if (request.origin.toString().startsWith("file:/")) {
|
||||
request.grant(request.resources)
|
||||
} else {
|
||||
Log.d(TAG, "Permission request from webview denied.")
|
||||
request.deny()
|
||||
}
|
||||
Box(Modifier.fillMaxSize()) {
|
||||
AndroidView(
|
||||
factory = { AndroidViewContext ->
|
||||
(staticWebView ?: WebView(androidAppContext)).apply {
|
||||
layoutParams = ViewGroup.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
)
|
||||
this.webChromeClient = object: WebChromeClient() {
|
||||
override fun onPermissionRequest(request: PermissionRequest) {
|
||||
if (request.origin.toString().startsWith("file:/")) {
|
||||
request.grant(request.resources)
|
||||
} else {
|
||||
Log.d(TAG, "Permission request from webview denied.")
|
||||
request.deny()
|
||||
}
|
||||
}
|
||||
this.webViewClient = LocalContentWebViewClient(webView, assetLoader)
|
||||
this.clearHistory()
|
||||
this.clearCache(true)
|
||||
this.addJavascriptInterface(WebRTCInterface(onResponse), "WebRTCInterface")
|
||||
val webViewSettings = this.settings
|
||||
webViewSettings.allowFileAccess = true
|
||||
webViewSettings.allowContentAccess = true
|
||||
webViewSettings.javaScriptEnabled = true
|
||||
webViewSettings.mediaPlaybackRequiresUserGesture = false
|
||||
webViewSettings.cacheMode = WebSettings.LOAD_NO_CACHE
|
||||
if (staticWebView == null) {
|
||||
this.loadUrl("file:android_asset/www/android/call.html")
|
||||
} else {
|
||||
webView.value = this
|
||||
}
|
||||
}
|
||||
this.webViewClient = LocalContentWebViewClient(webView, assetLoader)
|
||||
this.clearHistory()
|
||||
this.clearCache(true)
|
||||
this.addJavascriptInterface(WebRTCInterface(onResponse), "WebRTCInterface")
|
||||
val webViewSettings = this.settings
|
||||
webViewSettings.allowFileAccess = true
|
||||
webViewSettings.allowContentAccess = true
|
||||
webViewSettings.javaScriptEnabled = true
|
||||
webViewSettings.mediaPlaybackRequiresUserGesture = false
|
||||
webViewSettings.cacheMode = WebSettings.LOAD_NO_CACHE
|
||||
if (staticWebView == null) {
|
||||
this.loadUrl("file:android_asset/www/android/call.html")
|
||||
} else {
|
||||
webView.value = this
|
||||
}
|
||||
}
|
||||
) { /* WebView */ }
|
||||
}
|
||||
}
|
||||
) { /* WebView */ }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ import androidx.compose.ui.graphics.ImageBitmap
|
||||
import androidx.compose.ui.graphics.painter.BitmapPainter
|
||||
import androidx.compose.ui.graphics.painter.Painter
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import chat.simplex.common.helpers.toUri
|
||||
import chat.simplex.common.model.CIFile
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.views.helpers.ModalManager
|
||||
@@ -15,7 +14,6 @@ import coil.compose.rememberAsyncImagePainter
|
||||
import coil.decode.GifDecoder
|
||||
import coil.decode.ImageDecoderDecoder
|
||||
import coil.request.ImageRequest
|
||||
import java.net.URI
|
||||
|
||||
@Composable
|
||||
actual fun SimpleAndAnimatedImageView(
|
||||
@@ -43,6 +41,7 @@ actual fun SimpleAndAnimatedImageView(
|
||||
}
|
||||
|
||||
private val imageLoader = ImageLoader.Builder(androidAppContext)
|
||||
.networkObserverEnabled(false)
|
||||
.components {
|
||||
if (SDK_INT >= 28) {
|
||||
add(ImageDecoderDecoder.Factory())
|
||||
|
||||
@@ -15,6 +15,7 @@ import chat.simplex.common.platform.FileChooserLauncher
|
||||
import chat.simplex.common.platform.saveImage
|
||||
import chat.simplex.common.views.helpers.*
|
||||
import chat.simplex.res.MR
|
||||
import com.google.accompanist.permissions.PermissionStatus
|
||||
import com.google.accompanist.permissions.rememberPermissionState
|
||||
import dev.icerock.moko.resources.compose.painterResource
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
@@ -30,7 +31,7 @@ actual fun SaveContentItemAction(cItem: ChatItem, saveFileLauncher: FileChooserL
|
||||
ItemAction(stringResource(MR.strings.save_verb), painterResource(if (cItem.file?.fileSource?.cryptoArgs == null) MR.images.ic_download else MR.images.ic_lock_open_right), onClick = {
|
||||
when (cItem.content.msgContent) {
|
||||
is MsgContent.MCImage -> {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || writePermissionState.hasPermission) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || writePermissionState.status == PermissionStatus.Granted) {
|
||||
saveImage(cItem.file)
|
||||
} else {
|
||||
writePermissionState.launchPermissionRequest()
|
||||
|
||||
@@ -3,7 +3,7 @@ package chat.simplex.common.views.chat.item
|
||||
import android.os.Build
|
||||
import android.view.View
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.*
|
||||
import androidx.compose.ui.graphics.painter.BitmapPainter
|
||||
@@ -11,8 +11,8 @@ import androidx.compose.ui.layout.ContentScale
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.viewinterop.AndroidView
|
||||
import androidx.core.view.isVisible
|
||||
import chat.simplex.common.helpers.toUri
|
||||
import chat.simplex.common.platform.VideoPlayer
|
||||
import chat.simplex.common.platform.androidAppContext
|
||||
import chat.simplex.res.MR
|
||||
import coil.ImageLoader
|
||||
import coil.compose.rememberAsyncImagePainter
|
||||
@@ -23,21 +23,11 @@ import coil.size.Size
|
||||
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout
|
||||
import com.google.android.exoplayer2.ui.StyledPlayerView
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import java.net.URI
|
||||
|
||||
@Composable
|
||||
actual fun FullScreenImageView(modifier: Modifier, data: ByteArray, imageBitmap: ImageBitmap) {
|
||||
// I'm making a new instance of imageLoader here because if I use one instance in multiple places
|
||||
// I'm using a new private instance of imageLoader here because if I use one instance in multiple places
|
||||
// after end of composition here a GIF from the first instance will be paused automatically which isn't what I want
|
||||
val imageLoader = ImageLoader.Builder(LocalContext.current)
|
||||
.components {
|
||||
if (Build.VERSION.SDK_INT >= 28) {
|
||||
add(ImageDecoderDecoder.Factory())
|
||||
} else {
|
||||
add(GifDecoder.Factory())
|
||||
}
|
||||
}
|
||||
.build()
|
||||
Image(
|
||||
rememberAsyncImagePainter(
|
||||
ImageRequest.Builder(LocalContext.current).data(data = data).size(Size.ORIGINAL).build(),
|
||||
@@ -73,3 +63,14 @@ actual fun FullScreenVideoView(player: VideoPlayer, modifier: Modifier, close: (
|
||||
modifier
|
||||
)
|
||||
}
|
||||
|
||||
private val imageLoader = ImageLoader.Builder(androidAppContext)
|
||||
.networkObserverEnabled(false)
|
||||
.components {
|
||||
if (Build.VERSION.SDK_INT >= 28) {
|
||||
add(ImageDecoderDecoder.Factory())
|
||||
} else {
|
||||
add(GifDecoder.Factory())
|
||||
}
|
||||
}
|
||||
.build()
|
||||
|
||||
@@ -11,6 +11,7 @@ import androidx.camera.view.PreviewView
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clipToBounds
|
||||
@@ -27,6 +28,7 @@ import chat.simplex.common.platform.TAG
|
||||
import chat.simplex.common.ui.theme.DEFAULT_PADDING_HALF
|
||||
import chat.simplex.common.views.helpers.*
|
||||
import chat.simplex.res.MR
|
||||
import com.google.accompanist.permissions.PermissionStatus
|
||||
import com.google.accompanist.permissions.rememberPermissionState
|
||||
import com.google.common.util.concurrent.ListenableFuture
|
||||
import dev.icerock.moko.resources.compose.painterResource
|
||||
@@ -65,7 +67,7 @@ actual fun QRCodeScanner(
|
||||
.widthIn(max = 400.dp)
|
||||
.aspectRatio(1f)
|
||||
val showScanner = remember { showQRCodeScanner }
|
||||
if (showScanner.value && cameraPermissionState.hasPermission) {
|
||||
if (showScanner.value && cameraPermissionState.status == PermissionStatus.Granted) {
|
||||
AndroidView(
|
||||
factory = { AndroidViewContext ->
|
||||
PreviewView(AndroidViewContext).apply {
|
||||
@@ -126,20 +128,22 @@ actual fun QRCodeScanner(
|
||||
disabledBackgroundColor = MaterialTheme.colors.background.mixWith(MaterialTheme.colors.onBackground, 0.9f),
|
||||
disabledContentColor = MaterialTheme.colors.primary,
|
||||
)
|
||||
var permissionRequested by rememberSaveable { mutableStateOf(false) }
|
||||
when {
|
||||
!cameraPermissionState.hasPermission && !cameraPermissionState.permissionRequested && showScanner.value -> {
|
||||
cameraPermissionState.status is PermissionStatus.Denied && !permissionRequested && showScanner.value -> {
|
||||
LaunchedEffect(Unit) {
|
||||
permissionRequested = true
|
||||
cameraPermissionState.launchPermissionRequest()
|
||||
}
|
||||
}
|
||||
!cameraPermissionState.hasPermission -> {
|
||||
cameraPermissionState.status is PermissionStatus.Denied -> {
|
||||
Button({ cameraPermissionState.launchPermissionRequest() }, modifier = modifier, colors = buttonColors) {
|
||||
Icon(painterResource(MR.images.ic_camera_enhance), null)
|
||||
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
|
||||
Text(stringResource(MR.strings.enable_camera_access))
|
||||
}
|
||||
}
|
||||
cameraPermissionState.hasPermission -> {
|
||||
cameraPermissionState.status == PermissionStatus.Granted -> {
|
||||
Button({ showQRCodeScanner.value = true }, modifier = modifier, colors = buttonColors) {
|
||||
Icon(painterResource(MR.images.ic_qr_code), null)
|
||||
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
|
||||
|
||||
@@ -5,14 +5,15 @@ import android.os.Build
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import chat.simplex.common.platform.ntfManager
|
||||
import com.google.accompanist.permissions.PermissionStatus
|
||||
import com.google.accompanist.permissions.rememberPermissionState
|
||||
|
||||
@Composable
|
||||
actual fun SetNotificationsModeAdditions() {
|
||||
if (Build.VERSION.SDK_INT >= 33) {
|
||||
val notificationsPermissionState = rememberPermissionState(Manifest.permission.POST_NOTIFICATIONS)
|
||||
LaunchedEffect(notificationsPermissionState.hasPermission) {
|
||||
if (notificationsPermissionState.hasPermission) {
|
||||
LaunchedEffect(notificationsPermissionState.status == PermissionStatus.Granted) {
|
||||
if (notificationsPermissionState.status == PermissionStatus.Granted) {
|
||||
ntfManager.androidCreateNtfChannelsMaybeShowAlert()
|
||||
} else {
|
||||
notificationsPermissionState.launchPermissionRequest()
|
||||
|
||||
@@ -1753,6 +1753,8 @@ object ChatController {
|
||||
chatModel.removeChat(rhId, r.mergedContact.id)
|
||||
}
|
||||
}
|
||||
// ContactsSubscribed, ContactsDisconnected and ContactSubSummary are only used in CLI,
|
||||
// They have to be used here for remote desktop to process these status updates.
|
||||
is CR.ContactsSubscribed -> updateContactsStatus(r.contactRefs, NetworkStatus.Connected())
|
||||
is CR.ContactsDisconnected -> updateContactsStatus(r.contactRefs, NetworkStatus.Disconnected())
|
||||
is CR.ContactSubSummary -> {
|
||||
@@ -5011,8 +5013,8 @@ sealed class AgentErrorType {
|
||||
is BROKER -> "BROKER ${brokerErr.string}"
|
||||
is AGENT -> "AGENT ${agentErr.string}"
|
||||
is INTERNAL -> "INTERNAL $internalErr"
|
||||
is INACTIVE -> "INACTIVE"
|
||||
is CRITICAL -> "CRITICAL $offerRestart $criticalErr"
|
||||
is INACTIVE -> "INACTIVE"
|
||||
}
|
||||
@Serializable @SerialName("CMD") class CMD(val cmdErr: CommandErrorType): AgentErrorType()
|
||||
@Serializable @SerialName("CONN") class CONN(val connErr: ConnectionErrorType): AgentErrorType()
|
||||
@@ -5023,8 +5025,8 @@ sealed class AgentErrorType {
|
||||
@Serializable @SerialName("BROKER") class BROKER(val brokerAddress: String, val brokerErr: BrokerErrorType): AgentErrorType()
|
||||
@Serializable @SerialName("AGENT") class AGENT(val agentErr: SMPAgentError): AgentErrorType()
|
||||
@Serializable @SerialName("INTERNAL") class INTERNAL(val internalErr: String): AgentErrorType()
|
||||
@Serializable @SerialName("INACTIVE") object INACTIVE: AgentErrorType()
|
||||
@Serializable @SerialName("CRITICAL") data class CRITICAL(val offerRestart: Boolean, val criticalErr: String): AgentErrorType()
|
||||
@Serializable @SerialName("INACTIVE") object INACTIVE: AgentErrorType()
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@@ -5123,11 +5125,13 @@ sealed class SMPTransportError {
|
||||
is BadBlock -> "badBlock"
|
||||
is LargeMsg -> "largeMsg"
|
||||
is BadSession -> "badSession"
|
||||
is NoServerAuth -> "noServerAuth"
|
||||
is Handshake -> "handshake ${handshakeErr.string}"
|
||||
}
|
||||
@Serializable @SerialName("badBlock") class BadBlock: SMPTransportError()
|
||||
@Serializable @SerialName("largeMsg") class LargeMsg: SMPTransportError()
|
||||
@Serializable @SerialName("badSession") class BadSession: SMPTransportError()
|
||||
@Serializable @SerialName("noServerAuth") class NoServerAuth: SMPTransportError()
|
||||
@Serializable @SerialName("handshake") class Handshake(val handshakeErr: SMPHandshakeError): SMPTransportError()
|
||||
}
|
||||
|
||||
@@ -5137,10 +5141,12 @@ sealed class SMPHandshakeError {
|
||||
is PARSE -> "PARSE"
|
||||
is VERSION -> "VERSION"
|
||||
is IDENTITY -> "IDENTITY"
|
||||
is BAD_AUTH -> "BAD_AUTH"
|
||||
}
|
||||
@Serializable @SerialName("PARSE") class PARSE: SMPHandshakeError()
|
||||
@Serializable @SerialName("VERSION") class VERSION: SMPHandshakeError()
|
||||
@Serializable @SerialName("IDENTITY") class IDENTITY: SMPHandshakeError()
|
||||
@Serializable @SerialName("BAD_AUTH") class BAD_AUTH: SMPHandshakeError()
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@@ -5175,6 +5181,8 @@ sealed class XFTPErrorType {
|
||||
is NO_FILE -> "NO_FILE"
|
||||
is HAS_FILE -> "HAS_FILE"
|
||||
is FILE_IO -> "FILE_IO"
|
||||
is TIMEOUT -> "TIMEOUT"
|
||||
is REDIRECT -> "REDIRECT"
|
||||
is INTERNAL -> "INTERNAL"
|
||||
}
|
||||
@Serializable @SerialName("BLOCK") object BLOCK: XFTPErrorType()
|
||||
@@ -5188,6 +5196,8 @@ sealed class XFTPErrorType {
|
||||
@Serializable @SerialName("NO_FILE") object NO_FILE: XFTPErrorType()
|
||||
@Serializable @SerialName("HAS_FILE") object HAS_FILE: XFTPErrorType()
|
||||
@Serializable @SerialName("FILE_IO") object FILE_IO: XFTPErrorType()
|
||||
@Serializable @SerialName("TIMEOUT") object TIMEOUT: XFTPErrorType()
|
||||
@Serializable @SerialName("REDIRECT") class REDIRECT(val redirectError: String): XFTPErrorType()
|
||||
@Serializable @SerialName("INTERNAL") object INTERNAL: XFTPErrorType()
|
||||
}
|
||||
|
||||
@@ -5197,6 +5207,8 @@ sealed class RCErrorType {
|
||||
is INTERNAL -> "INTERNAL $internalErr"
|
||||
is IDENTITY -> "IDENTITY"
|
||||
is NO_LOCAL_ADDRESS -> "NO_LOCAL_ADDRESS"
|
||||
is NEW_CONTROLLER -> "NEW_CONTROLLER"
|
||||
is NOT_DISCOVERED -> "NOT_DISCOVERED"
|
||||
is TLS_START_FAILED -> "TLS_START_FAILED"
|
||||
is EXCEPTION -> "EXCEPTION $EXCEPTION"
|
||||
is CTRL_AUTH -> "CTRL_AUTH"
|
||||
@@ -5211,6 +5223,8 @@ sealed class RCErrorType {
|
||||
@Serializable @SerialName("internal") data class INTERNAL(val internalErr: String): RCErrorType()
|
||||
@Serializable @SerialName("identity") object IDENTITY: RCErrorType()
|
||||
@Serializable @SerialName("noLocalAddress") object NO_LOCAL_ADDRESS: RCErrorType()
|
||||
@Serializable @SerialName("newController") object NEW_CONTROLLER: RCErrorType()
|
||||
@Serializable @SerialName("notDiscovered") object NOT_DISCOVERED: RCErrorType()
|
||||
@Serializable @SerialName("tlsStartFailed") object TLS_START_FAILED: RCErrorType()
|
||||
@Serializable @SerialName("exception") data class EXCEPTION(val exception: String): RCErrorType()
|
||||
@Serializable @SerialName("ctrlAuth") object CTRL_AUTH: RCErrorType()
|
||||
@@ -5269,28 +5283,39 @@ sealed class RemoteCtrlError {
|
||||
is BadState -> "badState"
|
||||
is Busy -> "busy"
|
||||
is Timeout -> "timeout"
|
||||
is NoKnownControllers -> "noKnownControllers"
|
||||
is BadController -> "badController"
|
||||
is Disconnected -> "disconnected"
|
||||
is BadInvitation -> "badInvitation"
|
||||
is BadVersion -> "badVersion"
|
||||
is HTTP2Error -> "http2Error"
|
||||
is ProtocolError -> "protocolError"
|
||||
}
|
||||
val localizedString: String get() = when (this) {
|
||||
is Inactive -> generalGetString(MR.strings.remote_ctrl_error_inactive)
|
||||
is BadState -> generalGetString(MR.strings.remote_ctrl_error_bad_state)
|
||||
is Busy -> generalGetString(MR.strings.remote_ctrl_error_busy)
|
||||
is Timeout -> generalGetString(MR.strings.remote_ctrl_error_timeout)
|
||||
is NoKnownControllers -> "no known controllers"
|
||||
is BadController -> "bad controller"
|
||||
is Disconnected -> generalGetString(MR.strings.remote_ctrl_error_disconnected)
|
||||
is BadInvitation -> generalGetString(MR.strings.remote_ctrl_error_bad_invitation)
|
||||
is BadVersion -> generalGetString(MR.strings.remote_ctrl_error_bad_version)
|
||||
is HTTP2Error -> "HTTP2 error"
|
||||
is ProtocolError -> "protocol error"
|
||||
}
|
||||
|
||||
@Serializable @SerialName("inactive") object Inactive: RemoteCtrlError()
|
||||
@Serializable @SerialName("badState") object BadState: RemoteCtrlError()
|
||||
@Serializable @SerialName("busy") object Busy: RemoteCtrlError()
|
||||
@Serializable @SerialName("timeout") object Timeout: RemoteCtrlError()
|
||||
@Serializable @SerialName("noKnownControllers") object NoKnownControllers: RemoteCtrlError()
|
||||
@Serializable @SerialName("badController") object BadController: RemoteCtrlError()
|
||||
@Serializable @SerialName("disconnected") class Disconnected(val remoteCtrlId: Long, val reason: String): RemoteCtrlError()
|
||||
@Serializable @SerialName("badInvitation") object BadInvitation: RemoteCtrlError()
|
||||
@Serializable @SerialName("badVersion") data class BadVersion(val appVersion: String): RemoteCtrlError()
|
||||
//@Serializable @SerialName("protocolError") data class ProtocolError(val protocolError: RemoteProtocolError): RemoteCtrlError()
|
||||
@Serializable @SerialName("hTTP2Error") data class HTTP2Error(val http2Error: String): RemoteCtrlError()
|
||||
@Serializable @SerialName("protocolError") object ProtocolError: RemoteCtrlError()
|
||||
}
|
||||
|
||||
enum class NotificationsMode() {
|
||||
|
||||
@@ -109,6 +109,7 @@ private fun fileReady(file: CIFile, filePath: String) =
|
||||
@Composable
|
||||
expect fun rememberFileChooserLauncher(getContent: Boolean, rememberedValue: Any? = null, onResult: (URI?) -> Unit): FileChooserLauncher
|
||||
|
||||
@Composable
|
||||
expect fun rememberFileChooserMultipleLauncher(onResult: (List<URI>) -> Unit): FileChooserMultipleLauncher
|
||||
|
||||
expect class FileChooserLauncher() {
|
||||
|
||||
@@ -260,6 +260,7 @@ val CurrentColors: MutableStateFlow<ThemeManager.ActiveTheme> = MutableStateFlow
|
||||
@Composable
|
||||
fun isInDarkTheme(): Boolean = !CurrentColors.collectAsState().value.colors.isLight
|
||||
|
||||
@Composable
|
||||
expect fun isSystemInDarkTheme(): Boolean
|
||||
|
||||
fun reactOnDarkThemeChanges(isDark: Boolean) {
|
||||
|
||||
@@ -1392,11 +1392,12 @@ private fun providerForGallery(
|
||||
return null
|
||||
}
|
||||
|
||||
var initialIndex = Int.MAX_VALUE / 2
|
||||
// Pager has a bug with overflowing when total pages is around Int.MAX_VALUE. Using smaller value
|
||||
var initialIndex = 10000 / 2
|
||||
var initialChatId = cItemId
|
||||
return object: ImageGalleryProvider {
|
||||
override val initialIndex: Int = initialIndex
|
||||
override val totalMediaSize = mutableStateOf(Int.MAX_VALUE)
|
||||
override val totalMediaSize = mutableStateOf(10000)
|
||||
override fun getMedia(index: Int): ProviderMedia? {
|
||||
val internalIndex = initialIndex - index
|
||||
val item = item(internalIndex, initialChatId)?.second ?: return null
|
||||
|
||||
@@ -190,6 +190,7 @@ class AlertManager {
|
||||
fun showAlertMsg(
|
||||
title: String, text: String? = null,
|
||||
confirmText: String = generalGetString(MR.strings.ok),
|
||||
onConfirm: (() -> Unit)? = null,
|
||||
hostDevice: Pair<Long?, String>? = null,
|
||||
shareText: Boolean? = null
|
||||
) {
|
||||
@@ -220,6 +221,7 @@ class AlertManager {
|
||||
}
|
||||
TextButton(
|
||||
onClick = {
|
||||
onConfirm?.invoke()
|
||||
hideAlert()
|
||||
},
|
||||
Modifier.focusRequester(focusRequester)
|
||||
@@ -257,8 +259,9 @@ class AlertManager {
|
||||
title: StringResource,
|
||||
text: StringResource? = null,
|
||||
confirmText: StringResource = MR.strings.ok,
|
||||
onConfirm: (() -> Unit)? = null,
|
||||
hostDevice: Pair<Long?, String>? = null,
|
||||
) = showAlertMsg(generalGetString(title), if (text != null) generalGetString(text) else null, generalGetString(confirmText), hostDevice)
|
||||
) = showAlertMsg(generalGetString(title), if (text != null) generalGetString(text) else null, generalGetString(confirmText), onConfirm, hostDevice)
|
||||
|
||||
@Composable
|
||||
fun showInView() {
|
||||
|
||||
@@ -38,9 +38,7 @@ import chat.simplex.common.views.usersettings.*
|
||||
import chat.simplex.res.MR
|
||||
import dev.icerock.moko.resources.compose.painterResource
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.runBlocking
|
||||
|
||||
@Composable
|
||||
fun ConnectMobileView() {
|
||||
@@ -269,12 +267,20 @@ fun AddingMobileDevice(showTitle: Boolean, staleQrCode: MutableState<Boolean>, c
|
||||
var cachedR by remember { mutableStateOf<CR.RemoteHostStarted?>(null) }
|
||||
val customAddress = rememberSaveable { mutableStateOf<RemoteCtrlAddress?>(null) }
|
||||
val customPort = rememberSaveable { mutableStateOf<Int?>(null) }
|
||||
var userChangedAddress by rememberSaveable { mutableStateOf(false) }
|
||||
var userChangedPort by rememberSaveable { mutableStateOf(false) }
|
||||
val startRemoteHost = suspend {
|
||||
if (customAddress.value != cachedR.address && cachedR != null) {
|
||||
userChangedAddress = true
|
||||
}
|
||||
if (customPort.value != cachedR.port && cachedR != null) {
|
||||
userChangedPort = true
|
||||
}
|
||||
val r = chatModel.controller.startRemoteHost(
|
||||
rhId = null,
|
||||
multicast = controller.appPrefs.offerRemoteMulticast.get(),
|
||||
address = if (customAddress.value?.address != cachedR.address?.address) customAddress.value else cachedR.rh?.bindAddress_,
|
||||
port = if (customPort.value != cachedR.port) customPort.value else cachedR.rh?.bindPort_
|
||||
address = if (customAddress.value != null && userChangedAddress) customAddress.value else cachedR.rh?.bindAddress_,
|
||||
port = if (customPort.value != null && userChangedPort) customPort.value else cachedR.rh?.bindPort_
|
||||
)
|
||||
if (r != null) {
|
||||
cachedR = r
|
||||
@@ -343,12 +349,20 @@ private fun showConnectMobileDevice(rh: RemoteHostInfo, connecting: MutableState
|
||||
var cachedR by remember { mutableStateOf<CR.RemoteHostStarted?>(null) }
|
||||
val customAddress = rememberSaveable { mutableStateOf<RemoteCtrlAddress?>(null) }
|
||||
val customPort = rememberSaveable { mutableStateOf<Int?>(null) }
|
||||
var userChangedAddress by rememberSaveable { mutableStateOf(false) }
|
||||
var userChangedPort by rememberSaveable { mutableStateOf(false) }
|
||||
val startRemoteHost = suspend {
|
||||
if (customAddress.value != cachedR.address && cachedR != null) {
|
||||
userChangedAddress = true
|
||||
}
|
||||
if (customPort.value != cachedR.port && cachedR != null) {
|
||||
userChangedPort = true
|
||||
}
|
||||
val r = chatModel.controller.startRemoteHost(
|
||||
rhId = rh.remoteHostId,
|
||||
multicast = controller.appPrefs.offerRemoteMulticast.get(),
|
||||
address = if (customAddress.value?.address != cachedR.address?.address) customAddress.value else cachedR.rh?.bindAddress_ ?: rh.bindAddress_,
|
||||
port = if (customPort.value != cachedR.port) customPort.value else cachedR.rh?.bindPort_ ?: rh.bindPort_
|
||||
address = if (customAddress.value != null && userChangedAddress) customAddress.value else cachedR.rh?.bindAddress_ ?: rh.bindAddress_,
|
||||
port = if (customPort.value != null && userChangedPort) customPort.value else cachedR.rh?.bindPort_ ?: rh.bindPort_
|
||||
)
|
||||
if (r != null) {
|
||||
cachedR = r
|
||||
|
||||
@@ -490,7 +490,7 @@
|
||||
<string name="custom_time_unit_hours">ساعات</string>
|
||||
<string name="edit_history">السجل</string>
|
||||
<string name="image_will_be_received_when_contact_completes_uploading">سيتم استلام الصورة عند اكتمال تحميل جهة اتصالك.</string>
|
||||
<string name="if_you_cannot_meet_in_person_show_QR_in_video_call_or_via_another_channel"><![CDATA[إذا لم تتمكن من الالتقاء شخصيًا، <b>اعرض رمز الاستجابة السريعة في مكالمة الفيديو</b>، أو شارك الرابط.]]></string>
|
||||
<string name="if_you_cannot_meet_in_person_show_QR_in_video_call_or_via_another_channel"><![CDATA[إذا لم تتمكن من الالتقاء شخصيًا، <b>اعرض رمز QR في مكالمة الفيديو</b>، أو شارك الرابط.]]></string>
|
||||
<string name="install_simplex_chat_for_terminal">ثبّت SimpleX Chat لطرفية</string>
|
||||
<string name="network_disable_socks_info">إذا قمت بالتأكيد، فستتمكن خوادم المراسلة من رؤية عنوان IP الخاص بك ومزود الخدمة الخاص بك - أي الخوادم التي تتصل بها.</string>
|
||||
<string name="hide_dev_options">إخفاء:</string>
|
||||
@@ -520,7 +520,7 @@
|
||||
<string name="image_will_be_received_when_contact_is_online">سيتم استلام الصورة عندما تكون جهة اتصالك متصلة بالإنترنت، يرجى الانتظار أو التحقق لاحقًا!</string>
|
||||
<string name="image_saved">حُفظت الصورة في المعرض</string>
|
||||
<string name="gallery_image_button">صورة</string>
|
||||
<string name="if_you_cant_meet_in_person">إذا لم تتمكن من الالتقاء شخصيًا، اعرض رمز الاستجابة السريعة في مكالمة الفيديو، أو شارك الرابط.</string>
|
||||
<string name="if_you_cant_meet_in_person">إذا لم تتمكن من الالتقاء شخصيًا، اعرض رمز QR في مكالمة الفيديو، أو شارك الرابط.</string>
|
||||
<string name="settings_section_title_incognito">وضع التخفي</string>
|
||||
<string name="incognito">التخفي</string>
|
||||
<string name="import_theme_error">خطأ في استيراد السمة</string>
|
||||
@@ -957,7 +957,7 @@
|
||||
<string name="connect_via_link_or_qr_from_clipboard_or_in_person">(امسح أو ألصق من الحافظة)</string>
|
||||
<string name="network_option_seconds_label">ثانية</string>
|
||||
<string name="sender_may_have_deleted_the_connection_request">قد يكون المرسل قد ألغى طلب الاتصال</string>
|
||||
<string name="scan_QR_code">مسح رمز الاستجابة السريعة</string>
|
||||
<string name="scan_QR_code">مسح رمز QR</string>
|
||||
<string name="send_us_an_email">أرسل لنا بريداً</string>
|
||||
<string name="scan_code_from_contacts_app">مسح رمز الأمان من تطبيق جهة الاتصال</string>
|
||||
<string name="share_invitation_link">مشاركة رابط ذو استخدام واحد</string>
|
||||
@@ -1643,4 +1643,6 @@
|
||||
<string name="migrate_from_device_archiving_database">جارِ أرشفة قاعدة البيانات</string>
|
||||
<string name="migrate_from_device_all_data_will_be_uploaded">سيتم تعمية جميع جهات الاتصال والمحادثات والملفات الخاصة بك بشكل آمن وتحميلها في أجزاء إلى مُرحلات XFTP التي ضبطت.</string>
|
||||
<string name="migrate_to_device_apply_onion">طبّق</string>
|
||||
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>يُرجى ملاحظة</b>: استخدام نفس قاعدة البيانات على جهازين سيؤدي إلى كسر فك تعمية الرسائل من اتصالاتك، كحماية أمنية.]]></string>
|
||||
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>تحذير</b>: سيتم حذف الأرشيف.]]></string>
|
||||
</resources>
|
||||
@@ -211,6 +211,7 @@
|
||||
<string name="notification_preview_new_message">new message</string>
|
||||
<string name="notification_new_contact_request">New contact request</string>
|
||||
<string name="notification_contact_connected">Connected</string>
|
||||
<string name="error_showing_desktop_notification">Error showing notification, contact developers.</string>
|
||||
|
||||
<!-- local authentication notice - SimpleXAPI.kt -->
|
||||
<string name="la_notice_title_simplex_lock">SimpleX Lock</string>
|
||||
@@ -813,6 +814,14 @@
|
||||
<!-- CallView -->
|
||||
<string name="unable_to_open_browser_title">Error opening browser</string>
|
||||
<string name="unable_to_open_browser_desc">The default web browser is required for calls. Please configure the default browser in the system, and share more information with the developers.</string>
|
||||
<string name="permissions_required">Grant permissions</string>
|
||||
<string name="permissions_record_audio">Microphone</string>
|
||||
<string name="permissions_camera">Camera</string>
|
||||
<string name="permissions_camera_and_record_audio">Camera and microphone</string>
|
||||
<string name="permissions_grant">Grant permission(s) to make calls</string>
|
||||
<string name="permissions_grant_in_settings">Grant in settings</string>
|
||||
<string name="permissions_find_in_settings_and_grant">Find this permission in Android settings and grant it manually.</string>
|
||||
<string name="permissions_open_settings">Open settings</string>
|
||||
|
||||
<!-- SimpleXInfo -->
|
||||
<string name="next_generation_of_private_messaging">The next generation of private messaging</string>
|
||||
|
||||
@@ -1628,7 +1628,7 @@
|
||||
<string name="profile_update_event_updated_profile">актуализиран профил</string>
|
||||
<string name="note_folder_local_display_name">Лични бележки</string>
|
||||
<string name="message_too_large">Съобщението е твърде голямо</string>
|
||||
<string name="welcome_message_is_too_long">Съобщението при посрещане е твърде голямо</string>
|
||||
<string name="welcome_message_is_too_long">Съобщението при посрещане е твърде дълго</string>
|
||||
<string name="database_migration_in_progress">Извършва се миграция на базата данни.
|
||||
\nМоже да отнеме няколко минути.</string>
|
||||
<string name="call_service_notification_audio_call">Аудио разговор</string>
|
||||
@@ -1636,4 +1636,80 @@
|
||||
<string name="unable_to_open_browser_desc">За разговори е необходим уеб браузър по подразбиране. Моля, конфигурирайте браузъра по подразбиране в системните настройки и споделете повече информация с разработчиците.</string>
|
||||
<string name="call_service_notification_video_call">Видео разговор</string>
|
||||
<string name="call_service_notification_end_call">Край на разговора</string>
|
||||
<string name="e2ee_info_pq"><![CDATA[Съобщенията, файловете и разговорите са защитени чрез <b>квантово устойчиво e2e криптиране</b> с перфектна секретност при препращане, правдоподобно опровержение и възстановяване при взлом.]]></string>
|
||||
<string name="auth_open_migration_to_another_device">Отвори екрана за мигриране</string>
|
||||
<string name="migrate_from_another_device">Мигриране от друго устройство</string>
|
||||
<string name="set_passphrase">Задаване на парола</string>
|
||||
<string name="conn_event_enabled_pq">квантово устойчиво e2e криптиране</string>
|
||||
<string name="conn_event_disabled_pq">стандартно криптиране от край до край</string>
|
||||
<string name="migrate_to_device_chat_migrated">Чатът е мигриран!</string>
|
||||
<string name="migrate_to_device_finalize_migration">Завършете миграцията на другото устройство.</string>
|
||||
<string name="migrate_to_device_confirm_network_settings">Потвърди мрежовите настройки</string>
|
||||
<string name="migrate_to_device_error_downloading_archive">Грешка при изтеглянето на архива</string>
|
||||
<string name="migrate_from_device_database_init">Подготвя се качване</string>
|
||||
<string name="migrate_from_device_error_exporting_archive">Грешка при експортиране на чат базата данни</string>
|
||||
<string name="migrate_from_device_start_chat">Стартиране на чата</string>
|
||||
<string name="v5_6_quantum_resistant_encryption">Квантово устойчиво криптиране</string>
|
||||
<string name="v5_6_app_data_migration">Миграция на данните от приложението</string>
|
||||
<string name="v5_6_app_data_migration_descr">Мигрирайте към друго устройство чрез QR код.</string>
|
||||
<string name="v5_6_picture_in_picture_calls">Обаждания \"картина в картина\"</string>
|
||||
<string name="v5_6_safer_groups">По-безопасни групи</string>
|
||||
<string name="v5_6_safer_groups_descr">Администраторите могат да блокират член за всички.</string>
|
||||
<string name="migrate_to_device_downloading_details">Подробности за линка се изтеглят</string>
|
||||
<string name="migrate_to_device_downloading_archive">Архива се изтегля</string>
|
||||
<string name="migrate_to_device_repeat_download">Повтори изтеглянето</string>
|
||||
<string name="migrate_to_device_download_failed">Неуспешно изтегляне</string>
|
||||
<string name="migrate_to_device_try_again">Можете да опитате още веднъж.</string>
|
||||
<string name="migrate_to_device_importing_archive">Импортиране на архив</string>
|
||||
<string name="migrate_to_device_import_failed">Неуспешно импортиране</string>
|
||||
<string name="migrate_to_device_repeat_import">Повтори импортирането</string>
|
||||
<string name="migrate_to_device_file_delete_or_link_invalid">Файлът е изтрит или линкът е невалиден</string>
|
||||
<string name="migrate_to_device_confirm_network_settings_footer">Моля, потвърдете, че мрежовите настройки са правилни за това устройство.</string>
|
||||
<string name="migrate_to_device_apply_onion">Приложи</string>
|
||||
<string name="migrate_from_device_title">Мигрирай устройството</string>
|
||||
<string name="migrate_from_device_to_another_device">Миграция към друго устройство</string>
|
||||
<string name="migrate_from_device_error_saving_settings">Грешка при запазване на настройките</string>
|
||||
<string name="migrate_from_device_exported_file_doesnt_exist">Експортираният файл не съществува</string>
|
||||
<string name="migrate_from_device_error_uploading_archive">Грешка при качването на архива</string>
|
||||
<string name="migrate_from_device_error_deleting_database">Грешка при изтриване на база данни</string>
|
||||
<string name="migrate_from_device_stopping_chat">Спиране на чата</string>
|
||||
<string name="migrate_from_device_chat_should_be_stopped">За да продължите, чатът трябва да бъде спрян.</string>
|
||||
<string name="migrate_from_device_all_data_will_be_uploaded">Всички ваши контакти, разговори и файлове ще бъдат сигурно криптирани и качени на парчета в конфигурираните XFTP релета.</string>
|
||||
<string name="migrate_from_device_uploading_archive">Архивът се качва</string>
|
||||
<string name="migrate_from_device_try_again">Можете да опитате още веднъж.</string>
|
||||
<string name="migrate_from_device_creating_archive_link">Създаване на архивен линк</string>
|
||||
<string name="migrate_from_device_cancel_migration">Отмени миграцията</string>
|
||||
<string name="migrate_from_device_finalize_migration">Завърши миграцията</string>
|
||||
<string name="migrate_from_device_or_share_this_file_link">Или сигурно споделете този линк към файла</string>
|
||||
<string name="migrate_from_device_delete_database_from_device">Изтриване на базата данни от това устройство</string>
|
||||
<string name="migrate_from_device_migration_complete">Миграцията е завършена</string>
|
||||
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[<b>Не трябва</b> да използвате една и съща база данни на две устройства.]]></string>
|
||||
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>Моля, обърнете внимание</b>: използването на една и съща база данни на две устройства ще наруши декриптирането на съобщенията от вашите връзки като защита на сигурността.]]></string>
|
||||
<string name="migrate_from_device_verify_database_passphrase">Проверете паролата на базата данни</string>
|
||||
<string name="migrate_from_device_confirm_you_remember_passphrase">Потвърдете, че помните паролата на базата данни, преди да я мигрирате.</string>
|
||||
<string name="migrate_from_device_verify_passphrase">Провери паролата</string>
|
||||
<string name="migrate_from_device_error_verifying_passphrase">Грешка при проверката на паролата:</string>
|
||||
<string name="migrate_to_device_title">Мигрирай тук</string>
|
||||
<string name="paste_archive_link">Постави архивен линк</string>
|
||||
<string name="invalid_file_link">Невалиден линк</string>
|
||||
<string name="migrate_to_device_migrating">Мигриране</string>
|
||||
<string name="migrate_to_device_database_init">Изтеглянето се подготвя</string>
|
||||
<string name="migrate_to_device_bytes_downloaded">%s изтеглени</string>
|
||||
<string name="v5_6_picture_in_picture_calls_descr">Използвайте приложението по време на разговора.</string>
|
||||
<string name="e2ee_info_no_pq_short">Този чат е защитен чрез криптиране от край до край.</string>
|
||||
<string name="e2ee_info_pq_short">Този чат е защитен от квантово устойчиво криптиране от край до край.</string>
|
||||
<string name="e2ee_info_no_pq"><![CDATA[Съобщенията, файловете и разговорите са защитени чрез <b>криптиране от край до край</b> с перфектна секретност при препращане, правдоподобно опровержение и възстановяване при взлом.]]></string>
|
||||
<string name="or_paste_archive_link">Или постави архивен линк</string>
|
||||
<string name="migrate_to_device_enter_passphrase">Въведи парола</string>
|
||||
<string name="migrate_from_device_confirm_upload">Потвърди качването</string>
|
||||
<string name="migrate_from_device_archive_and_upload">Архивиране и качване</string>
|
||||
<string name="migrate_from_device_archiving_database">Архивиране на база данни</string>
|
||||
<string name="migrate_from_device_bytes_uploaded">%s качени</string>
|
||||
<string name="migrate_from_device_upload_failed">Неуспешно качване</string>
|
||||
<string name="migrate_from_device_repeat_upload">Повтори качването</string>
|
||||
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[Изберете <i>Миграция от друго устройство</i> на новото устройство и сканирайте QR кода.]]></string>
|
||||
<string name="migrate_from_device_starting_chat_on_multiple_devices_unsupported">Внимание: стартирането на чата на множество устройства не се поддържа и ще доведе до неуспешно изпращане на съобщения</string>
|
||||
<string name="migrate_from_device_check_connection_and_try_again">Проверете вашата интернет връзка и опитайте отново</string>
|
||||
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>Внимание</b>: архивът ще бъде изтрит.]]></string>
|
||||
<string name="v5_6_quantum_resistant_encryption_descr">Активиране в личните чатове (БЕТА)!</string>
|
||||
</resources>
|
||||
@@ -379,7 +379,7 @@
|
||||
<string name="your_settings">Vaše nastavení</string>
|
||||
<string name="your_simplex_contact_address">Vaše SimpleX adresa</string>
|
||||
<string name="database_passphrase_and_export">Přístupová fráze k databázi a export</string>
|
||||
<string name="your_chat_profiles">Vaše chatovací profily</string>
|
||||
<string name="your_chat_profiles">Vaše chat profily</string>
|
||||
<string name="chat_with_the_founder">Zaslat otázky a nápady</string>
|
||||
<string name="smp_servers_test_server">Test serveru</string>
|
||||
<string name="enter_one_ICE_server_per_line">Servery ICE (jeden na řádek)</string>
|
||||
@@ -719,7 +719,7 @@
|
||||
<string name="settings_section_title_support">PODPOŘIT SIMPLEX CHAT</string>
|
||||
<string name="settings_developer_tools">Nástroje pro vývojáře</string>
|
||||
<string name="settings_section_title_incognito">Inkognito mód</string>
|
||||
<string name="your_chat_database">Vaše chatovací databáze</string>
|
||||
<string name="your_chat_database">Vaše chat databáze</string>
|
||||
<string name="run_chat_section">SPUSTIT CHAT</string>
|
||||
<string name="chat_is_running">Chat je spuštěn</string>
|
||||
<string name="chat_is_stopped">Chat je zastaven</string>
|
||||
|
||||
@@ -262,7 +262,7 @@
|
||||
<string name="gallery_video_button">Video</string>
|
||||
<!-- help - ChatHelpView.kt -->
|
||||
<string name="thank_you_for_installing_simplex">Danke, dass Sie SimpleX Chat installiert haben!</string>
|
||||
<string name="you_can_connect_to_simplex_chat_founder"><![CDATA[Sie können sich <font color="#0088ff">mit SimpleX-Chat-Entwicklern verbinden, um Fragen zu stellen und Updates zu erhalten</font>.]]></string>
|
||||
<string name="you_can_connect_to_simplex_chat_founder"><![CDATA[Sie können sich <font color="#0088ff">mit den SimpleX-Chat-Entwicklern verbinden, um Fragen zu stellen und aktuelle Informationen zu erhalten</font>.]]></string>
|
||||
<string name="to_start_a_new_chat_help_header">Um einen neuen Chat zu starten</string>
|
||||
<string name="chat_help_tap_button">Schaltfläche antippen</string>
|
||||
<string name="above_then_preposition_continuation">Danach die gewünschte Aktion auswählen:</string>
|
||||
@@ -1214,7 +1214,7 @@
|
||||
<string name="create_address_and_let_people_connect">Erstellen Sie eine Adresse, damit sich Personen mit Ihnen verbinden können.</string>
|
||||
<string name="create_simplex_address">SimpleX-Adresse erstellen</string>
|
||||
<string name="share_with_contacts">Mit Kontakten teilen</string>
|
||||
<string name="your_contacts_will_remain_connected">Ihre Kontakte bleiben verbunden.</string>
|
||||
<string name="your_contacts_will_remain_connected">Ihre Kontakte bleiben weiterhin verbunden.</string>
|
||||
<string name="auto_accept_contact">Automatisch akzeptieren</string>
|
||||
<string name="enter_welcome_message_optional">Geben Sie eine Begrüßungsmeldung ein … (optional)</string>
|
||||
<string name="invite_friends">Freunde einladen</string>
|
||||
@@ -1725,7 +1725,7 @@
|
||||
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[Wählen Sie auf dem neuen Gerät <i>Von einem anderen Gerät migrieren</i> und scannen Sie den QR-Code.]]></string>
|
||||
<string name="migrate_from_device_delete_database_from_device">Datenbank auf diesem Gerät löschen</string>
|
||||
<string name="v5_6_app_data_migration">App-Daten-Migration</string>
|
||||
<string name="v5_6_safer_groups_descr">Administratoren können für ein Mitglied alle Funktionen blockieren.</string>
|
||||
<string name="v5_6_safer_groups_descr">Administratoren können ein Gruppenmitglied für Alle blockieren.</string>
|
||||
<string name="migrate_to_device_downloading_details">Link-Details werden heruntergeladen</string>
|
||||
<string name="migrate_to_device_downloading_archive">Archiv wird heruntergeladen</string>
|
||||
<string name="migrate_to_device_apply_onion">Anwenden</string>
|
||||
@@ -1737,7 +1737,7 @@
|
||||
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>Bitte beachten Sie</b>: Aus Sicherheitsgründen wird die Nachrichtenentschlüsselung Ihrer Verbindungen abgebrochen, wenn Sie die gleiche Datenbank auf zwei Geräten nutzen.]]></string>
|
||||
<string name="migrate_from_device_cancel_migration">Migration abbrechen</string>
|
||||
<string name="migrate_to_device_confirm_network_settings">Bestätigen Sie die Netzwerkeinstellungen</string>
|
||||
<string name="migrate_from_device_confirm_you_remember_passphrase">Für die Migration bestätigen Sie bitte, dass Sie sich an das Datenbank-Passwort erinnern.</string>
|
||||
<string name="migrate_from_device_confirm_you_remember_passphrase">Bitte bestätigen Sie für die Migration, dass Sie sich an Ihr Datenbank-Passwort erinnern.</string>
|
||||
<string name="migrate_from_device_confirm_upload">Hochladen bestätigen</string>
|
||||
<string name="migrate_to_device_download_failed">Herunterladen fehlgeschlagen</string>
|
||||
<string name="e2ee_info_no_pq"><![CDATA[Nachrichten, Dateien und Anrufe sind durch <b>Ende-zu-Ende-Verschlüsselung</b> mit Perfect Forward Secrecy, Ablehnung und Einbruchs-Wiederherstellung geschützt.]]></string>
|
||||
@@ -1759,7 +1759,7 @@
|
||||
<string name="migrate_from_device_start_chat">Chat starten</string>
|
||||
<string name="v5_6_quantum_resistant_encryption_descr">Kann in direkten Chats aktiviert werden (BETA)!</string>
|
||||
<string name="v5_6_quantum_resistant_encryption">Quantum-resistente Verschlüsselung</string>
|
||||
<string name="v5_6_app_data_migration_descr">Über einen QR-Code auf ein anderes Gerät migrieren.</string>
|
||||
<string name="v5_6_app_data_migration_descr">Daten können über einen QR-Code auf ein anderes Gerät migriert werden.</string>
|
||||
<string name="v5_6_picture_in_picture_calls">Bild-in-Bild-Anrufe</string>
|
||||
<string name="v5_6_safer_groups">Sicherere Gruppen</string>
|
||||
<string name="v5_6_picture_in_picture_calls_descr">Die App kann während eines Anrufs genutzt werden.</string>
|
||||
@@ -1796,4 +1796,5 @@
|
||||
<string name="migrate_to_device_confirm_network_settings_footer">Bitte bestätigen Sie, dass die Netzwerkeinstellungen auf diesem Gerät richtig sind.</string>
|
||||
<string name="conn_event_disabled_pq">Standard-Ende-zu-Ende-Verschlüsselung</string>
|
||||
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[Sie dürfen die selbe Datenbank <b>nicht</b> auf zwei Geräten nutzen.]]></string>
|
||||
<string name="error_showing_desktop_notification">Fehler beim Anzeigen der Benachrichtigung. Bitte kontaktieren Sie die Entwickler.</string>
|
||||
</resources>
|
||||
@@ -1648,4 +1648,72 @@
|
||||
<string name="migrate_to_device_apply_onion">Aplicar</string>
|
||||
<string name="migrate_from_device_archive_and_upload">Archivar y subir</string>
|
||||
<string name="migrate_from_device_cancel_migration">Cancelar migración</string>
|
||||
<string name="e2ee_info_no_pq_short">Este chat está protegido por cifrado de extremo a extremo.</string>
|
||||
<string name="migrate_from_another_device">Migrar desde otro dispositivo</string>
|
||||
<string name="conn_event_enabled_pq">cifrado e2e resistente a tecnologías cuánticas</string>
|
||||
<string name="conn_event_disabled_pq">cifrado estándar de extremo a extremo</string>
|
||||
<string name="migrate_to_device_bytes_downloaded">%s descargado</string>
|
||||
<string name="migrate_from_device_or_share_this_file_link">O comparta de forma segura este enlace de archivo</string>
|
||||
<string name="migrate_from_device_migration_complete">Migración completada</string>
|
||||
<string name="migrate_from_device_start_chat">Empezar chat</string>
|
||||
<string name="migrate_from_device_starting_chat_on_multiple_devices_unsupported">Advertencia: el inicio del chat en varios dispositivos no es compatible y provocará fallos en la entrega de mensajes.</string>
|
||||
<string name="migrate_from_device_verify_passphrase">Verificar la frase de contraseña</string>
|
||||
<string name="migrate_from_device_verify_database_passphrase">Verificar la contraseña de la base de datos</string>
|
||||
<string name="v5_6_quantum_resistant_encryption_descr">¡Habilitar en chats directos (BETA)!</string>
|
||||
<string name="v5_6_picture_in_picture_calls_descr">Usar la aplicación durante la llamada.</string>
|
||||
<string name="v5_6_safer_groups">Grupos más seguros</string>
|
||||
<string name="migrate_to_device_downloading_details">Descargando detalles del enlace</string>
|
||||
<string name="invalid_file_link">Enlace inválido</string>
|
||||
<string name="migrate_to_device_migrating">Migrando</string>
|
||||
<string name="paste_archive_link">Pegar enlace de archivo</string>
|
||||
<string name="migrate_to_device_database_init">Preparando descarga</string>
|
||||
<string name="migrate_to_device_repeat_download">Repetir descarga</string>
|
||||
<string name="migrate_to_device_try_again">Puedes intentarlo de nuevo.</string>
|
||||
<string name="migrate_to_device_enter_passphrase">Introducir frase de contraseña</string>
|
||||
<string name="migrate_to_device_error_downloading_archive">Error al descargar el archivo</string>
|
||||
<string name="migrate_to_device_file_delete_or_link_invalid">El archivo se ha eliminado o el enlace no es válido</string>
|
||||
<string name="migrate_to_device_finalize_migration">Finalizar la migración en otro dispostivo.</string>
|
||||
<string name="migrate_to_device_import_failed">Error de importación</string>
|
||||
<string name="migrate_to_device_importing_archive">Importando archivo</string>
|
||||
<string name="migrate_to_device_repeat_import">Repetir importación</string>
|
||||
<string name="migrate_from_device_title">Migrar dispositivo</string>
|
||||
<string name="migrate_to_device_confirm_network_settings_footer">Por favor confirme que la configuración de red es correcta para este dispositivo.</string>
|
||||
<string name="migrate_from_device_error_deleting_database">Error al borrar la base de datos</string>
|
||||
<string name="migrate_from_device_error_uploading_archive">Error al subir el archivo</string>
|
||||
<string name="migrate_from_device_stopping_chat">Deteniendo chat</string>
|
||||
<string name="migrate_from_device_repeat_upload">Repetir la carga</string>
|
||||
<string name="migrate_from_device_bytes_uploaded">%s subidos</string>
|
||||
<string name="migrate_from_device_upload_failed">Error de subida</string>
|
||||
<string name="migrate_from_device_uploading_archive">Subiendo archivo</string>
|
||||
<string name="migrate_from_device_try_again">Puedes intentarlo de nuevo.</string>
|
||||
<string name="migrate_from_device_creating_archive_link">Creando enlace de archivo</string>
|
||||
<string name="migrate_from_device_delete_database_from_device">Borrar la base de datos de este dispositivo</string>
|
||||
<string name="migrate_from_device_finalize_migration">Finalizar la migración</string>
|
||||
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>Atención</b>: el archivo se eliminará.]]></string>
|
||||
<string name="migrate_from_device_check_connection_and_try_again">Compruebe su conexión a Internet y vuelva a intentarlo</string>
|
||||
<string name="migrate_from_device_confirm_you_remember_passphrase">Confirme que recuerda la contraseña de la base de datos para migrarla.</string>
|
||||
<string name="migrate_from_device_error_verifying_passphrase">Error al verificar la contraseña:</string>
|
||||
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>Ten en cuenta</b>: usar la misma base de datos en dos dispositivos romperá el descifrado de mensajes de tus conexiones, como protección de seguridad.]]></string>
|
||||
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[Elige <i>Migrar desde otro dispositivo</i> en el nuevo dispositivo y escanea el código QR.]]></string>
|
||||
<string name="migrate_to_device_confirm_network_settings">Confirmar la configuración de red</string>
|
||||
<string name="migrate_from_device_confirm_upload">Confirmar carga</string>
|
||||
<string name="migrate_to_device_download_failed">Descarga fallida</string>
|
||||
<string name="migrate_to_device_downloading_archive">Descargando archivo</string>
|
||||
<string name="migrate_from_device_error_exporting_archive">Error al exportar la base de datos de chats</string>
|
||||
<string name="migrate_from_device_error_saving_settings">Error al guardar los ajustes</string>
|
||||
<string name="migrate_from_device_exported_file_doesnt_exist">El archivo exportado no existe</string>
|
||||
<string name="migrate_from_device_chat_should_be_stopped">Para continuar, el chat debe detenerse.</string>
|
||||
<string name="e2ee_info_no_pq"><![CDATA[Los mensajes, archivos y llamadas están protegidos por <b>cifrado de extremo a extremo</b> con perfecta confidencialidad, repudio y recuperación tras ataques.]]></string>
|
||||
<string name="e2ee_info_pq"><![CDATA[Los mensajes, archivos y llamadas están protegidos por <b>cifrado de extremo a extremo resistente a computación cuántica</b> con perfecta confidencialidad, repudio y recuperación tras ataques.]]></string>
|
||||
<string name="migrate_to_device_title">Migrar aquí</string>
|
||||
<string name="migrate_from_device_to_another_device">Migrar hacia otro dispositivo</string>
|
||||
<string name="v5_6_app_data_migration_descr">Migrar hacia otro dispositivo mediante código QR.</string>
|
||||
<string name="auth_open_migration_to_another_device">Abrir pantalla de migración</string>
|
||||
<string name="or_paste_archive_link">O pegar enlace del archivo</string>
|
||||
<string name="v5_6_picture_in_picture_calls">Llamadas picture-in-picture</string>
|
||||
<string name="migrate_from_device_database_init">Preparando subida</string>
|
||||
<string name="v5_6_quantum_resistant_encryption">Cifrado resistente a tecnologías cuánticas</string>
|
||||
<string name="set_passphrase">Establecer frase de contraseña</string>
|
||||
<string name="e2ee_info_pq_short">Este chat está protegido por un cifrado de extremo a extremo resistente a tecnología cuántica.</string>
|
||||
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[<b>No debes</b> utilizar la misma base de datos en dos dispositivos.]]></string>
|
||||
</resources>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="alert_text_decryption_error_n_messages_failed_to_decrypt">%1$d üzenet visszafejtése sikertelen</string>
|
||||
<string name="alert_text_decryption_error_n_messages_failed_to_decrypt">%1$d üzenet visszafejtése sikertelen.</string>
|
||||
<string name="alert_text_decryption_error_too_many_skipped">%1$d üzenet kihagyva.</string>
|
||||
<string name="integrity_msg_skipped">%1$d kihagyott üzenet</string>
|
||||
<string name="group_info_section_title_num_members">%1$s TAG</string>
|
||||
@@ -726,7 +726,7 @@
|
||||
<string name="v4_6_reduced_battery_usage_descr">Hamarosan további fejlesztések érkeznek!</string>
|
||||
<string name="message_reactions_prohibited_in_this_chat">Az üzenetreakciók ebben a csevegésben le vannak tiltva.</string>
|
||||
<string name="incorrect_code">Helytelen biztonsági kód!</string>
|
||||
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Ez akkor fordulhat elő, ha ön, vagy a kapcsolata régi adatbázis biztonsági mentést használt.</string>
|
||||
<string name="alert_text_fragment_encryption_out_of_sync_old_database">Ez akkor fordulhat elő, ha ön, vagy az ismerőse régi adatbázis biztonsági mentést használt.</string>
|
||||
<string name="v5_3_new_desktop_app">Új asztali alkalmazás!</string>
|
||||
<string name="v4_6_group_moderation_descr">Most már az adminok is:
|
||||
\n- törölhetik a tagok üzeneteit.
|
||||
@@ -740,15 +740,15 @@
|
||||
<string name="new_member_role">Új tag szerepköre</string>
|
||||
<string name="la_mode_off">Ki</string>
|
||||
<string name="invalid_contact_link">Érvénytelen hivatkozás!</string>
|
||||
<string name="network_use_onion_hosts_required_desc_in_alert">A csatlakozáshoz Onion host-okra lesz szükség.</string>
|
||||
<string name="network_use_onion_hosts_required_desc_in_alert">A csatlakozáshoz Onion kiszolgálókra lesz szükség.</string>
|
||||
<string name="new_in_version">Változások a %s verzióban</string>
|
||||
<string name="network_use_onion_hosts_prefer_desc_in_alert">Onion host-ok használata, ha azok rendelkezésre állnak.</string>
|
||||
<string name="network_use_onion_hosts_prefer_desc_in_alert">Onion kiszolgálók használata, ha azok rendelkezésre állnak.</string>
|
||||
<string name="smp_servers_invalid_address">Érvénytelen kiszolgálócím!</string>
|
||||
<string name="thousand_abbreviation">k</string>
|
||||
<string name="chat_item_ttl_none">soha</string>
|
||||
<string name="new_desktop"><![CDATA[<i>(új)</i>]]></string>
|
||||
<string name="ensure_smp_server_address_are_correct_format_and_unique">Győződjön meg arról, hogy az SMP-kiszolgáló címei megfelelő formátumúak, sorszeparáltak és nincsenek duplikálva.</string>
|
||||
<string name="network_use_onion_hosts_no_desc">Onion host-ok nem lesznek használva.</string>
|
||||
<string name="network_use_onion_hosts_no_desc">Onion kiszolgálók nem lesznek használva.</string>
|
||||
<string name="custom_time_unit_minutes">perc</string>
|
||||
<string name="learn_more">Tudjon meg többet</string>
|
||||
<string name="notification_new_contact_request">Új kapcsolattartási kérelem</string>
|
||||
@@ -765,7 +765,7 @@
|
||||
<string name="chat_preferences_on">be</string>
|
||||
<string name="v5_1_japanese_portuguese_interface">Japán és Portugál kezelőfelület</string>
|
||||
<string name="message_deletion_prohibited_in_chat">Ebben a csoportban az üzenetek visszafordíthatatlan törlése le van tiltva.</string>
|
||||
<string name="network_use_onion_hosts_no_desc_in_alert">Onion host-ok nem lesznek használva.</string>
|
||||
<string name="network_use_onion_hosts_no_desc_in_alert">Onion kiszolgálók nem lesznek használva.</string>
|
||||
<string name="remote_host_was_disconnected_toast"><![CDATA[A(z) <b>%s</b> eszközzel megszakadt a kapcsolat]]></string>
|
||||
<string name="custom_time_unit_months">hónap</string>
|
||||
<string name="privacy_message_draft">Üzenetvázlat</string>
|
||||
@@ -777,7 +777,7 @@
|
||||
<string name="message_deletion_prohibited">Ebben a csevegésben az üzenetek visszafordíthatatlan törlése le van tiltva.</string>
|
||||
<string name="v4_3_voice_messages_desc">Max 40 másodperc, azonnal fogadható.</string>
|
||||
<string name="description_via_contact_address_link_incognito">inkognitó a ismerős azonosító hivatkozáson keresztül</string>
|
||||
<string name="network_use_onion_hosts_required_desc">A kapcsolódáshoz Onion host-okra lesz szükség.
|
||||
<string name="network_use_onion_hosts_required_desc">A kapcsolódáshoz Onion kiszolgálókra lesz szükség.
|
||||
\nFigyelem: .onion cím nélkül nem fog tudni kapcsolódni a kiszolgálókhoz.</string>
|
||||
<string name="v4_5_italian_interface">Olasz kezelőfelület</string>
|
||||
<string name="system_restricted_background_in_call_title">Nincsenek háttérhívások</string>
|
||||
@@ -833,8 +833,8 @@
|
||||
\n3. A kapcsolat sérült.</string>
|
||||
<string name="group_member_role_observer">megfigyelő</string>
|
||||
<string name="description_via_group_link_incognito">inkognitó a csoportos hivatkozáson keresztül</string>
|
||||
<string name="network_use_onion_hosts_prefer_desc">Onion host-ok használata, ha azok rendelkezésre állnak.</string>
|
||||
<string name="invite_friends">Barátok meghívása</string>
|
||||
<string name="network_use_onion_hosts_prefer_desc">Onion kiszolgálók használata, ha azok rendelkezésre állnak.</string>
|
||||
<string name="invite_friends">Ismerősök meghívása</string>
|
||||
<string name="color_surface">Menük és figyelmeztetések</string>
|
||||
<string name="icon_descr_add_members">Tagok meghívása</string>
|
||||
<string name="group_preview_join_as">csatlakozás mint %s</string>
|
||||
@@ -1158,7 +1158,7 @@
|
||||
<string name="whats_new">Változáslista</string>
|
||||
<string name="connect_plan_open_group">Csoport megnyitása</string>
|
||||
<string name="info_row_sent_at">Elküldve ekkor</string>
|
||||
<string name="prohibit_sending_voice">Hangüzenetek küldésének letiltása.</string>
|
||||
<string name="prohibit_sending_voice">Hangüzenetek küldése le van tiltva.</string>
|
||||
<string name="privacy_show_last_messages">Utolsó üzenetek megjelenítése</string>
|
||||
<string name="smp_servers_preset_address">Az előre beállított kiszolgáló címe</string>
|
||||
<string name="periodic_notifications_disabled">Rendszeres értesítések letiltva!</string>
|
||||
@@ -1477,7 +1477,7 @@
|
||||
<string name="v5_0_app_passcode_descr">Rendszerhitelesítés helyetti beállítás.</string>
|
||||
<string name="switch_receiving_address_desc">A fogadó cím egy másik kiszolgálóra változik. A címváltoztatás a feladó online állapotba kerülése után fejeződik be.</string>
|
||||
<string name="stop_chat_to_export_import_or_delete_chat_database">A csevegés leállítása a csevegő adatbázis exportálásához, importálásához, vagy törléséhez. A csevegés leállítása alatt nem tud üzeneteket fogadni és küldeni.</string>
|
||||
<string name="save_passphrase_in_keychain">Jelmondat mentése a kulcstárolóban</string>
|
||||
<string name="save_passphrase_in_keychain">Jelmondat mentése a kulcstárolóba</string>
|
||||
<string name="v4_6_chinese_spanish_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblaten!</string>
|
||||
<string name="save_passphrase_in_settings">Jelmondat mentése a beállításokban</string>
|
||||
<string name="send_receipts_disabled_alert_msg">Ennek a csoportnak több mint %1$d tagja van, a kézbesítési jelentések nem kerülnek elküldésre.</string>
|
||||
@@ -1710,4 +1710,5 @@
|
||||
<string name="e2ee_info_pq_short">Ez a csevegés végpontok közötti kvantumrezisztens tikosítással védett.</string>
|
||||
<string name="e2ee_info_no_pq"><![CDATA[Az üzeneteket, fájlokat és hívásokat <b>végpontok közötti titkosítással</b> és sérülés utáni titkosságvédelemmel, visszautasítással és sérülés utáni helyreállítással védi.]]></string>
|
||||
<string name="e2ee_info_pq"><![CDATA[Az üzeneteket, fájlokat és hívásokat <b>végpontok közötti kvantumrezisztens titkosítással</b> és sérülés utáni titkosságvédelemmel, visszautasítással és sérülés utáni helyreállítással védi.]]></string>
|
||||
<string name="error_showing_desktop_notification">Hiba az értesítés megjelenítésekor, lépjen kapcsolatba a fejlesztőkkel.</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="120"
|
||||
height="120"
|
||||
viewBox="121 0 40 40"
|
||||
fill="none"
|
||||
version="1.1"
|
||||
id="svg3"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="m 126.52238,11.425398 5.80302,5.716401 5.88962,-5.889626 2.8582,2.858201 L 135.1836,20 l 5.7164,5.716402 -2.94482,2.8582 -5.7164,-5.629789 -5.88962,5.803014 -2.8582,-2.858201 5.88962,-5.803014 -5.803,-5.716402 z"
|
||||
fill="#030749"
|
||||
id="path1"
|
||||
style="stroke-width:0.866122" />
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="m 137.86858,28.661214 2.94481,-2.944812 v 0 l 5.88963,-5.803014 -5.80302,-5.62979 v 0 l -2.8582,-2.8582 -5.7164,-5.7164023 2.94481,-2.9448129 5.7164,5.7164017 5.88963,-5.8030138 2.8582,2.8582008 -5.88962,5.8030145 5.7164,5.716401 5.88962,-5.803014 2.8582,2.858201 -5.88962,5.803014 5.803,5.716402 -2.9448,2.858201 -5.7164,-5.716402 -5.88963,5.803013 5.7164,5.716402 -2.8582,2.944813 -5.80301,-5.716402 -5.80302,5.803015 -2.8582,-2.858201 z"
|
||||
fill="url(#paint0_linear_40_164)"
|
||||
id="path2"
|
||||
style="fill:url(#paint0_linear_40_164);stroke-width:0.866122" />
|
||||
<defs
|
||||
id="defs3">
|
||||
<linearGradient
|
||||
x1="135.948"
|
||||
y1="-0.81632602"
|
||||
x2="132.09599"
|
||||
y2="36.985699"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="paint0_linear_40_164"
|
||||
gradientTransform="matrix(0.86612147,0,0,0.86612147,18.863485,2.6775707)">
|
||||
<stop
|
||||
stop-color="#01f1ff"
|
||||
id="stop2" />
|
||||
<stop
|
||||
offset="1"
|
||||
stop-color="#0197ff"
|
||||
id="stop3" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -1500,7 +1500,7 @@
|
||||
<string name="v5_4_block_group_members">Blocca i membri dei gruppi</string>
|
||||
<string name="v5_4_incognito_groups_descr">Crea un gruppo usando un profilo casuale.</string>
|
||||
<string name="v5_4_link_mobile_desktop">Collega le app mobile e desktop! 🔗</string>
|
||||
<string name="v5_4_link_mobile_desktop_descr">Tramite protocollo sicuro resistente al quantistico.</string>
|
||||
<string name="v5_4_link_mobile_desktop_descr">Tramite protocollo sicuro resistente alla quantistica.</string>
|
||||
<string name="v5_4_block_group_members_descr">Per nascondere messaggi indesiderati.</string>
|
||||
<string name="v5_4_better_groups">Gruppi migliorati</string>
|
||||
<string name="v5_4_incognito_groups">Gruppi in incognito</string>
|
||||
@@ -1640,7 +1640,7 @@
|
||||
<string name="unable_to_open_browser_title">Errore di apertura del browser</string>
|
||||
<string name="unable_to_open_browser_desc">Il browser predefinito è necessario per le chiamate. Configura il browser predefinito nel sistema, poi condividi più informazioni con gli sviluppatori.</string>
|
||||
<string name="e2ee_info_no_pq_short">Questa chat è protetta da crittografia end-to-end.</string>
|
||||
<string name="e2ee_info_pq_short">Questa chat è protetta da crittografia end-to-end resistente al quantistico.</string>
|
||||
<string name="e2ee_info_pq_short">Questa chat è protetta da crittografia end-to-end resistente alla quantistica.</string>
|
||||
<string name="migrate_from_device_start_chat">Avvia chat</string>
|
||||
<string name="migrate_to_device_title">Migra qui</string>
|
||||
<string name="migrate_to_device_downloading_details">Scaricamento dettagli del link</string>
|
||||
@@ -1680,7 +1680,7 @@
|
||||
<string name="migrate_to_device_importing_archive">Importazione archivio</string>
|
||||
<string name="invalid_file_link">Link non valido</string>
|
||||
<string name="e2ee_info_no_pq"><![CDATA[I messaggi, i file e le chiamate sono protetti da <b>crittografia end-to-end</b> con perfect forward secrecy, ripudio e recupero da intrusione.]]></string>
|
||||
<string name="e2ee_info_pq"><![CDATA[I messaggi, i file e le chiamate sono protetti da <b>crittografia e2e resistente al quantistico</b> con perfect forward secrecy, ripudio e recupero da intrusione.]]></string>
|
||||
<string name="e2ee_info_pq"><![CDATA[I messaggi, i file e le chiamate sono protetti da <b>crittografia e2e resistente alla quantistica</b> con perfect forward secrecy, ripudio e recupero da intrusione.]]></string>
|
||||
<string name="migrate_from_device_title">Migra dispositivo</string>
|
||||
<string name="migrate_from_another_device">Migra da un altro dispositivo</string>
|
||||
<string name="migrate_from_device_to_another_device">Migra ad un altro dispositivo</string>
|
||||
@@ -1694,10 +1694,10 @@
|
||||
<string name="v5_6_picture_in_picture_calls">Chiamate picture-in-picture</string>
|
||||
<string name="migrate_to_device_confirm_network_settings_footer">Conferma che le impostazioni di rete sono corrette per questo dispositivo.</string>
|
||||
<string name="migrate_from_device_database_init">Preparazione del caricamento</string>
|
||||
<string name="conn_event_enabled_pq">crittografia e2e resistente al quantistico</string>
|
||||
<string name="conn_event_enabled_pq">crittografia e2e resistente alla quantistica</string>
|
||||
<string name="migrate_to_device_repeat_import">Ripeti importazione</string>
|
||||
<string name="migrate_to_device_database_init">Preparazione dello scaricamento</string>
|
||||
<string name="v5_6_quantum_resistant_encryption">Crittografia resistente al quantistico</string>
|
||||
<string name="v5_6_quantum_resistant_encryption">Crittografia resistente alla quantistica</string>
|
||||
<string name="migrate_to_device_repeat_download">Ripeti scaricamento</string>
|
||||
<string name="migrate_from_device_repeat_upload">Ripeti caricamento</string>
|
||||
<string name="v5_6_safer_groups">Gruppi più sicuri</string>
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
<string name="allow_your_contacts_to_send_disappearing_messages">אפשר לאנשי קשר לשלוח הודעות נעלמות.</string>
|
||||
<string name="allow_voice_messages_only_if">אפשר הודעות קוליות רק אם איש הקשר מאפשר אותן.</string>
|
||||
<string name="allow_your_contacts_to_call">אפשר לאנשי קשר להתקשר אליכם.</string>
|
||||
<string name="allow_to_delete_messages">אפשר מחיקה בלתי הפיכה של הודעות שנשלחו.</string>
|
||||
<string name="allow_to_delete_messages">אפשר למחוק הודעות שנשלחו באופן בלתי הפיך. (24 שעות)</string>
|
||||
<string name="allow_to_send_disappearing">אפשר שליחת הודעות נעלמות.</string>
|
||||
<string name="allow_to_send_voice">אפשר שליחת הודעות קוליות.</string>
|
||||
<string name="group_member_role_admin">מנהל</string>
|
||||
@@ -47,7 +47,7 @@
|
||||
<string name="v4_3_improved_server_configuration_desc">הוספת שרתים על ידי סריקת קוד QR.</string>
|
||||
<string name="smp_servers_add_to_another_device">הוסף למכשיר אחר</string>
|
||||
<string name="allow_calls_only_if">אפשר שיחות רק אם איש הקשר מאפשר אותן.</string>
|
||||
<string name="allow_irreversible_message_deletion_only_if">אפשר לאנשי קשר מחיקת הודעות בלתי הפיכה רק אם הם מאפשרים לך לעשות זאת.</string>
|
||||
<string name="allow_irreversible_message_deletion_only_if">אפשר מחיקת הודעות בלתי הפיכה רק אם האיש קשר מאפשר את זה (24 שעות)</string>
|
||||
<string name="allow_direct_messages">אפשר שליחת הודעות ישירות לחברי הקבוצה.</string>
|
||||
<string name="allow_voice_messages_question">לאפשר הודעות קוליות\?</string>
|
||||
<string name="allow_your_contacts_to_send_voice_messages">אפשר לאנשי קשר לשלוח הודעות קוליות.</string>
|
||||
@@ -95,7 +95,7 @@
|
||||
<string name="auth_unavailable">אימות לא זמין</string>
|
||||
<string name="onboarding_notifications_mode_off_desc"><![CDATA[<b>הטוב ביותר לסוללה</b>. התראות יוצגו רק כאשר האפליקציה מופעלת (ללא שירות רקע).]]></string>
|
||||
<string name="onboarding_notifications_mode_periodic_desc"><![CDATA[<b>טוב לסוללה</b>. שירות הרקע ייבדוק הודעות כל 10 דקות. שיחות או הודעות דחופות עלולות להתפספס.]]></string>
|
||||
<string name="both_you_and_your_contacts_can_delete">גם אתם וגם איש הקשר יכולים למחוק באופן בלתי הפיך הודעות שנשלחו.</string>
|
||||
<string name="both_you_and_your_contacts_can_delete">גם אתה וגם איש הקשר שלך יכולים למחוק הודעות שנשלחו באופן בלתי הפיך. (24 שעות)</string>
|
||||
<string name="both_you_and_your_contact_can_send_disappearing">גם אתם וגם איש הקשר יכולים לשלוח הודעות נעלמות.</string>
|
||||
<string name="cannot_receive_file">לא ניתן לקבל את הקובץ</string>
|
||||
<string name="icon_descr_cancel_image_preview">בטל תצוגה מקדימה של תמונות</string>
|
||||
@@ -117,9 +117,9 @@
|
||||
<string name="callstatus_calling">מתקשר…</string>
|
||||
<string name="callstatus_ended">השיחה הסתיימה %1$s</string>
|
||||
<string name="icon_descr_cancel_file_preview">בטל תצוגה מקדימה של קבצים</string>
|
||||
<string name="connect_via_contact_link">להתחבר באמצעות קישור ליצירת קשר\?</string>
|
||||
<string name="connect_via_contact_link">להתחבר באמצעות קישור ליצירת קשר?</string>
|
||||
<string name="connect_via_link_verb">התחבר</string>
|
||||
<string name="connect_via_group_link">להתחבר באמצעות קישור קבוצה\?</string>
|
||||
<string name="connect_via_group_link">להצטרף לקבוצה?</string>
|
||||
<string name="server_connected">מחובר</string>
|
||||
<string name="server_connecting">מתחבר</string>
|
||||
<string name="display_name_connecting">מתחבר…</string>
|
||||
@@ -197,7 +197,7 @@
|
||||
<string name="icon_descr_server_status_connected">מחובר</string>
|
||||
<string name="display_name_connection_established">חיבור נוצר</string>
|
||||
<string name="connection_local_display_name">חיבור %1$d</string>
|
||||
<string name="connect_via_invitation_link">להתחבר באמצעות קישור הזמנה\?</string>
|
||||
<string name="connect_via_invitation_link">להתחבר דרך קישור חד-פעמי?</string>
|
||||
<string name="contact_already_exists">איש הקשר כבר קיים</string>
|
||||
<string name="delete_contact_all_messages_deleted_cannot_undo_warning">איש הקשר וכל ההודעות יימחקו – לא ניתן לבטל זאת!</string>
|
||||
<string name="connect_via_link_or_qr">התחברות באמצעות קישור / קוד QR</string>
|
||||
@@ -333,7 +333,7 @@
|
||||
<string name="la_enter_app_passcode">הזינו קוד גישה</string>
|
||||
<string name="auth_enable_simplex_lock">הפעלת נעילת SimpleX</string>
|
||||
<string name="edit_verb">ערוך</string>
|
||||
<string name="display_name__field">שם תצוגה:</string>
|
||||
<string name="display_name__field">שם פרופיל:</string>
|
||||
<string name="edit_image">ערוך תמונה</string>
|
||||
<string name="enter_correct_passphrase">הזינו סיסמה נכונה.</string>
|
||||
<string name="mtr_error_different">העברת נתונים שונה באפליקציה/מסד נתונים: %s / %s</string>
|
||||
@@ -389,7 +389,7 @@
|
||||
<string name="v4_5_multiple_chat_profiles_descr">שמות שונים, אווטארים ובידוד תעבורה.</string>
|
||||
<string name="conn_level_desc_direct">ישיר</string>
|
||||
<string name="direct_messages_are_prohibited_in_chat">הודעות ישירות בין חברי קבוצה אסורות בקבוצה זו.</string>
|
||||
<string name="display_name">שם תצוגה</string>
|
||||
<string name="display_name">הזן את שמך:</string>
|
||||
<string name="display_name_cannot_contain_whitespace">שם תצוגה אינו יכול להכיל רווחים.</string>
|
||||
<string name="ttl_months">%d חודשים</string>
|
||||
<string name="ttl_mth">%d ח׳</string>
|
||||
@@ -436,7 +436,7 @@
|
||||
<string name="file_with_path">קובץ: %s</string>
|
||||
<string name="icon_descr_group_inactive">קבוצה לא פעילה</string>
|
||||
<string name="group_invitation_expired">פג תוקפה של ההזמנה לקבוצה</string>
|
||||
<string name="group_display_name_field">שם תצוגה של הקבוצה:</string>
|
||||
<string name="group_display_name_field">הזן שם של הקבוצה:</string>
|
||||
<string name="group_full_name_field">שם מלא של הקבוצה:</string>
|
||||
<string name="v4_2_group_links">קישורי קבוצה</string>
|
||||
<string name="icon_descr_file">קובץ</string>
|
||||
@@ -495,7 +495,7 @@
|
||||
<string name="delete_group_for_self_cannot_undo_warning">הקבוצה תימחק עבורך – לא ניתן לבטל זאת!</string>
|
||||
<string name="user_hide">הסתר</string>
|
||||
<string name="group_preferences">העדפות קבוצה</string>
|
||||
<string name="group_members_can_delete">חברי הקבוצה יכולים למחוק באופן בלתי הפיך הודעות שנשלחו.</string>
|
||||
<string name="group_members_can_delete">חברי קבוצה יכולים למחוק הודעות שנשלחו באופן בלתי הפיך. (24 שעות)</string>
|
||||
<string name="group_members_can_send_disappearing">חברי הקבוצה יכולים לשלוח הודעות נעלמות.</string>
|
||||
<string name="group_members_can_send_dms">חברי הקבוצה יכולים לשלוח הודעות ישירות.</string>
|
||||
<string name="group_members_can_send_voice">חברי הקבוצה יכולים לשלוח הודעות קוליות.</string>
|
||||
@@ -627,7 +627,7 @@
|
||||
<string name="chat_preferences_on">פעיל</string>
|
||||
<string name="chat_preferences_no">לא</string>
|
||||
<string name="chat_preferences_off">כבוי</string>
|
||||
<string name="only_you_can_delete_messages">רק אתם יכולים למחוק הודעות באופן בלתי הפיך (איש הקשר שלכם יכול לסמן אותן למחיקה).</string>
|
||||
<string name="only_you_can_delete_messages">רק אתה יכול למחוק הודעות באופן בלתי הפיך (איש הקשר שלך יכול לסמן אותן למחיקה). (24 שעות)</string>
|
||||
<string name="only_you_can_send_voice">רק אתם יכולים לשלוח הודעות קוליות.</string>
|
||||
<string name="only_your_contact_can_send_voice">רק איש הקשר שלכם יכול לשלוח הודעות קוליות.</string>
|
||||
<string name="only_you_can_make_calls">רק אתם יכולים לבצע שיחות.</string>
|
||||
@@ -640,7 +640,7 @@
|
||||
<string name="no_contacts_to_add">אין אנשי קשר להוסיף</string>
|
||||
<string name="only_you_can_send_disappearing">רק אתם יכולים לשלוח הודעות נעלמות.</string>
|
||||
<string name="only_your_contact_can_send_disappearing">רק איש הקשר שלכם יכול לשלוח הודעות נעלמות.</string>
|
||||
<string name="only_your_contact_can_delete">רק איש הקשר שלכם יכול למחוק הודעות באופן בלתי הפיך (אתם יכולים לסמן אותן למחיקה).</string>
|
||||
<string name="only_your_contact_can_delete">רק איש הקשר שלך יכול למחוק הודעות באופן בלתי הפיך (אתה יכול לסמן אותן למחיקה). (24 שעות)</string>
|
||||
<string name="v4_5_message_draft">טיוטת הודעה</string>
|
||||
<string name="v4_5_multiple_chat_profiles">פרופילי צ׳אט מרובים</string>
|
||||
<string name="v4_5_reduced_battery_usage_descr">שיפורים נוספים יגיעו בקרוב!</string>
|
||||
@@ -761,7 +761,7 @@
|
||||
<string name="smp_servers_preset_address">כתובת שרת מוגדר מראש</string>
|
||||
<string name="password_to_show">סיסמה להצגה</string>
|
||||
<string name="onboarding_notifications_mode_title">התראות פרטיות</string>
|
||||
<string name="paste_the_link_you_received">הדבק קישור שהתקבל</string>
|
||||
<string name="paste_the_link_you_received">הדבק את הקישור שקיבלת</string>
|
||||
<string name="call_connection_peer_to_peer">עמית־לעמית</string>
|
||||
<string name="icon_descr_call_pending_sent">שיחה ממתינה</string>
|
||||
<string name="alert_text_fragment_please_report_to_developers">אנא דווחו על כך למפתחים.</string>
|
||||
@@ -1156,7 +1156,7 @@
|
||||
<string name="you_accepted_connection">אישרת את החיבור</string>
|
||||
<string name="image_descr_simplex_logo">סמל SimpleX</string>
|
||||
<string name="xftp_servers">שרתי XFTP</string>
|
||||
<string name="alert_text_decryption_error_too_many_skipped">%1$d הודעות דולגו.</string>
|
||||
<string name="alert_text_decryption_error_too_many_skipped">דילג על %1$d הודעות.</string>
|
||||
<string name="wrong_passphrase">סיסמת מסד נתונים שגויה</string>
|
||||
<string name="you_are_invited_to_group">הוזמנת לקבוצה</string>
|
||||
<string name="you_joined_this_group">הצטרפת לקבוצה זו</string>
|
||||
@@ -1219,7 +1219,7 @@
|
||||
<string name="your_ice_servers">שרתי ה־ICE שלך</string>
|
||||
<string name="you_will_be_connected_when_your_connection_request_is_accepted">אתם תהיו מחוברים כאשר בקשת החיבור תאושר, אנא חכו או בידקו מאוחר יותר!</string>
|
||||
<string name="profile_will_be_sent_to_contact_sending_link">הפרופיל שלך יישלח לאיש הקשר ממנו קיבלת קישור זה.</string>
|
||||
<string name="you_will_join_group">אתם תצטרפו לקבוצה אליה קישור זה מפנה ותתחברו לחברי הקבוצה.</string>
|
||||
<string name="you_will_join_group">תתחבר לכל חברי הקבוצה.</string>
|
||||
<string name="description_you_shared_one_time_link_incognito">שיתפת קישור חד־פעמי לזהות נסתרת</string>
|
||||
<string name="la_notice_turn_on">הפעלת נעילה</string>
|
||||
<string name="incognito_random_profile">הפרופיל האקראי שלך</string>
|
||||
@@ -1374,7 +1374,7 @@
|
||||
<string name="error_creating_member_contact">שגיאה ביצירת איש קשר</string>
|
||||
<string name="socks_proxy_setting_limitations"><![CDATA[<b>שימו לב</b>: ממסרי הודעות וקבצים מחוברים דרך פרוקסי SOCKS. שיחות ושליחת תצוגות מקדימות של קישורים משתמשים בחיבור ישיר.]]></string>
|
||||
<string name="encrypt_local_files">הצפין קבצים מקומיים</string>
|
||||
<string name="v5_3_new_desktop_app">אפליקציית שולחן עבודה חדשה!</string>
|
||||
<string name="v5_3_new_desktop_app">אפליקציה חדשה למחשב השולחני!</string>
|
||||
<string name="v5_3_new_interface_languages">6 שפות ממשק חדשות</string>
|
||||
<string name="v5_3_encrypt_local_files_descr">האפליקציה מצפינה קבצים מקומיים חדשים (למעט סרטונים).</string>
|
||||
<string name="you_can_change_it_later">ביטוי סיסמה אקראי מאוחסן בהגדרות כטקסט רגיל.
|
||||
@@ -1399,4 +1399,321 @@
|
||||
<string name="settings_is_storing_in_clear_text">ביטוי הסיסמה מאוחסן בהגדרות כטקסט רגיל.</string>
|
||||
<string name="member_contact_send_direct_message">שלח הודעה ישירה</string>
|
||||
<string name="rcv_group_event_member_created_contact">מחובר ישירות</string>
|
||||
<string name="terminal_always_visible">הצג קונסולה בחלון חדש</string>
|
||||
<string name="v5_5_private_notes">הערות פרטיות</string>
|
||||
<string name="v5_5_private_notes_descr">עם הצפנת קבצים ומדיה.</string>
|
||||
<string name="v5_5_new_interface_languages">ממשק משתמש בהונגרית ובטורקית</string>
|
||||
<string name="v5_5_message_delivery_descr">עם צריכת סוללה מופחתת.</string>
|
||||
<string name="remote_host_was_disconnected_title">החיבור עצר</string>
|
||||
<string name="agent_critical_error_title">שגיאה קריטית</string>
|
||||
<string name="agent_internal_error_title">שגיאה פנימית</string>
|
||||
<string name="agent_critical_error_desc">אנא דווח על כך למפתחים:
|
||||
\n%s
|
||||
\n
|
||||
\nמומלץ לאתחל מחדש את האפליקציה.</string>
|
||||
<string name="note_folder_local_display_name">הערות פרטיות</string>
|
||||
<string name="call_service_notification_audio_call">שיחה קולית</string>
|
||||
<string name="call_service_notification_video_call">שיחת וידאו</string>
|
||||
<string name="auth_open_migration_to_another_device">פתח מסך העברה</string>
|
||||
<string name="expand_verb">הרחב</string>
|
||||
<string name="code_you_scanned_is_not_simplex_link_qr_code">הקוד שסרקת אינו קוד QR של קישור SimpleX.</string>
|
||||
<string name="you_can_make_address_visible_via_settings">תוכל להפוך אותו לגלוי לאנשי הקשר שלך ב-SimpleX דרך ההגדרות.</string>
|
||||
<string name="invalid_name">שם לא חוקי!</string>
|
||||
<string name="set_passphrase">הגדר סיסמא</string>
|
||||
<string name="group_member_status_unknown_short">לא ידוע</string>
|
||||
<string name="past_member_vName">משתתף לשעבר %1$s</string>
|
||||
<string name="conn_event_enabled_pq">הצפנה קצה-אל-קצה עמידה בפני מחשוב קוונטי</string>
|
||||
<string name="group_members_2">%s ו-%s</string>
|
||||
<string name="snd_group_event_member_blocked">חסמת את %s</string>
|
||||
<string name="conn_event_disabled_pq">סטנדרט הצפנה קצה-אל-קצה</string>
|
||||
<string name="block_for_all">חסימה לכולם</string>
|
||||
<string name="block_for_all_question">לחסום משתתף להכל?</string>
|
||||
<string name="error_sending_message_contact_invitation">שגיאה בשליחת הזמנה</string>
|
||||
<string name="unblock_member_confirmation">בטל נעילה</string>
|
||||
<string name="recent_history">צפיה בהיסטוריה</string>
|
||||
<string name="v5_4_better_groups">קבוצות טובות יותר</string>
|
||||
<string name="v5_4_incognito_groups_descr">צור קבוצה באמצעות פרופיל רנדומלי.</string>
|
||||
<string name="v5_4_better_groups_descr">הצטרפות מהירה יותר והודעות אמינות יותר.</string>
|
||||
<string name="v5_4_incognito_groups">קבוצות חשאיות</string>
|
||||
<string name="v5_4_link_mobile_desktop">קשר בין האפליקציות במכשיר הנייד והמחשב השולחני! 🔗</string>
|
||||
<string name="v5_5_simpler_connect_ui">הדבק קישור כדי להתחבר!</string>
|
||||
<string name="v5_5_join_group_conversation_descr">היסטוריה אחרונה ובוט משופר.</string>
|
||||
<string name="v5_4_link_mobile_desktop_descr">דרך פרוטוקול מאובטח עמיד בפני מחשוב קוונטי</string>
|
||||
<string name="linked_mobiles">מכשירי נייד מקושרים</string>
|
||||
<string name="migrate_to_device_chat_migrated">הצ׳אט הועבר!</string>
|
||||
<string name="migrate_from_device_try_again">אתה יכול לנסות שוב.</string>
|
||||
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>אזהרה</b>: הארכיון יימחק.]]></string>
|
||||
<string name="retry_verb">נסה שוב</string>
|
||||
<string name="v5_6_quantum_resistant_encryption">הצפנה עמידה בפני מחשוב קוונטי</string>
|
||||
<string name="v5_6_app_data_migration">העברת נתוני אפליקציה</string>
|
||||
<string name="v5_6_quantum_resistant_encryption_descr">אפשר בצ\'אטים ישירים (בטא)!</string>
|
||||
<string name="v5_6_app_data_migration_descr">העבר למכשיר אחר באמצעות קוד QR.</string>
|
||||
<string name="v5_6_picture_in_picture_calls">שיחות תמונה-בתמונה</string>
|
||||
<string name="v5_6_safer_groups_descr">מנהל יכול לחסום את כל החברים בקבוצה</string>
|
||||
<string name="link_a_mobile">קשר מכשיר נייד</string>
|
||||
<string name="scan_from_mobile">סרוק מהנייד</string>
|
||||
<string name="this_device_version"><![CDATA[<i>(גרסת המכשיר הזה %s)</i>]]></string>
|
||||
<string name="unlink_desktop_question">האם לבטל את הקישור למחשב השולחני?</string>
|
||||
<string name="verify_code_with_desktop">אמת קוד עם המחשב השולחני</string>
|
||||
<string name="linked_desktops">מחשבים שולחניים מקושרים</string>
|
||||
<string name="not_compatible">לא תואם!</string>
|
||||
<string name="random_port">אקראי</string>
|
||||
<string name="remote_host_error_inactive"><![CDATA[הנייד <b>%s</b> לא פעיל]]></string>
|
||||
<string name="open_port_in_firewall_title">פתח פורט בחומת האש</string>
|
||||
<string name="remote_ctrl_error_busy">המחשב השולחני עמוס</string>
|
||||
<string name="remote_ctrl_error_disconnected">המחשב השולחני מנותק</string>
|
||||
<string name="connect_plan_you_are_already_connecting_to_vName"><![CDATA[אתה כבר מתחבר אל <b>%1$s</b>.]]></string>
|
||||
<string name="connect_plan_this_is_your_own_one_time_link">זה הקישור חד-פעמי שלך!</string>
|
||||
<string name="connect_plan_this_is_your_link_for_group_vName"><![CDATA[זהו הקישור שלך לקבוצה <b>%1$s</b>!]]></string>
|
||||
<string name="connect_plan_group_already_exists">קבוצה כבר קיימת!</string>
|
||||
<string name="restart_chat_button">התחל צ׳אט מחדש</string>
|
||||
<string name="or_paste_archive_link">או הדבק קישור ארכיון</string>
|
||||
<string name="migrate_to_device_download_failed">הורדה נכשלה</string>
|
||||
<string name="migrate_to_device_downloading_details">מוריד פרטי קישור</string>
|
||||
<string name="invalid_file_link">קישור לא תקף</string>
|
||||
<string name="migrate_to_device_migrating">מתבצעת העברה</string>
|
||||
<string name="migrate_to_device_database_init">מכין את ההורדה</string>
|
||||
<string name="migrate_to_device_bytes_downloaded">%s הורד</string>
|
||||
<string name="migrate_to_device_repeat_download">הורדה מחדש</string>
|
||||
<string name="migrate_to_device_try_again">אתה יכול לנסות שוב.</string>
|
||||
<string name="migrate_to_device_error_downloading_archive">שגיאה בהורדה של ארכיון</string>
|
||||
<string name="migrate_to_device_file_delete_or_link_invalid">הקובץ נמחק או שהקישור אינו תקף</string>
|
||||
<string name="migrate_from_device_title">העבר מכשיר</string>
|
||||
<string name="migrate_from_device_to_another_device">העבר אל מכשיר אחר</string>
|
||||
<string name="migrate_from_device_error_deleting_database">שגיאה במחיקת מסד נתונים</string>
|
||||
<string name="migrate_from_device_error_uploading_archive">שגיאה בהעלאה לארכיון</string>
|
||||
<string name="migrate_from_device_exported_file_doesnt_exist">קובץ ייצוא אינו קיים</string>
|
||||
<string name="migrate_from_device_chat_should_be_stopped">כדי להמשיך, יש לעצור את הצ\'אט.</string>
|
||||
<string name="migrate_from_device_database_init">מכין את העלאה</string>
|
||||
<string name="migrate_from_device_stopping_chat">עצירת צ׳אט</string>
|
||||
<string name="migrate_from_device_archive_and_upload">העבר לארכיון והעלאה</string>
|
||||
<string name="migrate_from_device_confirm_upload">אשר העלאה</string>
|
||||
<string name="migrate_from_device_archiving_database">העברת בסיס נתונים לארכיון</string>
|
||||
<string name="migrate_from_device_bytes_uploaded">%s העלה</string>
|
||||
<string name="migrate_from_device_uploading_archive">העלאת ארכיון</string>
|
||||
<string name="migrate_from_device_cancel_migration">בטל העברה</string>
|
||||
<string name="migrate_from_device_finalize_migration">סיים את ההעברה</string>
|
||||
<string name="migrate_from_device_repeat_upload">העלאה מחדש</string>
|
||||
<string name="migrate_from_device_or_share_this_file_link">או שתף באופן מאובטח את קישור הקובץ הזה</string>
|
||||
<string name="migrate_from_device_delete_database_from_device">מחק את המסד נתונים מהמכשיר.</string>
|
||||
<string name="migrate_from_device_starting_chat_on_multiple_devices_unsupported">אזהרה: התחלת צ׳אט על מספר מכשירים אינה נתמכת ויכולה לגרום בבעיות בהעברת הודעות</string>
|
||||
<string name="migrate_from_device_start_chat">התחל צ׳אט</string>
|
||||
<string name="migrate_from_device_migration_complete">העברה הושלמה</string>
|
||||
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[אתה <b>חייב לא</b> להשתמש באותה מסד נתונים על שני מכשירים.]]></string>
|
||||
<string name="migrate_from_device_check_connection_and_try_again">תבדוק את החיבור לאינטרנט ונסה שוב</string>
|
||||
<string name="migrate_from_device_error_verifying_passphrase">שגיאה באימות סיסמה:</string>
|
||||
<string name="migrate_from_device_verify_database_passphrase">אימות סיסמא של מסד נתונים</string>
|
||||
<string name="migrate_from_device_verify_passphrase">אימות סיסמא</string>
|
||||
<string name="connect_plan_you_are_already_joining_the_group_via_this_link">אתה כבר מצטרף לקבוצה באמצעות הקישור הזה.</string>
|
||||
<string name="remote_host_disconnected_from"><![CDATA[נותק מהנייד <b>%s</b> מהסיבה: %s]]></string>
|
||||
<string name="remote_host_error_missing"><![CDATA[הנייד <b>%s</b> חסר]]></string>
|
||||
<string name="connect_plan_already_connecting">כבר מחובר!</string>
|
||||
<string name="blocked_by_admin_item_description">חסום על ידי מנהל</string>
|
||||
<string name="failed_to_create_user_invalid_desc">שם התצוגה הזה אינו חוקי. אנא בחר שם אחר.</string>
|
||||
<string name="error_deleting_note_folder">שגיאה במחיקת הערות פרטיות</string>
|
||||
<string name="loading_chats">טעינת צ׳אטים…</string>
|
||||
<string name="connect_with_contact_name_question">להתחבר עם %1$s?</string>
|
||||
<string name="new_chat">צ׳אט חדש</string>
|
||||
<string name="or_show_this_qr_code">או הצג את הקוד הזה</string>
|
||||
<string name="or_scan_qr_code">או סרוק קוד QR</string>
|
||||
<string name="keep_invitation_link">שמור</string>
|
||||
<string name="snd_group_event_member_unblocked">ביטלת חסימה של %s</string>
|
||||
<string name="group_member_role_author">מחבר</string>
|
||||
<string name="saved_message_title">הודעה נשמרה</string>
|
||||
<string name="unblock_for_all_question">האם לבטל חסימה של משתתף לכולם?</string>
|
||||
<string name="unblock_for_all">בטל חסימה לכולם</string>
|
||||
<string name="member_blocked_by_admin">חסום על ידי מנהל</string>
|
||||
<string name="member_info_member_blocked">חסום</string>
|
||||
<string name="error_blocking_member_for_all">שגיאה בחסימת משתתף לכולם</string>
|
||||
<string name="v5_5_simpler_connect_ui_descr">שורת החיפוש מקבלת קישורי הזמנה.</string>
|
||||
<string name="v5_5_join_group_conversation">הצטרף לשיחות קבוצתיות</string>
|
||||
<string name="v5_5_message_delivery">שיפור במסירת הודעות</string>
|
||||
<string name="remote_ctrl_error_inactive">מחשב שולחני לא פעיל</string>
|
||||
<string name="connect_plan_connect_via_link">להתחבר דרך קישור?</string>
|
||||
<string name="agent_internal_error_desc">אנא דווח על כך למפתחים:
|
||||
\n%s</string>
|
||||
<string name="start_chat_question">האם להתחיל צ׳אט?</string>
|
||||
<string name="unlink_desktop">בטל קישור</string>
|
||||
<string name="call_service_notification_end_call">סיום שיחה</string>
|
||||
<string name="tap_to_scan">לחץ לסריקה</string>
|
||||
<string name="create_group_button_to_create_new_group"><![CDATA[<b>צור קבוצה</b>: כדי ליצור קבוצה חדשה.]]></string>
|
||||
<string name="clear_note_folder_question">למחוק הערות פרטיות?</string>
|
||||
<string name="add_contact_tab">הוסף איש קשר</string>
|
||||
<string name="you_can_view_invitation_link_again">תוכל לראות את קישור ההזמנה שוב בפרטי החיבור.</string>
|
||||
<string name="keep_unused_invitation_question">האם לשמור הזמנה שלא נעשה בה שימוש?</string>
|
||||
<string name="the_text_you_pasted_is_not_a_link">הטקסט שהדבקת אינו קישור של SimpleX.</string>
|
||||
<string name="show_slow_api_calls">הצג קריאות API איטיות</string>
|
||||
<string name="developer_options_section">אפשרויות למפתח</string>
|
||||
<string name="create_another_profile_button">צור פרופיל</string>
|
||||
<string name="rcv_group_and_other_events">ו %d שאר האירועים</string>
|
||||
<string name="profile_update_event_set_new_address">הגדר כתובת איש קשר חדש</string>
|
||||
<string name="contact_tap_to_connect">לחץ לחיבור</string>
|
||||
<string name="unable_to_open_browser_desc">דפדפן האינטרנט המוגדר כברירת מחדל נדרש לשיחות. אנא הגדר דפדפן ברירת מחדל במערכת, ושתף מידע נוסף עם המפתחים.</string>
|
||||
<string name="e2ee_info_no_pq_short">השיחה הזו מוגנת באמצעות הצפנה קצה-אל-קצה.</string>
|
||||
<string name="e2ee_info_pq_short">השיחה הזו מוגנת באמצעות הצפנה קצה-אל-קצה עמידה בפני מחשוב קוונטי.</string>
|
||||
<string name="connect_plan_this_is_your_own_simplex_address">זהו כתובת ה-SimpleX שלך!</string>
|
||||
<string name="remote_host_error_timeout"><![CDATA[הסתיים פסק הזמן הקצוב להתחברות למכשיר נייד <b>%s</b>]]></string>
|
||||
<string name="clear_note_folder_warning">כל ההודעות יימחקו- לא ניתן לשוב לאחור</string>
|
||||
<string name="block_member_desc">כל ההודעות החדשות מ %s יהיו מוחבאות</string>
|
||||
<string name="remote_ctrl_error_bad_state">החיבור לשולחן העבודה נמצא במצב לקוי</string>
|
||||
<string name="correct_name_to">לתקן את השם ל-%s?</string>
|
||||
<string name="migrate_from_device_all_data_will_be_uploaded">כל אנשי הקשר שלך, שיחות וקבצים יהיו מוצפנים באופן מאובטח ויעלו בחתיכות לריליים של XFTP שהוגדרו.</string>
|
||||
<string name="migrate_to_device_apply_onion">החל</string>
|
||||
<string name="la_app_passcode">קוד עבור אפליקציה</string>
|
||||
<string name="add_contact_button_to_create_link_or_connect_via_link"><![CDATA[<b>הוסף איש קשר</b>: כדי ליצור קישור הזמנה חדש, או להתחבר דרך קישור שקיבלת.]]></string>
|
||||
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>שים לב</b>: שימוש באותו מסד נתונים על שני מכשירים ישבור את הפענוח ההצפנה של ההודעות מהחיבורים שלך, נועד כהגנה בטחונית.]]></string>
|
||||
<string name="chat_is_stopped_you_should_transfer_database">הצ\'אט נסגר. אם כבר השתמשת במסד נתונים זה במכשיר אחר, עליך להעבירו חזרה לפני שתתחיל בצ\'אט.</string>
|
||||
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[בחר <i>העבר ממכשיר אחר</i> במכשיר החדש וסרוק קוד QR.]]></string>
|
||||
<string name="migrate_to_device_confirm_network_settings">אשר הגדרות רשת</string>
|
||||
<string name="migrate_from_device_confirm_you_remember_passphrase">אשר שאתה זוכר את סיסמת מסד הנתונים כדי להעביר אותו.</string>
|
||||
<string name="connected_desktop">התחבר למחשב השולחני</string>
|
||||
<string name="migrate_from_device_creating_archive_link">יוצר קישור ארכיון</string>
|
||||
<string name="creating_link">יוצר קישור…</string>
|
||||
<string name="delete_and_notify_contact">מחק והודע לאיש קשר</string>
|
||||
<string name="delete_messages__question">האם למחוק %d הודעות?</string>
|
||||
<string name="remote_ctrl_error_bad_version">למחשב השולחני יש גרסה שאינה נתמכת. אנא, ודא שאתה משתמש באותה גרסה על שני המכשירים</string>
|
||||
<string name="remote_ctrl_error_bad_invitation">למחשב השולחני יש קוד הזמנה שגוי</string>
|
||||
<string name="migrate_to_device_downloading_archive">מוריד ארכיון</string>
|
||||
<string name="enable_camera_access">אפשר גישה למצלמה</string>
|
||||
<string name="encryption_renegotiation_error">שגיאת משא ומתן מחדש של הצפנה</string>
|
||||
<string name="alert_text_encryption_renegotiation_failed">המשא ומתן מחדש של ההצפנה נכשל.</string>
|
||||
<string name="migrate_to_device_enter_passphrase">הזן סיסמא</string>
|
||||
<string name="error_alert_title">שגיאה</string>
|
||||
<string name="error_creating_message">שגיאה ביצירת הודעה</string>
|
||||
<string name="migrate_from_device_error_exporting_archive">שגיאה בייצוא מסד נתוני צ\'אט</string>
|
||||
<string name="unable_to_open_browser_title">שגיאה בפתיחת דפדפן</string>
|
||||
<string name="migrate_from_device_error_saving_settings">שגיאה בשמירת אפשרויות</string>
|
||||
<string name="migrate_to_device_finalize_migration">סיים את ההעברה על מכשיר נוסף.</string>
|
||||
<string name="invalid_qr_code">קוד QR לא חוקי</string>
|
||||
<string name="recent_history_is_not_sent_to_new_members">ההיסטוריה לא נשלחת לחברים חדשים.</string>
|
||||
<string name="migrate_to_device_import_failed">יבוא נכשל</string>
|
||||
<string name="migrate_to_device_importing_archive">מייבא ארכיון</string>
|
||||
<string name="connect_plan_join_your_group">האם להצטרף אל הקבוצה?</string>
|
||||
<string name="new_desktop"><![CDATA[<i>(חדש)</i>]]></string>
|
||||
<string name="profile_update_event_member_name_changed">משתתף %1$s השתנה ל-%2$s</string>
|
||||
<string name="e2ee_info_no_pq"><![CDATA[הודעות, קבצים ושיחות מוגנים על ידי <b>הצפנה מקצה לקצה</b> עם סודיות קדימה מושלמת, הכחשה ושחזור לאחר פריצה.]]></string>
|
||||
<string name="e2ee_info_pq"><![CDATA[הודעות, קבצים ושיחות מוגנים על ידי <b>הצפנה מקצה לקצה עמידה בפני מחשוב קוונטי</b> עם סודיות קדימה מושלמת, הכחשה ושחזור לאחר פריצה.]]></string>
|
||||
<string name="migrate_from_another_device">העבר ממכשיר אחר</string>
|
||||
<string name="migrate_to_device_title">העבר לכאן</string>
|
||||
<string name="remote_host_error_busy"><![CDATA[הנייד <b>%s</b> תפוס]]></string>
|
||||
<string name="multicast_discoverable_via_local_network">ניתן לגילוי דרך רשת מקומית</string>
|
||||
<string name="camera_not_available">מצלמה לא זמינה</string>
|
||||
<string name="no_connected_mobile">אין מכשיר נייד מחובר</string>
|
||||
<string name="paste_archive_link">הדבק לינק ארכיון</string>
|
||||
<string name="migrate_to_device_confirm_network_settings_footer">אנא אשר שהגדרות הרשת נכונות למכשיר זה.</string>
|
||||
<string name="refresh_qr_code">רענון</string>
|
||||
<string name="migrate_to_device_repeat_import">יבוא מחדש</string>
|
||||
<string name="v5_6_safer_groups">קבוצות בטוחות יותר</string>
|
||||
<string name="verify_connection">אימות חיבור</string>
|
||||
<string name="open_port_in_firewall_desc">כדי לאפשר לאפליקציה במכשיר הנייד להתחבר למחשב השולחני, פתח את הפורט הזה בחומת האש שלך, אם היא מופעלת</string>
|
||||
<string name="connect_plan_you_have_already_requested_connection_via_this_address">כבר ביקשת להתחבר באמצעות כתובת זו!</string>
|
||||
<string name="rcv_group_event_member_unblocked">ביטלת חסימה של %s</string>
|
||||
<string name="unblock_member_button">בטל חסימה של משתתף</string>
|
||||
<string name="unblock_member_question">האם לבטל חסימה עבור משתתף?</string>
|
||||
<string name="migrate_from_device_upload_failed">העלאה נכשלה</string>
|
||||
<string name="v5_6_picture_in_picture_calls_descr">השתמש באפליקציה במהלך השיחה.</string>
|
||||
<string name="show_internal_errors">הצג שגיאות פנימיות</string>
|
||||
<string name="enable_sending_recent_history">שלח עד 100 הודעות אחרונות לחברים חדשים.</string>
|
||||
<string name="disable_sending_recent_history">אל תשלח היסטוריה לחברים חדשים.</string>
|
||||
<string name="recent_history_is_sent_to_new_members">עד 100 ההודעות האחרונות נשלחות לחברים חדשים.</string>
|
||||
<string name="session_code">קוד סשן</string>
|
||||
<string name="remote_host_error_disconnected"><![CDATA[מכשיר נייד <b>%s</b> התנתק]]></string>
|
||||
<string name="remote_host_error_bad_state"><![CDATA[החיבור לנייד <b>%s</b> נמצא במצב לקוי]]></string>
|
||||
<string name="remote_host_error_bad_version"><![CDATA[הנייד <b>%s</b> משתמש בגרסה שאינה נתמכת. אנא, ודא שאתה משתמש באותה גרסה על שני המכשירים]]></string>
|
||||
<string name="failed_to_create_user_invalid_title">שם תצוגה לא חוקי!</string>
|
||||
<string name="search_or_paste_simplex_link">חפש או הדבק קישור של SimpleX</string>
|
||||
<string name="verify_code_on_mobile">אמת קוד במכשיר הנייד</string>
|
||||
<string name="remote_ctrl_was_disconnected_title">החיבור עצר</string>
|
||||
<string name="non_content_uri_alert_title">נתיב קובץ לא חוקי</string>
|
||||
<string name="non_content_uri_alert_text">שיתפת נתיב קובץ לא חוקי. דווח על הבעיה למפתחי האפליקציה.</string>
|
||||
<string name="moderated_items_description">%1$d הודעות שנערכו על ידי %2$s</string>
|
||||
<string name="marked_deleted_items_description">%d הודעות סומנו כנמחקות</string>
|
||||
<string name="connect_plan_repeat_connection_request">האם לחזור על בקשת החיבור?</string>
|
||||
<string name="blocked_item_description">חסום</string>
|
||||
<string name="blocked_items_description">%d הודעות נחסמו</string>
|
||||
<string name="loading_remote_file_desc">אנא המתן בזמן שהקובץ נטען מהמכשיר הנייד המקושר</string>
|
||||
<string name="button_remove_member_question">האם להסיר משתתף?</string>
|
||||
<string name="disconnect_remote_host">מנותק</string>
|
||||
<string name="disconnect_desktop_question">האם לנתק את המחשב השולחני?</string>
|
||||
<string name="disconnect_remote_hosts">נתק מכשירי נייד</string>
|
||||
<string name="only_one_device_can_work_at_the_same_time">רק מכשיר אחד יכול לעבוד בו זמנית.</string>
|
||||
<string name="waiting_for_desktop">ממתין למחשב השולחני…</string>
|
||||
<string name="open_on_mobile_and_scan_qr_code"><![CDATA[פתח <i>שימוש ממחשב שולחני</i> באפליקציה בנייד וסרוק קוד QR.]]></string>
|
||||
<string name="database_migration_in_progress">העברת מסד הנתונים בתהליך.
|
||||
\nזה עשוי לקחת כמה דקות.</string>
|
||||
<string name="blocked_by_admin_items_description">%d הודעות נחסמו על ידי מנהל</string>
|
||||
<string name="app_was_crashed">מסך קרס</string>
|
||||
<string name="video_decoding_exception_desc">לא ניתן לפענח את הווידאו. אנא נסה וידאו אחר או צור קשר עם המפתחים.</string>
|
||||
<string name="share_this_1_time_link">שתף את הקישור הזמנה החד-פעמי הזה</string>
|
||||
<string name="tap_to_paste_link">לחץ להדבקת קישור</string>
|
||||
<string name="loading_remote_file_title">טעינה של הקובץ</string>
|
||||
<string name="settings_section_title_use_from_desktop">שימוש ממחשב שולחני</string>
|
||||
<string name="rcv_group_event_member_blocked">חסומים %s</string>
|
||||
<string name="rcv_direct_event_contact_deleted">מחק איש קשר</string>
|
||||
<string name="rcv_group_events_count">%d אירועי קבוצה</string>
|
||||
<string name="group_members_n">%s, %s ו-%d חברים</string>
|
||||
<string name="profile_update_event_contact_name_changed">איש הקשר %1$s השתנה ל-%2$s</string>
|
||||
<string name="profile_update_event_removed_address">כתובת איש קשר הוסרה</string>
|
||||
<string name="profile_update_event_removed_picture">תמונת פרופיל הוסרה</string>
|
||||
<string name="profile_update_event_set_new_picture">הגדר תמונת פרופיל חדשה</string>
|
||||
<string name="profile_update_event_updated_profile">עדכן פרופיל</string>
|
||||
<string name="group_member_status_unknown">מצב לא ידוע</string>
|
||||
<string name="info_row_created_at">נוצר ב</string>
|
||||
<string name="share_text_created_at">נוצר בתאריך: %s</string>
|
||||
<string name="message_too_large">הודעה ארוכה מדי</string>
|
||||
<string name="welcome_message_is_too_long">הודעת ברוכים הבאים ארוכה מדי</string>
|
||||
<string name="connected_mobile">התחבר לנייד</string>
|
||||
<string name="connected_to_desktop">התחבר למחשב השולחני</string>
|
||||
<string name="connected_to_mobile">התחבר לנייד</string>
|
||||
<string name="connecting_to_desktop">התחבר למחשב השולחני</string>
|
||||
<string name="connect_to_desktop">חיבור למחשב השולחני</string>
|
||||
<string name="desktop_app_version_is_incompatible">גרסת אפליקציית שולחן העבודה %s אינה תואמת לאפליקציה זו.</string>
|
||||
<string name="devices">מכשירים</string>
|
||||
<string name="error">שגיאה</string>
|
||||
<string name="desktop_incompatible_version">גירסא לא מתאימה</string>
|
||||
<string name="found_desktop">מצא מחשב שולחני</string>
|
||||
<string name="new_mobile_device">מכשיר נייד חדש</string>
|
||||
<string name="this_device_name">השם של המכשיר הזה</string>
|
||||
<string name="multicast_connect_automatically">התחבר אוטומטית</string>
|
||||
<string name="error_showing_message">שגיאה בהצגת הודעה</string>
|
||||
<string name="error_showing_content">שגיאה בהצגת תוכן</string>
|
||||
<string name="rcv_group_event_1_member_connected">%s מחובר</string>
|
||||
<string name="block_member_confirmation">חסום</string>
|
||||
<string name="block_member_button">חסום משתתף</string>
|
||||
<string name="block_member_question">לחסום משתתף?</string>
|
||||
<string name="unblock_member_desc">הודעות מ-%s יוצגו!</string>
|
||||
<string name="create_group_button">צור קבוצה</string>
|
||||
<string name="this_device">המכשיר הזה</string>
|
||||
<string name="v5_4_more_things_descr">- אפשרות להודיע לאנשי קשר שנמחקו.
|
||||
\n- שמות פרופיל עם רווחים.
|
||||
\n- ועוד!</string>
|
||||
<string name="v5_4_block_group_members_descr">כדי להסתיר הודעות לא רצויות.</string>
|
||||
<string name="v5_4_block_group_members">תחסום חברים בקבוצה</string>
|
||||
<string name="desktop_device">מחשב שולחני</string>
|
||||
<string name="desktop_address">כתובת של המחשב השולחני</string>
|
||||
<string name="paste_desktop_address">הדבק כתובת של המחשב שולחני</string>
|
||||
<string name="scan_qr_code_from_desktop">סרוק קוד QR מהמחשב השולחני</string>
|
||||
<string name="connect_plan_connect_to_yourself">להתחבר אל עצמך?</string>
|
||||
<string name="verify_connections">אימות חיבורים</string>
|
||||
<string name="discover_on_network">גלה דרך רשת מקומית</string>
|
||||
<string name="linked_desktop_options">האפשרויות של המחשב השולחני מקושרות</string>
|
||||
<string name="desktop_devices">מחשבים שולחניים</string>
|
||||
<string name="connect_plan_you_are_already_connecting_via_this_one_time_link">אתה כבר מתחבר באמצעות קישור חד-פעמי זה!</string>
|
||||
<string name="connect_plan_open_group">פתח קבוצה</string>
|
||||
<string name="connect_plan_you_are_already_in_group_vName"><![CDATA[אתה כבר בקבוצה <b>%1$s</b>.]]></string>
|
||||
<string name="connect_plan_repeat_join_request">האם לחזור על בקשת הצטרפות?</string>
|
||||
<string name="bad_desktop_address">הכתובת של המחשב השולחני שגויה</string>
|
||||
<string name="remote_host_was_disconnected_toast"><![CDATA[מכשיר נייד <b>%s</b> התנתק]]></string>
|
||||
<string name="this_device_name_shared_with_mobile">שם המכשיר ישותף עם מכשיר הנייד המחובר.</string>
|
||||
<string name="enter_this_device_name">הזן את שם המכשיר הזה…</string>
|
||||
<string name="possible_slow_function_desc">ביצוע הפונקציה לוקח זמן רב מדי: %1$d שניות: %2$s</string>
|
||||
<string name="possible_slow_function_title">פונקציה איטית</string>
|
||||
<string name="desktop_connection_terminated">החיבור הופסק</string>
|
||||
<string name="remote_ctrl_disconnected_with_reason">נותק מהסיבה: %s</string>
|
||||
<string name="waiting_for_mobile_to_connect">ממתין לחיבור עם מכשיר נייד:</string>
|
||||
<string name="create_chat_profile">צור פרופיל צאט</string>
|
||||
<string name="connect_plan_already_joining_the_group">כבר הצטרפת לקבוצה!</string>
|
||||
<string name="connect_plan_you_are_already_joining_the_group_vName"><![CDATA[אתה כבר מצטרף לקבוצה <b>%1$s</b>.]]></string>
|
||||
<string name="remove_member_button">הסר משתתף</string>
|
||||
<string name="remote_ctrl_error_timeout">הסתיים פסק הזמן הקצוב להתחברות למחשב השולחני</string>
|
||||
</resources>
|
||||
@@ -191,7 +191,7 @@
|
||||
<string name="v4_3_improved_server_configuration">サーバ設定の向上</string>
|
||||
<string name="v4_3_improved_privacy_and_security">プライバシーとセキュリティ強化</string>
|
||||
<string name="settings_section_title_incognito">シークレットモード</string>
|
||||
<string name="new_in_version">%s バージョンアップで新しい</string>
|
||||
<string name="new_in_version">%s の新機能</string>
|
||||
<string name="new_passphrase">新しい暗証フレーズ</string>
|
||||
<string name="chat_item_ttl_none">一度も</string>
|
||||
<string name="notification_preview_new_message">新しいメッセージ</string>
|
||||
@@ -838,7 +838,7 @@
|
||||
<string name="you_are_invited_to_group">グループ招待が届きました</string>
|
||||
<string name="network_option_seconds_label">秒</string>
|
||||
<string name="network_option_tcp_connection_timeout">TCP接続タイムアウト</string>
|
||||
<string name="save_group_profile">保存グループのプロフィール</string>
|
||||
<string name="save_group_profile">グループプロフィールの保存</string>
|
||||
<string name="v4_3_irreversible_message_deletion_desc">連絡先がメッセージの完全削除を許可できます。</string>
|
||||
<string name="failed_to_create_user_duplicate_desc">同じ表示名前のチャットプロフィールが既にあります。別のを選んでください。</string>
|
||||
<string name="smp_server_test_secure_queue">セキュアな未送信メッセージ</string>
|
||||
@@ -1593,4 +1593,127 @@
|
||||
<string name="possible_slow_function_title">遅延が発生した機能</string>
|
||||
<string name="show_slow_api_calls">遅いAPIコールを表示</string>
|
||||
<string name="group_member_status_unknown">ステータス不明</string>
|
||||
<string name="v5_5_private_notes">プライベートノート</string>
|
||||
<string name="v5_5_message_delivery">メッセージ配信の改善</string>
|
||||
<string name="e2ee_info_no_pq"><![CDATA[メッセージ、ファイル、通話は、前方秘匿性、否認防止および及び侵入復元性を備えた <b>エンドツーエンドの暗号化</b>によって保護されます。]]></string>
|
||||
<string name="e2ee_info_pq"><![CDATA[メッセージ、ファイル、通話は、前方秘匿性、否認防止および及び侵入復元性を備えた <b>耐量子E2E暗号化</b>によって保護されます。]]></string>
|
||||
<string name="e2ee_info_no_pq_short">このチャットはエンドツーエンド暗号化により保護されています。</string>
|
||||
<string name="e2ee_info_pq_short">このチャットは耐量子エンドツーエンド暗号化により保護されています。</string>
|
||||
<string name="note_folder_local_display_name">プライベートノート</string>
|
||||
<string name="call_service_notification_end_call">通話終了</string>
|
||||
<string name="unable_to_open_browser_title">ブラウザ起動エラー</string>
|
||||
<string name="migrate_from_another_device">別の端末から移行</string>
|
||||
<string name="set_passphrase">暗証フレーズを設定</string>
|
||||
<string name="snd_group_event_member_blocked">%s をブロック済</string>
|
||||
<string name="member_blocked_by_admin">管理者によりブロック済</string>
|
||||
<string name="v5_5_private_notes_descr">暗号化されたファイルとメディア</string>
|
||||
<string name="v5_5_simpler_connect_ui">リンクの貼り付けで接続する!</string>
|
||||
<string name="v5_5_simpler_connect_ui_descr">検索バーに招待リンクを貼り付けて接続。</string>
|
||||
<string name="v5_6_quantum_resistant_encryption">耐量子暗号化チャット</string>
|
||||
<string name="v5_6_picture_in_picture_calls">ピクチャー イン ピクチャー 通話</string>
|
||||
<string name="v5_6_app_data_migration_descr">QRコードを利用して別のデバイスに移行できます。</string>
|
||||
<string name="v5_6_safer_groups">より安全なグループ</string>
|
||||
<string name="migrate_to_device_title">ここから移行</string>
|
||||
<string name="migrate_to_device_migrating">移行中</string>
|
||||
<string name="migrate_to_device_database_init">ダウンロードの準備中</string>
|
||||
<string name="invalid_file_link">無効なリンク</string>
|
||||
<string name="migrate_to_device_download_failed">ダウンロード失敗</string>
|
||||
<string name="migrate_to_device_repeat_download">再ダウンロード</string>
|
||||
<string name="migrate_to_device_try_again">もう一度お試し下さい。</string>
|
||||
<string name="migrate_to_device_bytes_downloaded">%s ダウンロード済</string>
|
||||
<string name="migrate_to_device_importing_archive">アーカイブをインポート中</string>
|
||||
<string name="migrate_to_device_import_failed">インポート失敗</string>
|
||||
<string name="migrate_to_device_chat_migrated">チャット移行済み!</string>
|
||||
<string name="migrate_to_device_finalize_migration">別のデバイスで移行を確定してください。</string>
|
||||
<string name="migrate_to_device_file_delete_or_link_invalid">ファイルが削除されているか、リンクが無効です</string>
|
||||
<string name="migrate_to_device_error_downloading_archive">アーカイブダウンロードエラー</string>
|
||||
<string name="migrate_to_device_apply_onion">適用</string>
|
||||
<string name="migrate_from_device_title">端末の移行</string>
|
||||
<string name="migrate_from_device_to_another_device">別の端末に移行</string>
|
||||
<string name="migrate_from_device_error_saving_settings">設定保存エラー</string>
|
||||
<string name="migrate_from_device_error_exporting_archive">チャットデータベースエクスポートエラー</string>
|
||||
<string name="migrate_from_device_database_init">アップロード準備中</string>
|
||||
<string name="migrate_from_device_error_deleting_database">データベース削除エラー</string>
|
||||
<string name="migrate_from_device_error_uploading_archive">アーカイブアップロードエラー</string>
|
||||
<string name="migrate_from_device_chat_should_be_stopped">続けるには、チャットを停止する必要があります。</string>
|
||||
<string name="migrate_from_device_archive_and_upload">アーカイブとアップロード</string>
|
||||
<string name="migrate_from_device_confirm_upload">アップロードの確認</string>
|
||||
<string name="migrate_from_device_bytes_uploaded">%s アップロード中</string>
|
||||
<string name="migrate_from_device_upload_failed">アップロード失敗</string>
|
||||
<string name="migrate_from_device_archiving_database">データベースをアーカイブ中</string>
|
||||
<string name="migrate_from_device_uploading_archive">アーカイブのアップロード中</string>
|
||||
<string name="migrate_from_device_cancel_migration">移行の中止</string>
|
||||
<string name="migrate_from_device_finalize_migration">移行の確定</string>
|
||||
<string name="migrate_from_device_creating_archive_link">アーカイブリンクの作成中</string>
|
||||
<string name="migrate_from_device_delete_database_from_device">この端末からデータベースを削除</string>
|
||||
<string name="migrate_from_device_or_share_this_file_link">ファイルリンクで安全に共有する</string>
|
||||
<string name="migrate_from_device_migration_complete">移行完了</string>
|
||||
<string name="migrate_from_device_start_chat">チャット開始</string>
|
||||
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[2つの端末上で同じデータベースを使用することは<b>できません</b>。]]></string>
|
||||
<string name="migrate_from_device_verify_passphrase">パスフレーズの検証</string>
|
||||
<string name="migrate_from_device_verify_database_passphrase">データベースパスフレーズの検証</string>
|
||||
<string name="migrate_from_device_check_connection_and_try_again">インターネット接続を確認して再試行してください</string>
|
||||
<string name="migrate_from_device_confirm_you_remember_passphrase">移行するデータベースのパスフレーズを覚えていることを確認して下さい。</string>
|
||||
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>警告</b>: アーカイブデータは削除されます。]]></string>
|
||||
<string name="migrate_from_device_error_verifying_passphrase">パスフレーズ検証エラー:</string>
|
||||
<string name="error_deleting_note_folder">プライベートノート削除エラー</string>
|
||||
<string name="share_text_created_at">送信日: %s</string>
|
||||
<string name="block_for_all">全てをブロック</string>
|
||||
<string name="block_for_all_question">このメンバーをブロックしますか?</string>
|
||||
<string name="member_info_member_blocked">ブロック中</string>
|
||||
<string name="v5_5_join_group_conversation">グループ会話への参加</string>
|
||||
<string name="call_service_notification_audio_call">音声通話</string>
|
||||
<string name="call_service_notification_video_call">ビデオ通話</string>
|
||||
<string name="blocked_by_admin_item_description">管理者によりブロック済</string>
|
||||
<string name="v5_6_app_data_migration">アプリデータの移行</string>
|
||||
<string name="v5_6_safer_groups_descr">グループ管理者は、他のすべてのメンバーに対してメンバーをブロックできます。</string>
|
||||
<string name="v5_6_picture_in_picture_calls_descr">通話中にアプリが利用できます。</string>
|
||||
<string name="v5_6_quantum_resistant_encryption_descr">ダイレクトチャットで有効にする(ベータ版)!</string>
|
||||
<string name="welcome_message_is_too_long">ウェルカムメッセージが長すぎます</string>
|
||||
<string name="clear_note_folder_warning">全てのメッセージが削除されます - これは元に戻せません!</string>
|
||||
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[新しい端末で<i>別の端末に移行</i>を選択し、QRコードをスキャンします。]]></string>
|
||||
<string name="migrate_from_device_all_data_will_be_uploaded">すべての連絡先、会話、ファイルは安全に暗号化され、設定されたXFTPリレーに分割でアップロードされます。</string>
|
||||
<string name="unblock_for_all">ブロックの解除</string>
|
||||
<string name="unblock_for_all_question">ブロックを解除しますか?</string>
|
||||
<string name="blocked_by_admin_items_description">%d のメッセージが管理者によりブロック済</string>
|
||||
<string name="snd_group_event_member_unblocked">%s のブロックを解除</string>
|
||||
<string name="migrate_to_device_enter_passphrase">パスフレーズの入力</string>
|
||||
<string name="migrate_from_device_exported_file_doesnt_exist">エクスポートされたファイルが存在しません</string>
|
||||
<string name="info_row_created_at">送信日</string>
|
||||
<string name="message_too_large">メッセージが長すぎます</string>
|
||||
<string name="database_migration_in_progress">データベース移行の進行中。
|
||||
\nこれには数分掛かる場合があります。</string>
|
||||
<string name="clear_note_folder_question">プライベートノートを消しますか?</string>
|
||||
<string name="v5_5_new_interface_languages">ハンガリー語、トルコ語</string>
|
||||
<string name="v5_5_message_delivery_descr">バッテリー使用量低減</string>
|
||||
<string name="v5_5_join_group_conversation_descr">最近のメッセージ履歴送信機能追加とディレクトリボットの改善が行われました。</string>
|
||||
<string name="migrate_to_device_downloading_details">リンクの詳細をダウンロード中</string>
|
||||
<string name="migrate_to_device_downloading_archive">アーカイブをダウンロード中</string>
|
||||
<string name="error_creating_message">メッセージ作成エラー</string>
|
||||
<string name="rcv_group_event_member_unblocked">%s のブロックを解除</string>
|
||||
<string name="profile_update_event_removed_address">アドレスが削除されました</string>
|
||||
<string name="or_paste_archive_link">アーカイブリンクを貼り付け</string>
|
||||
<string name="paste_archive_link">アーカイブリンクの貼り付け</string>
|
||||
<string name="migrate_to_device_repeat_import">再インポート</string>
|
||||
<string name="migrate_from_device_try_again">もう一度お試し下さい。</string>
|
||||
<string name="migrate_from_device_starting_chat_on_multiple_devices_unsupported">警告:複数端末でのチャット利用はサポートされていません。</string>
|
||||
<string name="profile_update_event_set_new_address">新しいアドレスが設定されました</string>
|
||||
<string name="error_blocking_member_for_all">メンバーブロックエラー</string>
|
||||
<string name="rcv_group_event_member_blocked">%s をブロック済</string>
|
||||
<string name="conn_event_disabled_pq">標準的のエンドツーエンド暗号化</string>
|
||||
<string name="conn_event_enabled_pq">耐量子エンドツーエンド暗号化</string>
|
||||
<string name="migrate_from_device_repeat_upload">再アップロード</string>
|
||||
<string name="profile_update_event_contact_name_changed">連絡先 %1$s が %2$s に変更されました</string>
|
||||
<string name="profile_update_event_set_new_picture">新しいプロフィール画像が設定されました</string>
|
||||
<string name="profile_update_event_removed_picture">プロフィール画像が削除されました</string>
|
||||
<string name="auth_open_migration_to_another_device">移行画面を開く</string>
|
||||
<string name="unable_to_open_browser_desc">通話には既定のウェブブラウザが必要です。既定のブラウザを設定し、開発者へ情報を共有してください。</string>
|
||||
<string name="profile_update_event_updated_profile">プロフィール更新済</string>
|
||||
<string name="profile_update_event_member_name_changed">メンバーの %1$sが %2$sに名前変更済</string>
|
||||
<string name="migrate_to_device_confirm_network_settings">ネットワーク設定を確認してください</string>
|
||||
<string name="migrate_to_device_confirm_network_settings_footer">この端末のネットワーク設定が正しいことを確認してください。</string>
|
||||
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>注意</b>: 2つの端末で同じデータベースを使用すると、セキュリティ保護として、あなたが接続しているメッセージの復号化が解除されます。]]></string>
|
||||
<string name="saved_message_title">メッセージ保存済</string>
|
||||
<string name="migrate_from_device_stopping_chat">チャット停止中</string>
|
||||
<string name="error_showing_desktop_notification">エラーが表示された場合は、開発者に連絡してください。</string>
|
||||
</resources>
|
||||
@@ -595,7 +595,7 @@
|
||||
<string name="feature_offered_item">voorgesteld %s</string>
|
||||
<string name="store_passphrase_securely_without_recover">Sla het wachtwoord veilig op. Als u deze kwijtraakt, heeft u GEEN toegang tot de gesprekken.</string>
|
||||
<string name="store_passphrase_securely">Bewaar het wachtwoord veilig, u kunt deze NIET wijzigen als u deze kwijtraakt.</string>
|
||||
<string name="open_chat">Gesprekken openen</string>
|
||||
<string name="open_chat">Chat openen</string>
|
||||
<string name="restore_database_alert_desc">Voer het vorige wachtwoord in na het herstellen van de database back-up. Deze actie kan niet ongedaan gemaakt worden.</string>
|
||||
<string name="icon_descr_call_pending_sent">Oproep in behandeling</string>
|
||||
<string name="simplex_link_mode_browser_warning">Het openen van de link in de browser kan de privacy en beveiliging van de verbinding verminderen. Niet vertrouwde SimpleX links worden rood weergegeven.</string>
|
||||
@@ -1713,4 +1713,5 @@
|
||||
<string name="migrate_to_device_bytes_downloaded">%s gedownload</string>
|
||||
<string name="set_passphrase">Wachtwoord instellen</string>
|
||||
<string name="e2ee_info_pq_short">Deze chat wordt beschermd door quantum bestendige end-to-end codering.</string>
|
||||
<string name="error_showing_desktop_notification">Fout bij weergeven van melding. Neem contact op met ontwikkelaars.</string>
|
||||
</resources>
|
||||
@@ -376,7 +376,7 @@
|
||||
<string name="invalid_connection_link">Ligação de conexão inválida</string>
|
||||
<string name="save_verb">Salvar</string>
|
||||
<string name="if_you_received_simplex_invitation_link_you_can_open_in_browser">Se você recebeu convite de ligação do SimpleX Chat, você pode abri-lo no seu navegador:</string>
|
||||
<string name="group_invitation_tap_to_join_incognito">Toque para entrar em modo anónimo</string>
|
||||
<string name="group_invitation_tap_to_join_incognito">Toque para entrar no modo anônimo</string>
|
||||
<string name="save_passphrase_in_keychain">Salvar senha na Keystore</string>
|
||||
<string name="if_you_cannot_meet_in_person_show_QR_in_video_call_or_via_another_channel"><![CDATA[Se não se poderem encontrar pessoalmente, <b>mostre o código QR na chamada de vídeo </b> ou partilhe a ligação.]]></string>
|
||||
<string name="save_auto_accept_settings">Salvar definições de aceitação automática</string>
|
||||
@@ -733,4 +733,51 @@
|
||||
<string name="feature_enabled_for_you">activado para si</string>
|
||||
<string name="search_verb">Pesquisar</string>
|
||||
<string name="la_mode_off">Desativado</string>
|
||||
<string name="error_smp_test_failed_at_step">O teste falhou na etapa %s.</string>
|
||||
<string name="smp_servers">Servidor SMP</string>
|
||||
<string name="smp_servers_test_server">Servidor de teste</string>
|
||||
<string name="chat_item_ttl_seconds">%s segundo(s)</string>
|
||||
<string name="stop_chat_question">Parar conversa?</string>
|
||||
<string name="theme_system">Sistema</string>
|
||||
<string name="v4_6_audio_video_calls_descr">Suporte a bluetooth e outras melhorias.</string>
|
||||
<string name="migrate_from_device_stopping_chat">Parando a conversa</string>
|
||||
<string name="migrate_from_device_bytes_uploaded">%s enviado</string>
|
||||
<string name="migrate_from_device_start_chat">Iniciar conversa</string>
|
||||
<string name="tap_to_paste_link">Toque para colar o link</string>
|
||||
<string name="stop_sharing_address">Parar de compartilhar o endereço?</string>
|
||||
<string name="callstate_starting">iniciando…</string>
|
||||
<string name="stop_chat_to_export_import_or_delete_chat_database">Pare a conversa para exportar, importar ou excluir o banco de dados de conversa. Você não poderá receber e enviar mensagens enquanto a conversa for interrompida.</string>
|
||||
<string name="rcv_group_event_n_members_connected">%s, %s e %d outros membros conectados</string>
|
||||
<string name="start_chat_question">Iniciar conversa?</string>
|
||||
<string name="notifications_mode_periodic">Começa periodicamente</string>
|
||||
<string name="tap_to_start_new_chat">Toque para iniciar uma nova conversa</string>
|
||||
<string name="la_lock_mode_system">Sistema de autenticação</string>
|
||||
<string name="stop_rcv_file__title">Parar de receber o arquivo?</string>
|
||||
<string name="smp_servers_test_servers">Servidores de teste</string>
|
||||
<string name="smp_servers_test_some_failed">Alguns servidores falharam no teste:</string>
|
||||
<string name="stop_sharing">Parar compartilhamento</string>
|
||||
<string name="alert_title_skipped_messages">Mensagens ignoradas</string>
|
||||
<string name="receipts_section_groups">Grupos pequeno (máx. 20)</string>
|
||||
<string name="non_fatal_errors_occured_during_import">Alguns erros não fatais ocorreram durante a importação - você pode ver o console de conversa para obter mais detalhes.</string>
|
||||
<string name="conn_event_disabled_pq">encriptação end-to-end padrão</string>
|
||||
<string name="chat_help_tap_button">Toque no botão</string>
|
||||
<string name="tap_to_activate_profile">Toque para ativar o perfil.</string>
|
||||
<string name="stop_snd_file__title">Parar de enviar o arquivo?</string>
|
||||
<string name="v4_4_french_interface_descr">Obrigado aos usuários – contribuam via Weblate!</string>
|
||||
<string name="stop_file__confirm">Pare</string>
|
||||
<string name="stop_chat_confirmation">Pare</string>
|
||||
<string name="icon_descr_call_rejected">Chamada rejeitada</string>
|
||||
<string name="stop_file__action">Parar arquivo</string>
|
||||
<string name="contact_tap_to_connect">Toque para Conectar</string>
|
||||
<string name="group_members_n">%s, %s e %d membros</string>
|
||||
<string name="add_contact_or_create_group">Iniciar nova conversa</string>
|
||||
<string name="la_mode_system">Sistema</string>
|
||||
<string name="stop_chat_to_enable_database_actions">Parar conversa para habilitar ações do banco de dados</string>
|
||||
<string name="group_invitation_tap_to_join">Toque para participar</string>
|
||||
<string name="rcv_group_event_3_members_connected">%s, %s e %s conectado</string>
|
||||
<string name="network_option_tcp_connection_timeout">Tempo esgotado da conexão TCP</string>
|
||||
<string name="language_system">Sistema</string>
|
||||
<string name="auth_stop_chat">Parar conversa</string>
|
||||
<string name="v4_5_italian_interface_descr">Obrigado aos usuários – contribuam via Weblate!</string>
|
||||
<string name="possible_slow_function_title">Função lenta</string>
|
||||
</resources>
|
||||
@@ -343,7 +343,7 @@
|
||||
<string name="your_settings">Настройки</string>
|
||||
<string name="your_simplex_contact_address">Ваш SimpleX адрес</string>
|
||||
<string name="database_passphrase_and_export">База данных</string>
|
||||
<string name="about_simplex_chat">Информация о SimpleX Chat</string>
|
||||
<string name="about_simplex_chat">Подробнее о SimpleX Chat</string>
|
||||
<string name="how_to_use_simplex_chat">Как использовать</string>
|
||||
<string name="markdown_help">Форматирование сообщений</string>
|
||||
<string name="markdown_in_messages">Форматирование сообщений</string>
|
||||
@@ -768,7 +768,7 @@
|
||||
<string name="invite_prohibited_description">Вы пытаетесь пригласить инкогнито контакт в группу, где Вы используете свой основной профиль</string>
|
||||
<!-- GroupChatInfoView.kt -->
|
||||
<string name="button_add_members">Пригласить членов группы</string>
|
||||
<string name="group_info_section_title_num_members">ЧЛЕНОВ ГРУППЫ: %1$s</string>
|
||||
<string name="group_info_section_title_num_members">УЧАСТНИКОВ ГРУППЫ: %1$s</string>
|
||||
<string name="group_info_member_you">Вы: %1$s</string>
|
||||
<string name="button_delete_group">Удалить группу</string>
|
||||
<string name="delete_group_question">Удалить группу?</string>
|
||||
@@ -1337,7 +1337,7 @@
|
||||
<string name="snd_conn_event_ratchet_sync_ok">шифрование работает для %s</string>
|
||||
<string name="snd_conn_event_ratchet_sync_required">требуется новое соглашение о шифровании для %s</string>
|
||||
<string name="abort_switch_receiving_address_desc">Изменение адреса будет прекращено. Будет использоваться старый адрес.</string>
|
||||
<string name="abort_switch_receiving_address">Прекратить изменение адреса</string>
|
||||
<string name="abort_switch_receiving_address">Остановить изменение адреса</string>
|
||||
<string name="receipts_section_contacts">Контакты</string>
|
||||
<string name="receipts_contacts_disable_keep_overrides">Выключить (кроме исключений)</string>
|
||||
<string name="conn_event_ratchet_sync_started">шифрование согласовывается…</string>
|
||||
@@ -1359,7 +1359,7 @@
|
||||
<string name="you_can_enable_delivery_receipts_later_alert">Вы можете включить их позже в настройках Конфиденциальности.</string>
|
||||
<string name="error_aborting_address_change">Ошибка при прекращении изменения адреса</string>
|
||||
<string name="abort_switch_receiving_address_confirm">Прекратить</string>
|
||||
<string name="abort_switch_receiving_address_question">Прекратить изменение адреса\?</string>
|
||||
<string name="abort_switch_receiving_address_question">Остановить изменение адреса?</string>
|
||||
<string name="unfavorite_chat">Не избранный</string>
|
||||
<string name="shutdown_alert_desc">Нотификации перестанут работать, пока вы не перезапустите приложение</string>
|
||||
<string name="network_option_protocol_timeout_per_kb">Таймаут протокола на KB</string>
|
||||
|
||||
@@ -595,7 +595,7 @@
|
||||
<string name="video_descr">Відео</string>
|
||||
<string name="contact_sent_large_file">Ваш контакт відправив файл, розмір якого більший, ніж поточно підтримуваний максимальний розмір (%1$s).</string>
|
||||
<string name="maximum_supported_file_size">Поточно максимально підтримуваний розмір файлу - %1$s.</string>
|
||||
<string name="switch_receiving_address_desc">Адреса для отримання буде змінена на інший сервер. Зміна адреси завершиться після включення відправника.</string>
|
||||
<string name="switch_receiving_address_desc">Адреса отримувача буде змінена на інший сервер. Зміна адреси завершиться після того, як відправник з\'явиться в мережі.</string>
|
||||
<string name="verify_security_code">Перевірити код безпеки</string>
|
||||
<string name="icon_descr_send_message">Надіслати повідомлення</string>
|
||||
<string name="icon_descr_record_voice_message">Записати голосове повідомлення</string>
|
||||
@@ -1637,4 +1637,80 @@
|
||||
<string name="call_service_notification_audio_call">Аудіодзвінок</string>
|
||||
<string name="unable_to_open_browser_title">Помилка відкриття браузера</string>
|
||||
<string name="unable_to_open_browser_desc">Для використання дзвінків потрібен браузер за замовчуванням. Будь ласка, налаштуйте браузер за замовчуванням в системі та надайте більше інформації розробникам.</string>
|
||||
<string name="migrate_from_another_device">Перехід з іншого пристрою</string>
|
||||
<string name="conn_event_enabled_pq">квантово-стійке шифрування e2e</string>
|
||||
<string name="conn_event_disabled_pq">стандартне наскрізне шифрування</string>
|
||||
<string name="e2ee_info_no_pq_short">Цей чат захищений наскрізним шифруванням.</string>
|
||||
<string name="e2ee_info_pq_short">Цей чат захищений квантово-стійким наскрізним шифруванням.</string>
|
||||
<string name="v5_6_safer_groups_descr">Адміністратори можуть заблокувати користувача для всіх.</string>
|
||||
<string name="v5_6_app_data_migration">Міграція даних додатків</string>
|
||||
<string name="v5_6_app_data_migration_descr">Перейдіть на інший пристрій за допомогою QR-коду.</string>
|
||||
<string name="v5_6_picture_in_picture_calls">Дзвінки картинка в картинці</string>
|
||||
<string name="v5_6_quantum_resistant_encryption">Квантово-стійке шифрування</string>
|
||||
<string name="v5_6_safer_groups">Безпечніші групи</string>
|
||||
<string name="invalid_file_link">Невірне посилання</string>
|
||||
<string name="migrate_to_device_title">Мігруйте сюди</string>
|
||||
<string name="migrate_to_device_migrating">Міграція</string>
|
||||
<string name="or_paste_archive_link">Або вставте посилання на архів</string>
|
||||
<string name="paste_archive_link">Вставити посилання на архів</string>
|
||||
<string name="migrate_to_device_download_failed">Не вдалося завантажити</string>
|
||||
<string name="migrate_to_device_downloading_details">Деталі посилання для завантаження</string>
|
||||
<string name="migrate_to_device_database_init">Підготовка до завантаження</string>
|
||||
<string name="migrate_to_device_repeat_download">Повторити завантаження</string>
|
||||
<string name="migrate_to_device_bytes_downloaded">%s завантажено</string>
|
||||
<string name="migrate_to_device_enter_passphrase">Введіть парольну фразу</string>
|
||||
<string name="migrate_to_device_file_delete_or_link_invalid">Файл було видалено або посилання недійсне</string>
|
||||
<string name="migrate_to_device_import_failed">Не вдалося імпортувати</string>
|
||||
<string name="migrate_to_device_importing_archive">Імпорт архіву</string>
|
||||
<string name="migrate_to_device_repeat_import">Повторний імпорт</string>
|
||||
<string name="migrate_to_device_finalize_migration">Завершіть міграцію на іншому пристрої.</string>
|
||||
<string name="migrate_to_device_apply_onion">Подати заявку</string>
|
||||
<string name="migrate_from_device_title">Перенести пристрій</string>
|
||||
<string name="migrate_from_device_to_another_device">Перехід на інший пристрій</string>
|
||||
<string name="migrate_from_device_error_exporting_archive">Помилка експорту бази даних чату</string>
|
||||
<string name="migrate_from_device_error_saving_settings">Налаштування збереження помилок</string>
|
||||
<string name="migrate_from_device_error_uploading_archive">Помилка завантаження архіву</string>
|
||||
<string name="migrate_from_device_exported_file_doesnt_exist">Експортований файл не існує</string>
|
||||
<string name="migrate_from_device_archive_and_upload">Архівування та завантаження</string>
|
||||
<string name="migrate_from_device_archiving_database">Архівування бази даних</string>
|
||||
<string name="migrate_from_device_confirm_upload">Підтвердити завантаження</string>
|
||||
<string name="migrate_from_device_error_deleting_database">Помилка видалення бази даних</string>
|
||||
<string name="migrate_from_device_chat_should_be_stopped">Для того, щоб продовжити, чат слід зупинити.</string>
|
||||
<string name="migrate_from_device_stopping_chat">Зупинка чату</string>
|
||||
<string name="migrate_from_device_bytes_uploaded">%s завантажено</string>
|
||||
<string name="migrate_from_device_uploading_archive">Завантаження архіву</string>
|
||||
<string name="migrate_from_device_creating_archive_link">Створення архівного посилання</string>
|
||||
<string name="migrate_from_device_delete_database_from_device">Видалити базу даних з цього пристрою</string>
|
||||
<string name="migrate_from_device_finalize_migration">Завершити міграцію</string>
|
||||
<string name="migrate_from_device_or_share_this_file_link">Або безпечно поділіться цим посиланням на файл</string>
|
||||
<string name="migrate_from_device_repeat_upload">Повторити завантаження</string>
|
||||
<string name="migrate_from_device_try_again">Ви можете спробувати ще раз.</string>
|
||||
<string name="migrate_from_device_start_chat">Почати чат</string>
|
||||
<string name="migrate_from_device_starting_chat_on_multiple_devices_unsupported">Попередження: запуск чату на декількох пристроях не підтримується і може призвести до збоїв у доставці повідомлень</string>
|
||||
<string name="migrate_from_device_migration_complete">Міграція завершена</string>
|
||||
<string name="migrate_from_device_verify_database_passphrase">Перевірте пароль до бази даних</string>
|
||||
<string name="migrate_from_device_you_must_not_start_database_on_two_device"><![CDATA[Ви <b>не повинні</b> використовувати одну і ту ж базу даних на двох пристроях.]]></string>
|
||||
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>Warning</b>: архів буде видалено.]]></string>
|
||||
<string name="migrate_from_device_check_connection_and_try_again">Перевірте підключення до Інтернету та спробуйте ще раз</string>
|
||||
<string name="migrate_from_device_confirm_you_remember_passphrase">Переконайтеся, що ви пам\'ятаєте пароль до бази даних для її перенесення.</string>
|
||||
<string name="migrate_from_device_error_verifying_passphrase">Помилка при перевірці парольної фрази:</string>
|
||||
<string name="migrate_from_device_all_data_will_be_uploaded">Всі ваші контакти, розмови та файли будуть надійно зашифровані та завантажені частинами на налаштовані XFTP-реле.</string>
|
||||
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>Please note</b>: використання однієї і тієї ж бази даних на двох пристроях порушить розшифровку повідомлень з ваших з\'єднань, як захист безпеки.]]></string>
|
||||
<string name="migrate_from_device_cancel_migration">Скасувати міграцію</string>
|
||||
<string name="migrate_to_device_chat_migrated">Чат перемістився!</string>
|
||||
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[Обирайте <i>Migrate from another device</i> на новому пристрої та відскануйте QR-код.]]></string>
|
||||
<string name="migrate_to_device_confirm_network_settings">Підтвердьте налаштування мережі</string>
|
||||
<string name="migrate_to_device_downloading_archive">Завантажити архів</string>
|
||||
<string name="v5_6_quantum_resistant_encryption_descr">Увімкнути в прямих чатах (BETA)!</string>
|
||||
<string name="migrate_to_device_error_downloading_archive">Помилка завантаження архіву</string>
|
||||
<string name="e2ee_info_no_pq"><![CDATA[Повідомлення, файли та дзвінки захищені <b>наскрізним шифруванням</b> з ідеальною секретністю переадресації, відмовою та відновленням після злому.]]></string>
|
||||
<string name="e2ee_info_pq"><![CDATA[Повідомлення, файли та дзвінки захищені <b>квантово-стійким шифруванням e2e</b> з ідеальною прямою секретністю, відмовою та відновленням після злому.]]></string>
|
||||
<string name="auth_open_migration_to_another_device">Відкрийте екран міграції</string>
|
||||
<string name="migrate_to_device_confirm_network_settings_footer">Переконайтеся, що налаштування мережі для цього пристрою є правильними.</string>
|
||||
<string name="migrate_from_device_database_init">Підготовка до завантаження</string>
|
||||
<string name="set_passphrase">Встановити парольну фразу</string>
|
||||
<string name="migrate_from_device_upload_failed">Не вдалося завантажити</string>
|
||||
<string name="v5_6_picture_in_picture_calls_descr">Використовуйте додаток під час розмови.</string>
|
||||
<string name="migrate_from_device_verify_passphrase">Підтвердіть парольну фразу</string>
|
||||
<string name="migrate_to_device_try_again">Ви можете спробувати ще раз.</string>
|
||||
</resources>
|
||||
@@ -85,4 +85,15 @@
|
||||
<string name="rcv_group_and_other_events">và %d sự kiện khác</string>
|
||||
<string name="keychain_is_storing_securely">Android Keystore được sử dụng để lưu trữ passphrase - nó cho phép dịch vụ thông báo hoạt động.</string>
|
||||
<string name="keychain_allows_to_receive_ntfs">Android Keystore sẽ được sử dụng để lưu trữ passphrase một cách an toàn sau khi bạn khởi động lại ứng dụng hoặc thay đổi passphrase - nó cho phép tiếp nhận thông báo.</string>
|
||||
<string name="migrate_from_device_all_data_will_be_uploaded">Tất cả các liên hệ, cuộc hội thoại và tệp của bạn sẽ được mã hóa an toàn và tải lên từng phần tới các XFTP relay được chỉ định.</string>
|
||||
<string name="v5_6_safer_groups_descr">Quản trị viên có thể chặn một thành viên khỏi tất cả.</string>
|
||||
<string name="empty_chat_profile_is_created">Một hồ sơ trống với tên chỉ định đã được tạo, và ứng dụng sẽ mở ra như bình thường.</string>
|
||||
<string name="answer_call">Trả lời cuộc gọi</string>
|
||||
<string name="connect__a_new_random_profile_will_be_shared">Một hồ sơ ngẫu nhiên mới sẽ được chia sẻ.</string>
|
||||
<string name="notifications_mode_off_desc">Ứng dụng chỉ có thể nhận thông báo khi nó đang chạy, không có dịch vụ nền nào được khởi động</string>
|
||||
<string name="app_version_code">Bản dựng ứng dụng: %s</string>
|
||||
<string name="appearance_settings">Giao diện</string>
|
||||
<string name="settings_section_title_app">ỨNG DỤNG</string>
|
||||
<string name="v5_6_app_data_migration">Di chuyển dữ liệu ứng dụng</string>
|
||||
<string name="full_backup">Sao lưu dữ liệu ứng dụng</string>
|
||||
</resources>
|
||||
@@ -21,6 +21,7 @@ import chat.simplex.common.ui.theme.SimpleXTheme
|
||||
import chat.simplex.common.views.TerminalView
|
||||
import chat.simplex.common.views.helpers.*
|
||||
import chat.simplex.res.MR
|
||||
import dev.icerock.moko.resources.compose.painterResource
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import kotlinx.coroutines.*
|
||||
import java.awt.event.WindowEvent
|
||||
@@ -103,7 +104,7 @@ private fun ApplicationScope.AppWindow(closedByError: MutableState<Boolean>) {
|
||||
simplexWindowState.windowState = windowState
|
||||
// Reload all strings in all @Composable's after language change at runtime
|
||||
if (remember { ChatController.appPrefs.appLanguage.state }.value != "") {
|
||||
Window(state = windowState, onCloseRequest = { closedByError.value = false; exitApplication() }, onKeyEvent = {
|
||||
Window(state = windowState, icon = painterResource(MR.images.ic_simplex), onCloseRequest = { closedByError.value = false; exitApplication() }, onKeyEvent = {
|
||||
if (it.key == Key.Escape && it.type == KeyEventType.KeyUp) {
|
||||
simplexWindowState.backstack.lastOrNull()?.invoke() != null
|
||||
} else {
|
||||
|
||||
@@ -111,8 +111,12 @@ object NtfManager {
|
||||
}
|
||||
try {
|
||||
prevNtfs.add(chatId to builder.toast())
|
||||
} catch (e: Exception) {
|
||||
} catch (e: Throwable) {
|
||||
Log.e(TAG, e.stackTraceToString())
|
||||
if (e !is Exception) {
|
||||
val text = e.stackTraceToString().lines().getOrNull(0) ?: ""
|
||||
showToast(generalGetString(MR.strings.error_showing_desktop_notification) + " " + text, 4_000)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,9 +32,9 @@ fun initApp() {
|
||||
//testCrypto()
|
||||
}
|
||||
|
||||
fun discoverVlcLibs(path: String) {
|
||||
uk.co.caprica.vlcj.binding.LibC.INSTANCE.setenv("VLC_PLUGIN_PATH", path, 1)
|
||||
}
|
||||
//fun discoverVlcLibs(path: String) {
|
||||
// uk.co.caprica.vlcj.binding.LibC.INSTANCE.setenv("VLC_PLUGIN_PATH", path, 1)
|
||||
//}
|
||||
|
||||
private fun applyAppLocale() {
|
||||
val lang = ChatController.appPrefs.appLanguage.get()
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package chat.simplex.common.ui.theme
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import chat.simplex.common.platform.Log
|
||||
import chat.simplex.common.platform.TAG
|
||||
import com.jthemedetecor.OsThemeDetector
|
||||
@@ -9,6 +10,7 @@ private val detector: OsThemeDetector = OsThemeDetector.getDetector()
|
||||
registerListener(::reactOnDarkThemeChanges)
|
||||
}
|
||||
|
||||
@Composable
|
||||
actual fun isSystemInDarkTheme(): Boolean = try {
|
||||
detector.isDark
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.unit.Dp
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.simplexWindowState
|
||||
import java.awt.Window
|
||||
|
||||
@Composable
|
||||
actual fun PlayerView(player: VideoPlayer, width: Dp, onClick: () -> Unit, onLongClick: () -> Unit, stop: () -> Unit) {
|
||||
@@ -23,14 +25,15 @@ actual fun PlayerView(player: VideoPlayer, width: Dp, onClick: () -> Unit, onLon
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This function doesn't take into account multi-window environment. In case more windows will be used, modify the code
|
||||
* */
|
||||
@Composable
|
||||
actual fun LocalWindowWidth(): Dp {
|
||||
return with(LocalDensity.current) { (java.awt.Window.getWindows().find { it.isActive }?.width ?: 0).toDp() }
|
||||
/*val density = LocalDensity.current
|
||||
var width by remember { mutableStateOf(with(density) { (java.awt.Window.getWindows().find { it.isActive }?.width ?: 0).toDp() }) }
|
||||
SideEffect {
|
||||
if (width != with(density) { (java.awt.Window.getWindows().find { it.isActive }?.width ?: 0).toDp() })
|
||||
width = with(density) { (java.awt.Window.getWindows().find { it.isActive }?.width ?: 0).toDp() }
|
||||
actual fun LocalWindowWidth(): Dp = with(LocalDensity.current) {
|
||||
val windows = java.awt.Window.getWindows()
|
||||
if (windows.size == 1) {
|
||||
(windows.getOrNull(0)?.width ?: 0).toDp()
|
||||
} else {
|
||||
simplexWindowState.windowState.size.width
|
||||
}
|
||||
return width.also { println("LALAL $it") }*/
|
||||
}
|
||||
|
||||
@@ -12,16 +12,13 @@ version = extra["desktop.version_name"] as String
|
||||
|
||||
|
||||
kotlin {
|
||||
jvm {
|
||||
jvmToolchain(11)
|
||||
withJava()
|
||||
}
|
||||
jvm()
|
||||
sourceSets {
|
||||
val jvmMain by getting {
|
||||
dependencies {
|
||||
implementation(project(":common"))
|
||||
implementation(compose.desktop.currentOs)
|
||||
implementation("net.java.dev.jna:jna:5.13.0")
|
||||
implementation("net.java.dev.jna:jna:5.14.0")
|
||||
}
|
||||
}
|
||||
val jvmTest by getting
|
||||
@@ -151,7 +148,7 @@ cmake {
|
||||
tasks.named("clean") {
|
||||
dependsOn("cmakeClean")
|
||||
}
|
||||
tasks.named("compileJava") {
|
||||
tasks.named("compileKotlinJvm") {
|
||||
dependsOn("cmakeBuildAndCopy")
|
||||
}
|
||||
afterEvaluate {
|
||||
|
||||
@@ -24,13 +24,14 @@ android.nonTransitiveRClass=true
|
||||
# Automatically convert third-party libraries to use AndroidX
|
||||
android.enableJetifier=true
|
||||
kotlin.mpp.androidSourceSetLayoutVersion=2
|
||||
kotlin.jvm.target=11
|
||||
|
||||
android.version_name=5.6
|
||||
android.version_code=191
|
||||
android.version_name=5.6.1
|
||||
android.version_code=193
|
||||
|
||||
desktop.version_name=5.6
|
||||
desktop.version_code=35
|
||||
desktop.version_name=5.6.1
|
||||
desktop.version_code=36
|
||||
|
||||
kotlin.version=1.8.20
|
||||
gradle.plugin.version=7.4.2
|
||||
compose.version=1.5.10
|
||||
kotlin.version=1.9.23
|
||||
gradle.plugin.version=8.2.0
|
||||
compose.version=1.6.1
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#Mon Feb 14 14:23:51 GMT 2022
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||
distributionPath=wrapper/dists
|
||||
zipStorePath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -1,61 +1,8 @@
|
||||
{-# LANGUAGE DuplicateRecordFields #-}
|
||||
{-# LANGUAGE NamedFieldPuns #-}
|
||||
|
||||
module Main where
|
||||
|
||||
import Control.Concurrent (forkIO, threadDelay)
|
||||
import Control.Concurrent.STM
|
||||
import Control.Monad
|
||||
import Data.Time.Clock (getCurrentTime)
|
||||
import Data.Time.LocalTime (getCurrentTimeZone)
|
||||
import Server
|
||||
import Simplex.Chat.Controller (ChatController (..), ChatResponse (..), currentRemoteHost, versionNumber, versionString)
|
||||
import Simplex.Chat.Core
|
||||
import Simplex.Chat.Options
|
||||
import Simplex.Chat.Terminal
|
||||
import Simplex.Chat.View (serializeChatResponse)
|
||||
import Simplex.Messaging.Client (NetworkConfig (..))
|
||||
import System.Directory (getAppUserDataDirectory)
|
||||
import System.Terminal (withTerminal)
|
||||
import Server (simplexChatServer)
|
||||
import Simplex.Chat.Terminal (terminalChatConfig)
|
||||
import Simplex.Chat.Terminal.Main (simplexChatCLI)
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
appDir <- getAppUserDataDirectory "simplex"
|
||||
opts@ChatOpts {chatCmd, chatServerPort} <- getChatOpts appDir "simplex_v1"
|
||||
if null chatCmd
|
||||
then case chatServerPort of
|
||||
Just chatPort -> simplexChatServer defaultChatServerConfig {chatPort} terminalChatConfig opts
|
||||
_ -> runCLI opts
|
||||
else simplexChatCore terminalChatConfig opts $ runCommand opts
|
||||
where
|
||||
runCLI opts = do
|
||||
welcome opts
|
||||
t <- withTerminal pure
|
||||
simplexChatTerminal terminalChatConfig opts t
|
||||
runCommand ChatOpts {chatCmd, chatCmdLog, chatCmdDelay} user cc = do
|
||||
when (chatCmdLog /= CCLNone) . void . forkIO . forever $ do
|
||||
(_, _, r') <- atomically . readTBQueue $ outputQ cc
|
||||
case r' of
|
||||
CRNewChatItem {} -> printResponse r'
|
||||
_ -> when (chatCmdLog == CCLAll) $ printResponse r'
|
||||
sendChatCmdStr cc chatCmd >>= printResponse
|
||||
threadDelay $ chatCmdDelay * 1000000
|
||||
where
|
||||
printResponse r = do
|
||||
ts <- getCurrentTime
|
||||
tz <- getCurrentTimeZone
|
||||
rh <- readTVarIO $ currentRemoteHost cc
|
||||
putStrLn $ serializeChatResponse (rh, Just user) ts tz rh r
|
||||
|
||||
welcome :: ChatOpts -> IO ()
|
||||
welcome ChatOpts {coreOptions = CoreChatOpts {dbFilePrefix, networkConfig}} =
|
||||
mapM_
|
||||
putStrLn
|
||||
[ versionString versionNumber,
|
||||
"db: " <> dbFilePrefix <> "_chat.db, " <> dbFilePrefix <> "_agent.db",
|
||||
maybe
|
||||
"direct network connection - use `/network` command or `-x` CLI option to connect via SOCKS5 at :9050"
|
||||
(("using SOCKS5 proxy " <>) . show)
|
||||
(socksProxy networkConfig),
|
||||
"type \"/help\" or \"/h\" for usage info"
|
||||
]
|
||||
main = simplexChatCLI terminalChatConfig (Just simplexChatServer)
|
||||
|
||||
@@ -28,9 +28,9 @@ import Simplex.Messaging.Util (raceAny_)
|
||||
import UnliftIO.Exception
|
||||
import UnliftIO.STM
|
||||
|
||||
simplexChatServer :: ChatServerConfig -> ChatConfig -> ChatOpts -> IO ()
|
||||
simplexChatServer srvCfg cfg opts =
|
||||
simplexChatCore cfg opts . const $ runChatServer srvCfg
|
||||
simplexChatServer :: ServiceName -> ChatConfig -> ChatOpts -> IO ()
|
||||
simplexChatServer chatPort cfg opts =
|
||||
simplexChatCore cfg opts . const $ runChatServer defaultChatServerConfig {chatPort}
|
||||
|
||||
data ChatServerConfig = ChatServerConfig
|
||||
{ chatPort :: ServiceName,
|
||||
|
||||
@@ -70,7 +70,7 @@ crDirectoryEvent = \case
|
||||
CRChatItemDeleted {deletedChatItem = AChatItem _ SMDRcv (DirectChat ct) _, byUser = False} -> Just $ DEItemDeleteIgnored ct
|
||||
CRNewChatItem {chatItem = AChatItem _ SMDRcv (DirectChat ct) ci@ChatItem {content = CIRcvMsgContent mc, meta = CIMeta {itemLive}}} ->
|
||||
Just $ case (mc, itemLive) of
|
||||
(MCText t, Nothing) -> DEContactCommand ct ciId $ fromRight err $ A.parseOnly directoryCmdP $ T.dropWhileEnd isSpace t
|
||||
(MCText t, Nothing) -> DEContactCommand ct ciId $ fromRight err $ A.parseOnly (directoryCmdP <* A.endOfInput) $ T.dropWhileEnd isSpace t
|
||||
_ -> DEUnsupportedMessage ct ciId
|
||||
where
|
||||
ciId = chatItemId' ci
|
||||
|
||||
@@ -177,8 +177,8 @@ directoryService st DirectoryOpts {superUsers, serviceName, searchResults, testi
|
||||
badRolesMsg :: GroupRolesStatus -> Maybe String
|
||||
badRolesMsg = \case
|
||||
GRSOk -> Nothing
|
||||
GRSServiceNotAdmin -> Just "You must have a group *owner* role to register the group"
|
||||
GRSContactNotOwner -> Just "You must grant directory service *admin* role to register the group"
|
||||
GRSServiceNotAdmin -> Just "You must grant directory service *admin* role to register the group"
|
||||
GRSContactNotOwner -> Just "You must have a group *owner* role to register the group"
|
||||
GRSBadRoles -> Just "You must have a group *owner* role and you must grant directory service *admin* role to register the group"
|
||||
|
||||
getGroupRolesStatus :: GroupInfo -> GroupReg -> IO (Maybe GroupRolesStatus)
|
||||
@@ -190,8 +190,8 @@ directoryService st DirectoryOpts {superUsers, serviceName, searchResults, testi
|
||||
groupRolesStatus :: GroupMemberRole -> GroupMemberRole -> GroupRolesStatus
|
||||
groupRolesStatus contactRole serviceRole = case (contactRole, serviceRole) of
|
||||
(GROwner, GRAdmin) -> GRSOk
|
||||
(_, GRAdmin) -> GRSServiceNotAdmin
|
||||
(GROwner, _) -> GRSContactNotOwner
|
||||
(_, GRAdmin) -> GRSContactNotOwner
|
||||
(GROwner, _) -> GRSServiceNotAdmin
|
||||
_ -> GRSBadRoles
|
||||
|
||||
getGroupMember :: GroupReg -> IO (Maybe GroupMember)
|
||||
|
||||
@@ -15,7 +15,7 @@ This is a major upgrade for SimpleX messaging protocols, we are really proud to
|
||||
This post also covers various aspects of end-to-end encryption, compares different messengers, and explains why and how quantum-resistant encryption is added to SimpleX Chat:
|
||||
|
||||
- [Why do we need end-to-end encryption?](#why-do-we-need-end-to-end-encryption)
|
||||
- [Why encryption is even allowed?](#why-encryption-is-even-allowed)
|
||||
- [Why is encryption even allowed?](#why-is-encryption-even-allowed)
|
||||
- [End-to-end encryption security: attacks and defense.](#end-to-end-encryption-security-attacks-and-defense)
|
||||
- Compromised message size - mitigated by padding messages to a fixed block size.
|
||||
- Compromised confidentiality - mitigated by repudiation (deniability).
|
||||
@@ -40,7 +40,7 @@ End-to-end encryption is an important component of our individual and business s
|
||||
|
||||
It's very sad to see the same people who keep their financial affairs private to protect from financial crimes, lock their doors to protect from thieves, and curtain their windows to protect from the occasional prying eyes, when it comes to protecting their personal lives from the data criminals say "we don't care about privacy, we have nothing to hide". Everybody's safety depends on keeping their affairs and relations private, not visible to a vast and ruthless data gathering machines, that abuse our data for commercial gain, without any regard to our interests or even [the safety of our families and children](https://nmdoj.gov/press-release/attorney-general-raul-torrez-files-lawsuit-against-meta-platforms-and-mark-zuckerberg-to-protect-children-from-sexual-abuse-and-human-trafficking/).
|
||||
|
||||
## Why encryption is even allowed?
|
||||
## Why is encryption even allowed?
|
||||
|
||||
<img src="./images/20240314-djb.jpg" class="float-to-right">
|
||||
|
||||
@@ -75,7 +75,7 @@ While the content encryption is the most important, concealing the actual messag
|
||||
|
||||
The only effective mitigation to these attacks is to pad all messages to a fixed size. Using space-efficient schemes like Padme, or padding to encryption block size is ineffective for mitigating these attacks, as they still allow differentiating message sizes.
|
||||
|
||||
To the best of our knowledge the only messenger other than SimpleX Chat that padded all messages to a fixed packet size was [Pond](https://github.com/agl/pond) - SimpleX design as an evolution of it.
|
||||
To the best of our knowledge, the only messengers other than SimpleX Chat that pad all messages to a fixed packet size are Cwtch and no longer developed [Pond](https://github.com/agl/pond) - SimpleX design can be seen as an evolution of Pond design.
|
||||
|
||||
### 2. Compromised confidential messages - mitigated by repudiation (deniability)
|
||||
|
||||
@@ -97,15 +97,15 @@ This property is well understood by the users, and most messengers that focus on
|
||||
|
||||
### 4. Compromised long-term or session - mitigated by break-in recovery
|
||||
|
||||
This attack is much less understood by the users, and forward secrecy does not protect from it. Arguably, it's almost impossible to compromise individual message keys without compromising long-term or session keys. So the ability of the encryption to recover from break-in (attacker making a copy of the device data without retaining the ongoing access) is both very and pragmatic - break-in attacks are simpler to execute on mobile devices during short-term device access than long-term ongoing compromise.
|
||||
This attack is much less understood by the users, and forward secrecy does not protect from it. Arguably, it's almost impossible to compromise individual message keys without compromising long-term or session keys. So the ability of the encryption to recover from break-in (attacker making a copy of the device data without retaining the ongoing access) is both very important and pragmatic - break-in attacks are simpler to execute on mobile devices during short-term device access than long-term ongoing compromise.
|
||||
|
||||
Out of all encryption algorithms known to us only Signal double ratchet algorithm provides the ability to encryption security after break-ins. This recovery happens automatically and transparently to the users, without them doing anything special even knowing about break-in, by simply sending messages. Every time one of the communication parties replies to another party message, new random keys are generated and previously stolen keys become useless.
|
||||
Out of all encryption algorithms known to us only _Signal double ratchet algorithm_ (also referred to as _Signal algorithm_ or _double ratchet algorithm_, which is not the same as Signal messaging platform and protocols) provides the ability for the encryption security to recover after break-ins attacks. This recovery happens automatically and transparently to the users, without them doing anything special or even knowing about break-in, by simply sending messages. Every time one of the communication parties replies to another party message, new random keys are generated and previously stolen keys become useless.
|
||||
|
||||
Signal double ratchet algorithm is used in Signal, Cwtch and SimpleX Chat. This is why you cannot use SimpleX Chat profile on more than one device at the same time - the encryption scheme rotates the long term keys, randomly, and keys on another device become useless, as they would become useless for the attacker who stole them. Security always has some costs to the convenience.
|
||||
Double ratchet algorithm is used in Signal, Cwtch and SimpleX Chat. This is why you cannot use SimpleX Chat profile on more than one device at the same time - the encryption scheme rotates the long term keys, randomly, and keys on another device become useless, as they would become useless for the attacker who stole them. Security always has some costs to the convenience.
|
||||
|
||||
### 5. Man-in-the-middle attack - mitigated by two-factor key exchange
|
||||
|
||||
Many people incorrectly believe that security of end-to-end encryption cannot be broken by communication provider. But end-to-end encryption is as secure as key exchange. While any intermediary passing the keys between senders and recipients cannot recover the private keys from the public keys, they can simply replace the passed public keys with their own and then proxy all communication between the users having full access to the original messages. So instead of having an end-to-end encrypted channel, users would have two half-way encrypted channels - between users and their communication intermediary.
|
||||
Many people incorrectly believe that security of end-to-end encryption cannot be broken by communication provider. But end-to-end encryption is only as secure as key exchange. While any intermediary passing the keys between senders and recipients cannot recover the private keys from the public keys, they can simply replace the passed public keys with their own and then proxy all communication between the users having full access to the original messages. So instead of having an end-to-end encrypted channel, users would have two half-way encrypted channels - between users and their communication intermediary.
|
||||
|
||||
Pictures below illustrate how this attack works for RSA encryption.
|
||||
|
||||
@@ -143,7 +143,7 @@ Post-quantum cryptography, or encryption algorithms that are resistant to quantu
|
||||
- many of post-quantum algorithms have known patent claims, so any system deploying them accepts the risks of patent litigation.
|
||||
- the silver lining to these limitations is that the risk of appearance of commercially viable quantum computers in the next decade may be exaggerated.
|
||||
|
||||
So, to put it bluntly and provocatively, post-quantum cryptography can be compared with a remedy against the illness that nobody has, without any guarantee that it will work. The closest analogy in the history of medicine is _snake oil_.
|
||||
So, to say it provocatively, post-quantum cryptography can be compared with a remedy against the illness that nobody has, without any guarantee that it will work. While there is a reasonable hope that it _might_ work, so it's not exactly a _snake oil_, these limitations and risks have to be much better communicated to the end users than they are.
|
||||
|
||||
<img src="./images/20240314-datacenter.jpg" width="400" class="float-to-right">
|
||||
|
||||
@@ -164,8 +164,8 @@ The main objective here is to establish the framework for comparing the security
|
||||
Some columns are marked with a yellow checkmark:
|
||||
- when messages are padded, but not to a fixed size.
|
||||
- when repudiation does not include client-server connection. In case of Cwtch it appears that the presence of cryptographic signatures compromises repudiation (deniability), but it needs to be clarified.
|
||||
- when 2-factor key exchange is optional, via security code verification.
|
||||
- when post-quantum cryptography is only added to the initial key agreement, does not protect break-in recovery.
|
||||
- when 2-factor key exchange is optional (via security code verification).
|
||||
- when post-quantum cryptography is only added to the initial key agreement and does not protect break-in recovery.
|
||||
|
||||
## Adding quantum resistance to Signal double ratchet algorithm
|
||||
|
||||
@@ -201,7 +201,7 @@ The reason it is released as opt-in is because once the conversation is upgraded
|
||||
- enable _Show developer options_ toggle.
|
||||
- now you will see _Post-quantum E2EE_ toggle - enable it as well.
|
||||
|
||||
Now all new contacts you add to the app will use quantum resistant Signal double ratchet algorithm.
|
||||
Now all new contacts you add to the app will use quantum resistant double ratchet algorithm.
|
||||
|
||||
Once you have enabled it for the new contacts, you can also **enable it for some of the existing contacts**:
|
||||
- open the chat with the contact you want to upgrade to be quantum resistant.
|
||||
@@ -211,7 +211,7 @@ Once you have enabled it for the new contacts, you can also **enable it for some
|
||||
|
||||
## Next for post-quantum crypto - all direct chats, small groups and security audit
|
||||
|
||||
We will be making quantum resistance default for all direct chats in v5.7, and they will be upgraded for all users without any action.
|
||||
We will be making quantum resistance default for all direct chats in v5.7, and we plan that all existing direct chats will be automatically upgraded when both contacts install v5.7.
|
||||
|
||||
We will also be adding quantum resistance to small groups up to 10-20 members. Computing cryptographic keys is much slower, in comparison, and it would be very inefficient (and completely unnecessary) for large public groups.
|
||||
|
||||
|
||||
@@ -1,20 +1,128 @@
|
||||
---
|
||||
layout: layouts/article.html
|
||||
title: "SimpleX network: real privacy and stable profits, non-profit protocol governance, v5.6 released with quantum resistant e2e encryption and simple profile migration"
|
||||
title: "SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration"
|
||||
date: 2024-03-23
|
||||
# previewBody: blog_previews/20240314.html
|
||||
preview: TODO
|
||||
draft: true
|
||||
# image: images/20240314-kem.jpg
|
||||
# imageWide: true
|
||||
previewBody: blog_previews/20240323.html
|
||||
image: images/20240323-post-preview.png
|
||||
imageBottom: true
|
||||
permalink: "/blog/20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.html"
|
||||
---
|
||||
|
||||
# SimpleX network: real privacy and stable profits, non-profit protocol governance, v5.6 released with quantum resistant e2e encryption and simple profile migration
|
||||
# SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration
|
||||
|
||||
This is a stub for release permalink
|
||||
**Published:** Mar 23, 2024
|
||||
|
||||
TODO
|
||||
SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance:
|
||||
- [community and business interests are aligned](#community-and-business-interests-are-aligned).
|
||||
- [the journey to the decentralized non-profit protocol governance](#the-journey-to-the-decentralized-non-profit-protocol-governance).
|
||||
- [welcome, Esra’a](#welcome-esraa)!
|
||||
|
||||
What's new in v5.6:
|
||||
- [quantum resistant end-to-end encryption](#quantum-resistant-end-to-end-encryption-beta) (BETA) – enable it for the new contacts.
|
||||
- [use the app during the audio and video calls](#use-the-app-during-the-audio-and-video-calls).
|
||||
- [migrate all app data to another device via QR code](#migrate-all-app-data-to-another-device-via-qr-code).
|
||||
|
||||
There are many other improvements and fixes in this release:
|
||||
- group admins can block a member for all other members.
|
||||
- filtering chats no longer includes muted chats with unread messages.
|
||||
- and more - see the [release notes](https://github.com/simplex-chat/simplex-chat/releases/tag/v5.6.0).
|
||||
|
||||
## SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance
|
||||
|
||||
### Community and business interests are aligned
|
||||
|
||||
Some people in our users' community believe that there is a conflict between the business and the community interests. This view fails to see a bigger picture of how these interests are aligned. I wrote a blog post about it [here](https://www.poberezkin.com/posts/2023-10-31-why-privacy-impossible-without-venture-funding.html). Our goal is to grow the network and the ecosystem while enriching all stakeholders involved, both the community and the business shareholders. This strategy relies on the strengths and opportunities of both the business and the decentralized network we build, with its vibrant community of individuals and organizations. It positions the business not as a controller but as a supporter of the community growth, resilience and sustainability.
|
||||
|
||||
By leveraging access to investment resources, its ability to provide stock-based incentives beyond salaries, operating as a business will satisfy users' and community needs more effectively, ensuring the long-term viability and growth of the network, while remaining true to the mission. A purely nonprofit model with no avenue to sustain this growth is simply not possible. Sustainability requires profits, that is simply spending less than earning, as every responsible individual and organization should aim for, and these profits must be based on users' payments, and not on some other sources of revenue or funds. And building the software product that customers are willing to pay for requires substantial business investments. We will accomplish it while maintaining transparency and the commitment to keep SimpleX network and its protocols open and free to use.
|
||||
|
||||
### The journey to the decentralized non-profit protocol governance
|
||||
|
||||
At the current early stage of network growth the protocols will benefit most from the rapid evolution and centralized design. Many protocols that decentralized their evolution too early failed to evolve and to adapt to the product requirements of the majority of users, causing them to stall in growth. Even the open web became possible only thanks to Netscape, a venture funded company, that developed browsers and web server software taking it upon themselves to rapidly evolve web specification to make it into a robust application platform as we now know it. It is very unlikely that it would have happened if it was managed by a nonprofit or community, in a decentralized way.
|
||||
|
||||
Once SimpleX network protocols stabilize and reach the required maturity, we plan to transition its governance to several new nonprofit entities, ensuring its continued evolution aligns more closely with our vision of community-driven, independent and transparent governance. We and our investors believe that this is a win-win strategy. It both maximizes the business value, by creating a product built on protecting privacy and users' trust - a model that we see as the only viable path forward. It also maximizes the value created for the user community.
|
||||
|
||||
### Welcome, Esra’a!
|
||||
|
||||
To help us deliver these goals, Esra’a Al Shafei joined SimpleX Chat team - we are excited to welcome her!
|
||||
|
||||
Esra'a is a longtime privacy and human rights advocate from Bahrain. She is the founder of [Majal.org](http://majal.org), a network of platforms that amplify under-reported and marginalized voices in the Middle East and North Africa. She is also the co-founder of the [Numun Fund](https://numun.fund/), the first dedicated fund for women-led tech in the Global South. Esra’a is currently the Vice Chair of the Board at the [Wikimedia Foundation](https://wikimediafoundation.org/), the nonprofit which hosts Wikipedia. She is also on the Board of the [Tor Project](https://www.torproject.org/), developers of one of the world’s strongest tools for privacy and freedom online. Previously, she served on the Board of [Access Now](https://www.accessnow.org/), an international nonprofit dedicated to an open and free Internet.
|
||||
|
||||
In her own words: *"Privacy and security have been the center of my work as a human rights advocate for the last 20 years in one of the most surveilled countries in the world where staying safe remains a burden. Our privacy is our dignity. It is something that belongs to us and something we should treasure - as people, as companies, as governments. Despite messaging being the most intimate aspect of our digital lives, the leading protocols in this space are centralized and we deserve a web that operates on the core principles of genuine privacy and security in a fully decentralized framework. SimpleX network will play a critical role towards that vision."*
|
||||
|
||||
Executing the plan towards decentralized nonprofit protocol governance will be Esra’a’s primary responsibility. Our primary objective with this plan is to ensure that no single entity can control or have unrestricted ownership of the protocols, so it can maintain its integrity.
|
||||
|
||||
## What's new in v5.6
|
||||
|
||||
### Quantum resistant end-to-end encryption (BETA)
|
||||
|
||||
Adding post-quantum resistance to the double ratchet end-to-end encryption algorithm in SimpleX Chat is a major upgrade to messaging protocols, and it creates the security against the future quantum computers.
|
||||
|
||||
I wrote in detail in the previous post about various properties of end-to-end encryption and how exactly quantum resistance is implemented in SimpleX Chat - currently SimpleX Chat has [the most secure end-to-end encryption design](./20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.md#how-secure-is-end-to-end-encryption-in-different-messengers) against the present and future attacks.
|
||||
|
||||
We plan to perform a security audit of this design and implementation later this year.
|
||||
|
||||
Post-quantum encryption is currently added as opt-in and has to be separately enabled to be active for the new contacts, and, additionally, can be enabled for the existing contacts.
|
||||
|
||||
<img src="./images/20240314-pq1.png" width="288"> <img src="./images/20240314-pq2.png" width="288"> <img src="./images/20240314-pq3.png" width="288">
|
||||
|
||||
**To enable quantum resistance for the new conversations**:
|
||||
- open the app settings (tap user avatar in the top left corner).
|
||||
- scroll down to _Developer tools_ and open them.
|
||||
- enable _Show developer options_ toggle.
|
||||
- now you will see _Post-quantum E2EE_ toggle - enable it as well.
|
||||
|
||||
Now all new contacts you add to the app will use quantum resistant Signal double ratchet algorithm.
|
||||
|
||||
Once you have enabled it for the new contacts, you can also **enable it for some of the existing contacts**:
|
||||
- open the chat with the contact you want to upgrade to be quantum resistant.
|
||||
- tap contact name above the chat.
|
||||
- tap Allow PQ encryption.
|
||||
- exchange several messages back and forth with that contact - the quantum resistant double ratchet will kick in after 3-5 messages (depending on how many messages you send in each direction), and you will see the notice in the chat once it enables.
|
||||
|
||||
We will be making quantum resistance default for all direct chats in v5.7, and we plan that all existing direct chats will be automatically upgraded when both contacts install v5.7.
|
||||
|
||||
### Use the app during the audio and video calls
|
||||
|
||||
<img src="./images/20240323-call1.png" width="220" class="float-to-left"> <img src="./images/20240323-call2.png" width="220" class="float-to-left">
|
||||
|
||||
Since we added the audio and video calls in 2022 a lot of work was done to improve the stability of calls. One of the usability downsides until this release was that it was impossible to use the app during the call.
|
||||
|
||||
This version solved this problem - now you can return back to the app without interrupting the call and use any of the app functions - for example, you can send the messages or files to the person you are in the call with. If this is a video call, you will continue seeing your contact in a small picture-in-picture view.
|
||||
|
||||
### Migrate all app data to another device via QR code
|
||||
|
||||
We always believed that cross-platform data portability is very important for any software. Users own their data, and they should have a way to export it from any software they use. So from the version of SimpleX Chat [released in July 2022](./20220711-simplex-chat-v3-released-ios-notifications-audio-video-calls-database-export-import-protocol-improvements.md#database-export-and-import) it was possible to export the database as a self-contained file, including all contacts, messages and files, and import it on a new device.
|
||||
|
||||
_"How can I migrate my data to another device?"_ was one of the most frequent user questions, but until this release this process was [quite complex](), requiring too many steps, and most non-technical users were not willing to try it, as even though it was reliable, it appeared risky.
|
||||
|
||||
This release made the app data migration very simple, see the steps below.
|
||||
|
||||
**Start the migration on the source device**
|
||||
|
||||
<img src="./images/20240323-migrate-from1.png" width="170"> <img src="./images/arrow.png" width="24"> <img src="./images/20240323-migrate-from2.png" width="170"> <img src="./images/arrow.png" width="24"> <img src="./images/20240323-migrate-from3.png" width="170"> <img src="./images/arrow.png" width="24"> <img src="./images/20240323-migrate-from4.png" width="170"> <img src="./images/arrow.png" width="24"> <img src="./images/20240323-migrate-from5.png" width="170">
|
||||
|
||||
On the device you migrate your app data from, follow these steps:
|
||||
- choose _Migrate to another device_,
|
||||
- if necessary, set the database passphrase (initially, the database is encrypted with a random passphrase), or, if it's already set, verify it - for security and to ensure that the archive will be usable on the new device,
|
||||
- tap _Archive and upload_ to and upload the app data in chunks to the XFTP servers configured in the app,
|
||||
- the app will show the QR code that should be scanned from the new device.
|
||||
|
||||
**Migrate data to the target device**
|
||||
|
||||
<img src="./images/20240323-migrate-to1.png" width="170"> <img src="./images/arrow.png" width="24"> <img src="./images/20240323-migrate-to2.png" width="170"> <img src="./images/arrow.png" width="24"> <img src="./images/20240323-migrate-to3.png" width="170"> <img src="./images/arrow.png" width="24"> <img src="./images/20240323-migrate-to4.png" width="170"> <img src="./images/arrow.png" width="24"> <img src="./images/20240323-migrate-to5.png" width="170">
|
||||
|
||||
On the device you migrate your data to, follow these steps:
|
||||
- on the first app page choose _Migrate from another device_,
|
||||
- scan the QR code shown on the source device,
|
||||
- once the archive downloads, enter the database passphrase and tap _Open chat_,
|
||||
|
||||
**Finalize migration on the source device**
|
||||
|
||||
<img src="./images/20240323-migrate-from6.png" width="170" class="float-to-left">
|
||||
|
||||
When the chat starts on the target device, make sure to tap _Finalize migration_ and then _Delete database_ on the source device.
|
||||
|
||||
The database cannot be used on two devices at the same time, doing so would make it impossible to decrypt the received messages. This is a security measure - the break-in recovery property of double ratchet algorithm.
|
||||
|
||||
## SimpleX network
|
||||
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
---
|
||||
layout: layouts/article.html
|
||||
title: "Why I joined SimpleX Chat - by Esra'a al Shafei"
|
||||
date: 2024-04-04
|
||||
previewBody: blog_previews/20240404.html
|
||||
image: images/20240404-esraa.png
|
||||
permalink: "/blog/20240404-why-i-joined-simplex-chat-esraa-al-shafei.html"
|
||||
---
|
||||
|
||||
# Why I joined SimpleX Chat
|
||||
|
||||
**Published:** Apr 4, 2024
|
||||
|
||||
_By [Esra'a al Shafei](https://mastodon.social/@alshafei)_
|
||||
|
||||
Transitioning from a lifelong career dedicated to nonprofits, including Board roles at organizations like the Wikimedia Foundation, Access Now and Tor, my decision to join SimpleX Chat may come as a surprise to some. But, as I step into this new chapter, I want to share the insights and convictions that have guided me here, shedding light on what I think sets SimpleX Chat apart and why this move feels like an essential learning opportunity.
|
||||
|
||||
The nonprofit world has been my primary focus for decades. My team and I ran the platforms at Majal.org with an extremely limited budget. We had to navigate many complexities and challenges that shadow the nonprofit model. And because we worked primarily in creating applications and tools, a recurring theme has been financial sustainability. Being a Bahrain-based entity for most of these years meant that the many communities we served were not in a position to provide contributions and we were not eligible for most foundation grants. This drastically limited our growth and the reliability of our apps. When we failed to raise sufficient funds or meet our target budgets, we often had to shutter certain applications, sometimes after spending more than 10 years building them.
|
||||
|
||||
With secure and private messaging, the stakes are even graver. Any failure to commit and resource/fund ongoing development, security patches, etc means lives can be at risk. I still believe in nonprofit models, and it’s why I continue to serve them through various volunteer roles. I do also believe that there is room for a mixture of models that, in the case of something as unique as SimpleX Chat, can serve as a fully open and transparent public interest technology while also having a profitable values-aligned company that can keep the lights on to continue developing, expanding, and improving the protocol, network and their reach.
|
||||
|
||||
I’m no stranger to writing about some VC models being [corrupt](https://mastodon.social/@alshafei/112125959080515656). Frankly, I also hold the view that some tech VCs are amongst the [most complicit](https://responsiblestatecraft.org/defense-tech/) in egregious war crimes worldwide, or enabling the [intrusive surveillance](https://mastodon.social/@alshafei/112140566088322925) we’re fighting against. So being part of a VC-funded venture is not a decision I take lightly. However, I have been following SimpleX Chat’s growth since early 2022 when I first met Evgeny at the Mozilla Festival. I appreciated the drive and Evgeny’s firm refusal to settle for the current models of private messaging. We share the belief that messaging is something we need to keep improving and that we must continue pushing its boundaries to make it even more private, secure, usable for groups, and, most importantly - fully decentralized. This is a major undertaking, and it requires funding to achieve. Candidly, I did worry about funding and sustainability because, at the time, SimpleX was still primarily funded by user contributions.
|
||||
|
||||
But even knowing this, I scrutinized SimpleX Chat for taking VC funding ($350K) from Village Global and questioned the individuals featured on its frontpage. I had to speak with Evgeny directly to learn who exactly from this fund was involved, how much power they wielded, if any, and if this changes the ethos of the company - all of which he is already making public. It was only after these discussions that I was comfortable to take a leap of faith and continue to use the app and vouch for its current and future offerings. It required me to question my own views on whether a VC-funded company can actually have major positive contributions to privacy as well as the open ecosystem.
|
||||
|
||||
<img src="./images/20240404-messsaging-apps.png" class="float-to-right" width="50%">
|
||||
|
||||
The web has a long history of [trading privacy](https://www.engadget.com/from-its-start-gmail-conditioned-us-to-trade-privacy-for-free-services-120009741.html) for “free” services. Traditionally, these services have also been centralized, closed-source, non-transparent, and profit-oriented. The companies behind these apps and services became prolific because of their disregard of privacy rights, which normalized lucrative surveillance capitalism. There is such an extensive global monopoly that in Africa, only 1 of the 5 biggest messaging apps in Africa isn't owned by Meta, notoriously known for spying not just through its own apps but even through [its competitors](https://qz.com/project-ghostbusters-facebook-meta-wiretap-snapchat-1851366814), – relentless, massive data harvesting that stretches far beyond its own walled gardens:
|
||||
|
||||
Some of the world’s top engineers often go to these companies because of the benefits and financial opportunities. We can question their ethics all day long, but we also need to question if the web would look significantly different if there were as many opportunities at privacy-first companies with purpose and strong, proven moral boundaries, set up in a way that can guarantee operational independence from any shareholders and VCs.
|
||||
|
||||
SimpleX could have taken the route of other companies in the privacy space, whether it’s Skiff which rushed to take a large amount of [VC money](https://techcrunch.com/2022/03/30/skiff-series-a-encrypted-workspaces/) only to [shutter its doors](https://www.techradar.com/computing/cyber-security/skiff-gets-bought-by-notion-raising-privacy-concerns) after an acquisition, leaving its users hanging with many unanswered questions, or giving up control of the company, which would puts its future solely in the hands of VCs with majority ownership. SimpleX aims to prevent this, and in fact has left money on the table to ensure that it does not occur. Had it not been for this information, I would not have joined, and I would have remained a user of the product, albeit a very cautious one, constantly wondering whether it will be sold or corrupted.
|
||||
|
||||
It’s worth noting that some private foundations operate on the VC model in supporting nonprofits, either by requiring Board seats or requesting that their funding be used towards very specific objectives not always in alignment with the organization’s values and mission. It’s also worth noting that [some nonprofits](https://www.engadget.com/2019-05-31-sex-lies-and-surveillance-fosta-privacy.html) actually operate on the models of surveillance and censorship. Therefore, whether an organization or company is VC-backed or a nonprofit should not be the sole factor in deciding whether or not it is trustworthy. Actions are important, with full transparency being one of the most critical factors, and being fully open source being another to attract valid criticisms and audits to ensure any product or protocol lives up to its privacy and security promise. SimpleX Chat prides itself on being both transparent and open, on top of also being fully decentralized. If you’re new to it and eager to know more, you can start with [this overview](https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md).
|
||||
|
||||
Another important consideration is that the SimpleX network does have a plan that would rely on users' payments for specific or tailored services, and not on some other sources of revenue or funds (ads, etc.). Building anything that users would be willing to pay for requires substantially more time and resources, hence the VC route to establish a business model that doesn’t translate to the user being the product. But any business services need to be separate from SimpleX as a public interest technology. As outlined in this [recent post](./20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.md), I’ll be using my background in nonprofit governance structures to ensure that the SimpleX network protocols evolve under the stewardship of nonprofit entities in various jurisdictions, so that its continued evolution aligns more closely with the vision of community-driven, independent and decentralized governance. This would help create a necessary balance between different structures, in the same way many tech nonprofits also have for-profit subsidiaries to attract fee-for-service agreements to sustain their operations.
|
||||
|
||||
In summary: My decision to join Simplex Chat, despite my deep-rooted beliefs and skepticism towards VC funding, reflects a broader realization: that the fight for privacy, security, and decentralization in today’s web is multifaceted and sometimes requires us to depart from our comfort zones to explore sustainable paths for continuous growth and impact so that open source privacy tools and protocols are no longer “niche”, but universally accessible standards. As long as nothing in this journey compromises our moral principles and integrity, this will remain a very worthwhile goal to pursue.
|
||||
@@ -1,5 +1,27 @@
|
||||
# Blog
|
||||
|
||||
Apr 4. 2024 [Why I joined SimpleX Chat](./20240404-why-i-joined-simplex-chat-esraa-al-shafei.md)
|
||||
|
||||
_By [Esra'a al Shafei](https://mastodon.social/@alshafei)_
|
||||
|
||||
Transitioning from a lifelong career dedicated to nonprofits, including Board roles at organizations like the Wikimedia Foundation, Access Now and Tor, my decision to join SimpleX Chat may come as a surprise to some. But, as I step into this new chapter, I want to share the insights and convictions that have guided me here, shedding light on what I think sets SimpleX Chat apart and why this move feels like an essential learning opportunity.
|
||||
|
||||
---
|
||||
|
||||
Mar 23, 2024 [SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration](./20240323-simplex-network-privacy-non-profit-v5-6-quantum-resistant-e2e-encryption-simple-migration.md)
|
||||
|
||||
SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance:
|
||||
- community and business interests are aligned.
|
||||
- the journey to the decentralized non-profit protocol governance.
|
||||
- welcome, Esra’a!
|
||||
|
||||
What's new in v5.6:
|
||||
- quantum resistant end-to-end encryption (BETA) – enable it for the new contacts.
|
||||
- use the app during the audio and video calls.
|
||||
- migrate all app data to another device via QR code.
|
||||
|
||||
---
|
||||
|
||||
Mar 14, 2024 [SimpleX Chat v5.6 (beta): adding quantum resistance to Signal double ratchet algorithm](./20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.md)
|
||||
|
||||
This is a major upgrade for SimpleX Chat messaging protocol stack, I am really proud to present this work of the whole team.
|
||||
|
||||
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 378 KiB |
|
After Width: | Height: | Size: 357 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 155 KiB |
|
After Width: | Height: | Size: 153 KiB |
|
After Width: | Height: | Size: 484 KiB |
|
After Width: | Height: | Size: 182 KiB |
|
After Width: | Height: | Size: 288 KiB |
|
After Width: | Height: | Size: 701 KiB |
|
After Width: | Height: | Size: 210 KiB |
|
After Width: | Height: | Size: 208 KiB |