Compare commits

..

7 Commits

Author SHA1 Message Date
Diogo 058335d5e1 initial chat items 2024-10-08 10:23:03 +01:00
Diogo 916ff04d78 english 2024-10-07 22:14:25 +01:00
Diogo fb2dc74420 clarification 2024-10-07 22:08:14 +01:00
Diogo 86b84bf0ea option 4 2024-10-07 18:50:17 +01:00
Diogo 7158f169a2 option 3 2024-10-07 18:10:36 +01:00
Diogo 2484ea2033 add option 1 and 2 2024-10-07 15:06:00 +01:00
Diogo aa3879ada0 rfc: infinite scrolling 2024-10-07 10:44:22 +01:00
134 changed files with 1590 additions and 6279 deletions
+9 -15
View File
@@ -29,12 +29,12 @@ struct ContentView: View {
@AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false
@AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false
@AppStorage(DEFAULT_NOTIFICATION_ALERT_SHOWN) private var notificationAlertShown = false
@State private var showSettings = false
@State private var showWhatsNew = false
@State private var showChooseLAMode = false
@State private var showSetPasscode = false
@State private var waitingForOrPassedAuth = true
@State private var chatListActionSheet: ChatListActionSheet? = nil
@State private var chatListUserPickerSheet: UserPickerSheet? = nil
private let callTopPadding: CGFloat = 40
@@ -86,7 +86,7 @@ struct ContentView: View {
callView(call)
}
if chatListUserPickerSheet == nil, let la = chatModel.laRequest {
if !showSettings, let la = chatModel.laRequest {
LocalAuthView(authRequest: la)
.onDisappear {
// this flag is separate from accessAuthenticated to show initializationView while we wait for authentication
@@ -109,6 +109,9 @@ struct ContentView: View {
}
}
.alert(isPresented: $alertManager.presentAlert) { alertManager.alertView! }
.sheet(isPresented: $showSettings) {
SettingsView(showSettings: $showSettings)
}
.confirmationDialog("SimpleX Lock mode", isPresented: $showChooseLAMode, titleVisibility: .visible) {
Button("System authentication") { initialEnableLA() }
Button("Passcode entry") { showSetPasscode = true }
@@ -250,7 +253,7 @@ struct ContentView: View {
private func mainView() -> some View {
ZStack(alignment: .top) {
ChatListView(activeUserPickerSheet: $chatListUserPickerSheet).privacySensitive(protectScreen)
ChatListView(showSettings: $showSettings).privacySensitive(protectScreen)
.onAppear {
requestNtfAuthorization()
// Local Authentication notice is to be shown on next start after onboarding is complete
@@ -297,18 +300,9 @@ struct ContentView: View {
if let contactId = contacts?.first?.personHandle?.value,
let chat = chatModel.getChat(contactId),
case let .direct(contact) = chat.chatInfo {
let activeCall = chatModel.activeCall
// This line works when a user clicks on a video button in CallKit UI while in call.
// The app tries to make another call to the same contact and overwite activeCall instance making its state broken
if let activeCall, contactId == activeCall.contact.id, mediaType == .video, !activeCall.hasVideo {
Task {
await chatModel.callCommand.processCommand(.media(source: .camera, enable: true))
}
} else if activeCall == nil {
logger.debug("callToRecentContact: schedule call")
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
CallController.shared.startCall(contact, mediaType)
}
logger.debug("callToRecentContact: schedule call")
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
CallController.shared.startCall(contact, mediaType)
}
}
}
+1 -1
View File
@@ -526,7 +526,7 @@ final class ChatModel: ObservableObject {
}
func updateCurrentUserUiThemes(uiThemes: ThemeModeOverrides?) {
guard var current = currentUser, current.uiThemes != uiThemes else { return }
guard var current = currentUser else { return }
current.uiThemes = uiThemes
let i = users.firstIndex(where: { $0.user.userId == current.userId })
if let i {
+4 -9
View File
@@ -585,18 +585,12 @@ func apiContactInfo(_ contactId: Int64) async throws -> (ConnectionStats?, Profi
throw r
}
func apiGroupMemberInfoSync(_ groupId: Int64, _ groupMemberId: Int64) throws -> (GroupMember, ConnectionStats?) {
func apiGroupMemberInfo(_ groupId: Int64, _ groupMemberId: Int64) throws -> (GroupMember, ConnectionStats?) {
let r = chatSendCmdSync(.apiGroupMemberInfo(groupId: groupId, groupMemberId: groupMemberId))
if case let .groupMemberInfo(_, _, member, connStats_) = r { return (member, connStats_) }
throw r
}
func apiGroupMemberInfo(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (GroupMember, ConnectionStats?) {
let r = await chatSendCmd(.apiGroupMemberInfo(groupId: groupId, groupMemberId: groupMemberId))
if case let .groupMemberInfo(_, _, member, connStats_) = r { return (member, connStats_) }
throw r
}
func apiContactQueueInfo(_ contactId: Int64) async throws -> (RcvMsgInfo?, ServerQueueInfo) {
let r = await chatSendCmd(.apiContactQueueInfo(contactId: contactId))
if case let .queueInfo(_, rcvMsgInfo, queueInfo) = r { return (rcvMsgInfo, queueInfo) }
@@ -651,8 +645,8 @@ func apiGetContactCode(_ contactId: Int64) async throws -> (Contact, String) {
throw r
}
func apiGetGroupMemberCode(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (GroupMember, String) {
let r = await chatSendCmd(.apiGetGroupMemberCode(groupId: groupId, groupMemberId: groupMemberId))
func apiGetGroupMemberCode(_ groupId: Int64, _ groupMemberId: Int64) throws -> (GroupMember, String) {
let r = chatSendCmdSync(.apiGetGroupMemberCode(groupId: groupId, groupMemberId: groupMemberId))
if case let .groupMemberCode(_, _, member, connectionCode) = r { return (member, connectionCode) }
throw r
}
@@ -2090,6 +2084,7 @@ func processReceivedMsg(_ res: ChatResponse) async {
await withCall(contact) { call in
await MainActor.run {
call.callState = .offerReceived
call.peerMedia = callType.media
call.sharedKey = sharedKey
}
let useRelay = UserDefaults.standard.bool(forKey: DEFAULT_WEBRTC_POLICY_RELAY)
+106 -156
View File
@@ -17,8 +17,8 @@ struct ActiveCallView: View {
@ObservedObject var call: Call
@Environment(\.scenePhase) var scenePhase
@State private var client: WebRTCClient? = nil
@State private var activeCall: WebRTCClient.Call? = nil
@State private var localRendererAspectRatio: CGFloat? = nil
@State var remoteContentMode: UIView.ContentMode = .scaleAspectFill
@Binding var canConnectCall: Bool
@State var prevColorScheme: ColorScheme = .dark
@State var pipShown = false
@@ -27,39 +27,24 @@ struct ActiveCallView: View {
var body: some View {
ZStack(alignment: .topLeading) {
ZStack(alignment: .bottom) {
if let client = client, call.hasVideo {
if let client = client, [call.peerMedia, call.localMedia].contains(.video), activeCall != nil {
GeometryReader { g in
let width = g.size.width * 0.3
ZStack(alignment: .topTrailing) {
CallViewRemote(client: client, activeCall: $activeCall, activeCallViewIsCollapsed: $m.activeCallViewIsCollapsed, pipShown: $pipShown)
CallViewLocal(client: client, activeCall: $activeCall, localRendererAspectRatio: $localRendererAspectRatio, pipShown: $pipShown)
.cornerRadius(10)
.frame(width: width, height: width / (localRendererAspectRatio ?? 1))
.padding([.top, .trailing], 17)
ZStack(alignment: .center) {
// For some reason, when the view in GeometryReader and ZStack is visible, it steals clicks on a back button, so showing something on top like this with background color helps (.clear color doesn't work)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.primary.opacity(0.000001))
CallViewRemote(client: client, call: call, activeCallViewIsCollapsed: $m.activeCallViewIsCollapsed, contentMode: $remoteContentMode, pipShown: $pipShown)
.onTapGesture {
remoteContentMode = remoteContentMode == .scaleAspectFill ? .scaleAspectFit : .scaleAspectFill
}
Group {
let localVideoTrack = client.activeCall?.localVideoTrack ?? client.notConnectedCall?.localCameraAndTrack?.1
if localVideoTrack != nil {
CallViewLocal(client: client, localRendererAspectRatio: $localRendererAspectRatio, pipShown: $pipShown)
.onDisappear {
localRendererAspectRatio = nil
}
} else {
Rectangle().fill(.black)
}
}
.cornerRadius(10)
.frame(width: width, height: localRendererAspectRatio == nil ? (g.size.width < g.size.height ? width * 1.33 : width / 1.33) : width / (localRendererAspectRatio ?? 1))
.padding([.top, .trailing], 17)
}
}
}
if let call = m.activeCall, let client = client, (!pipShown || !call.hasVideo) {
if let call = m.activeCall, let client = client, (!pipShown || !call.supportsVideo) {
ActiveCallOverlay(call: call, client: client)
}
}
@@ -69,9 +54,6 @@ struct ActiveCallView: View {
.onAppear {
logger.debug("ActiveCallView: appear client is nil \(client == nil), scenePhase \(String(describing: scenePhase)), canConnectCall \(canConnectCall)")
AppDelegate.keepScreenOn(true)
Task {
await askRequiredPermissions()
}
createWebRTCClient()
dismissAllSheets()
hideKeyboard()
@@ -102,7 +84,7 @@ struct ActiveCallView: View {
private func createWebRTCClient() {
if client == nil && canConnectCall {
client = WebRTCClient({ msg in await MainActor.run { processRtcMessage(msg: msg) } }, $localRendererAspectRatio)
client = WebRTCClient($activeCall, { msg in await MainActor.run { processRtcMessage(msg: msg) } }, $localRendererAspectRatio)
Task {
await m.callCommand.setClient(client)
}
@@ -117,7 +99,7 @@ struct ActiveCallView: View {
logger.debug("ActiveCallView: response \(msg.resp.respType)")
switch msg.resp {
case let .capabilities(capabilities):
let callType = CallType(media: call.initialCallType, capabilities: capabilities)
let callType = CallType(media: call.localMedia, capabilities: capabilities)
Task {
do {
try await apiSendCallInvitation(call.contact, callType)
@@ -128,7 +110,7 @@ struct ActiveCallView: View {
call.callState = .invitationSent
call.localCapabilities = capabilities
}
if call.hasVideo && !AVAudioSession.sharedInstance().hasExternalAudioDevice() {
if call.supportsVideo && !AVAudioSession.sharedInstance().hasExternalAudioDevice() {
try? AVAudioSession.sharedInstance().setCategory(.playback, options: [.allowBluetooth, .allowAirPlay, .allowBluetoothA2DP])
}
CallSoundsPlayer.shared.startConnectingCallSound()
@@ -138,7 +120,7 @@ struct ActiveCallView: View {
Task {
do {
try await apiSendCallOffer(call.contact, offer, iceCandidates,
media: call.initialCallType, capabilities: capabilities)
media: call.localMedia, capabilities: capabilities)
} catch {
logger.error("apiSendCallOffer \(responseError(error))")
}
@@ -182,9 +164,6 @@ struct ActiveCallView: View {
}
if state.connectionState == "closed" {
closeCallView(client)
if let callUUID = m.activeCall?.callUUID {
CallController.shared.endCall(callUUID: callUUID)
}
m.activeCall = nil
m.activeCallViewIsCollapsed = false
}
@@ -203,14 +182,6 @@ struct ActiveCallView: View {
CallSoundsPlayer.shared.vibrate(long: false)
wasConnected = true
}
case let .peerMedia(source, enabled):
switch source {
case .mic: call.peerMediaSources.mic = enabled
case .camera: call.peerMediaSources.camera = enabled
case .screenAudio: call.peerMediaSources.screenAudio = enabled
case .screenVideo: call.peerMediaSources.screenVideo = enabled
case .unknown: ()
}
case .ended:
closeCallView(client)
call.callState = .ended
@@ -255,26 +226,6 @@ struct ActiveCallView: View {
}
}
private func askRequiredPermissions() async {
let mic = await WebRTCClient.isAuthorized(for: .audio)
await MainActor.run {
call.localMediaSources.mic = mic
}
let cameraAuthorized = AVCaptureDevice.authorizationStatus(for: .video) == .authorized
var camera = call.initialCallType == .audio || cameraAuthorized
if call.initialCallType == .video && !cameraAuthorized {
camera = await WebRTCClient.isAuthorized(for: .video)
await MainActor.run {
if camera, let client {
client.setCameraEnabled(true)
}
}
}
if !mic || !camera {
WebRTCClient.showUnauthorizedAlert(for: !mic ? .audio : .video)
}
}
private func closeCallView(_ client: WebRTCClient) {
if m.activeCall != nil {
m.showCallView = false
@@ -290,16 +241,44 @@ struct ActiveCallOverlay: View {
var body: some View {
VStack {
switch call.hasVideo {
case true:
switch call.localMedia {
case .video:
videoCallInfoView(call)
.foregroundColor(.white)
.opacity(0.8)
.padding(.horizontal)
// Fixed vertical padding required for preserving position of buttons row when changing audio-to-video and back in landscape orientation.
// Otherwise, bigger padding is added by SwiftUI when switching call types
.padding(.vertical, 10)
case false:
.padding()
Spacer()
HStack {
toggleAudioButton()
Spacer()
if deviceManager.availableInputs.allSatisfy({ $0.portType == .builtInMic }) {
toggleSpeakerButton()
.frame(width: 40, height: 40)
} else if call.hasMedia {
AudioDevicePicker()
.scaleEffect(2)
.frame(maxWidth: 40, maxHeight: 40)
} else {
Color.clear.frame(width: 40, height: 40)
}
Spacer()
endCallButton()
Spacer()
if call.videoEnabled {
flipCameraButton()
} else {
Color.clear.frame(width: 40, height: 40)
}
Spacer()
toggleVideoButton()
}
.padding(.horizontal, 20)
.padding(.bottom, 16)
.frame(maxWidth: .infinity, alignment: .center)
case .audio:
ZStack(alignment: .topLeading) {
Button {
chatModel.activeCallViewIsCollapsed = true
@@ -314,32 +293,35 @@ struct ActiveCallOverlay: View {
}
.foregroundColor(.white)
.opacity(0.8)
.padding(.horizontal)
.padding(.vertical, 10)
.padding()
.frame(maxHeight: .infinity)
}
}
Spacer()
Spacer()
HStack {
toggleMicButton()
Spacer()
audioDeviceButton()
Spacer()
endCallButton()
Spacer()
if call.localMediaSources.camera {
flipCameraButton()
} else {
Color.clear.frame(width: 60, height: 60)
ZStack(alignment: .bottom) {
toggleAudioButton()
.frame(maxWidth: .infinity, alignment: .leading)
endCallButton()
// Check if the only input is microphone. And in this case show toggle button,
// If there are more inputs, it probably means something like bluetooth headphones are available
// and in this case show iOS button for choosing different output.
// There is no way to get available outputs, only inputs
if deviceManager.availableInputs.allSatisfy({ $0.portType == .builtInMic }) {
toggleSpeakerButton()
.frame(maxWidth: .infinity, alignment: .trailing)
} else if call.hasMedia {
AudioDevicePicker()
.scaleEffect(2)
.frame(maxWidth: 50, maxHeight: 40)
.frame(maxWidth: .infinity, alignment: .trailing)
} else {
Color.clear.frame(width: 50, height: 40)
}
}
Spacer()
toggleCameraButton()
.padding(.bottom, 60)
.padding(.horizontal, 48)
}
.padding(.horizontal, 20)
.padding(.bottom, 16)
.frame(maxWidth: 440, alignment: .center)
}
.frame(maxWidth: .infinity)
.onAppear {
@@ -401,54 +383,36 @@ struct ActiveCallOverlay: View {
private func endCallButton() -> some View {
let cc = CallController.shared
return callButton("phone.down.fill", .red, padding: 10) {
return callButton("phone.down.fill", width: 60, height: 60) {
if let uuid = call.callUUID {
cc.endCall(callUUID: uuid)
} else {
cc.endCall(call: call) {}
}
}
.foregroundColor(.red)
}
private func toggleMicButton() -> some View {
controlButton(call, call.localMediaSources.mic ? "mic.fill" : "mic.slash", padding: 14) {
private func toggleAudioButton() -> some View {
controlButton(call, call.audioEnabled ? "mic.fill" : "mic.slash") {
Task {
if await WebRTCClient.isAuthorized(for: .audio) {
client.setAudioEnabled(!call.localMediaSources.mic)
} else { WebRTCClient.showUnauthorizedAlert(for: .audio) }
}
}
}
func audioDeviceButton() -> some View {
// Check if the only input is microphone. And in this case show toggle button,
// If there are more inputs, it probably means something like bluetooth headphones are available
// and in this case show iOS button for choosing different output.
// There is no way to get available outputs, only inputs
Group {
if deviceManager.availableInputs.allSatisfy({ $0.portType == .builtInMic }) {
toggleSpeakerButton()
} else {
audioDevicePickerButton()
}
}
.onChange(of: call.localMediaSources.hasVideo) { hasVideo in
let current = AVAudioSession.sharedInstance().currentRoute.outputs.first?.portType
let speakerEnabled = current == .builtInSpeaker
let receiverEnabled = current == .builtInReceiver
// react automatically only when receiver were selected, otherwise keep an external device selected
if !speakerEnabled && hasVideo && receiverEnabled {
client.setSpeakerEnabledAndConfigureSession(!speakerEnabled, skipExternalDevice: true)
call.speakerEnabled = !speakerEnabled
client.setAudioEnabled(!call.audioEnabled)
DispatchQueue.main.async {
call.audioEnabled = !call.audioEnabled
}
}
}
}
private func toggleSpeakerButton() -> some View {
controlButton(call, !call.peerMediaSources.mic ? "speaker.slash" : call.speakerEnabled ? "speaker.wave.2.fill" : "speaker.wave.1.fill", padding: !call.peerMediaSources.mic ? 16 : call.speakerEnabled ? 15 : 17) {
let speakerEnabled = AVAudioSession.sharedInstance().currentRoute.outputs.first?.portType == .builtInSpeaker
client.setSpeakerEnabledAndConfigureSession(!speakerEnabled)
call.speakerEnabled = !speakerEnabled
controlButton(call, call.speakerEnabled ? "speaker.wave.2.fill" : "speaker.wave.1.fill") {
Task {
let speakerEnabled = AVAudioSession.sharedInstance().currentRoute.outputs.first?.portType == .builtInSpeaker
client.setSpeakerEnabledAndConfigureSession(!speakerEnabled)
DispatchQueue.main.async {
call.speakerEnabled = !speakerEnabled
}
}
}
.onAppear {
deviceManager.call = call
@@ -456,67 +420,53 @@ struct ActiveCallOverlay: View {
}
}
private func toggleCameraButton() -> some View {
controlButton(call, call.localMediaSources.camera ? "video.fill" : "video.slash", padding: call.localMediaSources.camera ? 16 : 14) {
private func toggleVideoButton() -> some View {
controlButton(call, call.videoEnabled ? "video.fill" : "video.slash") {
Task {
if await WebRTCClient.isAuthorized(for: .video) {
client.setCameraEnabled(!call.localMediaSources.camera)
} else { WebRTCClient.showUnauthorizedAlert(for: .video) }
client.setVideoEnabled(!call.videoEnabled)
DispatchQueue.main.async {
call.videoEnabled = !call.videoEnabled
}
}
}
.disabled(call.initialCallType == .audio && client.activeCall?.peerHasOldVersion == true)
}
@ViewBuilder private func flipCameraButton() -> some View {
controlButton(call, "arrow.triangle.2.circlepath", padding: 12) {
controlButton(call, "arrow.triangle.2.circlepath") {
Task {
if await WebRTCClient.isAuthorized(for: .video) {
client.flipCamera()
}
client.flipCamera()
}
}
}
@ViewBuilder private func controlButton(_ call: Call, _ imageName: String, padding: CGFloat, _ perform: @escaping () -> Void) -> some View {
callButton(imageName, call.peerMediaSources.hasVideo ? Color.black.opacity(0.2) : Color.white.opacity(0.2), padding: padding, perform)
@ViewBuilder private func controlButton(_ call: Call, _ imageName: String, _ perform: @escaping () -> Void) -> some View {
if call.hasMedia {
callButton(imageName, width: 50, height: 38, perform)
.foregroundColor(.white)
.opacity(0.85)
} else {
Color.clear.frame(width: 50, height: 38)
}
}
@ViewBuilder private func audioDevicePickerButton() -> some View {
AudioDevicePicker()
.opacity(0.8)
.scaleEffect(2)
.padding(10)
.frame(width: 60, height: 60)
.background(call.peerMediaSources.hasVideo ? Color.black.opacity(0.2) : Color.white.opacity(0.2))
.clipShape(.circle)
}
private func callButton(_ imageName: String, _ background: Color, padding: CGFloat, _ perform: @escaping () -> Void) -> some View {
private func callButton(_ imageName: String, width: CGFloat, height: CGFloat, _ perform: @escaping () -> Void) -> some View {
Button {
perform()
} label: {
Image(systemName: imageName)
.resizable()
.scaledToFit()
.padding(padding)
.frame(width: 60, height: 60)
.background(background)
.frame(maxWidth: width, maxHeight: height)
}
.foregroundColor(whiteColorWithAlpha)
.clipShape(.circle)
}
private var whiteColorWithAlpha: Color {
get { Color(red: 204 / 255, green: 204 / 255, blue: 204 / 255) }
}
}
struct ActiveCallOverlay_Previews: PreviewProvider {
static var previews: some View {
Group{
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callUUID: UUID().uuidString.lowercased(), callState: .offerSent, initialCallType: .video), client: WebRTCClient({ _ in }, Binding.constant(nil)))
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callUUID: UUID().uuidString.lowercased(), callState: .offerSent, localMedia: .video), client: WebRTCClient(Binding.constant(nil), { _ in }, Binding.constant(nil)))
.background(.black)
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callUUID: UUID().uuidString.lowercased(), callState: .offerSent, initialCallType: .audio), client: WebRTCClient({ _ in }, Binding.constant(nil)))
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callUUID: UUID().uuidString.lowercased(), callState: .offerSent, localMedia: .audio), client: WebRTCClient(Binding.constant(nil), { _ in }, Binding.constant(nil)))
.background(.black)
}
}
@@ -104,7 +104,7 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
}
func provider(_ provider: CXProvider, perform action: CXSetMutedCallAction) {
if callManager.enableMedia(source: .mic, enable: !action.isMuted, callUUID: action.callUUID.uuidString.lowercased()) {
if callManager.enableMedia(media: .audio, enable: !action.isMuted, callUUID: action.callUUID.uuidString.lowercased()) {
action.fulfill()
} else {
action.fail()
@@ -121,8 +121,8 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
RTCAudioSession.sharedInstance().audioSessionDidActivate(audioSession)
RTCAudioSession.sharedInstance().isAudioEnabled = true
do {
let hasVideo = ChatModel.shared.activeCall?.hasVideo == true
if hasVideo {
let supportsVideo = ChatModel.shared.activeCall?.supportsVideo == true
if supportsVideo {
try audioSession.setCategory(.playAndRecord, mode: .videoChat, options: [.defaultToSpeaker, .mixWithOthers, .allowBluetooth, .allowAirPlay, .allowBluetoothA2DP])
} else {
try audioSession.setCategory(.playAndRecord, mode: .voiceChat, options: [.mixWithOthers, .allowBluetooth, .allowAirPlay, .allowBluetoothA2DP])
@@ -133,7 +133,7 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
try? await Task.sleep(nanoseconds: UInt64(i) * 300_000000)
if let preferred = audioSession.preferredInputDevice() {
await MainActor.run { try? audioSession.setPreferredInput(preferred) }
} else if hasVideo {
} else if supportsVideo {
await MainActor.run { try? audioSession.overrideOutputAudioPort(.speaker) }
}
}
@@ -357,9 +357,11 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
self.provider.reportCall(with: uuid, updated: update)
}
} else if callManager.startOutgoingCall(callUUID: callUUID) {
logger.debug("CallController.startCall: call started")
} else {
logger.error("CallController.startCall: no active call")
if callManager.startOutgoingCall(callUUID: callUUID) {
logger.debug("CallController.startCall: call started")
} else {
logger.error("CallController.startCall: no active call")
}
}
}
+5 -5
View File
@@ -12,7 +12,7 @@ import SimpleXChat
class CallManager {
func newOutgoingCall(_ contact: Contact, _ media: CallMediaType) -> String {
let uuid = UUID().uuidString.lowercased()
let call = Call(direction: .outgoing, contact: contact, callUUID: uuid, callState: .waitCapabilities, initialCallType: media)
let call = Call(direction: .outgoing, contact: contact, callUUID: uuid, callState: .waitCapabilities, localMedia: media)
call.speakerEnabled = media == .video
ChatModel.shared.activeCall = call
return uuid
@@ -22,7 +22,7 @@ class CallManager {
let m = ChatModel.shared
if let call = m.activeCall, call.callUUID == callUUID {
m.showCallView = true
Task { await m.callCommand.processCommand(.capabilities(media: call.initialCallType)) }
Task { await m.callCommand.processCommand(.capabilities(media: call.localMedia)) }
return true
}
return false
@@ -44,7 +44,7 @@ class CallManager {
contact: invitation.contact,
callUUID: invitation.callUUID,
callState: .invitationAccepted,
initialCallType: invitation.callType.media,
localMedia: invitation.callType.media,
sharedKey: invitation.sharedKey
)
call.speakerEnabled = invitation.callType.media == .video
@@ -68,10 +68,10 @@ class CallManager {
}
}
func enableMedia(source: CallMediaSource, enable: Bool, callUUID: String) -> Bool {
func enableMedia(media: CallMediaType, enable: Bool, callUUID: String) -> Bool {
if let call = ChatModel.shared.activeCall, call.callUUID == callUUID {
let m = ChatModel.shared
Task { await m.callCommand.processCommand(.media(source: source, enable: enable)) }
Task { await m.callCommand.processCommand(.media(media: media, enable: enable)) }
return true
}
return false
@@ -10,49 +10,40 @@ import AVKit
struct CallViewRemote: UIViewRepresentable {
var client: WebRTCClient
@ObservedObject var call: Call
var activeCall: Binding<WebRTCClient.Call?>
@State var enablePip: (Bool) -> Void = {_ in }
@Binding var activeCallViewIsCollapsed: Bool
@Binding var contentMode: UIView.ContentMode
@Binding var pipShown: Bool
init(client: WebRTCClient, activeCall: Binding<WebRTCClient.Call?>, activeCallViewIsCollapsed: Binding<Bool>, pipShown: Binding<Bool>) {
self.client = client
self.activeCall = activeCall
self._activeCallViewIsCollapsed = activeCallViewIsCollapsed
self._pipShown = pipShown
}
func makeUIView(context: Context) -> UIView {
let view = UIView()
let remoteCameraRenderer = RTCMTLVideoView(frame: view.frame)
remoteCameraRenderer.videoContentMode = contentMode
remoteCameraRenderer.tag = 0
if let call = activeCall.wrappedValue {
let remoteRenderer = RTCMTLVideoView(frame: view.frame)
remoteRenderer.videoContentMode = .scaleAspectFill
client.addRemoteRenderer(call, remoteRenderer)
addSubviewAndResize(remoteRenderer, into: view)
let screenVideo = call.peerMediaSources.screenVideo
let remoteScreenRenderer = RTCMTLVideoView(frame: view.frame)
remoteScreenRenderer.videoContentMode = contentMode
remoteScreenRenderer.tag = 1
remoteScreenRenderer.alpha = screenVideo ? 1 : 0
context.coordinator.cameraRenderer = remoteCameraRenderer
context.coordinator.screenRenderer = remoteScreenRenderer
client.addRemoteCameraRenderer(remoteCameraRenderer)
client.addRemoteScreenRenderer(remoteScreenRenderer)
if screenVideo {
addSubviewAndResize(remoteScreenRenderer, remoteCameraRenderer, into: view)
} else {
addSubviewAndResize(remoteCameraRenderer, remoteScreenRenderer, into: view)
}
if AVPictureInPictureController.isPictureInPictureSupported() {
makeViewWithRTCRenderer(remoteCameraRenderer, remoteScreenRenderer, view, context)
if AVPictureInPictureController.isPictureInPictureSupported() {
makeViewWithRTCRenderer(call, remoteRenderer, view, context)
}
}
return view
}
func makeViewWithRTCRenderer(_ remoteCameraRenderer: RTCMTLVideoView, _ remoteScreenRenderer: RTCMTLVideoView, _ view: UIView, _ context: Context) {
let pipRemoteCameraRenderer = RTCMTLVideoView(frame: view.frame)
pipRemoteCameraRenderer.videoContentMode = .scaleAspectFill
let pipRemoteScreenRenderer = RTCMTLVideoView(frame: view.frame)
pipRemoteScreenRenderer.videoContentMode = .scaleAspectFill
func makeViewWithRTCRenderer(_ call: WebRTCClient.Call, _ remoteRenderer: RTCMTLVideoView, _ view: UIView, _ context: Context) {
let pipRemoteRenderer = RTCMTLVideoView(frame: view.frame)
pipRemoteRenderer.videoContentMode = .scaleAspectFill
let pipVideoCallViewController = AVPictureInPictureVideoCallViewController()
pipVideoCallViewController.preferredContentSize = CGSize(width: 1080, height: 1920)
addSubviewAndResize(pipRemoteRenderer, into: pipVideoCallViewController.view)
let pipContentSource = AVPictureInPictureController.ContentSource(
activeVideoCallSourceView: view,
contentViewController: pipVideoCallViewController
@@ -64,9 +55,7 @@ struct CallViewRemote: UIViewRepresentable {
context.coordinator.pipController = pipController
context.coordinator.willShowHide = { show in
if show {
client.addRemoteCameraRenderer(pipRemoteCameraRenderer)
client.addRemoteScreenRenderer(pipRemoteScreenRenderer)
context.coordinator.relayout()
client.addRemoteRenderer(call, pipRemoteRenderer)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
activeCallViewIsCollapsed = true
}
@@ -78,29 +67,13 @@ struct CallViewRemote: UIViewRepresentable {
}
context.coordinator.didShowHide = { show in
if show {
remoteCameraRenderer.isHidden = true
remoteScreenRenderer.isHidden = true
remoteRenderer.isHidden = true
} else {
client.removeRemoteCameraRenderer(pipRemoteCameraRenderer)
client.removeRemoteScreenRenderer(pipRemoteScreenRenderer)
remoteCameraRenderer.isHidden = false
remoteScreenRenderer.isHidden = false
client.removeRemoteRenderer(call, pipRemoteRenderer)
remoteRenderer.isHidden = false
}
pipShown = show
}
context.coordinator.relayout = {
let camera = call.peerMediaSources.camera
let screenVideo = call.peerMediaSources.screenVideo
pipRemoteCameraRenderer.alpha = camera ? 1 : 0
pipRemoteScreenRenderer.alpha = screenVideo ? 1 : 0
if screenVideo {
addSubviewAndResize(pipRemoteScreenRenderer, pipRemoteCameraRenderer, pip: true, into: pipVideoCallViewController.view)
} else {
addSubviewAndResize(pipRemoteCameraRenderer, pipRemoteScreenRenderer, pip: true, into: pipVideoCallViewController.view)
}
(pipVideoCallViewController.view.subviews[0] as! RTCMTLVideoView).videoContentMode = contentMode
(pipVideoCallViewController.view.subviews[1] as! RTCMTLVideoView).videoContentMode = .scaleAspectFill
}
DispatchQueue.main.async {
enablePip = { enable in
if enable != pipShown /* pipController.isPictureInPictureActive */ {
@@ -115,50 +88,24 @@ struct CallViewRemote: UIViewRepresentable {
}
func makeCoordinator() -> Coordinator {
Coordinator(client)
Coordinator()
}
func updateUIView(_ view: UIView, context: Context) {
logger.debug("CallView.updateUIView remote")
let camera = view.subviews.first(where: { $0.tag == 0 })!
let screen = view.subviews.first(where: { $0.tag == 1 })!
let screenVideo = call.peerMediaSources.screenVideo
if screenVideo && screen.alpha == 0 {
screen.alpha = 1
addSubviewAndResize(screen, camera, into: view)
} else if !screenVideo && screen.alpha == 1 {
screen.alpha = 0
addSubviewAndResize(camera, screen, into: view)
}
(view.subviews[0] as! RTCMTLVideoView).videoContentMode = contentMode
(view.subviews[1] as! RTCMTLVideoView).videoContentMode = .scaleAspectFill
camera.alpha = call.peerMediaSources.camera ? 1 : 0
screen.alpha = call.peerMediaSources.screenVideo ? 1 : 0
DispatchQueue.main.async {
if activeCallViewIsCollapsed != pipShown {
enablePip(activeCallViewIsCollapsed)
} else if pipShown {
context.coordinator.relayout()
}
}
}
// MARK: - Coordinator
class Coordinator: NSObject, AVPictureInPictureControllerDelegate {
var cameraRenderer: RTCMTLVideoView?
var screenRenderer: RTCMTLVideoView?
var client: WebRTCClient
var pipController: AVPictureInPictureController? = nil
var willShowHide: (Bool) -> Void = { _ in }
var didShowHide: (Bool) -> Void = { _ in }
var relayout: () -> Void = {}
required init(_ client: WebRTCClient) {
self.client = client
}
func pictureInPictureControllerWillStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {
willShowHide(true)
}
@@ -180,20 +127,11 @@ struct CallViewRemote: UIViewRepresentable {
}
deinit {
// TODO: deinit is not called when changing call type from audio to video and back,
// which causes many renderers can be created and added to stream (if enabling/disabling
// video while not yet connected in outgoing call)
pipController?.stopPictureInPicture()
pipController?.canStartPictureInPictureAutomaticallyFromInline = false
pipController?.contentSource = nil
pipController?.delegate = nil
pipController = nil
if let cameraRenderer {
client.removeRemoteCameraRenderer(cameraRenderer)
}
if let screenRenderer {
client.removeRemoteScreenRenderer(screenRenderer)
}
}
}
@@ -210,109 +148,51 @@ struct CallViewRemote: UIViewRepresentable {
struct CallViewLocal: UIViewRepresentable {
var client: WebRTCClient
var activeCall: Binding<WebRTCClient.Call?>
var localRendererAspectRatio: Binding<CGFloat?>
@State var pipStateChanged: (Bool) -> Void = {_ in }
@Binding var pipShown: Bool
init(client: WebRTCClient, localRendererAspectRatio: Binding<CGFloat?>, pipShown: Binding<Bool>) {
init(client: WebRTCClient, activeCall: Binding<WebRTCClient.Call?>, localRendererAspectRatio: Binding<CGFloat?>, pipShown: Binding<Bool>) {
self.client = client
self.activeCall = activeCall
self.localRendererAspectRatio = localRendererAspectRatio
self._pipShown = pipShown
}
func makeUIView(context: Context) -> UIView {
let view = UIView()
let localRenderer = RTCEAGLVideoView(frame: .zero)
context.coordinator.renderer = localRenderer
client.addLocalRenderer(localRenderer)
addSubviewAndResize(localRenderer, nil, into: view)
DispatchQueue.main.async {
pipStateChanged = { shown in
localRenderer.isHidden = shown
if let call = activeCall.wrappedValue {
let localRenderer = RTCEAGLVideoView(frame: .zero)
client.addLocalRenderer(call, localRenderer)
client.startCaptureLocalVideo(call)
addSubviewAndResize(localRenderer, into: view)
DispatchQueue.main.async {
pipStateChanged = { shown in
localRenderer.isHidden = shown
}
}
}
return view
}
func makeCoordinator() -> Coordinator {
Coordinator(client)
}
func updateUIView(_ view: UIView, context: Context) {
logger.debug("CallView.updateUIView local")
pipStateChanged(pipShown)
}
// MARK: - Coordinator
class Coordinator: NSObject, AVPictureInPictureControllerDelegate {
var renderer: RTCEAGLVideoView?
var client: WebRTCClient
required init(_ client: WebRTCClient) {
self.client = client
}
deinit {
if let renderer {
client.removeLocalRenderer(renderer)
}
}
}
}
private func addSubviewAndResize(_ fullscreen: UIView, _ end: UIView?, pip: Bool = false, into containerView: UIView) {
if containerView.subviews.firstIndex(of: fullscreen) == 0 && ((end == nil && containerView.subviews.count == 1) || (end != nil && containerView.subviews.firstIndex(of: end!) == 1)) {
// Nothing to do, elements on their places
return
}
containerView.removeConstraints(containerView.constraints)
containerView.subviews.forEach { sub in sub.removeFromSuperview()}
containerView.addSubview(fullscreen)
fullscreen.translatesAutoresizingMaskIntoConstraints = false
fullscreen.layer.cornerRadius = 0
fullscreen.layer.masksToBounds = false
if let end {
containerView.addSubview(end)
end.translatesAutoresizingMaskIntoConstraints = false
end.layer.cornerRadius = pip ? 8 : 10
end.layer.masksToBounds = true
}
let constraintFullscreenV = NSLayoutConstraint.constraints(
withVisualFormat: "V:|[fullscreen]|",
private func addSubviewAndResize(_ view: UIView, into containerView: UIView) {
containerView.addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
containerView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view]|",
options: [],
metrics: nil,
views: ["fullscreen": fullscreen]
)
let constraintFullscreenH = NSLayoutConstraint.constraints(
withVisualFormat: "H:|[fullscreen]|",
views: ["view": view]))
containerView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[view]|",
options: [],
metrics: nil,
views: ["fullscreen": fullscreen]
)
containerView.addConstraints(constraintFullscreenV)
containerView.addConstraints(constraintFullscreenH)
if let end {
let constraintEndWidth = NSLayoutConstraint(
item: end, attribute: .width, relatedBy: .equal, toItem: containerView, attribute: .width, multiplier: pip ? 0.5 : 0.3, constant: 0
)
let constraintEndHeight = NSLayoutConstraint(
item: end, attribute: .height, relatedBy: .equal, toItem: containerView, attribute: .width, multiplier: pip ? 0.5 * 1.33 : 0.3 * 1.33, constant: 0
)
let constraintEndX = NSLayoutConstraint(
item: end, attribute: .leading, relatedBy: .equal, toItem: containerView, attribute: .trailing, multiplier: pip ? 0.5 : 0.7, constant: pip ? -8 : -17
)
let constraintEndY = NSLayoutConstraint(
item: end, attribute: .bottom, relatedBy: .equal, toItem: containerView, attribute: .bottom, multiplier: 1, constant: pip ? -8 : -92
)
containerView.addConstraint(constraintEndWidth)
containerView.addConstraint(constraintEndHeight)
containerView.addConstraint(constraintEndX)
containerView.addConstraint(constraintEndY)
}
views: ["view": view]))
containerView.layoutIfNeeded()
}
+17 -39
View File
@@ -19,13 +19,14 @@ class Call: ObservableObject, Equatable {
var direction: CallDirection
var contact: Contact
var callUUID: String?
var initialCallType: CallMediaType
@Published var localMediaSources: CallMediaSources
var localMedia: CallMediaType
@Published var callState: CallState
@Published var localCapabilities: CallCapabilities?
@Published var peerMediaSources: CallMediaSources = CallMediaSources()
@Published var peerMedia: CallMediaType?
@Published var sharedKey: String?
@Published var audioEnabled = true
@Published var speakerEnabled = false
@Published var videoEnabled: Bool
@Published var connectionInfo: ConnectionInfo?
@Published var connectedAt: Date? = nil
@@ -34,33 +35,32 @@ class Call: ObservableObject, Equatable {
contact: Contact,
callUUID: String?,
callState: CallState,
initialCallType: CallMediaType,
localMedia: CallMediaType,
sharedKey: String? = nil
) {
self.direction = direction
self.contact = contact
self.callUUID = callUUID
self.callState = callState
self.initialCallType = initialCallType
self.localMedia = localMedia
self.sharedKey = sharedKey
self.localMediaSources = CallMediaSources(
mic: AVCaptureDevice.authorizationStatus(for: .audio) == .authorized,
camera: initialCallType == .video && AVCaptureDevice.authorizationStatus(for: .video) == .authorized)
self.videoEnabled = localMedia == .video
}
var encrypted: Bool { get { localEncrypted && sharedKey != nil } }
private var localEncrypted: Bool { get { localCapabilities?.encryption ?? false } }
var localEncrypted: Bool { get { localCapabilities?.encryption ?? false } }
var encryptionStatus: LocalizedStringKey {
get {
switch callState {
case .waitCapabilities: return ""
case .invitationSent: return localEncrypted ? "e2e encrypted" : "no e2e encryption"
case .invitationAccepted: return sharedKey == nil ? "contact has no e2e encryption" : "contact has e2e encryption"
default: return !localEncrypted ? "no e2e encryption" : sharedKey == nil ? "contact has no e2e encryption" : "e2e encrypted"
default: return !localEncrypted ? "no e2e encryption" : sharedKey == nil ? "contact has no e2e encryption" : "e2e encrypted"
}
}
}
var hasVideo: Bool { get { localMediaSources.hasVideo || peerMediaSources.hasVideo } }
var hasMedia: Bool { get { callState == .offerSent || callState == .negotiated || callState == .connected } }
var supportsVideo: Bool { get { peerMedia == .video || localMedia == .video } }
}
enum CallDirection {
@@ -105,28 +105,18 @@ struct WVAPIMessage: Equatable, Decodable, Encodable {
var command: WCallCommand?
}
struct CallMediaSources: Equatable, Codable {
var mic: Bool = false
var camera: Bool = false
var screenAudio: Bool = false
var screenVideo: Bool = false
var hasVideo: Bool { get { camera || screenVideo } }
}
enum WCallCommand: Equatable, Encodable, Decodable {
case capabilities(media: CallMediaType)
case start(media: CallMediaType, aesKey: String? = nil, iceServers: [RTCIceServer]? = nil, relay: Bool? = nil)
case offer(offer: String, iceCandidates: String, media: CallMediaType, aesKey: String? = nil, iceServers: [RTCIceServer]? = nil, relay: Bool? = nil)
case answer(answer: String, iceCandidates: String)
case ice(iceCandidates: String)
case media(source: CallMediaSource, enable: Bool)
case media(media: CallMediaType, enable: Bool)
case end
enum CodingKeys: String, CodingKey {
case type
case media
case source
case aesKey
case offer
case answer
@@ -177,9 +167,9 @@ enum WCallCommand: Equatable, Encodable, Decodable {
case let .ice(iceCandidates):
try container.encode("ice", forKey: .type)
try container.encode(iceCandidates, forKey: .iceCandidates)
case let .media(source, enable):
case let .media(media, enable):
try container.encode("media", forKey: .type)
try container.encode(source, forKey: .media)
try container.encode(media, forKey: .media)
try container.encode(enable, forKey: .enable)
case .end:
try container.encode("end", forKey: .type)
@@ -215,9 +205,9 @@ enum WCallCommand: Equatable, Encodable, Decodable {
let iceCandidates = try container.decode(String.self, forKey: CodingKeys.iceCandidates)
self = .ice(iceCandidates: iceCandidates)
case "media":
let source = try container.decode(CallMediaSource.self, forKey: CodingKeys.source)
let media = try container.decode(CallMediaType.self, forKey: CodingKeys.media)
let enable = try container.decode(Bool.self, forKey: CodingKeys.enable)
self = .media(source: source, enable: enable)
self = .media(media: media, enable: enable)
case "end":
self = .end
default:
@@ -234,7 +224,6 @@ enum WCallResponse: Equatable, Decodable {
case ice(iceCandidates: String)
case connection(state: ConnectionState)
case connected(connectionInfo: ConnectionInfo)
case peerMedia(source: CallMediaSource, enabled: Bool)
case ended
case ok
case error(message: String)
@@ -249,8 +238,6 @@ enum WCallResponse: Equatable, Decodable {
case state
case connectionInfo
case message
case source
case enabled
}
var respType: String {
@@ -262,7 +249,6 @@ enum WCallResponse: Equatable, Decodable {
case .ice: return "ice"
case .connection: return "connection"
case .connected: return "connected"
case .peerMedia: return "peerMedia"
case .ended: return "ended"
case .ok: return "ok"
case .error: return "error"
@@ -297,10 +283,6 @@ enum WCallResponse: Equatable, Decodable {
case "connected":
let connectionInfo = try container.decode(ConnectionInfo.self, forKey: CodingKeys.connectionInfo)
self = .connected(connectionInfo: connectionInfo)
case "peerMedia":
let source = try container.decode(CallMediaSource.self, forKey: CodingKeys.source)
let enabled = try container.decode(Bool.self, forKey: CodingKeys.enabled)
self = .peerMedia(source: source, enabled: enabled)
case "ended":
self = .ended
case "ok":
@@ -342,10 +324,6 @@ extension WCallResponse: Encodable {
case let .connected(connectionInfo):
try container.encode("connected", forKey: .type)
try container.encode(connectionInfo, forKey: .connectionInfo)
case let .peerMedia(source, enabled):
try container.encode("peerMedia", forKey: .type)
try container.encode(source, forKey: .source)
try container.encode(enabled, forKey: .enabled)
case .ended:
try container.encode("ended", forKey: .type)
case .ok:
@@ -398,7 +376,7 @@ actor WebRTCCommandProcessor {
func shouldRunCommand(_ client: WebRTCClient, _ c: WCallCommand) -> Bool {
switch c {
case .capabilities, .start, .offer, .end: true
default: client.activeCall != nil
default: client.activeCall.wrappedValue != nil
}
}
}
+103 -414
View File
@@ -23,24 +23,15 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
struct Call {
var connection: RTCPeerConnection
var iceCandidates: IceCandidates
var localMedia: CallMediaType
var localCamera: RTCVideoCapturer?
var localAudioTrack: RTCAudioTrack?
var localVideoTrack: RTCVideoTrack?
var remoteAudioTrack: RTCAudioTrack?
var remoteVideoTrack: RTCVideoTrack?
var remoteScreenAudioTrack: RTCAudioTrack?
var remoteScreenVideoTrack: RTCVideoTrack?
var device: AVCaptureDevice.Position
var localVideoSource: RTCVideoSource?
var localStream: RTCVideoTrack?
var remoteStream: RTCVideoTrack?
var device: AVCaptureDevice.Position = .front
var aesKey: String?
var frameEncryptor: RTCFrameEncryptor?
var frameDecryptor: RTCFrameDecryptor?
var peerHasOldVersion: Bool
}
struct NotConnectedCall {
var audioTrack: RTCAudioTrack?
var localCameraAndTrack: (RTCVideoCapturer, RTCVideoTrack)?
var device: AVCaptureDevice.Position = .front
}
actor IceCandidates {
@@ -60,20 +51,17 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
private let rtcAudioSession = RTCAudioSession.sharedInstance()
private let audioQueue = DispatchQueue(label: "chat.simplex.app.audio")
private var sendCallResponse: (WVAPIMessage) async -> Void
var activeCall: Call?
var notConnectedCall: NotConnectedCall?
var activeCall: Binding<Call?>
private var localRendererAspectRatio: Binding<CGFloat?>
var cameraRenderers: [RTCVideoRenderer] = []
var screenRenderers: [RTCVideoRenderer] = []
@available(*, unavailable)
override init() {
fatalError("Unimplemented")
}
required init(_ sendCallResponse: @escaping (WVAPIMessage) async -> Void, _ localRendererAspectRatio: Binding<CGFloat?>) {
required init(_ activeCall: Binding<Call?>, _ sendCallResponse: @escaping (WVAPIMessage) async -> Void, _ localRendererAspectRatio: Binding<CGFloat?>) {
self.sendCallResponse = sendCallResponse
self.activeCall = activeCall
self.localRendererAspectRatio = localRendererAspectRatio
rtcAudioSession.useManualAudio = CallController.useCallKit()
rtcAudioSession.isAudioEnabled = !CallController.useCallKit()
@@ -90,45 +78,39 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
func initializeCall(_ iceServers: [WebRTC.RTCIceServer]?, _ mediaType: CallMediaType, _ aesKey: String?, _ relay: Bool?) -> Call {
let connection = createPeerConnection(iceServers ?? getWebRTCIceServers() ?? defaultIceServers, relay)
connection.delegate = self
let device = notConnectedCall?.device ?? .front
createAudioSender(connection)
var localStream: RTCVideoTrack? = nil
var remoteStream: RTCVideoTrack? = nil
var localCamera: RTCVideoCapturer? = nil
var localAudioTrack: RTCAudioTrack? = nil
var localVideoTrack: RTCVideoTrack? = nil
if let localCameraAndTrack = notConnectedCall?.localCameraAndTrack {
(localCamera, localVideoTrack) = localCameraAndTrack
} else if notConnectedCall == nil && mediaType == .video {
(localCamera, localVideoTrack) = createVideoTrackAndStartCapture(device)
var localVideoSource: RTCVideoSource? = nil
if mediaType == .video {
(localStream, remoteStream, localCamera, localVideoSource) = createVideoSender(connection)
}
if let audioTrack = notConnectedCall?.audioTrack {
localAudioTrack = audioTrack
} else if notConnectedCall == nil {
localAudioTrack = createAudioTrack()
}
notConnectedCall?.localCameraAndTrack = nil
notConnectedCall?.audioTrack = nil
var frameEncryptor: RTCFrameEncryptor? = nil
var frameDecryptor: RTCFrameDecryptor? = nil
if aesKey != nil {
let encryptor = RTCFrameEncryptor.init(sizeChange: Int32(WebRTCClient.ivTagBytes))
encryptor.delegate = self
frameEncryptor = encryptor
connection.senders.forEach { $0.setRtcFrameEncryptor(encryptor) }
let decryptor = RTCFrameDecryptor.init(sizeChange: -Int32(WebRTCClient.ivTagBytes))
decryptor.delegate = self
frameDecryptor = decryptor
// Has no video receiver in outgoing call if applied here, see [peerConnection(_ connection: RTCPeerConnection, didChange newState]
// connection.receivers.forEach { $0.setRtcFrameDecryptor(decryptor) }
}
return Call(
connection: connection,
iceCandidates: IceCandidates(),
localMedia: mediaType,
localCamera: localCamera,
localAudioTrack: localAudioTrack,
localVideoTrack: localVideoTrack,
device: device,
localVideoSource: localVideoSource,
localStream: localStream,
remoteStream: remoteStream,
aesKey: aesKey,
frameEncryptor: frameEncryptor,
frameDecryptor: frameDecryptor,
peerHasOldVersion: false
frameDecryptor: frameDecryptor
)
}
@@ -169,24 +151,18 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
func sendCallCommand(command: WCallCommand) async {
var resp: WCallResponse? = nil
let pc = activeCall?.connection
let pc = activeCall.wrappedValue?.connection
switch command {
case let .capabilities(media): // outgoing
let localCameraAndTrack: (RTCVideoCapturer, RTCVideoTrack)? = media == .video
? createVideoTrackAndStartCapture(.front)
: nil
notConnectedCall = NotConnectedCall(audioTrack: createAudioTrack(), localCameraAndTrack: localCameraAndTrack, device: .front)
case .capabilities:
resp = .capabilities(capabilities: CallCapabilities(encryption: WebRTCClient.enableEncryption))
case let .start(media: media, aesKey, iceServers, relay): // incoming
case let .start(media: media, aesKey, iceServers, relay):
logger.debug("starting incoming call - create webrtc session")
if activeCall != nil { endCall() }
if activeCall.wrappedValue != nil { endCall() }
let encryption = WebRTCClient.enableEncryption
let call = initializeCall(iceServers?.toWebRTCIceServers(), media, encryption ? aesKey : nil, relay)
activeCall = call
setupLocalTracks(true, call)
activeCall.wrappedValue = call
let (offer, error) = await call.connection.offer()
if let offer = offer {
setupEncryptionForLocalTracks(call)
resp = .offer(
offer: compressToBase64(input: encodeJSON(CustomRTCSessionDescription(type: offer.type.toSdpType(), sdp: offer.sdp))),
iceCandidates: compressToBase64(input: encodeJSON(await self.getInitialIceCandidates())),
@@ -196,24 +172,18 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
} else {
resp = .error(message: "offer error: \(error?.localizedDescription ?? "unknown error")")
}
case let .offer(offer, iceCandidates, media, aesKey, iceServers, relay): // outgoing
if activeCall != nil {
case let .offer(offer, iceCandidates, media, aesKey, iceServers, relay):
if activeCall.wrappedValue != nil {
resp = .error(message: "accept: call already started")
} else if !WebRTCClient.enableEncryption && aesKey != nil {
resp = .error(message: "accept: encryption is not supported")
} else if let offer: CustomRTCSessionDescription = decodeJSON(decompressFromBase64(input: offer)),
let remoteIceCandidates: [RTCIceCandidate] = decodeJSON(decompressFromBase64(input: iceCandidates)) {
let call = initializeCall(iceServers?.toWebRTCIceServers(), media, WebRTCClient.enableEncryption ? aesKey : nil, relay)
activeCall = call
activeCall.wrappedValue = call
let pc = call.connection
if let type = offer.type, let sdp = offer.sdp {
if (try? await pc.setRemoteDescription(RTCSessionDescription(type: type.toWebRTCSdpType(), sdp: sdp))) != nil {
setupLocalTracks(false, call)
setupEncryptionForLocalTracks(call)
pc.transceivers.forEach { transceiver in
transceiver.setDirection(.sendRecv, error: nil)
}
await adaptToOldVersion(pc.transceivers.count <= 2)
let (answer, error) = await pc.answer()
if let answer = answer {
self.addIceCandidates(pc, remoteIceCandidates)
@@ -230,7 +200,7 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
}
}
}
case let .answer(answer, iceCandidates): // incoming
case let .answer(answer, iceCandidates):
if pc == nil {
resp = .error(message: "answer: call not started")
} else if pc?.localDescription == nil {
@@ -242,9 +212,6 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
let type = answer.type, let sdp = answer.sdp,
let pc = pc {
if (try? await pc.setRemoteDescription(RTCSessionDescription(type: type.toWebRTCSdpType(), sdp: sdp))) != nil {
var currentDirection: RTCRtpTransceiverDirection = .sendOnly
pc.transceivers[2].currentDirection(&currentDirection)
await adaptToOldVersion(currentDirection == .sendOnly)
addIceCandidates(pc, remoteIceCandidates)
resp = .ok
} else {
@@ -259,11 +226,13 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
} else {
resp = .error(message: "ice: call not started")
}
case let .media(source, enable):
if activeCall == nil {
case let .media(media, enable):
if activeCall.wrappedValue == nil {
resp = .error(message: "media: call not started")
} else if activeCall.wrappedValue?.localMedia == .audio && media == .video {
resp = .error(message: "media: no video")
} else {
await enableMedia(source, enable)
enableMedia(media, enable)
resp = .ok
}
case .end:
@@ -278,7 +247,7 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
func getInitialIceCandidates() async -> [RTCIceCandidate] {
await untilIceComplete(timeoutMs: 750, stepMs: 150) {}
let candidates = await activeCall?.iceCandidates.getAndClear() ?? []
let candidates = await activeCall.wrappedValue?.iceCandidates.getAndClear() ?? []
logger.debug("WebRTCClient: sending initial ice candidates: \(candidates.count)")
return candidates
}
@@ -286,7 +255,7 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
func waitForMoreIceCandidates() {
Task {
await untilIceComplete(timeoutMs: 12000, stepMs: 1500) {
let candidates = await self.activeCall?.iceCandidates.getAndClear() ?? []
let candidates = await self.activeCall.wrappedValue?.iceCandidates.getAndClear() ?? []
if candidates.count > 0 {
logger.debug("WebRTCClient: sending more ice candidates: \(candidates.count)")
await self.sendIceCandidates(candidates)
@@ -303,202 +272,25 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
)
}
func setupMuteUnmuteListener(_ transceiver: RTCRtpTransceiver, _ track: RTCMediaStreamTrack) {
// logger.log("Setting up mute/unmute listener in the call without encryption for mid = \(transceiver.mid)")
Task {
var lastBytesReceived: Int64 = 0
// muted initially
var mutedSeconds = 4
while let call = self.activeCall, transceiver.receiver.track?.readyState == .live {
let stats: RTCStatisticsReport = await call.connection.statistics(for: transceiver.receiver)
let stat = stats.statistics.values.first(where: { stat in stat.type == "inbound-rtp"})
if let stat {
//logger.debug("Stat \(stat.debugDescription)")
let bytes = stat.values["bytesReceived"] as! Int64
if bytes <= lastBytesReceived {
mutedSeconds += 1
if mutedSeconds == 3 {
await MainActor.run {
self.onMediaMuteUnmute(transceiver.mid, true)
}
}
} else {
if mutedSeconds >= 3 {
await MainActor.run {
self.onMediaMuteUnmute(transceiver.mid, false)
}
}
lastBytesReceived = bytes
mutedSeconds = 0
}
}
try? await Task.sleep(nanoseconds: 1000_000000)
}
}
func enableMedia(_ media: CallMediaType, _ enable: Bool) {
logger.debug("WebRTCClient: enabling media \(media.rawValue) \(enable)")
media == .video ? setVideoEnabled(enable) : setAudioEnabled(enable)
}
@MainActor
func onMediaMuteUnmute(_ transceiverMid: String?, _ mute: Bool) {
guard let activeCall = ChatModel.shared.activeCall else { return }
let source = mediaSourceFromTransceiverMid(transceiverMid)
logger.log("Mute/unmute \(source.rawValue) track = \(mute) with mid = \(transceiverMid ?? "nil")")
if source == .mic && activeCall.peerMediaSources.mic == mute {
activeCall.peerMediaSources.mic = !mute
} else if (source == .camera && activeCall.peerMediaSources.camera == mute) {
activeCall.peerMediaSources.camera = !mute
} else if (source == .screenAudio && activeCall.peerMediaSources.screenAudio == mute) {
activeCall.peerMediaSources.screenAudio = !mute
} else if (source == .screenVideo && activeCall.peerMediaSources.screenVideo == mute) {
activeCall.peerMediaSources.screenVideo = !mute
}
}
@MainActor
func enableMedia(_ source: CallMediaSource, _ enable: Bool) {
logger.debug("WebRTCClient: enabling media \(source.rawValue) \(enable)")
source == .camera ? setCameraEnabled(enable) : setAudioEnabled(enable)
}
@MainActor
func adaptToOldVersion(_ peerHasOldVersion: Bool) {
activeCall?.peerHasOldVersion = peerHasOldVersion
if peerHasOldVersion {
logger.debug("The peer has an old version. Remote audio track is nil = \(self.activeCall?.remoteAudioTrack == nil), video = \(self.activeCall?.remoteVideoTrack == nil)")
onMediaMuteUnmute("0", false)
if activeCall?.remoteVideoTrack != nil {
onMediaMuteUnmute("1", false)
}
if ChatModel.shared.activeCall?.localMediaSources.camera == true && ChatModel.shared.activeCall?.peerMediaSources.camera == false {
logger.debug("Stopping video track for the old version")
activeCall?.connection.senders[1].track = nil
ChatModel.shared.activeCall?.localMediaSources.camera = false
(activeCall?.localCamera as? RTCCameraVideoCapturer)?.stopCapture()
activeCall?.localCamera = nil
activeCall?.localVideoTrack = nil
}
}
}
func addLocalRenderer(_ renderer: RTCEAGLVideoView) {
if let activeCall {
if let track = activeCall.localVideoTrack {
track.add(renderer)
}
} else if let notConnectedCall {
if let track = notConnectedCall.localCameraAndTrack?.1 {
track.add(renderer)
}
}
func addLocalRenderer(_ activeCall: Call, _ renderer: RTCEAGLVideoView) {
activeCall.localStream?.add(renderer)
// To get width and height of a frame, see videoView(videoView:, didChangeVideoSize)
renderer.delegate = self
}
func removeLocalRenderer(_ renderer: RTCEAGLVideoView) {
if let activeCall {
if let track = activeCall.localVideoTrack {
track.remove(renderer)
}
} else if let notConnectedCall {
if let track = notConnectedCall.localCameraAndTrack?.1 {
track.remove(renderer)
}
}
renderer.delegate = nil
}
func videoView(_ videoView: RTCVideoRenderer, didChangeVideoSize size: CGSize) {
guard size.height > 0 else { return }
localRendererAspectRatio.wrappedValue = size.width / size.height
}
func setupLocalTracks(_ incomingCall: Bool, _ call: Call) {
let pc = call.connection
let transceivers = call.connection.transceivers
let audioTrack = call.localAudioTrack
let videoTrack = call.localVideoTrack
if incomingCall {
let micCameraInit = RTCRtpTransceiverInit()
// streamIds required for old versions which adds tracks from stream, not from track property
micCameraInit.streamIds = ["micCamera"]
let screenAudioVideoInit = RTCRtpTransceiverInit()
screenAudioVideoInit.streamIds = ["screenAudioVideo"]
// incoming call, no transceivers yet. But they should be added in order: mic, camera, screen audio, screen video
// mid = 0, mic
if let audioTrack {
pc.addTransceiver(with: audioTrack, init: micCameraInit)
} else {
pc.addTransceiver(of: .audio, init: micCameraInit)
}
// mid = 1, camera
if let videoTrack {
pc.addTransceiver(with: videoTrack, init: micCameraInit)
} else {
pc.addTransceiver(of: .video, init: micCameraInit)
}
// mid = 2, screenAudio
pc.addTransceiver(of: .audio, init: screenAudioVideoInit)
// mid = 3, screenVideo
pc.addTransceiver(of: .video, init: screenAudioVideoInit)
} else {
// new version
if transceivers.count > 2 {
// Outgoing call. All transceivers are ready. Don't addTrack() because it will create new transceivers, replace existing (nil) tracks
transceivers
.first(where: { elem in mediaSourceFromTransceiverMid(elem.mid) == .mic })?
.sender.track = audioTrack
transceivers
.first(where: { elem in mediaSourceFromTransceiverMid(elem.mid) == .camera })?
.sender.track = videoTrack
} else {
// old version, only two transceivers
if let audioTrack {
pc.add(audioTrack, streamIds: ["micCamera"])
} else {
// it's important to have any track in order to be able to turn it on again (currently it's off)
let sender = pc.add(createAudioTrack(), streamIds: ["micCamera"])
sender?.track = nil
}
if let videoTrack {
pc.add(videoTrack, streamIds: ["micCamera"])
} else {
// it's important to have any track in order to be able to turn it on again (currently it's off)
let localVideoSource = WebRTCClient.factory.videoSource()
let localVideoTrack = WebRTCClient.factory.videoTrack(with: localVideoSource, trackId: "video0")
let sender = pc.add(localVideoTrack, streamIds: ["micCamera"])
sender?.track = nil
}
}
}
}
func mediaSourceFromTransceiverMid(_ mid: String?) -> CallMediaSource {
switch mid {
case "0":
return .mic
case "1":
return .camera
case "2":
return .screenAudio
case "3":
return .screenVideo
default:
return .unknown
}
}
// Should be called after local description set
func setupEncryptionForLocalTracks(_ call: Call) {
if let encryptor = call.frameEncryptor {
call.connection.senders.forEach { $0.setRtcFrameEncryptor(encryptor) }
}
}
func frameDecryptor(_ decryptor: RTCFrameDecryptor, mediaType: RTCRtpMediaType, withFrame encrypted: Data) -> Data? {
guard encrypted.count > 0 else { return nil }
if var key: [CChar] = activeCall?.aesKey?.cString(using: .utf8),
if var key: [CChar] = activeCall.wrappedValue?.aesKey?.cString(using: .utf8),
let pointer: UnsafeMutableRawPointer = malloc(encrypted.count) {
memcpy(pointer, (encrypted as NSData).bytes, encrypted.count)
let isKeyFrame = encrypted[0] & 1 == 0
@@ -512,7 +304,7 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
func frameEncryptor(_ encryptor: RTCFrameEncryptor, mediaType: RTCRtpMediaType, withFrame unencrypted: Data) -> Data? {
guard unencrypted.count > 0 else { return nil }
if var key: [CChar] = activeCall?.aesKey?.cString(using: .utf8),
if var key: [CChar] = activeCall.wrappedValue?.aesKey?.cString(using: .utf8),
let pointer: UnsafeMutableRawPointer = malloc(unencrypted.count + WebRTCClient.ivTagBytes) {
memcpy(pointer, (unencrypted as NSData).bytes, unencrypted.count)
let isKeyFrame = unencrypted[0] & 1 == 0
@@ -535,42 +327,18 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
}
}
func addRemoteCameraRenderer(_ renderer: RTCVideoRenderer) {
if activeCall?.remoteVideoTrack != nil {
activeCall?.remoteVideoTrack?.add(renderer)
} else {
cameraRenderers.append(renderer)
}
func addRemoteRenderer(_ activeCall: Call, _ renderer: RTCVideoRenderer) {
activeCall.remoteStream?.add(renderer)
}
func removeRemoteCameraRenderer(_ renderer: RTCVideoRenderer) {
if activeCall?.remoteVideoTrack != nil {
activeCall?.remoteVideoTrack?.remove(renderer)
} else {
cameraRenderers.removeAll(where: { $0.isEqual(renderer) })
}
func removeRemoteRenderer(_ activeCall: Call, _ renderer: RTCVideoRenderer) {
activeCall.remoteStream?.remove(renderer)
}
func addRemoteScreenRenderer(_ renderer: RTCVideoRenderer) {
if activeCall?.remoteScreenVideoTrack != nil {
activeCall?.remoteScreenVideoTrack?.add(renderer)
} else {
screenRenderers.append(renderer)
}
}
func removeRemoteScreenRenderer(_ renderer: RTCVideoRenderer) {
if activeCall?.remoteScreenVideoTrack != nil {
activeCall?.remoteScreenVideoTrack?.remove(renderer)
} else {
screenRenderers.removeAll(where: { $0.isEqual(renderer) })
}
}
func startCaptureLocalVideo(_ device: AVCaptureDevice.Position?, _ capturer: RTCVideoCapturer?) {
func startCaptureLocalVideo(_ activeCall: Call) {
#if targetEnvironment(simulator)
guard
let capturer = (activeCall?.localCamera ?? notConnectedCall?.localCameraAndTrack?.0) as? RTCFileVideoCapturer
let capturer = activeCall.localCamera as? RTCFileVideoCapturer
else {
logger.error("Unable to work with a file capturer")
return
@@ -580,10 +348,10 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
capturer.startCapturing(fromFileNamed: "sounds/video.mp4")
#else
guard
let capturer = capturer as? RTCCameraVideoCapturer,
let camera = (RTCCameraVideoCapturer.captureDevices().first { $0.position == device })
let capturer = activeCall.localCamera as? RTCCameraVideoCapturer,
let camera = (RTCCameraVideoCapturer.captureDevices().first { $0.position == activeCall.device })
else {
logger.error("Unable to find a camera or local track")
logger.error("Unable to find a camera")
return
}
@@ -609,6 +377,19 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
#endif
}
private func createAudioSender(_ connection: RTCPeerConnection) {
let streamId = "stream"
let audioTrack = createAudioTrack()
connection.add(audioTrack, streamIds: [streamId])
}
private func createVideoSender(_ connection: RTCPeerConnection) -> (RTCVideoTrack?, RTCVideoTrack?, RTCVideoCapturer?, RTCVideoSource?) {
let streamId = "stream"
let (localVideoTrack, localCamera, localVideoSource) = createVideoTrack()
connection.add(localVideoTrack, streamIds: [streamId])
return (localVideoTrack, connection.transceivers.first { $0.mediaType == .video }?.receiver.track as? RTCVideoTrack, localCamera, localVideoSource)
}
private func createAudioTrack() -> RTCAudioTrack {
let audioConstrains = RTCMediaConstraints(mandatoryConstraints: nil, optionalConstraints: nil)
let audioSource = WebRTCClient.factory.audioSource(with: audioConstrains)
@@ -616,7 +397,7 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
return audioTrack
}
private func createVideoTrackAndStartCapture(_ device: AVCaptureDevice.Position) -> (RTCVideoCapturer, RTCVideoTrack) {
private func createVideoTrack() -> (RTCVideoTrack, RTCVideoCapturer, RTCVideoSource) {
let localVideoSource = WebRTCClient.factory.videoSource()
#if targetEnvironment(simulator)
@@ -626,8 +407,7 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
#endif
let localVideoTrack = WebRTCClient.factory.videoTrack(with: localVideoSource, trackId: "video0")
startCaptureLocalVideo(device, localCamera)
return (localCamera, localVideoTrack)
return (localVideoTrack, localCamera, localVideoSource)
}
func endCall() {
@@ -640,16 +420,15 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
}
private func _endCall() {
(notConnectedCall?.localCameraAndTrack?.0 as? RTCCameraVideoCapturer)?.stopCapture()
guard let call = activeCall else { return }
guard let call = activeCall.wrappedValue else { return }
logger.debug("WebRTCClient: ending the call")
activeCall.wrappedValue = nil
(call.localCamera as? RTCCameraVideoCapturer)?.stopCapture()
call.connection.close()
call.connection.delegate = nil
call.frameEncryptor?.delegate = nil
call.frameDecryptor?.delegate = nil
(call.localCamera as? RTCCameraVideoCapturer)?.stopCapture()
audioSessionToDefaults()
activeCall = nil
}
func untilIceComplete(timeoutMs: UInt64, stepMs: UInt64, action: @escaping () async -> Void) async {
@@ -658,7 +437,7 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
_ = try? await Task.sleep(nanoseconds: stepMs * 1000000)
t += stepMs
await action()
} while t < timeoutMs && activeCall?.connection.iceGatheringState != .complete
} while t < timeoutMs && activeCall.wrappedValue?.connection.iceGatheringState != .complete
}
}
@@ -719,40 +498,11 @@ extension WebRTCClient: RTCPeerConnectionDelegate {
logger.debug("Connection should negotiate")
}
func peerConnection(_ peerConnection: RTCPeerConnection, didStartReceivingOn transceiver: RTCRtpTransceiver) {
if let track = transceiver.receiver.track {
DispatchQueue.main.async {
// Doesn't work for outgoing video call (audio in video call works ok still, same as incoming call)
// if let decryptor = self.activeCall?.frameDecryptor {
// transceiver.receiver.setRtcFrameDecryptor(decryptor)
// }
let source = self.mediaSourceFromTransceiverMid(transceiver.mid)
switch source {
case .mic: self.activeCall?.remoteAudioTrack = track as? RTCAudioTrack
case .camera:
self.activeCall?.remoteVideoTrack = track as? RTCVideoTrack
self.cameraRenderers.forEach({ renderer in
self.activeCall?.remoteVideoTrack?.add(renderer)
})
self.cameraRenderers.removeAll()
case .screenAudio: self.activeCall?.remoteScreenAudioTrack = track as? RTCAudioTrack
case .screenVideo:
self.activeCall?.remoteScreenVideoTrack = track as? RTCVideoTrack
self.screenRenderers.forEach({ renderer in
self.activeCall?.remoteScreenVideoTrack?.add(renderer)
})
self.screenRenderers.removeAll()
case .unknown: ()
}
}
self.setupMuteUnmuteListener(transceiver, track)
}
}
func peerConnection(_ connection: RTCPeerConnection, didChange newState: RTCIceConnectionState) {
debugPrint("Connection new connection state: \(newState.toString() ?? "" + newState.rawValue.description) \(connection.receivers)")
guard let connectionStateString = newState.toString(),
guard let call = activeCall.wrappedValue,
let connectionStateString = newState.toString(),
let iceConnectionStateString = connection.iceConnectionState.toString(),
let iceGatheringStateString = connection.iceGatheringState.toString(),
let signalingStateString = connection.signalingState.toString()
@@ -773,14 +523,18 @@ extension WebRTCClient: RTCPeerConnectionDelegate {
switch newState {
case .checking:
if let frameDecryptor = activeCall?.frameDecryptor {
if let frameDecryptor = activeCall.wrappedValue?.frameDecryptor {
connection.receivers.forEach { $0.setRtcFrameDecryptor(frameDecryptor) }
}
let enableSpeaker: Bool = ChatModel.shared.activeCall?.localMediaSources.hasVideo == true
let enableSpeaker: Bool
switch call.localMedia {
case .video: enableSpeaker = true
default: enableSpeaker = false
}
setSpeakerEnabledAndConfigureSession(enableSpeaker)
case .connected: sendConnectedEvent(connection)
case .disconnected, .failed: endCall()
default: ()
default: do {}
}
}
}
@@ -792,7 +546,7 @@ extension WebRTCClient: RTCPeerConnectionDelegate {
func peerConnection(_ connection: RTCPeerConnection, didGenerate candidate: WebRTC.RTCIceCandidate) {
// logger.debug("Connection generated candidate \(candidate.debugDescription)")
Task {
await self.activeCall?.iceCandidates.append(candidate.toCandidate(nil, nil))
await self.activeCall.wrappedValue?.iceCandidates.append(candidate.toCandidate(nil, nil))
}
}
@@ -847,42 +601,11 @@ extension WebRTCClient: RTCPeerConnectionDelegate {
}
extension WebRTCClient {
static func isAuthorized(for type: AVMediaType) async -> Bool {
let status = AVCaptureDevice.authorizationStatus(for: type)
var isAuthorized = status == .authorized
if status == .notDetermined {
isAuthorized = await AVCaptureDevice.requestAccess(for: type)
}
return isAuthorized
func setAudioEnabled(_ enabled: Bool) {
setTrackEnabled(RTCAudioTrack.self, enabled)
}
static func showUnauthorizedAlert(for type: AVMediaType) {
if type == .audio {
AlertManager.shared.showAlert(Alert(
title: Text("No permission to record speech"),
message: Text("To record speech please grant permission to use Microphone."),
primaryButton: .default(Text("Open Settings")) {
DispatchQueue.main.async {
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)
}
},
secondaryButton: .cancel()
))
} else if type == .video {
AlertManager.shared.showAlert(Alert(
title: Text("No permission to record video"),
message: Text("To record video please grant permission to use Camera."),
primaryButton: .default(Text("Open Settings")) {
DispatchQueue.main.async {
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)
}
},
secondaryButton: .cancel()
))
}
}
func setSpeakerEnabledAndConfigureSession( _ enabled: Bool, skipExternalDevice: Bool = false) {
func setSpeakerEnabledAndConfigureSession( _ enabled: Bool) {
logger.debug("WebRTCClient: configuring session with speaker enabled \(enabled)")
audioQueue.async { [weak self] in
guard let self = self else { return }
@@ -895,7 +618,7 @@ extension WebRTCClient {
if enabled {
try self.rtcAudioSession.setCategory(AVAudioSession.Category.playAndRecord.rawValue, with: [.defaultToSpeaker, .allowBluetooth, .allowAirPlay, .allowBluetoothA2DP])
try self.rtcAudioSession.setMode(AVAudioSession.Mode.videoChat.rawValue)
if hasExternalAudioDevice && !skipExternalDevice, let preferred = self.rtcAudioSession.session.preferredInputDevice() {
if hasExternalAudioDevice, let preferred = self.rtcAudioSession.session.preferredInputDevice() {
try self.rtcAudioSession.setPreferredInput(preferred)
} else {
try self.rtcAudioSession.overrideOutputAudioPort(.speaker)
@@ -905,7 +628,7 @@ extension WebRTCClient {
try self.rtcAudioSession.setMode(AVAudioSession.Mode.voiceChat.rawValue)
try self.rtcAudioSession.overrideOutputAudioPort(.none)
}
if hasExternalAudioDevice && !skipExternalDevice {
if hasExternalAudioDevice {
logger.debug("WebRTCClient: configuring session with external device available, skip configuring speaker")
}
try self.rtcAudioSession.setActive(true)
@@ -936,59 +659,25 @@ extension WebRTCClient {
}
}
@MainActor
func setAudioEnabled(_ enabled: Bool) {
if activeCall != nil {
activeCall?.localAudioTrack = enabled ? createAudioTrack() : nil
activeCall?.connection.transceivers.first(where: { t in mediaSourceFromTransceiverMid(t.mid) == .mic })?.sender.track = activeCall?.localAudioTrack
} else if notConnectedCall != nil {
notConnectedCall?.audioTrack = enabled ? createAudioTrack() : nil
}
ChatModel.shared.activeCall?.localMediaSources.mic = enabled
}
@MainActor
func setCameraEnabled(_ enabled: Bool) {
if let call = activeCall {
if enabled {
if call.localVideoTrack == nil {
let device = activeCall?.device ?? notConnectedCall?.device ?? .front
let (camera, track) = createVideoTrackAndStartCapture(device)
activeCall?.localCamera = camera
activeCall?.localVideoTrack = track
}
} else {
(call.localCamera as? RTCCameraVideoCapturer)?.stopCapture()
activeCall?.localCamera = nil
activeCall?.localVideoTrack = nil
}
call.connection.transceivers
.first(where: { t in mediaSourceFromTransceiverMid(t.mid) == .camera })?
.sender.track = activeCall?.localVideoTrack
ChatModel.shared.activeCall?.localMediaSources.camera = activeCall?.localVideoTrack != nil
} else if let call = notConnectedCall {
if enabled {
let device = activeCall?.device ?? notConnectedCall?.device ?? .front
notConnectedCall?.localCameraAndTrack = createVideoTrackAndStartCapture(device)
} else {
(call.localCameraAndTrack?.0 as? RTCCameraVideoCapturer)?.stopCapture()
notConnectedCall?.localCameraAndTrack = nil
}
ChatModel.shared.activeCall?.localMediaSources.camera = notConnectedCall?.localCameraAndTrack != nil
}
func setVideoEnabled(_ enabled: Bool) {
setTrackEnabled(RTCVideoTrack.self, enabled)
}
func flipCamera() {
let device = activeCall?.device ?? notConnectedCall?.device
if activeCall != nil {
activeCall?.device = device == .front ? .back : .front
} else {
notConnectedCall?.device = device == .front ? .back : .front
switch activeCall.wrappedValue?.device {
case .front: activeCall.wrappedValue?.device = .back
case .back: activeCall.wrappedValue?.device = .front
default: ()
}
startCaptureLocalVideo(
activeCall?.device ?? notConnectedCall?.device,
(activeCall?.localCamera ?? notConnectedCall?.localCameraAndTrack?.0) as? RTCCameraVideoCapturer
)
if let call = activeCall.wrappedValue {
startCaptureLocalVideo(call)
}
}
private func setTrackEnabled<T: RTCMediaStreamTrack>(_ type: T.Type, _ enabled: Bool) {
activeCall.wrappedValue?.connection.transceivers
.compactMap { $0.sender.track as? T }
.forEach { $0.isEnabled = enabled }
}
}
@@ -48,7 +48,7 @@ struct CIRcvDecryptionError: View {
if case let .group(groupInfo) = chat.chatInfo,
case let .groupRcv(groupMember) = chatItem.chatDir {
do {
let (member, stats) = try apiGroupMemberInfoSync(groupInfo.apiId, groupMember.groupMemberId)
let (member, stats) = try apiGroupMemberInfo(groupInfo.apiId, groupMember.groupMemberId)
if let s = stats {
m.updateGroupMemberConnectionStats(groupInfo, member, s)
}
+3 -8
View File
@@ -137,14 +137,6 @@ struct ChatView: View {
}
}
}
// it should be presented on top level in order to prevent a bug in SwiftUI on iOS 16 related to .focused() modifier in AddGroupMembersView's search field
.appSheet(isPresented: $showAddMembersSheet) {
Group {
if case let .group(groupInfo) = cInfo {
AddGroupMembersView(chat: chat, groupInfo: groupInfo)
}
}
}
.sheet(isPresented: Binding(
get: { !forwardedChatItems.isEmpty },
set: { isPresented in
@@ -312,6 +304,9 @@ struct ChatView: View {
}
} else {
addMembersButton()
.appSheet(isPresented: $showAddMembersSheet) {
AddGroupMembersView(chat: chat, groupInfo: groupInfo)
}
}
}
Menu {
@@ -18,7 +18,6 @@ struct GroupMemberInfoView: View {
var navigation: Bool = false
@State private var connectionStats: ConnectionStats? = nil
@State private var connectionCode: String? = nil
@State private var connectionLoaded: Bool = false
@State private var newRole: GroupMemberRole = .member
@State private var alert: GroupMemberInfoViewAlert?
@State private var sheet: PlanAndConnectActionSheet?
@@ -95,137 +94,129 @@ struct GroupMemberInfoView: View {
.listRowSeparator(.hidden)
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
if connectionLoaded {
if member.memberActive {
Section {
if let code = connectionCode { verifyCodeButton(code) }
if let connStats = connectionStats,
connStats.ratchetSyncAllowed {
synchronizeConnectionButton()
}
// } else if developerTools {
// synchronizeConnectionButtonForce()
// }
if member.memberActive {
Section {
if let code = connectionCode { verifyCodeButton(code) }
if let connStats = connectionStats,
connStats.ratchetSyncAllowed {
synchronizeConnectionButton()
}
// } else if developerTools {
// synchronizeConnectionButtonForce()
// }
}
}
if let contactLink = member.contactLink {
Section {
SimpleXLinkQRCode(uri: contactLink)
Button {
showShareSheet(items: [simplexChatLink(contactLink)])
} label: {
Label("Share address", systemImage: "square.and.arrow.up")
}
if let contactId = member.memberContactId {
if knownDirectChat(contactId) == nil && !groupInfo.fullGroupPreferences.directMessages.on(for: groupInfo.membership) {
connectViaAddressButton(contactLink)
}
} else {
if let contactLink = member.contactLink {
Section {
SimpleXLinkQRCode(uri: contactLink)
Button {
showShareSheet(items: [simplexChatLink(contactLink)])
} label: {
Label("Share address", systemImage: "square.and.arrow.up")
}
if let contactId = member.memberContactId {
if knownDirectChat(contactId) == nil && !groupInfo.fullGroupPreferences.directMessages.on(for: groupInfo.membership) {
connectViaAddressButton(contactLink)
}
} header: {
Text("Address")
.foregroundColor(theme.colors.secondary)
} footer: {
Text("You can share this address with your contacts to let them connect with **\(member.displayName)**.")
.foregroundColor(theme.colors.secondary)
}
}
Section(header: Text("Member").foregroundColor(theme.colors.secondary)) {
infoRow("Group", groupInfo.displayName)
if let roles = member.canChangeRoleTo(groupInfo: groupInfo) {
Picker("Change role", selection: $newRole) {
ForEach(roles) { role in
Text(role.text)
}
}
.frame(height: 36)
} else {
infoRow("Role", member.memberRole.text)
connectViaAddressButton(contactLink)
}
} header: {
Text("Address")
.foregroundColor(theme.colors.secondary)
} footer: {
Text("You can share this address with your contacts to let them connect with **\(member.displayName)**.")
.foregroundColor(theme.colors.secondary)
}
}
if let connStats = connectionStats {
Section(header: Text("Servers").foregroundColor(theme.colors.secondary)) {
// TODO network connection status
Button("Change receiving address") {
alert = .switchAddressAlert
Section(header: Text("Member").foregroundColor(theme.colors.secondary)) {
infoRow("Group", groupInfo.displayName)
if let roles = member.canChangeRoleTo(groupInfo: groupInfo) {
Picker("Change role", selection: $newRole) {
ForEach(roles) { role in
Text(role.text)
}
}
.frame(height: 36)
} else {
infoRow("Role", member.memberRole.text)
}
}
if let connStats = connectionStats {
Section(header: Text("Servers").foregroundColor(theme.colors.secondary)) {
// TODO network connection status
Button("Change receiving address") {
alert = .switchAddressAlert
}
.disabled(
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil }
|| connStats.ratchetSyncSendProhibited
)
if connStats.rcvQueuesInfo.contains(where: { $0.rcvSwitchStatus != nil }) {
Button("Abort changing address") {
alert = .abortSwitchAddressAlert
}
.disabled(
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil }
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil && !$0.canAbortSwitch }
|| connStats.ratchetSyncSendProhibited
)
if connStats.rcvQueuesInfo.contains(where: { $0.rcvSwitchStatus != nil }) {
Button("Abort changing address") {
alert = .abortSwitchAddressAlert
}
.disabled(
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil && !$0.canAbortSwitch }
|| connStats.ratchetSyncSendProhibited
)
}
smpServers("Receiving via", connStats.rcvQueuesInfo.map { $0.rcvServer }, theme.colors.secondary)
smpServers("Sending via", connStats.sndQueuesInfo.map { $0.sndServer }, theme.colors.secondary)
}
smpServers("Receiving via", connStats.rcvQueuesInfo.map { $0.rcvServer }, theme.colors.secondary)
smpServers("Sending via", connStats.sndQueuesInfo.map { $0.sndServer }, theme.colors.secondary)
}
}
if groupInfo.membership.memberRole >= .admin {
adminDestructiveSection(member)
} else {
nonAdminBlockSection(member)
}
if groupInfo.membership.memberRole >= .admin {
adminDestructiveSection(member)
} else {
nonAdminBlockSection(member)
}
if developerTools {
Section(header: Text("For console").foregroundColor(theme.colors.secondary)) {
infoRow("Local name", member.localDisplayName)
infoRow("Database ID", "\(member.groupMemberId)")
if let conn = member.activeConn {
let connLevelDesc = conn.connLevel == 0 ? NSLocalizedString("direct", comment: "connection level description") : String.localizedStringWithFormat(NSLocalizedString("indirect (%d)", comment: "connection level description"), conn.connLevel)
infoRow("Connection", connLevelDesc)
}
Button ("Debug delivery") {
Task {
do {
let info = queueInfoText(try await apiGroupMemberQueueInfo(groupInfo.apiId, member.groupMemberId))
await MainActor.run { alert = .queueInfo(info: info) }
} catch let e {
logger.error("apiContactQueueInfo error: \(responseError(e))")
let a = getErrorAlert(e, "Error")
await MainActor.run { alert = .error(title: a.title, error: a.message) }
}
if developerTools {
Section(header: Text("For console").foregroundColor(theme.colors.secondary)) {
infoRow("Local name", member.localDisplayName)
infoRow("Database ID", "\(member.groupMemberId)")
if let conn = member.activeConn {
let connLevelDesc = conn.connLevel == 0 ? NSLocalizedString("direct", comment: "connection level description") : String.localizedStringWithFormat(NSLocalizedString("indirect (%d)", comment: "connection level description"), conn.connLevel)
infoRow("Connection", connLevelDesc)
}
Button ("Debug delivery") {
Task {
do {
let info = queueInfoText(try await apiGroupMemberQueueInfo(groupInfo.apiId, member.groupMemberId))
await MainActor.run { alert = .queueInfo(info: info) }
} catch let e {
logger.error("apiContactQueueInfo error: \(responseError(e))")
let a = getErrorAlert(e, "Error")
await MainActor.run { alert = .error(title: a.title, error: a.message) }
}
}
}
}
}
}
.navigationBarHidden(true)
.task {
.onAppear {
if #unavailable(iOS 16) {
// this condition prevents re-setting picker
if !justOpened { return }
}
justOpened = false
newRole = member.memberRole
do {
let (_, stats) = try await apiGroupMemberInfo(groupInfo.apiId, member.groupMemberId)
let (mem, code) = member.memberActive ? try await apiGetGroupMemberCode(groupInfo.apiId, member.groupMemberId) : (member, nil)
await MainActor.run {
DispatchQueue.main.async {
newRole = member.memberRole
do {
let (_, stats) = try apiGroupMemberInfo(groupInfo.apiId, member.groupMemberId)
let (mem, code) = member.memberActive ? try apiGetGroupMemberCode(groupInfo.apiId, member.groupMemberId) : (member, nil)
_ = chatModel.upsertGroupMember(groupInfo, mem)
connectionStats = stats
connectionCode = code
connectionLoaded = true
} catch let error {
logger.error("apiGroupMemberInfo or apiGetGroupMemberCode error: \(responseError(error))")
}
} catch let error {
await MainActor.run {
connectionLoaded = true
}
logger.error("apiGroupMemberInfo or apiGetGroupMemberCode error: \(responseError(error))")
}
}
.onChange(of: newRole) { newRole in
@@ -41,8 +41,7 @@ struct SelectedItemsBottomToolbar: View {
@State var forwardEnabled: Bool = false
@State var deleteCountProhibited = false
@State var forwardCountProhibited = false
@State var allButtonsDisabled = false
var body: some View {
VStack(spacing: 0) {
@@ -56,9 +55,9 @@ struct SelectedItemsBottomToolbar: View {
.resizable()
.scaledToFit()
.frame(width: 20, height: 20, alignment: .center)
.foregroundColor(!deleteEnabled || deleteCountProhibited ? theme.colors.secondary: .red)
.foregroundColor(!deleteEnabled || allButtonsDisabled ? theme.colors.secondary: .red)
}
.disabled(!deleteEnabled || deleteCountProhibited)
.disabled(!deleteEnabled || allButtonsDisabled)
Spacer()
Button {
@@ -68,9 +67,9 @@ struct SelectedItemsBottomToolbar: View {
.resizable()
.scaledToFit()
.frame(width: 20, height: 20, alignment: .center)
.foregroundColor(!moderateEnabled || deleteCountProhibited ? theme.colors.secondary : .red)
.foregroundColor(!moderateEnabled || allButtonsDisabled ? theme.colors.secondary : .red)
}
.disabled(!moderateEnabled || deleteCountProhibited)
.disabled(!moderateEnabled || allButtonsDisabled)
.opacity(canModerate ? 1 : 0)
Spacer()
@@ -81,9 +80,9 @@ struct SelectedItemsBottomToolbar: View {
.resizable()
.scaledToFit()
.frame(width: 20, height: 20, alignment: .center)
.foregroundColor(!forwardEnabled || forwardCountProhibited ? theme.colors.secondary : theme.colors.primary)
.foregroundColor(!forwardEnabled || allButtonsDisabled ? theme.colors.secondary : theme.colors.primary)
}
.disabled(!forwardEnabled || forwardCountProhibited)
.disabled(!forwardEnabled || allButtonsDisabled)
}
.frame(maxHeight: .infinity)
.padding([.leading, .trailing], 12)
@@ -106,8 +105,7 @@ struct SelectedItemsBottomToolbar: View {
private func recheckItems(_ chatInfo: ChatInfo, _ chatItems: [ChatItem], _ selectedItems: Set<Int64>?) {
let count = selectedItems?.count ?? 0
deleteCountProhibited = count == 0 || count > 200
forwardCountProhibited = count == 0 || count > 20
allButtonsDisabled = count == 0 || count > 20
canModerate = possibleToModerate(chatInfo)
if let selected = selectedItems {
let me: Bool
@@ -10,7 +10,7 @@ import SwiftUI
struct ChatHelp: View {
@EnvironmentObject var chatModel: ChatModel
let dismissSettingsSheet: DismissAction
@Binding var showSettings: Bool
var body: some View {
ScrollView { chatHelp() }
@@ -23,7 +23,7 @@ struct ChatHelp: View {
VStack(alignment: .leading, spacing: 0) {
Text("To ask any questions and to receive updates:")
Button("connect to SimpleX Chat developers.") {
dismissSettingsSheet()
showSettings = false
DispatchQueue.main.async {
UIApplication.shared.open(simplexTeamURL)
}
@@ -61,9 +61,8 @@ struct ChatHelp: View {
}
struct ChatHelp_Previews: PreviewProvider {
@Environment(\.dismiss) static var mockDismiss
static var previews: some View {
ChatHelp(dismissSettingsSheet: mockDismiss)
@State var showSettings = false
return ChatHelp(showSettings: $showSettings)
}
}
@@ -18,77 +18,19 @@ enum UserPickerSheet: Identifiable {
case settings
var id: Self { self }
var navigationTitle: LocalizedStringKey {
switch self {
case .address: "SimpleX address"
case .chatPreferences: "Your preferences"
case .chatProfiles: "Your chat profiles"
case .currentProfile: "Your current profile"
case .useFromDesktop: "Connect to desktop"
case .settings: "Your settings"
}
}
}
struct UserPickerSheetView: View {
let sheet: UserPickerSheet
@EnvironmentObject var chatModel: ChatModel
@State private var loaded = false
var body: some View {
NavigationView {
ZStack {
if loaded, let currentUser = chatModel.currentUser {
switch sheet {
case .address:
UserAddressView(shareViaProfile: currentUser.addressShared)
case .chatPreferences:
PreferencesView(
profile: currentUser.profile,
preferences: currentUser.fullPreferences,
currentPreferences: currentUser.fullPreferences
)
case .chatProfiles:
UserProfilesView()
case .currentProfile:
UserProfile()
case .useFromDesktop:
ConnectDesktopView()
case .settings:
SettingsView()
}
}
Color.clear // Required for list background to be rendered during loading
}
.navigationTitle(sheet.navigationTitle)
.navigationBarTitleDisplayMode(.large)
.modifier(ThemedBackground(grouped: true))
}
.overlay {
if let la = chatModel.laRequest {
LocalAuthView(authRequest: la)
}
}
.task {
withAnimation(
.easeOut(duration: 0.1),
{ loaded = true }
)
}
}
}
struct ChatListView: View {
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
@Binding var activeUserPickerSheet: UserPickerSheet?
@Binding var showSettings: Bool
@State private var searchMode = false
@FocusState private var searchFocussed
@State private var searchText = ""
@State private var searchShowingSimplexLink = false
@State private var searchChatFilteredBySimplexLink: String? = nil
@State private var scrollToSearchBar = false
@State private var activeUserPickerSheet: UserPickerSheet? = nil
@State private var userPickerShown: Bool = false
@AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false
@@ -116,20 +58,43 @@ struct ChatListView: View {
destination: chatView
) { chatListView }
}
.modifier(
Sheet(isPresented: $userPickerShown) {
UserPicker(userPickerShown: $userPickerShown, activeSheet: $activeUserPickerSheet)
}
)
.sheet(item: $activeUserPickerSheet) {
UserPickerSheetView(sheet: $0)
}
.onChange(of: activeUserPickerSheet) {
if $0 != nil {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
userPickerShown = false
.sheet(isPresented: $userPickerShown) {
UserPicker(activeSheet: $activeUserPickerSheet)
.sheet(item: $activeUserPickerSheet) { sheet in
if let currentUser = chatModel.currentUser {
switch sheet {
case .address:
NavigationView {
UserAddressView(shareViaProfile: currentUser.addressShared)
.navigationTitle("SimpleX address")
.navigationBarTitleDisplayMode(.large)
.modifier(ThemedBackground(grouped: true))
}
case .chatProfiles:
NavigationView {
UserProfilesView()
}
case .currentProfile:
NavigationView {
UserProfile()
.navigationTitle("Your current profile")
.modifier(ThemedBackground(grouped: true))
}
case .chatPreferences:
NavigationView {
PreferencesView(profile: currentUser.profile, preferences: currentUser.fullPreferences, currentPreferences: currentUser.fullPreferences)
.navigationTitle("Your preferences")
.navigationBarTitleDisplayMode(.large)
.modifier(ThemedBackground(grouped: true))
}
case .useFromDesktop:
ConnectDesktopView(viaSettings: false)
case .settings:
SettingsView(showSettings: $showSettings)
.navigationBarTitleDisplayMode(.large)
}
}
}
}
}
}
@@ -437,7 +402,7 @@ struct SubsStatusIndicator: View {
private func startTask() {
task = Task {
while !Task.isCancelled {
if AppChatState.shared.value == .active, ChatModel.shared.chatRunning == true {
if AppChatState.shared.value == .active {
do {
let (subs, hasSess) = try await getAgentSubsTotal()
await MainActor.run {
@@ -579,8 +544,6 @@ func chatStoppedIcon() -> some View {
}
struct ChatListView_Previews: PreviewProvider {
@State static var userPickerSheet: UserPickerSheet? = .none
static var previews: some View {
let chatModel = ChatModel()
chatModel.updateChats([
@@ -599,9 +562,9 @@ struct ChatListView_Previews: PreviewProvider {
])
return Group {
ChatListView(activeUserPickerSheet: $userPickerSheet)
ChatListView(showSettings: Binding.constant(false))
.environmentObject(chatModel)
ChatListView(activeUserPickerSheet: $userPickerSheet)
ChatListView(showSettings: Binding.constant(false))
.environmentObject(ChatModel())
}
}
+45 -135
View File
@@ -12,31 +12,42 @@ struct UserPicker: View {
@Environment(\.dynamicTypeSize) private var userFont: DynamicTypeSize
@Environment(\.scenePhase) private var scenePhase: ScenePhase
@Environment(\.colorScheme) private var colorScheme: ColorScheme
@Binding var userPickerShown: Bool
@Environment(\.dismiss) private var dismiss: DismissAction
@Binding var activeSheet: UserPickerSheet?
@State private var currentUser: Int64?
@State private var switchingProfile = false
@State private var frameWidth: CGFloat = 0
@State private var resetScroll = ResetScrollAction()
// Inset grouped list dimensions
private let imageSize: CGFloat = 44
private let rowPadding: CGFloat = 16
private let rowVerticalPadding: CGFloat = 11
private let sectionSpacing: CGFloat = 35
private var sectionHorizontalPadding: CGFloat { frameWidth > 375 ? 20 : 16 }
private let sectionShape = RoundedRectangle(cornerRadius: 10, style: .continuous)
var body: some View {
if #available(iOS 16.0, *) {
let v = viewBody.presentationDetents([.height(400)])
if #available(iOS 16.4, *) {
v.scrollBounceBehavior(.basedOnSize)
} else {
v
}
} else {
viewBody
}
}
@ViewBuilder
private var viewBody: some View {
let otherUsers: [UserInfo] = m.users
.filter { u in !u.user.hidden && u.user.userId != m.currentUser?.userId }
.sorted(using: KeyPathComparator<UserInfo>(\.user.activeOrder, order: .reverse))
let sectionWidth = max(frameWidth - sectionHorizontalPadding * 2, 0)
let currentUserWidth = max(frameWidth - sectionHorizontalPadding - rowPadding * 2 - 14 - imageSize, 0)
let stopped = m.chatRunning != true
VStack(spacing: sectionSpacing) {
VStack(spacing: 0) {
if let user = m.currentUser {
StickyScrollView(resetScroll: $resetScroll) {
StickyScrollView {
HStack(spacing: rowPadding) {
HStack {
ProfileImage(imageStr: user.image, size: imageSize, color: Color(uiColor: .tertiarySystemGroupedBackground))
@@ -45,16 +56,13 @@ struct UserPicker: View {
}
.padding(rowPadding)
.frame(width: otherUsers.isEmpty ? sectionWidth : currentUserWidth, alignment: .leading)
.modifier(ListRow { activeSheet = .currentProfile })
.background(Color(.secondarySystemGroupedBackground))
.clipShape(sectionShape)
.disabled(stopped)
.opacity(stopped ? 0.4 : 1)
.onTapGesture { activeSheet = .currentProfile }
ForEach(otherUsers) { u in
userView(u, size: imageSize)
.frame(maxWidth: sectionWidth * 0.618)
.fixedSize()
.disabled(stopped)
.opacity(stopped ? 0.4 : 1)
}
}
.padding(.horizontal, sectionHorizontalPadding)
@@ -64,21 +72,20 @@ struct UserPicker: View {
.overlay(DetermineWidth())
.onPreferenceChange(DetermineWidth.Key.self) { frameWidth = $0 }
}
VStack(spacing: 0) {
openSheetOnTap("qrcode", title: m.userAddress == nil ? "Create SimpleX address" : "Your SimpleX address", sheet: .address, disabled: stopped)
openSheetOnTap("switch.2", title: "Chat preferences", sheet: .chatPreferences, disabled: stopped)
openSheetOnTap("person.crop.rectangle.stack", title: "Your chat profiles", sheet: .chatProfiles, disabled: stopped)
openSheetOnTap("desktopcomputer", title: "Use from desktop", sheet: .useFromDesktop, disabled: stopped)
ZStack(alignment: .trailing) {
openSheetOnTap("gearshape", title: "Settings", sheet: .settings, showDivider: false)
Image(systemName: colorScheme == .light ? "sun.max" : "moon.fill")
List {
Section {
openSheetOnTap("qrcode", title: m.userAddress == nil ? "Create SimpleX address" : "Your SimpleX address", sheet: .address)
openSheetOnTap("switch.2", title: "Chat preferences", sheet: .chatPreferences)
openSheetOnTap("person.crop.rectangle.stack", title: "Your chat profiles", sheet: .chatProfiles)
openSheetOnTap("desktopcomputer", title: "Use from desktop", sheet: .useFromDesktop)
ZStack(alignment: .trailing) {
openSheetOnTap("gearshape", title: "Settings", sheet: .settings)
Image(systemName: colorScheme == .light ? "sun.max" : "moon.fill")
.resizable()
.scaledToFit()
.symbolRenderingMode(.monochrome)
.foregroundColor(theme.colors.secondary)
.frame(maxWidth: 20, maxHeight: .infinity)
.padding(.horizontal, rowPadding)
.background(Color(.systemBackground).opacity(0.01))
.frame(maxWidth: 20, maxHeight: 20)
.onTapGesture {
if (colorScheme == .light) {
ThemeManager.applyTheme(systemDarkThemeDefault.get())
@@ -89,11 +96,9 @@ struct UserPicker: View {
.onLongPressGesture {
ThemeManager.applyTheme(DefaultTheme.SYSTEM_THEME_NAME)
}
}
}
}
.clipShape(sectionShape)
.padding(.horizontal, sectionHorizontalPadding)
.padding(.bottom, sectionSpacing)
}
.onAppear {
// This check prevents the call of listUsers after the app is suspended, and the database is closed.
@@ -112,9 +117,6 @@ struct UserPicker: View {
}
}
}
.onChange(of: userPickerShown) {
if !$0 { resetScroll() }
}
.modifier(ThemedBackground(grouped: true))
.disabled(switchingProfile)
}
@@ -131,15 +133,15 @@ struct UserPicker: View {
Text(u.user.displayName).font(.title2).lineLimit(1)
}
.padding(rowPadding)
.modifier(ListRow {
.background(Color(.secondarySystemGroupedBackground))
.clipShape(sectionShape)
.onTapGesture {
switchingProfile = true
dismiss()
Task {
do {
try await changeActiveUserAsync_(u.user.userId, viewPwd: nil)
await MainActor.run {
switchingProfile = false
userPickerShown = false
}
await MainActor.run { switchingProfile = false }
} catch {
await MainActor.run {
switchingProfile = false
@@ -150,24 +152,19 @@ struct UserPicker: View {
}
}
}
})
.clipShape(sectionShape)
}
}
private func openSheetOnTap(_ icon: String, title: LocalizedStringKey, sheet: UserPickerSheet, showDivider: Bool = true, disabled: Bool = false) -> some View {
ZStack(alignment: .bottom) {
private func openSheetOnTap(_ icon: String, title: LocalizedStringKey, sheet: UserPickerSheet) -> some View {
Button {
activeSheet = sheet
} label: {
settingsRow(icon, color: theme.colors.secondary) {
Text(title).foregroundColor(.primary).opacity(disabled ? 0.4 : 1)
}
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal, rowPadding)
.padding(.vertical, rowVerticalPadding)
.modifier(ListRow { activeSheet = sheet })
.disabled(disabled)
if showDivider {
Divider().padding(.leading, 52)
Text(title).foregroundColor(.primary)
}
}
.frame(maxWidth: .infinity, alignment: .leading)
.contentShape(Rectangle())
}
private func unreadBadge(_ u: UserInfo) -> some View {
@@ -182,92 +179,6 @@ struct UserPicker: View {
}
}
struct ListRow: ViewModifier {
@Environment(\.colorScheme) private var colorScheme: ColorScheme
@State private var touchDown = false
let action: () -> Void
func body(content: Content) -> some View {
ZStack {
elevatedSecondarySystemGroupedBackground
Color(.systemGray4).opacity(touchDown ? 1 : 0)
content
TouchOverlay(touchDown: $touchDown, action: action)
}
}
var elevatedSecondarySystemGroupedBackground: Color {
switch colorScheme {
case .dark: Color(0xFF2C2C2E)
default: Color(0xFFFFFFFF)
}
}
struct TouchOverlay: UIViewRepresentable {
@Binding var touchDown: Bool
let action: () -> Void
func makeUIView(context: Context) -> TouchView {
let touchView = TouchView()
let gesture = UILongPressGestureRecognizer(
target: touchView,
action: #selector(touchView.longPress(gesture:))
)
gesture.delegate = touchView
gesture.minimumPressDuration = 0
touchView.addGestureRecognizer(gesture)
return touchView
}
func updateUIView(_ touchView: TouchView, context: Context) {
touchView.representer = self
}
class TouchView: UIView, UIGestureRecognizerDelegate {
var representer: TouchOverlay?
private var startLocation: CGPoint?
private var task: Task<Void, Never>?
@objc
func longPress(gesture: UILongPressGestureRecognizer) {
switch gesture.state {
case .began:
startLocation = gesture.location(in: nil)
task = Task {
do {
try await Task.sleep(nanoseconds: 200_000000)
await MainActor.run { representer?.touchDown = true }
} catch { }
}
case .ended:
if hitTest(gesture.location(in: self), with: nil) == self {
representer?.action()
}
task?.cancel()
representer?.touchDown = false
case .changed:
if let startLocation {
let location = gesture.location(in: nil)
let dx = location.x - startLocation.x
let dy = location.y - startLocation.y
if sqrt(pow(dx, 2) + pow(dy, 2)) > 10 { gesture.state = .failed }
}
case .cancelled, .failed:
task?.cancel()
representer?.touchDown = false
default: break
}
}
func gestureRecognizer(
_: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWith: UIGestureRecognizer
) -> Bool { true }
}
}
}
struct UserPicker_Previews: PreviewProvider {
static var previews: some View {
@State var activeSheet: UserPickerSheet?
@@ -275,7 +186,6 @@ struct UserPicker_Previews: PreviewProvider {
let m = ChatModel()
m.users = [UserInfo.sampleData, UserInfo.sampleData]
return UserPicker(
userPickerShown: .constant(true),
activeSheet: $activeSheet
)
.environmentObject(m)
@@ -44,7 +44,7 @@ enum DatabaseAlert: Identifiable {
struct DatabaseView: View {
@EnvironmentObject var m: ChatModel
@EnvironmentObject var theme: AppTheme
let dismissSettingsSheet: DismissAction
@Binding var showSettings: Bool
@State private var runChat = false
@State private var alert: DatabaseAlert? = nil
@State private var showFileImporter = false
@@ -439,7 +439,7 @@ struct DatabaseView: View {
private func startChat() {
if m.chatDbChanged {
dismissSettingsSheet()
showSettings = false
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
resetChatCtrl()
do {
@@ -533,9 +533,7 @@ func deleteChatAsync() async throws {
}
struct DatabaseView_Previews: PreviewProvider {
@Environment(\.dismiss) static var mockDismiss
static var previews: some View {
DatabaseView(dismissSettingsSheet: mockDismiss, chatItemTTL: .none)
DatabaseView(showSettings: Binding.constant(false), chatItemTTL: .none)
}
}
@@ -1,188 +0,0 @@
//
// SwiftUISheet.swift
// SimpleX (iOS)
//
// Created by user on 23/09/2024.
// Copyright © 2024 SimpleX Chat. All rights reserved.
//
import SwiftUI
private let sheetAnimationDuration: Double = 0.35
// Refrence: https://easings.net/
private let easeOutCubic = UICubicTimingParameters(
controlPoint1: CGPoint(x: 0.215, y: 0.61),
controlPoint2: CGPoint(x: 0.355, y: 1)
)
struct Sheet<SheetContent: View>: ViewModifier {
@Binding var isPresented: Bool
@ViewBuilder let sheetContent: () -> SheetContent
func body(content: Content) -> some View {
ZStack {
content
SheetRepresentable(isPresented: $isPresented, content: sheetContent())
.allowsHitTesting(isPresented)
.ignoresSafeArea()
}
}
}
struct SheetRepresentable<Content: View>: UIViewControllerRepresentable {
@Binding var isPresented: Bool
let content: Content
func makeUIViewController(context: Context) -> Controller<Content> {
Controller(content: content, representer: self)
}
func updateUIViewController(_ sheetController: Controller<Content>, context: Context) {
sheetController.animate(isPresented: isPresented)
}
class Controller<C: View>: UIViewController {
let hostingController: UIHostingController<C>
private let animator = UIViewPropertyAnimator(
duration: sheetAnimationDuration,
timingParameters: easeOutCubic
)
private let representer: SheetRepresentable<C>
private var retainedFraction: CGFloat = 0
private var sheetHeight: Double { hostingController.view.frame.height }
private var task: Task<Void, Never>?
init(content: C, representer: SheetRepresentable<C>) {
self.representer = representer
self.hostingController = UIHostingController(rootView: content)
super.init(nibName: nil, bundle: nil)
}
@available(*, unavailable)
required init?(coder: NSCoder) { fatalError("init(coder:) missing") }
deinit {
animator.stopAnimation(true)
animator.finishAnimation(at: .current)
}
func animate(isPresented: Bool) {
let alreadyAnimating = animator.isRunning && isPresented != animator.isReversed
let sheetFullyDismissed = animator.fractionComplete == (animator.isReversed ? 1 : 0)
let sheetFullyPresented = animator.fractionComplete == (animator.isReversed ? 0 : 1)
if !isPresented && sheetFullyDismissed ||
isPresented && sheetFullyPresented ||
alreadyAnimating {
return
}
animator.pauseAnimation()
animator.isReversed = !isPresented
animator.continueAnimation(
withTimingParameters: isPresented
? easeOutCubic
: UICubicTimingParameters(animationCurve: .easeIn),
durationFactor: 1 - animator.fractionComplete
)
handleVisibility()
}
func handleVisibility() {
if animator.isReversed {
task = Task {
do {
let sleepDuration = UInt64(sheetAnimationDuration * Double(NSEC_PER_SEC))
try await Task.sleep(nanoseconds: sleepDuration)
view.isHidden = true
} catch { }
}
} else {
task?.cancel()
task = nil
view.isHidden = false
}
}
override func viewDidLoad() {
view.isHidden = true
view.backgroundColor = .clear
view.addGestureRecognizer(
UITapGestureRecognizer(target: self, action: #selector(tap(gesture:)))
)
addChild(hostingController)
hostingController.didMove(toParent: self)
if let sheet = hostingController.view {
sheet.isHidden = true
sheet.clipsToBounds = true
sheet.layer.cornerRadius = 10
sheet.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]
sheet.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(pan(gesture:))))
sheet.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(sheet)
NSLayoutConstraint.activate([
hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
])
}
}
override func viewDidAppear(_ animated: Bool) {
// Ensures animations are only setup once
// on some iOS version `viewDidAppear` can get called on each state change.
if hostingController.view.isHidden {
hostingController.view.transform = CGAffineTransform(translationX: 0, y: self.sheetHeight)
hostingController.view.isHidden = false
animator.pausesOnCompletion = true
animator.addAnimations {
self.hostingController.view.transform = .identity
self.view.backgroundColor = UIColor {
switch $0.userInterfaceStyle {
case .dark: .black.withAlphaComponent(0.290)
default: .black.withAlphaComponent(0.121)
}
}
}
animator.startAnimation()
animator.pauseAnimation()
}
}
@objc
func pan(gesture: UIPanGestureRecognizer) {
switch gesture.state {
case .began:
animator.isReversed = false
animator.pauseAnimation()
retainedFraction = animator.fractionComplete
case .changed:
animator.fractionComplete = retainedFraction - gesture.translation(in: view).y / sheetHeight
case .ended, .cancelled:
let velocity = gesture.velocity(in: view).y
animator.isReversed = (velocity - (animator.fractionComplete - 0.5) * 100).sign == .plus
let defaultVelocity = sheetHeight / sheetAnimationDuration
let fractionRemaining = 1 - animator.fractionComplete
let durationFactor = min(max(fractionRemaining / (abs(velocity) / defaultVelocity), 0.5), 1)
animator.continueAnimation(withTimingParameters: nil, durationFactor: durationFactor * fractionRemaining)
handleVisibility()
DispatchQueue.main.asyncAfter(deadline: .now() + sheetAnimationDuration) {
self.representer.isPresented = !self.animator.isReversed
}
default: break
}
}
@objc
func tap(gesture: UITapGestureRecognizer) {
switch gesture.state {
case .ended:
if gesture.location(in: view).y < view.frame.height - sheetHeight {
representer.isPresented = false
}
default: break
}
}
}
}
@@ -9,7 +9,6 @@
import SwiftUI
struct StickyScrollView<Content: View>: UIViewRepresentable {
@Binding var resetScroll: ResetScrollAction
@ViewBuilder let content: () -> Content
func makeUIView(context: Context) -> UIScrollView {
@@ -19,9 +18,6 @@ struct StickyScrollView<Content: View>: UIViewRepresentable {
sv.showsHorizontalScrollIndicator = false
sv.addSubview(hc.view)
sv.delegate = context.coordinator
DispatchQueue.main.async {
resetScroll = ResetScrollAction { sv.setContentOffset(.zero, animated: false) }
}
return sv
}
@@ -54,8 +50,3 @@ struct StickyScrollView<Content: View>: UIViewRepresentable {
}
}
}
struct ResetScrollAction {
var action = { }
func callAsFunction() { action() }
}
@@ -14,8 +14,7 @@ enum ContactType: Int {
}
struct NewChatMenuButton: View {
// do not use chatModel here because it prevents showing AddGroupMembersView after group creation and QR code after link creation on iOS 16
// @EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var chatModel: ChatModel
@State private var showNewChatSheet = false
@State private var alert: SomeAlert? = nil
@State private var pendingConnection: PendingContactConnection? = nil
@@ -33,7 +32,7 @@ struct NewChatMenuButton: View {
NewChatSheet(pendingConnection: $pendingConnection)
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
.onDisappear {
alert = cleanupPendingConnection(contactConnection: pendingConnection)
alert = cleanupPendingConnection(chatModel: chatModel, contactConnection: pendingConnection)
pendingConnection = nil
}
}
@@ -45,10 +45,10 @@ enum NewChatOption: Identifiable {
var id: Self { self }
}
func cleanupPendingConnection(contactConnection: PendingContactConnection?) -> SomeAlert? {
func cleanupPendingConnection(chatModel: ChatModel, contactConnection: PendingContactConnection?) -> SomeAlert? {
var alert: SomeAlert? = nil
if !(ChatModel.shared.showingInvitation?.connChatUsed ?? true),
if !(chatModel.showingInvitation?.connChatUsed ?? true),
let conn = contactConnection {
alert = SomeAlert(
alert: Alert(
@@ -68,7 +68,7 @@ func cleanupPendingConnection(contactConnection: PendingContactConnection?) -> S
)
}
ChatModel.shared.showingInvitation = nil
chatModel.showingInvitation = nil
return alert
}
@@ -97,11 +97,6 @@ struct NewChatView: View {
}
.pickerStyle(.segmented)
.padding()
.onChange(of: $selection.wrappedValue) { opt in
if opt == NewChatOption.connect {
showQRCodeScanner = true
}
}
VStack {
// it seems there's a bug in iOS 15 if several views in switch (or if-else) statement have different transitions
@@ -157,7 +152,7 @@ struct NewChatView: View {
}
.onDisappear {
if !choosingProfile {
parentAlert = cleanupPendingConnection(contactConnection: contactConnection)
parentAlert = cleanupPendingConnection(chatModel: m, contactConnection: contactConnection)
contactConnection = nil
}
}
@@ -246,6 +241,7 @@ private struct InviteView: View {
@Binding var choosingProfile: Bool
@AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false
@State private var showSettings: Bool = false
var body: some View {
List {
@@ -697,7 +693,6 @@ struct ScannerInView: View {
.frame(maxWidth: .infinity, maxHeight: .infinity)
.foregroundColor(Color.clear)
switch cameraAuthorizationStatus {
case .authorized, nil: EmptyView()
case .restricted: Text("Camera not available")
case .denied: Label("Enable camera access", systemImage: "camera")
default: Label("Tap to scan", systemImage: "qrcode")
@@ -717,26 +712,21 @@ struct ScannerInView: View {
.disabled(cameraAuthorizationStatus == .restricted)
}
}
.task {
.onAppear {
let status = AVCaptureDevice.authorizationStatus(for: .video)
cameraAuthorizationStatus = status
if showQRCodeScanner {
switch status {
case .notDetermined: await askCameraAuthorizationAsync()
case .notDetermined: askCameraAuthorization()
case .restricted: showQRCodeScanner = false
case .denied: showQRCodeScanner = false
case .authorized: ()
@unknown default: await askCameraAuthorizationAsync()
@unknown default: askCameraAuthorization()
}
}
}
}
func askCameraAuthorizationAsync() async {
await AVCaptureDevice.requestAccess(for: .video)
cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
}
func askCameraAuthorization(_ cb: (() -> Void)? = nil) {
AVCaptureDevice.requestAccess(for: .video) { allowed in
cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
+24 -24
View File
@@ -49,34 +49,34 @@ struct QRCode: View {
ZStack {
if let image = image {
qrCodeImage(image)
GeometryReader { geo in
ZStack {
if withLogo {
let w = geo.size.width
Image("icon-light")
.resizable()
.scaledToFit()
.frame(width: w * 0.16, height: w * 0.16)
.frame(width: w * 0.165, height: w * 0.165)
.background(.white)
.clipShape(Circle())
}
}
GeometryReader { geo in
ZStack {
if withLogo {
let w = geo.size.width
Image("icon-light")
.resizable()
.scaledToFit()
.frame(width: w * 0.16, height: w * 0.16)
.frame(width: w * 0.165, height: w * 0.165)
.background(.white)
.clipShape(Circle())
}
.onAppear {
makeScreenshotFunc = {
let size = CGSizeMake(1024 / UIScreen.main.scale, 1024 / UIScreen.main.scale)
showShareSheet(items: [makeScreenshot(geo.frame(in: .local).origin, size)])
onShare?()
}
}
.frame(width: geo.size.width, height: geo.size.height)
}
} else {
Color.clear.aspectRatio(1, contentMode: .fit)
.onAppear {
makeScreenshotFunc = {
let size = CGSizeMake(1024 / UIScreen.main.scale, 1024 / UIScreen.main.scale)
showShareSheet(items: [makeScreenshot(geo.frame(in: .local).origin, size)])
onShare?()
}
}
.frame(width: geo.size.width, height: geo.size.height)
}
}
.onTapGesture(perform: makeScreenshotFunc)
.task { image = await generateImage(uri, tintColor: tintColor) }
.onAppear {
image = image ?? generateImage(uri, tintColor: tintColor)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
@@ -89,7 +89,7 @@ private func qrCodeImage(_ image: UIImage) -> some View {
.textSelection(.enabled)
}
private func generateImage(_ uri: String, tintColor: UIColor) async -> UIImage? {
private func generateImage(_ uri: String, tintColor: UIColor) -> UIImage? {
let context = CIContext()
let filter = CIFilter.qrCodeGenerator()
filter.message = Data(uri.utf8)
@@ -467,39 +467,6 @@ private let versionDescriptions: [VersionDescription] = [
)
]
),
VersionDescription(
version: "v6.1",
post: URL(string: "https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html"),
features: [
FeatureDescription(
icon: "checkmark.shield",
title: "Better security ✅",
description: "SimpleX protocols reviewed by Trail of Bits."
),
FeatureDescription(
icon: "video",
title: "Better calls",
description: "Switch audio and video during the call."
),
FeatureDescription(
icon: "bolt",
title: "Better notifications",
description: "Improved delivery, reduced traffic usage.\nMore improvements are coming soon!"
),
FeatureDescription(
icon: nil,
title: "Better user experience",
description: nil,
subfeatures: [
("link", "Switch chat profile for 1-time invitations."),
("message", "Customizable message shape."),
("calendar", "Better message dates."),
("arrowshape.turn.up.right", "Forward up to 20 messages at once."),
("flag", "Delete or moderate up to 200 messages.")
]
),
]
),
]
private let lastVersion = versionDescriptions.last!.version
@@ -14,6 +14,7 @@ struct ConnectDesktopView: View {
@EnvironmentObject var m: ChatModel
@EnvironmentObject var theme: AppTheme
@Environment(\.dismiss) var dismiss: DismissAction
var viaSettings = false
@AppStorage(DEFAULT_DEVICE_NAME_FOR_REMOTE_ACCESS) private var deviceName = UIDevice.current.name
@AppStorage(DEFAULT_CONFIRM_REMOTE_SESSIONS) private var confirmRemoteSessions = false
@AppStorage(DEFAULT_CONNECT_REMOTE_VIA_MULTICAST) private var connectRemoteViaMulticast = true
@@ -56,6 +57,16 @@ struct ConnectDesktopView: View {
}
var body: some View {
if viaSettings {
viewBody
} else {
NavigationView {
viewBody
}
}
}
var viewBody: some View {
Group {
let discovery = m.remoteCtrlSession?.discovery
if discovery == true || (discovery == nil && !showConnectScreen) {
@@ -196,14 +196,11 @@ struct AdvancedNetworkSettings: View {
if developerTools {
Section {
Picker("Transport isolation", selection: $netCfg.sessionMode) {
let modes = TransportSessionMode.values.contains(netCfg.sessionMode)
? TransportSessionMode.values
: TransportSessionMode.values + [netCfg.sessionMode]
ForEach(modes, id: \.self) { Text($0.text) }
ForEach(TransportSessionMode.values, id: \.self) { Text($0.text) }
}
.frame(height: 36)
} footer: {
sessionModeInfo(netCfg.sessionMode)
Text(sessionModeInfo(netCfg.sessionMode))
.foregroundColor(theme.colors.secondary)
}
}
@@ -356,13 +353,10 @@ struct AdvancedNetworkSettings: View {
}
}
private func sessionModeInfo(_ mode: TransportSessionMode) -> Text {
let userMode = Text("A separate TCP connection will be used **for each chat profile you have in the app**.")
return switch mode {
case .user: userMode
case .session: userMode + Text("\n") + Text("New SOCKS credentials will be used every time you start the app.")
case .server: userMode + Text("\n") + Text("New SOCKS credentials will be used for each server.")
case .entity: Text("A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail.")
private func sessionModeInfo(_ mode: TransportSessionMode) -> LocalizedStringKey {
switch mode {
case .user: return "A separate TCP connection will be used **for each chat profile you have in the app**."
case .entity: return "A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail."
}
}
@@ -257,18 +257,23 @@ let networkProxyDefault: CodableDefault<NetworkProxy> = CodableDefault(defaults:
struct SettingsView: View {
@Environment(\.colorScheme) var colorScheme
@Environment(\.dismiss) var dismiss
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var sceneDelegate: SceneDelegate
@EnvironmentObject var theme: AppTheme
@Binding var showSettings: Bool
@State private var showProgress: Bool = false
var body: some View {
ZStack {
settingsView()
NavigationView {
settingsView()
}
if showProgress {
progressView()
}
if let la = chatModel.laRequest {
LocalAuthView(authRequest: la)
}
}
}
@@ -342,7 +347,7 @@ struct SettingsView: View {
Section(header: Text("Help").foregroundColor(theme.colors.secondary)) {
if let user = user {
NavigationLink {
ChatHelp(dismissSettingsSheet: dismiss)
ChatHelp(showSettings: $showSettings)
.navigationTitle("Welcome \(user.displayName)!")
.modifier(ThemedBackground())
.frame(maxHeight: .infinity, alignment: .top)
@@ -367,7 +372,7 @@ struct SettingsView: View {
}
settingsRow("number", color: theme.colors.secondary) {
Button("Send questions and ideas") {
dismiss()
showSettings = false
DispatchQueue.main.async {
UIApplication.shared.open(simplexTeamURL)
}
@@ -424,7 +429,7 @@ struct SettingsView: View {
private func chatDatabaseRow() -> some View {
NavigationLink {
DatabaseView(dismissSettingsSheet: dismiss, chatItemTTL: chatModel.chatItemTTL)
DatabaseView(showSettings: $showSettings, chatItemTTL: chatModel.chatItemTTL)
.navigationTitle("Your chat database")
.modifier(ThemedBackground(grouped: true))
} label: {
@@ -520,7 +525,9 @@ struct SettingsView_Previews: PreviewProvider {
static var previews: some View {
let chatModel = ChatModel()
chatModel.currentUser = User.sampleData
return SettingsView()
@State var showSettings = false
return SettingsView(showSettings: $showSettings)
.environmentObject(chatModel)
}
}
@@ -925,10 +925,6 @@
<target>Кода за достъп до приложение се заменя с код за самоунищожение.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Версия на приложението</target>
@@ -1059,19 +1055,11 @@
<target>Лош хеш на съобщението</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>По-добри групи</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>По-добри съобщения</target>
@@ -1081,18 +1069,6 @@
<source>Better networking</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<note>No comment provided by engineer.</note>
@@ -1366,11 +1342,6 @@
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Потребителски профил</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<note>No comment provided by engineer.</note>
@@ -1873,10 +1844,6 @@ This is your own one-time link!</source>
<target>Персонализирано време</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<note>No comment provided by engineer.</note>
@@ -2166,10 +2133,6 @@ This is your own one-time link!</source>
<target>Изтрий старата база данни?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Изтрий предстоящата връзка?</target>
@@ -3252,10 +3215,6 @@ This is your own one-time link!</source>
<source>Forward messages without files?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Препратено</target>
@@ -3633,11 +3592,6 @@ Error: %2$@</source>
<target>Импортиране на архив</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>Подобрена доставка на съобщения</target>
@@ -4403,14 +4357,6 @@ This is your link for group %@!</source>
<target>Нов kод за достъп</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>Нов чат</target>
@@ -4527,14 +4473,6 @@ This is your link for group %@!</source>
<target>Няма мрежова връзка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Няма разрешение за запис на гласово съобщение</target>
@@ -5938,10 +5876,6 @@ Enable in *Network &amp; servers* settings.</source>
<source>Sent via proxy</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<note>No comment provided by engineer.</note>
@@ -6225,10 +6159,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Еднократна покана за SimpleX</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Опростен режим инкогнито</target>
@@ -6393,14 +6323,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Подкрепете SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>Системен</target>
@@ -6754,14 +6676,6 @@ You will be prompted to complete authentication before this feature is enabled.<
Ще бъдете подканени да извършите идентификация, преди тази функция да бъде активирана.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>За да запишете гласово съобщение, моля, дайте разрешение за използване на микрофон.</target>
@@ -7086,6 +7000,11 @@ To connect, please ask your contact to create another connection link and check
<source>Use the app with one hand.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Потребителски профил</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<note>No comment provided by engineer.</note>
@@ -898,10 +898,6 @@
<target>Přístupový kód aplikace je nahrazen sebedestrukčním přístupovým heslem.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Verze aplikace</target>
@@ -1028,18 +1024,10 @@
<target>Špatný hash zprávy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Lepší zprávy</target>
@@ -1049,18 +1037,6 @@
<source>Better networking</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<note>No comment provided by engineer.</note>
@@ -1322,11 +1298,6 @@
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Profil uživatele</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<note>No comment provided by engineer.</note>
@@ -1803,10 +1774,6 @@ This is your own one-time link!</source>
<target>Vlastní čas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<note>No comment provided by engineer.</note>
@@ -2093,10 +2060,6 @@ This is your own one-time link!</source>
<target>Smazat starou databázi?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Smazat čekající připojení?</target>
@@ -3144,10 +3107,6 @@ This is your own one-time link!</source>
<source>Forward messages without files?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
@@ -3514,11 +3473,6 @@ Error: %2$@</source>
<source>Importing archive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<note>No comment provided by engineer.</note>
@@ -4247,14 +4201,6 @@ This is your link for group %@!</source>
<target>Nové heslo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<note>No comment provided by engineer.</note>
@@ -4369,14 +4315,6 @@ This is your link for group %@!</source>
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Nemáte oprávnění nahrávat hlasové zprávy</target>
@@ -5740,10 +5678,6 @@ Enable in *Network &amp; servers* settings.</source>
<source>Sent via proxy</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<note>No comment provided by engineer.</note>
@@ -6020,10 +5954,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Jednorázová pozvánka SimpleX</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Zjednodušený inkognito režim</target>
@@ -6184,14 +6114,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Podpořte SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>Systém</target>
@@ -6533,14 +6455,6 @@ You will be prompted to complete authentication before this feature is enabled.<
Před zapnutím této funkce budete vyzváni k dokončení ověření.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>Chcete-li nahrávat hlasové zprávy, udělte povolení k použití mikrofonu.</target>
@@ -6851,6 +6765,11 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
<source>Use the app with one hand.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Profil uživatele</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<note>No comment provided by engineer.</note>
@@ -945,11 +945,6 @@
<target>App-Zugangscode wurde durch den Selbstzerstörungs-Zugangscode ersetzt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<target>App-Sitzung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>App Version</target>
@@ -1085,19 +1080,11 @@
<target>Ungültiger Nachrichten-Hash</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>Bessere Gruppen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Verbesserungen bei Nachrichten</target>
@@ -1108,18 +1095,6 @@
<target>Kontrollieren Sie Ihr Netzwerk</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Schwarz</target>
@@ -1406,11 +1381,6 @@
<target>Die Chat-Präferenzen wurden geändert.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Benutzerprofil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Chat-Design</target>
@@ -1812,7 +1782,7 @@ Das ist Ihr eigener Einmal-Link!</target>
</trans-unit>
<trans-unit id="Corner" xml:space="preserve">
<source>Corner</source>
<target>Abrundung Ecken</target>
<target>Ecken-Abrundung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Correct name to %@?" xml:space="preserve">
@@ -1940,10 +1910,6 @@ Das ist Ihr eigener Einmal-Link!</target>
<target>Zeit anpassen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<target>Design anpassen</target>
@@ -2238,10 +2204,6 @@ Das ist Ihr eigener Einmal-Link!</target>
<target>Alte Datenbank löschen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Ausstehende Verbindung löschen?</target>
@@ -3365,10 +3327,6 @@ Das ist Ihr eigener Einmal-Link!</target>
<target>Nachrichten ohne Dateien weiterleiten?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Weitergeleitet</target>
@@ -3758,11 +3716,6 @@ Fehler: %2$@</target>
<target>Archiv wird importiert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>Verbesserte Zustellung von Nachrichten</target>
@@ -4548,16 +4501,6 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Neuer Zugangscode</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<target>Jedes Mal wenn Sie die App starten, werden neue SOCKS-Anmeldeinformationen genutzt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<target>Für jeden Server werden neue SOCKS-Anmeldeinformationen genutzt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>Neuer Chat</target>
@@ -4678,16 +4621,6 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Keine Netzwerkverbindung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<target>Keine Genehmigung für Sprach-Aufnahmen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<target>Keine Genehmigung für Video-Aufnahmen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Keine Berechtigung für das Aufnehmen von Sprachnachrichten</target>
@@ -6156,11 +6089,6 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<target>Über einen Proxy gesendet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<target>Server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<target>Server-Adresse</target>
@@ -6461,10 +6389,6 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<target>SimpleX-Einmal-Einladung</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Vereinfachter Inkognito-Modus</target>
@@ -6640,14 +6564,6 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<target>Unterstützung von SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>System</target>
@@ -7012,16 +6928,6 @@ You will be prompted to complete authentication before this feature is enabled.<
Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funktion aktiviert wird.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<target>Bitte erteilen Sie für Sprach-Aufnahmen die Genehmigung das Mikrofon zu nutzen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<target>Bitte erteilen Sie für Video-Aufnahmen die Genehmigung die Kamera zu nutzen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>Bitte erlauben Sie die Nutzung des Mikrofons, um Sprachnachrichten aufnehmen zu können.</target>
@@ -7359,6 +7265,11 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<target>Die App mit einer Hand bedienen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Benutzerprofil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<target>Benutzer-Auswahl</target>
@@ -8490,7 +8401,7 @@ Verbindungsanfrage wiederholen?</target>
</trans-unit>
<trans-unit id="expired" xml:space="preserve">
<source>expired</source>
<target>Abgelaufen</target>
<target>abgelaufen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
@@ -8722,7 +8633,7 @@ Verbindungsanfrage wiederholen?</target>
</trans-unit>
<trans-unit id="other" xml:space="preserve">
<source>other</source>
<target>Andere</target>
<target>andere</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="other errors" xml:space="preserve">
@@ -4200,7 +4200,7 @@ SimpleX servers cannot see your profile.</source>
</trans-unit>
<trans-unit id="## In reply to" xml:space="preserve" approved="no">
<source>## In reply to</source>
<target state="translated">## Ως απάντηση σε</target>
<target state="translated">## Ως απαντηση σε</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="%@ (current)" xml:space="preserve" approved="no">
@@ -945,11 +945,6 @@
<target>App passcode is replaced with self-destruct passcode.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<target>App session</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>App version</target>
@@ -1085,21 +1080,11 @@
<target>Bad message hash</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<target>Better calls</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>Better groups</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<target>Better message dates.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Better messages</target>
@@ -1110,21 +1095,6 @@
<target>Better networking</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<target>Better notifications</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<target>Better security ✅</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<target>Better user experience</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Black</target>
@@ -1411,11 +1381,6 @@
<target>Chat preferences were changed.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Chat profile</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Chat theme</target>
@@ -1945,11 +1910,6 @@ This is your own one-time link!</target>
<target>Custom time</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<target>Customizable message shape.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<target>Customize theme</target>
@@ -2244,11 +2204,6 @@ This is your own one-time link!</target>
<target>Delete old database?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<target>Delete or moderate up to 200 messages.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Delete pending connection?</target>
@@ -3372,11 +3327,6 @@ This is your own one-time link!</target>
<target>Forward messages without files?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<target>Forward up to 20 messages at once.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Forwarded</target>
@@ -3766,13 +3716,6 @@ Error: %2$@</target>
<target>Importing archive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<target>Improved delivery, reduced traffic usage.
More improvements are coming soon!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>Improved message delivery</target>
@@ -4558,16 +4501,6 @@ This is your link for group %@!</target>
<target>New Passcode</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<target>New SOCKS credentials will be used every time you start the app.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<target>New SOCKS credentials will be used for each server.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>New chat</target>
@@ -4688,16 +4621,6 @@ This is your link for group %@!</target>
<target>No network connection</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<target>No permission to record speech</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<target>No permission to record video</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>No permission to record voice message</target>
@@ -6166,11 +6089,6 @@ Enable in *Network &amp; servers* settings.</target>
<target>Sent via proxy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<target>Server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<target>Server address</target>
@@ -6471,11 +6389,6 @@ Enable in *Network &amp; servers* settings.</target>
<target>SimpleX one-time invitation</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<target>SimpleX protocols reviewed by Trail of Bits.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Simplified incognito mode</target>
@@ -6651,16 +6564,6 @@ Enable in *Network &amp; servers* settings.</target>
<target>Support SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<target>Switch audio and video during the call.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<target>Switch chat profile for 1-time invitations.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>System</target>
@@ -7025,16 +6928,6 @@ You will be prompted to complete authentication before this feature is enabled.<
You will be prompted to complete authentication before this feature is enabled.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<target>To record speech please grant permission to use Microphone.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<target>To record video please grant permission to use Camera.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>To record voice message please grant permission to use Microphone.</target>
@@ -7372,6 +7265,11 @@ To connect, please ask your contact to create another connection link and check
<target>Use the app with one hand.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>User profile</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<target>User selection</target>
@@ -945,11 +945,6 @@
<target>El código de acceso será reemplazado por código de autodestrucción.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<target>Sesión de aplicación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Versión de la aplicación</target>
@@ -1085,19 +1080,11 @@
<target>Hash de mensaje incorrecto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>Grupos mejorados</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Mensajes mejorados</target>
@@ -1108,18 +1095,6 @@
<target>Uso de red mejorado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Negro</target>
@@ -1406,11 +1381,6 @@
<target>Las preferencias del chat han sido modificadas.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Perfil de usuario</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Tema de chat</target>
@@ -1563,7 +1533,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>Para migrar la base de datos confirma que recuerdas la frase de contraseña.</target>
<target>Para migrar confirma que recuerdas la frase de contraseña de la base de datos.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
@@ -1940,10 +1910,6 @@ This is your own one-time link!</source>
<target>Tiempo personalizado</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<target>Personalizar tema</target>
@@ -2238,10 +2204,6 @@ This is your own one-time link!</source>
<target>¿Eliminar base de datos antigua?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>¿Eliminar conexión pendiente?</target>
@@ -3365,10 +3327,6 @@ This is your own one-time link!</source>
<target>¿Reenviar mensajes sin los archivos?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Reenviado</target>
@@ -3758,11 +3716,6 @@ Error: %2$@</target>
<target>Importando archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>Entrega de mensajes mejorada</target>
@@ -4165,7 +4118,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Local profile data only" xml:space="preserve">
<source>Local profile data only</source>
<target>Eliminar sólo el perfil</target>
<target>Sólo datos del perfil local</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Lock after" xml:space="preserve">
@@ -4548,16 +4501,6 @@ This is your link for group %@!</source>
<target>Código Nuevo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<target>Se usarán credenciales SOCKS nuevas cada vez que inicies la aplicación.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<target>Se usarán credenciales SOCKS nuevas por cada servidor.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>Nuevo chat</target>
@@ -4678,16 +4621,6 @@ This is your link for group %@!</source>
<target>Sin conexión de red</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<target>Sin permiso para grabación de voz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<target>Sin permiso para grabación de vídeo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Sin permiso para grabar mensajes de voz</target>
@@ -5139,7 +5072,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
<source>Possibly, certificate fingerprint in server address is incorrect</source>
<target>Posiblemente la huella del certificado en la dirección del servidor es incorrecta</target>
<target>Posiblemente la huella digital del certificado en la dirección del servidor es incorrecta</target>
<note>server test error</note>
</trans-unit>
<trans-unit id="Preserve the last message draft, with attachments." xml:space="preserve">
@@ -5209,7 +5142,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Eliminar perfil y conexiones</target>
<target>Datos del perfil y conexiones</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile image" xml:space="preserve">
@@ -6156,11 +6089,6 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<target>Mediante proxy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<target>Servidor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<target>Dirección del servidor</target>
@@ -6188,7 +6116,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Server test failed!" xml:space="preserve">
<source>Server test failed!</source>
<target>¡Prueba no superada!</target>
<target>¡Error en prueba del servidor!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server type" xml:space="preserve">
@@ -6461,10 +6389,6 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<target>Invitación SimpleX de un uso</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Modo incógnito simplificado</target>
@@ -6640,14 +6564,6 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<target>Soporte SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>Sistema</target>
@@ -6735,7 +6651,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Test failed at step %@." xml:space="preserve">
<source>Test failed at step %@.</source>
<target>Prueba no superada en el paso %@.</target>
<target>La prueba ha fallado en el paso %@.</target>
<note>server test failure</note>
</trans-unit>
<trans-unit id="Test server" xml:space="preserve">
@@ -6750,7 +6666,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
</trans-unit>
<trans-unit id="Tests failed!" xml:space="preserve">
<source>Tests failed!</source>
<target>¡Pruebas no superadas!</target>
<target>¡Pruebas fallidas!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Thank you for installing SimpleX Chat!" xml:space="preserve">
@@ -7012,16 +6928,6 @@ You will be prompted to complete authentication before this feature is enabled.<
Se te pedirá que completes la autenticación antes de activar esta función.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<target>Para grabación de voz, por favor concede el permiso para usar el micrófono.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<target>Para grabación de vídeo, por favor concede el permiso para usar la cámara.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>Para grabar el mensaje de voz concede permiso para usar el micrófono.</target>
@@ -7359,6 +7265,11 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión
<target>Usa la aplicación con una sola mano.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Perfil de usuario</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<target>Selección de usuarios</target>
@@ -8782,7 +8693,7 @@ Repeat connection request?</source>
</trans-unit>
<trans-unit id="removed profile picture" xml:space="preserve">
<source>removed profile picture</source>
<target>ha eliminado la imagen del perfil</target>
<target>imagen de perfil eliminada</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="removed you" xml:space="preserve">
@@ -8846,7 +8757,7 @@ last received msg: %2$@</source>
</trans-unit>
<trans-unit id="set new profile picture" xml:space="preserve">
<source>set new profile picture</source>
<target>tiene nueva imagen del perfil</target>
<target>nueva imagen de perfil</target>
<note>profile update event chat item</note>
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
@@ -892,10 +892,6 @@
<target>Sovelluksen pääsykoodi korvataan itsetuhoutuvalla pääsykoodilla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Sovellusversio</target>
@@ -1022,18 +1018,10 @@
<target>Virheellinen viestin tarkiste</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Parempia viestejä</target>
@@ -1043,18 +1031,6 @@
<source>Better networking</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<note>No comment provided by engineer.</note>
@@ -1315,11 +1291,6 @@
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Käyttäjäprofiili</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<note>No comment provided by engineer.</note>
@@ -1796,10 +1767,6 @@ This is your own one-time link!</source>
<target>Mukautettu aika</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<note>No comment provided by engineer.</note>
@@ -2086,10 +2053,6 @@ This is your own one-time link!</source>
<target>Poista vanha tietokanta?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Poistetaanko odottava yhteys?</target>
@@ -3134,10 +3097,6 @@ This is your own one-time link!</source>
<source>Forward messages without files?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
@@ -3504,11 +3463,6 @@ Error: %2$@</source>
<source>Importing archive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<note>No comment provided by engineer.</note>
@@ -4237,14 +4191,6 @@ This is your link for group %@!</source>
<target>Uusi pääsykoodi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<note>No comment provided by engineer.</note>
@@ -4358,14 +4304,6 @@ This is your link for group %@!</source>
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Ei lupaa ääniviestin tallentamiseen</target>
@@ -5727,10 +5665,6 @@ Enable in *Network &amp; servers* settings.</source>
<source>Sent via proxy</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<note>No comment provided by engineer.</note>
@@ -6007,10 +5941,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>SimpleX-kertakutsu</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<note>No comment provided by engineer.</note>
@@ -6170,14 +6100,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>SimpleX Chat tuki</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>Järjestelmä</target>
@@ -6519,14 +6441,6 @@ You will be prompted to complete authentication before this feature is enabled.<
Sinua kehotetaan suorittamaan todennus loppuun, ennen kuin tämä ominaisuus otetaan käyttöön.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>Jos haluat nauhoittaa ääniviestin, anna lupa käyttää mikrofonia.</target>
@@ -6836,6 +6750,11 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
<source>Use the app with one hand.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Käyttäjäprofiili</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<note>No comment provided by engineer.</note>
@@ -939,10 +939,6 @@
<target>Le code d'accès de l'application est remplacé par un code d'autodestruction.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Version de l'app</target>
@@ -1077,19 +1073,11 @@
<target>Mauvais hash de message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>Des groupes plus performants</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Meilleurs messages</target>
@@ -1100,18 +1088,6 @@
<target>Meilleure gestion de réseau</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Noir</target>
@@ -1397,11 +1373,6 @@
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Profil d'utilisateur</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Thème de chat</target>
@@ -1930,10 +1901,6 @@ Il s'agit de votre propre lien unique !</target>
<target>Délai personnalisé</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<target>Personnaliser le thème</target>
@@ -2228,10 +2195,6 @@ Il s'agit de votre propre lien unique !</target>
<target>Supprimer l'ancienne base de données?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Supprimer la connexion en attente ?</target>
@@ -3344,10 +3307,6 @@ Il s'agit de votre propre lien unique !</target>
<source>Forward messages without files?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Transféré</target>
@@ -3735,11 +3694,6 @@ Erreur: %2$@</target>
<target>Importation de l'archive</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>Amélioration de la transmission des messages</target>
@@ -4523,14 +4477,6 @@ Voici votre lien pour le groupe %@ !</target>
<target>Nouveau code d'accès</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>Nouveau chat</target>
@@ -4651,14 +4597,6 @@ Voici votre lien pour le groupe %@ !</target>
<target>Pas de connexion au réseau</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Pas l'autorisation d'enregistrer un message vocal</target>
@@ -6116,10 +6054,6 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<target>Envoyé via le proxy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<target>Adresse du serveur</target>
@@ -6418,10 +6352,6 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<target>Invitation unique SimpleX</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Mode incognito simplifié</target>
@@ -6596,14 +6526,6 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<target>Supporter SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>Système</target>
@@ -6966,14 +6888,6 @@ You will be prompted to complete authentication before this feature is enabled.<
Vous serez invité à confirmer l'authentification avant que cette fonction ne soit activée.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>Pour enregistrer un message vocal, veuillez accorder la permission d'utiliser le microphone.</target>
@@ -7310,6 +7224,11 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<target>Utiliser l'application d'une main.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Profil d'utilisateur</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<target>Sélection de l'utilisateur</target>
@@ -119,12 +119,12 @@
</trans-unit>
<trans-unit id="%@ is not verified" xml:space="preserve">
<source>%@ is not verified</source>
<target>%@ nem hitelesített</target>
<target>%@ nem ellenőrzött</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ is verified" xml:space="preserve">
<source>%@ is verified</source>
<target>%@ hitelesítve</target>
<target>%@ ellenőrizve</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ uploaded" xml:space="preserve">
@@ -354,27 +354,27 @@
</trans-unit>
<trans-unit id="**Add contact**: to create a new invitation link, or connect via a link you received." xml:space="preserve">
<source>**Add contact**: to create a new invitation link, or connect via a link you received.</source>
<target>**Ismerős hozzáadása:** új meghívó-hivatkozás létrehozásához, vagy egy kapott hivatkozáson keresztül történő kapcsolódáshoz.</target>
<target>**Ismerős hozzáadása**: új meghívó-hivatkozás létrehozásához, vagy egy kapott hivatkozáson keresztül történő kapcsolódáshoz.</target>
<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">
<source>**Add new contact**: to create your one-time QR Code or link for your contact.</source>
<target>**Új ismerős hozzáadása:** egyszer használható QR-kód vagy hivatkozás létrehozása az ismerőse számára.</target>
<target>**Új ismerős hozzáadása**: egyszer használható QR-kód vagy hivatkozás létrehozása az ismerőse számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Create group**: to create a new group." xml:space="preserve">
<source>**Create group**: to create a new group.</source>
<target>**Csoport létrehozása:** új csoport létrehozásához.</target>
<target>**Csoport létrehozása**: új csoport létrehozásához.</target>
<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">
<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>**Privátabb:** 20 percenként ellenőrzi az új üzeneteket. Az eszköztoken megosztásra kerül a SimpleX Chat-kiszolgálóval, de az nem, hogy hány ismerőse vagy üzenete van.</target>
<target>**Privátabb**: 20 percenként ellenőrzi az új üzeneteket. Az eszköztoken megosztásra kerül a SimpleX Chat-kiszolgálóval, de az nem, hogy hány ismerőse vagy üzenete van.</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">
<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>**Legprivátabb:** ne használja a SimpleX Chat értesítési kiszolgálót, rendszeresen ellenőrizze az üzeneteket a háttérben (attól függően, hogy milyen gyakran használja az alkalmazást).</target>
<target>**Legprivátabb**: ne használja a SimpleX Chat értesítési kiszolgálót, rendszeresen ellenőrizze az üzeneteket a háttérben (attól függően, hogy milyen gyakran használja az alkalmazást).</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">
@@ -389,7 +389,7 @@
</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">
<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>**Megjegyzés:** az eszköztoken és az értesítések elküldésre kerülnek a SimpleX Chat értesítési kiszolgálóra, kivéve az üzenet tartalma, mérete vagy az, hogy kitől származik.</target>
<target>**Javasolt**: az eszköztoken és az értesítések elküldésre kerülnek a SimpleX Chat értesítési kiszolgálóra, kivéve az üzenet tartalma, mérete vagy az, hogy kitől származik.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Warning**: Instant push notifications require passphrase saved in Keychain." xml:space="preserve">
@@ -606,7 +606,7 @@
</trans-unit>
<trans-unit id="Accept incognito" xml:space="preserve">
<source>Accept incognito</source>
<target>Fogadás inkognitóban</target>
<target>Fogadás inkognítóban</target>
<note>accept contact request via notification
swipe action</note>
</trans-unit>
@@ -742,7 +742,7 @@
</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">
<source>All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you.</source>
<target>Minden üzenet törlésre kerül - ez a művelet nem vonható vissza! Az üzenetek CSAK az Ön számára törlődnek.</target>
<target>Minden üzenet törlésre kerül - ez a művelet nem vonható vissza! Az üzenetek CSAK az ön számára törlődnek.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
@@ -787,7 +787,7 @@
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Az eltűnő üzenetek küldése csak abban az esetben van engedélyezve, ha az ismerőse is engedélyezi az Ön számára.</target>
<target>Az eltűnő üzenetek küldése csak abban az esetben van engedélyezve, ha az ismerőse is engedélyezi az ön számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
@@ -945,11 +945,6 @@
<target>Az alkalmazás jelkód helyettesítésre kerül egy önmegsemmisítő jelkóddal.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<target>Alkalmazás munkamenete</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Alkalmazás verzió</target>
@@ -1085,19 +1080,11 @@
<target>Hibás az üzenet hasító értéke</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>Javított csoportok</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Jobb üzenetek</target>
@@ -1108,18 +1095,6 @@
<target>Jobb hálózatkezelés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Fekete</target>
@@ -1406,11 +1381,6 @@
<target>A csevegési beállítások megváltoztak.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Felhasználói profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Csevegés témája</target>
@@ -1605,14 +1575,14 @@
<source>Connect to yourself?
This is your own SimpleX address!</source>
<target>Kapcsolódás saját magához?
Ez az Ön SimpleX-címe!</target>
Ez az ön SimpleX-címe!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect to yourself?&#10;This is your own one-time link!" xml:space="preserve">
<source>Connect to yourself?
This is your own one-time link!</source>
<target>Kapcsolódás saját magához?
Ez az Ön egyszer használható hivatkozása!</target>
Ez az ön egyszer használható hivatkozása!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect via contact address" xml:space="preserve">
@@ -1762,7 +1732,7 @@ Ez az Ön egyszer használható hivatkozása!</target>
</trans-unit>
<trans-unit id="Contact name" xml:space="preserve">
<source>Contact name</source>
<target>Csak név</target>
<target>Ismerős neve</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contact preferences" xml:space="preserve">
@@ -1782,7 +1752,7 @@ Ez az Ön egyszer használható hivatkozása!</target>
</trans-unit>
<trans-unit id="Contacts can mark messages for deletion; you will be able to view them." xml:space="preserve">
<source>Contacts can mark messages for deletion; you will be able to view them.</source>
<target>Az ismerősei törlésre jelölhetnek üzeneteket; Ön majd meg tudja nézni azokat.</target>
<target>Az ismerősei törlésre jelölhetnek üzeneteket; ön majd meg tudja nézni azokat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Continue" xml:space="preserve">
@@ -1837,7 +1807,7 @@ Ez az Ön egyszer használható hivatkozása!</target>
</trans-unit>
<trans-unit id="Create an address to let people connect with you." xml:space="preserve">
<source>Create an address to let people connect with you.</source>
<target>Cím létrehozása, hogy az emberek kapcsolatba léphessenek Önnel.</target>
<target>Cím létrehozása, hogy az emberek kapcsolatba léphessenek önnel.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Create file" xml:space="preserve">
@@ -1940,10 +1910,6 @@ Ez az Ön egyszer használható hivatkozása!</target>
<target>Személyreszabott idő</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<target>Téma személyre szabása</target>
@@ -2238,10 +2204,6 @@ Ez az Ön egyszer használható hivatkozása!</target>
<target>Régi adatbázis törlése?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Függőben lévő ismerőskérelem törlése?</target>
@@ -2259,7 +2221,7 @@ Ez az Ön egyszer használható hivatkozása!</target>
</trans-unit>
<trans-unit id="Delete up to 20 messages at once." xml:space="preserve">
<source>Delete up to 20 messages at once.</source>
<target>Legfeljebb 20 üzenet egyszerre való törlése.</target>
<target>Legfeljebb 20 üzenet törlése egyszerre.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete user profile?" xml:space="preserve">
@@ -2469,7 +2431,7 @@ Ez az Ön egyszer használható hivatkozása!</target>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>Ne küldjön üzeneteket közvetlenül, még akkor sem, ha az Ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</target>
<target>Ne küldjön üzeneteket közvetlenül, még akkor sem, ha az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
@@ -2835,7 +2797,7 @@ Ez az Ön egyszer használható hivatkozása!</target>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
<target>Hiba az inkognitóprofilra való váltáskor!</target>
<target>Hiba az inkognitó-profilra való váltáskor!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
@@ -3070,7 +3032,7 @@ Ez az Ön egyszer használható hivatkozása!</target>
</trans-unit>
<trans-unit id="Error switching profile!" xml:space="preserve">
<source>Error switching profile!</source>
<target>Hiba a profilváltásakor!</target>
<target>Hiba a profil váltásakor!</target>
<note>alertTitle</note>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
@@ -3105,7 +3067,7 @@ Ez az Ön egyszer használható hivatkozása!</target>
</trans-unit>
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
<source>Error verifying passphrase:</source>
<target>Hiba a jelmondat hitelesítésekor:</target>
<target>Hiba a jelmondat ellenőrzésekor:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: " xml:space="preserve">
@@ -3195,7 +3157,7 @@ Ez az Ön egyszer használható hivatkozása!</target>
</trans-unit>
<trans-unit id="Favorite" xml:space="preserve">
<source>Favorite</source>
<target>Kedvenc</target>
<target>Csillag</target>
<note>swipe action</note>
</trans-unit>
<trans-unit id="File error" xml:space="preserve">
@@ -3282,7 +3244,7 @@ Ez az Ön egyszer használható hivatkozása!</target>
</trans-unit>
<trans-unit id="Filter unread and favorite chats." xml:space="preserve">
<source>Filter unread and favorite chats.</source>
<target>Olvasatlan és kedvenc csevegésekre való szűrés.</target>
<target>Olvasatlan és csillagozott csevegésekre való szűrés.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
@@ -3365,10 +3327,6 @@ Ez az Ön egyszer használható hivatkozása!</target>
<target>Üzenetek továbbítása fájlok nélkül?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Továbbított</target>
@@ -3490,7 +3448,7 @@ Hiba: %2$@</target>
</trans-unit>
<trans-unit id="Group image" xml:space="preserve">
<source>Group image</source>
<target>Csoport profilképe</target>
<target>Csoportkép</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group invitation" xml:space="preserve">
@@ -3590,7 +3548,7 @@ Hiba: %2$@</target>
</trans-unit>
<trans-unit id="Group will be deleted for you - this cannot be undone!" xml:space="preserve">
<source>Group will be deleted for you - this cannot be undone!</source>
<target>A csoport törlésre kerül az Ön számára - ez a művelet nem vonható vissza!</target>
<target>A csoport törlésre kerül az ön számára - ez a művelet nem vonható vissza!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Help" xml:space="preserve">
@@ -3600,7 +3558,7 @@ Hiba: %2$@</target>
</trans-unit>
<trans-unit id="Hidden" xml:space="preserve">
<source>Hidden</source>
<target>Se név, se üzenet</target>
<target>Rejtett</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Hidden chat profiles" xml:space="preserve">
@@ -3610,12 +3568,12 @@ Hiba: %2$@</target>
</trans-unit>
<trans-unit id="Hidden profile password" xml:space="preserve">
<source>Hidden profile password</source>
<target>Rejtett profiljelszó</target>
<target>Rejtett profil jelszó</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Hide" xml:space="preserve">
<source>Hide</source>
<target>Elrejtés</target>
<target>Elrejt</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Hide app screen in the recent apps." xml:space="preserve">
@@ -3630,7 +3588,7 @@ Hiba: %2$@</target>
</trans-unit>
<trans-unit id="Hide:" xml:space="preserve">
<source>Hide:</source>
<target>Elrejtés:</target>
<target>Elrejt:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="History" xml:space="preserve">
@@ -3758,11 +3716,6 @@ Hiba: %2$@</target>
<target>Archívum importálása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>Továbbfejlesztett üzenetkézbesítés</target>
@@ -3800,7 +3753,7 @@ More improvements are coming soon!</source>
</trans-unit>
<trans-unit id="Incognito groups" xml:space="preserve">
<source>Incognito groups</source>
<target>Inkognitócsoportok</target>
<target>Inkognitó csoportok</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Incognito mode" xml:space="preserve">
@@ -3972,7 +3925,7 @@ More improvements are coming soon!</source>
</trans-unit>
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
<source>It can happen when you or your connection used the old database backup.</source>
<target>Ez akkor fordulhat elő, ha Ön vagy az ismerőse régi adatbázis biztonsági mentést használt.</target>
<target>Ez akkor fordulhat elő, ha ön vagy az ismerőse régi adatbázis biztonsági mentést használt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It can happen when:&#10;1. The messages expired in the sending client after 2 days or on the server after 30 days.&#10;2. Message decryption failed, because you or your contact used old database backup.&#10;3. The connection was compromised." xml:space="preserve">
@@ -4040,7 +3993,7 @@ More improvements are coming soon!</source>
<source>Join your group?
This is your link for group %@!</source>
<target>Csatlakozik a csoportjához?
Ez az Ön hivatkozása a(z) %@ csoporthoz!</target>
Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
@@ -4075,12 +4028,12 @@ Ez az Ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>Kulcstartóhiba</target>
<target>Kulcstartó hiba</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keychain error" xml:space="preserve">
<source>Keychain error</source>
<target>Kulcstartóhiba</target>
<target>Kulcstartó hiba</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="LIVE" xml:space="preserve">
@@ -4355,7 +4308,7 @@ Ez az Ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
<source>Message text</source>
<target>Név és üzenet</target>
<target>Üzenet szövege</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
@@ -4548,16 +4501,6 @@ Ez az Ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Új jelkód</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<target>Minden alkalommal, amikor elindítja az alkalmazást, új SOCKS-hitelesítő-adatokat fog használni.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<target>Minden egyes kiszolgálóhoz új SOCKS-hitelesítő-adatok legyenek használva.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>Új beszélgetés</target>
@@ -4678,16 +4621,6 @@ Ez az Ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Nincs hálózati kapcsolat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<target>Nincs jogosultság megadva a beszéd rögzítéséhez</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<target>Nincs jogosultság megadva a videó rögzítéséhez</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Nincs engedély a hangüzenet rögzítésére</target>
@@ -4765,7 +4698,7 @@ Ez az Ön hivatkozása a(z) %@ csoporthoz!</target>
<trans-unit id="Onion hosts will be **required** for connection.&#10;Requires compatible VPN." xml:space="preserve">
<source>Onion hosts will be **required** for connection.
Requires compatible VPN.</source>
<target>Onion-kiszolgálók **szükségesek** a kapcsolódáshoz.
<target>Az onion-kiszolgálók **szükségesek** a kapcsolódáshoz.
Kompatibilis VPN szükséges.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -4808,27 +4741,27 @@ VPN engedélyezése szükséges.</target>
</trans-unit>
<trans-unit id="Only you can add message reactions." xml:space="preserve">
<source>Only you can add message reactions.</source>
<target>Csak Ön adhat hozzá üzenetreakciókat.</target>
<target>Csak ön adhat hozzá üzenetreakciókat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can irreversibly delete messages (your contact can mark them for deletion). (24 hours)" xml:space="preserve">
<source>Only you can irreversibly delete messages (your contact can mark them for deletion). (24 hours)</source>
<target>Véglegesen csak Ön törölhet üzeneteket (ismerőse csak törlésre jelölheti meg őket ). (24 óra)</target>
<target>Véglegesen csak ön törölhet üzeneteket (ismerőse csak törlésre jelölheti meg őket ). (24 óra)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can make calls." xml:space="preserve">
<source>Only you can make calls.</source>
<target>Csak Ön tud hívásokat indítani.</target>
<target>Csak ön tud hívásokat indítani.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send disappearing messages." xml:space="preserve">
<source>Only you can send disappearing messages.</source>
<target>Csak Ön tud eltűnő üzeneteket küldeni.</target>
<target>Csak ön tud eltűnő üzeneteket küldeni.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only you can send voice messages." xml:space="preserve">
<source>Only you can send voice messages.</source>
<target>Csak Ön tud hangüzeneteket küldeni.</target>
<target>Csak ön tud hangüzeneteket küldeni.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can add message reactions." xml:space="preserve">
@@ -4838,7 +4771,7 @@ VPN engedélyezése szükséges.</target>
</trans-unit>
<trans-unit id="Only your contact can irreversibly delete messages (you can mark them for deletion). (24 hours)" xml:space="preserve">
<source>Only your contact can irreversibly delete messages (you can mark them for deletion). (24 hours)</source>
<target>Csak az ismerőse tudja az üzeneteket véglegesen törölni (Ön csak törlésre jelölheti meg azokat). (24 óra)</target>
<target>Csak az ismerőse tudja az üzeneteket véglegesen törölni (ön csak törlésre jelölheti meg azokat). (24 óra)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can make calls." xml:space="preserve">
@@ -4990,7 +4923,7 @@ VPN engedélyezése szükséges.</target>
</trans-unit>
<trans-unit id="Past member %@" xml:space="preserve">
<source>Past member %@</source>
<target>(Már nem tag) %@</target>
<target>%@ (már nem tag)</target>
<note>past/unknown group member</note>
</trans-unit>
<trans-unit id="Paste desktop address" xml:space="preserve">
@@ -5020,7 +4953,7 @@ VPN engedélyezése szükséges.</target>
</trans-unit>
<trans-unit id="People can connect to you only via the links you share." xml:space="preserve">
<source>People can connect to you only via the links you share.</source>
<target>Az emberek csak az Ön által megosztott hivatkozáson keresztül kapcsolódhatnak.</target>
<target>Az emberek csak az ön által megosztott hivatkozáson keresztül kapcsolódhatnak.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Periodically" xml:space="preserve">
@@ -5184,12 +5117,12 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Privát üzenet-útválasztás</target>
<target>Privát üzenet útválasztás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing 🚀" xml:space="preserve">
<source>Private message routing 🚀</source>
<target>Privát üzenet-útválasztás 🚀</target>
<target>Privát üzenet útválasztás 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
@@ -5204,7 +5137,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Private routing error" xml:space="preserve">
<source>Private routing error</source>
<target>Privát útválasztáshiba</target>
<target>Privát útválasztási hiba</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
@@ -5421,7 +5354,7 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
</trans-unit>
<trans-unit id="Received message" xml:space="preserve">
<source>Received message</source>
<target>Fogadott üzenetbuborék színe</target>
<target>Fogadott üzenet</target>
<note>message info title</note>
</trans-unit>
<trans-unit id="Received messages" xml:space="preserve">
@@ -5431,7 +5364,7 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
</trans-unit>
<trans-unit id="Received reply" xml:space="preserve">
<source>Received reply</source>
<target>Fogadott válaszüzenet-buborék színe</target>
<target>Fogadott válasz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Received total" xml:space="preserve">
@@ -6018,12 +5951,12 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Közvetlen üzenetküldés, ha az IP-cím védett és az Ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</target>
<target>Közvetlen üzenetküldés, ha az IP-cím védett és az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Közvetlen üzenetküldés, ha az Ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</target>
<target>Közvetlen üzenetküldés, ha az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
@@ -6128,7 +6061,7 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
</trans-unit>
<trans-unit id="Sent message" xml:space="preserve">
<source>Sent message</source>
<target>Üzenetbuborék színe</target>
<target>Elküldött üzenet</target>
<note>message info title</note>
</trans-unit>
<trans-unit id="Sent messages" xml:space="preserve">
@@ -6143,7 +6076,7 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
</trans-unit>
<trans-unit id="Sent reply" xml:space="preserve">
<source>Sent reply</source>
<target>Válaszüzenet-buborék színe</target>
<target>Elküldött válasz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
@@ -6156,11 +6089,6 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
<target>Proxyn keresztül küldve</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<target>Kiszolgáló</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<target>Kiszolgáló címe</target>
@@ -6358,7 +6286,7 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
</trans-unit>
<trans-unit id="Show last messages" xml:space="preserve">
<source>Show last messages</source>
<target>Szobák utolsó üzeneteinek megjelenítése a listanézetben</target>
<target>Utolsó üzenetek megjelenítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
@@ -6373,7 +6301,7 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Értesítés előnézete</target>
<target>Előnézet megjelenítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
@@ -6461,13 +6389,9 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
<target>Egyszer használható SimpleX-meghívó</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Egyszerűsített inkognitómód</target>
<target>Egyszerűsített inkogní mód</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Size" xml:space="preserve">
@@ -6640,14 +6564,6 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
<target>SimpleX Chat támogatása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>Rendszer</target>
@@ -6720,7 +6636,7 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
</trans-unit>
<trans-unit id="Tap to paste link" xml:space="preserve">
<source>Tap to paste link</source>
<target>Koppintson ide a hivatkozás beillesztéséhez</target>
<target>Koppintson a hivatkozás beillesztéséhez</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap to scan" xml:space="preserve">
@@ -6802,7 +6718,7 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="The connection you accepted will be cancelled!" xml:space="preserve">
<source>The connection you accepted will be cancelled!</source>
<target>Az Ön által elfogadott kérelem vissza lesz vonva!</target>
<target>Az ön által elfogadott kérelem vissza lesz vonva!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The contact you shared this link with will NOT be able to connect!" xml:space="preserve">
@@ -6947,12 +6863,12 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
<source>This is your own SimpleX address!</source>
<target>Ez az Ön SimpleX-címe!</target>
<target>Ez az ön SimpleX-címe!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This is your own one-time link!" xml:space="preserve">
<source>This is your own one-time link!</source>
<target>Ez az Ön egyszer használható hivatkozása!</target>
<target>Ez az ön egyszer használható hivatkozása!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This link was used with another mobile device, please create a new link on the desktop." xml:space="preserve">
@@ -7012,16 +6928,6 @@ You will be prompted to complete authentication before this feature is enabled.<
A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beállítására az eszközén.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<target>A beszéd rögzítéséhez adjon engedélyt a Mikrofon használatára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<target>A videó rögzítéséhez adjon engedélyt a Kamera használatára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>Hangüzenet rögzítéséhez adjon engedélyt a mikrofon használathoz.</target>
@@ -7039,7 +6945,7 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll
</trans-unit>
<trans-unit id="To verify end-to-end encryption with your contact compare (or scan) the code on your devices." xml:space="preserve">
<source>To verify end-to-end encryption with your contact compare (or scan) the code on your devices.</source>
<target>A végpontok közötti titkosítás hitelesítéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) az ismerőse eszközén lévő kóddal.</target>
<target>A végpontok közötti titkosítás ellenőrzéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) az ismerőse eszközén lévő kóddal.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Toggle chat list:" xml:space="preserve">
@@ -7049,7 +6955,7 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll
</trans-unit>
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
<source>Toggle incognito when connecting.</source>
<target>Inkognitómód használata kapcsolódáskor.</target>
<target>Inkognitómód kapcsolódáskor.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Toolbar opacity" xml:space="preserve">
@@ -7134,7 +7040,7 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll
</trans-unit>
<trans-unit id="Unfav." xml:space="preserve">
<source>Unfav.</source>
<target>Kedvenc megszüntetése</target>
<target>Csillagozás megszüntetése</target>
<note>swipe action</note>
</trans-unit>
<trans-unit id="Unhide" xml:space="preserve">
@@ -7326,7 +7232,7 @@ A kapcsolódáshoz kérje meg az ismerősét, hogy hozzon létre egy másik kapc
</trans-unit>
<trans-unit id="Use new incognito profile" xml:space="preserve">
<source>Use new incognito profile</source>
<target>Új inkognitóprofil használata</target>
<target>Az új inkogní profil használata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use only local notifications?" xml:space="preserve">
@@ -7336,7 +7242,7 @@ A kapcsolódáshoz kérje meg az ismerősét, hogy hozzon létre egy másik kapc
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Használjon privát útválasztást ismeretlen kiszolgálókkal, ha az IP-cím nem védett.</target>
<target>Privát útválasztás használata ismeretlen kiszolgálókkal, ha az IP-cím nem védett.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
@@ -7359,6 +7265,11 @@ A kapcsolódáshoz kérje meg az ismerősét, hogy hozzon létre egy másik kapc
<target>Használja az alkalmazást egy kézzel.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Felhasználói profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<target>Felhasználó kiválasztása</target>
@@ -7376,37 +7287,37 @@ A kapcsolódáshoz kérje meg az ismerősét, hogy hozzon létre egy másik kapc
</trans-unit>
<trans-unit id="Verify code with desktop" xml:space="preserve">
<source>Verify code with desktop</source>
<target>Kód hitelesítése a számítógépen</target>
<target>Kód ellenőrzése a számítógépen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify connection" xml:space="preserve">
<source>Verify connection</source>
<target>Kapcsolat hitelesítése</target>
<target>Kapcsolat ellenőrzése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify connection security" xml:space="preserve">
<source>Verify connection security</source>
<target>Biztonságos kapcsolat hitelesítése</target>
<target>Kapcsolat biztonságának ellenőrzése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify connections" xml:space="preserve">
<source>Verify connections</source>
<target>Kapcsolatok hitelesítése</target>
<target>Kapcsolatok ellenőrzése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify database passphrase" xml:space="preserve">
<source>Verify database passphrase</source>
<target>Az adatbázis jelmondatának hitelesítése</target>
<target>Az adatbázis jelmondatának ellenőrzése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify passphrase" xml:space="preserve">
<source>Verify passphrase</source>
<target>Jelmondat hitelesítése</target>
<target>Jelmondat ellenőrzése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify security code" xml:space="preserve">
<source>Verify security code</source>
<target>Biztonsági kód hitelesítése</target>
<target>Biztonsági kód ellenőrzése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Via browser" xml:space="preserve">
@@ -7556,12 +7467,12 @@ A kapcsolódáshoz kérje meg az ismerősét, hogy hozzon létre egy másik kapc
</trans-unit>
<trans-unit id="When people request to connect, you can accept or reject it." xml:space="preserve">
<source>When people request to connect, you can accept or reject it.</source>
<target>Amikor az emberek kapcsolatot kérnek, Ön elfogadhatja vagy elutasíthatja azokat.</target>
<target>Amikor az emberek kapcsolatot kérnek, ön elfogadhatja vagy elutasíthatja azokat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." xml:space="preserve">
<source>When you share an incognito profile with somebody, this profile will be used for the groups they invite you to.</source>
<target>Inkognitóprofil megosztása esetén a rendszer azt a profilt fogja használni azokhoz a csoportokhoz, amelyekbe meghívást kapott.</target>
<target>Inkognitó-profil megosztása esetén a rendszer azt a profilt fogja használni azokhoz a csoportokhoz, amelyekbe meghívást kapott.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
@@ -7723,7 +7634,7 @@ Csatlakozáskérés megismétlése?</target>
</trans-unit>
<trans-unit id="You can enable later via Settings" xml:space="preserve">
<source>You can enable later via Settings</source>
<target>Később engedélyezheti a Beállításokban</target>
<target>Később engedélyezheti a Beállításokban</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can enable them later via app Privacy &amp; Security settings." xml:space="preserve">
@@ -7768,12 +7679,12 @@ Csatlakozáskérés megismétlése?</target>
</trans-unit>
<trans-unit id="You can share this address with your contacts to let them connect with **%@**." xml:space="preserve">
<source>You can share this address with your contacts to let them connect with **%@**.</source>
<target>Megoszthatja ezt a címet az ismerőseivel, hogy kapcsolatba léphessenek Önnel a(z) **%@** nevű profilján keresztül.</target>
<target>Megoszthatja ezt a címet az ismerőseivel, hogy kapcsolatba léphessenek önnel a(z) **%@** nevű profilján keresztül.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can share your address as a link or QR code - anybody can connect to you." xml:space="preserve">
<source>You can share your address as a link or QR code - anybody can connect to you.</source>
<target>Megoszthatja a címét egy hivatkozásként vagy QR-kódként így bárki kapcsolódhat Önhöz.</target>
<target>Megoszthatja a címét egy hivatkozásként vagy QR-kódként így bárki kapcsolódhat önhöz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can start chat via app Settings / Database or by restarting the app" xml:space="preserve">
@@ -7813,7 +7724,7 @@ Csatlakozáskérés megismétlése?</target>
</trans-unit>
<trans-unit id="You could not be verified; please try again." xml:space="preserve">
<source>You could not be verified; please try again.</source>
<target>Nem sikerült hitelesíteni; próbálja meg újra.</target>
<target>Nem sikerült ellenőrizni; próbálja meg újra.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
@@ -7930,12 +7841,12 @@ Kapcsolatkérés megismétlése?</target>
</trans-unit>
<trans-unit id="You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile" xml:space="preserve">
<source>You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile</source>
<target>Egy olyan ismerősét próbálja meghívni, akivel inkognitóprofilt osztott meg abban a csoportban, amelyben a saját fő profilja van használatban</target>
<target>Egy olyan ismerőst próbál meghívni, akivel inkogní profilt osztott meg abban a csoportban, amelyben saját fő profilja van használatban</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed" xml:space="preserve">
<source>You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed</source>
<target>Inkognitóprofilt használ ehhez a csoporthoz - fő profilja megosztásának elkerülése érdekében a meghívók küldése le van tiltva</target>
<target>Inkogní profilt használ ehhez a csoporthoz - fő profilja megosztásának elkerülése érdekében a meghívók küldése le van tiltva</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your %@ servers" xml:space="preserve">
@@ -8230,7 +8141,7 @@ Kapcsolatkérés megismétlése?</target>
</trans-unit>
<trans-unit id="changed your role to %@" xml:space="preserve">
<source>changed your role to %@</source>
<target>megváltoztatta az Ön szerepkörét erre: %@</target>
<target>megváltoztatta a szerepkörét erre: %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="changing address for %@…" xml:space="preserve">
@@ -8265,7 +8176,7 @@ Kapcsolatkérés megismétlése?</target>
</trans-unit>
<trans-unit id="connected directly" xml:space="preserve">
<source>connected directly</source>
<target>közvetlenül kapcsolódott</target>
<target>közvetlenül kapcsolódva</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="connecting" xml:space="preserve">
@@ -8425,7 +8336,7 @@ Kapcsolatkérés megismétlése?</target>
</trans-unit>
<trans-unit id="enabled for you" xml:space="preserve">
<source>enabled for you</source>
<target>engedélyezve az Ön számára</target>
<target>engedélyezve az ön számára</target>
<note>enabled status</note>
</trans-unit>
<trans-unit id="encryption agreed" xml:space="preserve">
@@ -8530,7 +8441,7 @@ Kapcsolatkérés megismétlése?</target>
</trans-unit>
<trans-unit id="incognito via contact address link" xml:space="preserve">
<source>incognito via contact address link</source>
<target>inkognitó a kapcsolattartási címhivatkozáson keresztül</target>
<target>inkognitó a kapcsolattartási hivatkozáson keresztül</target>
<note>chat list item description</note>
</trans-unit>
<trans-unit id="incognito via group link" xml:space="preserve">
@@ -8590,7 +8501,7 @@ Kapcsolatkérés megismétlése?</target>
</trans-unit>
<trans-unit id="invited via your group link" xml:space="preserve">
<source>invited via your group link</source>
<target>meghíva az Ön csoporthivatkozásán keresztül</target>
<target>meghíva az ön csoporthivatkozásán keresztül</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="italic" xml:space="preserve">
@@ -8675,7 +8586,7 @@ Kapcsolatkérés megismétlése?</target>
</trans-unit>
<trans-unit id="new message" xml:space="preserve">
<source>new message</source>
<target>Rejtett üzenet</target>
<target>új üzenet</target>
<note>notification</note>
</trans-unit>
<trans-unit id="no" xml:space="preserve">
@@ -8787,7 +8698,7 @@ Kapcsolatkérés megismétlése?</target>
</trans-unit>
<trans-unit id="removed you" xml:space="preserve">
<source>removed you</source>
<target>eltávolította Önt</target>
<target>eltávolította önt</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
@@ -8961,7 +8872,7 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="wants to connect to you!" xml:space="preserve">
<source>wants to connect to you!</source>
<target>kapcsolatba akar lépni Önnel!</target>
<target>kapcsolatba akar lépni önnel!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="weeks" xml:space="preserve">
@@ -8981,7 +8892,7 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<target>Ön</target>
<target>ön</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
@@ -8996,7 +8907,7 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="you blocked %@" xml:space="preserve">
<source>you blocked %@</source>
<target>Ön letiltotta őt: %@</target>
<target>ön letiltotta őt: %@</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you changed address" xml:space="preserve">
@@ -9011,22 +8922,22 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="you changed role for yourself to %@" xml:space="preserve">
<source>you changed role for yourself to %@</source>
<target>saját szerepköre megváltozott erre: %@</target>
<target>saját szerepkör megváltoztatva erre: %@</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you changed role of %@ to %@" xml:space="preserve">
<source>you changed role of %1$@ to %2$@</source>
<target>Ön megváltoztatta %1$@ szerepkörét erre: %@</target>
<target>%1$@ szerepkörét megváltoztatta erre: %@</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you left" xml:space="preserve">
<source>you left</source>
<target>Ön elhagyta a csoportot</target>
<target>elhagyta a csoportot</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you removed %@" xml:space="preserve">
<source>you removed %@</source>
<target>Ön eltávolította őt: %@</target>
<target>eltávolította őt: %@</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you shared one-time link" xml:space="preserve">
@@ -9041,12 +8952,12 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="you unblocked %@" xml:space="preserve">
<source>you unblocked %@</source>
<target>Ön feloldotta %@ letiltását</target>
<target>ön feloldotta %@ letiltását</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you: " xml:space="preserve">
<source>you: </source>
<target>Ön: </target>
<target>ön: </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="~strike~" xml:space="preserve">
@@ -9239,7 +9150,7 @@ utoljára fogadott üzenet: %2$@</target>
</trans-unit>
<trans-unit id="Keychain error" xml:space="preserve">
<source>Keychain error</source>
<target>Kulcstartóhiba</target>
<target>Kulcstartó hiba</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Large file!" xml:space="preserve">
@@ -945,11 +945,6 @@
<target>Il codice di accesso dell'app viene sostituito da un codice di autodistruzione.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<target>Sessione dell'app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Versione dell'app</target>
@@ -1085,19 +1080,11 @@
<target>Hash del messaggio errato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>Gruppi migliorati</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Messaggi migliorati</target>
@@ -1108,18 +1095,6 @@
<target>Rete migliorata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Nero</target>
@@ -1406,11 +1381,6 @@
<target>Le preferenze della chat sono state cambiate.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Profilo utente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Tema della chat</target>
@@ -1940,10 +1910,6 @@ Questo è il tuo link una tantum!</target>
<target>Tempo personalizzato</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<target>Personalizza il tema</target>
@@ -2238,10 +2204,6 @@ Questo è il tuo link una tantum!</target>
<target>Eliminare il database vecchio?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Eliminare la connessione in attesa?</target>
@@ -3365,10 +3327,6 @@ Questo è il tuo link una tantum!</target>
<target>Inoltrare i messaggi senza file?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Inoltrato</target>
@@ -3758,11 +3716,6 @@ Errore: %2$@</target>
<target>Importazione archivio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>Consegna dei messaggi migliorata</target>
@@ -4548,16 +4501,6 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Nuovo codice di accesso</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<target>Le nuove credenziali SOCKS verranno usate ogni volta che avvii l'app.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<target>Le nuove credenziali SOCKS verranno usate per ogni server.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>Nuova chat</target>
@@ -4678,16 +4621,6 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Nessuna connessione di rete</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<target>Nessuna autorizzazione per registrare l'audio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<target>Nessuna autorizzazione per registrare il video</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Nessuna autorizzazione per registrare messaggi vocali</target>
@@ -6156,11 +6089,6 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<target>Inviato via proxy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<target>Server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<target>Indirizzo server</target>
@@ -6461,10 +6389,6 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<target>Invito SimpleX una tantum</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Modalità incognito semplificata</target>
@@ -6640,14 +6564,6 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<target>Supporta SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>Sistema</target>
@@ -7012,16 +6928,6 @@ You will be prompted to complete authentication before this feature is enabled.<
Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzionalità.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<target>Per registrare l'audio, concedi l'autorizzazione di usare il microfono.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<target>Per registrare il video, concedi l'autorizzazione di usare la fotocamera.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>Per registrare un messaggio vocale, concedi l'autorizzazione all'uso del microfono.</target>
@@ -7359,6 +7265,11 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<target>Usa l'app con una mano sola.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Profilo utente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<target>Selezione utente</target>
@@ -915,10 +915,6 @@
<target>アプリのパスコードは自己破壊パスコードに置き換えられます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>アプリのバージョン</target>
@@ -1045,18 +1041,10 @@
<target>メッセージのハッシュ値問題</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>より良いメッセージ</target>
@@ -1066,18 +1054,6 @@
<source>Better networking</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<note>No comment provided by engineer.</note>
@@ -1339,11 +1315,6 @@
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>ユーザープロフィール</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<note>No comment provided by engineer.</note>
@@ -1820,10 +1791,6 @@ This is your own one-time link!</source>
<target>カスタム時間</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<note>No comment provided by engineer.</note>
@@ -2110,10 +2077,6 @@ This is your own one-time link!</source>
<target>古いデータベースを削除しますか?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>接続待ちの接続を削除しますか?</target>
@@ -3159,10 +3122,6 @@ This is your own one-time link!</source>
<source>Forward messages without files?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
@@ -3529,11 +3488,6 @@ Error: %2$@</source>
<source>Importing archive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<note>No comment provided by engineer.</note>
@@ -4261,14 +4215,6 @@ This is your link for group %@!</source>
<target>新しいパスコード</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<note>No comment provided by engineer.</note>
@@ -4383,14 +4329,6 @@ This is your link for group %@!</source>
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>音声メッセージを録音する権限がありません</target>
@@ -5745,10 +5683,6 @@ Enable in *Network &amp; servers* settings.</source>
<source>Sent via proxy</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<note>No comment provided by engineer.</note>
@@ -6025,10 +5959,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>SimpleX使い捨て招待リンク</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>シークレットモードの簡素化</target>
@@ -6189,14 +6119,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Simplex Chatを支援</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>システム</target>
@@ -6537,14 +6459,6 @@ You will be prompted to complete authentication before this feature is enabled.<
オンにするには、認証ステップが行われます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>音声メッセージを録音する場合は、マイクの使用を許可してください。</target>
@@ -6854,6 +6768,11 @@ To connect, please ask your contact to create another connection link and check
<source>Use the app with one hand.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>ユーザープロフィール</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<note>No comment provided by engineer.</note>
@@ -945,11 +945,6 @@
<target>De app-toegangscode wordt vervangen door een zelfvernietigings wachtwoord.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<target>Appsessie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>App versie</target>
@@ -1085,19 +1080,11 @@
<target>Onjuiste bericht hash</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>Betere groepen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Betere berichten</target>
@@ -1108,18 +1095,6 @@
<target>Beter netwerk</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Zwart</target>
@@ -1406,11 +1381,6 @@
<target>Chatvoorkeuren zijn gewijzigd.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Gebruikers profiel</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Chat thema</target>
@@ -1940,10 +1910,6 @@ Dit is uw eigen eenmalige link!</target>
<target>Aangepaste tijd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<target>Thema aanpassen</target>
@@ -2238,10 +2204,6 @@ Dit is uw eigen eenmalige link!</target>
<target>Oude database verwijderen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Wachtende verbinding verwijderen?</target>
@@ -3365,10 +3327,6 @@ Dit is uw eigen eenmalige link!</target>
<target>Berichten doorsturen zonder bestanden?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Doorgestuurd</target>
@@ -3758,11 +3716,6 @@ Fout: %2$@</target>
<target>Archief importeren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>Verbeterde berichtbezorging</target>
@@ -4548,16 +4501,6 @@ Dit is jouw link voor groep %@!</target>
<target>Nieuwe toegangscode</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<target>Elke keer dat u de app start, worden er nieuwe SOCKS-inloggegevens gebruikt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<target>Voor elke server worden nieuwe SOCKS-inloggegevens gebruikt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>Nieuw gesprek</target>
@@ -4678,16 +4621,6 @@ Dit is jouw link voor groep %@!</target>
<target>Geen netwerkverbinding</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<target>Geen toestemming om spraak op te nemen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<target>Geen toestemming om video op te nemen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Geen toestemming om spraakbericht op te nemen</target>
@@ -6156,11 +6089,6 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<target>Verzonden via proxy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<target>Server</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<target>Server adres</target>
@@ -6461,10 +6389,6 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<target>Eenmalige SimpleX uitnodiging</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Vereenvoudigde incognitomodus</target>
@@ -6640,14 +6564,6 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<target>Ondersteuning van SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>Systeem</target>
@@ -6685,7 +6601,6 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
</trans-unit>
<trans-unit id="Tail" xml:space="preserve">
<source>Tail</source>
<target>Staart</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Take picture" xml:space="preserve">
@@ -7012,16 +6927,6 @@ You will be prompted to complete authentication before this feature is enabled.<
U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingeschakeld.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<target>Geef toestemming om de microfoon te gebruiken om spraak op te nemen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<target>Om video op te nemen, dient u toestemming te geven om de camera te gebruiken.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>Geef toestemming om de microfoon te gebruiken om een spraakbericht op te nemen.</target>
@@ -7359,6 +7264,11 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
<target>Gebruik de app met één hand.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Gebruikers profiel</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<target>Gebruikersselectie</target>
@@ -8991,7 +8901,7 @@ laatst ontvangen bericht: %2$@</target>
</trans-unit>
<trans-unit id="you are observer" xml:space="preserve">
<source>you are observer</source>
<target>je bent waarnemer</target>
<target>jij bent waarnemer</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you blocked %@" xml:space="preserve">
@@ -9021,7 +8931,7 @@ laatst ontvangen bericht: %2$@</target>
</trans-unit>
<trans-unit id="you left" xml:space="preserve">
<source>you left</source>
<target>je bent vertrokken</target>
<target>jij bent vertrokken</target>
<note>snd group event chat item</note>
</trans-unit>
<trans-unit id="you removed %@" xml:space="preserve">
@@ -139,7 +139,6 @@
</trans-unit>
<trans-unit id="%@, %@" xml:space="preserve">
<source>%1$@, %2$@</source>
<target>%1$@, %2$@</target>
<note>format for date separator in chat</note>
</trans-unit>
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
@@ -164,22 +163,18 @@
</trans-unit>
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
<source>%d file(s) are still being downloaded.</source>
<target>%d plik(ów) jest dalej pobieranych.</target>
<note>forward confirmation reason</note>
</trans-unit>
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
<source>%d file(s) failed to download.</source>
<target>%d plik(ów) nie udało się pobrać.</target>
<note>forward confirmation reason</note>
</trans-unit>
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
<source>%d file(s) were deleted.</source>
<target>%d plik(ów) zostało usuniętych.</target>
<note>forward confirmation reason</note>
</trans-unit>
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
<source>%d file(s) were not downloaded.</source>
<target>%d plik(ów) nie zostało pobranych.</target>
<note>forward confirmation reason</note>
</trans-unit>
<trans-unit id="%d hours" xml:space="preserve">
@@ -189,7 +184,6 @@
</trans-unit>
<trans-unit id="%d messages not forwarded" xml:space="preserve">
<source>%d messages not forwarded</source>
<target>%d wiadomości nie przekazanych</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="%d min" xml:space="preserve">
@@ -945,11 +939,6 @@
<target>Pin aplikacji został zastąpiony pinem samozniszczenia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<target>Sesja aplikacji</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Wersja aplikacji</target>
@@ -1057,7 +1046,6 @@
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<target>Ustawienia automatycznej akceptacji</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
@@ -1085,19 +1073,11 @@
<target>Zły hash wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>Lepsze grupy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Lepsze wiadomości</target>
@@ -1108,18 +1088,6 @@
<target>Lepsze sieciowanie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Czarny</target>
@@ -1403,14 +1371,8 @@
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<target>Preferencje czatu zostały zmienione.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Profil użytkownika</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Motyw czatu</target>
@@ -1812,7 +1774,6 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Corner" xml:space="preserve">
<source>Corner</source>
<target>Róg</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Correct name to %@?" xml:space="preserve">
@@ -1940,10 +1901,6 @@ To jest twój jednorazowy link!</target>
<target>Niestandardowy czas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<target>Dostosuj motyw</target>
@@ -2238,10 +2195,6 @@ To jest twój jednorazowy link!</target>
<target>Usunąć starą bazę danych?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Usunąć oczekujące połączenie?</target>
@@ -2494,7 +2447,6 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Do not use credentials with proxy." xml:space="preserve">
<source>Do not use credentials with proxy.</source>
<target>Nie używaj danych logowania do proxy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't create address" xml:space="preserve">
@@ -2540,7 +2492,6 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Download files" xml:space="preserve">
<source>Download files</source>
<target>Pobierz pliki</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Downloaded" xml:space="preserve">
@@ -2820,7 +2771,6 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Error changing connection profile" xml:space="preserve">
<source>Error changing connection profile</source>
<target>Błąd zmiany połączenia profilu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing role" xml:space="preserve">
@@ -2835,7 +2785,6 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
<target>Błąd zmiany na incognito!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
@@ -2960,7 +2909,6 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<target>Błąd migracji ustawień</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
@@ -3065,7 +3013,6 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Error switching profile" xml:space="preserve">
<source>Error switching profile</source>
<target>Błąd zmiany profilu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error switching profile!" xml:space="preserve">
@@ -3206,8 +3153,6 @@ To jest twój jednorazowy link!</target>
<trans-unit id="File errors:&#10;%@" xml:space="preserve">
<source>File errors:
%@</source>
<target>Błędy pliku:
%@</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
@@ -3347,7 +3292,6 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
<source>Forward %d message(s)?</source>
<target>Przekazać %d wiadomość(i)?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Forward and save messages" xml:space="preserve">
@@ -3357,18 +3301,12 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Forward messages" xml:space="preserve">
<source>Forward messages</source>
<target>Przekaż wiadomości</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Forward messages without files?" xml:space="preserve">
<source>Forward messages without files?</source>
<target>Przekazać wiadomości bez plików?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Przekazane dalej</target>
@@ -3381,7 +3319,6 @@ To jest twój jednorazowy link!</target>
</trans-unit>
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
<source>Forwarding %lld messages</source>
<target>Przekazywanie %lld wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
@@ -3680,7 +3617,6 @@ Błąd: %2$@</target>
</trans-unit>
<trans-unit id="IP address" xml:space="preserve">
<source>IP address</source>
<target>Adres IP</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
@@ -3758,11 +3694,6 @@ Błąd: %2$@</target>
<target>Importowanie archiwum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>Ulepszona dostawa wiadomości</target>
@@ -4335,7 +4266,6 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Message shape" xml:space="preserve">
<source>Message shape</source>
<target>Kształt wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
@@ -4390,7 +4320,6 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
<source>Messages were deleted after you selected them.</source>
<target>Wiadomości zostały usunięte po wybraniu ich.</target>
<note>alert message</note>
</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">
@@ -4548,16 +4477,6 @@ To jest twój link do grupy %@!</target>
<target>Nowy Pin</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<target>Nowe poświadczenia SOCKS będą używane przy każdym uruchomieniu aplikacji.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<target>Dla każdego serwera zostaną użyte nowe poświadczenia SOCKS.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>Nowy czat</target>
@@ -4678,16 +4597,6 @@ To jest twój link do grupy %@!</target>
<target>Brak połączenia z siecią</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<target>Brak zezwoleń do nagrania rozmowy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<target>Brak zezwoleń do nagrania wideo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Brak uprawnień do nagrywania wiadomości głosowej</target>
@@ -4710,7 +4619,6 @@ To jest twój link do grupy %@!</target>
</trans-unit>
<trans-unit id="Nothing to forward!" xml:space="preserve">
<source>Nothing to forward!</source>
<target>Nic do przekazania!</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Notifications" xml:space="preserve">
@@ -4939,8 +4847,6 @@ Wymaga włączenia VPN.</target>
<trans-unit id="Other file errors:&#10;%@" xml:space="preserve">
<source>Other file errors:
%@</source>
<target>Inne błędy pliku:
%@</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
@@ -4980,7 +4886,6 @@ Wymaga włączenia VPN.</target>
</trans-unit>
<trans-unit id="Password" xml:space="preserve">
<source>Password</source>
<target>Hasło</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Password to show" xml:space="preserve">
@@ -5134,7 +5039,6 @@ Błąd: %@</target>
</trans-unit>
<trans-unit id="Port" xml:space="preserve">
<source>Port</source>
<target>Port</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
@@ -5326,7 +5230,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Proxy requires password" xml:space="preserve">
<source>Proxy requires password</source>
<target>Proxy wymaga hasła</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
@@ -5552,7 +5455,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<target>Usunąć archiwum?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
@@ -5737,7 +5639,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="SOCKS proxy" xml:space="preserve">
<source>SOCKS proxy</source>
<target>Proxy SOCKS</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
@@ -5828,7 +5729,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<target>Zapisać Twój profil?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
@@ -5853,7 +5753,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Saving %lld messages" xml:space="preserve">
<source>Saving %lld messages</source>
<target>Zapisywanie %lld wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Scale" xml:space="preserve">
@@ -5938,7 +5837,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Select chat profile" xml:space="preserve">
<source>Select chat profile</source>
<target>Wybierz profil czatu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Selected %lld" xml:space="preserve">
@@ -6156,11 +6054,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<target>Wysłano przez proxy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<target>Serwer</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<target>Adres serwera</target>
@@ -6283,7 +6176,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<target>Ustawienia zostały zmienione.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
@@ -6323,7 +6215,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Share profile" xml:space="preserve">
<source>Share profile</source>
<target>Udostępnij profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
@@ -6461,10 +6352,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<target>Zaproszenie jednorazowe SimpleX</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Uproszczony tryb incognito</target>
@@ -6497,7 +6384,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<target>Niektóre ustawienia aplikacji nie zostały zmigrowane.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
@@ -6640,14 +6526,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<target>Wspieraj SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>System</target>
@@ -6685,7 +6563,6 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
</trans-unit>
<trans-unit id="Tail" xml:space="preserve">
<source>Tail</source>
<target>Ogon</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Take picture" xml:space="preserve">
@@ -6882,7 +6759,6 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<target>Przesłane archiwum bazy danych zostanie trwale usunięte z serwerów.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
@@ -7012,16 +6888,6 @@ You will be prompted to complete authentication before this feature is enabled.<
Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<target>Aby nagrać rozmowę, proszę zezwolić na użycie Mikrofonu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<target>Aby nagrać wideo, proszę zezwolić na użycie Aparatu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>Aby nagrać wiadomość głosową należy udzielić zgody na użycie Mikrofonu.</target>
@@ -7291,7 +7157,6 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
<source>Use SOCKS proxy</source>
<target>Użyj proxy SOCKS</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
@@ -7359,6 +7224,11 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<target>Korzystaj z aplikacji jedną ręką.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Profil użytkownika</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<target>Wybór użytkownika</target>
@@ -7366,7 +7236,6 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
</trans-unit>
<trans-unit id="Username" xml:space="preserve">
<source>Username</source>
<target>Nazwa użytkownika</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
@@ -7980,7 +7849,6 @@ Powtórzyć prośbę połączenia?</target>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<target>Twoje preferencje czatu</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
@@ -7990,7 +7858,6 @@ Powtórzyć prośbę połączenia?</target>
</trans-unit>
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
<target>Twoje połączenie zostało przeniesione do %@, ale podczas przekierowywania do profilu wystąpił nieoczekiwany błąd.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
@@ -8010,7 +7877,6 @@ Powtórzyć prośbę połączenia?</target>
</trans-unit>
<trans-unit id="Your credentials may be sent unencrypted." xml:space="preserve">
<source>Your credentials may be sent unencrypted.</source>
<target>Twoje poświadczenia mogą zostać wysłane niezaszyfrowane.</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">
@@ -8050,7 +7916,6 @@ Powtórzyć prośbę połączenia?</target>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<target>Twój profil został zmieniony. Jeśli go zapiszesz, zaktualizowany profil zostanie wysłany do wszystkich kontaktów.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
@@ -163,22 +163,18 @@
</trans-unit>
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
<source>%d file(s) are still being downloaded.</source>
<target>%d файл(ов) загружаются.</target>
<note>forward confirmation reason</note>
</trans-unit>
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
<source>%d file(s) failed to download.</source>
<target>%d файл(ов) не удалось загрузить.</target>
<note>forward confirmation reason</note>
</trans-unit>
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
<source>%d file(s) were deleted.</source>
<target>%d файлов было удалено.</target>
<note>forward confirmation reason</note>
</trans-unit>
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
<source>%d file(s) were not downloaded.</source>
<target>%d файлов не было загружено.</target>
<note>forward confirmation reason</note>
</trans-unit>
<trans-unit id="%d hours" xml:space="preserve">
@@ -188,7 +184,6 @@
</trans-unit>
<trans-unit id="%d messages not forwarded" xml:space="preserve">
<source>%d messages not forwarded</source>
<target>%d сообщений не переслано</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="%d min" xml:space="preserve">
@@ -944,11 +939,6 @@
<target>Код доступа в приложение будет заменен кодом самоуничтожения.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<target>Сессия приложения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Версия приложения</target>
@@ -1056,7 +1046,6 @@
</trans-unit>
<trans-unit id="Auto-accept settings" xml:space="preserve">
<source>Auto-accept settings</source>
<target>Настройки автоприема</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Back" xml:space="preserve">
@@ -1084,19 +1073,11 @@
<target>Ошибка хэш сообщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>Улучшенные группы</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Улучшенные сообщения</target>
@@ -1107,18 +1088,6 @@
<target>Улучшенные сетевые функции</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Черная</target>
@@ -1402,14 +1371,8 @@
</trans-unit>
<trans-unit id="Chat preferences were changed." xml:space="preserve">
<source>Chat preferences were changed.</source>
<target>Настройки чата были изменены.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Профиль чата</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Тема чата</target>
@@ -1811,7 +1774,6 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Corner" xml:space="preserve">
<source>Corner</source>
<target>Угол</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Correct name to %@?" xml:space="preserve">
@@ -1939,10 +1901,6 @@ This is your own one-time link!</source>
<target>Пользовательское время</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<target>Настроить тему</target>
@@ -2237,10 +2195,6 @@ This is your own one-time link!</source>
<target>Удалить предыдущую версию данных?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Удалить ожидаемое соединение?</target>
@@ -2493,7 +2447,6 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Do not use credentials with proxy." xml:space="preserve">
<source>Do not use credentials with proxy.</source>
<target>Не использовать учетные данные с прокси.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't create address" xml:space="preserve">
@@ -2539,7 +2492,6 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Download files" xml:space="preserve">
<source>Download files</source>
<target>Загрузить файлы</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Downloaded" xml:space="preserve">
@@ -2819,7 +2771,6 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Error changing connection profile" xml:space="preserve">
<source>Error changing connection profile</source>
<target>Ошибка при изменении профиля соединения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error changing role" xml:space="preserve">
@@ -2834,7 +2785,6 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Error changing to incognito!" xml:space="preserve">
<source>Error changing to incognito!</source>
<target>Ошибка при смене на Инкогнито!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
@@ -2959,7 +2909,6 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Error migrating settings" xml:space="preserve">
<source>Error migrating settings</source>
<target>Ошибка миграции настроек</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error opening chat" xml:space="preserve">
@@ -3064,7 +3013,6 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Error switching profile" xml:space="preserve">
<source>Error switching profile</source>
<target>Ошибка переключения профиля</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error switching profile!" xml:space="preserve">
@@ -3205,8 +3153,6 @@ This is your own one-time link!</source>
<trans-unit id="File errors:&#10;%@" xml:space="preserve">
<source>File errors:
%@</source>
<target>Ошибки файлов:
%@</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
@@ -3346,7 +3292,6 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
<source>Forward %d message(s)?</source>
<target>Переслать %d сообщение(й)?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Forward and save messages" xml:space="preserve">
@@ -3356,18 +3301,12 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Forward messages" xml:space="preserve">
<source>Forward messages</source>
<target>Переслать сообщения</target>
<note>alert action</note>
</trans-unit>
<trans-unit id="Forward messages without files?" xml:space="preserve">
<source>Forward messages without files?</source>
<target>Переслать сообщения без файлов?</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Переслано</target>
@@ -3380,7 +3319,6 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
<source>Forwarding %lld messages</source>
<target>Пересылка %lld сообщений</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
@@ -3679,7 +3617,6 @@ Error: %2$@</source>
</trans-unit>
<trans-unit id="IP address" xml:space="preserve">
<source>IP address</source>
<target>IP адрес</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
@@ -3757,11 +3694,6 @@ Error: %2$@</source>
<target>Импорт архива</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>Улучшенная доставка сообщений</target>
@@ -4334,7 +4266,6 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Message shape" xml:space="preserve">
<source>Message shape</source>
<target>Форма сообщений</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
@@ -4389,7 +4320,6 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
<source>Messages were deleted after you selected them.</source>
<target>Сообщения были удалены после того, как вы их выбрали.</target>
<note>alert message</note>
</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">
@@ -4547,16 +4477,6 @@ This is your link for group %@!</source>
<target>Новый Код</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<target>Новые учетные данные SOCKS будут использоваться при каждом запуске приложения.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<target>Новые учетные данные SOCKS будут использоваться для каждого сервера.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>Новый чат</target>
@@ -4677,16 +4597,6 @@ This is your link for group %@!</source>
<target>Нет интернет-соединения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<target>Нет разрешения на запись речи</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<target>Нет разрешения на запись видео</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Нет разрешения для записи голосового сообщения</target>
@@ -4709,7 +4619,6 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Nothing to forward!" xml:space="preserve">
<source>Nothing to forward!</source>
<target>Нет сообщений, которые можно переслать!</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Notifications" xml:space="preserve">
@@ -4938,8 +4847,6 @@ Requires compatible VPN.</source>
<trans-unit id="Other file errors:&#10;%@" xml:space="preserve">
<source>Other file errors:
%@</source>
<target>Другие ошибки файлов:
%@</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
@@ -4979,7 +4886,6 @@ Requires compatible VPN.</source>
</trans-unit>
<trans-unit id="Password" xml:space="preserve">
<source>Password</source>
<target>Пароль</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Password to show" xml:space="preserve">
@@ -5133,7 +5039,6 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Port" xml:space="preserve">
<source>Port</source>
<target>Порт</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
@@ -5325,7 +5230,6 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="Proxy requires password" xml:space="preserve">
<source>Proxy requires password</source>
<target>Прокси требует пароль</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
@@ -5551,7 +5455,6 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="Remove archive?" xml:space="preserve">
<source>Remove archive?</source>
<target>Удалить архив?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove image" xml:space="preserve">
@@ -5736,7 +5639,6 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="SOCKS proxy" xml:space="preserve">
<source>SOCKS proxy</source>
<target>SOCKS прокси</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Safely receive files" xml:space="preserve">
@@ -5827,7 +5729,6 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="Save your profile?" xml:space="preserve">
<source>Save your profile?</source>
<target>Сохранить ваш профиль?</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
@@ -5852,7 +5753,6 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="Saving %lld messages" xml:space="preserve">
<source>Saving %lld messages</source>
<target>Сохранение %lld сообщений</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Scale" xml:space="preserve">
@@ -5937,7 +5837,6 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="Select chat profile" xml:space="preserve">
<source>Select chat profile</source>
<target>Выберите профиль чата</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Selected %lld" xml:space="preserve">
@@ -6155,11 +6054,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Отправлено через прокси</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<target>Сервер</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<target>Адрес сервера</target>
@@ -6282,7 +6176,6 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="Settings were changed." xml:space="preserve">
<source>Settings were changed.</source>
<target>Настройки были изменены.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
@@ -6322,7 +6215,6 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="Share profile" xml:space="preserve">
<source>Share profile</source>
<target>Поделиться профилем</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
@@ -6460,10 +6352,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>SimpleX одноразовая ссылка</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Упрощенный режим Инкогнито</target>
@@ -6496,7 +6384,6 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
<source>Some app settings were not migrated.</source>
<target>Некоторые настройки приложения не были перенесены.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
@@ -6639,14 +6526,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Поддержать SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>Системная</target>
@@ -6684,7 +6563,6 @@ Enable in *Network &amp; servers* settings.</source>
</trans-unit>
<trans-unit id="Tail" xml:space="preserve">
<source>Tail</source>
<target>Хвост</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Take picture" xml:space="preserve">
@@ -6881,7 +6759,6 @@ It can happen because of some bug or when the connection is compromised.</source
</trans-unit>
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
<source>The uploaded database archive will be permanently removed from the servers.</source>
<target>Загруженный архив базы данных будет навсегда удален с серверов.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Themes" xml:space="preserve">
@@ -7011,16 +6888,6 @@ You will be prompted to complete authentication before this feature is enabled.<
Вам будет нужно пройти аутентификацию для включения блокировки.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<target>Для записи речи, пожалуйста, дайте разрешение на использование микрофона.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<target>Для записи видео, пожалуйста, дайте разрешение на использование камеры.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>Для записи голосового сообщения, пожалуйста разрешите доступ к микрофону.</target>
@@ -7290,7 +7157,6 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
<source>Use SOCKS proxy</source>
<target>Использовать SOCKS прокси</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
@@ -7358,6 +7224,11 @@ To connect, please ask your contact to create another connection link and check
<target>Используйте приложение одной рукой.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Профиль чата</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<target>Выбор пользователя</target>
@@ -7365,7 +7236,6 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Username" xml:space="preserve">
<source>Username</source>
<target>Имя пользователя</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
@@ -7979,7 +7849,6 @@ Repeat connection request?</source>
</trans-unit>
<trans-unit id="Your chat preferences" xml:space="preserve">
<source>Your chat preferences</source>
<target>Ваши настройки чата</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Your chat profiles" xml:space="preserve">
@@ -7989,7 +7858,6 @@ Repeat connection request?</source>
</trans-unit>
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
<target>Соединение было перемещено на %@, но при смене профиля произошла неожиданная ошибка.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
@@ -8009,7 +7877,6 @@ Repeat connection request?</source>
</trans-unit>
<trans-unit id="Your credentials may be sent unencrypted." xml:space="preserve">
<source>Your credentials may be sent unencrypted.</source>
<target>Ваши учетные данные могут быть отправлены в незашифрованном виде.</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">
@@ -8049,7 +7916,6 @@ Repeat connection request?</source>
</trans-unit>
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
<target>Ваш профиль был изменен. Если вы сохраните его, обновленный профиль будет отправлен всем вашим контактам.</target>
<note>alert message</note>
</trans-unit>
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
@@ -884,10 +884,6 @@
<target>รหัสผ่านแอปจะถูกแทนที่ด้วยรหัสผ่านที่ทำลายตัวเอง</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>เวอร์ชันแอป</target>
@@ -1014,18 +1010,10 @@
<target>แฮชข้อความไม่ดี</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>ข้อความที่ดีขึ้น</target>
@@ -1035,18 +1023,6 @@
<source>Better networking</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<note>No comment provided by engineer.</note>
@@ -1307,11 +1283,6 @@
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>โปรไฟล์ผู้ใช้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<note>No comment provided by engineer.</note>
@@ -1785,10 +1756,6 @@ This is your own one-time link!</source>
<target>เวลาที่กําหนดเอง</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<note>No comment provided by engineer.</note>
@@ -2075,10 +2042,6 @@ This is your own one-time link!</source>
<target>ลบฐานข้อมูลเก่า?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>ลบการเชื่อมต่อที่รอดำเนินการหรือไม่?</target>
@@ -3119,10 +3082,6 @@ This is your own one-time link!</source>
<source>Forward messages without files?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<note>No comment provided by engineer.</note>
@@ -3489,11 +3448,6 @@ Error: %2$@</source>
<source>Importing archive</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<note>No comment provided by engineer.</note>
@@ -4219,14 +4173,6 @@ This is your link for group %@!</source>
<target>รหัสผ่านใหม่</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<note>No comment provided by engineer.</note>
@@ -4339,14 +4285,6 @@ This is your link for group %@!</source>
<source>No network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>ไม่อนุญาตให้บันทึกข้อความเสียง</target>
@@ -5702,10 +5640,6 @@ Enable in *Network &amp; servers* settings.</source>
<source>Sent via proxy</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<note>No comment provided by engineer.</note>
@@ -5981,10 +5915,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>คำเชิญ SimpleX แบบครั้งเดียว</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<note>No comment provided by engineer.</note>
@@ -6143,14 +6073,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>สนับสนุน SimpleX แชท</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>ระบบ</target>
@@ -6491,14 +6413,6 @@ You will be prompted to complete authentication before this feature is enabled.<
คุณจะได้รับแจ้งให้ยืนยันตัวตนให้เสร็จสมบูรณ์ก่อนที่จะเปิดใช้งานคุณลักษณะนี้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>ในการบันทึกข้อความเสียง โปรดให้สิทธิ์ในการใช้ไมโครโฟน</target>
@@ -6806,6 +6720,11 @@ To connect, please ask your contact to create another connection link and check
<source>Use the app with one hand.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>โปรไฟล์ผู้ใช้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<note>No comment provided by engineer.</note>
File diff suppressed because it is too large Load Diff
@@ -939,10 +939,6 @@
<target>Пароль програми замінено на пароль самознищення.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>Версія програми</target>
@@ -1077,19 +1073,11 @@
<target>Поганий хеш повідомлення</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>Кращі групи</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>Кращі повідомлення</target>
@@ -1100,18 +1088,6 @@
<target>Краща мережа</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Чорний</target>
@@ -1397,11 +1373,6 @@
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>Профіль користувача</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>Тема чату</target>
@@ -1930,10 +1901,6 @@ This is your own one-time link!</source>
<target>Індивідуальний час</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<target>Налаштувати тему</target>
@@ -2228,10 +2195,6 @@ This is your own one-time link!</source>
<target>Видалити стару базу даних?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>Видалити очікуване з'єднання?</target>
@@ -3344,10 +3307,6 @@ This is your own one-time link!</source>
<source>Forward messages without files?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>Переслано</target>
@@ -3735,11 +3694,6 @@ Error: %2$@</source>
<target>Імпорт архіву</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>Покращена доставка повідомлень</target>
@@ -4523,14 +4477,6 @@ This is your link for group %@!</source>
<target>Новий пароль</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>Новий чат</target>
@@ -4651,14 +4597,6 @@ This is your link for group %@!</source>
<target>Немає підключення до мережі</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>Немає дозволу на запис голосового повідомлення</target>
@@ -6116,10 +6054,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Відправлено через проксі</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<target>Адреса сервера</target>
@@ -6418,10 +6352,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Одноразове запрошення SimpleX</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>Спрощений режим інкогніто</target>
@@ -6596,14 +6526,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>Підтримка чату SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>Система</target>
@@ -6966,14 +6888,6 @@ You will be prompted to complete authentication before this feature is enabled.<
Перед увімкненням цієї функції вам буде запропоновано пройти автентифікацію.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>Щоб записати голосове повідомлення, будь ласка, надайте дозвіл на використання мікрофону.</target>
@@ -7310,6 +7224,11 @@ To connect, please ask your contact to create another connection link and check
<target>Використовуйте додаток однією рукою.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>Профіль користувача</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<target>Вибір користувача</target>
@@ -939,10 +939,6 @@
<target>应用程序密码被替换为自毁密码。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App session" xml:space="preserve">
<source>App session</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App version" xml:space="preserve">
<source>App version</source>
<target>应用程序版本</target>
@@ -1077,19 +1073,11 @@
<target>错误消息散列</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better calls" xml:space="preserve">
<source>Better calls</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better groups" xml:space="preserve">
<source>Better groups</source>
<target>更佳的群组</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better message dates." xml:space="preserve">
<source>Better message dates.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better messages" xml:space="preserve">
<source>Better messages</source>
<target>更好的消息</target>
@@ -1100,18 +1088,6 @@
<target>更好的网络</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better notifications" xml:space="preserve">
<source>Better notifications</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better security ✅" xml:space="preserve">
<source>Better security ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Better user experience" xml:space="preserve">
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>黑色</target>
@@ -1397,11 +1373,6 @@
<source>Chat preferences were changed.</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Chat profile" xml:space="preserve">
<source>Chat profile</source>
<target>用户资料</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat theme" xml:space="preserve">
<source>Chat theme</source>
<target>聊天主题</target>
@@ -1930,10 +1901,6 @@ This is your own one-time link!</source>
<target>自定义时间</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customizable message shape." xml:space="preserve">
<source>Customizable message shape.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Customize theme" xml:space="preserve">
<source>Customize theme</source>
<target>自定义主题</target>
@@ -2228,10 +2195,6 @@ This is your own one-time link!</source>
<target>删除旧数据库吗?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete or moderate up to 200 messages." xml:space="preserve">
<source>Delete or moderate up to 200 messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete pending connection?" xml:space="preserve">
<source>Delete pending connection?</source>
<target>删除待定连接?</target>
@@ -3344,10 +3307,6 @@ This is your own one-time link!</source>
<source>Forward messages without files?</source>
<note>alert message</note>
</trans-unit>
<trans-unit id="Forward up to 20 messages at once." xml:space="preserve">
<source>Forward up to 20 messages at once.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>已转发</target>
@@ -3735,11 +3694,6 @@ Error: %2$@</source>
<target>正在导入存档</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved delivery, reduced traffic usage.&#10;More improvements are coming soon!" xml:space="preserve">
<source>Improved delivery, reduced traffic usage.
More improvements are coming soon!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
<source>Improved message delivery</source>
<target>改进了消息传递</target>
@@ -4523,14 +4477,6 @@ This is your link for group %@!</source>
<target>新密码</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used every time you start the app." xml:space="preserve">
<source>New SOCKS credentials will be used every time you start the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New SOCKS credentials will be used for each server." xml:space="preserve">
<source>New SOCKS credentials will be used for each server.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="New chat" xml:space="preserve">
<source>New chat</source>
<target>新聊天</target>
@@ -4651,14 +4597,6 @@ This is your link for group %@!</source>
<target>无网络连接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record speech" xml:space="preserve">
<source>No permission to record speech</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record video" xml:space="preserve">
<source>No permission to record video</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
<source>No permission to record voice message</source>
<target>没有录制语音消息的权限</target>
@@ -6116,10 +6054,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>通过代理发送</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server" xml:space="preserve">
<source>Server</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address" xml:space="preserve">
<source>Server address</source>
<target>服务器地址</target>
@@ -6418,10 +6352,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>SimpleX 一次性邀请</target>
<note>simplex link type</note>
</trans-unit>
<trans-unit id="SimpleX protocols reviewed by Trail of Bits." xml:space="preserve">
<source>SimpleX protocols reviewed by Trail of Bits.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Simplified incognito mode" xml:space="preserve">
<source>Simplified incognito mode</source>
<target>简化的隐身模式</target>
@@ -6596,14 +6526,6 @@ Enable in *Network &amp; servers* settings.</source>
<target>支持 SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch audio and video during the call." xml:space="preserve">
<source>Switch audio and video during the call.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Switch chat profile for 1-time invitations." xml:space="preserve">
<source>Switch chat profile for 1-time invitations.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="System" xml:space="preserve">
<source>System</source>
<target>系统</target>
@@ -6966,14 +6888,6 @@ You will be prompted to complete authentication before this feature is enabled.<
在启用此功能之前,系统将提示您完成身份验证。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record speech please grant permission to use Microphone." xml:space="preserve">
<source>To record speech please grant permission to use Microphone.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record video please grant permission to use Camera." xml:space="preserve">
<source>To record video please grant permission to use Camera.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To record voice message please grant permission to use Microphone." xml:space="preserve">
<source>To record voice message please grant permission to use Microphone.</source>
<target>请授权使用麦克风以录制语音消息。</target>
@@ -7310,6 +7224,11 @@ To connect, please ask your contact to create another connection link and check
<target>用一只手使用应用程序。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
<source>User profile</source>
<target>用户资料</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User selection" xml:space="preserve">
<source>User selection</source>
<target>用户选择</target>
+14 -46
View File
@@ -26,7 +26,7 @@ enum NSENotification {
case nse(UNMutableNotificationContent)
case callkit(RcvCallInvitation)
case empty
case msgInfo(NtfMsgAckInfo)
case msgInfo(NtfMsgInfo)
var isCallInvitation: Bool {
switch self {
@@ -119,9 +119,7 @@ class NotificationService: UNNotificationServiceExtension {
var threadId: UUID? = NSEThreads.shared.newThread()
var notificationInfo: NtfMessages?
var receiveEntityId: String?
var receiveConnId: String?
var expectedMessage: String?
var allowedGetNextAttempts: Int = 3
// return true if the message is taken - it prevents sending it to another NotificationService instance for processing
var shouldProcessNtf = false
var appSubscriber: AppSubscriber?
@@ -193,21 +191,17 @@ class NotificationService: UNNotificationServiceExtension {
let dbStatus = startChat()
if case .ok = dbStatus,
let ntfInfo = apiGetNtfMessage(nonce: nonce, encNtfInfo: encNtfInfo) {
logger.debug("NotificationService: receiveNtfMessages: apiGetNtfMessage \(String(describing: ntfInfo.receivedMsg_ == nil ? 0 : 1))")
logger.debug("NotificationService: receiveNtfMessages: apiGetNtfMessage \(String(describing: ntfInfo.ntfMessage_ == nil ? 0 : 1))")
if let connEntity = ntfInfo.connEntity_ {
setBestAttemptNtf(
ntfInfo.ntfsEnabled
? .nse(createConnectionEventNtf(ntfInfo.user, connEntity))
: .empty
)
if let id = connEntity.id, ntfInfo.expectedMsg_ != nil {
if let id = connEntity.id, ntfInfo.msgTs != nil {
notificationInfo = ntfInfo
receiveEntityId = id
receiveConnId = connEntity.conn.agentConnId
let expectedMsgId = ntfInfo.expectedMsg_?.msgId
let receivedMsgId = ntfInfo.receivedMsg_?.msgId
logger.debug("NotificationService: receiveNtfMessages: expectedMsgId = \(expectedMsgId ?? "nil", privacy: .private), receivedMsgId = \(receivedMsgId ?? "nil", privacy: .private)")
expectedMessage = expectedMsgId
expectedMessage = ntfInfo.ntfMessage_.flatMap { $0.msgId }
shouldProcessNtf = true
return
}
@@ -225,34 +219,22 @@ class NotificationService: UNNotificationServiceExtension {
}
func processReceivedNtf(_ ntf: NSENotification) -> Bool {
guard let ntfInfo = notificationInfo, let expectedMsgTs = ntfInfo.expectedMsg_?.msgTs else { return false }
guard let ntfInfo = notificationInfo, let msgTs = ntfInfo.msgTs else { return false }
if !ntfInfo.user.showNotifications {
self.setBestAttemptNtf(.empty)
}
if case let .msgInfo(info) = ntf {
if info.msgId == expectedMessage {
expectedMessage = nil
logger.debug("NotificationService processNtf: msgInfo msgId = \(info.msgId, privacy: .private): expected")
logger.debug("NotificationService processNtf: msgInfo")
self.deliverBestAttemptNtf()
return true
} else if let msgTs = info.msgTs_, msgTs > expectedMsgTs {
logger.debug("NotificationService processNtf: msgInfo msgId = \(info.msgId, privacy: .private): unexpected msgInfo, let other instance to process it, stopping this one")
} 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 if allowedGetNextAttempts > 0, let receiveConnId = receiveConnId {
logger.debug("NotificationService processNtf: msgInfo msgId = \(info.msgId, privacy: .private): unexpected msgInfo, get next message")
allowedGetNextAttempts -= 1
if let receivedMsg = apiGetConnNtfMessage(connId: receiveConnId) {
logger.debug("NotificationService processNtf, on apiGetConnNtfMessage: msgInfo msgId = \(info.msgId, privacy: .private), receivedMsg msgId = \(receivedMsg.msgId, privacy: .private)")
return true
} else {
logger.debug("NotificationService processNtf, on apiGetConnNtfMessage: msgInfo msgId = \(info.msgId, privacy: .private): no next message, deliver best attempt")
self.deliverBestAttemptNtf()
return false
}
} else {
logger.debug("NotificationService processNtf: msgInfo msgId = \(info.msgId, privacy: .private): unknown message, let other instance to process it")
self.deliverBestAttemptNtf()
logger.debug("NotificationService processNtf: unknown message, let other instance to process it")
return false
}
} else if ntfInfo.user.showNotifications {
@@ -710,9 +692,9 @@ func apiGetNtfMessage(nonce: String, encNtfInfo: String) -> NtfMessages? {
return nil
}
let r = sendSimpleXCmd(.apiGetNtfMessage(nonce: nonce, encNtfInfo: encNtfInfo))
if case let .ntfMessages(user, connEntity_, expectedMsg_, receivedMsg_) = r, let user = user {
logger.debug("apiGetNtfMessage response ntfMessages: \(receivedMsg_ == nil ? 0 : 1)")
return NtfMessages(user: user, connEntity_: connEntity_, expectedMsg_: expectedMsg_, receivedMsg_: receivedMsg_)
if case let .ntfMessages(user, connEntity_, msgTs, ntfMessage_) = r, let user = user {
logger.debug("apiGetNtfMessage response ntfMessages: \(ntfMessage_ == nil ? 0 : 1)")
return NtfMessages(user: user, connEntity_: connEntity_, msgTs: msgTs, ntfMessage_: ntfMessage_)
} else if case let .chatCmdError(_, error) = r {
logger.debug("apiGetNtfMessage error response: \(String.init(describing: error))")
} else {
@@ -721,20 +703,6 @@ func apiGetNtfMessage(nonce: String, encNtfInfo: String) -> NtfMessages? {
return nil
}
func apiGetConnNtfMessage(connId: String) -> NtfMsgInfo? {
guard apiGetActiveUser() != nil else {
logger.debug("no active user")
return nil
}
let r = sendSimpleXCmd(.apiGetConnNtfMessage(connId: connId))
if case let .connNtfMessage(receivedMsg_) = r {
logger.debug("apiGetConnNtfMessage response receivedMsg_: \(receivedMsg_ == nil ? 0 : 1)")
return receivedMsg_
}
logger.debug("apiGetConnNtfMessage error: \(responseError(r))")
return nil
}
func apiReceiveFile(fileId: Int64, encrypted: Bool, inline: Bool? = nil) -> AChatItem? {
let userApprovedRelays = !privacyAskToApproveRelaysGroupDefault.get()
let r = sendSimpleXCmd(.receiveFile(fileId: fileId, userApprovedRelays: userApprovedRelays, encrypted: encrypted, inline: inline))
@@ -772,8 +740,8 @@ func setNetworkConfig(_ cfg: NetCfg) throws {
struct NtfMessages {
var user: User
var connEntity_: ConnectionEntity?
var expectedMsg_: NtfMsgInfo?
var receivedMsg_: NtfMsgInfo?
var msgTs: Date?
var ntfMessage_: NtfMsgInfo?
var ntfsEnabled: Bool {
user.showNotifications && (connEntity_?.ntfsEnabled ?? false)
@@ -56,7 +56,7 @@
"Invalid migration confirmation" = "Érvénytelen átköltöztetési visszaigazolás";
/* No comment provided by engineer. */
"Keychain error" = "Kulcstartóhiba";
"Keychain error" = "Kulcstartó hiba";
/* No comment provided by engineer. */
"Large file!" = "Nagy fájl!";
@@ -1,9 +1,7 @@
/* Bundle display name */
"CFBundleDisplayName" = "SimpleX SE";
/* Bundle name */
"CFBundleName" = "SimpleX SE";
/* Copyright (human-readable) */
"NSHumanReadableCopyright" = "Telif Hakkı © 2024 SimpleX Chat. Tüm hakları saklıdır.";
/*
InfoPlist.strings
SimpleX
Created by EP on 30/07/2024.
Copyright © 2024 SimpleX Chat. All rights reserved.
*/
@@ -1,111 +1,7 @@
/* No comment provided by engineer. */
"%@" = "%@";
/* No comment provided by engineer. */
"App is locked!" = "Uygulama kilitlendi!";
/* No comment provided by engineer. */
"Cancel" = "İptal et";
/* No comment provided by engineer. */
"Cannot access keychain to save database password" = "Veritabanı şifresini kaydetmek için Anahtar Zinciri'ne erişilemiyor";
/* No comment provided by engineer. */
"Cannot forward message" = "Mesaj iletilemiyor";
/* No comment provided by engineer. */
"Comment" = "Yorum";
/* No comment provided by engineer. */
"Currently maximum supported file size is %@." = "Şu anki maksimum desteklenen dosya boyutu %@ kadardır.";
/* No comment provided by engineer. */
"Database downgrade required" = "Veritabanı sürüm düşürme gerekli";
/* No comment provided by engineer. */
"Database encrypted!" = "Veritabanı şifrelendi!";
/* No comment provided by engineer. */
"Database error" = "Veritabanı hatası";
/* No comment provided by engineer. */
"Database passphrase is different from saved in the keychain." = "Veritabanı parolası Anahtar Zinciri'nde kayıtlı olandan farklıdır.";
/* No comment provided by engineer. */
"Database passphrase is required to open chat." = "Konuşmayı açmak için veri tabanı parolası gerekli.";
/* No comment provided by engineer. */
"Database upgrade required" = "Veritabanı yükseltmesi gerekli";
/* No comment provided by engineer. */
"Error preparing file" = "Dosya hazırlanırken hata oluştu";
/* No comment provided by engineer. */
"Error preparing message" = "Mesaj hazırlanırken hata oluştu";
/* No comment provided by engineer. */
"Error: %@" = "Hata: %@";
/* No comment provided by engineer. */
"File error" = "Dosya hatası";
/* No comment provided by engineer. */
"Incompatible database version" = "Uyumsuz veritabanı sürümü";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "Geçerli olmayan taşıma onayı";
/* No comment provided by engineer. */
"Keychain error" = "Anahtarlık hatası";
/* No comment provided by engineer. */
"Large file!" = "Büyük dosya!";
/* No comment provided by engineer. */
"No active profile" = "Aktif profil yok";
/* No comment provided by engineer. */
"Ok" = "Tamam";
/* No comment provided by engineer. */
"Open the app to downgrade the database." = "Veritabanının sürümünü düşürmek için uygulamayı açın.";
/* No comment provided by engineer. */
"Open the app to upgrade the database." = "Veritabanını güncellemek için uygulamayı açın.";
/* No comment provided by engineer. */
"Passphrase" = "Parola";
/* No comment provided by engineer. */
"Please create a profile in the SimpleX app" = "Lütfen SimpleX uygulamasında bir profil oluşturun";
/* No comment provided by engineer. */
"Selected chat preferences prohibit this message." = "Seçilen sohbet tercihleri bu mesajı yasakladı.";
/* No comment provided by engineer. */
"Sending a message takes longer than expected." = "Mesaj göndermek beklenenden daha uzun sürüyor.";
/* No comment provided by engineer. */
"Sending message…" = "Mesaj gönderiliyor…";
/* No comment provided by engineer. */
"Share" = "Paylaş";
/* No comment provided by engineer. */
"Slow network?" = "Ağ yavaş mı?";
/* No comment provided by engineer. */
"Unknown database error: %@" = "Bilinmeyen veritabanı hatası: %@";
/* No comment provided by engineer. */
"Unsupported format" = "Desteklenmeyen format";
/* No comment provided by engineer. */
"Wait" = "Bekleyin";
/* No comment provided by engineer. */
"Wrong database passphrase" = "Yanlış veritabanı parolası";
/* No comment provided by engineer. */
"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "Gizlilik ve Güvenlik / SimpleX Lock ayarlarından paylaşıma izin verebilirsiniz.";
/*
Localizable.strings
SimpleX
Created by EP on 30/07/2024.
Copyright © 2024 SimpleX Chat. All rights reserved.
*/
+30 -34
View File
@@ -144,11 +144,6 @@
5CFE0922282EEAF60002594B /* ZoomableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */; };
640417CD2B29B8C200CCB412 /* NewChatMenuButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640417CB2B29B8C200CCB412 /* NewChatMenuButton.swift */; };
640417CE2B29B8C200CCB412 /* NewChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640417CC2B29B8C200CCB412 /* NewChatView.swift */; };
640548A32CB56735005DE1E4 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6405489E2CB56735005DE1E4 /* libgmpxx.a */; };
640548A42CB56735005DE1E4 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6405489F2CB56735005DE1E4 /* libgmp.a */; };
640548A52CB56735005DE1E4 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 640548A02CB56735005DE1E4 /* libffi.a */; };
640548A62CB56735005DE1E4 /* libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 640548A12CB56735005DE1E4 /* libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv-ghc9.6.3.a */; };
640548A72CB56735005DE1E4 /* libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 640548A22CB56735005DE1E4 /* libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv.a */; };
6407BA83295DA85D0082BA18 /* CIInvalidJSONView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6407BA82295DA85D0082BA18 /* CIInvalidJSONView.swift */; };
6419EC562AB8BC8B004A607A /* ContextInvitingContactMemberView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6419EC552AB8BC8B004A607A /* ContextInvitingContactMemberView.swift */; };
6419EC582AB97507004A607A /* CIMemberCreatedContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6419EC572AB97507004A607A /* CIMemberCreatedContactView.swift */; };
@@ -216,13 +211,17 @@
CEE723F02C3D25C70009AE93 /* ShareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE723EF2C3D25C70009AE93 /* ShareView.swift */; };
CEE723F22C3D25ED0009AE93 /* ShareModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE723F12C3D25ED0009AE93 /* ShareModel.swift */; };
CEEA861D2C2ABCB50084E1EA /* ReverseList.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEA861C2C2ABCB50084E1EA /* ReverseList.swift */; };
CEFB2EDF2CA1BCC7004B1ECE /* SheetRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB2EDE2CA1BCC7004B1ECE /* SheetRepresentable.swift */; };
D7197A1829AE89660055C05A /* WebRTC in Frameworks */ = {isa = PBXBuildFile; productRef = D7197A1729AE89660055C05A /* WebRTC */; };
D72A9088294BD7A70047C86D /* NativeTextEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D72A9087294BD7A70047C86D /* NativeTextEditor.swift */; };
D741547829AF89AF0022400A /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D741547729AF89AF0022400A /* StoreKit.framework */; };
D741547A29AF90B00022400A /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D741547929AF90B00022400A /* PushKit.framework */; };
D77B92DC2952372200A5A1CC /* SwiftyGif in Frameworks */ = {isa = PBXBuildFile; productRef = D77B92DB2952372200A5A1CC /* SwiftyGif */; };
D7F0E33929964E7E0068AF69 /* LZString in Frameworks */ = {isa = PBXBuildFile; productRef = D7F0E33829964E7E0068AF69 /* LZString */; };
E51B923B2CAB2B8800C212F2 /* libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E51B92362CAB2B8800C212F2 /* libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU.a */; };
E51B923C2CAB2B8800C212F2 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E51B92372CAB2B8800C212F2 /* libgmp.a */; };
E51B923D2CAB2B8800C212F2 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E51B92382CAB2B8800C212F2 /* libffi.a */; };
E51B923E2CAB2B8800C212F2 /* libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E51B92392CAB2B8800C212F2 /* libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU-ghc9.6.3.a */; };
E51B923F2CAB2B8800C212F2 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E51B923A2CAB2B8800C212F2 /* libgmpxx.a */; };
E51CC1E62C62085600DB91FE /* OneHandUICard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E51CC1E52C62085600DB91FE /* OneHandUICard.swift */; };
E5DCF8DB2C56FAC1007928CC /* SimpleXChat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE2BA682845308900EC33A6 /* SimpleXChat.framework */; };
E5DCF9712C590272007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF96F2C590272007928CC /* Localizable.strings */; };
@@ -486,11 +485,6 @@
5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ZoomableScrollView.swift; path = Shared/Views/ZoomableScrollView.swift; sourceTree = SOURCE_ROOT; };
640417CB2B29B8C200CCB412 /* NewChatMenuButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewChatMenuButton.swift; sourceTree = "<group>"; };
640417CC2B29B8C200CCB412 /* NewChatView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewChatView.swift; sourceTree = "<group>"; };
6405489E2CB56735005DE1E4 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
6405489F2CB56735005DE1E4 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
640548A02CB56735005DE1E4 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
640548A12CB56735005DE1E4 /* libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv-ghc9.6.3.a"; sourceTree = "<group>"; };
640548A22CB56735005DE1E4 /* libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv.a"; sourceTree = "<group>"; };
6407BA82295DA85D0082BA18 /* CIInvalidJSONView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIInvalidJSONView.swift; sourceTree = "<group>"; };
6419EC552AB8BC8B004A607A /* ContextInvitingContactMemberView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextInvitingContactMemberView.swift; sourceTree = "<group>"; };
6419EC572AB97507004A607A /* CIMemberCreatedContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIMemberCreatedContactView.swift; sourceTree = "<group>"; };
@@ -559,11 +553,15 @@
CEE723EF2C3D25C70009AE93 /* ShareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareView.swift; sourceTree = "<group>"; };
CEE723F12C3D25ED0009AE93 /* ShareModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareModel.swift; sourceTree = "<group>"; };
CEEA861C2C2ABCB50084E1EA /* ReverseList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReverseList.swift; sourceTree = "<group>"; };
CEFB2EDE2CA1BCC7004B1ECE /* SheetRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SheetRepresentable.swift; sourceTree = "<group>"; };
D72A9087294BD7A70047C86D /* NativeTextEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeTextEditor.swift; sourceTree = "<group>"; };
D741547729AF89AF0022400A /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/System/Library/Frameworks/StoreKit.framework; sourceTree = DEVELOPER_DIR; };
D741547929AF90B00022400A /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/System/Library/Frameworks/PushKit.framework; sourceTree = DEVELOPER_DIR; };
D7AA2C3429A936B400737B40 /* MediaEncryption.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; name = MediaEncryption.playground; path = Shared/MediaEncryption.playground; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
E51B92362CAB2B8800C212F2 /* libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU.a"; sourceTree = "<group>"; };
E51B92372CAB2B8800C212F2 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
E51B92382CAB2B8800C212F2 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
E51B92392CAB2B8800C212F2 /* libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU-ghc9.6.3.a"; sourceTree = "<group>"; };
E51B923A2CAB2B8800C212F2 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
E51CC1E52C62085600DB91FE /* OneHandUICard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OneHandUICard.swift; sourceTree = "<group>"; };
E5DCF9702C590272007928CC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
E5DCF9722C590274007928CC /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -655,14 +653,14 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
640548A32CB56735005DE1E4 /* libgmpxx.a in Frameworks */,
640548A72CB56735005DE1E4 /* libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv.a in Frameworks */,
640548A52CB56735005DE1E4 /* libffi.a in Frameworks */,
640548A42CB56735005DE1E4 /* libgmp.a in Frameworks */,
E51B923B2CAB2B8800C212F2 /* libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU.a in Frameworks */,
E51B923D2CAB2B8800C212F2 /* libffi.a in Frameworks */,
E51B923C2CAB2B8800C212F2 /* libgmp.a in Frameworks */,
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
640548A62CB56735005DE1E4 /* libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv-ghc9.6.3.a in Frameworks */,
E51B923F2CAB2B8800C212F2 /* libgmpxx.a in Frameworks */,
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */,
E51B923E2CAB2B8800C212F2 /* libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU-ghc9.6.3.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -739,11 +737,11 @@
5C764E5C279C70B7000C6508 /* Libraries */ = {
isa = PBXGroup;
children = (
640548A02CB56735005DE1E4 /* libffi.a */,
6405489F2CB56735005DE1E4 /* libgmp.a */,
6405489E2CB56735005DE1E4 /* libgmpxx.a */,
640548A12CB56735005DE1E4 /* libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv-ghc9.6.3.a */,
640548A22CB56735005DE1E4 /* libHSsimplex-chat-6.1.0.7-EtclnBf7vnkLnhnDA1lixv.a */,
E51B92382CAB2B8800C212F2 /* libffi.a */,
E51B92372CAB2B8800C212F2 /* libgmp.a */,
E51B923A2CAB2B8800C212F2 /* libgmpxx.a */,
E51B92392CAB2B8800C212F2 /* libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU-ghc9.6.3.a */,
E51B92362CAB2B8800C212F2 /* libHSsimplex-chat-6.1.0.5-HWShuJBYoppEOt1hLB8GPU.a */,
);
path = Libraries;
sourceTree = "<group>";
@@ -801,7 +799,6 @@
CE7548092C622630009579B7 /* SwipeLabel.swift */,
CE176F1F2C87014C00145DBC /* InvertedForegroundStyle.swift */,
CEDB245A2C9CD71800FBC5F6 /* StickyScrollView.swift */,
CEFB2EDE2CA1BCC7004B1ECE /* SheetRepresentable.swift */,
);
path = Helpers;
sourceTree = "<group>";
@@ -1452,7 +1449,6 @@
5CB634B129E5EFEA0066AD6B /* PasscodeView.swift in Sources */,
8C69FE7D2B8C7D2700267E38 /* AppSettings.swift in Sources */,
5C2E260F27A30FDC00F70299 /* ChatView.swift in Sources */,
CEFB2EDF2CA1BCC7004B1ECE /* SheetRepresentable.swift in Sources */,
5C2E260B27A30CFA00F70299 /* ChatListView.swift in Sources */,
6442E0BA287F169300CEC0F9 /* AddGroupView.swift in Sources */,
5CF937232B2503D000E1D781 /* NSESubscriber.swift in Sources */,
@@ -1899,7 +1895,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 242;
CURRENT_PROJECT_VERSION = 241;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1948,7 +1944,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 242;
CURRENT_PROJECT_VERSION = 241;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1989,7 +1985,7 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 242;
CURRENT_PROJECT_VERSION = 241;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
@@ -2009,7 +2005,7 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 242;
CURRENT_PROJECT_VERSION = 241;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
@@ -2034,7 +2030,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 242;
CURRENT_PROJECT_VERSION = 241;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GCC_OPTIMIZATION_LEVEL = s;
@@ -2071,7 +2067,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 242;
CURRENT_PROJECT_VERSION = 241;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_CODE_COVERAGE = NO;
@@ -2108,7 +2104,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 242;
CURRENT_PROJECT_VERSION = 241;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -2159,7 +2155,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 242;
CURRENT_PROJECT_VERSION = 241;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -2210,7 +2206,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 242;
CURRENT_PROJECT_VERSION = 241;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -2244,7 +2240,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 242;
CURRENT_PROJECT_VERSION = 241;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
+6 -16
View File
@@ -56,7 +56,6 @@ public enum ChatCommand {
case apiVerifyToken(token: DeviceToken, nonce: String, code: String)
case apiDeleteToken(token: DeviceToken)
case apiGetNtfMessage(nonce: String, encNtfInfo: String)
case apiGetConnNtfMessage(connId: String)
case apiNewGroup(userId: Int64, incognito: Bool, groupProfile: GroupProfile)
case apiAddMember(groupId: Int64, contactId: Int64, memberRole: GroupMemberRole)
case apiJoinGroup(groupId: Int64)
@@ -215,7 +214,6 @@ public enum ChatCommand {
case let .apiVerifyToken(token, nonce, code): return "/_ntf verify \(token.cmdString) \(nonce) \(code)"
case let .apiDeleteToken(token): return "/_ntf delete \(token.cmdString)"
case let .apiGetNtfMessage(nonce, encNtfInfo): return "/_ntf message \(nonce) \(encNtfInfo)"
case let .apiGetConnNtfMessage(connId): return "/_ntf conn message \(connId)"
case let .apiNewGroup(userId, incognito, groupProfile): return "/_group \(userId) incognito=\(onOff(incognito)) \(encodeJSON(groupProfile))"
case let .apiAddMember(groupId, contactId, memberRole): return "/_add #\(groupId) \(contactId) \(memberRole)"
case let .apiJoinGroup(groupId): return "/_join #\(groupId)"
@@ -370,7 +368,6 @@ public enum ChatCommand {
case .apiVerifyToken: return "apiVerifyToken"
case .apiDeleteToken: return "apiDeleteToken"
case .apiGetNtfMessage: return "apiGetNtfMessage"
case .apiGetConnNtfMessage: return "apiGetConnNtfMessage"
case .apiNewGroup: return "apiNewGroup"
case .apiAddMember: return "apiAddMember"
case .apiJoinGroup: return "apiJoinGroup"
@@ -682,9 +679,8 @@ public enum ChatResponse: Decodable, Error {
case callInvitations(callInvitations: [RcvCallInvitation])
case ntfTokenStatus(status: NtfTknStatus)
case ntfToken(token: DeviceToken, status: NtfTknStatus, ntfMode: NotificationsMode, ntfServer: String)
case ntfMessages(user_: User?, connEntity_: ConnectionEntity?, expectedMsg_: NtfMsgInfo?, receivedMsg_: NtfMsgInfo?)
case connNtfMessage(receivedMsg_: NtfMsgInfo?)
case ntfMessage(user: UserRef, connEntity: ConnectionEntity, ntfMessage: NtfMsgAckInfo)
case ntfMessages(user_: User?, connEntity_: ConnectionEntity?, msgTs: Date?, ntfMessage_: NtfMsgInfo?)
case ntfMessage(user: UserRef, connEntity: ConnectionEntity, ntfMessage: NtfMsgInfo)
case contactConnectionDeleted(user: UserRef, connection: PendingContactConnection)
case contactDisabled(user: UserRef, contact: Contact)
// remote desktop responses/events
@@ -852,7 +848,6 @@ public enum ChatResponse: Decodable, Error {
case .ntfTokenStatus: return "ntfTokenStatus"
case .ntfToken: return "ntfToken"
case .ntfMessages: return "ntfMessages"
case .connNtfMessage: return "connNtfMessage"
case .ntfMessage: return "ntfMessage"
case .contactConnectionDeleted: return "contactConnectionDeleted"
case .contactDisabled: return "contactDisabled"
@@ -1029,8 +1024,7 @@ public enum ChatResponse: Decodable, Error {
case let .callInvitations(invs): return String(describing: invs)
case let .ntfTokenStatus(status): return String(describing: status)
case let .ntfToken(token, status, ntfMode, ntfServer): return "token: \(token)\nstatus: \(status.rawValue)\nntfMode: \(ntfMode.rawValue)\nntfServer: \(ntfServer)"
case let .ntfMessages(u, connEntity, expectedMsg_, receivedMsg_): return withUser(u, "connEntity: \(String(describing: connEntity))\nexpectedMsg_: \(String(describing: expectedMsg_))\nreceivedMsg_: \(String(describing: receivedMsg_))")
case let .connNtfMessage(receivedMsg_): return "receivedMsg_: \(String(describing: receivedMsg_))"
case let .ntfMessages(u, connEntity, msgTs, ntfMessages): return withUser(u, "connEntity: \(String(describing: connEntity))\nmsgTs: \(String(describing: msgTs))\nntfMessages: \(String(describing: ntfMessages))")
case let .ntfMessage(u, connEntity, ntfMessage): return withUser(u, "connEntity: \(String(describing: connEntity))\nntfMessage: \(String(describing: ntfMessage))")
case let .contactConnectionDeleted(u, connection): return withUser(u, String(describing: connection))
case let .contactDisabled(u, contact): return withUser(u, String(describing: contact))
@@ -1359,7 +1353,7 @@ public struct NetCfg: Codable, Equatable {
public var sessionMode = TransportSessionMode.user
public var smpProxyMode: SMPProxyMode = .unknown
public var smpProxyFallback: SMPProxyFallback = .allowProtected
public var smpWebPort = false
var smpWebPort = false
public var tcpConnectTimeout: Int // microseconds
public var tcpTimeout: Int // microseconds
public var tcpTimeoutPerKb: Int // microseconds
@@ -1491,22 +1485,18 @@ public enum OnionHosts: String, Identifiable {
public enum TransportSessionMode: String, Codable, Identifiable {
case user
case session
case server
case entity
public var text: LocalizedStringKey {
switch self {
case .user: return "Chat profile"
case .session: return "App session"
case .server: return "Server"
case .user: return "User profile"
case .entity: return "Connection"
}
}
public var id: TransportSessionMode { self }
public static let values: [TransportSessionMode] = [.user, .session, .server, .entity]
public static let values: [TransportSessionMode] = [.user, .entity]
}
public struct KeepAliveOpts: Codable, Equatable {
+2 -3
View File
@@ -67,7 +67,7 @@ public func registerGroupDefaults() {
GROUP_DEFAULT_NTF_ENABLE_LOCAL: false,
GROUP_DEFAULT_NTF_ENABLE_PERIODIC: false,
GROUP_DEFAULT_NETWORK_USE_ONION_HOSTS: OnionHosts.no.rawValue,
GROUP_DEFAULT_NETWORK_SESSION_MODE: TransportSessionMode.session.rawValue,
GROUP_DEFAULT_NETWORK_SESSION_MODE: TransportSessionMode.user.rawValue,
GROUP_DEFAULT_NETWORK_SMP_PROXY_MODE: SMPProxyMode.unknown.rawValue,
GROUP_DEFAULT_NETWORK_SMP_PROXY_FALLBACK: SMPProxyFallback.allowProtected.rawValue,
GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT: NetCfg.defaults.tcpConnectTimeout,
@@ -232,7 +232,7 @@ public let networkUseOnionHostsGroupDefault = EnumDefault<OnionHosts>(
public let networkSessionModeGroupDefault = EnumDefault<TransportSessionMode>(
defaults: groupDefaults,
forKey: GROUP_DEFAULT_NETWORK_SESSION_MODE,
withDefault: .session
withDefault: .user
)
public let networkSMPProxyModeGroupDefault = EnumDefault<SMPProxyMode>(
@@ -357,7 +357,6 @@ public func getNetCfg() -> NetCfg {
sessionMode: sessionMode,
smpProxyMode: smpProxyMode,
smpProxyFallback: smpProxyFallback,
smpWebPort: false,
tcpConnectTimeout: tcpConnectTimeout,
tcpTimeout: tcpTimeout,
tcpTimeoutPerKb: tcpTimeoutPerKb,
-8
View File
@@ -80,14 +80,6 @@ public enum CallMediaType: String, Codable, Equatable {
case audio = "audio"
}
public enum CallMediaSource: String, Codable, Equatable {
case mic = "mic"
case camera = "camera"
case screenAudio = "screenAudio"
case screenVideo = "screenVideo"
case unknown = "unknown"
}
public enum VideoCamera: String, Codable, Equatable {
case user = "user"
case environment = "environment"
+11 -26
View File
@@ -2240,42 +2240,32 @@ public struct MemberSubError: Decodable, Hashable {
}
public enum ConnectionEntity: Decodable, Hashable {
case rcvDirectMsgConnection(entityConnection: Connection, contact: Contact?)
case rcvGroupMsgConnection(entityConnection: Connection, groupInfo: GroupInfo, groupMember: GroupMember)
case sndFileConnection(entityConnection: Connection, sndFileTransfer: SndFileTransfer)
case rcvFileConnection(entityConnection: Connection, rcvFileTransfer: RcvFileTransfer)
case userContactConnection(entityConnection: Connection, userContact: UserContact)
case rcvDirectMsgConnection(contact: Contact?)
case rcvGroupMsgConnection(groupInfo: GroupInfo, groupMember: GroupMember)
case sndFileConnection(sndFileTransfer: SndFileTransfer)
case rcvFileConnection(rcvFileTransfer: RcvFileTransfer)
case userContactConnection(userContact: UserContact)
public var id: String? {
switch self {
case let .rcvDirectMsgConnection(_, contact):
case let .rcvDirectMsgConnection(contact):
return contact?.id
case let .rcvGroupMsgConnection(_, _, groupMember):
case let .rcvGroupMsgConnection(_, groupMember):
return groupMember.id
case let .userContactConnection(_, userContact):
case let .userContactConnection(userContact):
return userContact.id
default:
return nil
}
}
public var conn: Connection {
switch self {
case let .rcvDirectMsgConnection(entityConnection, _): entityConnection
case let .rcvGroupMsgConnection(entityConnection, _, _): entityConnection
case let .sndFileConnection(entityConnection, _): entityConnection
case let .rcvFileConnection(entityConnection, _): entityConnection
case let .userContactConnection(entityConnection, _): entityConnection
}
}
public var ntfsEnabled: Bool {
switch self {
case let .rcvDirectMsgConnection(_, contact): return contact?.chatSettings.enableNtfs == .all
case let .rcvGroupMsgConnection(_, groupInfo, _): return groupInfo.chatSettings.enableNtfs == .all
case let .rcvDirectMsgConnection(contact): return contact?.chatSettings.enableNtfs == .all
case let .rcvGroupMsgConnection(groupInfo, _): return groupInfo.chatSettings.enableNtfs == .all
case .sndFileConnection: return false
case .rcvFileConnection: return false
case let .userContactConnection(_, userContact): return userContact.groupId == nil
case let .userContactConnection(userContact): return userContact.groupId == nil
}
}
}
@@ -2285,11 +2275,6 @@ public struct NtfMsgInfo: Decodable, Hashable {
public var msgTs: Date
}
public struct NtfMsgAckInfo: Decodable, Hashable {
public var msgId: String
public var msgTs_: Date?
}
public struct ChatItemDeletion: Decodable, Hashable {
public var deletedChatItem: AChatItem
public var toChatItem: AChatItem? = nil
+2 -2
View File
@@ -94,7 +94,7 @@ public func createConnectionEventNtf(_ user: User, _ connEntity: ConnectionEntit
var body: String? = nil
var targetContentIdentifier: String? = nil
switch connEntity {
case let .rcvDirectMsgConnection(_, contact):
case let .rcvDirectMsgConnection(contact):
if let contact = contact {
title = hideContent ? contactHidden : "\(contact.chatViewName):"
targetContentIdentifier = contact.id
@@ -102,7 +102,7 @@ public func createConnectionEventNtf(_ user: User, _ connEntity: ConnectionEntit
title = NSLocalizedString("New contact:", comment: "notification")
}
body = NSLocalizedString("message received", comment: "notification")
case let .rcvGroupMsgConnection(_, groupInfo, groupMember):
case let .rcvGroupMsgConnection(groupInfo, groupMember):
title = groupMsgNtfTitle(groupInfo, groupMember, hideContent: hideContent)
body = NSLocalizedString("message received", comment: "notification")
targetContentIdentifier = groupInfo.id
+3 -3
View File
@@ -791,9 +791,6 @@
/* No comment provided by engineer. */
"Chat preferences" = "Чат настройки";
/* No comment provided by engineer. */
"Chat profile" = "Потребителски профил";
/* No comment provided by engineer. */
"Chats" = "Чатове";
@@ -3992,6 +3989,9 @@
/* No comment provided by engineer. */
"Use the app while in the call." = "Използвайте приложението по време на разговора.";
/* No comment provided by engineer. */
"User profile" = "Потребителски профил";
/* No comment provided by engineer. */
"Using SimpleX Chat servers." = "Използват се сървърите на SimpleX Chat.";
+3 -3
View File
@@ -644,9 +644,6 @@
/* No comment provided by engineer. */
"Chat preferences" = "Předvolby chatu";
/* No comment provided by engineer. */
"Chat profile" = "Profil uživatele";
/* No comment provided by engineer. */
"Chats" = "Chaty";
@@ -3232,6 +3229,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "Používat servery SimpleX Chat?";
/* No comment provided by engineer. */
"User profile" = "Profil uživatele";
/* No comment provided by engineer. */
"Using SimpleX Chat servers." = "Používat servery SimpleX Chat.";
+6 -30
View File
@@ -595,9 +595,6 @@
/* No comment provided by engineer. */
"App passcode is replaced with self-destruct passcode." = "App-Zugangscode wurde durch den Selbstzerstörungs-Zugangscode ersetzt.";
/* No comment provided by engineer. */
"App session" = "App-Sitzung";
/* No comment provided by engineer. */
"App version" = "App Version";
@@ -917,9 +914,6 @@
/* alert message */
"Chat preferences were changed." = "Die Chat-Präferenzen wurden geändert.";
/* No comment provided by engineer. */
"Chat profile" = "Benutzerprofil";
/* No comment provided by engineer. */
"Chat theme" = "Chat-Design";
@@ -1209,7 +1203,7 @@
"Core version: v%@" = "Core Version: v%@";
/* No comment provided by engineer. */
"Corner" = "Abrundung Ecken";
"Corner" = "Ecken-Abrundung";
/* No comment provided by engineer. */
"Correct name to %@?" = "Richtiger Name für %@?";
@@ -2099,7 +2093,7 @@
"Expand" = "Erweitern";
/* No comment provided by engineer. */
"expired" = "Abgelaufen";
"expired" = "abgelaufen";
/* No comment provided by engineer. */
"Export database" = "Datenbank exportieren";
@@ -3073,12 +3067,6 @@
/* No comment provided by engineer. */
"New passphrase…" = "Neues Passwort…";
/* No comment provided by engineer. */
"New SOCKS credentials will be used every time you start the app." = "Jedes Mal wenn Sie die App starten, werden neue SOCKS-Anmeldeinformationen genutzt";
/* No comment provided by engineer. */
"New SOCKS credentials will be used for each server." = "Für jeden Server werden neue SOCKS-Anmeldeinformationen genutzt";
/* pref value */
"no" = "Nein";
@@ -3121,12 +3109,6 @@
/* No comment provided by engineer. */
"No network connection" = "Keine Netzwerkverbindung";
/* No comment provided by engineer. */
"No permission to record speech" = "Keine Genehmigung für Sprach-Aufnahmen";
/* No comment provided by engineer. */
"No permission to record video" = "Keine Genehmigung für Video-Aufnahmen";
/* No comment provided by engineer. */
"No permission to record voice message" = "Keine Berechtigung für das Aufnehmen von Sprachnachrichten";
@@ -3286,7 +3268,7 @@
"Or show this code" = "Oder diesen QR-Code anzeigen";
/* No comment provided by engineer. */
"other" = "Andere";
"other" = "andere";
/* No comment provided by engineer. */
"Other" = "Andere";
@@ -4079,9 +4061,6 @@
/* No comment provided by engineer. */
"Sent via proxy" = "Über einen Proxy gesendet";
/* No comment provided by engineer. */
"Server" = "Server";
/* No comment provided by engineer. */
"Server address" = "Server-Adresse";
@@ -4610,12 +4589,6 @@
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Zum Schutz Ihrer IP-Adresse, wird für die Nachrichten-Auslieferung privates Routing über Ihre konfigurierten SMP-Server genutzt.";
/* No comment provided by engineer. */
"To record speech please grant permission to use Microphone." = "Bitte erteilen Sie für Sprach-Aufnahmen die Genehmigung das Mikrofon zu nutzen.";
/* No comment provided by engineer. */
"To record video please grant permission to use Camera." = "Bitte erteilen Sie für Video-Aufnahmen die Genehmigung die Kamera zu nutzen.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Bitte erlauben Sie die Nutzung des Mikrofons, um Sprachnachrichten aufnehmen zu können.";
@@ -4841,6 +4814,9 @@
/* No comment provided by engineer. */
"Use the app with one hand." = "Die App mit einer Hand bedienen.";
/* No comment provided by engineer. */
"User profile" = "Benutzerprofil";
/* No comment provided by engineer. */
"User selection" = "Benutzer-Auswahl";
+12 -36
View File
@@ -595,9 +595,6 @@
/* No comment provided by engineer. */
"App passcode is replaced with self-destruct passcode." = "El código de acceso será reemplazado por código de autodestrucción.";
/* No comment provided by engineer. */
"App session" = "Sesión de aplicación";
/* No comment provided by engineer. */
"App version" = "Versión de la aplicación";
@@ -917,9 +914,6 @@
/* alert message */
"Chat preferences were changed." = "Las preferencias del chat han sido modificadas.";
/* No comment provided by engineer. */
"Chat profile" = "Perfil de usuario";
/* No comment provided by engineer. */
"Chat theme" = "Tema de chat";
@@ -1017,7 +1011,7 @@
"Confirm password" = "Confirmar contraseña";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "Para migrar la base de datos confirma que recuerdas la frase de contraseña.";
"Confirm that you remember database passphrase to migrate it." = "Para migrar confirma que recuerdas la frase de contraseña de la base de datos.";
/* No comment provided by engineer. */
"Confirm upload" = "Confirmar subida";
@@ -2765,7 +2759,7 @@
"Local name" = "Nombre local";
/* No comment provided by engineer. */
"Local profile data only" = "Eliminar sólo el perfil";
"Local profile data only" = "Sólo datos del perfil local";
/* No comment provided by engineer. */
"Lock after" = "Bloquear en";
@@ -3073,12 +3067,6 @@
/* No comment provided by engineer. */
"New passphrase…" = "Contraseña nueva…";
/* No comment provided by engineer. */
"New SOCKS credentials will be used every time you start the app." = "Se usarán credenciales SOCKS nuevas cada vez que inicies la aplicación.";
/* No comment provided by engineer. */
"New SOCKS credentials will be used for each server." = "Se usarán credenciales SOCKS nuevas por cada servidor.";
/* pref value */
"no" = "no";
@@ -3121,12 +3109,6 @@
/* No comment provided by engineer. */
"No network connection" = "Sin conexión de red";
/* No comment provided by engineer. */
"No permission to record speech" = "Sin permiso para grabación de voz";
/* No comment provided by engineer. */
"No permission to record video" = "Sin permiso para grabación de vídeo";
/* No comment provided by engineer. */
"No permission to record voice message" = "Sin permiso para grabar mensajes de voz";
@@ -3424,7 +3406,7 @@
"Port" = "Puerto";
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Posiblemente la huella del certificado en la dirección del servidor es incorrecta";
"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. */
"Preserve the last message draft, with attachments." = "Conserva el último borrador del mensaje con los datos adjuntos.";
@@ -3466,7 +3448,7 @@
"Private routing error" = "Error de enrutamiento privado";
/* No comment provided by engineer. */
"Profile and server connections" = "Eliminar perfil y conexiones";
"Profile and server connections" = "Datos del perfil y conexiones";
/* No comment provided by engineer. */
"Profile image" = "Imagen del perfil";
@@ -3707,7 +3689,7 @@
"removed contact address" = "dirección de contacto eliminada";
/* profile update event chat item */
"removed profile picture" = "ha eliminado la imagen del perfil";
"removed profile picture" = "imagen de perfil eliminada";
/* rcv group event chat item */
"removed you" = "te ha expulsado";
@@ -4079,9 +4061,6 @@
/* No comment provided by engineer. */
"Sent via proxy" = "Mediante proxy";
/* No comment provided by engineer. */
"Server" = "Servidor";
/* No comment provided by engineer. */
"Server address" = "Dirección del servidor";
@@ -4101,7 +4080,7 @@
"Server requires authorization to upload, check password" = "El servidor requiere autorización para subir, comprueba la contraseña";
/* No comment provided by engineer. */
"Server test failed!" = "¡Prueba no superada!";
"Server test failed!" = "¡Error en prueba del servidor!";
/* No comment provided by engineer. */
"Server type" = "Tipo de servidor";
@@ -4143,7 +4122,7 @@
"set new contact address" = "nueva dirección de contacto";
/* profile update event chat item */
"set new profile picture" = "tiene nueva imagen del perfil";
"set new profile picture" = "nueva imagen de perfil";
/* No comment provided by engineer. */
"Set passcode" = "Código autodestrucción";
@@ -4443,7 +4422,7 @@
"Temporary file error" = "Error en archivo temporal";
/* server test failure */
"Test failed at step %@." = "Prueba no superada en el paso %@.";
"Test failed at step %@." = "La prueba ha fallado en el paso %@.";
/* No comment provided by engineer. */
"Test server" = "Probar servidor";
@@ -4452,7 +4431,7 @@
"Test servers" = "Probar servidores";
/* No comment provided by engineer. */
"Tests failed!" = "¡Pruebas no superadas!";
"Tests failed!" = "¡Pruebas fallidas!";
/* No comment provided by engineer. */
"Thank you for installing SimpleX Chat!" = "¡Gracias por instalar SimpleX Chat!";
@@ -4610,12 +4589,6 @@
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Para proteger tu dirección IP, el enrutamiento privado usa tu lista de servidores SMP para enviar mensajes.";
/* No comment provided by engineer. */
"To record speech please grant permission to use Microphone." = "Para grabación de voz, por favor concede el permiso para usar el micrófono.";
/* No comment provided by engineer. */
"To record video please grant permission to use Camera." = "Para grabación de vídeo, por favor concede el permiso para usar la cámara.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Para grabar el mensaje de voz concede permiso para usar el micrófono.";
@@ -4841,6 +4814,9 @@
/* No comment provided by engineer. */
"Use the app with one hand." = "Usa la aplicación con una sola mano.";
/* No comment provided by engineer. */
"User profile" = "Perfil de usuario";
/* No comment provided by engineer. */
"User selection" = "Selección de usuarios";
+3 -3
View File
@@ -629,9 +629,6 @@
/* No comment provided by engineer. */
"Chat preferences" = "Chat-asetukset";
/* No comment provided by engineer. */
"Chat profile" = "Käyttäjäprofiili";
/* No comment provided by engineer. */
"Chats" = "Keskustelut";
@@ -3190,6 +3187,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "Käytä SimpleX Chat palvelimia?";
/* No comment provided by engineer. */
"User profile" = "Käyttäjäprofiili";
/* No comment provided by engineer. */
"Using SimpleX Chat servers." = "Käyttää SimpleX Chat -palvelimia.";
+3 -3
View File
@@ -890,9 +890,6 @@
/* No comment provided by engineer. */
"Chat preferences" = "Préférences de chat";
/* No comment provided by engineer. */
"Chat profile" = "Profil d'utilisateur";
/* No comment provided by engineer. */
"Chat theme" = "Thème de chat";
@@ -4700,6 +4697,9 @@
/* No comment provided by engineer. */
"Use the app with one hand." = "Utiliser l'application d'une main.";
/* No comment provided by engineer. */
"User profile" = "Profil d'utilisateur";
/* No comment provided by engineer. */
"User selection" = "Sélection de l'utilisateur";
+99 -123
View File
@@ -65,13 +65,13 @@
"[Star on GitHub](https://github.com/simplex-chat/simplex-chat)" = "[Csillagozás a GitHubon](https://github.com/simplex-chat/simplex-chat)";
/* No comment provided by engineer. */
"**Add contact**: to create a new invitation link, or connect via a link you received." = "**Ismerős hozzáadása:** új meghívó-hivatkozás létrehozásához, vagy egy kapott hivatkozáson keresztül történő kapcsolódáshoz.";
"**Add contact**: to create a new invitation link, or connect via a link you received." = "**Ismerős hozzáadása**: új meghívó-hivatkozás létrehozásához, vagy egy kapott hivatkozáson keresztül történő kapcsolódáshoz.";
/* No comment provided by engineer. */
"**Add new contact**: to create your one-time QR Code for your contact." = "**Új ismerős hozzáadása:** egyszer használható QR-kód vagy hivatkozás létrehozása az ismerőse számára.";
"**Add new contact**: to create your one-time QR Code for your contact." = "**Új ismerős hozzáadása**: egyszer használható QR-kód vagy hivatkozás létrehozása az ismerőse számára.";
/* No comment provided by engineer. */
"**Create group**: to create a new group." = "**Csoport létrehozása:** új csoport létrehozásához.";
"**Create group**: to create a new group." = "**Csoport létrehozása**: új csoport létrehozásához.";
/* No comment provided by engineer. */
"**e2e encrypted** audio call" = "**e2e titkosított** hanghívás";
@@ -80,10 +80,10 @@
"**e2e encrypted** video call" = "**e2e titkosított** videóhívás";
/* No comment provided by engineer. */
"**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." = "**Privátabb:** 20 percenként ellenőrzi az új üzeneteket. Az eszköztoken megosztásra kerül a SimpleX Chat-kiszolgálóval, de az nem, hogy hány ismerőse vagy üzenete van.";
"**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." = "**Privátabb**: 20 percenként ellenőrzi az új üzeneteket. Az eszköztoken megosztásra kerül a SimpleX Chat-kiszolgálóval, de az nem, hogy hány ismerőse vagy üzenete van.";
/* No comment provided by engineer. */
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Legprivátabb:** ne használja a SimpleX Chat értesítési kiszolgálót, rendszeresen ellenőrizze az üzeneteket a háttérben (attól függően, hogy milyen gyakran használja az alkalmazást).";
"**Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app)." = "**Legprivátabb**: ne használja a SimpleX Chat értesítési kiszolgálót, rendszeresen ellenőrizze az üzeneteket a háttérben (attól függően, hogy milyen gyakran használja az alkalmazást).";
/* No comment provided by engineer. */
"**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." = "**Megjegyzés:** ha két eszközön is ugyanazt az adatbázist használja, akkor biztonsági védelemként megszakítja az ismerőseitől érkező üzenetek visszafejtését.";
@@ -92,7 +92,7 @@
"**Please note**: you will NOT be able to recover or change passphrase if you lose it." = "**Megjegyzés:** NEM tudja visszaállítani vagy megváltoztatni jelmondatát, ha elveszíti azt.";
/* No comment provided by engineer. */
"**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." = "**Megjegyzés:** az eszköztoken és az értesítések elküldésre kerülnek a SimpleX Chat értesítési kiszolgálóra, kivéve az üzenet tartalma, mérete vagy az, hogy kitől származik.";
"**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." = "**Javasolt**: az eszköztoken és az értesítések elküldésre kerülnek a SimpleX Chat értesítési kiszolgálóra, kivéve az üzenet tartalma, mérete vagy az, hogy kitől származik.";
/* No comment provided by engineer. */
"**Warning**: Instant push notifications require passphrase saved in Keychain." = "**Figyelmeztetés:** Az azonnali push-értesítésekhez a kulcstartóban tárolt jelmondat megadása szükséges.";
@@ -149,10 +149,10 @@
"%@ is connected!" = "%@ kapcsolódott!";
/* No comment provided by engineer. */
"%@ is not verified" = "%@ nem hitelesített";
"%@ is not verified" = "%@ nem ellenőrzött";
/* No comment provided by engineer. */
"%@ is verified" = "%@ hitelesítve";
"%@ is verified" = "%@ ellenőrizve";
/* No comment provided by engineer. */
"%@ uploaded" = "%@ feltöltve";
@@ -368,7 +368,7 @@
/* accept contact request via notification
swipe action */
"Accept incognito" = "Fogadás inkognitóban";
"Accept incognito" = "Fogadás inkognítóban";
/* call status */
"accepted call" = "elfogadott hívás";
@@ -467,7 +467,7 @@
"All messages will be deleted - this cannot be undone!" = "Minden üzenet törlésre kerül ez a művelet nem vonható vissza!";
/* No comment provided by engineer. */
"All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you." = "Minden üzenet törlésre kerül - ez a művelet nem vonható vissza! Az üzenetek CSAK az Ön számára törlődnek.";
"All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you." = "Minden üzenet törlésre kerül - ez a művelet nem vonható vissza! Az üzenetek CSAK az ön számára törlődnek.";
/* No comment provided by engineer. */
"All new messages from %@ will be hidden!" = "Minden új üzenet elrejtésre kerül tőle: %@!";
@@ -494,7 +494,7 @@
"Allow calls?" = "Hívások engedélyezése?";
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Az eltűnő üzenetek küldése csak abban az esetben van engedélyezve, ha az ismerőse is engedélyezi az Ön számára.";
"Allow disappearing messages only if your contact allows it to you." = "Az eltűnő üzenetek küldése csak abban az esetben van engedélyezve, ha az ismerőse is engedélyezi az ön számára.";
/* No comment provided by engineer. */
"Allow downgrade" = "Visszafejlesztés engedélyezése";
@@ -595,9 +595,6 @@
/* No comment provided by engineer. */
"App passcode is replaced with self-destruct passcode." = "Az alkalmazás jelkód helyettesítésre kerül egy önmegsemmisítő jelkóddal.";
/* No comment provided by engineer. */
"App session" = "Alkalmazás munkamenete";
/* No comment provided by engineer. */
"App version" = "Alkalmazás verzió";
@@ -867,7 +864,7 @@
"changed role of %@ to %@" = "%1$@ szerepkörét megváltoztatta erre: %2$@";
/* rcv group event chat item */
"changed your role to %@" = "megváltoztatta az Ön szerepkörét erre: %@";
"changed your role to %@" = "megváltoztatta a szerepkörét erre: %@";
/* chat item text */
"changing address for %@…" = "cím megváltoztatása nála: %@…";
@@ -917,9 +914,6 @@
/* alert message */
"Chat preferences were changed." = "A csevegési beállítások megváltoztak.";
/* No comment provided by engineer. */
"Chat profile" = "Felhasználói profil";
/* No comment provided by engineer. */
"Chat theme" = "Csevegés témája";
@@ -1044,10 +1038,10 @@
"Connect to yourself?" = "Kapcsolódás saját magához?";
/* No comment provided by engineer. */
"Connect to yourself?\nThis is your own one-time link!" = "Kapcsolódás saját magához?\nEz az Ön egyszer használható hivatkozása!";
"Connect to yourself?\nThis is your own one-time link!" = "Kapcsolódás saját magához?\nEz az ön egyszer használható hivatkozása!";
/* No comment provided by engineer. */
"Connect to yourself?\nThis is your own SimpleX address!" = "Kapcsolódás saját magához?\nEz az Ön SimpleX-címe!";
"Connect to yourself?\nThis is your own SimpleX address!" = "Kapcsolódás saját magához?\nEz az ön SimpleX-címe!";
/* No comment provided by engineer. */
"Connect via contact address" = "Kapcsolódás a kapcsolattartási címen keresztül";
@@ -1071,7 +1065,7 @@
"Connected desktop" = "Társított számítógép";
/* rcv group event chat item */
"connected directly" = "közvetlenül kapcsolódott";
"connected directly" = "közvetlenül kapcsolódva";
/* No comment provided by engineer. */
"Connected servers" = "Kapcsolódott kiszolgálók";
@@ -1179,7 +1173,7 @@
"Contact is deleted." = "Törölt ismerős.";
/* No comment provided by engineer. */
"Contact name" = "Csak név";
"Contact name" = "Ismerős neve";
/* No comment provided by engineer. */
"Contact preferences" = "Ismerős beállításai";
@@ -1191,7 +1185,7 @@
"Contacts" = "Ismerősök";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "Az ismerősei törlésre jelölhetnek üzeneteket; Ön majd meg tudja nézni azokat.";
"Contacts can mark messages for deletion; you will be able to view them." = "Az ismerősei törlésre jelölhetnek üzeneteket; ön majd meg tudja nézni azokat.";
/* No comment provided by engineer. */
"Continue" = "Folytatás";
@@ -1221,7 +1215,7 @@
"Create a group using a random profile." = "Csoport létrehozása véletlenszerűen létrehozott profillal.";
/* No comment provided by engineer. */
"Create an address to let people connect with you." = "Cím létrehozása, hogy az emberek kapcsolatba léphessenek Önnel.";
"Create an address to let people connect with you." = "Cím létrehozása, hogy az emberek kapcsolatba léphessenek önnel.";
/* server test step */
"Create file" = "Fájl létrehozása";
@@ -1492,7 +1486,7 @@
"Delete queue" = "Sorbaállítás törlése";
/* No comment provided by engineer. */
"Delete up to 20 messages at once." = "Legfeljebb 20 üzenet egyszerre való törlése.";
"Delete up to 20 messages at once." = "Legfeljebb 20 üzenet törlése egyszerre.";
/* No comment provided by engineer. */
"Delete user profile?" = "Felhasználói profil törlése?";
@@ -1642,7 +1636,7 @@
"Do not send history to new members." = "Az előzmények ne kerüljenek elküldésre az új tagok számára.";
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "Ne küldjön üzeneteket közvetlenül, még akkor sem, ha az Ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.";
"Do NOT send messages directly, even if your or destination server does not support private routing." = "Ne küldjön üzeneteket közvetlenül, még akkor sem, ha az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.";
/* No comment provided by engineer. */
"Do not use credentials with proxy." = "Ne használja a hitelesítőadatokat proxyval.";
@@ -1769,7 +1763,7 @@
"enabled for contact" = "engedélyezve az ismerős számára";
/* enabled status */
"enabled for you" = "engedélyezve az Ön számára";
"enabled for you" = "engedélyezve az ön számára";
/* No comment provided by engineer. */
"Encrypt" = "Titkosít";
@@ -1907,7 +1901,7 @@
"Error changing setting" = "Hiba a beállítás megváltoztatásakor";
/* No comment provided by engineer. */
"Error changing to incognito!" = "Hiba az inkognitóprofilra való váltáskor!";
"Error changing to incognito!" = "Hiba az inkognitó-profilra való váltáskor!";
/* No comment provided by engineer. */
"Error connecting to forwarding server %@. Please try later." = "Hiba a(z) %@ továbbító kiszolgálóhoz való kapcsolódáskor. Próbálja meg később.";
@@ -2048,7 +2042,7 @@
"Error switching profile" = "Hiba a profilváltáskor";
/* alertTitle */
"Error switching profile!" = "Hiba a profilváltásakor!";
"Error switching profile!" = "Hiba a profil váltásakor!";
/* No comment provided by engineer. */
"Error synchronizing connection" = "Hiba a kapcsolat szinkronizálásakor";
@@ -2069,7 +2063,7 @@
"Error uploading the archive" = "Hiba az archívum feltöltésekor";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "Hiba a jelmondat hitelesítésekor:";
"Error verifying passphrase:" = "Hiba a jelmondat ellenőrzésekor:";
/* No comment provided by engineer. */
"Error: " = "Hiba: ";
@@ -2129,7 +2123,7 @@
"Faster joining and more reliable messages." = "Gyorsabb csatlakozás és megbízhatóbb üzenetkézbesítés.";
/* swipe action */
"Favorite" = "Kedvenc";
"Favorite" = "Csillag";
/* No comment provided by engineer. */
"File error" = "Fájlhiba";
@@ -2180,7 +2174,7 @@
"Files and media prohibited!" = "A fájlok- és a médiatartalmak küldése le van tiltva!";
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Olvasatlan és kedvenc csevegésekre való szűrés.";
"Filter unread and favorite chats." = "Olvasatlan és csillagozott csevegésekre való szűrés.";
/* No comment provided by engineer. */
"Finalize migration" = "Átköltöztetés véglegesítése";
@@ -2306,7 +2300,7 @@
"Group full name (optional)" = "Csoport teljes neve (nem kötelező)";
/* No comment provided by engineer. */
"Group image" = "Csoport profilképe";
"Group image" = "Csoportkép";
/* No comment provided by engineer. */
"Group invitation" = "Csoportmeghívó";
@@ -2369,22 +2363,22 @@
"Group will be deleted for all members - this cannot be undone!" = "A csoport törlésre kerül minden tag számára - ez a művelet nem vonható vissza!";
/* No comment provided by engineer. */
"Group will be deleted for you - this cannot be undone!" = "A csoport törlésre kerül az Ön számára - ez a művelet nem vonható vissza!";
"Group will be deleted for you - this cannot be undone!" = "A csoport törlésre kerül az ön számára - ez a művelet nem vonható vissza!";
/* No comment provided by engineer. */
"Help" = "Segítség";
/* No comment provided by engineer. */
"Hidden" = "Se név, se üzenet";
"Hidden" = "Rejtett";
/* No comment provided by engineer. */
"Hidden chat profiles" = "Rejtett csevegési profilok";
/* No comment provided by engineer. */
"Hidden profile password" = "Rejtett profiljelszó";
"Hidden profile password" = "Rejtett profil jelszó";
/* chat item action */
"Hide" = "Elrejtés";
"Hide" = "Elrejt";
/* No comment provided by engineer. */
"Hide app screen in the recent apps." = "Alkalmazás képernyőjének elrejtése a gyakran használt alkalmazások között.";
@@ -2393,7 +2387,7 @@
"Hide profile" = "Profil elrejtése";
/* No comment provided by engineer. */
"Hide:" = "Elrejtés:";
"Hide:" = "Elrejt:";
/* No comment provided by engineer. */
"History" = "Előzmények";
@@ -2495,7 +2489,7 @@
"Incognito" = "Inkognitó";
/* No comment provided by engineer. */
"Incognito groups" = "Inkognitócsoportok";
"Incognito groups" = "Inkognitó csoportok";
/* No comment provided by engineer. */
"Incognito mode" = "Inkognitómód";
@@ -2504,7 +2498,7 @@
"Incognito mode protects your privacy by using a new random profile for each contact." = "Az inkognitómód védi személyes adatait azáltal, hogy minden ismerőshöz új véletlenszerű profilt használ.";
/* chat list item description */
"incognito via contact address link" = "inkognitó a kapcsolattartási címhivatkozáson keresztül";
"incognito via contact address link" = "inkognitó a kapcsolattartási hivatkozáson keresztül";
/* chat list item description */
"incognito via group link" = "inkognitó a csoporthivatkozáson keresztül";
@@ -2621,7 +2615,7 @@
"invited to connect" = "meghívta, hogy csatlakozzon";
/* rcv group event chat item */
"invited via your group link" = "meghíva az Ön csoporthivatkozásán keresztül";
"invited via your group link" = "meghíva az ön csoporthivatkozásán keresztül";
/* No comment provided by engineer. */
"iOS Keychain is used to securely store passphrase - it allows receiving push notifications." = "Az iOS kulcstartó a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását.";
@@ -2645,7 +2639,7 @@
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Lehetővé teszi, hogy egyetlen csevegőprofilon belül több anonim kapcsolat legyen, anélkül, hogy megosztott adatok lennének közöttük.";
/* No comment provided by engineer. */
"It can happen when you or your connection used the old database backup." = "Ez akkor fordulhat elő, ha Ön vagy az ismerőse régi adatbázis biztonsági mentést használt.";
"It can happen when you or your connection used the old database backup." = "Ez akkor fordulhat elő, ha ön vagy az ismerőse régi adatbázis biztonsági mentést használt.";
/* No comment provided by engineer. */
"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Az üzenet visszafejtése sikertelen volt, mert vagy az ismerőse régebbi adatbázis biztonsági mentést használt.\n3. A kapcsolat sérült.";
@@ -2687,7 +2681,7 @@
"Join with current profile" = "Csatlakozás a jelenlegi profillal";
/* No comment provided by engineer. */
"Join your group?\nThis is your link for group %@!" = "Csatlakozik a csoportjához?\nEz az Ön hivatkozása a(z) %@ csoporthoz!";
"Join your group?\nThis is your link for group %@!" = "Csatlakozik a csoportjához?\nEz az ön hivatkozása a(z) %@ csoporthoz!";
/* No comment provided by engineer. */
"Joining group" = "Csatlakozás a csoporthoz";
@@ -2708,10 +2702,10 @@
"Keep your connections" = "Kapcsolatok megtartása";
/* No comment provided by engineer. */
"Keychain error" = "Kulcstartóhiba";
"Keychain error" = "Kulcstartó hiba";
/* No comment provided by engineer. */
"KeyChain error" = "Kulcstartóhiba";
"KeyChain error" = "Kulcstartó hiba";
/* No comment provided by engineer. */
"Large file!" = "Nagy fájl!";
@@ -2897,7 +2891,7 @@
"Message status: %@" = "Üzenetállapot: %@";
/* No comment provided by engineer. */
"Message text" = "Név és üzenet";
"Message text" = "Üzenet szövege";
/* No comment provided by engineer. */
"Message too large" = "Az üzenet túl nagy";
@@ -3062,7 +3056,7 @@
"New member role" = "Új tag szerepköre";
/* notification */
"new message" = "Rejtett üzenet";
"new message" = "új üzenet";
/* notification */
"New message" = "Új üzenet";
@@ -3073,12 +3067,6 @@
/* No comment provided by engineer. */
"New passphrase…" = "Új jelmondat…";
/* No comment provided by engineer. */
"New SOCKS credentials will be used every time you start the app." = "Minden alkalommal, amikor elindítja az alkalmazást, új SOCKS-hitelesítő-adatokat fog használni.";
/* No comment provided by engineer. */
"New SOCKS credentials will be used for each server." = "Minden egyes kiszolgálóhoz új SOCKS-hitelesítő-adatok legyenek használva.";
/* pref value */
"no" = "nem";
@@ -3121,12 +3109,6 @@
/* No comment provided by engineer. */
"No network connection" = "Nincs hálózati kapcsolat";
/* No comment provided by engineer. */
"No permission to record speech" = "Nincs jogosultság megadva a beszéd rögzítéséhez";
/* No comment provided by engineer. */
"No permission to record video" = "Nincs jogosultság megadva a videó rögzítéséhez";
/* No comment provided by engineer. */
"No permission to record voice message" = "Nincs engedély a hangüzenet rögzítésére";
@@ -3190,7 +3172,7 @@
"One-time invitation link" = "Egyszer használható meghívó-hivatkozás";
/* No comment provided by engineer. */
"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Onion-kiszolgálók **szükségesek** a kapcsolódáshoz.\nKompatibilis VPN szükséges.";
"Onion hosts will be **required** for connection.\nRequires compatible VPN." = "Az onion-kiszolgálók **szükségesek** a kapcsolódáshoz.\nKompatibilis VPN szükséges.";
/* No comment provided by engineer. */
"Onion hosts will be used when available.\nRequires compatible VPN." = "Onion-kiszolgálók használata, ha azok rendelkezésre állnak.\nVPN engedélyezése szükséges.";
@@ -3214,25 +3196,25 @@
"Only group owners can enable voice messages." = "Csak a csoporttulajdonosok engedélyezhetik a hangüzenetek küldését.";
/* No comment provided by engineer. */
"Only you can add message reactions." = "Csak Ön adhat hozzá üzenetreakciókat.";
"Only you can add message reactions." = "Csak ön adhat hozzá üzenetreakciókat.";
/* No comment provided by engineer. */
"Only you can irreversibly delete messages (your contact can mark them for deletion). (24 hours)" = "Véglegesen csak Ön törölhet üzeneteket (ismerőse csak törlésre jelölheti meg őket ). (24 óra)";
"Only you can irreversibly delete messages (your contact can mark them for deletion). (24 hours)" = "Véglegesen csak ön törölhet üzeneteket (ismerőse csak törlésre jelölheti meg őket ). (24 óra)";
/* No comment provided by engineer. */
"Only you can make calls." = "Csak Ön tud hívásokat indítani.";
"Only you can make calls." = "Csak ön tud hívásokat indítani.";
/* No comment provided by engineer. */
"Only you can send disappearing messages." = "Csak Ön tud eltűnő üzeneteket küldeni.";
"Only you can send disappearing messages." = "Csak ön tud eltűnő üzeneteket küldeni.";
/* No comment provided by engineer. */
"Only you can send voice messages." = "Csak Ön tud hangüzeneteket küldeni.";
"Only you can send voice messages." = "Csak ön tud hangüzeneteket küldeni.";
/* No comment provided by engineer. */
"Only your contact can add message reactions." = "Csak az ismerőse tud üzenetreakciókat küldeni.";
/* No comment provided by engineer. */
"Only your contact can irreversibly delete messages (you can mark them for deletion). (24 hours)" = "Csak az ismerőse tudja az üzeneteket véglegesen törölni (Ön csak törlésre jelölheti meg azokat). (24 óra)";
"Only your contact can irreversibly delete messages (you can mark them for deletion). (24 hours)" = "Csak az ismerőse tudja az üzeneteket véglegesen törölni (ön csak törlésre jelölheti meg azokat). (24 óra)";
/* No comment provided by engineer. */
"Only your contact can make calls." = "Csak az ismerőse tud hívást indítani.";
@@ -3328,7 +3310,7 @@
"Password to show" = "Jelszó megjelenítése";
/* past/unknown group member */
"Past member %@" = "(Már nem tag) %@";
"Past member %@" = "%@ (már nem tag)";
/* No comment provided by engineer. */
"Paste desktop address" = "Számítógép címének beillesztése";
@@ -3349,7 +3331,7 @@
"Pending" = "Függőben";
/* No comment provided by engineer. */
"People can connect to you only via the links you share." = "Az emberek csak az Ön által megosztott hivatkozáson keresztül kapcsolódhatnak.";
"People can connect to you only via the links you share." = "Az emberek csak az ön által megosztott hivatkozáson keresztül kapcsolódhatnak.";
/* No comment provided by engineer. */
"Periodically" = "Rendszeresen";
@@ -3451,10 +3433,10 @@
"Private filenames" = "Privát fájlnevek";
/* No comment provided by engineer. */
"Private message routing" = "Privát üzenet-útválasztás";
"Private message routing" = "Privát üzenet útválasztás";
/* No comment provided by engineer. */
"Private message routing 🚀" = "Privát üzenet-útválasztás 🚀";
"Private message routing 🚀" = "Privát üzenet útválasztás 🚀";
/* name of notes to self */
"Private notes" = "Privát jegyzetek";
@@ -3463,7 +3445,7 @@
"Private routing" = "Privát útválasztás";
/* No comment provided by engineer. */
"Private routing error" = "Privát útválasztáshiba";
"Private routing error" = "Privát útválasztási hiba";
/* No comment provided by engineer. */
"Profile and server connections" = "Profil és kiszolgálókapcsolatok";
@@ -3601,13 +3583,13 @@
"Received file event" = "Fogadott fájlesemény";
/* message info title */
"Received message" = "Fogadott üzenetbuborék színe";
"Received message" = "Fogadott üzenet";
/* No comment provided by engineer. */
"Received messages" = "Fogadott üzenetek";
/* No comment provided by engineer. */
"Received reply" = "Fogadott válaszüzenet-buborék színe";
"Received reply" = "Fogadott válasz";
/* No comment provided by engineer. */
"Received total" = "Összes fogadott";
@@ -3710,7 +3692,7 @@
"removed profile picture" = "eltávolította a profilképét";
/* rcv group event chat item */
"removed you" = "eltávolította Önt";
"removed you" = "eltávolította önt";
/* No comment provided by engineer. */
"Renegotiate" = "Újraegyzetetés";
@@ -3996,10 +3978,10 @@
"Send message to enable calls." = "Üzenet küldése a hívások engedélyezéséhez.";
/* No comment provided by engineer. */
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Közvetlen üzenetküldés, ha az IP-cím védett és az Ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.";
"Send messages directly when IP address is protected and your or destination server does not support private routing." = "Közvetlen üzenetküldés, ha az IP-cím védett és az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.";
/* No comment provided by engineer. */
"Send messages directly when your or destination server does not support private routing." = "Közvetlen üzenetküldés, ha az Ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.";
"Send messages directly when your or destination server does not support private routing." = "Közvetlen üzenetküldés, ha az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.";
/* No comment provided by engineer. */
"Send notifications" = "Értesítések küldése";
@@ -4062,7 +4044,7 @@
"Sent file event" = "Elküldött fájlesemény";
/* message info title */
"Sent message" = "Üzenetbuborék színe";
"Sent message" = "Elküldött üzenet";
/* No comment provided by engineer. */
"Sent messages" = "Elküldött üzenetek";
@@ -4071,7 +4053,7 @@
"Sent messages will be deleted after set time." = "Az elküldött üzenetek törlésre kerülnek a beállított idő után.";
/* No comment provided by engineer. */
"Sent reply" = "Válaszüzenet-buborék színe";
"Sent reply" = "Elküldött válasz";
/* No comment provided by engineer. */
"Sent total" = "Összes elküldött";
@@ -4079,9 +4061,6 @@
/* No comment provided by engineer. */
"Sent via proxy" = "Proxyn keresztül küldve";
/* No comment provided by engineer. */
"Server" = "Kiszolgáló";
/* No comment provided by engineer. */
"Server address" = "Kiszolgáló címe";
@@ -4209,7 +4188,7 @@
"Show developer options" = "Fejlesztői beállítások megjelenítése";
/* No comment provided by engineer. */
"Show last messages" = "Szobák utolsó üzeneteinek megjelenítése a listanézetben";
"Show last messages" = "Utolsó üzenetek megjelenítése";
/* No comment provided by engineer. */
"Show message status" = "Üzenet állapot megjelenítése";
@@ -4218,7 +4197,7 @@
"Show percentage" = "Százalék megjelenítése";
/* No comment provided by engineer. */
"Show preview" = "Értesítés előnézete";
"Show preview" = "Előnézet megjelenítése";
/* No comment provided by engineer. */
"Show QR code" = "QR-kód megjelenítése";
@@ -4272,7 +4251,7 @@
"SimpleX one-time invitation" = "Egyszer használható SimpleX-meghívó";
/* No comment provided by engineer. */
"Simplified incognito mode" = "Egyszerűsített inkognitómód";
"Simplified incognito mode" = "Egyszerűsített inkogní mód";
/* No comment provided by engineer. */
"Size" = "Méret";
@@ -4419,7 +4398,7 @@
"Tap to join incognito" = "Koppintson az inkognitóban való csatlakozáshoz";
/* No comment provided by engineer. */
"Tap to paste link" = "Koppintson ide a hivatkozás beillesztéséhez";
"Tap to paste link" = "Koppintson a hivatkozás beillesztéséhez";
/* No comment provided by engineer. */
"Tap to scan" = "Koppintson a beolvasáshoz";
@@ -4479,7 +4458,7 @@
"The code you scanned is not a SimpleX link QR code." = "A beolvasott QR-kód nem egy SimpleX QR-kód hivatkozás.";
/* No comment provided by engineer. */
"The connection you accepted will be cancelled!" = "Az Ön által elfogadott kérelem vissza lesz vonva!";
"The connection you accepted will be cancelled!" = "Az ön által elfogadott kérelem vissza lesz vonva!";
/* No comment provided by engineer. */
"The contact you shared this link with will NOT be able to connect!" = "Ismerőse, akivel megosztotta ezt a hivatkozást, NEM fog tudni kapcsolódni!";
@@ -4572,10 +4551,10 @@
"This group no longer exists." = "Ez a csoport már nem létezik.";
/* No comment provided by engineer. */
"This is your own one-time link!" = "Ez az Ön egyszer használható hivatkozása!";
"This is your own one-time link!" = "Ez az ön egyszer használható hivatkozása!";
/* No comment provided by engineer. */
"This is your own SimpleX address!" = "Ez az Ön SimpleX-címe!";
"This is your own SimpleX address!" = "Ez az ön SimpleX-címe!";
/* No comment provided by engineer. */
"This link was used with another mobile device, please create a new link on the desktop." = "Ezt a hivatkozást egy másik hordozható eszközön már használták, hozzon létre egy új hivatkozást a számítógépén.";
@@ -4610,12 +4589,6 @@
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Az IP-cím védelmének érdekében a privát útválasztás az SMP-kiszolgálókat használja az üzenetek kézbesítéséhez.";
/* No comment provided by engineer. */
"To record speech please grant permission to use Microphone." = "A beszéd rögzítéséhez adjon engedélyt a Mikrofon használatára.";
/* No comment provided by engineer. */
"To record video please grant permission to use Camera." = "A videó rögzítéséhez adjon engedélyt a Kamera használatára.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Hangüzenet rögzítéséhez adjon engedélyt a mikrofon használathoz.";
@@ -4626,13 +4599,13 @@
"To support instant push notifications the chat database has to be migrated." = "Az azonnali push-értesítések támogatásához a csevegési adatbázis átköltöztetése szükséges.";
/* No comment provided by engineer. */
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "A végpontok közötti titkosítás hitelesítéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) az ismerőse eszközén lévő kóddal.";
"To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "A végpontok közötti titkosítás ellenőrzéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) az ismerőse eszközén lévő kóddal.";
/* No comment provided by engineer. */
"Toggle chat list:" = "Csevegőlista átváltása:";
/* No comment provided by engineer. */
"Toggle incognito when connecting." = "Inkognitómód használata kapcsolódáskor.";
"Toggle incognito when connecting." = "Inkognitómód kapcsolódáskor.";
/* No comment provided by engineer. */
"Toolbar opacity" = "Eszköztár átlátszatlansága";
@@ -4686,7 +4659,7 @@
"Unexpected migration state" = "Váratlan átköltöztetési állapot";
/* swipe action */
"Unfav." = "Kedvenc megszüntetése";
"Unfav." = "Csillagozás megszüntetése";
/* No comment provided by engineer. */
"Unhide" = "Felfedés";
@@ -4815,13 +4788,13 @@
"Use iOS call interface" = "Az iOS hívófelület használata";
/* No comment provided by engineer. */
"Use new incognito profile" = "Új inkognitóprofil használata";
"Use new incognito profile" = "Az új inkogní profil használata";
/* No comment provided by engineer. */
"Use only local notifications?" = "Csak helyi értesítések használata?";
/* No comment provided by engineer. */
"Use private routing with unknown servers when IP address is not protected." = "Használjon privát útválasztást ismeretlen kiszolgálókkal, ha az IP-cím nem védett.";
"Use private routing with unknown servers when IP address is not protected." = "Privát útválasztás használata ismeretlen kiszolgálókkal, ha az IP-cím nem védett.";
/* No comment provided by engineer. */
"Use private routing with unknown servers." = "Használjon privát útválasztást ismeretlen kiszolgálókkal.";
@@ -4841,6 +4814,9 @@
/* No comment provided by engineer. */
"Use the app with one hand." = "Használja az alkalmazást egy kézzel.";
/* No comment provided by engineer. */
"User profile" = "Felhasználói profil";
/* No comment provided by engineer. */
"User selection" = "Felhasználó kiválasztása";
@@ -4857,25 +4833,25 @@
"v%@ (%@)" = "v%@ (%@)";
/* No comment provided by engineer. */
"Verify code with desktop" = "Kód hitelesítése a számítógépen";
"Verify code with desktop" = "Kód ellenőrzése a számítógépen";
/* No comment provided by engineer. */
"Verify connection" = "Kapcsolat hitelesítése";
"Verify connection" = "Kapcsolat ellenőrzése";
/* No comment provided by engineer. */
"Verify connection security" = "Biztonságos kapcsolat hitelesítése";
"Verify connection security" = "Kapcsolat biztonságának ellenőrzése";
/* No comment provided by engineer. */
"Verify connections" = "Kapcsolatok hitelesítése";
"Verify connections" = "Kapcsolatok ellenőrzése";
/* No comment provided by engineer. */
"Verify database passphrase" = "Az adatbázis jelmondatának hitelesítése";
"Verify database passphrase" = "Az adatbázis jelmondatának ellenőrzése";
/* No comment provided by engineer. */
"Verify passphrase" = "Jelmondat hitelesítése";
"Verify passphrase" = "Jelmondat ellenőrzése";
/* No comment provided by engineer. */
"Verify security code" = "Biztonsági kód hitelesítése";
"Verify security code" = "Biztonsági kód ellenőrzése";
/* No comment provided by engineer. */
"Via browser" = "Böngészőn keresztül";
@@ -4962,7 +4938,7 @@
"Wallpaper background" = "Háttérkép háttérszíne";
/* No comment provided by engineer. */
"wants to connect to you!" = "kapcsolatba akar lépni Önnel!";
"wants to connect to you!" = "kapcsolatba akar lépni önnel!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Figyelmeztetés: a csevegés elindítása egyszerre több eszközön nem támogatott, továbbá üzenetkézbesítési hibákat okozhat";
@@ -4998,10 +4974,10 @@
"when IP hidden" = "ha az IP-cím rejtett";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "Amikor az emberek kapcsolatot kérnek, Ön elfogadhatja vagy elutasíthatja azokat.";
"When people request to connect, you can accept or reject it." = "Amikor az emberek kapcsolatot kérnek, ön elfogadhatja vagy elutasíthatja azokat.";
/* No comment provided by engineer. */
"When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." = "Inkognitóprofil megosztása esetén a rendszer azt a profilt fogja használni azokhoz a csoportokhoz, amelyekbe meghívást kapott.";
"When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." = "Inkognitó-profil megosztása esetén a rendszer azt a profilt fogja használni azokhoz a csoportokhoz, amelyekbe meghívást kapott.";
/* No comment provided by engineer. */
"WiFi" = "Wi-Fi";
@@ -5046,7 +5022,7 @@
"yes" = "igen";
/* No comment provided by engineer. */
"you" = "Ön";
"you" = "ön";
/* No comment provided by engineer. */
"You **must not** use the same database on two devices." = "**Nem szabad** ugyanazt az adatbázist használni egyszerre két eszközön.";
@@ -5100,7 +5076,7 @@
"you are observer" = "megfigyelő szerep";
/* snd group event chat item */
"you blocked %@" = "Ön letiltotta őt: %@";
"you blocked %@" = "ön letiltotta őt: %@";
/* No comment provided by engineer. */
"You can accept calls from lock screen, without device and app authentication." = "Hívásokat fogadhat a lezárási képernyőről, eszköz- és alkalmazás-hitelesítés nélkül.";
@@ -5112,7 +5088,7 @@
"You can create it later" = "Létrehozás később";
/* No comment provided by engineer. */
"You can enable later via Settings" = "Később engedélyezheti a Beállításokban";
"You can enable later via Settings" = "Később engedélyezheti a Beállításokban";
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Később engedélyezheti őket az alkalmazás „Adatvédelem és biztonság” menüben.";
@@ -5139,10 +5115,10 @@
"You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it." = "Megoszthat egy hivatkozást vagy QR-kódot - így bárki csatlakozhat a csoporthoz. Ha a csoport később törlésre kerül, akkor nem fogja elveszíteni annak tagjait.";
/* No comment provided by engineer. */
"You can share this address with your contacts to let them connect with **%@**." = "Megoszthatja ezt a címet az ismerőseivel, hogy kapcsolatba léphessenek Önnel a(z) **%@** nevű profilján keresztül.";
"You can share this address with your contacts to let them connect with **%@**." = "Megoszthatja ezt a címet az ismerőseivel, hogy kapcsolatba léphessenek önnel a(z) **%@** nevű profilján keresztül.";
/* No comment provided by engineer. */
"You can share your address as a link or QR code - anybody can connect to you." = "Megoszthatja a címét egy hivatkozásként vagy QR-kódként így bárki kapcsolódhat Önhöz.";
"You can share your address as a link or QR code - anybody can connect to you." = "Megoszthatja a címét egy hivatkozásként vagy QR-kódként így bárki kapcsolódhat önhöz.";
/* No comment provided by engineer. */
"You can start chat via app Settings / Database or by restarting the app" = "A csevegést az alkalmazás „Beállítások / Adatbázis” menüben vagy az alkalmazás újraindításával indíthatja el";
@@ -5169,16 +5145,16 @@
"you changed address for %@" = "cím megváltoztatva nála: %@";
/* snd group event chat item */
"you changed role for yourself to %@" = "saját szerepköre megváltozott erre: %@";
"you changed role for yourself to %@" = "saját szerepkör megváltoztatva erre: %@";
/* snd group event chat item */
"you changed role of %@ to %@" = "Ön megváltoztatta %1$@ szerepkörét erre: %@";
"you changed role of %@ to %@" = "%1$@ szerepkörét megváltoztatta erre: %@";
/* No comment provided by engineer. */
"You control through which server(s) **to receive** the messages, your contacts the servers you use to message them." = "Ön szabályozhatja, hogy mely kiszogál(ók)ón keresztül **kapja** az üzeneteket, az ismerősöket - az üzenetküldéshez használt kiszolgálókon.";
/* No comment provided by engineer. */
"You could not be verified; please try again." = "Nem sikerült hitelesíteni; próbálja meg újra.";
"You could not be verified; please try again." = "Nem sikerült ellenőrizni; próbálja meg újra.";
/* No comment provided by engineer. */
"You have already requested connection via this address!" = "Már küldött egy kapcsolatkérést ezen a címen keresztül!";
@@ -5199,7 +5175,7 @@
"You joined this group. Connecting to inviting group member." = "Csatlakozott ehhez a csoporthoz. Kapcsolódás a meghívó csoporttaghoz.";
/* snd group event chat item */
"you left" = "Ön elhagyta a csoportot";
"you left" = "elhagyta a csoportot";
/* No comment provided by engineer. */
"You may migrate the exported database." = "Az exportált adatbázist átköltöztetheti.";
@@ -5220,7 +5196,7 @@
"You rejected group invitation" = "Csoportmeghívó elutasítva";
/* snd group event chat item */
"you removed %@" = "Ön eltávolította őt: %@";
"you removed %@" = "eltávolította őt: %@";
/* No comment provided by engineer. */
"You sent group invitation" = "Csoportmeghívó elküldve";
@@ -5232,7 +5208,7 @@
"you shared one-time link incognito" = "egyszer használható hivatkozást osztott meg inkognitóban";
/* snd group event chat item */
"you unblocked %@" = "Ön feloldotta %@ letiltását";
"you unblocked %@" = "ön feloldotta %@ letiltását";
/* No comment provided by engineer. */
"You will be connected to group when the group host's device is online, please wait or check later!" = "Akkor lesz kapcsolódva a csoporthoz, amikor a csoport tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!";
@@ -5262,13 +5238,13 @@
"You won't lose your contacts if you later delete your address." = "Nem veszíti el az ismerőseit, ha később törli a címét.";
/* No comment provided by engineer. */
"you: " = "Ön: ";
"you: " = "ön: ";
/* No comment provided by engineer. */
"You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile" = "Egy olyan ismerősét próbálja meghívni, akivel inkognitóprofilt osztott meg abban a csoportban, amelyben a saját fő profilja van használatban";
"You're trying to invite contact with whom you've shared an incognito profile to the group in which you're using your main profile" = "Egy olyan ismerőst próbál meghívni, akivel inkogní profilt osztott meg abban a csoportban, amelyben saját fő profilja van használatban";
/* No comment provided by engineer. */
"You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed" = "Inkognitóprofilt használ ehhez a csoporthoz - fő profilja megosztásának elkerülése érdekében a meghívók küldése le van tiltva";
"You're using an incognito profile for this group - to prevent sharing your main profile inviting contacts is not allowed" = "Inkogní profilt használ ehhez a csoporthoz - fő profilja megosztásának elkerülése érdekében a meghívók küldése le van tiltva";
/* No comment provided by engineer. */
"Your %@ servers" = "%@ nevű profiljához tartozó kiszolgálók";
+3 -27
View File
@@ -595,9 +595,6 @@
/* No comment provided by engineer. */
"App passcode is replaced with self-destruct passcode." = "Il codice di accesso dell'app viene sostituito da un codice di autodistruzione.";
/* No comment provided by engineer. */
"App session" = "Sessione dell'app";
/* No comment provided by engineer. */
"App version" = "Versione dell'app";
@@ -917,9 +914,6 @@
/* alert message */
"Chat preferences were changed." = "Le preferenze della chat sono state cambiate.";
/* No comment provided by engineer. */
"Chat profile" = "Profilo utente";
/* No comment provided by engineer. */
"Chat theme" = "Tema della chat";
@@ -3073,12 +3067,6 @@
/* No comment provided by engineer. */
"New passphrase…" = "Nuova password…";
/* No comment provided by engineer. */
"New SOCKS credentials will be used every time you start the app." = "Le nuove credenziali SOCKS verranno usate ogni volta che avvii l'app.";
/* No comment provided by engineer. */
"New SOCKS credentials will be used for each server." = "Le nuove credenziali SOCKS verranno usate per ogni server.";
/* pref value */
"no" = "no";
@@ -3121,12 +3109,6 @@
/* No comment provided by engineer. */
"No network connection" = "Nessuna connessione di rete";
/* No comment provided by engineer. */
"No permission to record speech" = "Nessuna autorizzazione per registrare l'audio";
/* No comment provided by engineer. */
"No permission to record video" = "Nessuna autorizzazione per registrare il video";
/* No comment provided by engineer. */
"No permission to record voice message" = "Nessuna autorizzazione per registrare messaggi vocali";
@@ -4079,9 +4061,6 @@
/* No comment provided by engineer. */
"Sent via proxy" = "Inviato via proxy";
/* No comment provided by engineer. */
"Server" = "Server";
/* No comment provided by engineer. */
"Server address" = "Indirizzo server";
@@ -4610,12 +4589,6 @@
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Per proteggere il tuo indirizzo IP, l'instradamento privato usa i tuoi server SMP per consegnare i messaggi.";
/* No comment provided by engineer. */
"To record speech please grant permission to use Microphone." = "Per registrare l'audio, concedi l'autorizzazione di usare il microfono.";
/* No comment provided by engineer. */
"To record video please grant permission to use Camera." = "Per registrare il video, concedi l'autorizzazione di usare la fotocamera.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Per registrare un messaggio vocale, concedi l'autorizzazione all'uso del microfono.";
@@ -4841,6 +4814,9 @@
/* No comment provided by engineer. */
"Use the app with one hand." = "Usa l'app con una mano sola.";
/* No comment provided by engineer. */
"User profile" = "Profilo utente";
/* No comment provided by engineer. */
"User selection" = "Selezione utente";
+3 -3
View File
@@ -701,9 +701,6 @@
/* No comment provided by engineer. */
"Chat preferences" = "チャット設定";
/* No comment provided by engineer. */
"Chat profile" = "ユーザープロフィール";
/* No comment provided by engineer. */
"Chats" = "チャット";
@@ -3244,6 +3241,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "SimpleX チャット サーバーを使用しますか?";
/* No comment provided by engineer. */
"User profile" = "ユーザープロフィール";
/* No comment provided by engineer. */
"Using SimpleX Chat servers." = "SimpleX チャット サーバーを使用する。";
+5 -32
View File
@@ -595,9 +595,6 @@
/* No comment provided by engineer. */
"App passcode is replaced with self-destruct passcode." = "De app-toegangscode wordt vervangen door een zelfvernietigings wachtwoord.";
/* No comment provided by engineer. */
"App session" = "Appsessie";
/* No comment provided by engineer. */
"App version" = "App versie";
@@ -917,9 +914,6 @@
/* alert message */
"Chat preferences were changed." = "Chatvoorkeuren zijn gewijzigd.";
/* No comment provided by engineer. */
"Chat profile" = "Gebruikers profiel";
/* No comment provided by engineer. */
"Chat theme" = "Chat thema";
@@ -3073,12 +3067,6 @@
/* No comment provided by engineer. */
"New passphrase…" = "Nieuw wachtwoord…";
/* No comment provided by engineer. */
"New SOCKS credentials will be used every time you start the app." = "Elke keer dat u de app start, worden er nieuwe SOCKS-inloggegevens gebruikt.";
/* No comment provided by engineer. */
"New SOCKS credentials will be used for each server." = "Voor elke server worden nieuwe SOCKS-inloggegevens gebruikt.";
/* pref value */
"no" = "Nee";
@@ -3121,12 +3109,6 @@
/* No comment provided by engineer. */
"No network connection" = "Geen netwerkverbinding";
/* No comment provided by engineer. */
"No permission to record speech" = "Geen toestemming om spraak op te nemen";
/* No comment provided by engineer. */
"No permission to record video" = "Geen toestemming om video op te nemen";
/* No comment provided by engineer. */
"No permission to record voice message" = "Geen toestemming om spraakbericht op te nemen";
@@ -4079,9 +4061,6 @@
/* No comment provided by engineer. */
"Sent via proxy" = "Verzonden via proxy";
/* No comment provided by engineer. */
"Server" = "Server";
/* No comment provided by engineer. */
"Server address" = "Server adres";
@@ -4397,9 +4376,6 @@
/* No comment provided by engineer. */
"System authentication" = "Systeem authenticatie";
/* No comment provided by engineer. */
"Tail" = "Staart";
/* No comment provided by engineer. */
"Take picture" = "Foto nemen";
@@ -4610,12 +4586,6 @@
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Om uw IP-adres te beschermen, gebruikt privéroutering uw SMP-servers om berichten te bezorgen.";
/* No comment provided by engineer. */
"To record speech please grant permission to use Microphone." = "Geef toestemming om de microfoon te gebruiken om spraak op te nemen.";
/* No comment provided by engineer. */
"To record video please grant permission to use Camera." = "Om video op te nemen, dient u toestemming te geven om de camera te gebruiken.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Geef toestemming om de microfoon te gebruiken om een spraakbericht op te nemen.";
@@ -4841,6 +4811,9 @@
/* No comment provided by engineer. */
"Use the app with one hand." = "Gebruik de app met één hand.";
/* No comment provided by engineer. */
"User profile" = "Gebruikers profiel";
/* No comment provided by engineer. */
"User selection" = "Gebruikersselectie";
@@ -5097,7 +5070,7 @@
"You are not connected to these servers. Private routing is used to deliver messages to them." = "U bent niet verbonden met deze servers. Privéroutering wordt gebruikt om berichten bij hen af te leveren.";
/* No comment provided by engineer. */
"you are observer" = "je bent waarnemer";
"you are observer" = "jij bent waarnemer";
/* snd group event chat item */
"you blocked %@" = "je hebt %@ geblokkeerd";
@@ -5199,7 +5172,7 @@
"You joined this group. Connecting to inviting group member." = "Je bent lid geworden van deze groep. Verbinding maken met uitnodigend groepslid.";
/* snd group event chat item */
"you left" = "je bent vertrokken";
"you left" = "jij bent vertrokken";
/* No comment provided by engineer. */
"You may migrate the exported database." = "U kunt de geëxporteerde database migreren.";
+2 -158
View File
@@ -160,9 +160,6 @@
/* notification title */
"%@ wants to connect!" = "%@ chce się połączyć!";
/* format for date separator in chat */
"%@, %@" = "%1$@, %2$@";
/* No comment provided by engineer. */
"%@, %@ and %lld members" = "%@, %@ i %lld członków";
@@ -175,24 +172,9 @@
/* time interval */
"%d days" = "%d dni";
/* forward confirmation reason */
"%d file(s) are still being downloaded." = "%d plik(ów) jest dalej pobieranych.";
/* forward confirmation reason */
"%d file(s) failed to download." = "%d plik(ów) nie udało się pobrać.";
/* forward confirmation reason */
"%d file(s) were deleted." = "%d plik(ów) zostało usuniętych.";
/* forward confirmation reason */
"%d file(s) were not downloaded." = "%d plik(ów) nie zostało pobranych.";
/* time interval */
"%d hours" = "%d godzin";
/* alert title */
"%d messages not forwarded" = "%d wiadomości nie przekazanych";
/* time interval */
"%d min" = "%d min";
@@ -595,9 +577,6 @@
/* No comment provided by engineer. */
"App passcode is replaced with self-destruct passcode." = "Pin aplikacji został zastąpiony pinem samozniszczenia.";
/* No comment provided by engineer. */
"App session" = "Sesja aplikacji";
/* No comment provided by engineer. */
"App version" = "Wersja aplikacji";
@@ -670,9 +649,6 @@
/* No comment provided by engineer. */
"Auto-accept images" = "Automatyczne akceptowanie obrazów";
/* alert title */
"Auto-accept settings" = "Ustawienia automatycznej akceptacji";
/* No comment provided by engineer. */
"Back" = "Wstecz";
@@ -914,12 +890,6 @@
/* No comment provided by engineer. */
"Chat preferences" = "Preferencje czatu";
/* alert message */
"Chat preferences were changed." = "Preferencje czatu zostały zmienione.";
/* No comment provided by engineer. */
"Chat profile" = "Profil użytkownika";
/* No comment provided by engineer. */
"Chat theme" = "Motyw czatu";
@@ -1208,9 +1178,6 @@
/* No comment provided by engineer. */
"Core version: v%@" = "Wersja rdzenia: v%@";
/* No comment provided by engineer. */
"Corner" = "Róg";
/* No comment provided by engineer. */
"Correct name to %@?" = "Poprawić imię na %@?";
@@ -1644,9 +1611,6 @@
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "NIE wysyłaj wiadomości bezpośrednio, nawet jeśli serwer docelowy nie obsługuje prywatnego trasowania.";
/* No comment provided by engineer. */
"Do not use credentials with proxy." = "Nie używaj danych logowania do proxy.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "NIE używaj prywatnego trasowania.";
@@ -1678,9 +1642,6 @@
/* server test step */
"Download file" = "Pobierz plik";
/* alert action */
"Download files" = "Pobierz pliki";
/* No comment provided by engineer. */
"Downloaded" = "Pobrane";
@@ -1897,18 +1858,12 @@
/* No comment provided by engineer. */
"Error changing address" = "Błąd zmiany adresu";
/* No comment provided by engineer. */
"Error changing connection profile" = "Błąd zmiany połączenia profilu";
/* No comment provided by engineer. */
"Error changing role" = "Błąd zmiany roli";
/* No comment provided by engineer. */
"Error changing setting" = "Błąd zmiany ustawienia";
/* No comment provided by engineer. */
"Error changing to incognito!" = "Błąd zmiany na incognito!";
/* No comment provided by engineer. */
"Error connecting to forwarding server %@. Please try later." = "Błąd połączenia z serwerem przekierowania %@. Spróbuj ponownie później.";
@@ -1981,9 +1936,6 @@
/* No comment provided by engineer. */
"Error loading %@ servers" = "Błąd ładowania %@ serwerów";
/* No comment provided by engineer. */
"Error migrating settings" = "Błąd migracji ustawień";
/* No comment provided by engineer. */
"Error opening chat" = "Błąd otwierania czatu";
@@ -2044,9 +1996,6 @@
/* No comment provided by engineer. */
"Error stopping chat" = "Błąd zatrzymania czatu";
/* No comment provided by engineer. */
"Error switching profile" = "Błąd zmiany profilu";
/* alertTitle */
"Error switching profile!" = "Błąd przełączania profilu!";
@@ -2134,9 +2083,6 @@
/* No comment provided by engineer. */
"File error" = "Błąd pliku";
/* alert message */
"File errors:\n%@" = "Błędy pliku:\n%@";
/* file error text */
"File not found - most likely file was deleted or cancelled." = "Nie odnaleziono pliku - najprawdopodobniej plik został usunięty lub anulowany.";
@@ -2218,18 +2164,9 @@
/* chat item action */
"Forward" = "Przekaż dalej";
/* alert title */
"Forward %d message(s)?" = "Przekazać %d wiadomość(i)?";
/* No comment provided by engineer. */
"Forward and save messages" = "Przesyłaj dalej i zapisuj wiadomości";
/* alert action */
"Forward messages" = "Przekaż wiadomości";
/* alert message */
"Forward messages without files?" = "Przekazać wiadomości bez plików?";
/* No comment provided by engineer. */
"forwarded" = "przekazane dalej";
@@ -2239,9 +2176,6 @@
/* No comment provided by engineer. */
"Forwarded from" = "Przekazane dalej od";
/* No comment provided by engineer. */
"Forwarding %lld messages" = "Przekazywanie %lld wiadomości";
/* No comment provided by engineer. */
"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Serwer przekazujący %@ nie mógł połączyć się z serwerem docelowym %@. Spróbuj ponownie później.";
@@ -2629,9 +2563,6 @@
/* No comment provided by engineer. */
"iOS Keychain will be used to securely store passphrase after you restart the app or change passphrase - it will allow receiving push notifications." = "iOS Keychain będzie używany do bezpiecznego przechowywania hasła po ponownym uruchomieniu aplikacji lub zmianie hasła - pozwoli to na otrzymywanie powiadomień push.";
/* No comment provided by engineer. */
"IP address" = "Adres IP";
/* No comment provided by engineer. */
"Irreversible message deletion" = "Nieodwracalne usuwanie wiadomości";
@@ -2884,9 +2815,6 @@
/* No comment provided by engineer. */
"Message servers" = "Serwery wiadomości";
/* No comment provided by engineer. */
"Message shape" = "Kształt wiadomości";
/* No comment provided by engineer. */
"Message source remains private." = "Źródło wiadomości pozostaje prywatne.";
@@ -2917,9 +2845,6 @@
/* No comment provided by engineer. */
"Messages sent" = "Wysłane wiadomości";
/* alert message */
"Messages were deleted after you selected them." = "Wiadomości zostały usunięte po wybraniu ich.";
/* 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." = "Wiadomości, pliki i połączenia są chronione przez **szyfrowanie end-to-end** z doskonałym utajnianiem z wyprzedzeniem i odzyskiem po złamaniu.";
@@ -3073,12 +2998,6 @@
/* No comment provided by engineer. */
"New passphrase…" = "Nowe hasło…";
/* No comment provided by engineer. */
"New SOCKS credentials will be used every time you start the app." = "Nowe poświadczenia SOCKS będą używane przy każdym uruchomieniu aplikacji.";
/* No comment provided by engineer. */
"New SOCKS credentials will be used for each server." = "Dla każdego serwera zostaną użyte nowe poświadczenia SOCKS.";
/* pref value */
"no" = "nie";
@@ -3121,12 +3040,6 @@
/* No comment provided by engineer. */
"No network connection" = "Brak połączenia z siecią";
/* No comment provided by engineer. */
"No permission to record speech" = "Brak zezwoleń do nagrania rozmowy";
/* No comment provided by engineer. */
"No permission to record video" = "Brak zezwoleń do nagrania wideo";
/* No comment provided by engineer. */
"No permission to record voice message" = "Brak uprawnień do nagrywania wiadomości głosowej";
@@ -3142,9 +3055,6 @@
/* No comment provided by engineer. */
"Nothing selected" = "Nic nie jest zaznaczone";
/* alert title */
"Nothing to forward!" = "Nic do przekazania!";
/* No comment provided by engineer. */
"Notifications" = "Powiadomienia";
@@ -3297,9 +3207,6 @@
/* No comment provided by engineer. */
"other errors" = "inne błędy";
/* alert message */
"Other file errors:\n%@" = "Inne błędy pliku:\n%@";
/* member role */
"owner" = "właściciel";
@@ -3321,9 +3228,6 @@
/* No comment provided by engineer. */
"Passcode set!" = "Pin ustawiony!";
/* No comment provided by engineer. */
"Password" = "Hasło";
/* No comment provided by engineer. */
"Password to show" = "Hasło do wyświetlenia";
@@ -3420,9 +3324,6 @@
/* No comment provided by engineer. */
"Polish interface" = "Polski interfejs";
/* No comment provided by engineer. */
"Port" = "Port";
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Możliwe, że odcisk palca certyfikatu w adresie serwera jest nieprawidłowy";
@@ -3534,9 +3435,6 @@
/* No comment provided by engineer. */
"Proxied servers" = "Serwery trasowane przez proxy";
/* No comment provided by engineer. */
"Proxy requires password" = "Proxy wymaga hasła";
/* No comment provided by engineer. */
"Push notifications" = "Powiadomienia push";
@@ -3682,9 +3580,6 @@
/* No comment provided by engineer. */
"Remove" = "Usuń";
/* No comment provided by engineer. */
"Remove archive?" = "Usunąć archiwum?";
/* No comment provided by engineer. */
"Remove image" = "Usuń obraz";
@@ -3857,9 +3752,6 @@
/* No comment provided by engineer. */
"Save welcome message?" = "Zapisać wiadomość powitalną?";
/* alert title */
"Save your profile?" = "Zapisać Twój profil?";
/* No comment provided by engineer. */
"saved" = "zapisane";
@@ -3878,9 +3770,6 @@
/* No comment provided by engineer. */
"Saved WebRTC ICE servers will be removed" = "Zapisane serwery WebRTC ICE zostaną usunięte";
/* No comment provided by engineer. */
"Saving %lld messages" = "Zapisywanie %lld wiadomości";
/* No comment provided by engineer. */
"Scale" = "Skaluj";
@@ -3944,9 +3833,6 @@
/* chat item action */
"Select" = "Wybierz";
/* No comment provided by engineer. */
"Select chat profile" = "Wybierz profil czatu";
/* No comment provided by engineer. */
"Selected %lld" = "Zaznaczono %lld";
@@ -4079,9 +3965,6 @@
/* No comment provided by engineer. */
"Sent via proxy" = "Wysłano przez proxy";
/* No comment provided by engineer. */
"Server" = "Serwer";
/* No comment provided by engineer. */
"Server address" = "Adres serwera";
@@ -4163,9 +4046,6 @@
/* No comment provided by engineer. */
"Settings" = "Ustawienia";
/* alert message */
"Settings were changed." = "Ustawienia zostały zmienione.";
/* No comment provided by engineer. */
"Shape profile images" = "Kształtuj obrazy profilowe";
@@ -4187,9 +4067,6 @@
/* No comment provided by engineer. */
"Share link" = "Udostępnij link";
/* No comment provided by engineer. */
"Share profile" = "Udostępnij profil";
/* No comment provided by engineer. */
"Share this 1-time invite link" = "Udostępnij ten jednorazowy link";
@@ -4289,15 +4166,9 @@
/* No comment provided by engineer. */
"SMP server" = "Serwer SMP";
/* No comment provided by engineer. */
"SOCKS proxy" = "Proxy SOCKS";
/* blur media */
"Soft" = "Łagodny";
/* No comment provided by engineer. */
"Some app settings were not migrated." = "Niektóre ustawienia aplikacji nie zostały zmigrowane.";
/* No comment provided by engineer. */
"Some file(s) were not exported:" = "Niektóre plik(i) nie zostały wyeksportowane:";
@@ -4397,9 +4268,6 @@
/* No comment provided by engineer. */
"System authentication" = "Uwierzytelnianie systemu";
/* No comment provided by engineer. */
"Tail" = "Ogon";
/* No comment provided by engineer. */
"Take picture" = "Zrób zdjęcie";
@@ -4529,9 +4397,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "Tekst, który wkleiłeś nie jest linkiem SimpleX.";
/* No comment provided by engineer. */
"The uploaded database archive will be permanently removed from the servers." = "Przesłane archiwum bazy danych zostanie trwale usunięte z serwerów.";
/* No comment provided by engineer. */
"Themes" = "Motywy";
@@ -4610,12 +4475,6 @@
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Aby chronić Twój adres IP, prywatne trasowanie używa Twoich serwerów SMP, aby dostarczyć wiadomości.";
/* No comment provided by engineer. */
"To record speech please grant permission to use Microphone." = "Aby nagrać rozmowę, proszę zezwolić na użycie Mikrofonu.";
/* No comment provided by engineer. */
"To record video please grant permission to use Camera." = "Aby nagrać wideo, proszę zezwolić na użycie Aparatu.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Aby nagrać wiadomość głosową należy udzielić zgody na użycie Mikrofonu.";
@@ -4832,9 +4691,6 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "Użyć serwerów SimpleX Chat?";
/* No comment provided by engineer. */
"Use SOCKS proxy" = "Użyj proxy SOCKS";
/* No comment provided by engineer. */
"Use the app while in the call." = "Używaj aplikacji podczas połączenia.";
@@ -4842,10 +4698,10 @@
"Use the app with one hand." = "Korzystaj z aplikacji jedną ręką.";
/* No comment provided by engineer. */
"User selection" = "Wybór użytkownika";
"User profile" = "Profil użytkownika";
/* No comment provided by engineer. */
"Username" = "Nazwa użytkownika";
"User selection" = "Wybór użytkownika";
/* No comment provided by engineer. */
"Using SimpleX Chat servers." = "Używanie serwerów SimpleX Chat.";
@@ -5282,15 +5138,9 @@
/* No comment provided by engineer. */
"Your chat database is not encrypted - set passphrase to encrypt it." = "Baza danych czatu nie jest szyfrowana - ustaw hasło, aby ją zaszyfrować.";
/* alert title */
"Your chat preferences" = "Twoje preferencje czatu";
/* No comment provided by engineer. */
"Your chat profiles" = "Twoje profile czatu";
/* No comment provided by engineer. */
"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Twoje połączenie zostało przeniesione do %@, ale podczas przekierowywania do profilu wystąpił nieoczekiwany błąd.";
/* No comment provided by engineer. */
"Your contact sent a file that is larger than currently supported maximum size (%@)." = "Twój kontakt wysłał plik, który jest większy niż obecnie obsługiwany maksymalny rozmiar (%@).";
@@ -5300,9 +5150,6 @@
/* No comment provided by engineer. */
"Your contacts will remain connected." = "Twoje kontakty pozostaną połączone.";
/* No comment provided by engineer. */
"Your credentials may be sent unencrypted." = "Twoje poświadczenia mogą zostać wysłane niezaszyfrowane.";
/* No comment provided by engineer. */
"Your current chat database will be DELETED and REPLACED with the imported one." = "Twoja obecna baza danych czatu zostanie usunięta i zastąpiona zaimportowaną.";
@@ -5327,9 +5174,6 @@
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Twój profil jest przechowywany na urządzeniu i udostępniany tylko Twoim kontaktom. Serwery SimpleX nie mogą zobaczyć Twojego profilu.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Twój profil został zmieniony. Jeśli go zapiszesz, zaktualizowany profil zostanie wysłany do wszystkich kontaktów.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Twój profil, kontakty i dostarczone wiadomości są przechowywane na Twoim urządzeniu.";
+2 -155
View File
@@ -172,24 +172,9 @@
/* time interval */
"%d days" = "%d дней";
/* forward confirmation reason */
"%d file(s) are still being downloaded." = "%d файл(ов) загружаются.";
/* forward confirmation reason */
"%d file(s) failed to download." = "%d файл(ов) не удалось загрузить.";
/* forward confirmation reason */
"%d file(s) were deleted." = "%d файлов было удалено.";
/* forward confirmation reason */
"%d file(s) were not downloaded." = "%d файлов не было загружено.";
/* time interval */
"%d hours" = "%d ч.";
/* alert title */
"%d messages not forwarded" = "%d сообщений не переслано";
/* time interval */
"%d min" = "%d мин";
@@ -592,9 +577,6 @@
/* No comment provided by engineer. */
"App passcode is replaced with self-destruct passcode." = "Код доступа в приложение будет заменен кодом самоуничтожения.";
/* No comment provided by engineer. */
"App session" = "Сессия приложения";
/* No comment provided by engineer. */
"App version" = "Версия приложения";
@@ -667,9 +649,6 @@
/* No comment provided by engineer. */
"Auto-accept images" = "Автоприем изображений";
/* alert title */
"Auto-accept settings" = "Настройки автоприема";
/* No comment provided by engineer. */
"Back" = "Назад";
@@ -911,12 +890,6 @@
/* No comment provided by engineer. */
"Chat preferences" = "Предпочтения";
/* alert message */
"Chat preferences were changed." = "Настройки чата были изменены.";
/* No comment provided by engineer. */
"Chat profile" = "Профиль чата";
/* No comment provided by engineer. */
"Chat theme" = "Тема чата";
@@ -1205,9 +1178,6 @@
/* No comment provided by engineer. */
"Core version: v%@" = "Версия ядра: v%@";
/* No comment provided by engineer. */
"Corner" = "Угол";
/* No comment provided by engineer. */
"Correct name to %@?" = "Исправить имя на %@?";
@@ -1641,9 +1611,6 @@
/* No comment provided by engineer. */
"Do NOT send messages directly, even if your or destination server does not support private routing." = "Не отправлять сообщения напрямую, даже если сервер получателя не поддерживает конфиденциальную доставку.";
/* No comment provided by engineer. */
"Do not use credentials with proxy." = "Не использовать учетные данные с прокси.";
/* No comment provided by engineer. */
"Do NOT use private routing." = "Не использовать конфиденциальную доставку.";
@@ -1675,9 +1642,6 @@
/* server test step */
"Download file" = "Загрузка файла";
/* alert action */
"Download files" = "Загрузить файлы";
/* No comment provided by engineer. */
"Downloaded" = "Принято";
@@ -1894,18 +1858,12 @@
/* No comment provided by engineer. */
"Error changing address" = "Ошибка при изменении адреса";
/* No comment provided by engineer. */
"Error changing connection profile" = "Ошибка при изменении профиля соединения";
/* No comment provided by engineer. */
"Error changing role" = "Ошибка при изменении роли";
/* No comment provided by engineer. */
"Error changing setting" = "Ошибка при изменении настройки";
/* No comment provided by engineer. */
"Error changing to incognito!" = "Ошибка при смене на Инкогнито!";
/* No comment provided by engineer. */
"Error connecting to forwarding server %@. Please try later." = "Ошибка подключения к пересылающему серверу %@. Попробуйте позже.";
@@ -1978,9 +1936,6 @@
/* No comment provided by engineer. */
"Error loading %@ servers" = "Ошибка загрузки %@ серверов";
/* No comment provided by engineer. */
"Error migrating settings" = "Ошибка миграции настроек";
/* No comment provided by engineer. */
"Error opening chat" = "Ошибка доступа к чату";
@@ -2041,9 +1996,6 @@
/* No comment provided by engineer. */
"Error stopping chat" = "Ошибка при остановке чата";
/* No comment provided by engineer. */
"Error switching profile" = "Ошибка переключения профиля";
/* alertTitle */
"Error switching profile!" = "Ошибка выбора профиля!";
@@ -2131,9 +2083,6 @@
/* No comment provided by engineer. */
"File error" = "Ошибка файла";
/* alert message */
"File errors:\n%@" = "Ошибки файлов:\n%@";
/* file error text */
"File not found - most likely file was deleted or cancelled." = "Файл не найден - скорее всего, файл был удален или отменен.";
@@ -2215,18 +2164,9 @@
/* chat item action */
"Forward" = "Переслать";
/* alert title */
"Forward %d message(s)?" = "Переслать %d сообщение(й)?";
/* No comment provided by engineer. */
"Forward and save messages" = "Переслать и сохранить сообщение";
/* alert action */
"Forward messages" = "Переслать сообщения";
/* alert message */
"Forward messages without files?" = "Переслать сообщения без файлов?";
/* No comment provided by engineer. */
"forwarded" = "переслано";
@@ -2236,9 +2176,6 @@
/* No comment provided by engineer. */
"Forwarded from" = "Переслано из";
/* No comment provided by engineer. */
"Forwarding %lld messages" = "Пересылка %lld сообщений";
/* No comment provided by engineer. */
"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Пересылающий сервер %@ не смог подключиться к серверу назначения %@. Попробуйте позже.";
@@ -2626,9 +2563,6 @@
/* No comment provided by engineer. */
"iOS Keychain will be used to securely store passphrase after you restart the app or change passphrase - it will allow receiving push notifications." = "Пароль базы данных будет безопасно сохранен в iOS Keychain после запуска чата или изменения пароля - это позволит получать мгновенные уведомления.";
/* No comment provided by engineer. */
"IP address" = "IP адрес";
/* No comment provided by engineer. */
"Irreversible message deletion" = "Окончательное удаление сообщений";
@@ -2881,9 +2815,6 @@
/* No comment provided by engineer. */
"Message servers" = "Серверы сообщений";
/* No comment provided by engineer. */
"Message shape" = "Форма сообщений";
/* No comment provided by engineer. */
"Message source remains private." = "Источник сообщения остаётся конфиденциальным.";
@@ -2914,9 +2845,6 @@
/* No comment provided by engineer. */
"Messages sent" = "Сообщений отправлено";
/* alert message */
"Messages were deleted after you selected them." = "Сообщения были удалены после того, как вы их выбрали.";
/* 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." = "Сообщения, файлы и звонки защищены **end-to-end шифрованием** с прямой секретностью (PFS), правдоподобным отрицанием и восстановлением от взлома.";
@@ -3070,12 +2998,6 @@
/* No comment provided by engineer. */
"New passphrase…" = "Новый пароль…";
/* No comment provided by engineer. */
"New SOCKS credentials will be used every time you start the app." = "Новые учетные данные SOCKS будут использоваться при каждом запуске приложения.";
/* No comment provided by engineer. */
"New SOCKS credentials will be used for each server." = "Новые учетные данные SOCKS будут использоваться для каждого сервера.";
/* pref value */
"no" = "нет";
@@ -3118,12 +3040,6 @@
/* No comment provided by engineer. */
"No network connection" = "Нет интернет-соединения";
/* No comment provided by engineer. */
"No permission to record speech" = "Нет разрешения на запись речи";
/* No comment provided by engineer. */
"No permission to record video" = "Нет разрешения на запись видео";
/* No comment provided by engineer. */
"No permission to record voice message" = "Нет разрешения для записи голосового сообщения";
@@ -3139,9 +3055,6 @@
/* No comment provided by engineer. */
"Nothing selected" = "Ничего не выбрано";
/* alert title */
"Nothing to forward!" = "Нет сообщений, которые можно переслать!";
/* No comment provided by engineer. */
"Notifications" = "Уведомления";
@@ -3294,9 +3207,6 @@
/* No comment provided by engineer. */
"other errors" = "другие ошибки";
/* alert message */
"Other file errors:\n%@" = "Другие ошибки файлов:\n%@";
/* member role */
"owner" = "владелец";
@@ -3318,9 +3228,6 @@
/* No comment provided by engineer. */
"Passcode set!" = "Код доступа установлен!";
/* No comment provided by engineer. */
"Password" = "Пароль";
/* No comment provided by engineer. */
"Password to show" = "Пароль чтобы раскрыть";
@@ -3417,9 +3324,6 @@
/* No comment provided by engineer. */
"Polish interface" = "Польский интерфейс";
/* No comment provided by engineer. */
"Port" = "Порт";
/* server test error */
"Possibly, certificate fingerprint in server address is incorrect" = "Возможно, хэш сертификата в адресе сервера неверный";
@@ -3531,9 +3435,6 @@
/* No comment provided by engineer. */
"Proxied servers" = "Проксированные серверы";
/* No comment provided by engineer. */
"Proxy requires password" = "Прокси требует пароль";
/* No comment provided by engineer. */
"Push notifications" = "Доставка уведомлений";
@@ -3679,9 +3580,6 @@
/* No comment provided by engineer. */
"Remove" = "Удалить";
/* No comment provided by engineer. */
"Remove archive?" = "Удалить архив?";
/* No comment provided by engineer. */
"Remove image" = "Удалить изображение";
@@ -3854,9 +3752,6 @@
/* No comment provided by engineer. */
"Save welcome message?" = "Сохранить приветственное сообщение?";
/* alert title */
"Save your profile?" = "Сохранить ваш профиль?";
/* No comment provided by engineer. */
"saved" = "сохранено";
@@ -3875,9 +3770,6 @@
/* No comment provided by engineer. */
"Saved WebRTC ICE servers will be removed" = "Сохраненные WebRTC ICE серверы будут удалены";
/* No comment provided by engineer. */
"Saving %lld messages" = "Сохранение %lld сообщений";
/* No comment provided by engineer. */
"Scale" = "Масштаб";
@@ -3941,9 +3833,6 @@
/* chat item action */
"Select" = "Выбрать";
/* No comment provided by engineer. */
"Select chat profile" = "Выберите профиль чата";
/* No comment provided by engineer. */
"Selected %lld" = "Выбрано %lld";
@@ -4076,9 +3965,6 @@
/* No comment provided by engineer. */
"Sent via proxy" = "Отправлено через прокси";
/* No comment provided by engineer. */
"Server" = "Сервер";
/* No comment provided by engineer. */
"Server address" = "Адрес сервера";
@@ -4160,9 +4046,6 @@
/* No comment provided by engineer. */
"Settings" = "Настройки";
/* alert message */
"Settings were changed." = "Настройки были изменены.";
/* No comment provided by engineer. */
"Shape profile images" = "Форма картинок профилей";
@@ -4184,9 +4067,6 @@
/* No comment provided by engineer. */
"Share link" = "Поделиться ссылкой";
/* No comment provided by engineer. */
"Share profile" = "Поделиться профилем";
/* No comment provided by engineer. */
"Share this 1-time invite link" = "Поделиться одноразовой ссылкой-приглашением";
@@ -4286,15 +4166,9 @@
/* No comment provided by engineer. */
"SMP server" = "SMP сервер";
/* No comment provided by engineer. */
"SOCKS proxy" = "SOCKS прокси";
/* blur media */
"Soft" = "Слабое";
/* No comment provided by engineer. */
"Some app settings were not migrated." = "Некоторые настройки приложения не были перенесены.";
/* No comment provided by engineer. */
"Some file(s) were not exported:" = "Некоторые файл(ы) не были экспортированы:";
@@ -4394,9 +4268,6 @@
/* No comment provided by engineer. */
"System authentication" = "Системная аутентификация";
/* No comment provided by engineer. */
"Tail" = "Хвост";
/* No comment provided by engineer. */
"Take picture" = "Сделать фото";
@@ -4526,9 +4397,6 @@
/* No comment provided by engineer. */
"The text you pasted is not a SimpleX link." = "Вставленный текст не является SimpleX-ссылкой.";
/* No comment provided by engineer. */
"The uploaded database archive will be permanently removed from the servers." = "Загруженный архив базы данных будет навсегда удален с серверов.";
/* No comment provided by engineer. */
"Themes" = "Темы";
@@ -4607,12 +4475,6 @@
/* No comment provided by engineer. */
"To protect your IP address, private routing uses your SMP servers to deliver messages." = "Чтобы защитить ваш IP адрес, приложение использует Ваши SMP серверы для конфиденциальной доставки сообщений.";
/* No comment provided by engineer. */
"To record speech please grant permission to use Microphone." = "Для записи речи, пожалуйста, дайте разрешение на использование микрофона.";
/* No comment provided by engineer. */
"To record video please grant permission to use Camera." = "Для записи видео, пожалуйста, дайте разрешение на использование камеры.";
/* No comment provided by engineer. */
"To record voice message please grant permission to use Microphone." = "Для записи голосового сообщения, пожалуйста разрешите доступ к микрофону.";
@@ -4829,9 +4691,6 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "Использовать серверы предосталенные SimpleX Chat?";
/* No comment provided by engineer. */
"Use SOCKS proxy" = "Использовать SOCKS прокси";
/* No comment provided by engineer. */
"Use the app while in the call." = "Используйте приложение во время звонка.";
@@ -4839,10 +4698,10 @@
"Use the app with one hand." = "Используйте приложение одной рукой.";
/* No comment provided by engineer. */
"User selection" = "Выбор пользователя";
"User profile" = "Профиль чата";
/* No comment provided by engineer. */
"Username" = "Имя пользователя";
"User selection" = "Выбор пользователя";
/* No comment provided by engineer. */
"Using SimpleX Chat servers." = "Используются серверы, предоставленные SimpleX Chat.";
@@ -5279,15 +5138,9 @@
/* No comment provided by engineer. */
"Your chat database is not encrypted - set passphrase to encrypt it." = "База данных НЕ зашифрована. Установите пароль, чтобы защитить Ваши данные.";
/* alert title */
"Your chat preferences" = "Ваши настройки чата";
/* No comment provided by engineer. */
"Your chat profiles" = "Ваши профили чата";
/* No comment provided by engineer. */
"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Соединение было перемещено на %@, но при смене профиля произошла неожиданная ошибка.";
/* No comment provided by engineer. */
"Your contact sent a file that is larger than currently supported maximum size (%@)." = "Ваш контакт отправил файл, размер которого превышает максимальный размер (%@).";
@@ -5297,9 +5150,6 @@
/* No comment provided by engineer. */
"Your contacts will remain connected." = "Ваши контакты сохранятся.";
/* No comment provided by engineer. */
"Your credentials may be sent unencrypted." = "Ваши учетные данные могут быть отправлены в незашифрованном виде.";
/* No comment provided by engineer. */
"Your current chat database will be DELETED and REPLACED with the imported one." = "Текущие данные Вашего чата будет УДАЛЕНЫ и ЗАМЕНЕНЫ импортированными.";
@@ -5324,9 +5174,6 @@
/* No comment provided by engineer. */
"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Ваш профиль хранится на Вашем устройстве и отправляется только Вашим контактам. SimpleX серверы не могут получить доступ к Вашему профилю.";
/* alert message */
"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Ваш профиль был изменен. Если вы сохраните его, обновленный профиль будет отправлен всем вашим контактам.";
/* No comment provided by engineer. */
"Your profile, contacts and delivered messages are stored on your device." = "Ваш профиль, контакты и доставленные сообщения хранятся на Вашем устройстве.";
+3 -3
View File
@@ -605,9 +605,6 @@
/* No comment provided by engineer. */
"Chat preferences" = "ค่ากําหนดในการแชท";
/* No comment provided by engineer. */
"Chat profile" = "โปรไฟล์ผู้ใช้";
/* No comment provided by engineer. */
"Chats" = "แชท";
@@ -3097,6 +3094,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "ใช้เซิร์ฟเวอร์ SimpleX Chat ไหม?";
/* No comment provided by engineer. */
"User profile" = "โปรไฟล์ผู้ใช้";
/* No comment provided by engineer. */
"Using SimpleX Chat servers." = "กำลังใช้เซิร์ฟเวอร์ SimpleX Chat อยู่";
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -890,9 +890,6 @@
/* No comment provided by engineer. */
"Chat preferences" = "Налаштування чату";
/* No comment provided by engineer. */
"Chat profile" = "Профіль користувача";
/* No comment provided by engineer. */
"Chat theme" = "Тема чату";
@@ -4700,6 +4697,9 @@
/* No comment provided by engineer. */
"Use the app with one hand." = "Використовуйте додаток однією рукою.";
/* No comment provided by engineer. */
"User profile" = "Профіль користувача";
/* No comment provided by engineer. */
"User selection" = "Вибір користувача";
+3 -3
View File
@@ -890,9 +890,6 @@
/* No comment provided by engineer. */
"Chat preferences" = "聊天偏好设置";
/* No comment provided by engineer. */
"Chat profile" = "用户资料";
/* No comment provided by engineer. */
"Chat theme" = "聊天主题";
@@ -4700,6 +4697,9 @@
/* No comment provided by engineer. */
"Use the app with one hand." = "用一只手使用应用程序。";
/* No comment provided by engineer. */
"User profile" = "用户资料";
/* No comment provided by engineer. */
"User selection" = "用户选择";
@@ -7,12 +7,9 @@ import android.os.Build
import androidx.annotation.RequiresApi
import androidx.compose.runtime.*
import chat.simplex.common.platform.*
import chat.simplex.common.views.helpers.withBGApi
import dev.icerock.moko.resources.ImageResource
import chat.simplex.res.MR
import dev.icerock.moko.resources.StringResource
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import java.util.concurrent.Executors
interface CallAudioDeviceManagerInterface {
@@ -22,7 +19,6 @@ interface CallAudioDeviceManagerInterface {
fun stop()
// AudioDeviceInfo.AudioDeviceType
fun selectLastExternalDeviceOrDefault(speaker: Boolean, keepAnyExternal: Boolean)
fun selectSameDeviceOnWebViewChange()
// AudioDeviceInfo.AudioDeviceType
fun selectDevice(id: Int)
@@ -39,15 +35,12 @@ interface CallAudioDeviceManagerInterface {
@RequiresApi(Build.VERSION_CODES.S)
class PostSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
private val am = androidAppContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
private var resetCurrentToDevice: AudioDeviceInfo? = null
private var resetCurrentToDeviceJob: Job = Job()
override val devices: MutableState<List<AudioDeviceInfo>> = mutableStateOf(emptyList())
override val currentDevice: MutableState<AudioDeviceInfo?> = mutableStateOf(null)
private val audioCallback = object: AudioDeviceCallback() {
override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Added audio devices: ${addedDevices.map { it.type }}")
resetCurrentToDevice = null
super.onAudioDevicesAdded(addedDevices)
val oldDevices = devices.value
devices.value = am.availableCommunicationDevices
@@ -60,21 +53,13 @@ class PostSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Removed audio devices: ${removedDevices.map { it.type }}")
resetCurrentToDevice = null
super.onAudioDevicesRemoved(removedDevices)
devices.value = am.availableCommunicationDevices
}
}
private val listener: OnCommunicationDeviceChangedListener = OnCommunicationDeviceChangedListener { device ->
val resetTo = resetCurrentToDevice
if (resetTo != null && device != null && resetTo.id != device.id) {
Log.w(TAG, "Resetting device that was set by WebView ${device.name?.localized()} to previously set device ${resetTo.name?.localized()}")
selectDevice(resetTo.id)
return@OnCommunicationDeviceChangedListener
}
devices.value = am.availableCommunicationDevices
//Log.d(TAG, "Devices changed ${device?.details()} | ${devices.value.map { it.details() }}")
currentDevice.value = device
}
@@ -113,18 +98,7 @@ class PostSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
}
}
// WebView modifies speaker when muting/unmuting microphone. It's not needed at all, returning back current device if it will be changed
override fun selectSameDeviceOnWebViewChange() {
resetCurrentToDevice = currentDevice.value
resetCurrentToDeviceJob.cancel()
resetCurrentToDeviceJob = withBGApi {
delay(5000)
resetCurrentToDevice = null
}
}
override fun selectDevice(id: Int) {
resetCurrentToDevice = null
val device = devices.value.lastOrNull { it.id == id }
if (device != null && am.communicationDevice?.id != id ) {
am.setCommunicationDevice(device)
@@ -134,14 +108,12 @@ class PostSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
class PreSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
private val am = androidAppContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
private var resetCurrentToDeviceJob: Job = Job()
override val devices: MutableState<List<AudioDeviceInfo>> = mutableStateOf(emptyList())
override val currentDevice: MutableState<AudioDeviceInfo?> = mutableStateOf(null)
private val audioCallback = object: AudioDeviceCallback() {
override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Added audio devices: ${addedDevices.map { it.type }}")
resetCurrentToDeviceJob.cancel()
super.onAudioDevicesAdded(addedDevices)
devices.value = am.getDevices(AudioManager.GET_DEVICES_OUTPUTS).filter { it.hasSupportedType() }.excludeSameType().excludeEarpieceIfWired()
selectLastExternalDeviceOrDefault(chatModel.activeCall.value?.hasVideo == true, false)
@@ -149,7 +121,6 @@ class PreSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>) {
Log.d(TAG, "Removed audio devices: ${removedDevices.map { it.type }}")
resetCurrentToDeviceJob.cancel()
super.onAudioDevicesRemoved(removedDevices)
devices.value = am.getDevices(AudioManager.GET_DEVICES_OUTPUTS).filter { it.hasSupportedType() }.excludeSameType().excludeEarpieceIfWired()
selectLastExternalDeviceOrDefault(chatModel.activeCall.value?.hasVideo == true, true)
@@ -182,22 +153,7 @@ class PreSCallAudioDeviceManager: CallAudioDeviceManagerInterface {
}
}
override fun selectSameDeviceOnWebViewChange() {
val current = currentDevice.value ?: return
resetCurrentToDeviceJob.cancel()
resetCurrentToDeviceJob = withBGApi {
// select old device manually because WebView will change it for sure.
// smaller delay first if it's possible to make the switch less noticeable
delay(300)
selectDevice(current.id)
// and in order to be sure that it will be selected even if WebView will be slow in changing its device
delay(700)
selectDevice(current.id)
}
}
override fun selectDevice(id: Int) {
resetCurrentToDeviceJob.cancel()
val device = devices.value.lastOrNull { it.id == id }
val isExternalDevice = device != null && device.type != AudioDeviceInfo.TYPE_BUILTIN_EARPIECE && device.type != AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
if (isExternalDevice) {
@@ -260,8 +216,6 @@ val AudioDeviceInfo.icon: ImageResource
else -> MR.images.ic_brand_awareness_filled
}
private fun AudioDeviceInfo.details(): String = "$productName id:$id name:${name?.localized()} type:$type sink:$isSink source:$isSource"
val AudioDeviceInfo.name: StringResource?
get() = when (this.type) {
AudioDeviceInfo.TYPE_BUILTIN_EARPIECE -> MR.strings.audio_device_earpiece
@@ -202,7 +202,6 @@ actual fun ActiveCallView() {
is WCallCommand.Camera -> {
updateActiveCall(call) { it.copy(localCamera = cmd.camera) }
if (!call.localMediaSources.mic) {
callAudioDeviceManager.selectSameDeviceOnWebViewChange()
chatModel.callCommand.add(WCallCommand.Media(CallMediaSource.Mic, enable = false))
}
}
@@ -227,9 +226,8 @@ actual fun ActiveCallView() {
ActiveCallOverlay(call, chatModel, callAudioDeviceManager)
}
}
KeyChangeEffect(call?.localMediaSources?.hasVideo) {
if (call != null && call.hasVideo && callAudioDeviceManager.currentDevice.value?.type == AudioDeviceInfo.TYPE_BUILTIN_EARPIECE) {
// enabling speaker on user action (peer action ignored) and not disabling it again
KeyChangeEffect(call?.hasVideo) {
if (call != null) {
callAudioDeviceManager.selectLastExternalDeviceOrDefault(call.hasVideo, true)
}
}
@@ -262,10 +260,7 @@ private fun ActiveCallOverlay(call: Call, chatModel: ChatModel, callAudioDeviceM
devices = remember { callAudioDeviceManager.devices }.value,
currentDevice = remember { callAudioDeviceManager.currentDevice },
dismiss = { withBGApi { chatModel.callManager.endCall(call) } },
toggleAudio = {
callAudioDeviceManager.selectSameDeviceOnWebViewChange()
chatModel.callCommand.add(WCallCommand.Media(CallMediaSource.Mic, enable = !call.localMediaSources.mic))
},
toggleAudio = { chatModel.callCommand.add(WCallCommand.Media(CallMediaSource.Mic, enable = !call.localMediaSources.mic)) },
selectDevice = { callAudioDeviceManager.selectDevice(it.id) },
toggleVideo = {
if (ContextCompat.checkSelfPermission(androidAppContext, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
@@ -71,9 +71,6 @@ object ChatModel {
val groupMembers = mutableStateListOf<GroupMember>()
val groupMembersIndexes = mutableStateMapOf<Long, Int>()
// false: default placement, true: floating window.
// Used for deciding to add terminal items on main thread or not. Floating means appPrefs.terminalAlwaysVisible
var terminalsVisible = setOf<Boolean>()
val terminalItems = mutableStateOf<List<TerminalItem>>(listOf())
val userAddress = mutableStateOf<UserContactLinkRec?>(null)
val chatItemTTL = mutableStateOf<ChatItemTTL>(ChatItemTTL.None)
@@ -775,16 +772,6 @@ object ChatModel {
fun addTerminalItem(item: TerminalItem) {
val maxItems = if (appPreferences.developerTools.get()) 500 else 200
if (terminalsVisible.isNotEmpty()) {
withApi {
addTerminalItem(item, maxItems)
}
} else {
addTerminalItem(item, maxItems)
}
}
private fun addTerminalItem(item: TerminalItem, maxItems: Int) {
if (terminalItems.value.size >= maxItems) {
terminalItems.value = terminalItems.value.subList(1, terminalItems.value.size)
}
@@ -3654,7 +3654,7 @@ data class NetCfg(
val socksMode: SocksMode = SocksMode.Always,
val hostMode: HostMode = HostMode.OnionViaSocks,
val requiredHostMode: Boolean = false,
val sessionMode: TransportSessionMode = TransportSessionMode.default,
val sessionMode: TransportSessionMode = TransportSessionMode.User,
val smpProxyMode: SMPProxyMode = SMPProxyMode.Unknown,
val smpProxyFallback: SMPProxyFallback = SMPProxyFallback.AllowProtected,
val smpWebPort: Boolean = false,
@@ -3781,13 +3781,10 @@ enum class SMPProxyFallback {
@Serializable
enum class TransportSessionMode {
@SerialName("user") User,
@SerialName("session") Session,
@SerialName("server") Server,
@SerialName("entity") Entity;
companion object {
val default = Session
val safeValues = arrayOf(User, Session, Server)
val default = User
}
}
@@ -20,12 +20,11 @@ import chat.simplex.common.views.chat.*
import chat.simplex.common.views.helpers.*
import chat.simplex.common.model.ChatModel
import chat.simplex.common.platform.*
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.launch
import chat.simplex.res.MR
import dev.icerock.moko.resources.compose.stringResource
@Composable
fun TerminalView(floating: Boolean = false, close: () -> Unit) {
fun TerminalView(chatModel: ChatModel, close: () -> Unit) {
val composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = false)) }
val close = {
close()
@@ -38,7 +37,6 @@ fun TerminalView(floating: Boolean = false, close: () -> Unit) {
})
TerminalLayout(
composeState,
floating,
sendCommand = { sendCommand(chatModel, composeState) },
close
)
@@ -67,7 +65,6 @@ private fun sendCommand(chatModel: ChatModel, composeState: MutableState<Compose
@Composable
fun TerminalLayout(
composeState: MutableState<ComposeState>,
floating: Boolean,
sendCommand: () -> Unit,
close: () -> Unit
) {
@@ -121,40 +118,19 @@ fun TerminalLayout(
color = MaterialTheme.colors.background,
contentColor = LocalContentColor.current
) {
TerminalLog(floating)
TerminalLog()
}
}
}
}
@Composable
fun TerminalLog(floating: Boolean) {
fun TerminalLog() {
val reversedTerminalItems by remember {
derivedStateOf { chatModel.terminalItems.value.asReversed() }
}
val clipboard = LocalClipboardManager.current
val listState = LocalAppBarHandler.current?.listState ?: rememberLazyListState()
LaunchedEffect(Unit) {
var autoScrollToBottom = true
launch {
snapshotFlow { listState.layoutInfo.totalItemsCount }
.filter { autoScrollToBottom }
.collect {
try {
listState.scrollToItem(0)
} catch (e: Exception) {
Log.e(TAG, e.stackTraceToString())
}
}
}
launch {
snapshotFlow { listState.firstVisibleItemIndex }
.collect {
autoScrollToBottom = listState.firstVisibleItemIndex == 0
}
}
}
LazyColumnWithScrollBar(reverseLayout = true, state = listState) {
LazyColumnWithScrollBar(reverseLayout = true) {
items(reversedTerminalItems, key = { item -> item.id to item.createdAtNanos }) { item ->
val rhId = item.remoteHostId
val rhIdStr = if (rhId == null) "" else "$rhId "
@@ -166,12 +142,7 @@ fun TerminalLog(floating: Boolean) {
modifier = Modifier
.fillMaxWidth()
.clickable {
val modalPlace = if (floating) {
ModalManager.floatingTerminal
} else {
ModalManager.start
}
modalPlace.showModal(endButtons = { ShareButton { clipboard.shareText(item.details) } }) {
ModalManager.start.showModal(endButtons = { ShareButton { clipboard.shareText(item.details) } }) {
SelectionContainer(modifier = Modifier.verticalScroll(rememberScrollState())) {
val details = item.details
.let {
@@ -185,16 +156,6 @@ fun TerminalLog(floating: Boolean) {
)
}
}
DisposableEffect(Unit) {
val terminals = chatModel.terminalsVisible.toMutableSet()
terminals += floating
chatModel.terminalsVisible = terminals
onDispose {
val terminals = chatModel.terminalsVisible.toMutableSet()
terminals -= floating
chatModel.terminalsVisible = terminals
}
}
}
@Preview/*(
@@ -208,7 +169,6 @@ fun PreviewTerminalLayout() {
TerminalLayout(
composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = false)) },
sendCommand = {},
floating = false,
close = {}
)
}
@@ -83,7 +83,6 @@ enum class CallState {
@Serializable
sealed class WCallCommand {
@Serializable @SerialName("capabilities") data class Capabilities(val media: CallMediaType): WCallCommand()
@Serializable @SerialName("permission") data class Permission(val title: String, val chrome: String, val safari: String): WCallCommand()
@Serializable @SerialName("start") data class Start(val media: CallMediaType, val aesKey: String? = null, val iceServers: List<RTCIceServer>? = null, val relay: Boolean? = null): WCallCommand()
@Serializable @SerialName("offer") data class Offer(val offer: String, val iceCandidates: String, val media: CallMediaType, val aesKey: String? = null, val iceServers: List<RTCIceServer>? = null, val relay: Boolean? = null): WCallCommand()
@Serializable @SerialName("answer") data class Answer (val answer: String, val iceCandidates: String): WCallCommand()
@@ -59,8 +59,7 @@ fun SelectedItemsBottomToolbar(
val canModerate = remember { mutableStateOf(false) }
val moderateEnabled = remember { mutableStateOf(false) }
val forwardEnabled = remember { mutableStateOf(false) }
val deleteCountProhibited = remember { mutableStateOf(false) }
val forwardCountProhibited = remember { mutableStateOf(false) }
val allButtonsDisabled = remember { mutableStateOf(false) }
Box {
// It's hard to measure exact height of ComposeView with different fontSizes. Better to depend on actual ComposeView, even empty
ComposeView(chatModel = chatModel, Chat.sampleData, remember { mutableStateOf(ComposeState(useLinkPreviews = false)) }, remember { mutableStateOf(null) }, {})
@@ -76,36 +75,36 @@ fun SelectedItemsBottomToolbar(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
IconButton({ deleteItems(deleteForEveryoneEnabled.value) }, enabled = deleteEnabled.value && !deleteCountProhibited.value) {
IconButton({ deleteItems(deleteForEveryoneEnabled.value) }, enabled = deleteEnabled.value && !allButtonsDisabled.value) {
Icon(
painterResource(MR.images.ic_delete),
null,
Modifier.size(22.dp),
tint = if (!deleteEnabled.value || deleteCountProhibited.value) MaterialTheme.colors.secondary else MaterialTheme.colors.error
tint = if (!deleteEnabled.value || allButtonsDisabled.value) MaterialTheme.colors.secondary else MaterialTheme.colors.error
)
}
IconButton({ moderateItems() }, Modifier.alpha(if (canModerate.value) 1f else 0f), enabled = moderateEnabled.value && !deleteCountProhibited.value) {
IconButton({ moderateItems() }, Modifier.alpha(if (canModerate.value) 1f else 0f), enabled = moderateEnabled.value && !allButtonsDisabled.value) {
Icon(
painterResource(MR.images.ic_flag),
null,
Modifier.size(22.dp),
tint = if (!moderateEnabled.value || deleteCountProhibited.value) MaterialTheme.colors.secondary else MaterialTheme.colors.error
tint = if (!moderateEnabled.value || allButtonsDisabled.value) MaterialTheme.colors.secondary else MaterialTheme.colors.error
)
}
IconButton({ forwardItems() }, enabled = forwardEnabled.value && !forwardCountProhibited.value) {
IconButton({ forwardItems() }, enabled = forwardEnabled.value && !allButtonsDisabled.value) {
Icon(
painterResource(MR.images.ic_forward),
null,
Modifier.size(22.dp),
tint = if (!forwardEnabled.value || forwardCountProhibited.value) MaterialTheme.colors.secondary else MaterialTheme.colors.primary
tint = if (!forwardEnabled.value || allButtonsDisabled.value) MaterialTheme.colors.secondary else MaterialTheme.colors.primary
)
}
}
}
LaunchedEffect(chatInfo, chatItems, selectedChatItems.value) {
recheckItems(chatInfo, chatItems, selectedChatItems, deleteEnabled, deleteForEveryoneEnabled, canModerate, moderateEnabled, forwardEnabled, deleteCountProhibited, forwardCountProhibited)
recheckItems(chatInfo, chatItems, selectedChatItems, deleteEnabled, deleteForEveryoneEnabled, canModerate, moderateEnabled, forwardEnabled, allButtonsDisabled)
}
}
@@ -117,12 +116,10 @@ private fun recheckItems(chatInfo: ChatInfo,
canModerate: MutableState<Boolean>,
moderateEnabled: MutableState<Boolean>,
forwardEnabled: MutableState<Boolean>,
deleteCountProhibited: MutableState<Boolean>,
forwardCountProhibited: MutableState<Boolean>
allButtonsDisabled: MutableState<Boolean>
) {
val count = selectedChatItems.value?.size ?: 0
deleteCountProhibited.value = count == 0 || count > 200
forwardCountProhibited.value = count == 0 || count > 20
allButtonsDisabled.value = count == 0 || count > 20
canModerate.value = possibleToModerate(chatInfo)
val selected = selectedChatItems.value ?: return
var rDeleteEnabled = true
@@ -341,8 +341,7 @@ private fun GlobalSettingsSection(
ModalManager.start.showCustomModal { close ->
ConnectDesktopView(close)
}
},
disabled = stopped
}
)
} else {
UserPickerOptionRow(
@@ -2,8 +2,10 @@ package chat.simplex.common.views.helpers
import androidx.compose.animation.*
import androidx.compose.animation.core.*
import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
@@ -207,14 +209,11 @@ class ModalManager(private val placement: ModalPlacement? = null) {
val end = if (appPlatform.isAndroid) shared else ModalManager(ModalPlacement.END)
val fullscreen = if (appPlatform.isAndroid) shared else ModalManager(ModalPlacement.FULLSCREEN)
val floatingTerminal = if (appPlatform.isAndroid) shared else ModalManager(ModalPlacement.START)
fun closeAllModalsEverywhere() {
start.closeModals()
center.closeModals()
end.closeModals()
fullscreen.closeModals()
floatingTerminal.closeModals()
}
@OptIn(ExperimentalAnimationApi::class)
@@ -321,19 +321,17 @@ fun ActiveProfilePicker(
}
}
if ((contactConnection != null && updatedConn != null) || contactConnection == null) {
controller.changeActiveUser_(
rhId = user.remoteHostId,
toUserId = user.userId,
viewPwd = if (user.hidden) searchTextOrPassword.value else null
)
controller.changeActiveUser_(
rhId = user.remoteHostId,
toUserId = user.userId,
viewPwd = if (user.hidden) searchTextOrPassword.value else null
)
if (chatModel.currentUser.value?.userId != user.userId) {
AlertManager.shared.showAlertMsg(generalGetString(
MR.strings.switching_profile_error_title),
String.format(generalGetString(MR.strings.switching_profile_error_message), user.chatViewName)
)
}
if (chatModel.currentUser.value?.userId != user.userId) {
AlertManager.shared.showAlertMsg(generalGetString(
MR.strings.switching_profile_error_title),
String.format(generalGetString(MR.strings.switching_profile_error_message), user.chatViewName)
)
}
if (updatedConn != null) {
@@ -53,8 +53,7 @@ fun WhatsNewView(viaSettings: Boolean = false, close: () -> Unit) {
maxLines = 2,
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.h4,
fontWeight = FontWeight.Medium,
modifier = Modifier.padding(bottom = 6.dp)
fontWeight = FontWeight.Medium
)
if (link != null) {
linkButton(link)
@@ -65,7 +64,7 @@ fun WhatsNewView(viaSettings: Boolean = false, close: () -> Unit) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(8.dp),
modifier = Modifier.padding(bottom = 6.dp)
modifier = Modifier.padding(bottom = 4.dp)
) {
Icon(painterResource(si), stringResource(sd), tint = MaterialTheme.colors.secondary)
Text(generalGetString(sd), fontSize = 15.sp)
@@ -649,36 +648,7 @@ private val versionDescriptions: List<VersionDescription> = listOf(
show = appPlatform.isDesktop
),
),
),
VersionDescription(
version = "v6.1",
post = "https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html",
features = listOf(
FeatureDescription(
icon = MR.images.ic_verified_user,
titleId = MR.strings.v6_1_better_security,
descrId = MR.strings.v6_1_better_security_descr,
link = "https://simplex.chat/blog/20241014-simplex-network-v6-1-security-review-better-calls-user-experience.html"
),
FeatureDescription(
icon = MR.images.ic_videocam,
titleId = MR.strings.v6_1_better_calls,
descrId = MR.strings.v6_1_better_calls_descr
),
FeatureDescription(
icon = null,
titleId = MR.strings.v6_1_better_user_experience,
descrId = null,
subfeatures = listOf(
MR.images.ic_link to MR.strings.v6_1_switch_chat_profile_descr,
MR.images.ic_chat to MR.strings.v6_1_customizable_message_descr,
MR.images.ic_calendar to MR.strings.v6_1_message_dates_descr,
MR.images.ic_forward to MR.strings.v6_1_forward_many_messages_descr,
MR.images.ic_delete to MR.strings.v6_1_delete_many_messages_descr
)
),
),
),
)
)
private val lastVersion = versionDescriptions.last().version
@@ -218,7 +218,7 @@ fun ModalData.AdvancedNetworkSettingsView(showModal: (ModalData.() -> Unit) -> U
SectionDividerSpaced(maxTopPadding = true)
}
if (currentRemoteHost == null) {
if (currentRemoteHost == null && developerTools) {
SectionView(stringResource(MR.strings.network_session_mode_transport_isolation).uppercase()) {
SessionModePicker(sessionMode, showModal, updateSessionMode)
}
@@ -35,7 +35,7 @@ fun DeveloperView(
val unchangedHints = mutableStateOf(unchangedHintPreferences())
SectionView {
InstallTerminalAppItem(uriHandler)
ChatConsoleItem { withAuth(generalGetString(MR.strings.auth_open_chat_console), generalGetString(MR.strings.auth_log_in_using_credential), showCustomModal { it, close -> TerminalView(false, close) }) }
ChatConsoleItem { withAuth(generalGetString(MR.strings.auth_open_chat_console), generalGetString(MR.strings.auth_log_in_using_credential), showCustomModal { it, close -> TerminalView(it, close) }) }
ResetHintsItem(unchangedHints)
SettingsPreferenceItem(painterResource(MR.images.ic_code), stringResource(MR.strings.show_developer_options), developerTools)
SectionTextFooter(
@@ -164,7 +164,9 @@ fun NetworkAndServersView() {
val showCustomModal = { it: @Composable (close: () -> Unit) -> Unit -> ModalManager.fullscreen.showCustomModal { close -> it(close) }}
UseSocksProxySwitch(networkUseSocksProxy, toggleSocksProxy)
SettingsActionItem(painterResource(MR.images.ic_settings_ethernet), stringResource(MR.strings.network_socks_proxy_settings), { showCustomModal { SocksProxySettings(networkUseSocksProxy.value, networkProxy, onionHosts, sessionMode.value, true, it) } })
SessionModePicker(sessionMode, showModal, updateSessionMode)
if (developerTools) {
SessionModePicker(sessionMode, showModal, updateSessionMode)
}
}
@Composable
@@ -456,17 +458,9 @@ fun SessionModePicker(
) {
val density = LocalDensity.current
val values = remember {
val safeModes = TransportSessionMode.safeValues
val modes: Array<TransportSessionMode> =
if (appPrefs.developerTools.get()) TransportSessionMode.values()
else if (safeModes.contains(sessionMode.value)) safeModes
else safeModes + sessionMode.value
modes.map {
val userModeDescr: AnnotatedString = escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_session_mode_user_description), density)
TransportSessionMode.values().map {
when (it) {
TransportSessionMode.User -> ValueTitleDesc(TransportSessionMode.User, generalGetString(MR.strings.network_session_mode_user), userModeDescr)
TransportSessionMode.Session -> ValueTitleDesc(TransportSessionMode.Session, generalGetString(MR.strings.network_session_mode_session), userModeDescr + AnnotatedString("\n") + escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_session_mode_session_description), density))
TransportSessionMode.Server -> ValueTitleDesc(TransportSessionMode.Server, generalGetString(MR.strings.network_session_mode_server), userModeDescr + AnnotatedString("\n") + escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_session_mode_server_description), density))
TransportSessionMode.User -> ValueTitleDesc(TransportSessionMode.User, generalGetString(MR.strings.network_session_mode_user), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_session_mode_user_description), density))
TransportSessionMode.Entity -> ValueTitleDesc(TransportSessionMode.Entity, generalGetString(MR.strings.network_session_mode_entity), escapedHtmlToAnnotatedString(generalGetString(MR.strings.network_session_mode_entity_description), density))
}
}
@@ -2104,25 +2104,4 @@
<string name="network_proxy_auth">استيثاق الوكيل</string>
<string name="delete_messages_cannot_be_undone_warning">سيتم حذف الرسائل - لا يمكن التراجع عن هذا!</string>
<string name="icon_descr_sound_muted">الصوت مكتوم</string>
<string name="error_initializing_web_view_wrong_arch">حدث خطأ أثناء تهيئة WebView. تأكد من تثبيت WebView وأن بنيته المدعومة هي arm64.\nالخطأ: %s</string>
<string name="settings_section_title_message_shape">شكل الرسالة</string>
<string name="settings_message_shape_tail">ذيل</string>
<string name="settings_message_shape_corner">ركن</string>
<string name="network_session_mode_session">جلسة التطبيق</string>
<string name="network_session_mode_server">الخادم</string>
<string name="network_session_mode_session_description">سيتم استخدام بيانات اعتماد SOCKS الجديدة في كل مرة تبدأ فيها تشغيل التطبيق.</string>
<string name="network_session_mode_server_description">سيتم استخدام بيانات اعتماد SOCKS الجديدة لكل خادم.</string>
<string name="call_desktop_permission_denied_chrome">انقر فوق زر المعلومات الموجود بالقرب من حقل العنوان للسماح باستخدام الميكروفون.</string>
<string name="call_desktop_permission_denied_safari">افتح إعدادات Safari / مواقع الويب / الميكروفون، ثم اختر السماح لـ localhost.</string>
<string name="call_desktop_permission_denied_title">لإجراء مكالمات، اسمح باستخدام الميكروفون. أنهِ المكالمة وحاول الاتصال مرة أخرى.</string>
<string name="v6_1_better_user_experience">تجربة مستخدم أفضل</string>
<string name="v6_1_customizable_message_descr">شكل الرسالة قابل للتخصيص.</string>
<string name="v6_1_better_calls_descr">تبديل الصوت والفيديو أثناء المكالمة.</string>
<string name="v6_1_delete_many_messages_descr">حذف أو إشراف ما يصل إلى 200 رسالة.</string>
<string name="v6_1_forward_many_messages_descr">حوّل ما يصل إلى 20 رسالة آن واحد.</string>
<string name="v6_1_better_calls">مكالمات أفضل</string>
<string name="v6_1_message_dates_descr">تواريخ أفضل للرسائل.</string>
<string name="v6_1_better_security">أمان أفضل ✅</string>
<string name="v6_1_better_security_descr">بروتوكولات SimpleX تمت مراجعتها بواسطة Trail of Bits.</string>
<string name="v6_1_switch_chat_profile_descr">تبديل ملف تعريف الدردشة لدعوات لمرة واحدة.</string>
</resources>
@@ -811,12 +811,8 @@
<string name="network_use_onion_hosts_required_desc">Onion hosts will be required for connection.\nPlease note: you will not be able to connect to the servers without .onion address.</string>
<string name="network_session_mode_transport_isolation">Transport isolation</string>
<string name="network_session_mode_user">Chat profile</string>
<string name="network_session_mode_session">App session</string>
<string name="network_session_mode_server">Server</string>
<string name="network_session_mode_entity">Connection</string>
<string name="network_session_mode_user_description"><![CDATA[A separate TCP connection (and SOCKS credential) will be used <b>for each chat profile you have in the app</b>.]]></string>
<string name="network_session_mode_session_description">New SOCKS credentials will be used every time you start the app.</string>
<string name="network_session_mode_server_description">New SOCKS credentials will be used for each server.</string>
<string name="network_session_mode_entity_description"><![CDATA[A separate TCP connection (and SOCKS credential) will be used <b>for each contact and group member</b>.\n<b>Please note</b>: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail.]]></string>
<string name="update_network_session_mode_question">Update transport isolation mode?</string>
<string name="disable_onion_hosts_when_not_supported"><![CDATA[Set <i>Use .onion hosts</i> to No if SOCKS proxy does not support them.]]></string>
@@ -1047,9 +1043,6 @@
<string name="call_already_ended">Call already ended!</string>
<string name="icon_descr_video_call">video call</string>
<string name="icon_descr_audio_call">audio call</string>
<string name="call_desktop_permission_denied_title">To make calls, allow to use your microphone. End the call and try to call again.</string>
<string name="call_desktop_permission_denied_chrome">Click info button near address field to allow using microphone.</string>
<string name="call_desktop_permission_denied_safari">Open Safari Settings / Websites / Microphone, then choose Allow for localhost.</string>
<!-- Call settings -->
<string name="settings_audio_video_calls">Audio &amp; video calls</string>
@@ -2041,16 +2034,6 @@
<string name="v6_0_upgrade_app_descr">Download new versions from GitHub.</string>
<string name="v6_0_connection_servers_status">Control your network</string>
<string name="v6_0_connection_servers_status_descr">Connection and servers status.</string>
<string name="v6_1_better_security">Better security ✅</string>
<string name="v6_1_better_security_descr">SimpleX protocols reviewed by Trail of Bits.</string>
<string name="v6_1_better_calls">Better calls</string>
<string name="v6_1_better_calls_descr">Switch audio and video during the call.</string>
<string name="v6_1_better_user_experience">Better user experience</string>
<string name="v6_1_switch_chat_profile_descr">Switch chat profile for 1-time invitations.</string>
<string name="v6_1_customizable_message_descr">Customizable message shape.</string>
<string name="v6_1_message_dates_descr">Better message dates.</string>
<string name="v6_1_forward_many_messages_descr">Forward up to 20 messages at once.</string>
<string name="v6_1_delete_many_messages_descr">Delete or moderate up to 200 messages.</string>
<!-- CustomTimePicker -->
<string name="custom_time_unit_seconds">seconds</string>
@@ -1990,7 +1990,7 @@
<string name="downloaded_files">Heruntergeladene Dateien</string>
<string name="download_errors">Fehler beim Herunterladen</string>
<string name="duplicates_label">Duplikate</string>
<string name="expired_label">Abgelaufen</string>
<string name="expired_label">abgelaufen</string>
<string name="open_server_settings_button">Server-Einstellungen öffnen</string>
<string name="other_errors">Andere Fehler</string>
<string name="proxied">Proxy</string>
@@ -2188,25 +2188,4 @@
<string name="forward_multiple">Nachrichten werden weitergeleitet…</string>
<string name="compose_save_messages_n">Es wird/werden %1$s Nachricht(en) gesichert</string>
<string name="icon_descr_sound_muted">Ton stummgeschaltet</string>
<string name="error_initializing_web_view_wrong_arch">Fehler bei der Initialisierung von WebView. Stellen Sie sicher, dass Sie WebView installiert haben, und es die ARM64-Architektur unterstützt.\nFehler: %s</string>
<string name="settings_section_title_message_shape">Form der Nachricht</string>
<string name="settings_message_shape_tail">Sprechblase</string>
<string name="settings_message_shape_corner">Abrundung Ecken</string>
<string name="network_session_mode_session">App-Sitzung</string>
<string name="network_session_mode_server_description">Für jeden Server werden neue SOCKS-Anmeldeinformationen genutzt</string>
<string name="network_session_mode_server">Server</string>
<string name="call_desktop_permission_denied_chrome">Klicken Sie auf die Info-Schaltfläche neben dem Adressfeld, um die Verwendung des Mikrofons zu erlauben.</string>
<string name="call_desktop_permission_denied_title">Um Anrufe durchzuführen, erlauben Sie die Nutzung Ihres Mikrofons. Beenden Sie den Anruf und versuchen Sie es erneut.</string>
<string name="call_desktop_permission_denied_safari">Öffnen Sie die Safari-Einstellungen / Webseiten / Mikrofon und wählen Sie dann \"Für Localhost erlauben\".</string>
<string name="v6_1_better_calls">Verbesserte Anrufe</string>
<string name="v6_1_customizable_message_descr">Anpassbares Format des Nachrichtenfelds</string>
<string name="v6_1_delete_many_messages_descr">Bis zu 200 Nachrichten löschen oder moderieren</string>
<string name="v6_1_forward_many_messages_descr">Bis zu 20 Nachrichten auf einmal weiterleiten</string>
<string name="v6_1_better_security_descr">Die SimpleX-Protokolle wurden von Trail of Bits überprüft.</string>
<string name="v6_1_better_calls_descr">Während des Anrufs zwischen Audio und Video wechseln</string>
<string name="v6_1_switch_chat_profile_descr">Das Chat-Profil für Einmal-Einladungen wechseln</string>
<string name="network_session_mode_session_description">Jedes Mal wenn Sie die App starten, werden neue SOCKS-Anmeldeinformationen genutzt</string>
<string name="v6_1_better_security">Verbesserte Sicherheit ✅</string>
<string name="v6_1_message_dates_descr">Verbesserte Nachrichten-Datumsinformation</string>
<string name="v6_1_better_user_experience">Verbesserte Nutzer-Erfahrung</string>
</resources>
@@ -227,20 +227,4 @@
<string name="deleted_description">διαγράφτηκε</string>
<string name="moderated_item_description">με συντονιστή %s</string>
<string name="blocked_item_description">φραγμένος</string>
<string name="learn_more_about_address">Σχετικά με τη διεύθυνση SimpleX</string>
<string name="conn_event_ratchet_sync_started">συμφωνία κρυπτογράφησης…</string>
<string name="chat_theme_apply_to_all_modes">Όλες οι χρωματικές λειτουργίες</string>
<string name="abort_switch_receiving_address_desc">Η αλλαγή διεύθυνσης θα ακυρωθεί. Θα χρησιμοποιηθεί η παλιά διεύθυνση παραλαβής.</string>
<string name="servers_info_subscriptions_connections_subscribed">Ενεργές συνδέσεις</string>
<string name="network_settings_title">Προχωρημένες ρυθμίσεις</string>
<string name="color_primary_variant">Πρόσθετη προφορά</string>
<string name="add_contact_tab">Προσθήκη επαφής</string>
<string name="abort_switch_receiving_address">Διακοπή αλλαγής διεύθυνσης</string>
<string name="wallpaper_advanced_settings">Προχωρημένες ρυθμίσεις</string>
<string name="v5_6_safer_groups_descr">Οι διαχειριστές μπορούν να αποκλείσουν ένα μέλος για όλους.</string>
<string name="acknowledged">Αναγνωρισμένο</string>
<string name="above_then_preposition_continuation">παραπάνω, λοιπόν:</string>
<string name="add_address_to_your_profile">Προσθέστε τη διεύθυνση στο προφίλ σας, έτσι ώστε οι επαφές σας να μπορούν να τη μοιραστούν με άλλα άτομα. Το ενημέρωμένο προφίλ θα σταλεί στις επαφές σας.</string>
<string name="feature_roles_admins">διαχειριστές</string>
<string name="acknowledgement_errors">Λάθη αναγνώρισης</string>
</resources>
@@ -366,7 +366,7 @@
<string name="description_via_contact_address_link_incognito">en modo incógnito mediante enlace de dirección del contacto</string>
<string name="failed_to_create_user_title">¡Error al crear perfil!</string>
<string name="failed_to_parse_chat_title">No se pudo cargar el chat</string>
<string name="failed_to_parse_chats_title">Fallo en la carga de chats</string>
<string name="failed_to_parse_chats_title">No se pudieron cargar los chats</string>
<string name="simplex_link_mode_full">Enlace completo</string>
<string name="error_deleting_contact">Error al eliminar contacto</string>
<string name="error_joining_group">Error al unirte al grupo</string>
@@ -562,7 +562,7 @@
<string name="rcv_group_event_member_left">ha salido</string>
<string name="button_leave_group">Salir del grupo</string>
<string name="only_group_owners_can_change_prefs">Sólo los propietarios pueden modificar las preferencias del grupo.</string>
<string name="users_delete_data_only">Eliminar sólo el perfil</string>
<string name="users_delete_data_only">Sólo datos del perfil</string>
<string name="chat_preferences_no">no</string>
<string name="thousand_abbreviation">k</string>
<string name="marked_deleted_description">marcado eliminado</string>
@@ -579,7 +579,7 @@
<string name="make_private_connection">Establecer una conexión privada</string>
<string name="network_error_desc">Comprueba tu conexión de red con %1$s e inténtalo de nuevo.</string>
<string name="sender_may_have_deleted_the_connection_request">El remitente puede haber eliminado la solicitud de conexión.</string>
<string name="error_smp_test_certificate">Posiblemente la huella del certificado en la dirección del servidor es incorrecta</string>
<string name="error_smp_test_certificate">Posiblemente la huella digital del certificado en la dirección del servidor es incorrecta</string>
<string name="reply_verb">Responder</string>
<string name="save_passphrase_in_keychain">Guardar contraseña en Keystore</string>
<string name="database_restore_error">Error al restaurar base de datos</string>
@@ -668,7 +668,7 @@
<string name="receiving_via">Recibiendo vía</string>
<string name="network_option_protocol_timeout">Timeout protocolo</string>
<string name="network_option_seconds_label">seg</string>
<string name="users_delete_with_connections">Eliminar perfil y conexiones</string>
<string name="users_delete_with_connections">Datos del perfil y conexiones</string>
<string name="prohibit_sending_disappearing_messages">No se permiten mensajes temporales.</string>
<string name="only_you_can_send_voice">Sólo tú puedes enviar mensajes de voz.</string>
<string name="only_your_contact_can_send_voice">Sólo tu contacto puede enviar mensajes de voz.</string>
@@ -820,7 +820,7 @@
<string name="trying_to_connect_to_server_to_receive_messages">Intentando conectar con el servidor para recibir mensajes de este contacto.</string>
<string name="unknown_message_format">formato de mensaje desconocido</string>
<string name="trying_to_connect_to_server_to_receive_messages_with_error">Intentando conectar con el servidor para recibir mensajes de este contacto (error: %1$s).</string>
<string name="error_smp_test_failed_at_step">Prueba no superada en el paso %s.</string>
<string name="error_smp_test_failed_at_step">Prueba fallida en el paso %s.</string>
<string name="tap_to_start_new_chat">Pulsa para iniciar chat nuevo</string>
<string name="share_message">Compartir mensaje…</string>
<string name="share_image">Compartir medios…</string>
@@ -832,8 +832,8 @@
<string name="switch_receiving_address">Cambiar servidor de recepción</string>
<string name="group_is_decentralized">Totalmente descentralizado. Visible sólo para los miembros.</string>
<string name="to_connect_via_link_title">Para conectarte mediante enlace</string>
<string name="smp_servers_test_failed">¡Prueba no superada!</string>
<string name="smp_servers_test_some_failed">Algunos servidores no han superado la prueba:</string>
<string name="smp_servers_test_failed">¡Error en prueba del servidor!</string>
<string name="smp_servers_test_some_failed">Algunos servidores no superaron la prueba:</string>
<string name="smp_servers_use_server">Usar servidor</string>
<string name="smp_servers_use_server_for_new_conn">Usar para conexiones nuevas</string>
<string name="theme_system">Sistema</string>
@@ -1627,9 +1627,9 @@
<string name="past_member_vName">Miembro pasado %1$s</string>
<string name="profile_update_event_member_name_changed">el miembro %1$s ha cambiado a %2$s</string>
<string name="profile_update_event_removed_address">dirección de contacto eliminada</string>
<string name="profile_update_event_removed_picture">ha eliminado la imagen del perfil</string>
<string name="profile_update_event_removed_picture">imagen de perfil eliminada</string>
<string name="profile_update_event_set_new_address">nueva dirección de contacto</string>
<string name="profile_update_event_set_new_picture">tiene nueva imagen del perfil</string>
<string name="profile_update_event_set_new_picture">nueva imagen de perfil</string>
<string name="call_service_notification_audio_call">Llamada</string>
<string name="call_service_notification_end_call">Llamada finalizada</string>
<string name="call_service_notification_video_call">Videollamada</string>
@@ -1686,7 +1686,7 @@
<string name="migrate_from_device_finalize_migration">Finalizar migración</string>
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>Atención</b>: el archivo será eliminado.]]></string>
<string name="migrate_from_device_check_connection_and_try_again">Comprueba tu conexión a internet y vuelve a intentarlo</string>
<string name="migrate_from_device_confirm_you_remember_passphrase">Para migrar la base de datos confirma que recuerdas la frase de contraseña.</string>
<string name="migrate_from_device_confirm_you_remember_passphrase">Para migrar confirma que recuerdas la frase de contraseña de la base de datos.</string>
<string name="migrate_from_device_error_verifying_passphrase">Error al verificar la frase de contraseña:</string>
<string name="migrate_from_device_using_on_two_device_breaks_encryption"><![CDATA[<b>Recuerda</b>: usar la misma base de datos en dos dispositivos hará que falle el descifrado de mensajes como protección de seguridad.]]></string>
<string name="migrate_from_device_choose_migrate_from_another_device"><![CDATA[En el nuevo dispositivo selecciona <i>Migrar desde otro dispositivo</i> y escanea el código QR.]]></string>
@@ -2107,25 +2107,4 @@
<string name="new_chat_share_profile">Comparte perfil</string>
<string name="switching_profile_error_message">Tu conexión ha sido trasladada a %s pero ha ocurrido un error inesperado al redirigirte al perfil.</string>
<string name="icon_descr_sound_muted">Sonido silenciado</string>
<string name="error_initializing_web_view_wrong_arch">Error al iniciar WebView. Asegúrate de tener WebView instalado y que sea compatible con la arquitectura amr64.\nError: %s</string>
<string name="settings_section_title_message_shape">Forma del mensaje</string>
<string name="settings_message_shape_corner">Esquinas</string>
<string name="settings_message_shape_tail">Cola</string>
<string name="network_session_mode_session_description">Se usarán credenciales SOCKS nuevas cada vez que inicies la aplicación.</string>
<string name="network_session_mode_session">Sesión de aplicación</string>
<string name="call_desktop_permission_denied_safari">Abre la configuración de Safari / Sitios Web / Micrófono y a continuación selecciona Permitir para localhost.</string>
<string name="call_desktop_permission_denied_chrome">Pulsa el botón info del campo dirección para permitir el uso del micrófono.</string>
<string name="call_desktop_permission_denied_title">Para hacer llamadas, permite el uso del micrófono. Cuelga e intenta llamar de nuevo.</string>
<string name="network_session_mode_server_description">Se usarán credenciales SOCKS nuevas por cada servidor.</string>
<string name="network_session_mode_server">Servidor</string>
<string name="v6_1_better_calls">Llamadas mejoradas</string>
<string name="v6_1_message_dates_descr">Mensajes mejor datados.</string>
<string name="v6_1_better_user_experience">Experiencia de usuario mejorada</string>
<string name="v6_1_customizable_message_descr">Forma personalizable de los mensajes.</string>
<string name="v6_1_forward_many_messages_descr">Desplazamiento de hasta 20 mensajes.</string>
<string name="v6_1_better_security_descr">Protocolos de SimpleX auditados por Trail of Bits.</string>
<string name="v6_1_better_calls_descr">Intercambia audio y video durante la llamada.</string>
<string name="v6_1_better_security">Seguridad mejorada ✅</string>
<string name="v6_1_delete_many_messages_descr">Borrar o moderar hasta 200 mensajes.</string>
<string name="v6_1_switch_chat_profile_descr">Cambia el perfil de chat para invitaciones de un solo uso.</string>
</resources>
@@ -14,7 +14,7 @@
<string name="abort_switch_receiving_address_confirm">Megszakítás</string>
<string name="send_disappearing_message_30_seconds">30 másodperc</string>
<string name="one_time_link_short">Egyszer használható hivatkozás</string>
<string name="contact_wants_to_connect_via_call">%1$s szeretne kapcsolatba lépni Önnel ezen keresztül:</string>
<string name="contact_wants_to_connect_via_call">%1$s szeretne kapcsolatba lépni önnel ezen keresztül:</string>
<string name="about_simplex_chat">A SimpleX Chatről</string>
<string name="chat_item_ttl_day">1 nap</string>
<string name="abort_switch_receiving_address">Címváltoztatás megszakítása</string>
@@ -25,7 +25,7 @@
<string name="accept_feature">Elfogadás</string>
<string name="accept_call_on_lock_screen">Elfogadás</string>
<string name="above_then_preposition_continuation">gombra fent, majd:</string>
<string name="accept_contact_incognito_button">Elfogadás inkognitóban</string>
<string name="accept_contact_incognito_button">Elfogadás inkognítóban</string>
<string name="accept_connection_request__question">Kapcsolatkérés elfogadása?</string>
<string name="accept_contact_button">Elfogadás</string>
<string name="accept">Elfogadás</string>
@@ -70,8 +70,8 @@
<string name="available_in_v51">"
\nElérhető a v5.1-ben"</string>
<string name="both_you_and_your_contacts_can_delete">Mindkét fél véglegesen törölheti az elküldött üzeneteket. (24 óra)</string>
<string name="v5_4_better_groups">Továbbfejlesztett csoportok</string>
<string name="clear_chat_warning">Minden üzenet törlésre kerül - ez a művelet nem vonható vissza! Az üzenetek CSAK az Ön számára törlődnek.</string>
<string name="v5_4_better_groups">Javított csoportok</string>
<string name="clear_chat_warning">Minden üzenet törlésre kerül - ez a művelet nem vonható vissza! Az üzenetek CSAK az ön számára törlődnek.</string>
<string name="icon_descr_call_ended">Hívás befejeződött</string>
<string name="settings_section_title_calls">HÍVÁSOK</string>
<string name="rcv_group_and_other_events">és további %d esemény</string>
@@ -138,7 +138,7 @@
<string name="allow_your_contacts_irreversibly_delete">Az elküldött üzenetek végleges törlése engedélyezve van az ismerősei számára. (24 óra)</string>
<string name="cancel_verb">Mégse</string>
<string name="notifications_mode_off_desc">Az alkalmazás csak akkor tud értesítéseket fogadni, amikor meg van nyitva. A háttérszolgáltatás nem indul el</string>
<string name="v5_1_better_messages">Továbbfejlesztett üzenetek</string>
<string name="v5_1_better_messages">Jobb üzenetek</string>
<string name="abort_switch_receiving_address_desc">A cím módosítása megszakad. A régi fogadási cím kerül felhasználásra.</string>
<string name="allow_verb">Engedélyezés</string>
<string name="bad_desktop_address">Hibás számítógép cím</string>
@@ -191,20 +191,20 @@
<string name="switch_receiving_address_question">Megváltoztatja a fogadó címet?</string>
<string name="rcv_conn_event_switch_queue_phase_completed">cím megváltoztatva</string>
<string name="change_self_destruct_mode">Önmegsemmisítő mód megváltoztatása</string>
<string name="rcv_group_event_changed_your_role">megváltoztatta az Ön szerepkörét erre: %s</string>
<string name="rcv_group_event_changed_your_role">megváltoztatta az ön szerepkörét erre: %s</string>
<string name="connect_button">Kapcsolódás</string>
<string name="connect_via_member_address_alert_title">Közvetlen kapcsolódás?</string>
<string name="smp_server_test_connect">Kapcsolódás</string>
<string name="rcv_group_event_member_created_contact">közvetlenül kapcsolódott</string>
<string name="rcv_group_event_member_created_contact">közvetlenül kapcsolódva</string>
<string name="connection_local_display_name">kapcsolat %1$d</string>
<string name="status_contact_has_e2e_encryption">az ismerős e2e titkosítással rendelkezik</string>
<string name="v5_4_incognito_groups_descr">Csoport létrehozása véletlenszerű profillal.</string>
<string name="delete_contact_all_messages_deleted_cannot_undo_warning">Az ismerős és az összes üzenet törlésre kerül - ez a művelet nem vonható vissza!</string>
<string name="contacts_can_mark_messages_for_deletion">Az ismerősei törlésre jelölhetnek üzeneteket; Ön majd meg tudja nézni azokat.</string>
<string name="contacts_can_mark_messages_for_deletion">Az ismerősei törlésre jelölhetnek üzeneteket; ön majd meg tudja nézni azokat.</string>
<string name="connect_via_invitation_link">Kapcsolódás egyszer használható hivatkozással?</string>
<string name="connect_via_link_or_qr">Kapcsolódás egy hivatkozáson vagy QR-kódon keresztül</string>
<string name="connection_error_auth">Kapcsolódási hiba (AUTH)</string>
<string name="notification_preview_mode_contact">Csak név</string>
<string name="notification_preview_mode_contact">Ismerős neve</string>
<string name="connect_via_contact_link">Kapcsolódik a kapcsolattartási címen keresztül?</string>
<string name="create_address">Cím létrehozása</string>
<string name="copy_verb">Másolás</string>
@@ -338,10 +338,10 @@
<string name="delete_image">Kép törlése</string>
<string name="smp_server_test_create_file">Fájl létrehozása</string>
<string name="create_secret_group_title">Tikos csoport létrehozása</string>
<string name="clear_contacts_selection_button">Elvetés</string>
<string name="clear_contacts_selection_button">Kiürítés</string>
<string name="delete_contact_question">Ismerős törlése?</string>
<string name="clear_verb">Kiürítés</string>
<string name="create_address_and_let_people_connect">Cím létrehozása, hogy az emberek kapcsolatba léphessenek Önnel.</string>
<string name="create_address_and_let_people_connect">Cím létrehozása, hogy az emberek kapcsolatba léphessenek önnel.</string>
<string name="v4_4_verify_connection_security_desc">Biztonsági kódok összehasonlítása az ismerősökével.</string>
<string name="smp_server_test_compare_file">Fájl-összehasonlítás</string>
<string name="your_chats">Csevegések</string>
@@ -421,7 +421,7 @@
<string name="blocked_items_description">%d üzenet letiltva</string>
<string name="info_row_disappears_at">Eltűnik ekkor:</string>
<string name="ttl_weeks">%d hét</string>
<string name="feature_enabled_for_you">engedélyezve az Ön számára</string>
<string name="feature_enabled_for_you">engedélyezve az ön számára</string>
<string name="timed_messages">Eltűnő üzenetek</string>
<string name="delete_group_menu_action">Törlés</string>
<string name="delete_and_notify_contact">Törlés, és az ismerős értesítése</string>
@@ -495,7 +495,7 @@
<string name="marked_deleted_items_description">%d üzenet megjelölve törlésre</string>
<string name="conn_event_ratchet_sync_allowed">titkosítás újra egyeztetése engedélyezve</string>
<string name="enable_self_destruct">Önmegsemmisítés engedélyezése</string>
<string name="v5_2_favourites_filter_descr">Olvasatlan és kedvenc csevegésekre való szűrés.</string>
<string name="v5_2_favourites_filter_descr">Olvasatlan és csillagozott csevegésekre való szűrés.</string>
<string name="failed_to_parse_chats_title">A csevegések betöltése sikertelen</string>
<string name="connect_plan_group_already_exists">A csoport már létezik!</string>
<string name="v4_4_french_interface">Francia kezelőfelület</string>
@@ -512,16 +512,16 @@
<string name="icon_descr_group_inactive">A csoport inaktív</string>
<string name="v5_0_large_files_support_descr">Gyors és nem kell várni, amíg a feladó online lesz!</string>
<string name="error_joining_group">Hiba a csoporthoz való csatlakozáskor</string>
<string name="favorite_chat">Kedvenc</string>
<string name="favorite_chat">Csillag</string>
<string name="v4_6_group_moderation">Csoport moderáció</string>
<string name="choose_file">Fájl</string>
<string name="group_link">Csoporthivatkozás</string>
<string name="snd_conn_event_ratchet_sync_required">titkosítás-újraegyeztetés szükséges ehhez: %s</string>
<string name="failed_to_active_user_title">Hiba a profilváltáskor!</string>
<string name="failed_to_active_user_title">Hiba a profil váltásakor!</string>
<string name="settings_experimental_features">Kísérleti funkciók</string>
<string name="receipts_contacts_enable_keep_overrides">Engedélyezés (felülírások megtartásával)</string>
<string name="enter_correct_passphrase">Adja meg a helyes jelmondatot.</string>
<string name="delete_group_for_self_cannot_undo_warning">A csoport törlésre kerül az Ön számára - ez a művelet nem vonható vissza!</string>
<string name="delete_group_for_self_cannot_undo_warning">A csoport törlésre kerül az ön számára - ez a művelet nem vonható vissza!</string>
<string name="encrypt_database_question">Adatbázis titkosítása?</string>
<string name="allow_accepting_calls_from_lock_screen">A zárolási képernyőn megjelenő hívások engedélyezése a Beállításokban.</string>
<string name="conn_event_ratchet_sync_agreed">titkosítás elfogadva</string>
@@ -624,7 +624,7 @@
<string name="v4_6_hidden_chat_profiles">Rejtett csevegési profilok</string>
<string name="files_and_media_section">Fájlok és médiatartalmak</string>
<string name="image_saved">A kép mentve a „Galériába”</string>
<string name="hide_notification">Elrejtés</string>
<string name="hide_notification">Elrejt</string>
<string name="la_immediately">Azonnal</string>
<string name="files_and_media_prohibited">A fájlok- és a médiatartalmak küldése le van tiltva!</string>
<string name="hide_profile">Profil elrejtése</string>
@@ -636,18 +636,18 @@
<string name="incompatible_database_version">Nem kompatibilis adatbázis-verzió</string>
<string name="how_simplex_works">Hogyan működik a SimpleX</string>
<string name="desktop_incompatible_version">Nem kompatibilis verzió</string>
<string name="user_hide">Elrejtés</string>
<string name="user_hide">Elrejt</string>
<string name="incoming_video_call">Bejövő videóhívás</string>
<string name="incorrect_passcode">Téves jelkód</string>
<string name="onboarding_notifications_mode_service">Azonnali</string>
<string name="v5_4_incognito_groups">Inkognitócsoportok</string>
<string name="v5_4_incognito_groups">Inkognitó csoportok</string>
<string name="how_to">Hogyan</string>
<string name="hide_verb">Elrejtés</string>
<string name="hide_verb">Elrejt</string>
<string name="gallery_image_button">Kép</string>
<string name="v4_3_improved_privacy_and_security">Fejlesztett adatvédelem és biztonság</string>
<string name="ignore">Mellőzés</string>
<string name="icon_descr_image_snd_complete">Kép elküldve</string>
<string name="notification_preview_mode_hidden">Se név, se üzenet</string>
<string name="notification_preview_mode_hidden">Rejtett</string>
<string name="host_verb">Kiszolgáló</string>
<string name="initial_member_role">Kezdeti szerepkör</string>
<string name="invalid_chat">érvénytelen csevegés</string>
@@ -657,7 +657,7 @@
<string name="v4_3_improved_privacy_and_security_desc">Alkalmazás képernyőjének elrejtése a gyakran használt alkalmazások között.</string>
<string name="v4_3_improved_server_configuration">Javított kiszolgáló konfiguráció</string>
<string name="edit_history">Előzmények</string>
<string name="hidden_profile_password">Rejtett profiljelszó</string>
<string name="hidden_profile_password">Rejtett profil jelszó</string>
<string name="import_database">Adatbázis importálása</string>
<string name="import_database_confirmation">Importálás</string>
<string name="icon_descr_instant_notifications">Azonnali értesítések</string>
@@ -668,7 +668,7 @@
<string name="image_descr">Kép</string>
<string name="files_are_prohibited_in_group">A fájlok- és a médiatartalmak le vannak tiltva ebben a csoportban.</string>
<string name="how_it_works">Hogyan működik</string>
<string name="hide_dev_options">Elrejtés:</string>
<string name="hide_dev_options">Elrejt:</string>
<string name="error_creating_member_contact">Hiba az ismerőssel történő kapcsolat létrehozásában</string>
<string name="enter_one_ICE_server_per_line">ICE-kiszolgálók (soronként egy)</string>
<string name="if_you_cannot_meet_in_person_scan_QR_in_video_call_or_ask_for_invitation_link"><![CDATA[Ha nem tud személyesen találkozni, <b>beolvashatja a QR-kódot a videohívásban</b>, vagy az ismerőse megoszthat egy meghívó-hivatkozást.]]></string>
@@ -698,7 +698,7 @@
<string name="theme_light">Világos</string>
<string name="delete_message_cannot_be_undone_warning">Az üzenet törlésre kerül - ez a művelet nem vonható vissza!</string>
<string name="markdown_help">Markdown segítség</string>
<string name="notification_preview_new_message">Rejtett üzenet</string>
<string name="notification_preview_new_message">új üzenet</string>
<string name="old_database_archive">Régi adatbázis-archívum</string>
<string name="network_settings_title">Speciális beállítások</string>
<string name="no_info_on_delivery">Nincs kézbesítési információ</string>
@@ -715,7 +715,7 @@
<string name="v5_2_fix_encryption">Kapcsolatok megtartása</string>
<string name="button_add_members">Tagok meghívása</string>
<string name="message_reactions">Üzenetreakciók</string>
<string name="only_one_device_can_work_at_the_same_time">Egyszerre csak 1 eszköz működhet</string>
<string name="only_one_device_can_work_at_the_same_time">Egyszerre csak egy eszköz működhet</string>
<string name="connect_plan_join_your_group">Csatlakozik a csoportjához?</string>
<string name="large_file">Nagy fájl!</string>
<string name="info_row_local_name">Helyi név</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 küldése le van tiltva ebben a csevegésben.</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 az ismerőse 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 számítógép-alkalmazás!</string>
<string name="v4_6_group_moderation_descr">Most már az adminok is:
\n- törölhetik a tagok üzeneteit.
@@ -752,7 +752,7 @@
<string name="notification_new_contact_request">Új kapcsolatkérés</string>
<string name="joining_group">Csatlakozás a csoporthoz</string>
<string name="linked_desktop_options">Társított számítógép beállítások</string>
<string name="rcv_group_event_invited_via_your_group_link">meghíva az Ön csoporthivatkozásán keresztül</string>
<string name="rcv_group_event_invited_via_your_group_link">meghíva az ön csoporthivatkozásán keresztül</string>
<string name="rcv_group_event_member_left">elhagyta a csoportot</string>
<string name="linked_desktops">Társított számítógépek</string>
<string name="la_no_app_password">Nincs alkalmazás jelkód</string>
@@ -769,12 +769,13 @@
<string name="v5_2_disappear_one_message">Egy üzenet eltüntetése</string>
<string name="v4_3_irreversible_message_deletion">Végleges üzenettörlés</string>
<string name="videos_limit_desc">Egyszerre csak 10 videó küldhető el</string>
<string name="only_you_can_add_message_reactions">Csak Ön adhat hozzá üzenetreakciókat.</string>
<string name="only_you_can_add_message_reactions">Csak ön adhat hozzá üzenetreakciókat.</string>
<string name="group_member_status_left">elhagyta a csoportot</string>
<string name="message_deletion_prohibited">Az üzenetek végleges törlése le van tiltva ebben a csevegésben.</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 kapcsolattartási címhivatkozáson keresztül</string>
<string name="network_use_onion_hosts_required_desc">Onion-kiszolgálók szükségesek a kapcsolódáshoz.\nMegjegyzés: .onion cím nélkül nem fog tudni kapcsolódni a kiszolgálókhoz.</string>
<string name="description_via_contact_address_link_incognito">inkognitó a kapcsolattartási cím-hivatkozáson keresztül</string>
<string name="network_use_onion_hosts_required_desc">Az onion-kiszolgálók szükségesek a kapcsolódáshoz.
\nMegjegyzés: .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>
<string name="messages_section_title">Üzenetek</string>
@@ -823,7 +824,10 @@
<string name="button_leave_group">Csoport elhagyása</string>
<string name="unblock_member_desc">Minden %s által írt üzenet megjelenik!</string>
<string name="many_people_asked_how_can_it_deliver"><![CDATA[Sokan kérdezték: <i>Ha a SimpleX Chatnek nincs felhasználói azonosítója, hogyan lehet mégis üzeneteket küldeni?</i>]]></string>
<string name="alert_text_skipped_messages_it_can_happen_when">Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Az üzenet visszafejtése sikertelen volt, mert Ön, vagy az ismerőse régebbi adatbázis biztonsági mentést használt.\n3. A kapcsolat sérült.</string>
<string name="alert_text_skipped_messages_it_can_happen_when">Ez akkor fordulhat elő, ha:
\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.
\n2. Az üzenet visszafejtése sikertelen volt, mert ön, vagy az ismerőse régebbi adatbázis biztonsági mentést használt.
\n3. A kapcsolat sérült.</string>
<string name="group_member_role_observer">megfigyelő</string>
<string name="description_via_group_link_incognito">inkognitó a csoporthivatkozáson keresztül</string>
<string name="network_use_onion_hosts_prefer_desc">Onion-kiszolgálók használata, ha azok rendelkezésre állnak.</string>
@@ -853,7 +857,7 @@
<string name="callstatus_missed">nem fogadott hívás</string>
<string name="database_migrations">Átköltöztetés: %s</string>
<string name="in_reply_to">Válaszul erre:</string>
<string name="notification_preview_mode_message">Név és üzenet</string>
<string name="notification_preview_mode_message">Üzenet szövege</string>
<string name="notifications_will_be_hidden">Az értesítések csak az alkalmazás bezárásáig érkeznek!</string>
<string name="info_menu">Információ</string>
<string name="settings_section_title_messages">ÜZENETEK ÉS FÁJLOK</string>
@@ -870,22 +874,24 @@
<string name="invite_to_group_button">Meghívás a csoportba</string>
<string name="lock_after">Zárolás miután</string>
<string name="incoming_audio_call">Bejövő hanghívás</string>
<string name="keychain_error">Kulcstartóhiba</string>
<string name="keychain_error">Kulcstartó hiba</string>
<string name="join_group_question">Csatlakozik a csoporthoz?</string>
<string name="incognito_info_protects">Az inkognitómód védi személyes adatait azáltal, hogy minden ismerőshöz új véletlenszerű profilt használ.</string>
<string name="v5_2_more_things_descr">- stabilabb üzenetkézbesítés.\n- picit továbbfejlesztett csoportok.\n- és még sok más!</string>
<string name="v5_2_more_things_descr">- stabilabb üzenetkézbesítés.
\n- valamivel jobb csoportok.
\n- és még sok más!</string>
<string name="v5_1_message_reactions">Üzenetreakciók</string>
<string name="no_connected_mobile">Nincs társított hordozható eszköz</string>
<string name="network_status">Hálózat állapota</string>
<string name="new_passcode">Új jelkód</string>
<string name="message_delivery_error_desc">Valószínűleg ez az ismerős törölte Önnel a kapcsolatot.</string>
<string name="message_delivery_error_desc">Valószínűleg ez az ismerős törölte önnel a kapcsolatot.</string>
<string name="join_group_incognito_button">Csatlakozás inkognitóban</string>
<string name="open_chat">Csevegés megnyitása</string>
<string name="callstatus_rejected">elutasított hívás</string>
<string name="onboarding_notifications_mode_periodic">Rendszeres</string>
<string name="feature_received_prohibited">fogadott, tiltott</string>
<string name="connect_plan_repeat_connection_request">Kapcsolatkérés megismétlése?</string>
<string name="only_you_can_delete_messages">Véglegesen csak Ön törölhet üzeneteket (ismerőse csak törlésre jelölheti őket ). (24 óra)</string>
<string name="only_you_can_delete_messages">Véglegesen csak ön törölhet üzeneteket (ismerőse csak törlésre jelölheti őket ). (24 óra)</string>
<string name="role_in_group">Szerepkör</string>
<string name="simplex_link_contact">SimpleX-kapcsolattartási-cím</string>
<string name="stop_file__confirm">Megállítás</string>
@@ -895,7 +901,7 @@
<string name="rcv_group_event_open_chat">Megnyitás</string>
<string name="network_option_protocol_timeout">Protokoll időtúllépés</string>
<string name="secret_text">titkos</string>
<string name="settings_notification_preview_mode_title">Értesítés előnézete</string>
<string name="settings_notification_preview_mode_title">Üzenetek előnézetének megjelenítése</string>
<string name="callstate_waiting_for_confirmation">várakozás a visszaigazolásra…</string>
<string name="stop_file__action">Fájl megállítása</string>
<string name="description_via_group_link">a csoporthivatkozáson keresztül</string>
@@ -908,7 +914,7 @@
<string name="alert_text_fragment_please_report_to_developers">Jelentse a fejlesztőknek.</string>
<string name="people_can_connect_only_via_links_you_share">Ön dönti el, hogy kivel beszélget.</string>
<string name="prohibit_sending_disappearing">Az eltűnő üzenetek küldése le van tiltva.</string>
<string name="only_you_can_send_voice">Csak Ön tud hangüzeneteket küldeni.</string>
<string name="only_you_can_send_voice">Csak ön tud hangüzeneteket küldeni.</string>
<string name="update_network_settings_confirmation">Frissítés</string>
<string name="icon_descr_video_snd_complete">Videó elküldve</string>
<string name="update_database_passphrase">Adatbázis-jelmondat megváltoztatása</string>
@@ -916,7 +922,7 @@
<string name="passcode_not_changed">A jelkód nem változott!</string>
<string name="refresh_qr_code">Frissítés</string>
<string name="custom_time_picker_select">Kiválasztás</string>
<string name="only_you_can_make_calls">Csak Ön tud hívásokat indítani.</string>
<string name="only_you_can_make_calls">Csak ön tud hívásokat indítani.</string>
<string name="smp_server_test_secure_queue">Biztonságos sorbaállítás</string>
<string name="rate_the_app">Értékelje az alkalmazást</string>
<string name="share_invitation_link">Egyszer használható hivatkozás megosztása</string>
@@ -940,9 +946,9 @@
<string name="connect_via_link_or_qr_from_clipboard_or_in_person">(beolvasás, vagy beillesztés a vágólapról)</string>
<string name="waiting_for_video">Várakozás a videóra</string>
<string name="reply_verb">Válasz</string>
<string name="connect_plan_this_is_your_own_one_time_link">Ez az Ön egyszer használható hivatkozása!</string>
<string name="connect_plan_this_is_your_own_one_time_link">Ez az ön egyszer használható hivatkozása!</string>
<string name="ntf_channel_calls">SimpleX Chat hívások</string>
<string name="connect_use_new_incognito_profile">Új inkognitóprofil használata</string>
<string name="connect_use_new_incognito_profile">Új inkogní profil használata</string>
<string name="contact_developers">Frissítse az alkalmazást, és lépjen kapcsolatba a fejlesztőkkel.</string>
<string name="theme_simplex">SimpleX</string>
<string name="send_link_previews">Hivatkozás előnézete</string>
@@ -994,7 +1000,7 @@
<string name="smp_servers_your_server">Saját SMP-kiszolgáló</string>
<string name="random_port">Véletlen</string>
<string name="share_with_contacts">Megosztás az ismerősökkel</string>
<string name="sender_you_pronoun">Ön</string>
<string name="sender_you_pronoun">ön</string>
<string name="you_have_no_chats">Nincsenek csevegései</string>
<string name="send_disappearing_message_send">Küldés</string>
<string name="chat_item_ttl_seconds">%s másodperc</string>
@@ -1042,7 +1048,7 @@
<string name="settings_section_title_support">SIMPLEX CHAT TÁMOGATÁSA</string>
<string name="simplex_service_notification_title">SimpleX Chat szolgáltatás</string>
<string name="observer_cant_send_message_title">Nem lehet üzeneteket küldeni!</string>
<string name="is_verified">%s hitelesítve</string>
<string name="is_verified">%s ellenőrzött</string>
<string name="password_to_show">Jelszó megjelenítése</string>
<string name="privacy_and_security">Adatvédelem és biztonság</string>
<string name="button_remove_member">Eltávolítás</string>
@@ -1054,7 +1060,7 @@
<string name="group_welcome_title">Üdvözlőüzenet</string>
<string name="network_option_seconds_label">mp</string>
<string name="profile_update_will_be_sent_to_contacts">A profilfrissítés elküldésre került az ismerősök számára.</string>
<string name="v5_3_simpler_incognito_mode">Egyszerűsített inkognitómód</string>
<string name="v5_3_simpler_incognito_mode">Egyszerűsített inkogní mód</string>
<string name="save_welcome_message_question">Üdvözlőüzenet mentése?</string>
<string name="restart_the_app_to_create_a_new_chat_profile">Új csevegési fiók létrehozásához indítsa újra az alkalmazást.</string>
<string name="toast_permission_denied">Engedély megtagadva!</string>
@@ -1064,7 +1070,7 @@
<string name="enter_passphrase_notification_title">Jelmondat szükséges</string>
<string name="onboarding_notifications_mode_title">Privát értesítések</string>
<string name="you_invited_a_contact">Meghívta egy ismerősét</string>
<string name="is_not_verified">%s nincs hitelesítve</string>
<string name="is_not_verified">%s nincs ellenőrizve</string>
<string name="contact_tap_to_connect">Koppintson a kapcsolódáshoz</string>
<string name="this_device_name">Ennek az eszköznek a neve</string>
<string name="your_current_profile">Jelenlegi profil</string>
@@ -1074,9 +1080,9 @@
<string name="ntf_channel_messages">SimpleX Chat üzenetek</string>
<string name="restore_database_alert_confirm">Visszaállítás</string>
<string name="setup_database_passphrase">Adatbázis-jelmondat beállítása</string>
<string name="color_sent_message">Üzenetbuborék színe</string>
<string name="color_sent_message">Elküldött üzenet</string>
<string name="notifications_mode_periodic">Időszakosan indul</string>
<string name="connect_plan_this_is_your_own_simplex_address">Ez az Ön SimpleX-címe!</string>
<string name="connect_plan_this_is_your_own_simplex_address">Ez az ön SimpleX-címe!</string>
<string name="group_member_status_removed">eltávolítva</string>
<string name="share_link">Megosztás</string>
<string name="icon_descr_simplex_team">SimpleX csapat</string>
@@ -1134,8 +1140,8 @@
<string name="waiting_for_image">Várakozás a képre</string>
<string name="v4_3_voice_messages">Hangüzenetek</string>
<string name="button_remove_member_question">Biztosan eltávolítja?</string>
<string name="verify_security_code">Biztonsági kód hitelesítése</string>
<string name="rcv_group_event_user_deleted">eltávolította Önt</string>
<string name="verify_security_code">Biztonsági kód ellenőrzése</string>
<string name="rcv_group_event_user_deleted">eltávolította önt</string>
<string name="simplex_address">SimpleX-cím</string>
<string name="show_dev_options">Megjelenítés:</string>
<string name="callstate_received_answer">válasz fogadása…</string>
@@ -1149,7 +1155,7 @@
<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">A hangüzenetek küldése le van tiltva.</string>
<string name="privacy_show_last_messages">Szobák utolsó üzeneteinek megjelenítése a listanézetben</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>
<string name="passcode_changed">A jelkód megváltozott!</string>
@@ -1175,9 +1181,9 @@
<string name="alert_title_skipped_messages">Kihagyott üzenetek</string>
<string name="prohibit_sending_voice_messages">A hangüzenetek küldése le van tiltva.</string>
<string name="set_contact_name">Ismerős nevének beállítása</string>
<string name="only_you_can_send_disappearing">Csak Ön tud eltűnő üzeneteket küldeni.</string>
<string name="only_you_can_send_disappearing">Csak ön tud eltűnő üzeneteket küldeni.</string>
<string name="share_image">Média megosztása…</string>
<string name="group_info_member_you">Ön: %1$s</string>
<string name="group_info_member_you">ön: %1$s</string>
<string name="your_preferences">Beállítások</string>
<string name="reset_color">Színek visszaállítása</string>
<string name="network_options_save">Mentés</string>
@@ -1195,7 +1201,7 @@
<string name="protect_app_screen">Alkalmazás képernyőjének védelme</string>
<string name="show_QR_code">QR-kód megjelenítése</string>
<string name="icon_descr_video_call">videóhívás</string>
<string name="unfavorite_chat">Kedvenc megszüntetése</string>
<string name="unfavorite_chat">Csillagozás megszüntetése</string>
<string name="send_receipts">Kézbesítési jelentések küldése</string>
<string name="icon_descr_address">SimpleX-cím</string>
<string name="chat_help_tap_button">Koppintson a</string>
@@ -1215,7 +1221,7 @@
<string name="save_verb">Mentés</string>
<string name="call_connection_via_relay">közvetítő-kiszolgálón keresztül</string>
<string name="stop_sharing">Megosztás megállítása</string>
<string name="snd_group_event_member_deleted">Ön eltávolította őt: %1$s</string>
<string name="snd_group_event_member_deleted">eltávolította őt: %1$s</string>
<string name="save_passphrase_and_open_chat">Jelmondat mentése és a csevegés megnyitása</string>
<string name="save_preferences_question">Beállítások mentése?</string>
<string name="first_platform_without_user_ids">Nincsenek felhasználói azonosítók.</string>
@@ -1251,12 +1257,12 @@
<string name="reset_verb">Visszaállítás</string>
<string name="only_your_contact_can_add_message_reactions">Csak az ismerőse tud üzenetreakciókat küldeni.</string>
<string name="voice_messages">Hangüzenetek</string>
<string name="snd_group_event_user_left">Ön elhagyta a csoportot</string>
<string name="snd_group_event_user_left">elhagyta a csoportot</string>
<string name="icon_descr_record_voice_message">Hangüzenet rögzítése</string>
<string name="auth_simplex_lock_turned_on">SimpleX-zár bekapcsolva</string>
<string name="member_contact_send_direct_message">közvetlen üzenet küldése</string>
<string name="scan_from_mobile">Beolvasás hordozható eszközről</string>
<string name="verify_connections">Kapcsolatok hitelesítése</string>
<string name="verify_connections">Kapcsolatok ellenőrzése</string>
<string name="share_message">Üzenet megosztása…</string>
<string name="custom_time_unit_seconds">másodperc</string>
<string name="lock_not_enabled">A SimpleX-zár nincs bekapcsolva!</string>
@@ -1265,15 +1271,15 @@
<string name="your_chat_database">Csevegési adatbázis</string>
<string name="rcv_group_event_member_deleted">eltávolította őt: %1$s</string>
<string name="smp_servers_test_failed">Sikertelen kiszolgáló teszt!</string>
<string name="verify_connection">Kapcsolat hitelesítése</string>
<string name="verify_connection">Kapcsolat ellenőrzése</string>
<string name="whats_new_read_more">Tudjon meg többet</string>
<string name="sender_cancelled_file_transfer">A fájl küldője visszavonta az átvitelt.</string>
<string name="stop_chat_question">Csevegési szolgáltatás megállítása?</string>
<string name="info_row_received_at">Fogadva ekkor:</string>
<string name="accept_feature_set_1_day">Beállítva 1 nap</string>
<string name="user_unhide">Felfedés</string>
<string name="color_received_message">Fogadott üzenetbuborék színe</string>
<string name="only_your_contact_can_delete">Csak az ismerőse tudja az üzeneteket véglegesen törölni (Ön csak törlésre jelölheti meg azokat). (24 óra)</string>
<string name="color_received_message">Fogadott üzenet</string>
<string name="only_your_contact_can_delete">Csak az ismerőse tudja az üzeneteket véglegesen törölni (ön csak törlésre jelölheti meg azokat). (24 óra)</string>
<string name="self_destruct_passcode_changed">Az önmegsemmisítési jelkód megváltozott!</string>
<string name="using_simplex_chat_servers">SimpleX Chat-kiszolgálók használatban.</string>
<string name="use_simplex_chat_servers__question">SimpleX Chat-kiszolgálók használata?</string>
@@ -1292,7 +1298,7 @@
\nkövetkező generációja</string>
<string name="update_network_settings_question">Hálózati beállítások megváltoztatása?</string>
<string name="waiting_for_mobile_to_connect">Várakozás a hordozható eszköz társítására:</string>
<string name="v4_4_verify_connection_security">Biztonságos kapcsolat hitelesítése</string>
<string name="v4_4_verify_connection_security">Kapcsolat biztonságának ellenőrzése</string>
<string name="sending_files_not_yet_supported">fájlok küldése egyelőre még nem támogatott</string>
<string name="snd_conn_event_switch_queue_phase_completed_for_member">cím megváltoztatva nála: %s</string>
<string name="receiving_files_not_yet_supported">fájlok fogadása egyelőre még nem támogatott</string>
@@ -1314,7 +1320,7 @@
<string name="database_initialization_error_desc">Az adatbázis nem működik megfelelően. Koppintson további információért</string>
<string name="stop_snd_file__message">A fájl küldése leállt.</string>
<string name="trying_to_connect_to_server_to_receive_messages">Kapcsolódási kísérlet ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál.</string>
<string name="la_could_not_be_verified">Nem sikerült hitelesíteni; próbálja meg újra.</string>
<string name="la_could_not_be_verified">Nem sikerült ellenőrizni; próbálja meg újra.</string>
<string name="moderate_message_will_be_marked_warning">Az üzenet minden tag számára moderáltként lesz megjelölve.</string>
<string name="enter_passphrase_notification_desc">Értesítések fogadásához adja meg az adatbázis jelmondatát</string>
<string name="error_smp_test_failed_at_step">A teszt a(z) %s lépésnél sikertelen volt.</string>
@@ -1345,13 +1351,13 @@
<string name="video_will_be_received_when_contact_completes_uploading">A videó akkor érkezik meg, amikor a küldője befejezte annak feltöltését.</string>
<string name="description_you_shared_one_time_link_incognito">egyszer használható hivatkozást osztott meg inkognitóban</string>
<string name="connected_to_server_to_receive_messages_from_contact">Már kapcsolódott ahhoz a kiszolgálóhoz, amely az adott ismerősétől érkező üzenetek fogadására szolgál.</string>
<string name="you_can_enable_delivery_receipts_later">Később engedélyezheti a Beállításokban</string>
<string name="you_can_enable_delivery_receipts_later">Később engedélyezheti a Beállításokban</string>
<string name="you_will_be_connected_when_group_host_device_is_online">Akkor lesz kapcsolódva a csoporthoz, amikor a csoport tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!</string>
<string name="mtr_error_different">különböző átköltöztetés az alkalmazásban/adatbázisban: %s / %s</string>
<string name="connect_plan_you_are_already_connecting_to_vName"><![CDATA[A kapcsolódás már folyamatban van ehhez: <b>%1$s</b>.]]></string>
<string name="unhide_profile">Profil felfedése</string>
<string name="this_link_is_not_a_valid_connection_link">Ez nem egy érvényes kapcsolattartási hivatkozás!</string>
<string name="to_verify_compare">A végpontok közötti titkosítás hitelesítéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) az ismerőse eszközén lévő kóddal.</string>
<string name="to_verify_compare">A végpontok közötti titkosítás ellenőrzéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) az ismerőse eszközén lévő kóddal.</string>
<string name="you_must_use_the_most_recent_version_of_database">A csevegési adatbázis legfrissebb verzióját CSAK egy eszközön kell használnia, ellenkező esetben előfordulhat, hogy az üzeneteket nem fogja megkapni valamennyi ismerősétől.</string>
<string name="messages_section_description">Ez a beállítás a jelenlegi csevegési profilban lévő üzenetekre érvényes</string>
<string name="you_are_invited_to_group_join_to_connect_with_group_members">Meghívást kapott a csoportba. Csatlakozzon, hogy kapcsolatba léphessen a csoport tagjaival.</string>
@@ -1367,7 +1373,7 @@
<string name="invite_prohibited_description">Egy olyan ismerősét próbálja meghívni, akivel inkognitó-profilt osztott meg abban a csoportban, amelyben a saját fő profilja van használatban</string>
<string name="connect_plan_you_are_already_joining_the_group_vName"><![CDATA[A csatlakozás már folyamatban van a(z) <b>%1$s</b> nevű csoporthoz.]]></string>
<string name="onboarding_notifications_mode_off">Amikor az alkalmazás fut</string>
<string name="alert_title_cant_invite_contacts_descr">Inkognitóprofilt használ ehhez a csoporthoz - fő profilja megosztásának elkerülése érdekében a meghívók küldése le van tiltva</string>
<string name="alert_title_cant_invite_contacts_descr">Inkogní profilt használ ehhez a csoporthoz - fő profilja megosztásának elkerülése érdekében a meghívók küldése le van tiltva</string>
<string name="v4_5_transport_isolation">Kapcsolat izolációs mód</string>
<string name="you_will_be_connected_when_your_connection_request_is_accepted">Akkor lesz kapcsolódva, ha a kapcsolatkérése elfogadásra kerül, várjon, vagy ellenőrizze később!</string>
<string name="voice_messages_are_prohibited">A hangüzenetek küldése le van tiltva ebben a csoportban.</string>
@@ -1381,10 +1387,10 @@
<string name="you_will_be_connected_when_your_contacts_device_is_online">Akkor lesz kapcsolódva, amikor az ismerősének eszköze online lesz, várjon, vagy ellenőrizze később!</string>
<string name="v5_4_block_group_members_descr">Kéretlen üzenetek elrejtése.</string>
<string name="disable_onion_hosts_when_not_supported"><![CDATA[Állítsa az <i>Onion kiszolgálók használata</i> opciót „Nemre”, ha a SOCKS proxy nem támogatja őket.]]></string>
<string name="you_can_share_your_address">Megoszthatja a címét egy hivatkozásként vagy egy QR-kódként így bárki kapcsolódhat Önhöz.</string>
<string name="you_can_share_your_address">Megoszthatja a címét egy hivatkozásként vagy egy QR-kódként így bárki kapcsolódhat önhöz.</string>
<string name="you_can_create_it_later">Létrehozás később</string>
<string name="your_profile_is_stored_on_device_and_shared_only_with_contacts_simplex_cannot_see_it">A profilja az eszközén van tárolva és csak az ismerőseivel kerül megosztásra. A SimpleX-kiszolgálók nem láthatják a profilját.</string>
<string name="snd_group_event_changed_member_role">Ön megváltoztatta %s szerepkörét erre: %s</string>
<string name="snd_group_event_changed_member_role">%s szerepkörét megváltoztatta erre: %s</string>
<string name="you_rejected_group_invitation">Csoportmeghívó elutasítva</string>
<string name="to_protect_privacy_simplex_has_ids_for_queues">Az adatvédelem érdekében, a más csevegési platformokon megszokott felhasználói azonosítók helyett, a SimpleX csak az üzenetek sorbaállításához használ azonosítókat, minden egyes ismerőshöz egy-egy különbözőt.</string>
<string name="to_share_with_your_contact">(a megosztáshoz az ismerősével)</string>
@@ -1413,28 +1419,28 @@
<string name="connect_plan_you_are_already_connecting_via_this_one_time_link">A kapcsolódás már folyamatban van ezen az egyszer használható hivatkozáson keresztül!</string>
<string name="you_wont_lose_your_contacts_if_delete_address">Nem veszíti el az ismerőseit, ha később törli a címét.</string>
<string name="updating_settings_will_reconnect_client_to_all_servers">A beállítások frissítése a kiszolgálókhoz való újra kapcsolódással jár.</string>
<string name="contact_wants_to_connect_with_you">kapcsolatba akar lépni Önnel!</string>
<string name="snd_group_event_changed_role_for_yourself">saját szerepköre megváltozott erre: %s</string>
<string name="contact_wants_to_connect_with_you">kapcsolatba akar lépni önnel!</string>
<string name="snd_group_event_changed_role_for_yourself">saját szerepköre erre változott: %s</string>
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">A csevegési szolgáltatás elindítható a „Beállítások / Adatbázis” menüben vagy az alkalmazás újraindításával.</string>
<string name="verify_code_on_mobile">Kód hitelesítése a hordozható eszközön</string>
<string name="verify_code_on_mobile">Kód ellenőrzése a hordozható eszközön</string>
<string name="youve_accepted_group_invitation_connecting_to_inviting_group_member">Csatlakozott ehhez a csoporthoz. Kapcsolódás a meghívó csoporttaghoz.</string>
<string name="you_can_connect_to_simplex_chat_founder"><![CDATA[Kapcsolatba léphet <font color="#0088ff">a SimpleX Chat fejlesztőivel, ahol bármiről kérdezhet és értesülhet az újdonságokról</font>.]]></string>
<string name="v4_2_auto_accept_contact_requests_desc">Nem kötelező üdvözlőüzenettel.</string>
<string name="unknown_database_error_with_info">Ismeretlen adatbázishiba: %s</string>
<string name="you_can_hide_or_mute_user_profile">Elrejtheti vagy lenémíthatja a felhasználó profiljait - koppintson (vagy számítógép-alkalmazásban kattintson) hosszan a profilra a felugró menühöz.</string>
<string name="v5_3_simpler_incognito_mode_descr">Inkognitómód használata kapcsolódáskor.</string>
<string name="v5_3_simpler_incognito_mode_descr">Inkogní mód kapcsolódáskor.</string>
<string name="you_can_share_group_link_anybody_will_be_able_to_connect">Megoszthat egy hivatkozást vagy QR-kódot - így bárki csatlakozhat a csoporthoz. Ha a csoport később törlésre kerül, akkor nem fogja elveszíteni annak tagjait.</string>
<string name="you_joined_this_group">Csatlakozott ehhez a csoporthoz</string>
<string name="connect_plan_this_is_your_link_for_group_vName"><![CDATA[Ez az Ön hivatkozása a(z) <b>%1$s</b> csoporthoz!]]></string>
<string name="connect_plan_this_is_your_link_for_group_vName"><![CDATA[Ez az ön hivatkozása a(z) <b>%1$s</b> csoporthoz!]]></string>
<string name="voice_prohibited_in_this_chat">A hangüzenetek küldése le van tiltva ebben a csevegésben.</string>
<string name="you_control_your_chat">Ön irányítja csevegését!</string>
<string name="verify_code_with_desktop">Kód hitelesítése a számítógépen</string>
<string name="verify_code_with_desktop">Kód ellenőrzése a számítógépen</string>
<string name="v4_5_private_filenames_descr">Az időzóna védelme érdekében a kép-/hangfájlok UTC-t használnak.</string>
<string name="connect_via_member_address_alert_desc">A kapcsolatkérés elküldésre kerül ezen csoporttag számára.</string>
<string name="incognito_info_share">Inkognitó-profil megosztása esetén a rendszer azt a profilt fogja használni azokhoz a csoportokhoz, amelyekbe meghívást kapott.</string>
<string name="connect_plan_you_have_already_requested_connection_via_this_address">Már küldött egy kapcsolatkérést ezen a címen keresztül!</string>
<string name="you_can_share_this_address_with_your_contacts">Megoszthatja ezt a SimpleX-címet az ismerőseivel, hogy kapcsolatba léphessenek vele: %s.</string>
<string name="you_can_accept_or_reject_connection">Amikor az emberek kapcsolatot kérnek, Ön elfogadhatja vagy elutasíthatja azokat.</string>
<string name="you_can_accept_or_reject_connection">Amikor az emberek kapcsolatot kérnek, ön elfogadhatja vagy elutasíthatja azokat.</string>
<string name="v4_6_group_welcome_message_descr">Megjelenítendő üzenet beállítása az új tagok számára!</string>
<string name="whats_new_thanks_to_users_contribute_weblate">Köszönet a felhasználóknak - hozzájárulás a Weblate-en!</string>
<string name="sending_delivery_receipts_will_be_enabled">A kézbesítési jelentés küldése minden ismerőse számára engedélyezésre kerül.</string>
@@ -1484,7 +1490,7 @@
<string name="session_code">Munkamenet kód</string>
<string name="v4_4_french_interface_descr">Köszönet a felhasználóknak - hozzájárulás a Weblate-en!</string>
<string name="receipts_section_groups">Kis csoportok (max. 20 tag)</string>
<string name="connection_you_accepted_will_be_cancelled">Az Ön által elfogadott kérelem vissza lesz vonva!</string>
<string name="connection_you_accepted_will_be_cancelled">Az ön által elfogadott kérelem vissza lesz vonva!</string>
<string name="send_live_message_desc">Élő üzenet küldése - a címzett(ek) számára frissül, ahogy beírja</string>
<string name="settings_section_title_delivery_receipts">A KÉZBESÍTÉSI JELENTÉSEKET A KÖVETKEZŐ CÍMRE KELL KÜLDENI</string>
<string name="alert_text_msg_bad_id">A következő üzenet azonosítója hibás (kisebb vagy egyenlő az előzővel).
@@ -1520,7 +1526,7 @@
<string name="la_app_passcode">Alkalmazás jelkód</string>
<string name="add_contact_tab">Ismerős hozzáadása</string>
<string name="tap_to_scan">Koppintson a beolvasáshoz</string>
<string name="tap_to_paste_link">Koppintson ide a hivatkozás beillesztéséhez</string>
<string name="tap_to_paste_link">Koppintson a hivatkozás beillesztéséhez</string>
<string name="add_contact_button_to_create_link_or_connect_via_link"><![CDATA[<b>Ismerős hozzáadása</b>: új meghívó-hivatkozás létrehozásához, vagy egy kapott hivatkozáson keresztül történő kapcsolódáshoz.]]></string>
<string name="create_group_button_to_create_new_group"><![CDATA[<b>Csoport létrehozása</b>: új csoport létrehozásához.]]></string>
<string name="chat_is_stopped_you_should_transfer_database">A csevegés leállt. Ha már használta ezt az adatbázist egy másik eszközön, úgy visszaállítás szükséges a csevegés megkezdése előtt.</string>
@@ -1575,7 +1581,7 @@
<string name="developer_options_section">Fejlesztői beállítások</string>
<string name="possible_slow_function_desc">A funkció végrehajtása túl sokáig tart: %1$d másodperc: %2$s</string>
<string name="remote_host_error_busy"><![CDATA[A(z) <b>%s</b> hordozható eszköz elfoglalt]]></string>
<string name="past_member_vName">Már nem tag %1$s</string>
<string name="past_member_vName">%1$s (már nem tag)</string>
<string name="group_member_status_unknown">ismeretlen állapot</string>
<string name="profile_update_event_member_name_changed">%1$s megváltoztatta a nevét erre: %2$s</string>
<string name="profile_update_event_removed_address">eltávolította a kapcsolattartási címet</string>
@@ -1602,7 +1608,7 @@
<string name="v5_5_new_interface_languages">Magyar és török felhasználói felület</string>
<string name="v5_5_join_group_conversation_descr">A közelmúlt eseményei és továbbfejlesztett könyvtárbot.</string>
<string name="rcv_group_event_member_unblocked">feloldotta %s letiltását</string>
<string name="snd_group_event_member_unblocked">Ön feloldotta %s letiltását</string>
<string name="snd_group_event_member_unblocked">ön feloldotta %s letiltását</string>
<string name="member_info_member_blocked">letiltva</string>
<string name="blocked_by_admin_item_description">letiltva az admin által</string>
<string name="member_blocked_by_admin">Letiltva az admin által</string>
@@ -1612,7 +1618,7 @@
<string name="blocked_by_admin_items_description">%d üzenetet letiltott az admin</string>
<string name="unblock_for_all">Letiltás feloldása mindenki számára</string>
<string name="unblock_for_all_question">Mindenki számára feloldja a tag letiltását?</string>
<string name="snd_group_event_member_blocked">Ön letiltotta őt: %s</string>
<string name="snd_group_event_member_blocked">ön letiltotta őt: %s</string>
<string name="error_blocking_member_for_all">Hiba a tag mindenki számára való letiltásakor</string>
<string name="message_too_large">Az üzenet túl nagy</string>
<string name="welcome_message_is_too_long">Az üdvözlőüzenet túl hosszú</string>
@@ -1646,14 +1652,14 @@
<string name="migrate_from_device_error_saving_settings">Hiba a beállítások mentésekor</string>
<string name="migrate_to_device_error_downloading_archive">Hiba az archívum letöltésekor</string>
<string name="migrate_from_device_error_uploading_archive">Hiba az archívum feltöltésekor</string>
<string name="migrate_from_device_error_verifying_passphrase">Hiba a jelmondat hitelesítésekor:</string>
<string name="migrate_from_device_error_verifying_passphrase">Hiba a jelmondat ellenőrzésekor:</string>
<string name="migrate_from_device_exported_file_doesnt_exist">Az exportált fájl nem létezik</string>
<string name="migrate_to_device_file_delete_or_link_invalid">A fájl törlésre került, vagy érvénytelen hivatkozás</string>
<string name="migrate_to_device_bytes_downloaded">%s letöltve</string>
<string name="migrate_to_device_importing_archive">Archívum importálása</string>
<string name="migrate_from_device_database_init">Feltöltés előkészítése</string>
<string name="migrate_from_device_verify_database_passphrase">Az adatbázis jelmondatának hitelesítése</string>
<string name="migrate_from_device_verify_passphrase">Jelmondat hitelesítése</string>
<string name="migrate_from_device_verify_database_passphrase">Az adatbázis jelmondatának ellenőrzése</string>
<string name="migrate_from_device_verify_passphrase">Jelmondat ellenőrzése</string>
<string name="set_passphrase">Jelmondat beállítása</string>
<string name="v5_6_picture_in_picture_calls">Kép a képben hívások</string>
<string name="v5_6_safer_groups">Biztonságosabb csoportok</string>
@@ -1753,7 +1759,7 @@
<string name="settings_section_title_profile_images">Profilképek</string>
<string name="v5_7_shape_profile_images">Profilkép alakzat</string>
<string name="v5_7_shape_profile_images_descr">Négyzet, kör vagy bármi a kettő között.</string>
<string name="snd_error_relay">Célkiszolgáló-hiba: %1$s</string>
<string name="snd_error_relay">Célkiszolgáló hiba: %1$s</string>
<string name="snd_error_proxy">Továbbító kiszolgáló: %1$s
\nHiba: %2$s</string>
<string name="snd_error_expired">Hálózati problémák - az üzenet többszöri elküldési kísérlet után lejárt.</string>
@@ -1778,14 +1784,14 @@
<string name="network_smp_proxy_mode_private_routing">Privát útválasztás</string>
<string name="network_smp_proxy_mode_unknown_description">Használjon privát útválasztást ismeretlen kiszolgálókkal.</string>
<string name="network_smp_proxy_mode_always_description">Mindig használjon privát útválasztást.</string>
<string name="update_network_smp_proxy_mode_question">Üzenet-útválasztási mód</string>
<string name="network_smp_proxy_fallback_allow_protected_description">Közvetlen üzenetküldés, ha az IP-cím védett és az Ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</string>
<string name="network_smp_proxy_fallback_allow_description">Közvetlen üzenetküldés, ha az Ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</string>
<string name="update_network_smp_proxy_mode_question">Üzenet útválasztási mód</string>
<string name="network_smp_proxy_fallback_allow_protected_description">Közvetlen üzenetküldés, ha az IP-cím védett és az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</string>
<string name="network_smp_proxy_fallback_allow_description">Közvetlen üzenetküldés, ha az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</string>
<string name="private_routing_explanation">Az IP-cím védelmének érdekében a privát útválasztás az SMP-kiszolgálókat használja az üzenetek kézbesítéséhez.</string>
<string name="update_network_smp_proxy_fallback_question">Üzenet-útválasztási tartalék</string>
<string name="settings_section_title_private_message_routing">PRIVÁT ÜZENET-ÚTVÁLASZTÁS</string>
<string name="network_smp_proxy_mode_unprotected_description">Használjon privát útválasztást ismeretlen kiszolgálókkal, ha az IP-cím nem védett.</string>
<string name="network_smp_proxy_fallback_prohibit_description">Ne küldjön üzeneteket közvetlenül, még akkor sem, ha az Ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</string>
<string name="update_network_smp_proxy_fallback_question">Üzenet útválasztási tartalék</string>
<string name="settings_section_title_private_message_routing">PRIVÁT ÜZENET ÚTVÁLASZTÁS</string>
<string name="network_smp_proxy_mode_unprotected_description">Privát útválasztás használata ismeretlen kiszolgálókkal, ha az IP-cím nem védett.</string>
<string name="network_smp_proxy_fallback_prohibit_description">Ne küldjön üzeneteket közvetlenül, még akkor sem, ha az ön kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást.</string>
<string name="without_tor_or_vpn_ip_address_will_be_visible_to_file_servers">Tor vagy VPN nélkül az IP-címe látható lesz a fájlkiszolgálók számára.</string>
<string name="settings_section_title_files">FÁJLOK</string>
<string name="protect_ip_address">IP-cím védelem</string>
@@ -1811,12 +1817,12 @@
<string name="chat_list_always_visible">Csevegőlista megjelenítése új ablakban</string>
<string name="color_mode_light">Világos</string>
<string name="chat_theme_apply_to_light_mode">Világos mód</string>
<string name="color_received_quote">Fogadott válaszüzenet-buborék színe</string>
<string name="color_received_quote">Fogadott válasz</string>
<string name="theme_remove_image">Kép eltávolítása</string>
<string name="wallpaper_scale_repeat">Mozaik</string>
<string name="reset_single_color">Szín visszaállítása</string>
<string name="wallpaper_scale">Méretezés</string>
<string name="color_sent_quote">Válaszüzenet-buborék színe</string>
<string name="color_sent_quote">Elküldött válasz</string>
<string name="chat_theme_set_default_theme">Alapértelmezett téma beállítása</string>
<string name="color_mode_system">Rendszer</string>
<string name="color_wallpaper_tint">Háttérkép kiemelés</string>
@@ -1831,7 +1837,7 @@
<string name="chat_theme_reset_to_app_theme">Alkalmazás témájának visszaállítása</string>
<string name="v5_8_chat_themes_descr">Tegye egyedivé a csevegéseit!</string>
<string name="v5_8_chat_themes">Új csevegési témák</string>
<string name="v5_8_private_routing">Privát üzenet-útválasztás 🚀</string>
<string name="v5_8_private_routing">Privát üzenet útválasztás 🚀</string>
<string name="v5_8_safe_files">Fájlok biztonságos fogadása</string>
<string name="v5_8_message_delivery_descr">Csökkentett akkumulátor-használattal.</string>
<string name="error_initializing_web_view">Hiba a WebView előkészítésekor. Frissítse rendszerét az új verzióra. Lépjen kapcsolatba a fejlesztőkkel.
@@ -2030,7 +2036,7 @@
<string name="chat_database_exported_continue">Folytatás</string>
<string name="v6_0_connection_servers_status">Ellenőrízze a hálózatát</string>
<string name="media_and_file_servers">Média- és fájlkiszolgálók</string>
<string name="v6_0_delete_many_messages_descr">Legfeljebb 20 üzenet egyszerre való törlése.</string>
<string name="v6_0_delete_many_messages_descr">Legfeljebb 20 üzenet törlése egyszerre.</string>
<string name="v6_0_private_routing_descr">Védi az IP-címét és a kapcsolatait.</string>
<string name="v6_0_reachable_chat_toolbar">Könnyen elérhető eszköztár</string>
<string name="message_servers">Üzenetkiszolgálók</string>
@@ -2096,24 +2102,4 @@
<string name="icon_descr_sound_muted">Hang elnémítva</string>
<string name="error_initializing_web_view_wrong_arch">Hiba a WebView előkészítésekor. Győződjön meg arról, hogy a WebView telepítve van-e, és támogatja-e az arm64 architektúrát.
\nHiba: %s</string>
<string name="settings_message_shape_corner">Sarok</string>
<string name="settings_section_title_message_shape">Üzenetbuborék alakja</string>
<string name="settings_message_shape_tail">Farok</string>
<string name="network_session_mode_server">Kiszolgáló</string>
<string name="network_session_mode_session_description">Minden alkalommal, amikor elindítja az alkalmazást, új SOCKS-hitelesítő-adatokat fog használni.</string>
<string name="network_session_mode_session">Alkalmazás munkamenete</string>
<string name="network_session_mode_server_description">Minden egyes kiszolgálóhoz új SOCKS-hitelesítő-adatok legyenek használva.</string>
<string name="call_desktop_permission_denied_chrome">Kattintson a címmező melletti info gombra a mikrofon használatának engedélyezéséhez.</string>
<string name="call_desktop_permission_denied_safari">Nyissa meg a Safari Beállítások / Weboldalak / Mikrofon menüt, majd válassza a helyi kiszolgálók engedélyezése lehetőséget.</string>
<string name="call_desktop_permission_denied_title">Hívások kezdeményezéséhez engedélyezze a mikrofon használatát. Fejezze be a hívást, és próbálja meg a hívást újra.</string>
<string name="v6_1_better_calls">Továbbfejlesztett hívásélmény</string>
<string name="v6_1_message_dates_descr">Továbbfejlesztett üzenetdátumok.</string>
<string name="v6_1_better_user_experience">Továbbfejlesztett felhasználói élmény</string>
<string name="v6_1_customizable_message_descr">Testreszabható üzenetbuborékok.</string>
<string name="v6_1_delete_many_messages_descr">Legfeljebb 200 üzenet egyszerre való törlése, vagy moderálása.</string>
<string name="v6_1_forward_many_messages_descr">Legfeljebb 20 üzenet egyszerre való továbbítása.</string>
<string name="v6_1_better_calls_descr">Hang/Videó váltása hívás közben.</string>
<string name="v6_1_switch_chat_profile_descr">Csevegési profilváltás az egyszer használható meghívókhoz.</string>
<string name="v6_1_better_security">Továbbfejlesztett biztonság ✅</string>
<string name="v6_1_better_security_descr">A SimpleX Chat biztonsága a Trail of Bits által lett újraauditálva.</string>
</resources>
@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M182-85q-22.97 0-40.23-17.27-17.27-17.26-17.27-40.23v-616q0-22.97 17.27-40.23Q159.03-816 182-816h67.5v-60H312v60h336v-60h62.5v60H778q22.97 0 40.23 17.27 17.27 17.26 17.27 40.23v616q0 22.97-17.27 40.23Q800.97-85 778-85H182Zm0-57.5h596V-569H182v426.5Zm0-484h596v-132H182v132Zm0 0v-132 132Zm298.05 226q-16.76 0-28.16-11.34-11.39-11.34-11.39-28.11 0-16.76 11.34-28.16 11.34-11.39 28.11-11.39 16.76 0 28.16 11.34 11.39 11.34 11.39 28.11 0 16.76-11.34 28.16-11.34 11.39-28.11 11.39Zm-160 0q-16.76 0-28.16-11.34-11.39-11.34-11.39-28.11 0-16.76 11.34-28.16 11.34-11.39 28.11-11.39 16.76 0 28.16 11.34 11.39 11.34 11.39 28.11 0 16.76-11.34 28.16-11.34 11.39-28.11 11.39Zm320 0q-16.76 0-28.16-11.34-11.39-11.34-11.39-28.11 0-16.76 11.34-28.16 11.34-11.39 28.11-11.39 16.76 0 28.16 11.34 11.39 11.34 11.39 28.11 0 16.76-11.34 28.16-11.34 11.39-28.11 11.39Zm-160 160q-16.76 0-28.16-11.34-11.39-11.34-11.39-28.11 0-16.76 11.34-28.16 11.34-11.39 28.11-11.39 16.76 0 28.16 11.34 11.39 11.34 11.39 28.11 0 16.76-11.34 28.16-11.34 11.39-28.11 11.39Zm-160 0q-16.76 0-28.16-11.34-11.39-11.34-11.39-28.11 0-16.76 11.34-28.16 11.34-11.39 28.11-11.39 16.76 0 28.16 11.34 11.39 11.34 11.39 28.11 0 16.76-11.34 28.16-11.34 11.39-28.11 11.39Zm320 0q-16.76 0-28.16-11.34-11.39-11.34-11.39-28.11 0-16.76 11.34-28.16 11.34-11.39 28.11-11.39 16.76 0 28.16 11.34 11.39 11.34 11.39 28.11 0 16.76-11.34 28.16-11.34 11.39-28.11 11.39Z"/></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

@@ -262,5 +262,4 @@
<string name="only_your_contact_can_make_calls">Hanya kontak kamu yang dapat melakukan panggilan.</string>
<string name="allow_to_send_files">Izinkan untuk mengirim file dan media.</string>
<string name="all_your_contacts_will_remain_connected">Semua kontak kamu akan tetap terhubung.</string>
<string name="forward_files_missing_desc">%1$d berkas telah dihapus.</string>
</resources>
@@ -2108,24 +2108,4 @@
<string name="icon_descr_sound_muted">Audio silenziato</string>
<string name="error_initializing_web_view_wrong_arch">Errore di inizializzazione di WebView. Assicurati di avere WebView installato e che la sua architettura supportata sia arm64.
\nErrore: %s</string>
<string name="settings_message_shape_corner">Angolo</string>
<string name="settings_section_title_message_shape">Forma del messaggio</string>
<string name="settings_message_shape_tail">Coda</string>
<string name="network_session_mode_session">Sessione dell\'app</string>
<string name="network_session_mode_session_description">Le nuove credenziali SOCKS verranno usate ogni volta che avvii l\'app.</string>
<string name="network_session_mode_server_description">Le nuove credenziali SOCKS verranno usate per ogni server.</string>
<string name="network_session_mode_server">Server</string>
<string name="call_desktop_permission_denied_safari">Apri le impostazioni di Safari / Siti web / Microfono, quindi scegli Consenti per localhost.</string>
<string name="call_desktop_permission_denied_chrome">Clicca il pulsante info vicino al campo indirizzo per consentire l\'uso del microfono.</string>
<string name="call_desktop_permission_denied_title">Per effettuare chiamate, consenti di usare il microfono. Termina la chiamata e cerca di richiamare.</string>
<string name="v6_1_better_calls">Chiamate migliorate</string>
<string name="v6_1_message_dates_descr">Date dei messaggi migliorate.</string>
<string name="v6_1_better_security">Sicurezza migliorata ✅</string>
<string name="v6_1_better_user_experience">Esperienza utente migliorata</string>
<string name="v6_1_customizable_message_descr">Forma dei messaggi personalizzabile.</string>
<string name="v6_1_better_security_descr">Protocolli di SimpleX esaminati da Trail of Bits.</string>
<string name="v6_1_better_calls_descr">Cambia tra audio e video durante la chiamata.</string>
<string name="v6_1_switch_chat_profile_descr">Cambia profilo di chat per inviti una tantum.</string>
<string name="v6_1_delete_many_messages_descr">Elimina o modera fino a 200 messaggi.</string>
<string name="v6_1_forward_many_messages_descr">Inoltra fino a 20 messaggi alla volta.</string>
</resources>
@@ -791,7 +791,7 @@
<string name="group_invitation_tap_to_join_incognito">Tik hier om incognito lid te worden</string>
<string name="youve_accepted_group_invitation_connecting_to_inviting_group_member">Je bent lid geworden van deze groep. Verbinding maken met uitnodigend lid.</string>
<string name="you_sent_group_invitation">Je hebt een groep uitnodiging verzonden</string>
<string name="snd_group_event_user_left">je bent vertrokken</string>
<string name="snd_group_event_user_left">jij bent vertrokken</string>
<string name="snd_conn_event_switch_queue_phase_completed">je bent van adres veranderd</string>
<string name="select_contacts">Selecteer contacten</string>
<string name="skip_inviting_button">Sla het uitnodigen van leden over</string>
@@ -950,7 +950,7 @@
<string name="initial_member_role">Initiële rol</string>
<string name="group_member_role_observer">Waarnemer</string>
<string name="observer_cant_send_message_title">Je kunt geen berichten versturen!</string>
<string name="you_are_observer">je bent waarnemer</string>
<string name="you_are_observer">jij bent waarnemer</string>
<string name="language_system">Systeem</string>
<string name="v4_6_audio_video_calls">Audio en video oproepen</string>
<string name="confirm_password">Bevestig wachtwoord</string>
@@ -2104,25 +2104,4 @@
<string name="network_proxy_incorrect_config_desc">Zorg ervoor dat de proxyconfiguratie correct is.</string>
<string name="network_proxy_password">Wachtwoord</string>
<string name="icon_descr_sound_muted">Geluid gedempt</string>
<string name="error_initializing_web_view_wrong_arch">Fout bij initialiseren van WebView. Zorg ervoor dat WebView geïnstalleerd is en de ondersteunde architectuur is arm64.\nFout: %s</string>
<string name="settings_message_shape_corner">Hoek</string>
<string name="settings_section_title_message_shape">Berichtvorm</string>
<string name="network_session_mode_session">Appsessie</string>
<string name="network_session_mode_session_description">Elke keer dat u de app start, worden er nieuwe SOCKS-inloggegevens gebruikt.</string>
<string name="network_session_mode_server_description">Voor elke server worden nieuwe SOCKS-inloggegevens gebruikt.</string>
<string name="network_session_mode_server">Server</string>
<string name="settings_message_shape_tail">Staart</string>
<string name="call_desktop_permission_denied_chrome">Klik op de infoknop naast het adresveld om het gebruik van de microfoon toe te staan.</string>
<string name="call_desktop_permission_denied_safari">Open Safari Instellingen / Websites / Microfoon en kies Toestaan voor localhost.</string>
<string name="call_desktop_permission_denied_title">Als u wilt bellen, geeft u toestemming om uw microfoon te gebruiken. Beëindig het gesprek en probeer opnieuw te bellen.</string>
<string name="v6_1_better_security">Betere beveiliging ✅</string>
<string name="v6_1_better_security_descr">SimpleX-protocollen beoordeeld door Trail of Bits.</string>
<string name="v6_1_message_dates_descr">Betere datums voor berichten.</string>
<string name="v6_1_better_user_experience">Betere gebruikerservaring</string>
<string name="v6_1_customizable_message_descr">Aanpasbare berichtvorm.</string>
<string name="v6_1_better_calls_descr">Wissel tussen audio en video tijdens het gesprek.</string>
<string name="v6_1_switch_chat_profile_descr">Wijzig chatprofiel voor eenmalige uitnodigingen.</string>
<string name="v6_1_delete_many_messages_descr">Maximaal 200 berichten verwijderen of modereren.</string>
<string name="v6_1_forward_many_messages_descr">Stuur maximaal 20 berichten tegelijk door.</string>
<string name="v6_1_better_calls">Betere gesprekken</string>
</resources>
@@ -2084,46 +2084,4 @@
<string name="forward_files_failed_to_receive_desc">%1$d plik(ów/i) nie udało się pobrać.</string>
<string name="switching_profile_error_title">Błąd zmiany profilu</string>
<string name="settings_section_title_chat_database">BAZA CZATU</string>
<string name="n_file_errors">%1$d błędów plików:\n%2$s</string>
<string name="n_other_file_errors">%1$d innych błędów plików.</string>
<string name="forward_files_messages_deleted_after_selection_desc">Wiadomości zostały usunięte po wybraniu ich.</string>
<string name="forward_alert_title_nothing_to_forward">Nic do przekazania!</string>
<string name="forward_files_not_accepted_receive_files">Pobierz</string>
<string name="compose_save_messages_n">Zapisywanie %1$s wiadomości</string>
<string name="network_proxy_auth">Uwierzytelnianie proxy</string>
<string name="network_proxy_password">Hasło</string>
<string name="error_initializing_web_view_wrong_arch">Błąd inicjalizacji WebView. Upewnij się, że WebView jest zainstalowany, a jego obsługiwana architektura to arm64.\nBłąd: %s</string>
<string name="delete_messages_cannot_be_undone_warning">Wiadomości zostaną usunięte - nie można tego cofnąć!</string>
<string name="migrate_from_device_remove_archive_question">Usunąć archiwum?</string>
<string name="settings_message_shape_corner">Róg</string>
<string name="settings_section_title_message_shape">Kształt wiadomości</string>
<string name="network_session_mode_session">Sesja aplikacji</string>
<string name="network_session_mode_session_description">Nowe poświadczenia SOCKS będą używane przy każdym uruchomieniu aplikacji.</string>
<string name="network_session_mode_server_description">Dla każdego serwera zostaną użyte nowe poświadczenia SOCKS.</string>
<string name="call_desktop_permission_denied_chrome">Kliknij przycisk informacji przy polu adresu, aby zezwolić na korzystanie z mikrofonu.</string>
<string name="call_desktop_permission_denied_safari">Otwórz Safari Ustawienia / Strony internetowe / Mikrofon, a następnie wybierz opcję Zezwalaj dla localhost.</string>
<string name="network_proxy_auth_mode_isolate_by_auth_entity">Użyj różnych poświadczeń proxy dla każdego połączenia.</string>
<string name="network_proxy_auth_mode_isolate_by_auth_user">Użyj różnych poświadczeń proxy dla każdego profilu.</string>
<string name="network_proxy_random_credentials">Użyj losowych poświadczeń</string>
<string name="network_proxy_username">Nazwa użytkownika</string>
<string name="network_proxy_auth_mode_username_password">Twoje poświadczenia mogą zostać wysłane niezaszyfrowane.</string>
<string name="icon_descr_sound_muted">Dźwięk wyciszony</string>
<string name="select_chat_profile">Wybierz profil czatu</string>
<string name="new_chat_share_profile">Udostępnij profil</string>
<string name="switching_profile_error_message">Twoje połączenie zostało przeniesione do %s, ale podczas przekierowania do profilu wystąpił nieoczekiwany błąd.</string>
<string name="system_mode_toast">Tryb systemu</string>
<string name="migrate_from_device_uploaded_archive_will_be_removed">Przesłane archiwum bazy danych zostanie trwale usunięte z serwerów.</string>
<string name="network_session_mode_server">Serwer</string>
<string name="settings_message_shape_tail">Ogon</string>
<string name="call_desktop_permission_denied_title">Aby wykonywać połączenia, zezwól na korzystanie z mikrofonu. Zakończ połączenie i spróbuj zadzwonić ponownie.</string>
<string name="v6_1_better_security">Lepsze bezpieczeństwo ✅</string>
<string name="v6_1_message_dates_descr">Lepsze daty wiadomości.</string>
<string name="v6_1_customizable_message_descr">Możliwość dostosowania kształtu wiadomości.</string>
<string name="v6_1_better_calls">Lepsze połączenia</string>
<string name="v6_1_better_user_experience">Lepsze doświadczenie użytkownika</string>
<string name="v6_1_better_security_descr">Protokoły SimpleX sprawdzone przez Trail of Bits.</string>
<string name="v6_1_better_calls_descr">Przełączanie audio i wideo podczas połączenia.</string>
<string name="v6_1_delete_many_messages_descr">Usuń lub moderuj do 200 wiadomości.</string>
<string name="v6_1_forward_many_messages_descr">Przekazywanie do 20 wiadomości jednocześnie.</string>
<string name="v6_1_switch_chat_profile_descr">Przełącz profil czatu dla zaproszeń jednorazowych.</string>
</resources>
@@ -49,7 +49,7 @@
<string name="accept_feature">Aceitar</string>
<string name="allow_your_contacts_to_send_disappearing_messages">Permitir que seus contatos enviem mensagens que desaparecem.</string>
<string name="accept_feature_set_1_day">Definir 1 dia</string>
<string name="allow_irreversible_message_deletion_only_if">Permitir a exclusão irreversível de mensagens apenas se o seu contato permitir. (24 horas)</string>
<string name="allow_irreversible_message_deletion_only_if">Permitir a exclusão irreversível de mensagens apenas se o seu contato permitir.</string>
<string name="allow_your_contacts_irreversibly_delete">Permitir que seus contatos eliminem de forma irreversível mensagens enviadas.</string>
<string name="allow_voice_messages_only_if">Permitir mensagens de voz apenas se o contato permitir.</string>
<string name="allow_your_contacts_to_send_voice_messages">Permitir que seus contatos enviem mensagens de voz.</string>
@@ -130,7 +130,7 @@
<string name="network_enable_socks_info">Aceder aos servidores via proxy SOCKS no porto %d\? O proxy tem de iniciar antes de ativar esta opção.</string>
<string name="smp_servers_add_to_another_device">Adicionar a outro dispositivo</string>
<string name="group_member_role_admin">administrador</string>
<string name="allow_to_delete_messages">Permitir apagar irreversivelmente as mensagens enviadas. (24 horas)</string>
<string name="allow_to_delete_messages">Permitir apagar irreversivelmente as mensagens enviadas.</string>
<string name="delete_address__question">Eliminar endereço\?</string>
<string name="delete_after">Eliminar após</string>
<string name="delete_verb">Eliminar</string>
@@ -565,7 +565,7 @@
<string name="v4_3_voice_messages_desc">Máximo de 40 segundos, recebido instantaneamente.</string>
<string name="icon_descr_more_button">Mais</string>
<string name="network_and_servers">Rede e servidores</string>
<string name="network_settings_title">Configurações avançadas</string>
<string name="network_settings_title">Definições de rede</string>
<string name="settings_section_title_experimenta">EXPERIMENTAL</string>
<string name="you_can_start_chat_via_setting_or_by_restarting_the_app">Você pode iniciar a conversa através das Definições da aplicação / Base de Dados ou reiniciando a aplicação.</string>
<string name="update_network_settings_confirmation">Atualizar</string>
@@ -968,15 +968,4 @@
<string name="abort_switch_receiving_address_desc">Mudança de endereço será cancelada. Antigo endereço de recebimento será usado.</string>
<string name="allow_calls_question">Permitir ligações?</string>
<string name="servers_info_subscriptions_connections_subscribed">Conexões ativas</string>
<string name="migrate_from_device_all_data_will_be_uploaded">Todos os seus contatos, conversas e arquivos serão encriptados e enviados em chunks para relays XFTP configurados.</string>
<string name="n_other_file_errors">%1$d erro(s) de outro arquivo.</string>
<string name="forward_files_messages_deleted_after_selection_title">%1$s mensagens não encaminhadas</string>
<string name="network_smp_proxy_mode_always">Sempre</string>
<string name="network_smp_proxy_mode_always_description">Sempre use uma rota privata.</string>
<string name="allow_to_send_simplex_links">Permitir o envio de links SimpleX.</string>
<string name="moderated_items_description">%1$d mensagens moderadas por %2$s</string>
<string name="rcv_group_and_other_events">e %d outros</string>
<string name="all_users">Todos os perfis</string>
<string name="connect_plan_already_connecting">Já conectando!</string>
<string name="connect_plan_already_joining_the_group">Já entrando no grupo!</string>
</resources>
@@ -445,7 +445,7 @@
<string name="this_string_is_not_a_connection_link">Эта строка не является ссылкой-приглашением!</string>
<string name="you_can_also_connect_by_clicking_the_link"><![CDATA[Вы также можете соединиться, открыв ссылку там, где Вы её получили. Если ссылка откроется в браузере, нажмите кнопку <b>Открыть в приложении</b>.]]></string>
<!-- CICallStatus -->
<string name="callstatus_calling">звонок…</string>
<string name="callstatus_calling">входящий звонок…</string>
<string name="callstatus_missed">пропущенный звонок</string>
<string name="callstatus_rejected">отклоненный звонок</string>
<string name="callstatus_accepted">принятый звонок</string>
@@ -2150,63 +2150,4 @@
<string name="v6_0_chat_list_media">Открыть из списка чатов.</string>
<string name="reset_all_hints">Сбросить все подсказки.</string>
<string name="one_hand_ui_change_instruction">Вы можете изменить это в настройках Интерфейса.</string>
<string name="compose_forward_messages_n">Пересылка %1$s сообщений</string>
<string name="compose_save_messages_n">Сохранение %1$s сообщений</string>
<string name="network_proxy_incorrect_config_desc">Убедитесь, что конфигурация прокси правильная.</string>
<string name="network_proxy_auth">Аутентификация прокси</string>
<string name="network_proxy_random_credentials">Использовать случайные учетные данные</string>
<string name="system_mode_toast">Режим системы</string>
<string name="error_forwarding_messages">Ошибка пересылки сообщений</string>
<string name="n_file_errors">%1$d ошибок файлов:\n%2$s</string>
<string name="n_other_file_errors">%1$d других ошибок файлов.</string>
<string name="forward_alert_title_messages_to_forward">Переслать %1$s сообщение(й)?</string>
<string name="forward_alert_forward_messages_without_files">Переслать сообщения без файлов?</string>
<string name="forward_files_messages_deleted_after_selection_desc">Сообщения были удалены после того, как вы их выбрали.</string>
<string name="forward_alert_title_nothing_to_forward">Нет сообщений, которые можно переслать!</string>
<string name="forward_files_in_progress_desc">%1$d файл(ов) загружаются.</string>
<string name="forward_files_failed_to_receive_desc">%1$d файл(ов) не удалось загрузить.</string>
<string name="forward_files_missing_desc">%1$d файлов было удалено.</string>
<string name="forward_files_not_accepted_desc">%1$d файлов не было загружено.</string>
<string name="forward_files_not_accepted_receive_files">Загрузить</string>
<string name="forward_files_messages_deleted_after_selection_title">%1$s сообщений не переслано</string>
<string name="forward_multiple">Переслать сообщения…</string>
<string name="error_parsing_uri_desc">Проверьте правильность ссылки SimpleX.</string>
<string name="error_parsing_uri_title">Неверная ссылка</string>
<string name="settings_section_title_chat_database">БАЗА ДАННЫХ</string>
<string name="error_initializing_web_view_wrong_arch">Ошибка инициализации WebView. Убедитесь, что у вас установлен WebView и его поддерживаемая архитектура – arm64.\nОшибка: %s</string>
<string name="icon_descr_sound_muted">Звук отключен</string>
<string name="delete_messages_cannot_be_undone_warning">Сообщения будут удалены — это нельзя отменить!</string>
<string name="switching_profile_error_title">Ошибка переключения профиля</string>
<string name="select_chat_profile">Выберите профиль чата</string>
<string name="new_chat_share_profile">Поделиться профилем</string>
<string name="switching_profile_error_message">Соединение было перемещено на %s, но при смене профиля произошла неожиданная ошибка.</string>
<string name="settings_message_shape_corner">Угол</string>
<string name="network_session_mode_session">Сессия приложения</string>
<string name="network_session_mode_session_description">Новые учетные данные SOCKS будут использоваться при каждом запуске приложения.</string>
<string name="network_session_mode_server_description">Новые учетные данные SOCKS будут использоваться для каждого сервера.</string>
<string name="network_session_mode_server">Сервер</string>
<string name="settings_section_title_message_shape">Форма сообщений</string>
<string name="settings_message_shape_tail">Хвост</string>
<string name="call_desktop_permission_denied_chrome">Нажмите кнопку информации рядом с адресной строкой, чтобы разрешить микрофон.</string>
<string name="call_desktop_permission_denied_safari">Откройте Настройки Safari / Веб-сайты / Микрофон, затем выберите Разрешить для localhost.</string>
<string name="v6_1_better_calls">Улучшенные звонки</string>
<string name="v6_1_message_dates_descr">Улучшенные даты сообщений.</string>
<string name="v6_1_better_security">Улучшенная безопасность ✅</string>
<string name="v6_1_better_user_experience">Улучшенный интерфейс</string>
<string name="v6_1_customizable_message_descr">Настраиваемая форма сообщений.</string>
<string name="v6_1_delete_many_messages_descr">Удаляйте или модерируйте до 200 сообщений.</string>
<string name="v6_1_forward_many_messages_descr">Пересылайте до 20 сообщений за раз.</string>
<string name="v6_1_better_calls_descr">Переключайте звук и видео во время звонка.</string>
<string name="v6_1_switch_chat_profile_descr">Переключайте профиль чата для одноразовых приглашений.</string>
<string name="v6_1_better_security_descr">Анализ безопасности протоколов SimpleX от Trail of Bits.</string>
<string name="call_desktop_permission_denied_title">Чтобы совершать звонки, разрешите использовать микрофон. Завершите вызов и попробуйте позвонить снова.</string>
<string name="network_proxy_auth_mode_no_auth">Не использовать учетные данные с прокси.</string>
<string name="network_proxy_incorrect_config_title">Ошибка сохранения прокси</string>
<string name="network_proxy_password">Пароль</string>
<string name="network_proxy_auth_mode_isolate_by_auth_entity">Использовать разные учетные данные прокси для каждого соединения.</string>
<string name="network_proxy_auth_mode_isolate_by_auth_user">Использовать разные учетные данные прокси для каждого профиля.</string>
<string name="network_proxy_username">Имя пользователя</string>
<string name="network_proxy_auth_mode_username_password">Ваши учетные данные могут быть отправлены в незашифрованном виде.</string>
<string name="migrate_from_device_remove_archive_question">Удалить архив?</string>
<string name="migrate_from_device_uploaded_archive_will_be_removed">Загруженный архив базы данных будет навсегда удален с серверов.</string>
</resources>
@@ -22,7 +22,7 @@
<string name="appearance_settings">Görünüm</string>
<string name="your_settings">Ayarlarınız</string>
<string name="mute_chat">Sessize al</string>
<string name="unmute_chat">Susturmayı kaldır</string>
<string name="unmute_chat">Sessizden çıkar</string>
<string name="abort_switch_receiving_address_confirm">İptal</string>
<string name="abort_switch_receiving_address_question">Adres değişikliğini iptal et\?</string>
<string name="send_disappearing_message_30_seconds">30 saniye</string>
@@ -94,7 +94,7 @@
<string name="save_preferences_question">Tercihleri kaydet\?</string>
<string name="save_profile_password">Profil parolasını kaydet</string>
<string name="profile_is_only_shared_with_your_contacts">Profil sadece konuştuğun kişilerle paylaşılır.</string>
<string name="next_generation_of_private_messaging">Gizli iletişimin\ngelecek kuşağı</string>
<string name="next_generation_of_private_messaging">Gizli iletişimin gelecek kuşağı</string>
<string name="icon_descr_audio_off">Ses kapalı</string>
<string name="authentication_cancelled">Doğrulama iptal edildi</string>
<string name="settings_restart_app">Yeniden başlat</string>
@@ -757,7 +757,7 @@
<string name="callstatus_connecting">aramaya bağlanılıyor…</string>
<string name="delivery_receipts_are_disabled">Gönderildi bilgisi kapalı!</string>
<string name="v5_2_more_things">Birkaç şey daha</string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>Daha fazla pil kullanır</b>! Uygulama her zaman arka planda çalışır - bildirimler anındasterilir.]]></string>
<string name="onboarding_notifications_mode_service_desc"><![CDATA[<b>Daha fazla pil kullanır</b>! Arka plan hizmeti her zaman çalışır - mesajlar gelir gelmez bildirimnderilir.]]></string>
<string name="in_developing_title">Çok yakında!</string>
<string name="delete_contact_all_messages_deleted_cannot_undo_warning">Kişi ve tüm mesajlar silinecektir - bu geri alınamaz!</string>
<string name="alert_title_contact_connection_pending">Kişi henüz bağlanmadı!</string>
@@ -914,7 +914,7 @@
<string name="ok">TAMAM</string>
<string name="icon_descr_more_button">Daha fazla</string>
<string name="one_time_link">Tek seferlik davet bağlantısı</string>
<string name="network_settings_title">Gelişmiş ayarlar</string>
<string name="network_settings_title"> ayarları</string>
<string name="shutdown_alert_desc">Siz uygulamayı yeniden başlatana kadar bildirimler çalışmayacaktır</string>
<string name="la_mode_off">Kapalı</string>
<string name="self_destruct_new_display_name">Yeni görünen ad:</string>
@@ -989,7 +989,7 @@
<string name="v4_5_private_filenames_descr">Zaman dilimi, görsel/ses korumak için UTC kullan.</string>
<string name="v4_5_private_filenames">Özel dosya adları</string>
<string name="to_start_a_new_chat_help_header">Yeni bir sohbet başlatmak için</string>
<string name="people_can_connect_only_via_links_you_share">Kimin bağlanabileceğine siz karar verirsiniz.</string>
<string name="people_can_connect_only_via_links_you_share">İnsanlar size sadece paylaştığınız bağlantılar üzerinden ulaşabilir.</string>
<string name="privacy_redefined">Gizlilik yeniden tanımlanıyor</string>
<string name="read_more_in_github">GitHub repomuzda daha fazlasını okuyun.</string>
<string name="onboarding_notifications_mode_periodic">Periyodik</string>
@@ -1109,7 +1109,7 @@
<string name="notification_preview_mode_message_desc">Kişiyi ve mesajı göster</string>
<string name="v5_4_better_groups">Daha iyi gruplar</string>
<string name="video_decoding_exception_desc">Videonun kodu çözülemiyor. Lütfen farklı bir video deneyin veya geliştiricilerle iletişime geçin.</string>
<string name="non_fatal_errors_occured_during_import">İçe aktarma sırasında bazı önemli olmayan hatalar oluştu:</string>
<string name="non_fatal_errors_occured_during_import">İçe aktarma sırasında bir takım hatlar oluştu - daha fazla detay için sohbet konsoluna bakabilirsiniz.</string>
<string name="show_developer_options">Geliştirici seçeneklerini göster</string>
<string name="rcv_group_event_1_member_connected">%s bağlandı</string>
<string name="network_disable_socks_info">Onaylarsanız, mesajlaşma sunucuları IP adresinizi ve sağlayıcınızı - hangi sunuculara bağlandığınızı - görebilecektir.</string>
@@ -1777,7 +1777,7 @@
<string name="srv_error_version">Sunucu sürümü ağ ayarlarıyla uyumlu değil.</string>
<string name="snd_error_auth">Yanlış anahtar veya bilinmeyen bağlantı - büyük olasılıkla bu bağlantı silinmiştir.</string>
<string name="network_smp_proxy_mode_private_routing">Gizli yönlendirme</string>
<string name="network_smp_proxy_mode_unknown">Bilinmeyen sunucular</string>
<string name="network_smp_proxy_mode_unknown">Bilinmeyen yönlendiriciler</string>
<string name="network_smp_proxy_mode_always_description">Her zaman gizli yönlendirmeyi kullan.</string>
<string name="network_smp_proxy_mode_never_description">Gizli yönlendirmeyi KULLANMA.</string>
<string name="update_network_smp_proxy_mode_question">Mesaj yönlendirme modu</string>
@@ -1887,7 +1887,7 @@
<string name="select_chat_profile">Sohbet profili seç</string>
<string name="xftp_servers_configured">XFTP sunucuları yapılandırıldı</string>
<string name="media_and_file_servers">Medya ve dosya sunucuları</string>
<string name="network_proxy_auth_mode_no_auth">Kimlik bilgilerini proxy ile kullanmayın.</string>
<string name="network_proxy_auth_mode_no_auth">Proxy ile bilgeleri kullanma</string>
<string name="network_proxy_incorrect_config_title">Proxy kayıt edilirken hata oluştu.</string>
<string name="network_proxy_incorrect_config_desc">Proxy konfigürasyonunun doğru olduğundan emin olun.</string>
<string name="network_proxy_password">Şifre</string>
@@ -1919,7 +1919,7 @@
<string name="download_errors">İndirme hataları</string>
<string name="info_row_message_status">Mesaj durumu</string>
<string name="error_parsing_uri_title">Geçersiz link</string>
<string name="error_parsing_uri_desc">Lütfen SimpleX bağlantısının doğru olup olmadığını kontrol edin.</string>
<string name="error_parsing_uri_desc">Lütfen SimpleX linki doğru mu kontrol edin.</string>
<string name="proxy_destination_error_broker_host">Varış sunucusu ardesi (%1$s) yönlendirme sunucusu (%2$s) ile uyumsuz.</string>
<string name="proxy_destination_error_broker_version">Varış sunucusu sürümü (%1$s) yönlendirme sunucusu (%2$s) ile uyumsuz.</string>
<string name="message_forwarded_title">Mesaj iletildi</string>
@@ -1941,7 +1941,7 @@
<string name="v6_0_new_media_options">Yeni medya seçenekleri</string>
<string name="v6_0_privacy_blur">Daha iyi gizlilik için bulanıklaştır.</string>
<string name="v6_0_connect_faster_descr">Arkadaşlarınıza daha hızlı bağlanın</string>
<string name="v6_0_delete_many_messages_descr">Tek seferde en fazla 20 mesaj silin.</string>
<string name="v6_0_delete_many_messages_descr">Aynı anda yirmiye kadar mesaj silin.</string>
<string name="v6_0_chat_list_media">Sohbet listesinden oynat.</string>
<string name="migrate_from_device_remove_archive_question">Arşiv kaldırılsın mı ?</string>
<string name="servers_info_sessions_connected">Bağlandı</string>
@@ -1975,7 +1975,7 @@
<string name="chat_database_exported_title">Veritabanı dışa aktarıldı</string>
<string name="chunks_deleted">Parçalar silindi</string>
<string name="chunks_downloaded">Parçalar indirildi</string>
<string name="servers_info_connected_servers_section_header">Bağlı sunucular</string>
<string name="servers_info_connected_servers_section_header">Sunucuayı bağlandı</string>
<string name="cant_call_contact_connecting_wait_alert_text">Kişiye bağlanılıyor, lütfen bekleyin ya da daha sonra kontrol edin.</string>
<string name="copy_error">Kopyalama hatası</string>
<string name="delete_without_notification">Bildirim göndermeden sil</string>
@@ -1984,14 +1984,14 @@
<string name="smp_proxy_error_broker_host">Yönlendirme sunucu adresi (%1$s) ağ ayarlarıyla uyumsuz.</string>
<string name="info_row_file_status">Dosya durumu</string>
<string name="proxy_destination_error_failed_to_connect">Yönlendirme sunucusu (%1$s) varış sunucusuna (%2$s) bağlanamadı. Lütfen daha sonra tekrar deneyin.</string>
<string name="smp_proxy_error_broker_version">Yönlendirme suncusu sürümü ağ ayarlarıyla uyumsuz: %1$s</string>
<string name="smp_proxy_error_broker_version">Yönlendirme suncusu sürümü ağ ayarlarıyla uyumsuz. %1$s</string>
<string name="servers_info_subscriptions_connections_pending">Bekliyor</string>
<string name="calls_prohibited_ask_to_enable_calls_alert_text">Lütfen kişinizden çağrılara izin vermesini isteyin.</string>
<string name="servers_info_previously_connected_servers_section_header">Önceden bağlanılmış sunucular</string>
<string name="cant_call_contact_alert_title">Kişi aranamıyor</string>
<string name="network_options_save_and_reconnect">Kayıt et ve yeniden bağlan</string>
<string name="delete_messages_cannot_be_undone_warning">Mesajlar silinecek - bu geri alınamaz!</string>
<string name="delete_messages_mark_deleted_warning">Mesajlar silinmek üzere işaretlendi. Alıcı (lar) bu mesajları görebilecek.</string>
<string name="delete_messages_mark_deleted_warning">Mesajlar silinmek üzere işaretlendi. Alıcılar bu mesajları görebilecek.</string>
<string name="delete_members_messages__question">Üylerin %d mesajı silinsin mi ?</string>
<string name="member_inactive_title">Üye inaktif</string>
<string name="message_forwarded_desc">Henüz direkt bağlantı yok mesaj admin tarafından yönlendirildi.</string>
@@ -2020,108 +2020,4 @@
<string name="cannot_share_message_alert_text">Seçilen sohbet tercihleri bu mesajı yasakladı.</string>
<string name="servers_info_reset_stats">Tüm istatistikleri sıfırla</string>
<string name="reset_all_hints">Tüm ip uçlarını sıfırla</string>
<string name="n_file_errors">%1$d dosya hata(ları)\n%2$s</string>
<string name="forward_files_in_progress_desc">%1$d dosya(lar) hala indiriliyor.</string>
<string name="forward_files_failed_to_receive_desc">%1$d dosyası (ları) indirilemedi.</string>
<string name="forward_files_missing_desc">%1$d dosyası (ları) silindi.</string>
<string name="n_other_file_errors">%1$d diğer dosya hatası(ları).</string>
<string name="forward_files_not_accepted_desc">%1$d dosyası (ları) indirilemedi.</string>
<string name="forward_files_messages_deleted_after_selection_title">%1$s mesajları iletilemedi</string>
<string name="privacy_media_blur_radius_medium">Orta</string>
<string name="servers_info_subscriptions_section_header">Mesaj alındısı</string>
<string name="acknowledged">Onaylandı</string>
<string name="error_initializing_web_view_wrong_arch">WebView başlatılırken hata oluştu. WebView\'in yüklü olduğundan ve desteklenen mimarisinin arm64 olduğundan emin olun.\nHata: %s</string>
<string name="network_session_mode_session_description">Uygulamayı her başlattığınızda yeni SOCKS kimlik bilgileri kullanılacaktır.</string>
<string name="network_session_mode_server_description">Her sunucu için yeni SOCKS kimlik bilgileri kullanılacaktır.</string>
<string name="app_check_for_updates_button_download">İndir %s (%s)</string>
<string name="settings_section_title_message_shape">Mesaj şekli</string>
<string name="subscription_percentage">Yüzdeyi göster</string>
<string name="app_check_for_updates_canceled">Güncelleme indirme işlemi iptal edildi</string>
<string name="subscription_errors">Abone olurken hata</string>
<string name="moderate_messages_will_be_deleted_warning">Mesajlar tüm üyeler için silinecektir.</string>
<string name="moderate_messages_will_be_marked_warning">Mesajlar tüm üyeler için moderasyonlu olarak işaretlenecektir.</string>
<string name="file_error_auth">Yanlış anahtar veya bilinmeyen dosya yığın adresi - büyük olasılıkla dosya silinmiştir.</string>
<string name="toolbar_settings">Ayarlar</string>
<string name="new_chat_share_profile">Profil paylaş</string>
<string name="switching_profile_error_message">Bağlantınız %s\'ye taşındı ancak sizi profile yönlendirirken beklenmedik bir hata oluştu.</string>
<string name="network_proxy_auth">Proxy kimlik doğrulaması</string>
<string name="network_proxy_random_credentials">Rastgele kimlik bilgileri kullan</string>
<string name="network_proxy_auth_mode_isolate_by_auth_entity">Her bağlantı için farklı proxy kimlik bilgileri kullan.</string>
<string name="network_proxy_auth_mode_isolate_by_auth_user">Her profil için farklı proxy kimlik bilgileri kullan.</string>
<string name="network_proxy_auth_mode_username_password">Kimlik bilgileriniz şifrelenmeden gönderilebilir.</string>
<string name="network_proxy_username">Kullanıcı Adı</string>
<string name="app_check_for_updates_button_skip">Bu sürümü atlayın</string>
<string name="app_check_for_updates_notice_desc">Yeni sürümlerden haberdar olmak için Kararlı veya Beta sürümleri için periyodik kontrolü açın.</string>
<string name="privacy_media_blur_radius_soft">Yumuşak</string>
<string name="chat_database_exported_not_all_files">Bazı dosya(lar) dışa aktarılmadı</string>
<string name="appearance_zoom">Zoom</string>
<string name="v6_0_upgrade_app">Uygulamayı otomatik olarak yükselt</string>
<string name="uploaded_files">Yüklenen dosyalar</string>
<string name="size">Boyut</string>
<string name="subscribed">Abone olundu</string>
<string name="subscription_results_ignored">Abonelikler göz ardı edildi</string>
<string name="contact_list_header_title">Bağlantılarınız</string>
<string name="icon_descr_sound_muted">Ses kapatıldı</string>
<string name="servers_info_uploaded">Yüklendi</string>
<string name="servers_info_reset_stats_alert_message">Sunucu istatistikleri sıfırlanacaktır - bu geri alınamaz!</string>
<string name="one_hand_ui">Erişilebilir sohbet araç çubuğu</string>
<string name="one_hand_ui_change_instruction">Görünüm ayarlarından değiştirebilirsiniz.</string>
<string name="one_hand_ui_card_title">Sohbet listesini değiştir:</string>
<string name="system_mode_toast">Sistem modu</string>
<string name="v6_0_reachable_chat_toolbar">Erişilebilir sohbet araç çubuğu</string>
<string name="servers_info_target">İçin bilgi gösteriliyor</string>
<string name="servers_info_statistics_section_header">İstatistikler</string>
<string name="servers_info_private_data_disclaimer">%s\'den başlayarak.\nTüm veriler cihazınıza özeldir.</string>
<string name="sent_via_proxy">Bir proxy aracılığıyla gönderildi</string>
<string name="server_address">Sunucu adresi</string>
<string name="upload_errors">Yükleme hataları</string>
<string name="network_option_tcp_connection">TCP bağlantısı</string>
<string name="network_socks_proxy">SOCKS proxy</string>
<string name="servers_info_proxied_servers_section_header">Proxy sunucuları</string>
<string name="temporary_file_error">Geçici dosya hatası</string>
<string name="info_view_video_button">Video</string>
<string name="you_can_still_send_messages_to_contact">Arşivlenen kişilerden %1$s\'e mesaj gönderebilirsiniz.</string>
<string name="you_can_still_view_conversation_with_contact">Sohbetler listesinde %1$s ile yapılan konuşmayı hala görüntüleyebilirsiniz.</string>
<string name="xftp_server">XFTP sunucusu</string>
<string name="servers_info_detailed_statistics_receive_errors">Alım sırasında hata</string>
<string name="smp_server">SMP sunucusu</string>
<string name="network_error_broker_host_desc">Sunucu adresi ağ ayarlarıyla uyumsuz: %1$s.</string>
<string name="network_error_broker_version_desc">Sunucu sürümü uygulamanızla uyumlu değil: %1$s.</string>
<string name="you_need_to_allow_calls">Kendiniz arayabilmeniz için önce irtibat kişinizin sizi aramasına izin vermelisiniz.</string>
<string name="servers_info_starting_from">%s\'den başlayarak.</string>
<string name="acknowledgement_errors">Onay hataları</string>
<string name="secured">Güvenli</string>
<string name="network_session_mode_session">Uygulama oturumu</string>
<string name="network_session_mode_server">Sunucu</string>
<string name="app_check_for_updates_stable">Stabil</string>
<string name="app_check_for_updates_update_available">Güncelleme mevcut: %s</string>
<string name="remote_ctrl_connection_stopped_identity_desc">Bu bağlantı başka bir mobil cihazda kullanıldı, lütfen masaüstünde yeni bir bağlantı oluşturun.</string>
<string name="call_desktop_permission_denied_chrome">Mikrofon kullanımına izin vermek için adres alanının yanındaki bilgi düğmesine tıklayın.</string>
<string name="call_desktop_permission_denied_safari">Safari Ayarları / Web Siteleri / Mikrofon\'u açın, ardından localhost için İzin Ver\'i seçin.</string>
<string name="call_desktop_permission_denied_title">Arama yapmak için mikrofonunuzu kullanmanıza izin verin. Aramayı sonlandırın ve tekrar aramayı deneyin.</string>
<string name="settings_message_shape_tail">Konuşma balonu</string>
<string name="privacy_media_blur_radius_strong">Güçlü</string>
<string name="v6_0_reachable_chat_toolbar_descr">Uygulamayı tek elle kullan.</string>
<string name="servers_info">Sunucu bilgileri</string>
<string name="servers_info_subscriptions_total">Toplam</string>
<string name="servers_info_proxied_servers_section_footer">Bu sunuculara bağlı değilsiniz. Mesajları onlara iletmek için özel yönlendirme kullanılır.</string>
<string name="servers_info_subscriptions_connections_subscribed">Aktif bağlantılar</string>
<string name="settings_message_shape_corner">Köşeleri yuvarlama</string>
<string name="migrate_from_device_uploaded_archive_will_be_removed">Yüklenen veritabanı arşivi sunuculardan kalıcı olarak kaldırılacaktır.</string>
<string name="proxied">Proxyli</string>
<string name="servers_info_transport_sessions_section_header">Taşıma oturumları</string>
<string name="chat_database_exported_migrate">Dışa aktarılan veritabanını taşıyabilirsiniz.</string>
<string name="chat_database_exported_save">Dışa aktarılan arşivi kaydedebilirsiniz.</string>
<string name="servers_info_detailed_statistics_sent_messages_total">Gönderilen tüm mesajların toplamı</string>
<string name="servers_info_detailed_statistics_sent_messages_header">Gönderilen mesajlar</string>
<string name="v6_1_message_dates_descr">Daha iyi mesaj tarihleri.</string>
<string name="v6_1_customizable_message_descr">Özelleştirilebilir mesaj şekli.</string>
<string name="v6_1_forward_many_messages_descr">Aynı anda en fazla 20 mesaj iletin.</string>
<string name="v6_1_better_calls_descr">Görüşme sırasında ses ve görüntüyü değiştirin.</string>
<string name="v6_1_switch_chat_profile_descr">Sohbet profilini 1 kerelik davetler için değiştirin.</string>
<string name="v6_1_better_calls">Daha iyi aramalar</string>
<string name="v6_1_better_user_experience">Daha iyi kullanıcı deneyimi</string>
<string name="v6_1_delete_many_messages_descr">200\'e kadar mesajı silin veya düzenleyin.</string>
<string name="v6_1_better_security">Daha iyi güvenlik ✅</string>
<string name="v6_1_better_security_descr">SimpleX protokolleri Trail of Bits tarafından incelenmiştir.</string>
</resources>
@@ -2104,15 +2104,4 @@
<string name="forward_files_messages_deleted_after_selection_desc">Повідомлення були видалені після того, як ви їх вибрали.</string>
<string name="error_forwarding_messages">Помилка при пересиланні повідомлень</string>
<string name="icon_descr_sound_muted">Звук вимкнено</string>
<string name="error_initializing_web_view_wrong_arch">Помилка ініціалізації WebView. Переконайтеся, що WebView встановлено, і його підтримувана архітектура — arm64. \nПомилка: %s</string>
<string name="settings_message_shape_tail">Хвіст</string>
<string name="settings_message_shape_corner">Куточок</string>
<string name="settings_section_title_message_shape">Форма повідомлення</string>
<string name="network_session_mode_session">Сесія додатку</string>
<string name="network_session_mode_session_description">Нові облікові дані SOCKS будуть використовуватись щоразу, коли ви запускаєте додаток.</string>
<string name="network_session_mode_server_description">Нові облікові дані SOCKS будуть використовуватись для кожного сервера.</string>
<string name="network_session_mode_server">Сервер</string>
<string name="call_desktop_permission_denied_chrome">Натисніть кнопку інформації поруч із полем адреси, щоб дозволити використання мікрофона.</string>
<string name="call_desktop_permission_denied_safari">Відкрийте Налаштування Safari / Сайти / Мікрофон, а потім виберіть \"Дозволити для localhost\".</string>
<string name="call_desktop_permission_denied_title">Щоб здійснювати дзвінки, дозволіть використовувати ваш мікрофон. Завершіть дзвінок і спробуйте зателефонувати знову.</string>
</resources>
@@ -884,24 +884,4 @@
<string name="edit_history">Lịch sử</string>
<string name="alert_title_no_group">Không tìm thấy nhóm!</string>
<string name="v4_6_hidden_chat_profiles">Hồ sơ trò chuyện ẩn</string>
<string name="how_to_use_simplex_chat">Cách sử dụng</string>
<string name="how_it_works">Cách thức hoạt động</string>
<string name="how_simplex_works">Cách thức SimpleX hoạt động</string>
<string name="how_to">Cách làm</string>
<string name="error_initializing_web_view_wrong_arch">Lỗi khởi động WebView. Hãy đảm bảo bạn đã cài đặt WebView và kiến trúc hỗ trợ của nó là arm64.\nLỗi: %s</string>
<string name="custom_time_unit_hours">giờ</string>
<string name="host_verb">Lưu trữ</string>
<string name="network_session_mode_session">Phiên làm việc trên ứng dụng</string>
<string name="how_to_use_markdown">Cách sử dụng markdown</string>
<string name="call_desktop_permission_denied_chrome">Nhấn nút thông tin gần trường địa chỉ để cho phép sử dụng microphone.</string>
<string name="v6_1_better_calls">Trải nghiệm cuộc gọi tốt hơn</string>
<string name="v6_1_better_security">Bảo mật hơn ✅</string>
<string name="v6_1_better_user_experience">Trải nghiệm người dùng tuyệt vời hơn</string>
<string name="v6_1_customizable_message_descr">Hình dạng tin nhắn có thể tùy chỉnh được.</string>
<string name="v6_1_message_dates_descr">Mô tả thời gian tin nhắn tốt hơn.</string>
<string name="v6_1_delete_many_messages_descr">Xóa hay kiểm duyệt tối đa 200 tin nhắn.</string>
<string name="settings_message_shape_corner">Góc</string>
<string name="v6_1_forward_many_messages_descr">Chuyển tiếp tối đa 20 tin nhắn cùng một lúc.</string>
<string name="how_to_use_your_servers">Cách sử dụng máy chủ của bạn</string>
<string name="v5_5_new_interface_languages">Giao diện Hungary và Thổ Nhĩ Kỳ</string>
</resources>

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